1 /*++
2 
3 Copyright (c) Microsoft Corporation.  All rights reserved.
4 
5 Module Name:
6 
7     vfpriv.hpp
8 
9 Abstract:
10 
11     common header file for verifier
12 
13 Author:
14 
15 
16 
17 Environment:
18 
19     kernel mode only
20 
21 Revision History:
22 
23 --*/
24 
25 #pragma once
26 extern "C" {
27 #include <ntddk.h>
28 }
29 
30 #include "fx.hpp"
31 
32 extern "C" {
33 
34 __inline
35 VOID
36 VerifyIrqlEntry(
37     __out KIRQL *Irql
38     )
39 {
40     *Irql = KeGetCurrentIrql();
41 }
42 
43 __inline
44 VOID
45 VerifyIrqlExit(
46     __in PWDF_DRIVER_GLOBALS DriverGlobals,
47     __in KIRQL PrevIrql
48     )
49 {
50     KIRQL currIrql;
51 
52     currIrql = KeGetCurrentIrql();
53     if (PrevIrql != currIrql) {
54         KdPrint(("WDF VERIFIER: Irql at entry of event is not same as at exit.\n"));
55         FxVerifierBugCheck(GetFxDriverGlobals(DriverGlobals),
56                            WDF_VERIFIER_IRQL_MISMATCH,
57                            PrevIrql,
58                            currIrql
59                            );
60     }
61 }
62 
63 __inline
64 VOID
65 VerifyCriticalRegionEntry(
66     __out BOOLEAN *CritRegion
67     )
68 {
69     if (KeGetCurrentIrql() <= APC_LEVEL) {
70         *CritRegion = KeAreApcsDisabled();
71     }
72 }
73 
74 __inline
75 VOID
76 VerifyCriticalRegionExit(
77     __in PWDF_DRIVER_GLOBALS DriverGlobals,
78     __in BOOLEAN OldCritRegion,
79     __in PVOID Pfn
80     )
81 {
82     if (KeGetCurrentIrql() <= APC_LEVEL) {
83         if (OldCritRegion != KeAreApcsDisabled()) {
84             KdPrint(("WDF VERIFIER: Critical section entry and exit around event callback incorrect\n"));
85             FxVerifierBugCheck(GetFxDriverGlobals(DriverGlobals),
86                                WDF_VERIFIER_CRITICAL_REGION_MISMATCH,
87                                (ULONG_PTR)Pfn,
88                                0
89                                );
90         }
91     }
92 }
93 } // extern "C"
94 
95 FORCEINLINE
96 VOID
97 PerformanceAnalysisIOProcess(
98     __in PFX_DRIVER_GLOBALS pFxDriverGlobals,
99     __in WDFREQUEST Handle,
100     __out FxRequest** ppReq,
101     __inout GUID* pActivityId
102     )
103 {
104 
105     FxObjectHandleGetPtr(pFxDriverGlobals,
106                          Handle,
107                          FX_TYPE_REQUEST,
108                          (PVOID *) ppReq);
109 
110     if (IoGetActivityIdIrp((*ppReq)->GetFxIrp()->GetIrp(), pActivityId) == STATUS_NOT_FOUND)
111     {
112         EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
113         IoSetActivityIdIrp((*ppReq)->GetFxIrp()->GetIrp(), pActivityId);
114     }
115 }
116 
117 FORCEINLINE
118 BOOLEAN
119 PerfIoStart(
120     __in WDFREQUEST Handle
121 )
122 {
123     FxRequest* pReq;
124     GUID activityId = { 0 };
125     WDFOBJECT_OFFSET offset = 0;
126 
127     FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
128     PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
129     BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
130 
131     if(status)
132     {
133         PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
134         PerformanceAnalysisIOProcess(pFxDriverGlobals, Handle, &pReq,
135                 &activityId);
136 
137         EventWriteFX_REQUEST_START(&activityId, pReq->GetFxIrp()->GetMajorFunction(),
138                     pDriverDeviceAdd, pReq->GetCurrentQueue()->GetDevice()->GetHandle());
139     }
140     return status;
141 }
142 
143 FORCEINLINE
144 BOOLEAN
145 PerfIoComplete(
146     __in WDFREQUEST Handle
147 )
148 {
149     FxRequest* pReq;
150     GUID activityId = { 0 };
151     WDFOBJECT_OFFSET offset = 0;
152 
153     FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
154     PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
155     BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
156 
157     if(status)
158     {
159         PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
160         PerformanceAnalysisIOProcess(pFxDriverGlobals, Handle, &pReq,
161                 &activityId);
162 
163         EventWriteFX_REQUEST_COMPLETE(&activityId, pReq->GetFxIrp()->GetMajorFunction(),
164                     pDriverDeviceAdd, pReq->GetCurrentQueue()->GetDevice()->GetHandle());
165     }
166     return status;
167 }
168 
169 FORCEINLINE
170 PFN_WDF_DRIVER_DEVICE_ADD
171 PerformanceGetDriverDeviceAdd(
172     __in WDFOBJECT Handle
173 )
174 {
175     WDFOBJECT_OFFSET offset = 0;
176     FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
177     PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
178 
179     return pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
180 }
181 
182 __inline
183 BOOLEAN
184 PerfEvtDeviceD0EntryStart(
185     __in WDFDEVICE Handle,
186     __inout GUID* pActivityId
187 )
188 {
189     WDFOBJECT_OFFSET offset = 0;
190     FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
191     PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
192     BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
193 
194     if(status) {
195         PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
196         EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
197         EventWriteFX_POWER_D0_ENTRY_START(pActivityId, pDriverDeviceAdd, Handle);
198     }
199 
200     return status;
201 }
202 
203 __inline
204 VOID
205 PerfEvtDeviceD0EntryStop(
206     __in WDFDEVICE Handle,
207     __in GUID* pActivityId
208 )
209 {
210     EventWriteFX_POWER_D0_ENTRY_STOP(pActivityId, PerformanceGetDriverDeviceAdd(Handle), Handle);
211 }
212 
213 __inline
214 BOOLEAN
215 PerfEvtDeviceD0ExitStart(
216     __in WDFDEVICE Handle,
217     __inout GUID* pActivityId
218 )
219 {
220     WDFOBJECT_OFFSET offset = 0;
221     FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
222     PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
223     BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
224 
225     if(status) {
226         PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
227         EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
228         EventWriteFX_POWER_D0_EXIT_START(pActivityId, pDriverDeviceAdd, Handle);
229     }
230     return status;
231 }
232 
233 __inline
234 VOID
235 PerfEvtDeviceD0ExitStop(
236     __in WDFDEVICE Handle,
237     __in GUID* pActivityId
238 )
239 {
240     EventWriteFX_POWER_D0_EXIT_STOP(pActivityId, PerformanceGetDriverDeviceAdd(Handle), Handle);
241 }
242 
243 __inline
244 BOOLEAN
245 PerfEvtDevicePrepareHardwareStart(
246     __in WDFDEVICE Handle,
247     __inout GUID* pActivityId
248 )
249 {
250 
251     WDFOBJECT_OFFSET offset = 0;
252     FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
253     PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
254     BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
255 
256     if(status) {
257         PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
258         EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
259         EventWriteFX_POWER_HW_PREPARE_START(pActivityId, pDriverDeviceAdd, Handle);
260     }
261     return status;
262 }
263 
264 __inline
265 VOID
266 PerfEvtDevicePrepareHardwareStop(
267     __in WDFDEVICE Handle,
268     __in GUID* pActivityId
269 )
270 {
271     EventWriteFX_POWER_HW_PREPARE_STOP(pActivityId, PerformanceGetDriverDeviceAdd(Handle), Handle);
272 }
273 
274 __inline
275 BOOLEAN
276 PerfEvtDeviceReleaseHardwareStart(
277     __in WDFDEVICE Handle,
278     __inout GUID* pActivityId
279 )
280 {
281     WDFOBJECT_OFFSET offset = 0;
282     FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
283     PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
284     BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
285 
286     if(status) {
287         PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
288         EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
289         EventWriteFX_POWER_HW_RELEASE_START(pActivityId, pDriverDeviceAdd, Handle);
290     }
291     return status;
292 }
293 
294 __inline
295 VOID
296 PerfEvtDeviceReleaseHardwareStop(
297     __in WDFDEVICE Handle,
298     __in GUID* pActivityId
299 )
300 {
301     EventWriteFX_POWER_HW_RELEASE_STOP(pActivityId, PerformanceGetDriverDeviceAdd(Handle), Handle);
302 }
303 
304 // EvtIoStop callback started.
305 __inline
306 BOOLEAN
307 PerfEvtIoStopStart(
308     __in WDFQUEUE Queue,
309     __inout GUID* pActivityId
310 )
311 {
312     WDFOBJECT_OFFSET offset = 0;
313     WDFDEVICE device;
314     FxIoQueue* pQueue;
315     PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd;
316 
317     FxObject *pObject = FxObject::_GetObjectFromHandle(Queue, &offset);
318     PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
319     BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
320 
321     if(status) {
322         FxObjectHandleGetPtr(pFxDriverGlobals,
323                           Queue,
324                           FX_TYPE_QUEUE,
325                           (PVOID*) &pQueue);
326         device = (WDFDEVICE) pQueue->GetDevice()->GetHandle();
327         pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
328         EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
329         EventWriteFX_EVTIOSTOP_START(pActivityId, pDriverDeviceAdd, device);
330     }
331     return status;
332 }
333 
334 // EvtIoStop callback returned.
335 __inline
336 VOID
337 PerfEvtIoStopStop(
338     __in WDFQUEUE Queue,
339     __in GUID* pActivityId
340 )
341 {
342     WDFOBJECT_OFFSET offset = 0;
343     WDFDEVICE device;
344     FxIoQueue* pQueue;
345     PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd;
346 
347     FxObject *pObject = FxObject::_GetObjectFromHandle(Queue, &offset);
348     PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
349     FxObjectHandleGetPtr(pFxDriverGlobals,
350                       Queue,
351                       FX_TYPE_QUEUE,
352                       (PVOID*) &pQueue);
353     device = (WDFDEVICE) pQueue->GetDevice()->GetHandle();
354     pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
355 
356     EventWriteFX_EVTIOSTOP_STOP(pActivityId, pDriverDeviceAdd, device);
357 }
358