1 //
2 //    Copyright (C) Microsoft.  All rights reserved.
3 //
4 /*++
5 
6 Module Name:
7 
8     IFxMemory.hpp
9 
10 Abstract:
11 
12     Abstract base class for a memory object.  It is necessary to split the
13     memory interface away from an FxObject derived base class so that we can
14     hand out WDFMEMORY handles that are embedded within other FxObject derived
15     classes without having to embed another FxObject derived class within the
16     parent.
17 
18 Author:
19 
20 
21 
22 Environment:
23 
24     Both kernel and user mode
25 
26 Revision History:
27 
28 --*/
29 
30 #ifndef __IFX_MEMORY_HPP__
31 #define __IFX_MEMORY_HPP__
32 
33 // begin_wpp enum
34 enum IFxMemoryFlags {
35     IFxMemoryFlagReadOnly = 0x0001,
36 };
37 // end_wpp
38 
39 
40 class IFxMemory {
41 public:
42     virtual
43     PVOID
44     GetBuffer(
45         VOID
46         ) =0;
47 
48     virtual
49     size_t
50     GetBufferSize(
51         VOID
52         ) =0;
53 
54     virtual
55     PMDL
56     GetMdl(
57         VOID
58         ) =0;
59 
60     virtual
61     WDFMEMORY
62     GetHandle(
63         VOID
64         ) =0;
65 
66     //
67     // Value returned is a bit field from the enum IFxMemoryFlags
68     //
69     virtual
70     USHORT
71     GetFlags(
72         VOID
73         ) =0;
74 
75     virtual
76     PFX_DRIVER_GLOBALS
77     GetDriverGlobals(
78         VOID
79         ) =0;
80 
81     virtual
82     ULONG
83     AddRef(
84         __in PVOID Tag,
85         __in LONG Line,
86         __in_opt PSTR File
87         ) =0;
88 
89     virtual
90     ULONG
91     Release(
92         __in PVOID Tag,
93         __in LONG Line,
94         __in_opt PSTR File
95         ) =0;
96 
97     virtual
98     VOID
99     Delete(
100         VOID
101         ) =0;
102 
103     _Must_inspect_result_
104     NTSTATUS
105     ValidateMemoryOffsets(
106         __in_opt PWDFMEMORY_OFFSET Offsets
107         )
108     {
109         NTSTATUS status;
110         size_t total;
111 
112         if (Offsets == NULL) {
113             return STATUS_SUCCESS;
114         }
115 
116         status = RtlSizeTAdd(Offsets->BufferLength, Offsets->BufferOffset, &total);
117 
118         if (!NT_SUCCESS(status)) {
119             return status;
120         }
121 
122         if (total > GetBufferSize()) {
123             return STATUS_INTEGER_OVERFLOW;
124         }
125 
126         return STATUS_SUCCESS;
127     }
128 
129     _Must_inspect_result_
130     NTSTATUS
131     CopyFromPtr(
132         __in_opt PWDFMEMORY_OFFSET DestinationOffsets,
133         __in_bcount(SourceBufferLength) PVOID SourceBuffer,
134         __in size_t SourceBufferLength,
135         __in_opt PWDFMEMORY_OFFSET SourceOffsets
136         );
137 
138     _Must_inspect_result_
139     NTSTATUS
140     CopyToPtr(
141         __in_opt PWDFMEMORY_OFFSET SourceOffsets,
142         __out_bcount(DestinationBufferLength) PVOID DestinationBuffer,
143         __in size_t DestinationBufferLength,
144         __in_opt PWDFMEMORY_OFFSET DestinationOffsets
145         );
146 
147 protected:
148     static
149     _Must_inspect_result_
150     NTSTATUS
151     _CopyPtrToPtr(
152         __in_bcount(SourceBufferLength)  PVOID SourceBuffer,
153         __in size_t SourceBufferLength,
154         __in_opt PWDFMEMORY_OFFSET SourceOffsets,
155         __out_bcount(DestinationBufferLength) PVOID DestinationBuffer,
156         __in size_t DestinationBufferLength,
157         __in_opt PWDFMEMORY_OFFSET DestinationOffsets
158         );
159 };
160 
161 #endif // __IFX_MEMORY_HPP__
162