Sunday, June 9, 2013

なぜカーネルハンドルは常に4の倍数なのか

Why are kernel HANDLEs always a multiple of four?@The Old New Thing の翻訳。 

あまり良く知られていない事は、カーネルハンドルの下位2ビットが常に0であるという事だ。言い換えると、それらの数値は常に4の倍数である。なお、これはカーネルハンドについてだけ当てはまる。疑似ハンドルやあらゆる他のタイプのハンドル(USERハンドルやGDIハンドル、マルチメディアハンドルなど)には当てはまらない。カーネルハンドルとは、CloseHandle関数に渡す事が出来るものを指す。

この下位2ビットの用途はntdef.hヘッダーファイルの中に埋められている。

//
// ハンドルの下位2ビットはシステムからは無視され、
// アプリケーションからタグビットとして使用される。残りのビットは不透明で、
// シリアルナンバーとテーブルインデックスの格納に使用される。
//

#define OBJ_HANDLE_TAGBITS  0x00000003L

カーネルハンドルの下位2ビットが常に0である事は、GetQueuedCompletionStatus関数(完了ポートの通知を抑制するために、イベントハンドルの下位ビットに値を設定できる)によって暗示されている。これが機能するためには、下位ビットは通常0でなければならない。
この情報はほとんどの(ハンドルを不透明な値として扱うべき)アプリケーション開発者にとって有用ではない。タグビットに興味のあるのは、低レベルクラスライブラリーを実装している者達か、カーネルオプジェクトを巨大なフレームワークの中に包み込んでいる者達だ。

No comments:

Post a Comment