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