Windowsでエラーがあるたびに表示される「エラーコード」。コードを調べると原因がわかるとされているが、インターネットでキーワード検索をしてみたところで、まともな答えが得られないことのほうが多い。よくてエラーコードの意味を理解しないで、単に対策だけが記載されている程度だ。

そこで、今回はこのエラーコードを解説することにしよう。とりあえず、マイクロソフトが出している正式なドキュメントは以下にある。

●[MS-ERREF]: Windows Error Codes

https://msdn.microsoft.com/en-us/library/cc231196.aspx

基本的には、これを読めばいいわけなのだが、量も結構あって、しかも英語である。そこで、今回は、よく見かけるエラーコードなどを例に、ごく大まかに解説することにする。

Windowsのエラーコードは、32bit値で、通常は16進数で表現されている。大きく「HRESULT」「Win32エラーコード」「NTSTATUS」の3つがある。よく見かける0x8007xxxxというのがWin32エラーコード、0xCxxxxxxxというがNTSTATUSである。

また、場合によっては、システムがこれらのエラーコードに「拡張コード」を付けて詳細情報を付加する場合もある。たとえば、Windows Updateによるアップグレードなどは、エラーの発生タイミングを通知する拡張コードをつける場合がある。

まずは、エラーコードの構造から見ていこう。エラーコードは、32bitで表現される整数値を16進数で表現したものだ。エラーコードの先頭にある「0x」は以下が16進数であることを示すために使われる記法の1つだ。コンピュータ言語などで数値を表現する場合に使われる。

エラーコードは常に16進数とするというルールがあれば、先頭に0xをつける必要はなさそうだが、実際には、コンピュータ内部には16進数も2進数も10進数もなく、みな同じ32bitのデータでしかない。人間に見えるように数値を画面などに表示する際に、どのように表示するのかを決めているだけだ。しかし、単に数字だけを表示すると10進数解釈してしまうかもしれない。16進数でも、A～Fが一回も使われない数字というのもあるわけで、見た目に紛らわしい。このため、エラーコードは16進数で表現するために必ず先頭に0xをつけているようだ。

このエラーコードのうち、まずは、0xの次の文字が8なのかCなのかで解釈の方法が変わってくる。まずは、先頭が8のWin32エラーコードからみていくことにする。

Win32エラーコード

Win32エラーコードは、本来はHRESULTと呼ばれるAPI呼び出しなどの処理の結果状態（成功したのかエラーなのか）を表現するデータの一種だ。そのデータ構造は下の図のようになっている。

HRESULTは、32bitデータの下位5ビットでエラーの種類を表している。ただし、5ビット目（bit4。Xビット）は使われておらず0に固定である。最下位にあるSビットはエラーなのか、そうでないのかを表していて、エラーの場合ここが1になる。残りはゼロになるため、エラーコードの先頭は、必ず8、つまり0x8xxxxxxx」（xは任意の16進数）というパターンになる。

HRESULTでは、bit5（6ビット目）からbit15は、ファシリティ（Facility）と呼ばれるフィールドで、エラーの分類（発生位置）を示す。ここが0x007の場合は、Win32エラーだ。なお、ファシリティのリストは前述の文書にある。

●HRESULT

https://msdn.microsoft.com/en-us/library/cc231198.aspx

つまり、エラーコードの上位4桁が「0x8007」になっているのはWin32エラーとなる。エラーコードの下位4桁は、ファシリティごとに意味が違っていて、Win32用のリストは、同様に以下のページにある

●Win32 Error Codes

https://msdn.microsoft.com/en-us/library/cc231199.aspx

簡単にいえば、表示されたエラーコードの先頭が0x8007だった場合には、前記のページにあるリストから下位4桁の数字を探せばいいことになる。

NTSTATUS

エラーコードの最初の桁が「C」だった場合、パターンはまた変わってくる。

Win32と似ているが、ちょっと違う。NTSTATUSの場合、ファシリティはbit4（5ビット目）からbit15（16ビット目）までとなる。コードの部分は、Win32と同じく16ビットになっている。ただし、NTSTATUSの場合、ファシリティとエラーコードを一緒にしたリストになっているので、以下のページから、エラーコードそのものを探す。

●NTSTATUS Values

https://msdn.microsoft.com/en-us/library/cc704588.aspx

なお、ファシリティ部分がどのような意味を持つのかは、以下のページに記述がある。

●Appendix A: Product Behaviorの＜4＞以下 https://msdn.microsoft.com/en-us/library/cc231214.aspx#Appendix_A_4

これで、とりあえず、エラーコードを「エラーメッセージ」に変換することが可能になる。では、次回はもうすこし具体的にエラーコードについて見ていくことにしよう。