UMDF PnP 驱动程序不创建跟踪日志
UMDF PnP Driver creates no trace logs
我正在尝试为此 Idd Sample Driver. I am following this 文档创建跟踪日志消息。
我将 WPP_INIT_TRACING(pDriverObject, pRegistryPath)
添加到 DriverEntry,并将 WPP_CLEANUP(pDriverObject)
添加到 EvtCleanupCallback。
_Use_decl_annotations_
void DriverContextCleanup(WDFOBJECT DriverObject)
{
UNREFERENCED_PARAMETER(DriverObject);
DoTraceMessage(MYDRIVER_ALL_INFO, "Tracing Fini Success");
WPP_CLEANUP(WdfDriverWdmGetDriverObject(DriverObject));
}
_Use_decl_annotations_
extern "C" NTSTATUS DriverEntry(
PDRIVER_OBJECT pDriverObject,
PUNICODE_STRING pRegistryPath
)
{
WDF_DRIVER_CONFIG Config;
NTSTATUS Status;
WDF_OBJECT_ATTRIBUTES Attributes;
WDF_OBJECT_ATTRIBUTES_INIT(&Attributes);
Attributes.EvtCleanupCallback = DriverContextCleanup;
WDF_DRIVER_CONFIG_INIT(&Config,
IddSampleDeviceAdd
);
WPP_INIT_TRACING(pDriverObject, pRegistryPath);
DoTraceMessage(MYDRIVER_ALL_INFO, "Tracing Init . . .");
Status = WdfDriverCreate(pDriverObject, pRegistryPath, &Attributes, &Config, WDF_NO_HANDLE);
if (!NT_SUCCESS(Status))
{
DoTraceMessage(MYDRIVER_ALL_INFO, "Tracing Init Failed");
WPP_CLEANUP(pDriverObject);
return Status;
}
DoTraceMessage(MYDRIVER_ALL_INFO, "Tracing Init Success");
return Status;
}
我向 DriverEntry 和 DeviceEntry 添加了一些带有 MYDRIVER_ALL_INFO 标志的 DoTraceMessage() 调用。
NTSTATUS IddSampleDeviceD0Entry(WDFDEVICE Device, WDF_POWER_DEVICE_STATE PreviousState)
{
UNREFERENCED_PARAMETER(PreviousState);
// This function is called by WDF to start the device in the fully-on power state.
DoTraceMessage(MYDRIVER_ALL_INFO, "Tracing Device Entry");
auto* pContext = WdfObjectGet_IndirectDeviceContextWrapper(Device);
pContext->pContext->InitAdapter();
return STATUS_SUCCESS;
}
我确保在项目属性中将 WPP Tracing 设置为 YES。
项目构建,我进入 TraceView 并打开 IddSampleDriver.PDB 文件,我将级别设置为详细,并检查所有标志。我确认它具有所需的跟踪信息。因为如果我打开 IddSampleApp.PDB 文件,它会失败。
我在启用 TestSigning 并安装 pnputil -a ./x64/Debug/IddSampleDriver/IddSampleDriver.inf
、运行 示例应用程序后安装了驱动程序,驱动程序在显示设置中启动了 3 个虚拟显示器。然后我退出应用程序,监视器消失了。一切似乎都很实用。问题是在 TraceView 中没有痕迹。
我在 this 之后尝试使用跟踪日志。仍然没有。
我已经尝试使用 logman,遵循 this。仍然没有。
我已经束手无策了。上周我花了整整一周的时间,想方设法让我的跟踪消息出现。
要么我按照这些说明中的每一个都没有成功。要么我以某种方式搞砸了它们中的每一个,要么我遗漏了我需要做的其他事情才能查看这些痕迹。
附加信息:
Trace.h 保持原状
针对 x64,调试。 运行 在构建机器上。 Win10.
我使用的CTL文件:
b254994f-46e6-4718-80a0-0a3aa50d6ce4 MyDriver1TraceGuid
我使用的基本过程(以tracelog为例):
tracepdb -f .\x64\Debug\IddSampleDriver.pdb
tracelog -start TestTraceIDD -guid .\guid.ctl -f testTrace.etl -flag 0xff
pnputil -a .\x64\Debug\IddSampleDriver\IddSampleDriver.inf #install driver
.\x64\Debug\IddSampleApp.exe #create software device and attach driver to it
<exit app>
tracelog -stop TestTraceIDD
tracefmt.exe .\testTrace.etl -p . -o test.out```
pnputil -d oem20.inf -f #uninstall driver
解决了我的问题。我实际上并没有安装我的驱动程序,因为它仍然是我第一次安装它时安装的,所以它总是使用那个驱动程序而不是我启用了 WPP 的新驱动程序。我正在使用 pnputil 安装和卸载驱动程序。
例如,我正在做 pnputil -d oem20.inf -f
来卸载驱动程序。这是不好的。我现在了解到,强制删除驱动程序无济于事。我强制删除的原因是因为当我还有一个设备时它不会删除,即使我会退出示例应用程序。
因此,为了正确删除驱动程序,您必须做的是使用 pnputil 枚举设备,删除使用您的驱动程序的设备,然后删除驱动程序。这允许正确安装全新驱动程序。
我正在尝试为此 Idd Sample Driver. I am following this 文档创建跟踪日志消息。
我将 WPP_INIT_TRACING(pDriverObject, pRegistryPath)
添加到 DriverEntry,并将 WPP_CLEANUP(pDriverObject)
添加到 EvtCleanupCallback。
_Use_decl_annotations_
void DriverContextCleanup(WDFOBJECT DriverObject)
{
UNREFERENCED_PARAMETER(DriverObject);
DoTraceMessage(MYDRIVER_ALL_INFO, "Tracing Fini Success");
WPP_CLEANUP(WdfDriverWdmGetDriverObject(DriverObject));
}
_Use_decl_annotations_
extern "C" NTSTATUS DriverEntry(
PDRIVER_OBJECT pDriverObject,
PUNICODE_STRING pRegistryPath
)
{
WDF_DRIVER_CONFIG Config;
NTSTATUS Status;
WDF_OBJECT_ATTRIBUTES Attributes;
WDF_OBJECT_ATTRIBUTES_INIT(&Attributes);
Attributes.EvtCleanupCallback = DriverContextCleanup;
WDF_DRIVER_CONFIG_INIT(&Config,
IddSampleDeviceAdd
);
WPP_INIT_TRACING(pDriverObject, pRegistryPath);
DoTraceMessage(MYDRIVER_ALL_INFO, "Tracing Init . . .");
Status = WdfDriverCreate(pDriverObject, pRegistryPath, &Attributes, &Config, WDF_NO_HANDLE);
if (!NT_SUCCESS(Status))
{
DoTraceMessage(MYDRIVER_ALL_INFO, "Tracing Init Failed");
WPP_CLEANUP(pDriverObject);
return Status;
}
DoTraceMessage(MYDRIVER_ALL_INFO, "Tracing Init Success");
return Status;
}
我向 DriverEntry 和 DeviceEntry 添加了一些带有 MYDRIVER_ALL_INFO 标志的 DoTraceMessage() 调用。
NTSTATUS IddSampleDeviceD0Entry(WDFDEVICE Device, WDF_POWER_DEVICE_STATE PreviousState)
{
UNREFERENCED_PARAMETER(PreviousState);
// This function is called by WDF to start the device in the fully-on power state.
DoTraceMessage(MYDRIVER_ALL_INFO, "Tracing Device Entry");
auto* pContext = WdfObjectGet_IndirectDeviceContextWrapper(Device);
pContext->pContext->InitAdapter();
return STATUS_SUCCESS;
}
我确保在项目属性中将 WPP Tracing 设置为 YES。
项目构建,我进入 TraceView 并打开 IddSampleDriver.PDB 文件,我将级别设置为详细,并检查所有标志。我确认它具有所需的跟踪信息。因为如果我打开 IddSampleApp.PDB 文件,它会失败。
我在启用 TestSigning 并安装 pnputil -a ./x64/Debug/IddSampleDriver/IddSampleDriver.inf
、运行 示例应用程序后安装了驱动程序,驱动程序在显示设置中启动了 3 个虚拟显示器。然后我退出应用程序,监视器消失了。一切似乎都很实用。问题是在 TraceView 中没有痕迹。
我在 this 之后尝试使用跟踪日志。仍然没有。
我已经尝试使用 logman,遵循 this。仍然没有。
我已经束手无策了。上周我花了整整一周的时间,想方设法让我的跟踪消息出现。
要么我按照这些说明中的每一个都没有成功。要么我以某种方式搞砸了它们中的每一个,要么我遗漏了我需要做的其他事情才能查看这些痕迹。
附加信息:
Trace.h 保持原状 针对 x64,调试。 运行 在构建机器上。 Win10.
我使用的CTL文件:
b254994f-46e6-4718-80a0-0a3aa50d6ce4 MyDriver1TraceGuid
我使用的基本过程(以tracelog为例):
tracepdb -f .\x64\Debug\IddSampleDriver.pdb
tracelog -start TestTraceIDD -guid .\guid.ctl -f testTrace.etl -flag 0xff
pnputil -a .\x64\Debug\IddSampleDriver\IddSampleDriver.inf #install driver
.\x64\Debug\IddSampleApp.exe #create software device and attach driver to it
<exit app>
tracelog -stop TestTraceIDD
tracefmt.exe .\testTrace.etl -p . -o test.out```
pnputil -d oem20.inf -f #uninstall driver
解决了我的问题。我实际上并没有安装我的驱动程序,因为它仍然是我第一次安装它时安装的,所以它总是使用那个驱动程序而不是我启用了 WPP 的新驱动程序。我正在使用 pnputil 安装和卸载驱动程序。
例如,我正在做 pnputil -d oem20.inf -f
来卸载驱动程序。这是不好的。我现在了解到,强制删除驱动程序无济于事。我强制删除的原因是因为当我还有一个设备时它不会删除,即使我会退出示例应用程序。
因此,为了正确删除驱动程序,您必须做的是使用 pnputil 枚举设备,删除使用您的驱动程序的设备,然后删除驱动程序。这允许正确安装全新驱动程序。