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