親牛の開発日記

ぼけ防止するため、開発メモを残そう

CreateFileでAVStream minidriverから HANDLEの取得方法

マイクロソフトさんのドライバサンプルを例にする

github.com

ドライバに「コマンド(IOCTL)」を送る(DeviceIoControlを利用)際に、予め「CreateFile」で対象ドライバのハンドル(HANDLE)取るべき。

CreateFileの1つ目の引数にドライバから公開した「Symbolic Link」を使えばいいですが、AVStream minidriverみたいなWDMドライバだと、「IoCreateSymbolicLink」を使えないため、代わりに「IoRegisterDeviceInterface」を利用する。

サンプルでの実装だと、

①「device.cpp」の先頭に、以下の宣言を追加

const GUID IF_NAME_GUID =
{ 0xe7b615ba, 0x1909, 0x40a3,{ 0xbd, 0x24, 0xb2, 0x67, 0x14, 0xa6, 0x25, 0x52 } };

static UNICODE_STRING symbleName;

IF_NAME_GUIDはVisual Studio のツール「GUIDの作成」を利用し、作成する。

 

②「device.cpp」のCCaptureDevice::DispatchCreate静的関数の中に以下のソースを追加

...
if (!CapDevice) {
    ...
}
else {
    KsAcquireDevice(Device);
    ...
    if (NT_SUCCESS(Status)) {
        Status = IoRegisterDeviceInterface(Device->PhysicalDeviceObject

            , &IF_NAME_GUID, NULL, &symbleName);
    if (NT_SUCCESS(Status)) {
        DbgPrint("[avshws::DriverEntry] %S", symbleName.Buffer);

        Status = IoSetDeviceInterfaceState(&symbleName, TRUE);
    }
}

KsReleaseDevice(Device);
...
}
...

IoSetDeviceInterfaceStateルーチンの呼出しは設定したSymbolic Linkを有効させるため。

 

 

そうすると、以下のようなSymbolic Linkが出来上がり。

\\?\Root#UNKNOWN#0000#{GUID}

できたSymbolic Linkそのまま使えないので、下記の形にしてください。

\\?\Root#UNKNOWN#0000#{GUID}\GLOBAL

 ドライバを開く

HANDLE file = CreateFile(L"\\\\?\\Root#UNKNOWN#0000#{GUID}\\GLOBAL"

    ,GENERIC_READ | GENERIC_WRITE

    , FILE_SHARE_READ | FILE_SHARE_WRITE

    , NULL

    , OPEN_EXISTING

    , 0

    , NULL);

 

==以上==