Something went wrong. Try again.
Reactos
Something went wrong. Try again.
C++
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309/*++
Copyright (c) Microsoft Corporation
Module Name:
FxCommonBufferAPI.cpp
Abstract:
Base for WDF CommonBuffer APIs
Environment:
Kernel mode only.
Notes:
Revision History:
--*/
#include "fxdmapch.hpp"
extern "C" {// #include "FxCommonBufferAPI.tmh"}
//// Extern "C" the entire file//extern "C" {
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfCommonBufferCreate)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFDMAENABLER DmaEnabler, __in __drv_when(Length == 0, __drv_reportError(Length cannot be zero)) size_t Length, __in_opt WDF_OBJECT_ATTRIBUTES * Attributes, __out WDFCOMMONBUFFER * CommonBufferHandle ){ FxCommonBuffer * pComBuf; FxDmaEnabler * pDmaEnabler; NTSTATUS status; WDFOBJECT handle; PFX_DRIVER_GLOBALS pFxDriverGlobals;
// // Get validate DmaEnabler handle // FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), DmaEnabler, FX_TYPE_DMA_ENABLER, (PVOID *) &pDmaEnabler, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, CommonBufferHandle);
*CommonBufferHandle = NULL;
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
// // Basic parameter validation // if (Length == 0) { status = STATUS_INVALID_PARAMETER; DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDMA, "Length is 0, %!STATUS!", status); return status; }
status = FxValidateObjectAttributes(pFxDriverGlobals, Attributes, FX_VALIDATE_OPTION_PARENT_NOT_ALLOWED ); if (!NT_SUCCESS(status)) { return status; }
// // Create a new CommonBuffer object // pComBuf = new(pFxDriverGlobals, Attributes) FxCommonBuffer(pFxDriverGlobals, pDmaEnabler);
if (pComBuf == NULL) { status = STATUS_INSUFFICIENT_RESOURCES;
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDMA, "Could not allocate memory for a WDFCOMMONBUFFER, " "%!STATUS!", status); return status; }
// // Assign this FxCommonBuffer to its parent FxDmaEnabler object. // status = pComBuf->Commit(Attributes, (WDFOBJECT*)&handle, pDmaEnabler);
if (NT_SUCCESS(status)) { // // Ok: now allocate a CommonBuffer via this DmaEnabler // status = pComBuf->AllocateCommonBuffer( Length ); }
if (NT_SUCCESS(status)) { // // Only return a valid handle on success. // *CommonBufferHandle = (WDFCOMMONBUFFER) handle; } else { pComBuf->DeleteFromFailedCreate(); }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfCommonBufferCreateWithConfig)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFDMAENABLER DmaEnabler, __in __drv_when(Length == 0, __drv_reportError(Length cannot be zero)) size_t Length, __in PWDF_COMMON_BUFFER_CONFIG Config, __in_opt WDF_OBJECT_ATTRIBUTES * Attributes, __out WDFCOMMONBUFFER * CommonBufferHandle ){ FxCommonBuffer * pComBuf; FxDmaEnabler * pDmaEnabler; NTSTATUS status; WDFOBJECT handle; PFX_DRIVER_GLOBALS pFxDriverGlobals;
// // Get validate DmaEnabler handle // FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), DmaEnabler, FX_TYPE_DMA_ENABLER, (PVOID *) &pDmaEnabler, &pFxDriverGlobals);
// // Basic parameter validation // FxPointerNotNull(pFxDriverGlobals, Config);
if (Config->Size != sizeof(WDF_COMMON_BUFFER_CONFIG)) { status = STATUS_INFO_LENGTH_MISMATCH;
DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDMA, "WDF_COMMON_BUFFER_CONFIG Size 0x%x, expected 0x%x, %!STATUS!", Config->Size, sizeof(WDF_COMMON_BUFFER_CONFIG), status);
return status; }
FxPointerNotNull(pFxDriverGlobals, CommonBufferHandle);
*CommonBufferHandle = NULL;
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
if (Length == 0) { status = STATUS_INVALID_PARAMETER; DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDMA, "Length is 0, %!STATUS!", status); return status; }
status = FxValidateObjectAttributes(pFxDriverGlobals, Attributes, FX_VALIDATE_OPTION_PARENT_NOT_ALLOWED ); if (!NT_SUCCESS(status)) { return status; }
pComBuf = new(pFxDriverGlobals, Attributes) FxCommonBuffer(pFxDriverGlobals, pDmaEnabler);
if (pComBuf == NULL) { status = STATUS_INSUFFICIENT_RESOURCES;
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGDMA, "Could not allocate memory for a WDFCOMMONBUFFER, " "%!STATUS!", status); return status; }
// // Assign this FxCommonBuffer to its parent FxDmaEnabler object. // status = pComBuf->Commit(Attributes, (WDFOBJECT*)&handle, pDmaEnabler);
if (NT_SUCCESS(status)) { // // Set the alignment value before calling AllocateCommonBuffer. // pComBuf->SetAlignment(Config->AlignmentRequirement); status = pComBuf->AllocateCommonBuffer( Length ); }
if (NT_SUCCESS(status)) { // // Only return a valid handle on success. // *CommonBufferHandle = (WDFCOMMONBUFFER) handle; } else { pComBuf->DeleteFromFailedCreate(); }
return status;}
__drv_maxIRQL(DISPATCH_LEVEL)PVOIDNTAPIWDFEXPORT(WdfCommonBufferGetAlignedVirtualAddress)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCOMMONBUFFER CommonBuffer ){ FxCommonBuffer * pComBuf;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), CommonBuffer, FX_TYPE_COMMON_BUFFER, (PVOID *) &pComBuf);
return pComBuf->GetAlignedVirtualAddress();}
__drv_maxIRQL(DISPATCH_LEVEL)PHYSICAL_ADDRESSNTAPIWDFEXPORT(WdfCommonBufferGetAlignedLogicalAddress)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCOMMONBUFFER CommonBuffer ){ FxCommonBuffer * pComBuf;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), CommonBuffer, FX_TYPE_COMMON_BUFFER, (PVOID *) &pComBuf);
return pComBuf->GetAlignedLogicalAddress();}
__drv_maxIRQL(DISPATCH_LEVEL)size_tNTAPIWDFEXPORT(WdfCommonBufferGetLength)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFCOMMONBUFFER CommonBuffer ){ FxCommonBuffer * pComBuf;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), CommonBuffer, FX_TYPE_COMMON_BUFFER, (PVOID *) &pComBuf);
return pComBuf->GetLength();}
} // extern "C"