reactos/sdk/include/wdf/kmdf/1.17/wdfio.h

1190 lines
27 KiB
C

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
_WdfVersionBuild_
Module Name:
wdfio.h
Abstract:
This module contains contains the Windows Driver Framework I/O
interfaces.
Environment:
kernel mode only
Revision History:
--*/
//
// NOTE: This header is generated by stubwork. Please make any
// modifications to the corresponding template files
// (.x or .y) and use stubwork to regenerate the header
//
#ifndef _WDFIO_H_
#define _WDFIO_H_
#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
#if (NTDDI_VERSION >= NTDDI_WIN2K)
//
// Types
//
//
// This defines the dispatch type of the queue. This controls how
// the queue raises I/O events to the driver through the registered
// callbacks.
//
// Sequential allows the driver to have the queue automatically dispatch
// one request at a time, and will hold requests until a current request
// is completed.
//
// Parallel has the queue dispatch requests to the driver as they arrive
// at the queue, and the queue is in a processing state. The driver can
// look at the requests in real time, and decide to service them, forward them
// to another queue, pend them, or return a status to have the queue held
// due to a hardware or other resource limit.
//
// Manual allows the driver to create multiple queues for requests, and control
// when it wants to retrieve requests from the queue by calling the queues
// WdfIoQueueRetrieveNextRequest() API.
//
typedef enum _WDF_IO_QUEUE_DISPATCH_TYPE {
WdfIoQueueDispatchInvalid = 0,
WdfIoQueueDispatchSequential,
WdfIoQueueDispatchParallel,
WdfIoQueueDispatchManual,
WdfIoQueueDispatchMax,
} WDF_IO_QUEUE_DISPATCH_TYPE;
//
// This defines the status of the queue.
//
// WdfIoQueueAcceptRequests - If TRUE, Queue will accept requests from WDM
// dispatch through WdfDeviceConfigureRequestDispatching,
// or from WdfRequestForwardToIoQueue.
//
// If FALSE, Queue will complete requests with
// STATUS_CANCELLED from WdfDeviceConfigureRequestDispatching,
// and fail WdfRequestForwardToIoQueue with
// STATUS_WDF_BUSY.
//
//
// WdfIoQueueDispatchRequests - If TRUE, and the Queue is configured for
// automatic dispatch as either
// WdfIoQueueDispatchSequential,
// or WdfIoQueueDispatchParallel, the Queue will
// present the requests to the driver according
// to the drivers configuration.
//
// If FALSE, requests are not automatically
// presented to the device driver.
//
// This has no effect on the drivers ability to
// retrieve requests with WdfIoQueueRetrieveNextRequest.
//
// WdfIoQueueNoRequests - If TRUE, the Queue has no requests to present
// or return to the device driver.
//
// WdfIoQueueDriverNoRequests - If TRUE, the device driver is not operating
// on any requests retrieved from or presented
// by this Queue.
//
// WdfIoQueuePnpHeld - The Framework PnP stage has requested that
// the device driver stop receiving new requests.
//
// Automatic request dispatch stops, and
// WdfIoQueueRetrieveNextRequest returns STATUS_WDF_BUSY.
//
typedef enum _WDF_IO_QUEUE_STATE {
WdfIoQueueAcceptRequests = 0x01,
WdfIoQueueDispatchRequests = 0x02,
WdfIoQueueNoRequests = 0x04,
WdfIoQueueDriverNoRequests = 0x08,
WdfIoQueuePnpHeld = 0x10,
} WDF_IO_QUEUE_STATE;
//
// These macros represent some common Queue states
//
//
// A Queue is idle if it has no requests, and the driver
// is not operating on any.
//
FORCEINLINE
BOOLEAN
WDF_IO_QUEUE_IDLE(
_In_ WDF_IO_QUEUE_STATE State
)
{
return ((State & WdfIoQueueNoRequests) &&
(State & WdfIoQueueDriverNoRequests)) ? TRUE: FALSE;
}
//
// A Queue is ready if it can accept and dispatch requests and
// queue is not held by PNP
//
FORCEINLINE
BOOLEAN
WDF_IO_QUEUE_READY(
_In_ WDF_IO_QUEUE_STATE State
)
{
return ((State & WdfIoQueueDispatchRequests) &&
(State & WdfIoQueueAcceptRequests) &&
((State & WdfIoQueuePnpHeld)==0)) ? TRUE: FALSE;
}
//
// A Queue is stopped if it can accept new requests, but
// is not automatically delivering them to the device driver,
// and the queue is idle.
//
FORCEINLINE
BOOLEAN
WDF_IO_QUEUE_STOPPED(
_In_ WDF_IO_QUEUE_STATE State
)
{
return (((State & WdfIoQueueDispatchRequests) == 0) &&
(State & WdfIoQueueAcceptRequests) &&
(State & WdfIoQueueDriverNoRequests)) ? TRUE: FALSE;
}
//
// A Queue is drained if it can not accept new requests but
// can dispatch existing requests, and there are no requests
// either in the Queue or the device driver.
//
FORCEINLINE
BOOLEAN
WDF_IO_QUEUE_DRAINED(
_In_ WDF_IO_QUEUE_STATE State
)
{
return ( ((State & WdfIoQueueAcceptRequests)==0) &&
(State & WdfIoQueueDispatchRequests) &&
(State & WdfIoQueueNoRequests) &&
(State & WdfIoQueueDriverNoRequests) ) ? TRUE: FALSE;
}
//
// A Queue is purged if it can not accept new requests
// and there are no requests either in the Queue or
// the device driver.
//
FORCEINLINE
BOOLEAN
WDF_IO_QUEUE_PURGED(
_In_ WDF_IO_QUEUE_STATE State
)
{
return ( ((State & WdfIoQueueAcceptRequests)==0) &&
(State & WdfIoQueueNoRequests) &&
(State & WdfIoQueueDriverNoRequests) ) ? TRUE: FALSE;
}
//
// Event callback definitions
//
typedef
_Function_class_(EVT_WDF_IO_QUEUE_IO_DEFAULT)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
STDCALL
EVT_WDF_IO_QUEUE_IO_DEFAULT(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST Request
);
typedef EVT_WDF_IO_QUEUE_IO_DEFAULT *PFN_WDF_IO_QUEUE_IO_DEFAULT;
typedef
_Function_class_(EVT_WDF_IO_QUEUE_IO_STOP)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
STDCALL
EVT_WDF_IO_QUEUE_IO_STOP(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST Request,
_In_
ULONG ActionFlags
);
typedef EVT_WDF_IO_QUEUE_IO_STOP *PFN_WDF_IO_QUEUE_IO_STOP;
typedef
_Function_class_(EVT_WDF_IO_QUEUE_IO_RESUME)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
STDCALL
EVT_WDF_IO_QUEUE_IO_RESUME(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST Request
);
typedef EVT_WDF_IO_QUEUE_IO_RESUME *PFN_WDF_IO_QUEUE_IO_RESUME;
typedef
_Function_class_(EVT_WDF_IO_QUEUE_IO_READ)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
STDCALL
EVT_WDF_IO_QUEUE_IO_READ(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST Request,
_In_
size_t Length
);
typedef EVT_WDF_IO_QUEUE_IO_READ *PFN_WDF_IO_QUEUE_IO_READ;
typedef
_Function_class_(EVT_WDF_IO_QUEUE_IO_WRITE)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
STDCALL
EVT_WDF_IO_QUEUE_IO_WRITE(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST Request,
_In_
size_t Length
);
typedef EVT_WDF_IO_QUEUE_IO_WRITE *PFN_WDF_IO_QUEUE_IO_WRITE;
typedef
_Function_class_(EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
STDCALL
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST Request,
_In_
size_t OutputBufferLength,
_In_
size_t InputBufferLength,
_In_
ULONG IoControlCode
);
typedef EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL *PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL;
typedef
_Function_class_(EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
STDCALL
EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST Request,
_In_
size_t OutputBufferLength,
_In_
size_t InputBufferLength,
_In_
ULONG IoControlCode
);
typedef EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL *PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL;
typedef
_Function_class_(EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
STDCALL
EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST Request
);
typedef EVT_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE *PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE;
typedef
_Function_class_(EVT_WDF_IO_QUEUE_STATE)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
VOID
STDCALL
EVT_WDF_IO_QUEUE_STATE(
_In_
WDFQUEUE Queue,
_In_
WDFCONTEXT Context
);
typedef EVT_WDF_IO_QUEUE_STATE *PFN_WDF_IO_QUEUE_STATE;
//
// This is the structure used to configure an IoQueue and
// register callback events to it.
//
typedef struct _WDF_IO_QUEUE_CONFIG {
ULONG Size;
WDF_IO_QUEUE_DISPATCH_TYPE DispatchType;
WDF_TRI_STATE PowerManaged;
BOOLEAN AllowZeroLengthRequests;
BOOLEAN DefaultQueue;
PFN_WDF_IO_QUEUE_IO_DEFAULT EvtIoDefault;
PFN_WDF_IO_QUEUE_IO_READ EvtIoRead;
PFN_WDF_IO_QUEUE_IO_WRITE EvtIoWrite;
PFN_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl;
PFN_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl;
PFN_WDF_IO_QUEUE_IO_STOP EvtIoStop;
PFN_WDF_IO_QUEUE_IO_RESUME EvtIoResume;
PFN_WDF_IO_QUEUE_IO_CANCELED_ON_QUEUE EvtIoCanceledOnQueue;
union {
struct {
ULONG NumberOfPresentedRequests;
} Parallel;
} Settings;
WDFDRIVER Driver;
} WDF_IO_QUEUE_CONFIG, *PWDF_IO_QUEUE_CONFIG;
FORCEINLINE
VOID
WDF_IO_QUEUE_CONFIG_INIT(
_Out_ PWDF_IO_QUEUE_CONFIG Config,
_In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType
)
{
RtlZeroMemory(Config, sizeof(WDF_IO_QUEUE_CONFIG));
Config->Size = sizeof(WDF_IO_QUEUE_CONFIG);
Config->PowerManaged = WdfUseDefault;
Config->DispatchType = DispatchType;
if (Config->DispatchType == WdfIoQueueDispatchParallel) {
Config->Settings.Parallel.NumberOfPresentedRequests = (ULONG)-1;
}
}
FORCEINLINE
VOID
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(
_Out_ PWDF_IO_QUEUE_CONFIG Config,
_In_ WDF_IO_QUEUE_DISPATCH_TYPE DispatchType
)
{
RtlZeroMemory(Config, sizeof(WDF_IO_QUEUE_CONFIG));
Config->Size = sizeof(WDF_IO_QUEUE_CONFIG);
Config->PowerManaged = WdfUseDefault;
Config->DefaultQueue = TRUE;
Config->DispatchType = DispatchType;
if (Config->DispatchType == WdfIoQueueDispatchParallel) {
Config->Settings.Parallel.NumberOfPresentedRequests = (ULONG)-1;
}
}
typedef enum _WDF_IO_FORWARD_PROGRESS_ACTION {
WdfIoForwardProgressActionInvalid = 0x0,
WdfIoForwardProgressActionFailRequest,
WdfIoForwardProgressActionUseReservedRequest
} WDF_IO_FORWARD_PROGRESS_ACTION;
typedef enum _WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY {
WdfIoForwardProgressInvalidPolicy =0x0,
WdfIoForwardProgressReservedPolicyAlwaysUseReservedRequest,
WdfIoForwardProgressReservedPolicyUseExamine,
WdfIoForwardProgressReservedPolicyPagingIO
} WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY;
typedef
_Function_class_(EVT_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
NTSTATUS
STDCALL
EVT_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST Request
);
typedef EVT_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST *PFN_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST;
typedef
_Function_class_(EVT_WDF_IO_ALLOCATE_REQUEST_RESOURCES)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
NTSTATUS
STDCALL
EVT_WDF_IO_ALLOCATE_REQUEST_RESOURCES(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST Request
);
typedef EVT_WDF_IO_ALLOCATE_REQUEST_RESOURCES *PFN_WDF_IO_ALLOCATE_REQUEST_RESOURCES;
typedef
_Function_class_(EVT_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS)
_IRQL_requires_same_
_IRQL_requires_max_(DISPATCH_LEVEL)
WDF_IO_FORWARD_PROGRESS_ACTION
STDCALL
EVT_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS(
_In_
WDFQUEUE Queue,
_In_
PIRP Irp
);
typedef EVT_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS *PFN_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS;
typedef struct _WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY_SETTINGS {
union {
struct {
PFN_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS EvtIoWdmIrpForForwardProgress;
} ExaminePolicy;
} Policy;
} WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY_SETTINGS;
typedef struct _WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY {
ULONG Size;
ULONG TotalForwardProgressRequests;
//
// Specify the type of the policy here.
//
WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY ForwardProgressReservedPolicy;
//
// Structure which contains the policy specific fields
//
WDF_IO_FORWARD_PROGRESS_RESERVED_POLICY_SETTINGS ForwardProgressReservePolicySettings;
//
// Callback for reserved request given at initialization time
//
PFN_WDF_IO_ALLOCATE_RESOURCES_FOR_RESERVED_REQUEST EvtIoAllocateResourcesForReservedRequest;
//
// Callback for reserved request given at run time
//
PFN_WDF_IO_ALLOCATE_REQUEST_RESOURCES EvtIoAllocateRequestResources;
} WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY, *PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY;
FORCEINLINE
VOID
WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_DEFAULT_INIT(
_Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy,
_In_ ULONG TotalForwardProgressRequests
)
{
RtlZeroMemory(Policy, sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY));
Policy->Size = sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY);
Policy->TotalForwardProgressRequests = TotalForwardProgressRequests;
Policy->ForwardProgressReservedPolicy = WdfIoForwardProgressReservedPolicyAlwaysUseReservedRequest;
}
FORCEINLINE
VOID
WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_EXAMINE_INIT(
_Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy,
_In_ ULONG TotalForwardProgressRequests,
_In_ PFN_WDF_IO_WDM_IRP_FOR_FORWARD_PROGRESS EvtIoWdmIrpForForwardProgress
)
{
RtlZeroMemory(Policy, sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY));
Policy->Size = sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY);
Policy->TotalForwardProgressRequests = TotalForwardProgressRequests;
Policy->ForwardProgressReservedPolicy = WdfIoForwardProgressReservedPolicyUseExamine;
Policy->ForwardProgressReservePolicySettings.Policy.ExaminePolicy.EvtIoWdmIrpForForwardProgress =
EvtIoWdmIrpForForwardProgress;
}
FORCEINLINE
VOID
WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_PAGINGIO_INIT(
_Out_ PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY Policy,
_In_ ULONG TotalForwardProgressRequests
)
{
RtlZeroMemory(Policy, sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY));
Policy->Size = sizeof(WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY);
Policy->TotalForwardProgressRequests = TotalForwardProgressRequests;
Policy->ForwardProgressReservedPolicy = WdfIoForwardProgressReservedPolicyPagingIO;
}
//
// WDF Function: WdfIoQueueCreate
//
typedef
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
NTSTATUS
(STDCALL *PFN_WDFIOQUEUECREATE)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFDEVICE Device,
_In_
PWDF_IO_QUEUE_CONFIG Config,
_In_opt_
PWDF_OBJECT_ATTRIBUTES QueueAttributes,
_Out_opt_
WDFQUEUE* Queue
);
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
NTSTATUS
WdfIoQueueCreate(
_In_
WDFDEVICE Device,
_In_
PWDF_IO_QUEUE_CONFIG Config,
_In_opt_
PWDF_OBJECT_ATTRIBUTES QueueAttributes,
_Out_opt_
WDFQUEUE* Queue
)
{
return ((PFN_WDFIOQUEUECREATE) WdfFunctions[WdfIoQueueCreateTableIndex])(WdfDriverGlobals, Device, Config, QueueAttributes, Queue);
}
//
// WDF Function: WdfIoQueueGetState
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
WDF_IO_QUEUE_STATE
(STDCALL *PFN_WDFIOQUEUEGETSTATE)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_Out_opt_
PULONG QueueRequests,
_Out_opt_
PULONG DriverRequests
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
WDF_IO_QUEUE_STATE
WdfIoQueueGetState(
_In_
WDFQUEUE Queue,
_Out_opt_
PULONG QueueRequests,
_Out_opt_
PULONG DriverRequests
)
{
return ((PFN_WDFIOQUEUEGETSTATE) WdfFunctions[WdfIoQueueGetStateTableIndex])(WdfDriverGlobals, Queue, QueueRequests, DriverRequests);
}
//
// WDF Function: WdfIoQueueStart
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
VOID
(STDCALL *PFN_WDFIOQUEUESTART)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
VOID
WdfIoQueueStart(
_In_
WDFQUEUE Queue
)
{
((PFN_WDFIOQUEUESTART) WdfFunctions[WdfIoQueueStartTableIndex])(WdfDriverGlobals, Queue);
}
//
// WDF Function: WdfIoQueueStop
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
VOID
(STDCALL *PFN_WDFIOQUEUESTOP)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_When_(Context != 0, _In_)
_When_(Context == 0, _In_opt_)
PFN_WDF_IO_QUEUE_STATE StopComplete,
_When_(StopComplete != 0, _In_)
_When_(StopComplete == 0, _In_opt_)
WDFCONTEXT Context
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
VOID
WdfIoQueueStop(
_In_
WDFQUEUE Queue,
_When_(Context != 0, _In_)
_When_(Context == 0, _In_opt_)
PFN_WDF_IO_QUEUE_STATE StopComplete,
_When_(StopComplete != 0, _In_)
_When_(StopComplete == 0, _In_opt_)
WDFCONTEXT Context
)
{
((PFN_WDFIOQUEUESTOP) WdfFunctions[WdfIoQueueStopTableIndex])(WdfDriverGlobals, Queue, StopComplete, Context);
}
//
// WDF Function: WdfIoQueueStopSynchronously
//
typedef
_IRQL_requires_max_(PASSIVE_LEVEL)
WDFAPI
VOID
(STDCALL *PFN_WDFIOQUEUESTOPSYNCHRONOUSLY)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue
);
_IRQL_requires_max_(PASSIVE_LEVEL)
FORCEINLINE
VOID
WdfIoQueueStopSynchronously(
_In_
WDFQUEUE Queue
)
{
((PFN_WDFIOQUEUESTOPSYNCHRONOUSLY) WdfFunctions[WdfIoQueueStopSynchronouslyTableIndex])(WdfDriverGlobals, Queue);
}
//
// WDF Function: WdfIoQueueGetDevice
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
WDFDEVICE
(STDCALL *PFN_WDFIOQUEUEGETDEVICE)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
WDFDEVICE
WdfIoQueueGetDevice(
_In_
WDFQUEUE Queue
)
{
return ((PFN_WDFIOQUEUEGETDEVICE) WdfFunctions[WdfIoQueueGetDeviceTableIndex])(WdfDriverGlobals, Queue);
}
//
// WDF Function: WdfIoQueueRetrieveNextRequest
//
typedef
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
NTSTATUS
(STDCALL *PFN_WDFIOQUEUERETRIEVENEXTREQUEST)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_Out_
WDFREQUEST* OutRequest
);
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
NTSTATUS
WdfIoQueueRetrieveNextRequest(
_In_
WDFQUEUE Queue,
_Out_
WDFREQUEST* OutRequest
)
{
return ((PFN_WDFIOQUEUERETRIEVENEXTREQUEST) WdfFunctions[WdfIoQueueRetrieveNextRequestTableIndex])(WdfDriverGlobals, Queue, OutRequest);
}
//
// WDF Function: WdfIoQueueRetrieveRequestByFileObject
//
typedef
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
NTSTATUS
(STDCALL *PFN_WDFIOQUEUERETRIEVEREQUESTBYFILEOBJECT)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_In_
WDFFILEOBJECT FileObject,
_Out_
WDFREQUEST* OutRequest
);
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
NTSTATUS
WdfIoQueueRetrieveRequestByFileObject(
_In_
WDFQUEUE Queue,
_In_
WDFFILEOBJECT FileObject,
_Out_
WDFREQUEST* OutRequest
)
{
return ((PFN_WDFIOQUEUERETRIEVEREQUESTBYFILEOBJECT) WdfFunctions[WdfIoQueueRetrieveRequestByFileObjectTableIndex])(WdfDriverGlobals, Queue, FileObject, OutRequest);
}
//
// WDF Function: WdfIoQueueFindRequest
//
typedef
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
NTSTATUS
(STDCALL *PFN_WDFIOQUEUEFINDREQUEST)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_In_opt_
WDFREQUEST FoundRequest,
_In_opt_
WDFFILEOBJECT FileObject,
_Inout_opt_
PWDF_REQUEST_PARAMETERS Parameters,
_Out_
WDFREQUEST* OutRequest
);
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
NTSTATUS
WdfIoQueueFindRequest(
_In_
WDFQUEUE Queue,
_In_opt_
WDFREQUEST FoundRequest,
_In_opt_
WDFFILEOBJECT FileObject,
_Inout_opt_
PWDF_REQUEST_PARAMETERS Parameters,
_Out_
WDFREQUEST* OutRequest
)
{
return ((PFN_WDFIOQUEUEFINDREQUEST) WdfFunctions[WdfIoQueueFindRequestTableIndex])(WdfDriverGlobals, Queue, FoundRequest, FileObject, Parameters, OutRequest);
}
//
// WDF Function: WdfIoQueueRetrieveFoundRequest
//
typedef
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
NTSTATUS
(STDCALL *PFN_WDFIOQUEUERETRIEVEFOUNDREQUEST)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST FoundRequest,
_Out_
WDFREQUEST* OutRequest
);
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
NTSTATUS
WdfIoQueueRetrieveFoundRequest(
_In_
WDFQUEUE Queue,
_In_
WDFREQUEST FoundRequest,
_Out_
WDFREQUEST* OutRequest
)
{
return ((PFN_WDFIOQUEUERETRIEVEFOUNDREQUEST) WdfFunctions[WdfIoQueueRetrieveFoundRequestTableIndex])(WdfDriverGlobals, Queue, FoundRequest, OutRequest);
}
//
// WDF Function: WdfIoQueueDrainSynchronously
//
typedef
_IRQL_requires_max_(PASSIVE_LEVEL)
WDFAPI
VOID
(STDCALL *PFN_WDFIOQUEUEDRAINSYNCHRONOUSLY)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue
);
_IRQL_requires_max_(PASSIVE_LEVEL)
FORCEINLINE
VOID
WdfIoQueueDrainSynchronously(
_In_
WDFQUEUE Queue
)
{
((PFN_WDFIOQUEUEDRAINSYNCHRONOUSLY) WdfFunctions[WdfIoQueueDrainSynchronouslyTableIndex])(WdfDriverGlobals, Queue);
}
//
// WDF Function: WdfIoQueueDrain
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
VOID
(STDCALL *PFN_WDFIOQUEUEDRAIN)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_When_(Context != 0, _In_)
_When_(Context == 0, _In_opt_)
PFN_WDF_IO_QUEUE_STATE DrainComplete,
_When_(DrainComplete != 0, _In_)
_When_(DrainComplete == 0, _In_opt_)
WDFCONTEXT Context
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
VOID
WdfIoQueueDrain(
_In_
WDFQUEUE Queue,
_When_(Context != 0, _In_)
_When_(Context == 0, _In_opt_)
PFN_WDF_IO_QUEUE_STATE DrainComplete,
_When_(DrainComplete != 0, _In_)
_When_(DrainComplete == 0, _In_opt_)
WDFCONTEXT Context
)
{
((PFN_WDFIOQUEUEDRAIN) WdfFunctions[WdfIoQueueDrainTableIndex])(WdfDriverGlobals, Queue, DrainComplete, Context);
}
//
// WDF Function: WdfIoQueuePurgeSynchronously
//
typedef
_IRQL_requires_max_(PASSIVE_LEVEL)
WDFAPI
VOID
(STDCALL *PFN_WDFIOQUEUEPURGESYNCHRONOUSLY)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue
);
_IRQL_requires_max_(PASSIVE_LEVEL)
FORCEINLINE
VOID
WdfIoQueuePurgeSynchronously(
_In_
WDFQUEUE Queue
)
{
((PFN_WDFIOQUEUEPURGESYNCHRONOUSLY) WdfFunctions[WdfIoQueuePurgeSynchronouslyTableIndex])(WdfDriverGlobals, Queue);
}
//
// WDF Function: WdfIoQueuePurge
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
VOID
(STDCALL *PFN_WDFIOQUEUEPURGE)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_When_(Context != 0, _In_)
_When_(Context == 0, _In_opt_)
PFN_WDF_IO_QUEUE_STATE PurgeComplete,
_When_(PurgeComplete != 0, _In_)
_When_(PurgeComplete == 0, _In_opt_)
WDFCONTEXT Context
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
VOID
WdfIoQueuePurge(
_In_
WDFQUEUE Queue,
_When_(Context != 0, _In_)
_When_(Context == 0, _In_opt_)
PFN_WDF_IO_QUEUE_STATE PurgeComplete,
_When_(PurgeComplete != 0, _In_)
_When_(PurgeComplete == 0, _In_opt_)
WDFCONTEXT Context
)
{
((PFN_WDFIOQUEUEPURGE) WdfFunctions[WdfIoQueuePurgeTableIndex])(WdfDriverGlobals, Queue, PurgeComplete, Context);
}
//
// WDF Function: WdfIoQueueReadyNotify
//
typedef
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
NTSTATUS
(STDCALL *PFN_WDFIOQUEUEREADYNOTIFY)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_In_opt_
PFN_WDF_IO_QUEUE_STATE QueueReady,
_In_opt_
WDFCONTEXT Context
);
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
NTSTATUS
WdfIoQueueReadyNotify(
_In_
WDFQUEUE Queue,
_In_opt_
PFN_WDF_IO_QUEUE_STATE QueueReady,
_In_opt_
WDFCONTEXT Context
)
{
return ((PFN_WDFIOQUEUEREADYNOTIFY) WdfFunctions[WdfIoQueueReadyNotifyTableIndex])(WdfDriverGlobals, Queue, QueueReady, Context);
}
//
// WDF Function: WdfIoQueueAssignForwardProgressPolicy
//
typedef
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
WDFAPI
NTSTATUS
(STDCALL *PFN_WDFIOQUEUEASSIGNFORWARDPROGRESSPOLICY)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_In_
PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY ForwardProgressPolicy
);
_Must_inspect_result_
_IRQL_requires_max_(PASSIVE_LEVEL)
FORCEINLINE
NTSTATUS
WdfIoQueueAssignForwardProgressPolicy(
_In_
WDFQUEUE Queue,
_In_
PWDF_IO_QUEUE_FORWARD_PROGRESS_POLICY ForwardProgressPolicy
)
{
return ((PFN_WDFIOQUEUEASSIGNFORWARDPROGRESSPOLICY) WdfFunctions[WdfIoQueueAssignForwardProgressPolicyTableIndex])(WdfDriverGlobals, Queue, ForwardProgressPolicy);
}
//
// WDF Function: WdfIoQueueStopAndPurge
//
typedef
_IRQL_requires_max_(DISPATCH_LEVEL)
WDFAPI
VOID
(STDCALL *PFN_WDFIOQUEUESTOPANDPURGE)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue,
_When_(Context != 0, _In_)
_When_(Context == 0, _In_opt_)
PFN_WDF_IO_QUEUE_STATE StopAndPurgeComplete,
_When_(StopAndPurgeComplete != 0, _In_)
_When_(StopAndPurgeComplete == 0, _In_opt_)
WDFCONTEXT Context
);
_IRQL_requires_max_(DISPATCH_LEVEL)
FORCEINLINE
VOID
WdfIoQueueStopAndPurge(
_In_
WDFQUEUE Queue,
_When_(Context != 0, _In_)
_When_(Context == 0, _In_opt_)
PFN_WDF_IO_QUEUE_STATE StopAndPurgeComplete,
_When_(StopAndPurgeComplete != 0, _In_)
_When_(StopAndPurgeComplete == 0, _In_opt_)
WDFCONTEXT Context
)
{
((PFN_WDFIOQUEUESTOPANDPURGE) WdfFunctions[WdfIoQueueStopAndPurgeTableIndex])(WdfDriverGlobals, Queue, StopAndPurgeComplete, Context);
}
//
// WDF Function: WdfIoQueueStopAndPurgeSynchronously
//
typedef
_IRQL_requires_max_(PASSIVE_LEVEL)
WDFAPI
VOID
(STDCALL *PFN_WDFIOQUEUESTOPANDPURGESYNCHRONOUSLY)(
_In_
PWDF_DRIVER_GLOBALS DriverGlobals,
_In_
WDFQUEUE Queue
);
_IRQL_requires_max_(PASSIVE_LEVEL)
FORCEINLINE
VOID
WdfIoQueueStopAndPurgeSynchronously(
_In_
WDFQUEUE Queue
)
{
((PFN_WDFIOQUEUESTOPANDPURGESYNCHRONOUSLY) WdfFunctions[WdfIoQueueStopAndPurgeSynchronouslyTableIndex])(WdfDriverGlobals, Queue);
}
#endif // (NTDDI_VERSION >= NTDDI_WIN2K)
WDF_EXTERN_C_END
#endif // _WDFIO_H_