2012-03-22 5 views
6

非常に単純な質問ですが、私がapp1.exeにHANDLEを作成し、値が0x01の場合、その値はグローバルに一意ですか?winapiはグローバルに対応していますか?

また、他のプロセスがHANDLEという値を持っていて、値が0x01である可能性があります。

ユニークでない場合は、ハンドルと互換性のある一意のIDを取得するために他の構文を使用できます(このIDを持つHANDLEは他の場所に作成されない可能性が高いかほとんどありません)。

+0

http://www.windows-api.com/microsoft/Win32-Kernel/31543684/wrappinghooking-api-how-to-handle-closehandle.aspx関連する読書;) – n00b

+1

あなたは2つの質問を1つにしました。私は「ハンドル」がユニークかどうかについて答えましたが、他のものへの答えはあなたが何のために一意のIDが必要かによって決まります。 – hamstergene

+0

スプーフィング用CreateFileWフックを使って他のプロセス(他のものも)のReadFile。 – n00b

答えて

5

重要なことは、ハンドルはオブジェクトではないということです。ハンドルは、オブジェクト・テーブルごとにポインタ(またはインデックス)です。あなたの質問に答えるために、ハンドルは世界的にユニークではありませんが、特定のプロセス内でのみ意味を持つように範囲が定められています。

カーネルオブジェクトが他のプロセスからアクセスできるようにするには、DuplicateHandleが必要です。

プロセス間でオブジェクトを共有する別の方法はCreateProcessにセット bInheritHandles を呼び出すことです。

+0

inherithandlesは別のプロセスを作成するために1つのプロセスを必要とします。 – n00b

2

DuplicateHandleを使用して、プロセス間でハンドルを渡します。

2

これらは一意ではありません。 HANDLEの値は現在のプロセスに対してローカルです。同じ値は、無効なハンドルまたは別のプロセス内の別のオブジェクトを参照する可能性があります。このルールの例外は、親プロセスから継承されたハンドルです。

集中レジストリなしで一意のIDを持つ唯一の方法は、GUIDを使用することです。しかし、ハンドルには対応していません。ハンドルは128ビットで、ハンドルは32ビットまたは64ビットです。

関連する問題