/*++ Copyright (c) Microsoft Corporation. All rights reserved. Module Name: WdfCompanion.h Environment: user mode NOTE: This header is generated by stubwork. To modify contents, add or remove or tags in the corresponding .x and .y template files. --*/ #pragma once #ifndef WDF_EXTERN_C #ifdef __cplusplus #define WDF_EXTERN_C extern "C" #define WDF_EXTERN_C_START extern "C" { #define WDF_EXTERN_C_END } #else #define WDF_EXTERN_C #define WDF_EXTERN_C_START #define WDF_EXTERN_C_END #endif #endif WDF_EXTERN_C_START // // Types // // // This defines the dispatch type of the task queue. This controls how // the task queue delivers calls to the companion through the registered // callbacks. // // Sequential allows the task queue to automatically dispatch // one task at a time, and will hold tasks until a current task // is completed. // // Parallel has the task queue dispatch tasks to the companion as they arrive // at the queue. // typedef enum _WDF_TASK_QUEUE_DISPATCH_TYPE { WdfTaskQueueDispatchInvalid = 0, WdfTaskQueueDispatchSequential, WdfTaskQueueDispatchParallel, WdfTaskQueueDispatchMax, } WDF_TASK_QUEUE_DISPATCH_TYPE; #define WDF_TRACE_ID ('TRAC') // // Callbacks for FxDevice in companion mode // typedef _Function_class_(EVT_WDF_COMPANION_PRE_PREPARE_HARDWARE) _IRQL_requires_same_ _IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS EVT_WDF_COMPANION_PRE_PREPARE_HARDWARE( _In_ WDFCOMPANION Companion, _In_ WDFCMRESLIST ResourcesRaw, _In_ WDFCMRESLIST ResourcesTranslated ); typedef EVT_WDF_COMPANION_PRE_PREPARE_HARDWARE *PFN_WDF_COMPANION_PRE_PREPARE_HARDWARE; typedef _Function_class_(EVT_WDF_COMPANION_POST_RELEASE_HARDWARE) _IRQL_requires_same_ _IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS EVT_WDF_COMPANION_POST_RELEASE_HARDWARE( _In_ WDFCOMPANION Companion, _In_ WDFCMRESLIST ResourcesTranslated ); typedef EVT_WDF_COMPANION_POST_RELEASE_HARDWARE *PFN_WDF_COMPANION_POST_RELEASE_HARDWARE; typedef _Function_class_(EVT_WDF_COMPANION_PRE_D0_ENTRY) _IRQL_requires_same_ _IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS EVT_WDF_COMPANION_PRE_D0_ENTRY( _In_ WDFCOMPANION Companion, _In_ WDF_POWER_DEVICE_STATE PreviousState ); typedef EVT_WDF_COMPANION_PRE_D0_ENTRY *PFN_WDF_COMPANION_PRE_D0_ENTRY; typedef _Function_class_(EVT_WDF_COMPANION_POST_D0_EXIT) _IRQL_requires_same_ _IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS EVT_WDF_COMPANION_POST_D0_EXIT( _In_ WDFCOMPANION Companion, _In_ WDF_POWER_DEVICE_STATE TargetState ); typedef EVT_WDF_COMPANION_POST_D0_EXIT *PFN_WDF_COMPANION_POST_D0_EXIT; typedef struct _WDF_COMPANION_EVENT_CALLBACKS { // // Size of this structure in bytes // ULONG Size; PFN_WDF_COMPANION_PRE_D0_ENTRY EvtCompanionPreD0Entry; PFN_WDF_COMPANION_POST_D0_EXIT EvtCompanionPostD0Exit; PFN_WDF_COMPANION_PRE_PREPARE_HARDWARE EvtCompanionPrePrepareHardware; PFN_WDF_COMPANION_POST_RELEASE_HARDWARE EvtCompanionPostReleaseHardware; } WDF_COMPANION_EVENT_CALLBACKS, *PWDF_COMPANION_EVENT_CALLBACKS; VOID FORCEINLINE WDF_COMPANION_EVENT_CALLBACKS_INIT( _Out_ PWDF_COMPANION_EVENT_CALLBACKS Callbacks ) { RtlZeroMemory(Callbacks, sizeof(WDF_COMPANION_EVENT_CALLBACKS)); Callbacks->Size = sizeof(WDF_COMPANION_EVENT_CALLBACKS); } // // Task Queue Event callback definitions // typedef _Function_class_(EVT_WDF_TASK_QUEUE_TASK_EXECUTE_SYNC) _IRQL_requires_same_ _IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS EVT_WDF_TASK_QUEUE_TASK_EXECUTE_SYNC( _In_ WDFTASKQUEUE Queue, _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, _Out_writes_bytes_to_opt_(OutputBufferLength, *BytesWritten) PVOID OutputBuffer, _In_ size_t InputBufferLength, _In_ size_t OutputBufferLength, _In_ size_t* BytesWritten, _In_ ULONG TaskOperationCode ); typedef EVT_WDF_TASK_QUEUE_TASK_EXECUTE_SYNC *PFN_WDF_TASK_QUEUE_TASK_EXECUTE_SYNC; // // This is the structure used to configure an TaskQueue and // register callback events to it. // typedef struct _WDF_TASK_QUEUE_CONFIG { ULONG Size; USHORT TaskQueueId; WDF_TASK_QUEUE_DISPATCH_TYPE DispatchType; PFN_WDF_TASK_QUEUE_TASK_EXECUTE_SYNC EvtTaskExecuteSync; } WDF_TASK_QUEUE_CONFIG, *PWDF_TASK_QUEUE_CONFIG; VOID FORCEINLINE WDF_TASK_QUEUE_CONFIG_INIT( _Out_ PWDF_TASK_QUEUE_CONFIG Config, _In_ USHORT TaskQueueId, _In_ WDF_TASK_QUEUE_DISPATCH_TYPE DispatchType ) { RtlZeroMemory(Config, sizeof(WDF_TASK_QUEUE_CONFIG)); Config->Size = sizeof(WDF_TASK_QUEUE_CONFIG); Config->TaskQueueId = TaskQueueId; Config->DispatchType = DispatchType; } // // WDF Function: WdfDeviceInitSetCompanionEventCallbacks // typedef _IRQL_requires_max_(PASSIVE_LEVEL) WDFAPI VOID (*PFN_WDFDEVICEINITSETCOMPANIONEVENTCALLBACKS)( _In_ PWDF_DRIVER_GLOBALS DriverGlobals, _In_ PWDFDEVICE_INIT DeviceInit, _In_ PWDF_COMPANION_EVENT_CALLBACKS CompanionEventCallbacks ); // // Function Prototypes // _IRQL_requires_max_(PASSIVE_LEVEL) VOID FORCEINLINE WdfDeviceInitSetCompanionEventCallbacks( _In_ PWDFDEVICE_INIT DeviceInit, _In_ PWDF_COMPANION_EVENT_CALLBACKS CompanionEventCallbacks ) { ((PFN_WDFDEVICEINITSETCOMPANIONEVENTCALLBACKS) WdfFunctions[WdfDeviceInitSetCompanionEventCallbacksTableIndex])(WdfDriverGlobals, DeviceInit, CompanionEventCallbacks); } // // WDF Function: WdfCompanionCreate // typedef _Must_inspect_result_ _IRQL_requires_max_(PASSIVE_LEVEL) WDFAPI NTSTATUS (*PFN_WDFCOMPANIONCREATE)( _In_ PWDF_DRIVER_GLOBALS DriverGlobals, _Inout_ PWDFDEVICE_INIT* DeviceInit, _In_opt_ PWDF_OBJECT_ATTRIBUTES DeviceAttributes, _Out_ WDFCOMPANION* Companion ); _Must_inspect_result_ _IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS FORCEINLINE WdfCompanionCreate( _Inout_ PWDFDEVICE_INIT* DeviceInit, _In_opt_ PWDF_OBJECT_ATTRIBUTES DeviceAttributes, _Out_ WDFCOMPANION* Companion ) { return ((PFN_WDFCOMPANIONCREATE) WdfFunctions[WdfCompanionCreateTableIndex])(WdfDriverGlobals, DeviceInit, DeviceAttributes, Companion); } // // WDF Function: WdfCompanionWdmGetSecureDeviceHandle // typedef _IRQL_requires_max_(PASSIVE_LEVEL) WDFAPI HANDLE (*PFN_WDFCOMPANIONWDMGETSECUREDEVICEHANDLE)( _In_ PWDF_DRIVER_GLOBALS DriverGlobals, _In_ WDFCOMPANION Companion ); _IRQL_requires_max_(PASSIVE_LEVEL) HANDLE FORCEINLINE WdfCompanionWdmGetSecureDeviceHandle( _In_ WDFCOMPANION Companion ) { return ((PFN_WDFCOMPANIONWDMGETSECUREDEVICEHANDLE) WdfFunctions[WdfCompanionWdmGetSecureDeviceHandleTableIndex])(WdfDriverGlobals, Companion); } // // WDF Function: WdfCompanionCreateTaskQueue // typedef _Must_inspect_result_ _IRQL_requires_max_(PASSIVE_LEVEL) WDFAPI NTSTATUS (*PFN_WDFCOMPANIONCREATETASKQUEUE)( _In_ PWDF_DRIVER_GLOBALS DriverGlobals, _In_ WDFCOMPANION Companion, _In_ PWDF_TASK_QUEUE_CONFIG Config, _In_opt_ PWDF_OBJECT_ATTRIBUTES QueueAttributes, _Out_opt_ WDFTASKQUEUE* Queue ); _Must_inspect_result_ _IRQL_requires_max_(PASSIVE_LEVEL) NTSTATUS FORCEINLINE WdfCompanionCreateTaskQueue( _In_ WDFCOMPANION Companion, _In_ PWDF_TASK_QUEUE_CONFIG Config, _In_opt_ PWDF_OBJECT_ATTRIBUTES QueueAttributes, _Out_opt_ WDFTASKQUEUE* Queue ) { return ((PFN_WDFCOMPANIONCREATETASKQUEUE) WdfFunctions[WdfCompanionCreateTaskQueueTableIndex])(WdfDriverGlobals, Companion, Config, QueueAttributes, Queue); } WDF_EXTERN_C_END