1 /*++
2 
3 Copyright (c) Microsoft. All rights reserved.
4 
5 Module Name:
6 
7     FxRequestBufferUm.cpp
8 
9 Abstract:
10 
11     This module implements a memory union object
12 
13 Author:
14 
15 
16 
17 Environment:
18 
19     User mode only
20 
21 Revision History:
22 
23 --*/
24 
25 #include "FxSupportPch.hpp"
26 
27 extern "C" {
28 #include "FxRequestBufferUm.tmh"
29 }
30 
31 _Must_inspect_result_
32 NTSTATUS
GetOrAllocateMdl(__in PFX_DRIVER_GLOBALS FxDriverGlobals,__deref_out_opt PMDL * Mdl,__inout PMDL * MdlToFree,__inout PBOOLEAN UnlockWhenFreed,__in LOCK_OPERATION Operation,__in BOOLEAN ReuseMdl,__inout_opt size_t * SizeOfMdl)33 FxRequestBuffer::GetOrAllocateMdl(
34     __in PFX_DRIVER_GLOBALS FxDriverGlobals,
35     __deref_out_opt PMDL*   Mdl,
36     __inout PMDL*           MdlToFree,
37     __inout PBOOLEAN        UnlockWhenFreed,
38     __in LOCK_OPERATION     Operation,
39     __in BOOLEAN            ReuseMdl,
40     __inout_opt size_t*     SizeOfMdl
41     )
42 /*++
43 
44 Routine Description:
45 
46     This function attempts to reuse the passed-in MDL (if any) or allocates
47     a new MDL if reuse flag isn't passed-in or if the existing MDL isn't
48     big enough.
49 
50 Arguments:
51 
52 Return Value:
53     FxDriverGlobals - Driver globals
54 
55     Mdl - on return it contains the MDL allocated/reused
56 
57     MdlToFree - pointer to any MDL
58                   * to be reused, if the size is <= current size, or
59                   * freed and set to newly allocated MDL
60 
61     UnlockWhenFreed - whether to unlock pages when freeing MDL
62                       (if FALSE, MDL may represent just MDL buffer but the pages
63                       might have already been unlocked)
64 
65     Operation - Operation to pass to MmLockPages
66 
67     ReuseMdl - whether to reuse *MdlToFree
68                Please note that this can be FALSE even when MDL is supplied
69 
70     SizeOfMdl - on input contains size of *MdlToFree,
71                 on return contains size of *Mdl
72 
73 Remarks:
74 
75     *MdlToFree is modified only when this function frees the passed in MDL
76     Otherwise it leaves it untouched. Caller is responsible for storing
77     properly initialized value and/or freeing what's stored in the value.
78 
79   --*/
80 {
81     UNREFERENCED_PARAMETER(FxDriverGlobals);
82     UNREFERENCED_PARAMETER(Mdl);
83     UNREFERENCED_PARAMETER(MdlToFree);
84     UNREFERENCED_PARAMETER(UnlockWhenFreed);
85     UNREFERENCED_PARAMETER(Operation);
86     UNREFERENCED_PARAMETER(ReuseMdl);
87     UNREFERENCED_PARAMETER(SizeOfMdl);
88 
89     UfxVerifierTrapNotImpl();
90     return STATUS_NOT_IMPLEMENTED;
91 }
92 
93 VOID
SetMemory(__in IFxMemory * Memory,__in PWDFMEMORY_OFFSET Offsets)94 FxRequestBuffer::SetMemory(
95     __in IFxMemory* Memory,
96     __in PWDFMEMORY_OFFSET Offsets
97     )
98 {
99     DataType = FxRequestBufferMemory;
100     u.Memory.Memory = Memory;
101     u.Memory.Offsets = Offsets;
102 }
103 
104