2020-09-24 20:51:15 +00:00
|
|
|
/*++
|
|
|
|
|
|
|
|
Copyright (c) Microsoft Corporation
|
|
|
|
|
|
|
|
Module Name:
|
|
|
|
|
|
|
|
FxTelemetry.hpp
|
|
|
|
|
|
|
|
Abstract:
|
|
|
|
|
|
|
|
This is the header file for core framework (Wdf0100 and Wudfx02000)
|
|
|
|
related telemetry.
|
|
|
|
|
|
|
|
Author:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Environment:
|
|
|
|
|
|
|
|
Both kernel and user mode
|
|
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
|
|
Notes:
|
|
|
|
|
|
|
|
--*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <strsafe.h>
|
2020-10-16 03:30:51 +00:00
|
|
|
#include "fxtelemetrycommon.hpp"
|
2020-09-24 20:51:15 +00:00
|
|
|
|
|
|
|
#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
|
2020-10-16 03:30:51 +00:00
|
|
|
#include "fxtelemetrykm.hpp"
|
2020-09-24 20:51:15 +00:00
|
|
|
#else
|
2020-10-16 03:30:51 +00:00
|
|
|
#include "fxtelemetryum.hpp"
|
2020-09-24 20:51:15 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2020-10-16 03:30:51 +00:00
|
|
|
// TRACELOGGING_DECLARE_PROVIDER(g_TelemetryProvider); __REACTOS__
|
2020-09-24 20:51:15 +00:00
|
|
|
|
|
|
|
#define FX_TELEMETRY_ENABLED(TraceHandle, Globals) \
|
|
|
|
(TraceHandle && IsDriverTelemetryContextInitialized(Globals)) \
|
|
|
|
|
|
|
|
#define WDF_CENSUS_EVT_DATA_COMMON(FxGlobals) \
|
|
|
|
TraceLoggingStruct(1, "CensusCommonV1"), \
|
|
|
|
TraceLoggingGuid((FxGlobals)->TelemetryContext->DriverSessionGUID, "SessionGUID")
|
|
|
|
|
|
|
|
//
|
|
|
|
// For events that want to fire once per
|
|
|
|
// session define a bit for use in DoOnceFlagsBitmap
|
|
|
|
//
|
|
|
|
typedef enum _FX_TELEMETRY_DO_ONCE_BITS {
|
|
|
|
DeviceStartEventBit = 0
|
|
|
|
} FX_TELEMETRY_DO_ONCE_BITS;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Event name: WdfCensusEvtDrvLoad
|
|
|
|
//
|
|
|
|
// Source: Mode agnostic (UMDF and KMDF)
|
|
|
|
//
|
|
|
|
// Description: Written when a WDF client or cx calls WdfDriverCreate.
|
|
|
|
// The event contains information about the driver version,
|
|
|
|
// verifier options, service name and driver configuration
|
|
|
|
// to track non-pnp drivers or WDF miniports.
|
|
|
|
//
|
|
|
|
// Frequency: If FX_TELEMETRY_ENABLED then everytime a driver calls WdfDriverCreate.
|
|
|
|
//
|
|
|
|
#define WDF_CENSUS_EVT_WRITE_DRIVER_LOAD(TraceHandle, Globals, DrvImage, WdfVersion) \
|
|
|
|
TraceLoggingWrite(TraceHandle, \
|
|
|
|
"WdfCensusEvtDrvLoad", \
|
|
|
|
WDF_TELEMETRY_EVT_KEYWORDS, \
|
|
|
|
WDF_CENSUS_EVT_DATA_COMMON(Globals), \
|
|
|
|
TraceLoggingStruct(9, "DriverInfo" ), \
|
|
|
|
TraceLoggingString((Globals)->Public.DriverName, "DriverService" ), \
|
|
|
|
TraceLoggingWideString(DrvImage, "DriverImage" ), \
|
|
|
|
TraceLoggingWideString(WdfVersion, "WdfVersion" ), \
|
|
|
|
TraceLoggingUInt32((Globals)->WdfBindInfo->Version.Major, "DriverVersionMajor" ), \
|
|
|
|
TraceLoggingUInt32((Globals)->WdfBindInfo->Version.Minor, "DriverVersionMinor" ), \
|
|
|
|
TraceLoggingBoolean((Globals)->FxVerifierOn, "FxVerifierOn" ), \
|
|
|
|
TraceLoggingBoolean(!!((Globals)->Public.DriverFlags & WdfDriverInitNonPnpDriver), "DriverNonPnP" ), \
|
|
|
|
TraceLoggingBoolean(!!((Globals)->Public.DriverFlags & WdfDriverInitNoDispatchOverride), "DriverNoDispatchOverride" ), \
|
|
|
|
TraceLoggingUInt32((Globals)->FxEnhancedVerifierOptions, "FxEnhancedVeriferOptions" ) \
|
|
|
|
);
|
|
|
|
|
|
|
|
#define MIN_HOURS_BEFORE_NEXT_LOG 24
|
|
|
|
#define BASE_10 (10)
|
|
|
|
|
|
|
|
#define WDF_LAST_TELEMETRY_LOG_TIME_VALUE L"TimeOfLastTelemetryLog"
|
|
|
|
#define WDF_DRIVER_IMAGE_NAME_VALUE L"ImagePath"
|
|
|
|
|
|
|
|
//
|
|
|
|
// bit-flags for tracking hardware info for device start telemetry event
|
|
|
|
//
|
|
|
|
enum FxDeviceInfoFlags : USHORT {
|
|
|
|
DeviceInfoLineBasedLevelTriggeredInterrupt = 0x1,
|
|
|
|
DeviceInfoLineBasedEdgeTriggeredInterrupt = 0x2,
|
|
|
|
DeviceInfoMsiXOrSingleMsi22Interrupt = 0x4,
|
|
|
|
DeviceInfoMsi22MultiMessageInterrupt = 0x8,
|
|
|
|
DeviceInfoPassiveLevelInterrupt = 0x10,
|
|
|
|
DeviceInfoDmaBusMaster = 0x20,
|
|
|
|
DeviceInfoDmaSystem = 0x40,
|
|
|
|
DeviceInfoDmaSystemDuplex = 0x80,
|
|
|
|
DeviceInfoHasStaticChildren = 0x100,
|
|
|
|
DeviceInfoHasDynamicChildren = 0x200,
|
|
|
|
DeviceInfoIsUsingDriverWppRecorder = 0x400
|
|
|
|
};
|
|
|
|
|
|
|
|
//
|
|
|
|
// wdf version strig example "01.011"
|
|
|
|
//
|
|
|
|
#define WDF_VERSION_STRING_SIZE_INCLUDING_SEPARATOR_CCH 10
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
__inline
|
|
|
|
IsDeviceInfoFlagSet(
|
|
|
|
_In_ USHORT DeviceInfo,
|
|
|
|
_In_ FxDeviceInfoFlags Flag
|
|
|
|
)
|
|
|
|
{
|
|
|
|
return FLAG_TO_BOOL(DeviceInfo, Flag);
|
|
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
|
|
AllocAndInitializeTelemetryContext(
|
|
|
|
_In_ PFX_TELEMETRY_CONTEXT* TelemetryContext
|
|
|
|
);
|
|
|
|
|
|
|
|
__inline
|
|
|
|
BOOLEAN
|
|
|
|
IsDriverTelemetryContextInitialized(
|
|
|
|
_In_ PFX_DRIVER_GLOBALS FxDrvGlobals
|
|
|
|
)
|
|
|
|
{
|
|
|
|
ASSERT(FxDrvGlobals);
|
|
|
|
return (NULL != FxDrvGlobals->TelemetryContext);
|
|
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
|
|
RegisterTelemetryProvider(
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
UnregisterTelemetryProvider(
|
|
|
|
VOID
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
LogDeviceStartTelemetryEvent(
|
|
|
|
_In_ PFX_DRIVER_GLOBALS Globals,
|
|
|
|
_In_opt_ FxDevice* Fdo
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
LogDriverInfoStream(
|
|
|
|
_In_ PFX_DRIVER_GLOBALS Globals,
|
|
|
|
_In_opt_ FxDevice* Fdo
|
|
|
|
);
|
|
|
|
|
|
|
|
_Must_inspect_result_
|
|
|
|
NTSTATUS
|
|
|
|
GetImageName(
|
|
|
|
_In_ PFX_DRIVER_GLOBALS DriverGlobals,
|
|
|
|
_Out_ PUNICODE_STRING ImageName
|
|
|
|
);
|
|
|
|
|
|
|
|
VOID
|
|
|
|
__inline
|
|
|
|
BuildStringFromPartialInfo(
|
|
|
|
_In_ PKEY_VALUE_PARTIAL_INFORMATION Info,
|
|
|
|
_Out_ PUNICODE_STRING String
|
|
|
|
)
|
|
|
|
{
|
|
|
|
String->Buffer = (PWCHAR) &Info->Data[0];
|
|
|
|
String->MaximumLength = (USHORT) Info->DataLength;
|
|
|
|
String->Length = String->MaximumLength - sizeof(UNICODE_NULL);
|
|
|
|
|
|
|
|
//
|
|
|
|
// ensure string is null terminated
|
|
|
|
//
|
|
|
|
String->Buffer[String->Length/sizeof(WCHAR)] = UNICODE_NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
|
|
GetNameFromPath(
|
|
|
|
_In_ PCUNICODE_STRING Path,
|
|
|
|
_Out_ PUNICODE_STRING Name
|
|
|
|
);
|
|
|
|
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|