1 /*++
2
3 Copyright (c) Microsoft Corporation
4
5 Module Name:
6
7 FxRequestContext.cpp
8
9 Abstract:
10
11 This module implements FxRequest object
12
13 Author:
14
15
16
17 Environment:
18
19 Both kernel and user mode
20
21 Revision History:
22
23
24
25 --*/
26
27 #include "coreprivshared.hpp"
28
29 // Tracing support
30 extern "C" {
31 // #include "FxRequestContext.tmh"
32 }
33
FxRequestContext(__in FX_REQUEST_CONTEXT_TYPE Type)34 FxRequestContext::FxRequestContext(
35 __in FX_REQUEST_CONTEXT_TYPE Type
36 ) :
37 m_RequestType(Type),
38 m_RequestMemory(NULL)
39
40 /*++
41
42 Routine Description:
43 Constructs an FxRequestContext and initialized the m_RequestType field
44
45 Arguments:
46 Type - The type of this request.
47
48
49
50
51
52 Return Value:
53 None.
54
55 --*/
56 {
57 InitCompletionParams();
58 }
59
~FxRequestContext()60 FxRequestContext::~FxRequestContext()
61 /*++
62
63 Routine Description:
64 Destruct for an FxRequestContext. Releases all outstanding references.
65
66 Arguments:
67 None
68
69 Return Value:
70 None
71
72 --*/
73 {
74 ASSERT(m_RequestMemory == NULL);
75 }
76
77 VOID
StoreAndReferenceMemory(__in FxRequestBuffer * Buffer)78 FxRequestContext::StoreAndReferenceMemory(
79 __in FxRequestBuffer* Buffer
80 )
81 {
82 _StoreAndReferenceMemoryWorker(this, &m_RequestMemory, Buffer);
83 }
84
85 VOID
ReleaseAndRestore(__in FxRequestBase * Request)86 FxRequestContext::ReleaseAndRestore(
87 __in FxRequestBase* Request
88 )
89 /*++
90
91 Routine Description:
92 This routine releases any outstanding references taken on the previous
93 format call and restores any fields in the PIRP that were overwritten
94 when the formatting occurred.
95
96 Arguments:
97 Irp
98
99 Return Value:
100
101
102 --*/
103
104 {
105 #if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
106 Request->FreeMdls();
107 #else
108 UNREFERENCED_PARAMETER(Request);
109 #endif
110
111 if (m_RequestMemory != NULL) {
112 m_RequestMemory->RELEASE(this);
113 m_RequestMemory = NULL;
114 }
115
116 InitCompletionParams();
117 }
118
119 VOID
_StoreAndReferenceMemoryWorker(__in PVOID Tag,__deref_out_opt IFxMemory ** PPMemory,__in FxRequestBuffer * Buffer)120 FxRequestContext::_StoreAndReferenceMemoryWorker(
121 __in PVOID Tag,
122 __deref_out_opt IFxMemory** PPMemory,
123 __in FxRequestBuffer* Buffer
124 )
125 {
126 ASSERT(*PPMemory == NULL);
127
128 switch (Buffer->DataType) {
129 case FxRequestBufferMemory:
130 Buffer->u.Memory.Memory->ADDREF(Tag);
131 *PPMemory = Buffer->u.Memory.Memory;
132 break;
133
134 case FxRequestBufferReferencedMdl:
135 Buffer->u.RefMdl.Memory->ADDREF(Tag);
136 *PPMemory = Buffer->u.RefMdl.Memory;
137 break;
138
139 default:
140 *PPMemory = NULL;
141 }
142 }
143
144 VOID
FormatWriteParams(__in_opt IFxMemory * WriteMemory,__in_opt PWDFMEMORY_OFFSET WriteOffsets)145 FxRequestContext::FormatWriteParams(
146 __in_opt IFxMemory* WriteMemory,
147 __in_opt PWDFMEMORY_OFFSET WriteOffsets
148 )
149 {
150 m_CompletionParams.Type = WdfRequestTypeWrite;
151
152 if (WriteMemory != NULL) {
153 m_CompletionParams.Parameters.Write.Buffer = WriteMemory->GetHandle();
154 }
155
156 if (WriteOffsets != NULL) {
157 m_CompletionParams.Parameters.Write.Offset =
158 WriteOffsets->BufferOffset;
159 }
160 else {
161 m_CompletionParams.Parameters.Write.Offset = 0;
162 }
163 }
164
165 VOID
FormatReadParams(__in_opt IFxMemory * ReadMemory,__in_opt PWDFMEMORY_OFFSET ReadOffsets)166 FxRequestContext::FormatReadParams(
167 __in_opt IFxMemory* ReadMemory,
168 __in_opt PWDFMEMORY_OFFSET ReadOffsets
169 )
170 {
171 m_CompletionParams.Type = WdfRequestTypeRead;
172
173 if (ReadMemory != NULL) {
174 m_CompletionParams.Parameters.Read.Buffer = ReadMemory->GetHandle();
175 }
176
177 if (ReadOffsets != NULL) {
178 m_CompletionParams.Parameters.Read.Offset =
179 ReadOffsets->BufferOffset;
180 }
181 else {
182 m_CompletionParams.Parameters.Read.Offset = 0;
183 }
184 }
185
186 VOID
FormatOtherParams(__in FxInternalIoctlParams * InternalIoctlParams)187 FxRequestContext::FormatOtherParams(
188 __in FxInternalIoctlParams *InternalIoctlParams
189 )
190 {
191 m_CompletionParams.Type = WdfRequestTypeOther;
192 m_CompletionParams.Parameters.Others.Argument1.Ptr = InternalIoctlParams->Argument1;
193 m_CompletionParams.Parameters.Others.Argument2.Ptr = InternalIoctlParams->Argument2;
194 m_CompletionParams.Parameters.Others.Argument4.Ptr = InternalIoctlParams->Argument4;
195 }
196