18a978a17SVictor Perevertkin /*++ 28a978a17SVictor Perevertkin 38a978a17SVictor Perevertkin Copyright (c) Microsoft. All rights reserved. 48a978a17SVictor Perevertkin 58a978a17SVictor Perevertkin Module Name: 68a978a17SVictor Perevertkin 78a978a17SVictor Perevertkin FxRequestBuffer.hpp 88a978a17SVictor Perevertkin 98a978a17SVictor Perevertkin Abstract: 108a978a17SVictor Perevertkin 118a978a17SVictor Perevertkin Author: 128a978a17SVictor Perevertkin 138a978a17SVictor Perevertkin 148a978a17SVictor Perevertkin 158a978a17SVictor Perevertkin Environment: 168a978a17SVictor Perevertkin 178a978a17SVictor Perevertkin Both kernel and user mode 188a978a17SVictor Perevertkin 198a978a17SVictor Perevertkin Revision History: 208a978a17SVictor Perevertkin 218a978a17SVictor Perevertkin --*/ 228a978a17SVictor Perevertkin 238a978a17SVictor Perevertkin #ifndef _FXREQUESTBUFFER_H_ 248a978a17SVictor Perevertkin #define _FXREQUESTBUFFER_H_ 258a978a17SVictor Perevertkin 268a978a17SVictor Perevertkin enum FxRequestBufferType { 278a978a17SVictor Perevertkin FxRequestBufferUnspecified, 288a978a17SVictor Perevertkin FxRequestBufferMemory, // framework managed memory 298a978a17SVictor Perevertkin FxRequestBufferMdl, // raw MDL 308a978a17SVictor Perevertkin FxRequestBufferBuffer, // raw PVOID 318a978a17SVictor Perevertkin FxRequestBufferReferencedMdl, // MDL belonging to a FxMemoryObject 328a978a17SVictor Perevertkin }; 338a978a17SVictor Perevertkin 348a978a17SVictor Perevertkin enum FxValidateMemoryDescriptorFlags { 358a978a17SVictor Perevertkin MemoryDescriptorNullAllowed = 0x1, 368a978a17SVictor Perevertkin MemoryDescriptorNoBufferAllowed = 0x2, 378a978a17SVictor Perevertkin }; 388a978a17SVictor Perevertkin 398a978a17SVictor Perevertkin struct FxRequestBuffer { 408a978a17SVictor Perevertkin public: 418a978a17SVictor Perevertkin FxRequestBuffer(VOID); 428a978a17SVictor Perevertkin 438a978a17SVictor Perevertkin NTSTATUS 448a978a17SVictor Perevertkin ValidateMemoryDescriptor( 458a978a17SVictor Perevertkin __in PFX_DRIVER_GLOBALS FxDriverGlobals, 468a978a17SVictor Perevertkin __in PWDF_MEMORY_DESCRIPTOR Descriptor, 478a978a17SVictor Perevertkin __in ULONG Flags = 0x0 488a978a17SVictor Perevertkin ); 498a978a17SVictor Perevertkin 508a978a17SVictor Perevertkin VOID 518a978a17SVictor Perevertkin SetMemory( 528a978a17SVictor Perevertkin __in IFxMemory* Memory, 538a978a17SVictor Perevertkin __in PWDFMEMORY_OFFSET Offsets 548a978a17SVictor Perevertkin ); 558a978a17SVictor Perevertkin 568a978a17SVictor Perevertkin VOID 578a978a17SVictor Perevertkin SetMdl( 588a978a17SVictor Perevertkin __in PMDL Mdl, 598a978a17SVictor Perevertkin __in ULONG Length 608a978a17SVictor Perevertkin ); 618a978a17SVictor Perevertkin 628a978a17SVictor Perevertkin __inline 638a978a17SVictor Perevertkin VOID SetBufferFxRequestBuffer648a978a17SVictor Perevertkin SetBuffer( 658a978a17SVictor Perevertkin __in PVOID Buffer, 668a978a17SVictor Perevertkin __in ULONG Length 678a978a17SVictor Perevertkin ) 688a978a17SVictor Perevertkin { 698a978a17SVictor Perevertkin DataType = FxRequestBufferBuffer; 708a978a17SVictor Perevertkin u.Buffer.Buffer = Buffer; 718a978a17SVictor Perevertkin u.Buffer.Length = Length; 728a978a17SVictor Perevertkin } 738a978a17SVictor Perevertkin 748a978a17SVictor Perevertkin __inline 758a978a17SVictor Perevertkin BOOLEAN HasMdlFxRequestBuffer768a978a17SVictor Perevertkin HasMdl( 778a978a17SVictor Perevertkin VOID 788a978a17SVictor Perevertkin ) 798a978a17SVictor Perevertkin { 808a978a17SVictor Perevertkin return (DataType == FxRequestBufferMdl || 818a978a17SVictor Perevertkin DataType == FxRequestBufferReferencedMdl) ? TRUE : FALSE; 828a978a17SVictor Perevertkin } 838a978a17SVictor Perevertkin 848a978a17SVictor Perevertkin ULONG 858a978a17SVictor Perevertkin GetBufferLength( 868a978a17SVictor Perevertkin VOID 878a978a17SVictor Perevertkin ); 888a978a17SVictor Perevertkin 898a978a17SVictor Perevertkin _Must_inspect_result_ 908a978a17SVictor Perevertkin NTSTATUS 918a978a17SVictor Perevertkin GetBuffer( 928a978a17SVictor Perevertkin __deref_out PVOID* Buffer 938a978a17SVictor Perevertkin ); 948a978a17SVictor Perevertkin 958a978a17SVictor Perevertkin _Must_inspect_result_ 968a978a17SVictor Perevertkin NTSTATUS 978a978a17SVictor Perevertkin GetOrAllocateMdl( 988a978a17SVictor Perevertkin __in PFX_DRIVER_GLOBALS FxDriverGlobals, 998a978a17SVictor Perevertkin __deref_out_opt PMDL* Mdl, 1008a978a17SVictor Perevertkin __inout PMDL* MdlToFree, 1018a978a17SVictor Perevertkin __inout PBOOLEAN UnlockWhenFreed, 1028a978a17SVictor Perevertkin __in LOCK_OPERATION Operation, 1038a978a17SVictor Perevertkin __in BOOLEAN ReuseMdl = FALSE, 1048a978a17SVictor Perevertkin __inout_opt size_t* SizeOfMdl = NULL 1058a978a17SVictor Perevertkin ); 1068a978a17SVictor Perevertkin 1078a978a17SVictor Perevertkin NTSTATUS 1088a978a17SVictor Perevertkin GetOrAllocateMdlWorker( 1098a978a17SVictor Perevertkin __in PFX_DRIVER_GLOBALS FxDriverGlobals, 1108a978a17SVictor Perevertkin __deref_out PMDL* Mdl, 1118a978a17SVictor Perevertkin __in BOOLEAN * ReuseMdl, 1128a978a17SVictor Perevertkin __in LONG Length, 1138a978a17SVictor Perevertkin __in PVOID Buffer, 1148a978a17SVictor Perevertkin __inout size_t* SizeOfMdl, 1158a978a17SVictor Perevertkin __in BOOLEAN UnlockWhenFreed, 1168a978a17SVictor Perevertkin __deref_out_opt PMDL* MdlToFree 1178a978a17SVictor Perevertkin ); 1188a978a17SVictor Perevertkin 1198a978a17SVictor Perevertkin VOID 1208a978a17SVictor Perevertkin AssignValues( 1218a978a17SVictor Perevertkin __deref_out_opt PVOID* PPBuffer, 1228a978a17SVictor Perevertkin __deref_out_opt PMDL* PPMdl, 1238a978a17SVictor Perevertkin __out PULONG BufferLength 1248a978a17SVictor Perevertkin ); 1258a978a17SVictor Perevertkin 1268a978a17SVictor Perevertkin public: 1278a978a17SVictor Perevertkin FxRequestBufferType DataType; 1288a978a17SVictor Perevertkin 1298a978a17SVictor Perevertkin union { 1308a978a17SVictor Perevertkin struct { 1318a978a17SVictor Perevertkin IFxMemory* Memory; 1328a978a17SVictor Perevertkin PWDFMEMORY_OFFSET Offsets; 1338a978a17SVictor Perevertkin } Memory; 1348a978a17SVictor Perevertkin struct { 1358a978a17SVictor Perevertkin PMDL Mdl; 1368a978a17SVictor Perevertkin ULONG Length; 1378a978a17SVictor Perevertkin } Mdl; 1388a978a17SVictor Perevertkin struct { 1398a978a17SVictor Perevertkin PVOID Buffer; 1408a978a17SVictor Perevertkin ULONG Length; 1418a978a17SVictor Perevertkin } Buffer; 1428a978a17SVictor Perevertkin struct { 1438a978a17SVictor Perevertkin IFxMemory* Memory; 1448a978a17SVictor Perevertkin PWDFMEMORY_OFFSET Offsets; 1458a978a17SVictor Perevertkin PMDL Mdl; 1468a978a17SVictor Perevertkin } RefMdl; 1478a978a17SVictor Perevertkin } u; 1488a978a17SVictor Perevertkin }; 1498a978a17SVictor Perevertkin 1508a978a17SVictor Perevertkin #if ((FX_CORE_MODE)==(FX_CORE_KERNEL_MODE)) 151*1f377076SVictor Perevertkin #include "fxrequestbufferkm.hpp" 152*1f377076SVictor Perevertkin #elif ((FX_CORE_MODE)==(FX_CORE_USER_MODE)) 153*1f377076SVictor Perevertkin #include "fxrequestbufferum.hpp" 1548a978a17SVictor Perevertkin #endif 1558a978a17SVictor Perevertkin 1568a978a17SVictor Perevertkin 1578a978a17SVictor Perevertkin #endif // _FXREQUESTBUFFER_H_ 158