UMDF PnP Driver creates no trace logs

288 Views Asked by At

Im trying to create trace log messages for this Idd Sample Driver. I am following this document.

I add WPP_INIT_TRACING(pDriverObject, pRegistryPath) to the DriverEntry, and WPP_CLEANUP(pDriverObject)to the 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;
}

I add some DoTraceMessage() calls with a flag of MYDRIVER_ALL_INFO to the DriverEntry and 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;
}

I make sure WPP Tracing is set to YES in the properties of the project.

The project builds, I go into TraceView and open the IddSampleDriver.PDB file, I set the level to verbose, and check all of the flags. I verified that it has the trace stuff it needs. Since if I open the IddSampleApp.PDB file, it fails.

I install the driver after enabling TestSigning and installing with pnputil -a ./x64/Debug/IddSampleDriver/IddSampleDriver.inf, run the sample app, the driver spins up 3 virtual monitors in the Display Settings. I then exit the app, and the monitors disappear. Everything seems to be functional. The problem is there is no traces in TraceView.

I have tried using tracelog, following this. Still nothing.

I have tried using logman, following this. Still nothing.

I am at my wits end. I spent all last week on this, Trying every possible avenue to get my trace messages to appear.

Either I followed every one of these instructions with no success. Either I somehow messed up every single one of them, or I am missing something else that I need to do in order to view these traces.

Additional Info:

Trace.h was left untouched Targeting x64, Debug. Running on build machine. Win10.

CTL file I used:

b254994f-46e6-4718-80a0-0a3aa50d6ce4 MyDriver1TraceGuid

Basic process I used (tracelog as example):

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
1

There are 1 best solutions below

0
On BEST ANSWER

Solved my problem. I wasnt actually installing my driver, since it was still installed from the first time I installed it, so it was always using that driver instead of my new one with WPP enabled. I was installing and uninstalling the driver with pnputil. I was doing pnputil -d oem20.inf -f for example to uninstall the driver. This is BAD. I have learned now that force deleting a driver does nothing. The reason I was force deleting was because it wouldnt delete when i still had a device, even though i would exit the sample app.

So what you have to do in order to properly delete the driver is enumerate the devices with pnputil, remove the ones that use your driver, then delete the driver. This allows a proper fresh driver installation.