--- /dev/null
+/*++
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Module Name:
+
+ vfpriv.hpp
+
+Abstract:
+
+ common header file for verifier
+
+Author:
+
+
+
+Environment:
+
+ kernel mode only
+
+Revision History:
+
+--*/
+
+#pragma once
+extern "C" {
+#include <ntddk.h>
+}
+
+#include "fx.hpp"
+
+extern "C" {
+
+__inline
+VOID
+VerifyIrqlEntry(
+ __out KIRQL *Irql
+ )
+{
+ *Irql = KeGetCurrentIrql();
+}
+
+__inline
+VOID
+VerifyIrqlExit(
+ __in PWDF_DRIVER_GLOBALS DriverGlobals,
+ __in KIRQL PrevIrql
+ )
+{
+ KIRQL currIrql;
+
+ currIrql = KeGetCurrentIrql();
+ if (PrevIrql != currIrql) {
+ KdPrint(("WDF VERIFIER: Irql at entry of event is not same as at exit.\n"));
+ FxVerifierBugCheck(GetFxDriverGlobals(DriverGlobals),
+ WDF_VERIFIER_IRQL_MISMATCH,
+ PrevIrql,
+ currIrql
+ );
+ }
+}
+
+__inline
+VOID
+VerifyCriticalRegionEntry(
+ __out BOOLEAN *CritRegion
+ )
+{
+ if (KeGetCurrentIrql() <= APC_LEVEL) {
+ *CritRegion = KeAreApcsDisabled();
+ }
+}
+
+__inline
+VOID
+VerifyCriticalRegionExit(
+ __in PWDF_DRIVER_GLOBALS DriverGlobals,
+ __in BOOLEAN OldCritRegion,
+ __in PVOID Pfn
+ )
+{
+ if (KeGetCurrentIrql() <= APC_LEVEL) {
+ if (OldCritRegion != KeAreApcsDisabled()) {
+ KdPrint(("WDF VERIFIER: Critical section entry and exit around event callback incorrect\n"));
+ FxVerifierBugCheck(GetFxDriverGlobals(DriverGlobals),
+ WDF_VERIFIER_CRITICAL_REGION_MISMATCH,
+ (ULONG_PTR)Pfn,
+ 0
+ );
+ }
+ }
+}
+} // extern "C"
+
+FORCEINLINE
+VOID
+PerformanceAnalysisIOProcess(
+ __in PFX_DRIVER_GLOBALS pFxDriverGlobals,
+ __in WDFREQUEST Handle,
+ __out FxRequest** ppReq,
+ __inout GUID* pActivityId
+ )
+{
+
+ FxObjectHandleGetPtr(pFxDriverGlobals,
+ Handle,
+ FX_TYPE_REQUEST,
+ (PVOID *) ppReq);
+
+ if (IoGetActivityIdIrp((*ppReq)->GetFxIrp()->GetIrp(), pActivityId) == STATUS_NOT_FOUND)
+ {
+ EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
+ IoSetActivityIdIrp((*ppReq)->GetFxIrp()->GetIrp(), pActivityId);
+ }
+}
+
+FORCEINLINE
+BOOLEAN
+PerfIoStart(
+ __in WDFREQUEST Handle
+)
+{
+ FxRequest* pReq;
+ GUID activityId = { 0 };
+ WDFOBJECT_OFFSET offset = 0;
+
+ FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
+ PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
+ BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
+
+ if(status)
+ {
+ PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
+ PerformanceAnalysisIOProcess(pFxDriverGlobals, Handle, &pReq,
+ &activityId);
+
+ EventWriteFX_REQUEST_START(&activityId, pReq->GetFxIrp()->GetMajorFunction(),
+ pDriverDeviceAdd, pReq->GetCurrentQueue()->GetDevice()->GetHandle());
+ }
+ return status;
+}
+
+FORCEINLINE
+BOOLEAN
+PerfIoComplete(
+ __in WDFREQUEST Handle
+)
+{
+ FxRequest* pReq;
+ GUID activityId = { 0 };
+ WDFOBJECT_OFFSET offset = 0;
+
+ FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
+ PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
+ BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
+
+ if(status)
+ {
+ PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
+ PerformanceAnalysisIOProcess(pFxDriverGlobals, Handle, &pReq,
+ &activityId);
+
+ EventWriteFX_REQUEST_COMPLETE(&activityId, pReq->GetFxIrp()->GetMajorFunction(),
+ pDriverDeviceAdd, pReq->GetCurrentQueue()->GetDevice()->GetHandle());
+ }
+ return status;
+}
+
+FORCEINLINE
+PFN_WDF_DRIVER_DEVICE_ADD
+PerformanceGetDriverDeviceAdd(
+ __in WDFOBJECT Handle
+)
+{
+ WDFOBJECT_OFFSET offset = 0;
+ FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
+ PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
+
+ return pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
+}
+
+__inline
+BOOLEAN
+PerfEvtDeviceD0EntryStart(
+ __in WDFDEVICE Handle,
+ __inout GUID* pActivityId
+)
+{
+ WDFOBJECT_OFFSET offset = 0;
+ FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
+ PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
+ BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
+
+ if(status) {
+ PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
+ EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
+ EventWriteFX_POWER_D0_ENTRY_START(pActivityId, pDriverDeviceAdd, Handle);
+ }
+
+ return status;
+}
+
+__inline
+VOID
+PerfEvtDeviceD0EntryStop(
+ __in WDFDEVICE Handle,
+ __in GUID* pActivityId
+)
+{
+ EventWriteFX_POWER_D0_ENTRY_STOP(pActivityId, PerformanceGetDriverDeviceAdd(Handle), Handle);
+}
+
+__inline
+BOOLEAN
+PerfEvtDeviceD0ExitStart(
+ __in WDFDEVICE Handle,
+ __inout GUID* pActivityId
+)
+{
+ WDFOBJECT_OFFSET offset = 0;
+ FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
+ PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
+ BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
+
+ if(status) {
+ PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
+ EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
+ EventWriteFX_POWER_D0_EXIT_START(pActivityId, pDriverDeviceAdd, Handle);
+ }
+ return status;
+}
+
+__inline
+VOID
+PerfEvtDeviceD0ExitStop(
+ __in WDFDEVICE Handle,
+ __in GUID* pActivityId
+)
+{
+ EventWriteFX_POWER_D0_EXIT_STOP(pActivityId, PerformanceGetDriverDeviceAdd(Handle), Handle);
+}
+
+__inline
+BOOLEAN
+PerfEvtDevicePrepareHardwareStart(
+ __in WDFDEVICE Handle,
+ __inout GUID* pActivityId
+)
+{
+
+ WDFOBJECT_OFFSET offset = 0;
+ FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
+ PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
+ BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
+
+ if(status) {
+ PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
+ EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
+ EventWriteFX_POWER_HW_PREPARE_START(pActivityId, pDriverDeviceAdd, Handle);
+ }
+ return status;
+}
+
+__inline
+VOID
+PerfEvtDevicePrepareHardwareStop(
+ __in WDFDEVICE Handle,
+ __in GUID* pActivityId
+)
+{
+ EventWriteFX_POWER_HW_PREPARE_STOP(pActivityId, PerformanceGetDriverDeviceAdd(Handle), Handle);
+}
+
+__inline
+BOOLEAN
+PerfEvtDeviceReleaseHardwareStart(
+ __in WDFDEVICE Handle,
+ __inout GUID* pActivityId
+)
+{
+ WDFOBJECT_OFFSET offset = 0;
+ FxObject *pObject = FxObject::_GetObjectFromHandle(Handle, &offset);
+ PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
+ BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
+
+ if(status) {
+ PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
+ EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
+ EventWriteFX_POWER_HW_RELEASE_START(pActivityId, pDriverDeviceAdd, Handle);
+ }
+ return status;
+}
+
+__inline
+VOID
+PerfEvtDeviceReleaseHardwareStop(
+ __in WDFDEVICE Handle,
+ __in GUID* pActivityId
+)
+{
+ EventWriteFX_POWER_HW_RELEASE_STOP(pActivityId, PerformanceGetDriverDeviceAdd(Handle), Handle);
+}
+
+// EvtIoStop callback started.
+__inline
+BOOLEAN
+PerfEvtIoStopStart(
+ __in WDFQUEUE Queue,
+ __inout GUID* pActivityId
+)
+{
+ WDFOBJECT_OFFSET offset = 0;
+ WDFDEVICE device;
+ FxIoQueue* pQueue;
+ PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd;
+
+ FxObject *pObject = FxObject::_GetObjectFromHandle(Queue, &offset);
+ PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
+ BOOLEAN status = IsFxPerformanceAnalysis(pFxDriverGlobals);
+
+ if(status) {
+ FxObjectHandleGetPtr(pFxDriverGlobals,
+ Queue,
+ FX_TYPE_QUEUE,
+ (PVOID*) &pQueue);
+ device = (WDFDEVICE) pQueue->GetDevice()->GetHandle();
+ pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
+ EtwActivityIdControl(EVENT_ACTIVITY_CTRL_CREATE_ID, pActivityId);
+ EventWriteFX_EVTIOSTOP_START(pActivityId, pDriverDeviceAdd, device);
+ }
+ return status;
+}
+
+// EvtIoStop callback returned.
+__inline
+VOID
+PerfEvtIoStopStop(
+ __in WDFQUEUE Queue,
+ __in GUID* pActivityId
+)
+{
+ WDFOBJECT_OFFSET offset = 0;
+ WDFDEVICE device;
+ FxIoQueue* pQueue;
+ PFN_WDF_DRIVER_DEVICE_ADD pDriverDeviceAdd;
+
+ FxObject *pObject = FxObject::_GetObjectFromHandle(Queue, &offset);
+ PFX_DRIVER_GLOBALS pFxDriverGlobals = pObject->GetDriverGlobals();
+ FxObjectHandleGetPtr(pFxDriverGlobals,
+ Queue,
+ FX_TYPE_QUEUE,
+ (PVOID*) &pQueue);
+ device = (WDFDEVICE) pQueue->GetDevice()->GetHandle();
+ pDriverDeviceAdd = pFxDriverGlobals->Driver->GetDriverDeviceAddMethod();
+
+ EventWriteFX_EVTIOSTOP_STOP(pActivityId, pDriverDeviceAdd, device);
+}