WDF程式設計接口類似PME(Property/Method/Event)接口模型。
屬性描述對象特性,通過Get或Retrieve獲得屬性,通過Set或者Assign設定屬性。就像WdfDeviceGetDevicePnpState、WdfDeviceGetDevicePowerState和WdfDeviceSetDeviceState,都是裝置對象的屬性方法。
除了屬性接口,WDF其它接口函數是方法接口,如WdfDriverCreate、WdfDeviceCreate等,WDF驅動程式通過方法函數接口操作WDF架構對象。
事件對于WDF驅動來說非常重要,WDF驅動,除了入口函數DriverEntry,其它的都無外乎事件處理函數,以及事件處理函數調用的子函數。
事件函數實際上就是回調函數,一般把它叫做“事件回調”。
當建立一個回調對象時,可以通過屬性結構體WDF_OBJECT_ATTRIBUTES或者其它結構體設定事件回調。當相應的事件發生,系統會檢查對象是否有對應事件回調,
有就調用。
基對象WDFOBJECT事件回調,前面已經講過通過WDF_OBJECT_ATTRIBUTES設定。
子對象事件回調既可以設定公共的基對象回調,也可以設定子對象回調。
以裝置對象建立WdfDeviceCreate為例,
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
FORCEINLINE
WdfDeviceCreate(
_Inout_
PWDFDEVICE_INIT* DeviceInit,
_In_opt_
PWDF_OBJECT_ATTRIBUTES DeviceAttributes,
_Out_
WDFDEVICE* Device
)
{
return ((PFN_WDFDEVICECREATE) WdfFunctions[WdfDeviceCreateTableIndex])(WdfDriverGlobals, DeviceInit, DeviceAttributes, Device);
}
參數DeviceAttributes用做設定基對象屬性。
DeviceInit設定對象特有屬性,例如pnp和電源回調。
可以通過下面的函數WdfDeviceInitSetPnpPowerEventCallbacks來設定:
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
FORCEINLINE
WdfDeviceInitSetPnpPowerEventCallbacks(
_In_
PWDFDEVICE_INIT DeviceInit,
_In_
PWDF_PNPPOWER_EVENT_CALLBACKS PnpPowerEventCallbacks
)
{
((PFN_WDFDEVICEINITSETPNPPOWEREVENTCALLBACKS) WdfFunctions[WdfDeviceInitSetPnpPowerEventCallbacksTableIndex])(WdfDriverGlobals, DeviceInit, PnpPowerEventCallbacks);
}
參數PnpPowerEventCallbacks是一個回調函數資料結構,設定PNP和電源回調函數。