diff options
| author | Dave Wilson <[email protected]> | 2015-04-29 09:48:49 -0700 |
|---|---|---|
| committer | Dave Wilson <[email protected]> | 2015-04-29 10:47:29 -0700 |
| commit | d40232638faaab19de557e70a3ee938da7a35295 (patch) | |
| tree | 14e61c973745949af186b7940e3a53d25322f5de /storage/ramdisk/src/forward_progress.c | |
| parent | 02e5b090a6131a7cc1b90f4a9373117c9e3c7088 (diff) | |
samples update for //build
Diffstat (limited to 'storage/ramdisk/src/forward_progress.c')
| -rw-r--r-- | storage/ramdisk/src/forward_progress.c | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/storage/ramdisk/src/forward_progress.c b/storage/ramdisk/src/forward_progress.c new file mode 100644 index 00000000..a7c29c7a --- /dev/null +++ b/storage/ramdisk/src/forward_progress.c @@ -0,0 +1,347 @@ + +/*++ + +Copyright (c) 1990-2000 Microsoft Corporation + +Module Name: + + forwardprogress.c + +Abstract: + + Show the forward progress feature + + + +--*/ + +// +// NOTE: Forward progress was added in v1.9 +// + +#if KMDF_VERSION_MINOR >= 9 + +#include "ramdisk.h" + +VOID +EvtForwardProgressRequestDestroy( + WDFOBJECT Request + ) + +/*++ + +Routine Description: + + This event is called when the request memory is about to be freed. + Reserved requests get deleted only when the queue gets deleted. + + +Arguments: + + Request - Handle to a framework request object. + + +Return Value: + + VOID + +--*/ +{ + PFWD_PROGRESS_REQUEST_CONTEXT fwdReqContext; + + fwdReqContext = GetForwardProgressRequestContext(Request); +} + +VOID +EvtForwardProgressRequestCleanup( + WDFOBJECT Request + ) + +/*++ + +Routine Description: + + This event is called when the reserved request is about to be deleted. + NOTE: In case of reserved request this callback doesn't get called after the + I/O is done but only when the request is about to be deleted. + +Arguments: + + Request - Handle to a framework request object. + + +Return Value: + + VOID + +--*/ +{ + PFWD_PROGRESS_REQUEST_CONTEXT reqContext; + + reqContext = GetForwardProgressRequestContext(Request); + + // + // Cleanup any resources allocated earlier for reserved requests here. + // +} + + +NTSTATUS +AllocateAdditionalRequestContext( + _In_ WDFREQUEST Request + ) + +/*++ + +Routine Description: + Allocate resources used by request. + Set the EvtCleanupCallback and EvtDestroyCallback + to show the lifetime of a Reserved request. + +Arguments: + + Request - Handle to a framework request object. + +Return Value: + + + NTSTATUS + +--*/ +{ + WDF_OBJECT_ATTRIBUTES requestContextAttributes; + PFWD_PROGRESS_REQUEST_CONTEXT reqContext; + NTSTATUS status; + + WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&requestContextAttributes, + FWD_PROGRESS_REQUEST_CONTEXT); + requestContextAttributes.EvtCleanupCallback = EvtForwardProgressRequestCleanup; + requestContextAttributes.EvtDestroyCallback = EvtForwardProgressRequestDestroy; + status = WdfObjectAllocateContext(Request, + &requestContextAttributes, + &reqContext); + + return status; +} + + +WDF_IO_FORWARD_PROGRESS_ACTION +EvtIoWdmIrpForForwardProgress( + _In_ WDFQUEUE Queue, + _In_ PIRP Irp + ) + +/*++ + +Routine Description: + A driver's EvtIoWdmIrpForForwardProgress callback function is used for + examining an IRP and tell the framework whether to use a reserved + request object for the IRP or to fail the I/O request by completing + it with an error status value. + +Arguments: + + Queue - Handle to the framework queue object that is associated with the + I/O request. + + Irp - +Return Value: + + WDF_IO_FORWARD_PROGRESS_ACTION + WdfIoForwardProgressActionFailRequest is returned it causes + the Framework to fail the IRP. + WdfIoForwardProgressActionUseReservedRequest is returned it causes + the framework to use a reserved request to handle the IRP. +--*/ +{ + PIO_STACK_LOCATION irpStack; + WDF_IO_FORWARD_PROGRESS_ACTION action; + + UNREFERENCED_PARAMETER(Queue); + + irpStack = IoGetCurrentIrpStackLocation(Irp); + switch (irpStack->MajorFunction) { + case IRP_MJ_READ: + case IRP_MJ_WRITE: + case IRP_MJ_DEVICE_CONTROL: + case IRP_MJ_INTERNAL_DEVICE_CONTROL: + + // + // Use reserved request for reads, writes, IOCTL's + // + action = WdfIoForwardProgressActionUseReservedRequest; + break; + + default: + // + // Just for demonstration of the available actions fail the + // other I/O IRP's + // + action = WdfIoForwardProgressActionFailRequest; + break; + } + + return action; +} + +NTSTATUS +EvtIoAllocateResourcesForReservedRequest( + _In_ WDFQUEUE Queue, + _In_ WDFREQUEST Request + ) + +/*++ + +Routine Description: + + A driver's EvtIoAllocateResourcesForReservedRequest callback function + allocates and stores request-specific resources for request objects that + the framework is reserving for low-memory situations. + + NOTE: You can't call WdfRequestGetIoQueue for Reserved requests + Use the Queue handle passed in. + + +Arguments: + + Queue - Handle to the framework queue object that is associated with the + I/O request. + + Request - Handle to a framework request object. + + +Return Value: + + NTSTATUS + +--*/ +{ + NTSTATUS status; + PFWD_PROGRESS_REQUEST_CONTEXT fwdReqContext; + + UNREFERENCED_PARAMETER(Queue); + + status = STATUS_SUCCESS; + ASSERT(WdfRequestIsReserved(Request)); + + // + // Allocate all resources needed for the request here. If you need to + // pre-allocate memory or any other resource do it in this callback and + // store it in the context. + // + status = AllocateAdditionalRequestContext(Request); + if (NT_SUCCESS(status)) { + + fwdReqContext = GetForwardProgressRequestContext(Request); + } + + return status; +} + +NTSTATUS +EvtIoAllocateResources( + _In_ WDFQUEUE Queue, + _In_ WDFREQUEST Request + ) + +/*++ + +Routine Description: + + This event is called for the driver to allocate request + resources for immediate use (unlike reserved requests which is for use under + low memory). + It is called immediately after the framework has received an IRP and created + a request object for the IRP. + + +Arguments: + + Queue - Handle to the framework queue object that is associated with the + I/O request. + + Request - Handle to a framework request object. + + +Return Value: + + NTSTATUS + +--*/ +{ + NTSTATUS status; + PFWD_PROGRESS_REQUEST_CONTEXT fwdReqContext; + + UNREFERENCED_PARAMETER(Queue); + status = STATUS_SUCCESS; + + // + // Allocate all resources needed for the request here and store it in the request + // context. + // + fwdReqContext = GetForwardProgressRequestContext(Request); + + return status; +} + +NTSTATUS +SetForwardProgressOnQueue( + _In_ WDFQUEUE Queue + ) + +/*++ + +Routine Description: + Set forward progress on the top level( handles one of the major I/O IRP) + queue we created. + The default is always a top level queue or if the queue was configured + with WdfDeviceConfigureRequestDispatching. + +Arguments: + + Queue - Handle to the framework queue object that is associated with the + I/O request. + + +Return Value: + + NTSTATUS + +--*/ +{ + + WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY forwardProgressPolicy; + NTSTATUS status; + + // + // The policy is configurable by the user. In the code segment below + // WdfIoForwardProgressReservedPolicyUseExamine + // is demonstrated. If your driver supports paging I/O you should select + // WdfIoForwardProgressReservedPolicyPagingIO. + // MAX_RESERVED_REQUESTS should be adjusted depending on the number of parallel + // requests the driver wants to handle under low memory conditions. It may + // require some hit and trial to get the right number. + // + WDF_IO_QUEUE_FORWARD_PROGRESS_POLICY_EXAMINE_INIT( + &forwardProgressPolicy, + MAX_RESERVED_REQUESTS, + EvtIoWdmIrpForForwardProgress + ); + + forwardProgressPolicy.EvtIoAllocateResourcesForReservedRequest = + EvtIoAllocateResourcesForReservedRequest; + forwardProgressPolicy.EvtIoAllocateRequestResources = EvtIoAllocateResources; + + status = WdfIoQueueAssignForwardProgressPolicy(Queue, + &forwardProgressPolicy + ); + if (!NT_SUCCESS(status)) { + KdPrint(("Error WdfIoQueueAssignForwardProgressPolicy 0x%x\n",status)); + return status; + } + + return status; +} + +#endif + |
