CreateFileでAVStream minidriverから HANDLEの取得方法
マイクロソフトさんのドライバサンプルを例にする
ドライバに「コマンド(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);
==以上==