天天看點

跟我一起學習windows驅動(PME接口)

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和電源回調函數。

繼續閱讀