標籤:
上篇《Windows 驅動開發 - 3》我們使用了PnP,現在還差WMI。
WMI:Windows Management Interface
WMI 提供預裝的類架構,允許使用指令碼語言(VBS)、C#、VB .NET 或 C++ 編寫的指令碼或應用程式監視和配置電腦中的應用程式、系統或網路組件以及硬體。
一、WMI 雖然WDF幫你完成很多工作,但是你還必須自己觸發事件和執行個體化回呼函數。 在WDM中使用 wmilib.sys 靜態註冊很容易,但難以動態註冊。 但是在WDF中這些很容易實現。 1. IRP_MJ_SYSTEM_CONTROL
WDF完全掌控IRP_MJ_SYSTEM_CONTROL。
IRP_MJ_SYSTEM_CONTROL:系統內部產生的控制資訊,類似於核心調用DeviceControl函數
注意:使用DeviceControl系統最低要求為xp。
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);
2. 模式
(1) 執行個體化已用裝置
(2) 當需要的時候觸發事件
(3) 統計報告
(4) 更新狀態
(5) 登出後刪除裝置 (正常或意外刪除)
3. ETW / 跟蹤
支援核心模式 ETW / 跟蹤
二、WDF和WMI
wdf使用WdfDeviceCreateDeviceInterface為WMI提供介面。
NTSTATUS WdfDeviceCreateDeviceInterface( [in] WDFDEVICE Device, [in] const GUID *InterfaceClassGUID, [in, optional] PCUNICODE_STRING ReferenceString);
其中GUID,請參見“Using GUIDs in Drivers”
GUID聲明(需要使用標頭檔initguid.h):
DEFINE_GUID(GUID_DEVINTERFACE_OSRUSBFX2, // Generated using guidgen.exe 0x573e8c73, 0xcb4, 0x4471, 0xa1, 0xbf, 0xfa, 0xb2, 0x6c, 0x31, 0xd3, 0x84);// {573E8C73-0CB4-4471-A1BF-FAB26C31D384}
Windows 驅動開發 - 4