知識マップ: Windowsのエラーコードを読み解く ── Win32エラー・HRESULT・NTSTATUSの三層構造
記事「Windowsのエラーコードを読み解く ── Win32エラー・HRESULT・NTSTATUSの三層構造」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
Windowsのエラーコードは、Win32 APIが返すWin32エラーコード、COM以降のHRESULT、カーネル層のNTSTATUSという3体系に分かれます。現在のWindowsでは、カーネルがNTSTATUSを返し、Win32サブシステムがそれをWin32エラーコードへ変換し、COM層がさらにHRESULTへ包み直す流れが日常的に起きています。読解の最重要パターンは0x8007xxxxで、これはFACILITY_WIN32にWin32エラーコードを格納したものなので、下位16bitを10進に直せば本質のコードが分かります。一方0x80004005(E_FAIL)は「未指定の失敗」でしかなく、コード自体を深掘りしても得るものはありません。0xCで始まる8桁はNTSTATUSで、Nビットを立ててHRESULT空間へ持ち込めば0xDで始まる値になり、RtlNtStatusToDosErrorを通せばWin32エラーコードに丸められます。
flowchart LR
accTitle: Windowsのエラーコード3体系の知識マップ
accDescr: Win32エラーコード・HRESULT・NTSTATUSの3体系と、カーネルからWin32、COMへと包み直されていく変換の流れ、FacilityとHRESULT_FROM_WIN32による分解、NビットとRtlNtStatusToDosErrorによる橋渡し、.NET例外へのマップ、調査に使う変換ツールを示す図
hresult["HRESULT"]
win32_error_code["Win32エラーコード"]
last_error_code["最終エラーコード(GetLastError)"]
error_lookup_tool["err.exe(Microsoft Error Lookup Tool)"]
certutil_error["certutil -error"]
hresult_facility["HRESULTのFacility"]
hresult_from_win32["HRESULT_FROM_WIN32"]
e_fail["E_FAIL(0x80004005)"]
ntstatus["NTSTATUS"]
rtlntstatustodoserror["RtlNtStatusToDosError"]
ntstatus_to_win32_conversion["NTSTATUSからWin32エラーコードへの変換"]
hresult_nt_bit["HRESULTのNビット(HRESULT_FROM_NT)"]
status_access_violation["STATUS_ACCESS_VIOLATION(0xC0000005)"]
windows_event_log["Windowsイベントログ"]
bug_check_code["バグチェックコード(STOPコード)"]
procmon["Process Monitor(procmon.exe)"]
windbg_error_command["WinDbgの!error"]
windbg["WinDbg"]
hresult_exception_mapping["HRESULTから.NET例外へのマップ"]
marshal_getlastwin32error["Marshal.GetLastWin32Error"]
win32_error_code -->|"に保存される"| last_error_code
win32_error_code -->|"で確認できる"| error_lookup_tool
win32_error_code -->|"で確認できる"| certutil_error
hresult -->|"利用する"| hresult_facility
hresult_from_win32 -->|"実装を担う"| hresult_facility
hresult_from_win32 -->|"内容を継承する"| win32_error_code
e_fail -->|"実装を担う"| hresult_facility
ntstatus -->|"原因になり得る"| win32_error_code
rtlntstatustodoserror -->|"実装を担う"| ntstatus_to_win32_conversion
hresult_nt_bit -->|"内容を継承する"| ntstatus
status_access_violation -->|"実装を担う"| ntstatus
status_access_violation -->|"で確認できる"| windows_event_log
ntstatus -->|"用いるのは非推奨"| bug_check_code
ntstatus -.->|"で確認できる"| procmon
ntstatus -->|"で確認できる"| windbg_error_command
windbg_error_command -->|"実装を担う"| windbg
hresult_exception_mapping -->|"内容を継承する"| hresult
last_error_code -->|"で確認できる"| marshal_getlastwin32error
概念間の関係(全18件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- Win32エラーコードは最終エラーコード(GetLastError)に保存されます。
- Win32エラーコードはerr.exe(Microsoft Error Lookup Tool)で確認できます。
- Win32エラーコードはcertutil -errorで確認できます。
- HRESULTはHRESULTのFacilityを利用します。
- HRESULT_FROM_WIN32はHRESULTのFacilityの実装を担います。
- HRESULT_FROM_WIN32はWin32エラーコードの内容を継承して表示します。
- E_FAIL(0x80004005)はHRESULTのFacilityの実装を担います。
- NTSTATUSはWin32エラーコードの原因になることがあります。
- RtlNtStatusToDosErrorはNTSTATUSからWin32エラーコードへの変換の実装を担います。
- HRESULTのNビット(HRESULT_FROM_NT)はNTSTATUSの内容を継承して表示します。
- STATUS_ACCESS_VIOLATION(0xC0000005)はNTSTATUSの実装を担います。
- STATUS_ACCESS_VIOLATION(0xC0000005)はWindowsイベントログで確認できます。
- NTSTATUSをバグチェックコード(STOPコード)に用いることは推奨されません。
- NTSTATUSはProcess Monitor(procmon.exe)で確認できます。
- NTSTATUSはWinDbgの!errorで確認できます。
- WinDbgの!errorはWinDbgの実装を担います。
- HRESULTから.NET例外へのマップはHRESULTの内容を継承して表示します。
- 最終エラーコード(GetLastError)はMarshal.GetLastWin32Errorで確認できます。
主要概念の定義
機械可読データ
このデータセットについて
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。