1

我正在尝试为此Idd Sample Driver创建跟踪日志消息。我正在关注这份文件。

我添加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;
}

我将一些带有 MYDRIVER_ALL_INFO 标志的 DoTraceMessage() 调用添加到 DriverEntry 和 DeviceEntry。

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 为目标,调试。在构建机器上运行。赢10。

我使用的 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
4

1 回答 1

1

解决了我的问题。我实际上并没有安装我的驱动程序,因为它从我第一次安装它时就已经安装了,所以它总是使用那个驱动程序而不是我启用了 WPP 的新驱动程序。我正在使用 pnputil 安装和卸载驱动程序。pnputil -d oem20.inf -f例如,我正在卸载驱动程序。这是不好的。我现在了解到强制删除驱动程序没有任何作用。我强制删除的原因是因为当我还有设备时它不会删除,即使我会退出示例应用程序。

因此,为了正确删除驱动程序,您必须做的是使用 pnputil 枚举设备,删除使用您的驱动程序的设备,然后删除驱动程序。这允许正确安装新的驱动程序。

于 2022-02-02T20:59:15.323 回答