我正在编写一个DeviceIoControl API钩子应用程序,它将跟踪目标应用程序所做的所有DeviceIoControl()调用。以下是DeviceIoControl的签名,以便于参考:
BOOL WINAPI DeviceIoControl(
In HANDLE hDevice,
In DWORD dwIoControlCode,
_In_opt_ LPVOID lpInBuffer,
In DWORD nInBufferSize,
_Out_opt_ LPVOID lpOutBuffer,
In DWORD nOutBufferSize,
_Out_opt_ LPDWORD lpBytesReturned,
_Inout_opt_ LPOVERLAPPED lpOverlapped
);
我的问题是,我如何弄清楚这个Ioctl被定位到哪个设备,即如何反转hDevice HANDLE并找到实际的设备。
答案 0 :(得分:2)
使用NtQueryObject()
确定句柄所代表的对象的类型和名称。您可能还需要使用QueryDosDevice()
将硬件设备名称解析为本地文件系统路径。请参阅此文章以帮助您入门:
HOWTO:枚举句柄
http://forum.sysinternals.com/howto-enumerate-handles_topic18892.html
了解设备类型后,即可
然后使用特定于类型的API,如GetVolumeInformationByHandle()
,GetFileInformationByHandleEx()
等,以获取更详细的信息。