@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/windows-shutdown-handling-for-apps/#article>
    schema:about <https://comcomponent.com/knowledge/wm-queryendsession/>, <https://comcomponent.com/knowledge/hybrid-shutdown/> ;
    schema:mentions <https://comcomponent.com/knowledge/shutdown-block-reason/>, <https://comcomponent.com/knowledge/setconsolectrlhandler/>, <https://comcomponent.com/knowledge/dotnet-processexit/>, <https://comcomponent.com/knowledge/service-preshutdown/>, <https://comcomponent.com/knowledge/service-shutdown-notification/>, <https://comcomponent.com/knowledge/service-control-manager/>, <https://comcomponent.com/knowledge/register-application-restart/>, <https://comcomponent.com/knowledge/arso/>, <https://comcomponent.com/knowledge/replacefile/>, <https://comcomponent.com/knowledge/flushfilebuffers/>, <https://comcomponent.com/knowledge/cache-manager/>, <https://comcomponent.com/knowledge/power-status-change/>, <https://comcomponent.com/knowledge/unexpected-shutdown-events/>, <https://comcomponent.com/knowledge/atomic-file-write-pattern/>, <https://comcomponent.com/knowledge/ui-thread-context/>, <https://comcomponent.com/knowledge/windows-event-log/>, <https://comcomponent.com/knowledge/uninterruptible-operation/>, <https://comcomponent.com/knowledge/full-boot-cycle/>, <https://comcomponent.com/knowledge/unexpected-power-loss/> .

<https://comcomponent.com/knowledge/wm-queryendsession/> a skos:Concept ;
    skos:prefLabel "WM_QUERYENDSESSION"@ja ;
    skos:definition "終了してもよいかをアプリケーションに問い合わせる、Restart Managerが送るWindowsメッセージである。"@ja ;
    skos:altLabel "ENDSESSION_CLOSEAPP" ;
    ks:requires <https://comcomponent.com/knowledge/ui-thread-context/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/shutdown-block-reason/> .

<https://comcomponent.com/knowledge/hybrid-shutdown/> a skos:Concept ;
    skos:prefLabel "ハイブリッドシャットダウン(高速スタートアップ)"@ja ;
    skos:definition "ユーザーセッションはサインアウトするが、カーネルセッションは閉じずに休止ファイルへ保存し、次回起動でそのまま復元する既定のシャットダウン動作。"@ja ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/full-boot-cycle/> .

<https://comcomponent.com/knowledge/ui-thread-context/> a skos:Concept ;
    skos:prefLabel "UIスレッドのコンテキスト"@ja ;
    skos:definition "WinForms/WPFなどデスクトップアプリで、UIの応答性を保つために画面更新や重い処理の実行場所として意識されるコンテキスト。"@ja ;
    skos:altLabel "UIイベントハンドラ"@ja .

<https://comcomponent.com/knowledge/shutdown-block-reason/> a skos:Concept ;
    skos:prefLabel "ShutdownBlockReasonCreate"@ja ;
    skos:definition "中断できない処理の開始時に理由文字列を登録し、「このアプリがシャットダウンを妨げています」画面に表示させるAPI。"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/uninterruptible-operation/> .

<https://comcomponent.com/knowledge/uninterruptible-operation/> a skos:Concept ;
    skos:prefLabel "中断すると壊れる処理"@ja ;
    skos:definition "途中で打ち切られると物理的・復旧不能な損傷につながる処理。ファームウェアの書き込みや物理媒体への書き込みなどが該当する。"@ja .

<https://comcomponent.com/knowledge/full-boot-cycle/> a skos:Concept ;
    skos:prefLabel "完全なブートサイクル"@ja ;
    skos:definition "カーネルセッションを休止ファイルから復元せず、デバイスドライバーを含めて初期化し直す起動。高速スタートアップが有効な構成では再起動だけがこれを行う。"@ja .

<https://comcomponent.com/knowledge/setconsolectrlhandler/> a skos:Concept ;
    skos:prefLabel "SetConsoleCtrlHandler"@ja ;
    skos:definition "コンソールアプリがCTRL_C/BREAK/CLOSE/LOGOFF/SHUTDOWNの各イベントを受け取るためのハンドラー登録API。"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/ui-thread-context/> .

<https://comcomponent.com/knowledge/dotnet-processexit/> a skos:Concept ;
    skos:prefLabel "AppDomain.ProcessExit"@ja ;
    skos:definition ".NETアプリの終了時に後始末を行うために使われてきたイベント。"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/setconsolectrlhandler/> .

<https://comcomponent.com/knowledge/service-shutdown-notification/> a skos:Concept ;
    skos:prefLabel "SERVICE_CONTROL_SHUTDOWN"@ja ;
    skos:definition "シャットダウン処理の中でサービスへ届く制御コード。猶予は既定で約20秒、上限はWaitToKillServiceTimeout。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/service-control-manager/> .

<https://comcomponent.com/knowledge/service-control-manager/> a skos:Concept ;
    skos:prefLabel "SCM(サービス制御マネージャー)"@ja ;
    skos:definition "サービスの起動時に実行アカウントでログオンさせる、Windowsのサービス管理コンポーネント。"@ja .

<https://comcomponent.com/knowledge/service-preshutdown/> a skos:Concept ;
    skos:prefLabel "SERVICE_ACCEPT_PRESHUTDOWN"@ja ;
    skos:definition "SERVICE_CONTROL_SHUTDOWNより先に通知を受け取れるサービスの受け入れ宣言。SCMはサービスが停止するかタイムアウトするまで待つ。"@ja ;
    ks:shouldPrecede <https://comcomponent.com/knowledge/service-shutdown-notification/> .

<https://comcomponent.com/knowledge/register-application-restart/> a skos:Concept ;
    skos:prefLabel "RegisterApplicationRestart"@ja ;
    skos:definition "アプリが自分自身の再起動用コマンドラインをOSに登録し、Restart Managerによる終了後に再起動させてもらうためのAPI関数である。"@ja ;
    skos:altLabel "RegisterApplicationRestart function" .

<https://comcomponent.com/knowledge/arso/> a skos:Concept ;
    skos:prefLabel "ARSO(自動再起動サインオン)"@ja ;
    skos:definition "Windows Updateが自動再起動を開始する際に、再起動後のサインインを自動化するWinlogonの仕組み。"@ja .

<https://comcomponent.com/knowledge/replacefile/> a skos:Concept ;
    skos:prefLabel "ReplaceFile"@ja ;
    skos:definition "新ファイルへの保存・元ファイルの退避・リネーム・削除という一連の手順を1つのAPIにまとめた差し替え。元ファイルの作成日時・ACL・代替ストリームも引き継ぐ。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/atomic-file-write-pattern/> ;
    ks:mitigates <https://comcomponent.com/knowledge/unexpected-power-loss/> .

<https://comcomponent.com/knowledge/atomic-file-write-pattern/> a skos:Concept ;
    skos:prefLabel "一時ファイル経由の安全な保存パターン"@ja ;
    skos:definition "出力先へ直接書かず、同じフォルダーの一時ファイルへ書き切ってからFile.Moveで本来のファイル名へ付け替える保存方式。"@ja ;
    skos:altLabel "Write-Temp-Then-Move" .

<https://comcomponent.com/knowledge/unexpected-power-loss/> a skos:Concept ;
    skos:prefLabel "不意の電源断・強制停止"@ja ;
    skos:definition "シャットダウン通知なしに電源が失われる、または処理が打ち切られること。書き込み途中のファイル破損やデータ損失につながる。"@ja .

<https://comcomponent.com/knowledge/flushfilebuffers/> a skos:Concept ;
    skos:prefLabel "FlushFileBuffers"@ja ;
    skos:definition "指定したファイルハンドルのバッファ済みデータとメタデータをデバイスへ書き切るWin32 API。.NETのFileStream.Flush(true)に相当する。"@ja ;
    skos:altLabel "FileStream.Flush(true)" ;
    ks:requires <https://comcomponent.com/knowledge/cache-manager/> .

<https://comcomponent.com/knowledge/cache-manager/> a skos:Concept ;
    skos:prefLabel "キャッシュマネージャー"@ja ;
    skos:definition "ファイルデータをメモリ上のシステムキャッシュに保持し、読み書きの多くをディスクI/Oなしで処理させるWindowsカーネルのコンポーネント。ファストI/Oの近道もこのキャッシュを直接利用する。"@ja ;
    skos:altLabel "Cache Manager" .

<https://comcomponent.com/knowledge/power-status-change/> a skos:Concept ;
    skos:prefLabel "PBT_APMPOWERSTATUSCHANGE"@ja ;
    skos:definition "AC電源とバッテリーの切り替わりや残量低下を知らせる電源イベント。"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/unexpected-power-loss/> .

<https://comcomponent.com/knowledge/unexpected-shutdown-events/> a skos:Concept ;
    skos:prefLabel "シャットダウン関連のイベントログ(1074 / 41 / 6008)"@ja ;
    skos:definition "正常な再起動と予期しない停止を切り分けるためにシステムログへ記録されるイベント。"@ja ;
    ks:verifiedBy <https://comcomponent.com/knowledge/windows-event-log/> .

<https://comcomponent.com/knowledge/windows-event-log/> a skos:Concept ;
    skos:prefLabel "Windowsイベントログ"@ja ;
    skos:definition "Application・System・Securityなどのログにアプリケーションやサービスの事象を記録し、イベントビューアーや監視ツールから運用担当者が確認できるWindows標準の記録機構。"@ja ;
    skos:altLabel "Windows Event Log" ;
    skos:altLabel "EventLog" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wm-queryendsession/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ui-thread-context/> ;
    schema:description "セッション終了はウィンドウとメッセージキューを持つアプリへ2段階で通知される。WM_QUERYENDSESSIONには即座にTRUEを返し、後始末はWM_ENDSESSION(wParam=TRUE)で行う。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/shutdown/wm-queryendsession> ;
    ks:verifiedAt "2026-08-21" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wm-queryendsession/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/shutdown-block-reason/> ;
    schema:description "WM_QUERYENDSESSIONでFALSEを返せばシャットダウンを中止させられるが、ドキュメントはユーザーの意図を尊重してTRUEを返すべきと明記しており、拒否したアプリは「シャットダウンを妨げているアプリ」として全画面UIに晒される。応答を遅らせられるのは各5秒で、超えると強制終了される。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/shutdown/wm-queryendsession>, <https://learn.microsoft.com/windows/win32/shutdown/shutdown-changes-for-windows-vista> ;
    ks:verifiedAt "2026-08-21" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/shutdown-block-reason/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/uninterruptible-operation/> ;
    schema:description "途中で切られると物理的に壊れる処理だけは例外で、開始時にShutdownBlockReasonCreateで理由文字列を登録し、完了したら即座にShutdownBlockReasonDestroyで解除する。それでもユーザーとOSは強制続行できるため、ブロックできる前提の設計は成立しない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/winuser/nf-winuser-shutdownblockreasoncreate>, <https://learn.microsoft.com/windows/win32/shutdown/shutdown-changes-for-windows-vista> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/hybrid-shutdown/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/full-boot-cycle/> ;
    schema:description "高速スタートアップが有効な構成のシャットダウンでは、ユーザーセッションはサインアウトされるがカーネルセッションはデバイスドライバーごと休止ファイルへ保存され次回起動で復元される。完全なブートサイクルを実行するのは再起動だけなので、装置PCの障害対応手順には「電源を切って入れ直す」ではなく「再起動する」と書く。"@ja ;
    ks:evidence <https://learn.microsoft.com/troubleshoot/windows-client/setup-upgrade-and-drivers/fast-startup-causes-system-hibernation-shutdown-fail>, <https://learn.microsoft.com/troubleshoot/windows-server/performance/troubleshoot-unexpected-reboots-system-event-logs> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/setconsolectrlhandler/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/ui-thread-context/> ;
    schema:description "gdi32.dllまたはuser32.dllを読み込んだプロセスはWindowsアプリとして扱われ、CTRL_LOGOFFなど一部のイベントが届かない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/console/setconsolectrlhandler> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dotnet-processexit/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/setconsolectrlhandler/> ;
    schema:description ".NET 10からランタイムがWindowsの終了シグナルへの既定処理を提供しなくなったため、外から終了させられる経路ではProcessExit頼みの後始末が動かない。Mainからの復帰など通常終了では従来どおり動くが、その経路の後始末はアプリモデルに合った通知へ寄せる必要がある。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/compatibility/core-libraries/10.0/sigterm-signal-handler> ;
    ks:verifiedAt "2026-08-21" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/service-shutdown-notification/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/service-control-manager/> ;
    schema:description "サービスはサインアウトの影響を受けないが、シャットダウン・再起動ではSCMから制御コードとして通知が届く。受け取るには受け入れフラグの宣言が必要で、SHUTDOWNの猶予は既定で約20秒、上限はWaitToKillServiceTimeoutである。この上限をサービス側で書き換えて延ばすことは明確に非推奨で、むしろUPS駆動中のマシンが電池切れ前にシャットダウンを完了できるよう可能な限り速く後始末を終えるべきとされている。制御ハンドラーは30秒以内に返し、時間のかかる停止処理は別スレッドへ任せてSERVICE_STOP_PENDINGを報告する。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/services/service-control-handler-function> ;
    ks:verifiedAt "2026-08-21" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/service-preshutdown/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/service-shutdown-notification/> ;
    schema:description "SERVICE_ACCEPT_PRESHUTDOWNを宣言したサービスは先にSERVICE_CONTROL_PRESHUTDOWNを受け取り、SCMは停止かタイムアウトまで待つ。ただし既定タイムアウトはWindows 10 Creators Update以降10秒で、それ以前の3分から短縮されている。その間システム全体のシャットダウンを待たせるため、特別な状況でのみ使うべきとされている。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/winsvc/ns-winsvc-service_preshutdown_info>, <https://learn.microsoft.com/windows/win32/services/service-control-handler-function> ;
    ks:verifiedAt "2026-08-21" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/register-application-restart/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/arso/> ;
    schema:description "RegisterApplicationRestartによる再起動後の復帰はサインイン時に行われるため、無人運転のPCでは、Windows Updateの自動再起動時にサインインを自動化するARSOと組み合わせて初めて復帰が完結する。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows-server/identity/ad-ds/manage/component-updates/winlogon-automatic-restart-sign-on--arso->, <https://learn.microsoft.com/windows/win32/api/winbase/nf-winbase-registerapplicationrestart> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/replacefile/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/atomic-file-write-pattern/> ;
    schema:description "ReplaceFileは新ファイルへの保存・元ファイルの退避・リネーム・削除を1つのAPIにまとめ、作成日時・ACL・代替ストリームなど元ファイルの属性も引き継ぐ。3つのファイルは同一ボリュームにある必要がある。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/winbase/nf-winbase-replacefilew> ;
    ks:verifiedAt "2026-08-21" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/replacefile/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/unexpected-power-loss/> ;
    schema:description "ReplaceFileは複数ステップの名前空間操作であり、電源断をまたいだ原子性が仕様として保証されているわけではない。だからバックアップを残し、読み込み側が起動時に本体を検証して壊れていればバックアップへフォールバックする、までをセットで実装する。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/winbase/nf-winbase-replacefilew> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/flushfilebuffers/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/cache-manager/> ;
    schema:description "書き込みは既定でシステムキャッシュに載り遅延書き込みでディスクへ反映されるため、WriteFileの成功はディスク到達を意味しない。確実に届けるにはFlushFileBuffersで明示的にフラッシュするか、FILE_FLAG_WRITE_THROUGHで素通しさせる。ファイルシステムのメタデータも常にキャッシュされる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/file-caching> ;
    ks:verifiedAt "2026-08-21" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/power-status-change/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/unexpected-power-loss/> ;
    schema:description "UPSの役割は停電を止めることではなく、通知のない電源断を通知のある計画シャットダウンに変換することにある。AC電源からバッテリーへの切り替わりや残量低下はこのイベントで通知され、ウィンドウを持つアプリはWM_POWERBROADCASTで、サービスはSERVICE_ACCEPT_POWEREVENTを宣言してHandlerExで受け取る。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/power/pbt-apmpowerstatuschange> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/unexpected-shutdown-events/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/windows-event-log/> ;
    schema:description "正常な再起動と予期しない停止は、システムイベントログのイベントID 1074・41・6008の並びで切り分けられる。"@ja ;
    ks:evidence <https://learn.microsoft.com/troubleshoot/windows-server/performance/troubleshoot-unexpected-reboots-system-event-logs> ;
    ks:verifiedAt "2026-08-21" ;
    ks:certainty "established" .
