Entry

プログラミングメモ - NTSTATUS を SQLite3 の DB に収めといた

2010年03月21日

なんかこの頃,大したことない話ばっかしてるんですけど……まぁいいか。連休だし。

プログラミングに使うツールは数あまたあるけれども,あったら便利だと思うもんや,使いづらい既存のツールに代わるもんなんかは,自分で作っちゃった方が早かったりします。ここでは,Windows の NTSTATUS を検索しやすいように,SQLite3 のデータベースとして収めておくことにしました。とゆわけで,おすそわけ。

ntstatus.db (485,376 バイト)

SQLite 3.6.22 で作りました。テーブルの定義は次のようになっています。

CREATE TABLE m_ntstatus (
  id INTEGER PRIMARY KEY,
  code TEXT NOT NULL,
  label TEXT NOT NULL,
  description TEXT NOT NULL
);

プライマリキーは,サロゲートキーとして独自に振っています(code で一意にならないみたいだから)。また,code は本来16進数の数値なんですけれど,文字列で登録しているので大文字と小文字を区別します。ここら辺は不本意な向きもいるかも。ともあれ,検索するとこんな感じ(適宜改行を補っています)。

sqlite> SELECT * FROM m_ntstatus WHERE code = 'C0000005';
198|C0000005|STATUS_ACCESS_VIOLATION|
The instruction at 0x%08lx referenced memory at 0x%08lx. The memory
could not be %s.

NTSTATUS というのは,ntstatus.h で定義されている,OS のステータスコードです。C/C++ なんかでプログラムを書いていると,OS がエラー(例外)を投げることがあるんですけれど,この例外の種類が定義されています。例外の種類を手っ取り早く確認するには,エラー報告ダイアログ(「問題が発生したため、XXXXを終了します。ご不便をおかけして申し訳ございません……云々」というダイアログ)をたどって,コードを確認すればいい。

最もよくあるステータスは,上にもある C0000005 というステータスコード。STATUS_ACCESS_VIOLATION は,参照できないアドレス(NULL とか)を参照したり,解放済みのメモリにデータを書き込みにいったりすると送出される例外です。Java で言うなら,NullPointerException みたいなもん。それ以外にも,二重 delete や,配列のインデックスを間違えているとき(BoF)にも送出されます。

C/C++ の初心者さんの中には,エラー報告ダイアログが出ただけでアワワとなってしまう向きもいるけれど,Windows はエラーの原因をちゃんと教えてくれているので,知ってさえいれば怖くありません。

ま,ともかくも,こゆもんを作ったというだけ。上にかぶせるアプリケーションを作ってもいいけど,そこまでするほどでもないかなー。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN