0

これは私のコードです:

UNICODE_STRING  symbol;     
WCHAR ntNameBuffer[128];
swprintf(ntNameBuffer, L"\\Device\\Harddisk1\\Partition1");

RtlInitUnicodeString(&symbol, ntNameBuffer);
KdPrint(("OSNVss:symbol is %ws\n",symbol.Buffer));

status = IoGetDeviceObjectPointer(&symbol,                                                  
             FILE_READ_DATA,
             &pDiskFileObject,
             &pDiskDeviceObject);

私のドライバーは の次の下位レベルです\\Device\\Harddisk1\\Partition1

私が呼び出すIoGetDeviceObjectPointerと失敗し、ステータスが返されず、残りのコードを続行しません。

これをwindbg debugで使用すると、intelpm.sys;で壊れます。

objectname を"\\Device\\Harddisk1\\Partition2"(partition2 は実際に存在する) に変更すると、呼び出しが成功します。

objectname を に変更する"\\Device\\Harddisk1\\Partition3"と (partition3 が存在しない)、失敗して status = が返されます0xc0000034。これは、objectname が存在しないことを意味します。

"\\Device\\Harddisk1\\Partition1"オブジェクトを使用すると失敗し、ステータスが返されない理由を誰かが知っていますか? どうもありがとう!

4

2 に答える 2

2

何よりもまず: 何を達成しようとしていて、どのドライバー モデルを使用していますか? どのビット数、どの OS バージョンが対象で、どの OS バージョンで失敗しますか? さらに、あなたは呼び出しの正しい IRQL にありシステム スレッド内で実行されていますよね? ドライバーのどのエントリ ポイント ( IRP_MJ_*DriverEntry...) からこのコードを呼び出していますか?

とにかく、この機能に関するドキュメントを読み直していました。特に次の部分に注意してください。

IoGetDeviceObjectPointerルーチンは、オブジェクトへの要求されたアクセスを許可できる場合、指定されたデバイス オブジェクトのスタック内の最上位オブジェクトへのポインターと、対応するファイル オブジェクトへのポインターを返します。

と:

IoGetDeviceObjectPointerは、呼び出し元と次の下位レベルのドライバーとの間の "接続" を確立します。呼び出し元が成功すると、返されたデバイス オブジェクト ポインターを使用して、自身のデバイス オブジェクトを初期化できます。また、IoAttachDeviceToDeviceStack、IoCallDriver、および下位ドライバーの IRP を作成するルーチンへの引数として使用することもできます。返されるポインターは、IoCallDriver への必須の引数です。

あなたは言いませんが、32ビットシステムでこれを行っている場合は、IrpTrackerで何が起こっているのかを追跡する価値があるかもしれません. ただし、私の推測では、「接続」というか、それに対する要求は、次の下位レベルのドライバーなどによって何らかの形で飲み込まれます。

また、ここでどのような種類のドライバーを書いているかを言うのも困難です (もちろん、これは重要なことです)。

事の前後に特定の時点で中断するだけでなく、IRP がターゲット デバイス オブジェクトのスタック内を下方に移動するスタックをたどってみてください。

しかし、考えてみると、(何らかの理由で) スタックにまったく接続されていない可能性があります。接続されている最上位オブジェクトへの参照ではなく、実際の基になるデバイス オブジェクト (スタックの下部) を取得するために、代わりにIoGetDiskDeviceObjectを実際に使用する必要があるのではないでしょうか?

最後になりましたが、 OSR メーリング リストでこの質問をすることもできることを忘れないでください。そこには、まったく同じ問題に遭遇した可能性のあるベテランの専門家がたくさんいます (私が尋ねたすべてのことを正しく行っていると仮定します)。

于 2012-11-21T03:59:30.530 に答える
0

みんなありがとう、私はこの問題を解決します。この問題の原因は同期になることです。IoGetDeviceObjectPointer を呼び出すと、高レベルから通過する新しい Irp IRP_MJ_WRITER が生成されます。この irp がドライバーに到達すると、IRP を処理するスレッドは IoGetDeviceObjectPointer を呼び出すスレッドと同じになるため、完全に停止します。

于 2012-11-26T06:41:48.213 に答える