From 42bc54ce13680e15ec6149082e2a0d0067ef83fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 14:31:07 +0200 Subject: [PATCH 01/52] Implemented WPP tracing boilerplate --- .gitignore | 8 +++++ sys/Driver.c | 54 ++++++++++++++++++++++++++++--- sys/ViGEmBus.vcxproj | 19 +++++++++++ sys/ViGEmBus.vcxproj.filters | 3 ++ sys/busenum.c | 1 + sys/busenum.h | 3 ++ sys/trace.h | 61 ++++++++++++++++++++++++++++++++++++ 7 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 sys/trace.h diff --git a/.gitignore b/.gitignore index 799ae30..5caa9df 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,11 @@ /Release (static) /build/bin/Debug /build/obj/Debug +/bin +/sys/x64/Debug +/x64/Debug +/x64/Debug (static) +*.user +/.vs/config +/sys/RCa21300 +/sys/RCb21300 diff --git a/sys/Driver.c b/sys/Driver.c index 493522c..8a8887a 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -25,6 +25,7 @@ SOFTWARE. #include "busenum.h" #include +#include "driver.tmh" #ifdef ALLOC_PRAGMA #pragma alloc_text (INIT, DriverEntry) @@ -40,18 +41,31 @@ SOFTWARE. // NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { - WDF_DRIVER_CONFIG config; - NTSTATUS status; - WDFDRIVER driver; + WDF_DRIVER_CONFIG config; + NTSTATUS status; + WDFDRIVER driver; + WDF_OBJECT_ATTRIBUTES attributes; KdPrint((DRIVERNAME "Virtual Gamepad Emulation Bus Driver [built: %s %s]\n", __DATE__, __TIME__)); + // + // Initialize WPP Tracing + // + WPP_INIT_TRACING(DriverObject, RegistryPath); + + // + // Register cleanup callback + // + WDF_OBJECT_ATTRIBUTES_INIT(&attributes); + attributes.EvtCleanupCallback = Bus_EvtDriverContextCleanup; + WDF_DRIVER_CONFIG_INIT(&config, Bus_EvtDeviceAdd); - status = WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, &driver); + status = WdfDriverCreate(DriverObject, RegistryPath, &attributes, &config, &driver); if (!NT_SUCCESS(status)) { + WPP_CLEANUP(DriverObject); KdPrint((DRIVERNAME "WdfDriverCreate failed with status 0x%x\n", status)); } @@ -382,6 +396,38 @@ Bus_FileClose( WdfChildListEndIteration(list, &iterator); } +VOID +Bus_EvtDriverContextCleanup( + _In_ WDFOBJECT DriverObject + ) +/*++ +Routine Description: + + Free all the resources allocated in DriverEntry. + +Arguments: + + DriverObject - handle to a WDF Driver object. + +Return Value: + + VOID. + +--*/ +{ + UNREFERENCED_PARAMETER(DriverObject); + + PAGED_CODE (); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry"); + + // + // Stop WPP Tracing + // + WPP_CLEANUP( WdfDriverWdmGetDriverObject( (WDFDRIVER) DriverObject) ); + +} + // // Called by PDO when a boot-up stage has been completed // diff --git a/sys/ViGEmBus.vcxproj b/sys/ViGEmBus.vcxproj index 2ad467c..bb36a47 100644 --- a/sys/ViGEmBus.vcxproj +++ b/sys/ViGEmBus.vcxproj @@ -149,6 +149,7 @@ DbgengKernelDebugger $(SolutionDir)Include;$(IncludePath) true + false DbgengKernelDebugger @@ -161,6 +162,7 @@ DbgengKernelDebugger $(SolutionDir)Include;$(IncludePath) true + false DbgengKernelDebugger @@ -212,6 +214,11 @@ $(DDK_LIB_PATH)ntstrsafe.lib;$(DDK_LIB_PATH)wdmsec.lib;%(AdditionalDependencies) + + true + true + trace.h + @@ -225,6 +232,9 @@ true + true + true + trace.h @@ -250,6 +260,11 @@ $(DDK_LIB_PATH)ntstrsafe.lib;$(DDK_LIB_PATH)wdmsec.lib;%(AdditionalDependencies) + + true + true + trace.h + @@ -263,6 +278,9 @@ true + true + true + trace.h @@ -281,6 +299,7 @@ + diff --git a/sys/ViGEmBus.vcxproj.filters b/sys/ViGEmBus.vcxproj.filters index a589514..cb0c79e 100644 --- a/sys/ViGEmBus.vcxproj.filters +++ b/sys/ViGEmBus.vcxproj.filters @@ -66,6 +66,9 @@ Header Files + + Header Files + diff --git a/sys/busenum.c b/sys/busenum.c index 2894fba..d401ee3 100644 --- a/sys/busenum.c +++ b/sys/busenum.c @@ -26,6 +26,7 @@ SOFTWARE. #include "busenum.h" #include #include +#include "busenum.tmh" #ifdef ALLOC_PRAGMA #pragma alloc_text (PAGE, Bus_PlugInDevice) diff --git a/sys/busenum.h b/sys/busenum.h index 5c5b813..dea6a0c 100644 --- a/sys/busenum.h +++ b/sys/busenum.h @@ -25,6 +25,7 @@ SOFTWARE. #pragma once +#include "trace.h" #include #include #define NTSTRSAFE_LIB @@ -99,6 +100,8 @@ EVT_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL Pdo_EvtIoInternalDeviceControl; EVT_WDF_TIMER Xgip_SysInitTimerFunc; +EVT_WDF_OBJECT_CONTEXT_CLEANUP Bus_EvtDriverContextCleanup; + #pragma endregion #pragma region Bus enumeration-specific functions diff --git a/sys/trace.h b/sys/trace.h new file mode 100644 index 0000000..d67e89f --- /dev/null +++ b/sys/trace.h @@ -0,0 +1,61 @@ +/*++ + +Module Name: + + Trace.h + +Abstract: + + Header file for the debug tracing related function defintions and macros. + +Environment: + + Kernel mode + +--*/ + +// +// Define the tracing flags. +// +// Tracing GUID - c5ce18fe-27bd-4049-b0b4-8a47cab1dcd9 +// + +#define WPP_CONTROL_GUIDS \ + WPP_DEFINE_CONTROL_GUID( \ + ViGEmBusTraceGuid, (c5ce18fe,27bd,4049,b0b4,8a47cab1dcd9), \ + \ + WPP_DEFINE_BIT(MYDRIVER_ALL_INFO) \ + WPP_DEFINE_BIT(TRACE_BUSENUM) \ + WPP_DEFINE_BIT(TRACE_BUSPDO) \ + WPP_DEFINE_BIT(TRACE_BYTEARRAY) \ + WPP_DEFINE_BIT(TRACE_DRIVER) \ + WPP_DEFINE_BIT(TRACE_DS4) \ + WPP_DEFINE_BIT(TRACE_QUEUE) \ + WPP_DEFINE_BIT(TRACE_USBPDO) \ + WPP_DEFINE_BIT(TRACE_UTIL) \ + WPP_DEFINE_BIT(TRACE_XGIP) \ + WPP_DEFINE_BIT(TRACE_XUSB) \ + ) + +#define WPP_FLAG_LEVEL_LOGGER(flag, level) \ + WPP_LEVEL_LOGGER(flag) + +#define WPP_FLAG_LEVEL_ENABLED(flag, level) \ + (WPP_LEVEL_ENABLED(flag) && \ + WPP_CONTROL(WPP_BIT_ ## flag).Level >= level) + +#define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) \ + WPP_LEVEL_LOGGER(flags) + +#define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) \ + (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level >= lvl) + +// +// This comment block is scanned by the trace preprocessor to define our +// Trace function. +// +// begin_wpp config +// FUNC Trace{FLAG=MYDRIVER_ALL_INFO}(LEVEL, MSG, ...); +// FUNC TraceEvents(LEVEL, FLAGS, MSG, ...); +// end_wpp +// From 6ffe3a0d68d6930336ae05e19095e9201c45690b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 14:33:46 +0200 Subject: [PATCH 02/52] Added tracing macro header files --- sys/ByteArray.c | 2 ++ sys/Ds4.c | 1 + sys/Queue.c | 1 + sys/buspdo.c | 1 + sys/usbpdo.c | 1 + sys/util.c | 1 + sys/xgip.c | 1 + sys/xusb.c | 1 + 8 files changed, 9 insertions(+) diff --git a/sys/ByteArray.c b/sys/ByteArray.c index 5968db5..0a00e7d 100644 --- a/sys/ByteArray.c +++ b/sys/ByteArray.c @@ -1,4 +1,6 @@ #include "ByteArray.h" +#include "trace.h" +#include "bytearray.tmh" // // Helpers diff --git a/sys/Ds4.c b/sys/Ds4.c index 027ee2a..c312947 100644 --- a/sys/Ds4.c +++ b/sys/Ds4.c @@ -25,6 +25,7 @@ SOFTWARE. #include "busenum.h" #include +#include "ds4.tmh" NTSTATUS Ds4_PreparePdo(PWDFDEVICE_INIT DeviceInit, PUNICODE_STRING DeviceId, PUNICODE_STRING DeviceDescription) { diff --git a/sys/Queue.c b/sys/Queue.c index 08f211e..05a1e25 100644 --- a/sys/Queue.c +++ b/sys/Queue.c @@ -24,6 +24,7 @@ SOFTWARE. #include "busenum.h" +#include "queue.tmh" #ifdef ALLOC_PRAGMA #pragma alloc_text (PAGE, Bus_EvtIoDefault) diff --git a/sys/buspdo.c b/sys/buspdo.c index 108245d..bd5663a 100644 --- a/sys/buspdo.c +++ b/sys/buspdo.c @@ -26,6 +26,7 @@ SOFTWARE. #include "busenum.h" #include #include +#include "buspdo.tmh" #ifdef ALLOC_PRAGMA #pragma alloc_text(PAGE, Bus_CreatePdo) diff --git a/sys/usbpdo.c b/sys/usbpdo.c index 7311007..cacce60 100644 --- a/sys/usbpdo.c +++ b/sys/usbpdo.c @@ -24,6 +24,7 @@ SOFTWARE. #include "busenum.h" +#include "usbpdo.tmh" // diff --git a/sys/util.c b/sys/util.c index 0d6b7bc..3ebc372 100644 --- a/sys/util.c +++ b/sys/util.c @@ -25,6 +25,7 @@ SOFTWARE. #include #include "busenum.h" +#include "util.tmh" VOID ReverseByteArray(PUCHAR Array, INT Length) diff --git a/sys/xgip.c b/sys/xgip.c index 6c42d3f..b113bd9 100644 --- a/sys/xgip.c +++ b/sys/xgip.c @@ -24,6 +24,7 @@ SOFTWARE. #include "busenum.h" +#include "xgip.tmh" NTSTATUS Xgip_PreparePdo(PWDFDEVICE_INIT DeviceInit, PUNICODE_STRING DeviceId, PUNICODE_STRING DeviceDescription) { diff --git a/sys/xusb.c b/sys/xusb.c index 7bda9e0..90e5a70 100644 --- a/sys/xusb.c +++ b/sys/xusb.c @@ -24,6 +24,7 @@ SOFTWARE. #include "busenum.h" +#include "xusb.tmh" NTSTATUS Xusb_PreparePdo( PWDFDEVICE_INIT DeviceInit, From cbf3d2d186b92ecb845e7b7bd392a97d977c5317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 15:10:22 +0200 Subject: [PATCH 03/52] Converted Bus_PlugInDevice --- sys/busenum.c | 79 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 69 insertions(+), 10 deletions(-) diff --git a/sys/busenum.c b/sys/busenum.c index d401ee3..d960eec 100644 --- a/sys/busenum.c +++ b/sys/busenum.c @@ -57,24 +57,33 @@ NTSTATUS Bus_PlugInDevice( PAGED_CODE(); + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSENUM, "%!FUNC! Entry"); + pFdoData = FdoGetData(Device); status = WdfRequestRetrieveInputBuffer(Request, sizeof(VIGEM_PLUGIN_TARGET), (PVOID)&plugIn, &length); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRequestRetrieveInputBuffer failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "WdfRequestRetrieveInputBuffer failed with status %!STATUS!", status); return status; } if ((sizeof(VIGEM_PLUGIN_TARGET) != plugIn->Size) || (length != plugIn->Size)) { - KdPrint((DRIVERNAME "Input buffer size mismatch")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "sizeof(VIGEM_PLUGIN_TARGET) buffer size mismatch [%d != %d]", + sizeof(VIGEM_PLUGIN_TARGET), plugIn->Size); return STATUS_INVALID_PARAMETER; } if (plugIn->SerialNo == 0) { - KdPrint((DRIVERNAME "Serial no. 0 not allowed")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "Serial no. 0 not allowed"); return STATUS_INVALID_PARAMETER; } @@ -83,14 +92,20 @@ NTSTATUS Bus_PlugInDevice( fileObject = WdfRequestGetFileObject(Request); if (fileObject == NULL) { - KdPrint((DRIVERNAME "File object associated with request is null")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "WdfRequestGetFileObject failed to fetch WDFFILEOBJECT from request 0x%p", + Request); return STATUS_INVALID_PARAMETER; } pFileData = FileObjectGetData(fileObject); if (pFileData == NULL) { - KdPrint((DRIVERNAME "File object context associated with request is null")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "FileObjectGetData failed to get context data for 0x%p", + fileObject); return STATUS_INVALID_PARAMETER; } @@ -142,22 +157,49 @@ NTSTATUS Bus_PlugInDevice( description.ProductId = plugIn->ProductId; } + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "New PDO properties: serial = %d, type = %d, pid = %d, session = %d, internal = %d, vid = 0x%X, pid = 0x%X", + description.SerialNo, + description.TargetType, + description.OwnerProcessId, + description.SessionId, + description.OwnerIsDriver, + description.VendorId, + description.ProductId + ); + WdfSpinLockAcquire(pFdoData->PendingPluginRequestsLock); - KdPrint((DRIVERNAME "Items count: %d\n", WdfCollectionGetCount(pFdoData->PendingPluginRequests))); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "Current pending requests count: %d", + WdfCollectionGetCount(pFdoData->PendingPluginRequests)); status = WdfChildListAddOrUpdateChildDescriptionAsPresent(WdfFdoGetDefaultChildList(Device), &description.Header, NULL); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfChildListAddOrUpdateChildDescriptionAsPresent failed with 0x%X\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "WdfChildListAddOrUpdateChildDescriptionAsPresent failed with status %!STATUS!", + status); goto pluginEnd; } + // + // The requested serial number is already in use + // if (status == STATUS_OBJECT_NAME_EXISTS) { status = STATUS_INVALID_PARAMETER; + + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "The described PDO already exists (%!STATUS!)", + status); + goto pluginEnd; } @@ -169,7 +211,10 @@ NTSTATUS Bus_PlugInDevice( status = WdfObjectAllocateContext(Request, &requestAttribs, (PVOID)&pReqData); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfCollectionAdd failed with 0x%X\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "WdfObjectAllocateContext failed with status %!STATUS!", + status); goto pluginEnd; } @@ -185,18 +230,32 @@ NTSTATUS Bus_PlugInDevice( status = WdfCollectionAdd(pFdoData->PendingPluginRequests, Request); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfCollectionAdd failed with 0x%X\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "WdfCollectionAdd failed with status %!STATUS!", + status); goto pluginEnd; } - KdPrint((DRIVERNAME "Added item with serial: %d\n", plugIn->SerialNo)); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_BUSENUM, + "Added item with serial: %d", + plugIn->SerialNo); status = NT_SUCCESS(status) ? STATUS_PENDING : status; + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_BUSENUM, + "Status before releasing lock: %!STATUS!", + status); + pluginEnd: WdfSpinLockRelease(pFdoData->PendingPluginRequestsLock); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSENUM, "%!FUNC! Exit with status %!STATUS!", status); + return status; } From 7ed7887540c9d9236aeb30201a17f2be65792d38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 15:21:46 +0200 Subject: [PATCH 04/52] Converted Bus_UnPlugDevice --- sys/busenum.c | 56 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/sys/busenum.c b/sys/busenum.c index d960eec..a930599 100644 --- a/sys/busenum.c +++ b/sys/busenum.c @@ -282,19 +282,25 @@ NTSTATUS Bus_UnPlugDevice( PAGED_CODE(); - KdPrint((DRIVERNAME "Entered Bus_UnPlugDevice\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSENUM, "%!FUNC! Entry"); status = WdfRequestRetrieveInputBuffer(Request, sizeof(VIGEM_UNPLUG_TARGET), (PVOID)&unPlug, &length); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "Bus_UnPlugDevice: WdfRequestRetrieveInputBuffer failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "WdfRequestRetrieveInputBuffer failed with status %!STATUS!", + status); return status; } if ((sizeof(VIGEM_UNPLUG_TARGET) != unPlug->Size) || (length != unPlug->Size)) { - KdPrint((DRIVERNAME "Bus_UnPlugDevice: Input buffer size mismatch")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "sizeof(VIGEM_UNPLUG_TARGET) buffer size mismatch [%d != %d]", + sizeof(VIGEM_UNPLUG_TARGET), unPlug->Size); return STATUS_INVALID_PARAMETER; } @@ -306,18 +312,28 @@ NTSTATUS Bus_UnPlugDevice( fileObject = WdfRequestGetFileObject(Request); if (fileObject == NULL) { - KdPrint((DRIVERNAME "Bus_UnPlugDevice: File object associated with request is null")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "WdfRequestGetFileObject failed to fetch WDFFILEOBJECT from request 0x%p", + Request); return STATUS_INVALID_PARAMETER; } pFileData = FileObjectGetData(fileObject); if (pFileData == NULL) { - KdPrint((DRIVERNAME "Bus_UnPlugDevice: File object context associated with request is null")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "FileObjectGetData failed to get context data for 0x%p", + fileObject); return STATUS_INVALID_PARAMETER; } } + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "Starting child list traversal"); + list = WdfFdoGetDefaultChildList(Device); WDF_CHILD_LIST_ITERATOR_INIT(&iterator, WdfRetrievePresentChildren); @@ -334,21 +350,40 @@ NTSTATUS Bus_UnPlugDevice( // Error or no more children, end loop if (!NT_SUCCESS(status) || status == STATUS_NO_MORE_ENTRIES) { + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "WdfChildListRetrieveNextDevice returned with status %!STATUS!", + status); break; } // If unable to retrieve device if (childInfo.Status != WdfChildListRetrieveDeviceSuccess) { + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "childInfo.Status = %d", + childInfo.Status); continue; } // Child isn't the one we looked for, skip if (!unplugAll && description.SerialNo != unPlug->SerialNo) { + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "Seeking serial mismatch: %d != %d", + description.SerialNo, + unPlug->SerialNo); continue; } + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "description.SessionId = %d, pFileData->SessionId = %d", + description.SessionId, + pFileData->SessionId); + // Only unplug owned children if (IsInternal || description.SessionId == pFileData->SessionId) { @@ -356,13 +391,22 @@ NTSTATUS Bus_UnPlugDevice( status = WdfChildListUpdateChildDescriptionAsMissing(list, &description.Header); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "Bus_UnPlugDevice: WdfChildListUpdateChildDescriptionAsMissing failed with status 0x%X\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "WdfChildListUpdateChildDescriptionAsMissing failed with status %!STATUS!", + status); } } } WdfChildListEndIteration(list, &iterator); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "Finished child list traversal"); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSENUM, "%!FUNC! Exit with status %!STATUS!", STATUS_SUCCESS); + return STATUS_SUCCESS; } From 6353dbfe3a920b6c536ebd198fb961ac2707408f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 15:32:21 +0200 Subject: [PATCH 05/52] Converted Bus_QueueNotification --- sys/busenum.c | 55 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/sys/busenum.c b/sys/busenum.c index a930599..3e27605 100644 --- a/sys/busenum.c +++ b/sys/busenum.c @@ -350,8 +350,8 @@ NTSTATUS Bus_UnPlugDevice( // Error or no more children, end loop if (!NT_SUCCESS(status) || status == STATUS_NO_MORE_ENTRIES) { - TraceEvents(TRACE_LEVEL_VERBOSE, - TRACE_BUSENUM, + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, "WdfChildListRetrieveNextDevice returned with status %!STATUS!", status); break; @@ -415,6 +415,8 @@ NTSTATUS Bus_UnPlugDevice( // NTSTATUS Bus_XusbSubmitReport(WDFDEVICE Device, ULONG SerialNo, PXUSB_SUBMIT_REPORT Report, BOOLEAN FromInterface) { + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSENUM, "%!FUNC! Entry"); + return Bus_SubmitReport(Device, SerialNo, Report, FromInterface); } @@ -430,14 +432,17 @@ NTSTATUS Bus_QueueNotification(WDFDEVICE Device, ULONG SerialNo, WDFREQUEST Requ PDS4_DEVICE_DATA ds4Data; - KdPrint((DRIVERNAME "Entered Bus_QueueNotification\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSENUM, "%!FUNC! Entry"); hChild = Bus_GetPdo(Device, SerialNo); // Validate child if (hChild == NULL) { - KdPrint((DRIVERNAME "Bus_QueueNotification: PDO with serial %d not found\n", SerialNo)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "Bus_GetPdo: PDO with serial %d not found", + SerialNo); return STATUS_NO_SUCH_DEVICE; } @@ -445,14 +450,20 @@ NTSTATUS Bus_QueueNotification(WDFDEVICE Device, ULONG SerialNo, WDFREQUEST Requ pdoData = PdoGetData(hChild); if (pdoData == NULL) { - KdPrint((DRIVERNAME "Bus_QueueNotification: PDO context not found\n")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "PdoGetData failed"); return STATUS_INVALID_PARAMETER; } // Check if caller owns this PDO if (!IS_OWNER(pdoData)) { - KdPrint((DRIVERNAME "Bus_QueueNotification: PID mismatch: %d != %d\n", pdoData->OwnerProcessId, CURRENT_PROCESS_ID())); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "PDO & Request ownership mismatch: %d != %d", + pdoData->OwnerProcessId, + CURRENT_PROCESS_ID()); return STATUS_ACCESS_DENIED; } @@ -463,7 +474,13 @@ NTSTATUS Bus_QueueNotification(WDFDEVICE Device, ULONG SerialNo, WDFREQUEST Requ xusbData = XusbGetData(hChild); - if (xusbData == NULL) break; + if (xusbData == NULL) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "XusbGetData failed"); + break; + } status = WdfRequestForwardToIoQueue(Request, pdoData->PendingNotificationRequests); @@ -472,22 +489,40 @@ NTSTATUS Bus_QueueNotification(WDFDEVICE Device, ULONG SerialNo, WDFREQUEST Requ ds4Data = Ds4GetData(hChild); - if (ds4Data == NULL) break; + if (ds4Data == NULL) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "Ds4GetData failed"); + break; + } status = WdfRequestForwardToIoQueue(Request, pdoData->PendingNotificationRequests); break; default: status = STATUS_NOT_SUPPORTED; + TraceEvents(TRACE_LEVEL_WARNING, + TRACE_BUSENUM, + "Unknown target type: %d (%!STATUS!)", + pdoData->TargetType, + status); break; } if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRequestForwardToIoQueue failed with status 0x%X\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "WdfRequestForwardToIoQueue failed with status %!STATUS!", + status); } - return (NT_SUCCESS(status)) ? STATUS_PENDING : status; + status = (NT_SUCCESS(status)) ? STATUS_PENDING : status; + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSENUM, "%!FUNC! Exit with status %!STATUS!", status); + + return status; } // From 815f05e08edcc16a18dea78927b8b26784d8339a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 15:43:10 +0200 Subject: [PATCH 06/52] Converted Bus_SubmitReport --- sys/busenum.c | 47 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/sys/busenum.c b/sys/busenum.c index 3e27605..fae020b 100644 --- a/sys/busenum.c +++ b/sys/busenum.c @@ -530,16 +530,22 @@ NTSTATUS Bus_QueueNotification(WDFDEVICE Device, ULONG SerialNo, WDFREQUEST Requ // NTSTATUS Bus_Ds4SubmitReport(WDFDEVICE Device, ULONG SerialNo, PDS4_SUBMIT_REPORT Report, BOOLEAN FromInterface) { + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSENUM, "%!FUNC! Entry"); + return Bus_SubmitReport(Device, SerialNo, Report, FromInterface); } NTSTATUS Bus_XgipSubmitReport(WDFDEVICE Device, ULONG SerialNo, PXGIP_SUBMIT_REPORT Report, BOOLEAN FromInterface) { + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSENUM, "%!FUNC! Entry"); + return Bus_SubmitReport(Device, SerialNo, Report, FromInterface); } NTSTATUS Bus_XgipSubmitInterrupt(WDFDEVICE Device, ULONG SerialNo, PXGIP_SUBMIT_INTERRUPT Report, BOOLEAN FromInterface) { + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSENUM, "%!FUNC! Entry"); + return Bus_SubmitReport(Device, SerialNo, Report, FromInterface); } @@ -571,14 +577,17 @@ NTSTATUS Bus_SubmitReport(WDFDEVICE Device, ULONG SerialNo, PVOID Report, BOOLEA BOOLEAN changed; - KdPrint((DRIVERNAME "Entered Bus_SubmitReport\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSENUM, "%!FUNC! Entry"); hChild = Bus_GetPdo(Device, SerialNo); // Validate child if (hChild == NULL) { - KdPrint((DRIVERNAME "Bus_SubmitReport: PDO with serial %d not found\n", SerialNo)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "Bus_GetPdo: PDO with serial %d not found", + SerialNo); return STATUS_NO_SUCH_DEVICE; } @@ -586,14 +595,20 @@ NTSTATUS Bus_SubmitReport(WDFDEVICE Device, ULONG SerialNo, PVOID Report, BOOLEA pdoData = PdoGetData(hChild); if (pdoData == NULL) { - KdPrint((DRIVERNAME "Bus_SubmitReport: PDO context not found\n")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "PdoGetData failed"); return STATUS_INVALID_PARAMETER; } // Check if caller owns this PDO if (!FromInterface && !IS_OWNER(pdoData)) { - KdPrint((DRIVERNAME "Bus_SubmitReport: PID mismatch: %d != %d\n", pdoData->OwnerProcessId, CURRENT_PROCESS_ID())); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSENUM, + "PDO & Request ownership mismatch: %d != %d", + pdoData->OwnerProcessId, + CURRENT_PROCESS_ID()); return STATUS_ACCESS_DENIED; } @@ -627,9 +642,17 @@ NTSTATUS Bus_SubmitReport(WDFDEVICE Device, ULONG SerialNo, PVOID Report, BOOLEA // Don't waste pending IRP if input hasn't changed if (!changed) + { + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "Input report hasn't changed since last update, aborting with %!STATUS!", + status); return status; + } - KdPrint((DRIVERNAME "Bus_SubmitReport: received new report\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "Received new report, processing"); // Get pending USB request switch (pdoData->TargetType) @@ -701,6 +724,13 @@ NTSTATUS Bus_SubmitReport(WDFDEVICE Device, ULONG SerialNo, PVOID Report, BOOLEA default: status = STATUS_NOT_SUPPORTED; + + TraceEvents(TRACE_LEVEL_WARNING, + TRACE_BUSENUM, + "Unknown target type: %d (%!STATUS!)", + pdoData->TargetType, + status); + goto endSubmitReport; } @@ -709,7 +739,9 @@ NTSTATUS Bus_SubmitReport(WDFDEVICE Device, ULONG SerialNo, PVOID Report, BOOLEA else if (!NT_SUCCESS(status)) goto endSubmitReport; - KdPrint((DRIVERNAME "Bus_SubmitReport: pending IRP found\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSENUM, + "Processing pending IRP"); // Get pending IRP pendingIrp = WdfRequestWdmGetIrp(usbRequest); @@ -772,6 +804,9 @@ NTSTATUS Bus_SubmitReport(WDFDEVICE Device, ULONG SerialNo, PVOID Report, BOOLEA WdfRequestComplete(usbRequest, status); endSubmitReport: + + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSENUM, "%!FUNC! Exit with status %!STATUS!", status); + return status; } From 6d8cda988facdeeee9259e45e160d969b11c602e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 16:40:23 +0200 Subject: [PATCH 07/52] Converted Bus_CreatePdo Fixed formatting --- sys/busenum.c | 2 +- sys/buspdo.c | 113 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 99 insertions(+), 16 deletions(-) diff --git a/sys/busenum.c b/sys/busenum.c index fae020b..217981c 100644 --- a/sys/busenum.c +++ b/sys/busenum.c @@ -159,7 +159,7 @@ NTSTATUS Bus_PlugInDevice( TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSENUM, - "New PDO properties: serial = %d, type = %d, pid = %d, session = %d, internal = %d, vid = 0x%X, pid = 0x%X", + "New PDO properties: serial = %d, type = %d, pid = %d, session = %d, internal = %d, vid = 0x%04X, pid = 0x%04X", description.SerialNo, description.TargetType, description.OwnerProcessId, diff --git a/sys/buspdo.c b/sys/buspdo.c index bd5663a..9829989 100644 --- a/sys/buspdo.c +++ b/sys/buspdo.c @@ -102,7 +102,7 @@ NTSTATUS Bus_CreatePdo( PAGED_CODE(); - KdPrint((DRIVERNAME "Entered Bus_CreatePdo\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry"); // // Get the FDO interface ASAP to report progress to bus @@ -115,7 +115,10 @@ NTSTATUS Bus_CreatePdo( NULL); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfFdoQueryForInterface failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfFdoQueryForInterface failed with status %!STATUS!", + status); return status; } @@ -129,7 +132,10 @@ NTSTATUS Bus_CreatePdo( status = WdfPdoInitAssignRawDevice(DeviceInit, &GUID_DEVCLASS_VIGEM_RAWPDO); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfPdoInitAssignRawDevice failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfPdoInitAssignRawDevice failed with status %!STATUS!", + status); goto endCreatePdo; } @@ -138,7 +144,10 @@ NTSTATUS Bus_CreatePdo( status = WdfDeviceInitAssignSDDLString(DeviceInit, &SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_RWX_RES_RWX); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfDeviceInitAssignSDDLString failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfDeviceInitAssignSDDLString failed with status %!STATUS!", + status); goto endCreatePdo; } @@ -192,30 +201,60 @@ NTSTATUS Bus_CreatePdo( default: - KdPrint((DRIVERNAME "Unsupported target type\n")); status = STATUS_INVALID_PARAMETER; + + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "Unknown target type: %d (%!STATUS!)", + Description->TargetType, + status); + goto endCreatePdo; } // set device id status = WdfPdoInitAssignDeviceID(DeviceInit, &deviceId); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfPdoInitAssignDeviceID failed with status %!STATUS!", + status); goto endCreatePdo; + } // prepare instance id status = RtlUnicodeStringPrintf(&buffer, L"%02d", Description->SerialNo); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "RtlUnicodeStringPrintf failed with status %!STATUS!", + status); goto endCreatePdo; + } // set instance id status = WdfPdoInitAssignInstanceID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfPdoInitAssignInstanceID failed with status %!STATUS!", + status); goto endCreatePdo; + } // set device description (for English operating systems) status = WdfPdoInitAddDeviceText(DeviceInit, &deviceDescription, &deviceLocation, 0x409); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfPdoInitAddDeviceText failed with status %!STATUS!", + status); goto endCreatePdo; + } // default locale is English // TODO: add more locales @@ -243,9 +282,18 @@ NTSTATUS Bus_CreatePdo( status = WdfDeviceCreate(&DeviceInit, &pdoAttributes, &hChild); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfDeviceCreate failed with status %!STATUS!", + status); goto endCreatePdo; + } - KdPrint((DRIVERNAME "Created PDO: 0x%X\n", hChild)); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + "Created PDO 0x%p", + hChild); switch (Description->TargetType) { @@ -258,7 +306,10 @@ NTSTATUS Bus_CreatePdo( status = WdfObjectAllocateContext(hChild, &pdoAttributes, (PVOID)&xusbData); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfObjectAllocateContext failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfObjectAllocateContext failed with status %!STATUS!", + status); goto endCreatePdo; } @@ -272,7 +323,10 @@ NTSTATUS Bus_CreatePdo( status = WdfObjectAllocateContext(hChild, &pdoAttributes, (PVOID)&ds4Data); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfObjectAllocateContext failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfObjectAllocateContext failed with status %!STATUS!", + status); goto endCreatePdo; } @@ -286,7 +340,10 @@ NTSTATUS Bus_CreatePdo( status = WdfObjectAllocateContext(hChild, &pdoAttributes, (PVOID)&xgipData); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfObjectAllocateContext failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfObjectAllocateContext failed with status %!STATUS!", + status); goto endCreatePdo; } @@ -303,7 +360,10 @@ NTSTATUS Bus_CreatePdo( status = WdfDeviceCreateDeviceInterface(Device, (LPGUID)&GUID_DEVINTERFACE_USB_DEVICE, NULL); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfDeviceCreateDeviceInterface failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfDeviceCreateDeviceInterface failed with status %!STATUS!", + status); goto endCreatePdo; } @@ -321,6 +381,15 @@ NTSTATUS Bus_CreatePdo( pdoData->VendorId = Description->VendorId; pdoData->ProductId = Description->ProductId; + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + "PDO Context properties: serial = %d, type = %d, pid = %d, vid = 0x%04X, pid = 0x%04X", + pdoData->SerialNo, + pdoData->TargetType, + pdoData->OwnerProcessId, + pdoData->VendorId, + pdoData->ProductId); + // Initialize additional contexts (if available) switch (Description->TargetType) { @@ -365,7 +434,10 @@ NTSTATUS Bus_CreatePdo( status = WdfIoQueueCreate(Device, &usbInQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &pdoData->PendingUsbInRequests); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfIoQueueCreate (PendingUsbInRequests) failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfIoQueueCreate (PendingUsbInRequests) failed with status %!STATUS!", + status); goto endCreatePdo; } @@ -375,7 +447,10 @@ NTSTATUS Bus_CreatePdo( status = WdfIoQueueCreate(Device, ¬ificationsQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &pdoData->PendingNotificationRequests); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfIoQueueCreate (PendingNotificationRequests) failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfIoQueueCreate (PendingNotificationRequests) failed with status %!STATUS!", + status); goto endCreatePdo; } @@ -390,7 +465,10 @@ NTSTATUS Bus_CreatePdo( status = WdfIoQueueCreate(hChild, &defaultPdoQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &defaultPdoQueue); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfIoQueueCreate failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "WdfIoQueueCreate (Default) failed with status %!STATUS!", + status); goto endCreatePdo; } @@ -431,10 +509,15 @@ NTSTATUS Bus_CreatePdo( #pragma endregion endCreatePdo: - KdPrint((DRIVERNAME "BUS_PDO_REPORT_STAGE_RESULT Stage: ViGEmPdoCreate, Serial: 0x%X, Status: 0x%X (%d)\n", - Description->SerialNo, status, NT_SUCCESS(status))); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_BUSPDO, + "BUS_PDO_REPORT_STAGE_RESULT Stage: ViGEmPdoCreate [serial: %d, status: %!STATUS!]", + Description->SerialNo, status); BUS_PDO_REPORT_STAGE_RESULT(busInterface, ViGEmPdoCreate, Description->SerialNo, status); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSPDO, "%!FUNC! Exit with status %!STATUS!", status); + return status; } From 734316d9ce396d46a35c05af59f5f21625309bfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 16:46:08 +0200 Subject: [PATCH 08/52] Converted Bus_EvtDevicePrepareHardware --- sys/buspdo.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sys/buspdo.c b/sys/buspdo.c index 9829989..b3f1cd5 100644 --- a/sys/buspdo.c +++ b/sys/buspdo.c @@ -538,7 +538,7 @@ NTSTATUS Bus_EvtDevicePrepareHardware( UNREFERENCED_PARAMETER(ResourcesRaw); UNREFERENCED_PARAMETER(ResourcesTranslated); - KdPrint((DRIVERNAME "Bus_EvtDevicePrepareHardware: 0x%p\n", Device)); + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSENUM, "%!FUNC! Entry"); pdoData = PdoGetData(Device); @@ -567,8 +567,15 @@ NTSTATUS Bus_EvtDevicePrepareHardware( break; } + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_BUSPDO, + "BUS_PDO_REPORT_STAGE_RESULT Stage: ViGEmPdoCreate [serial: %d, status: %!STATUS!]", + pdoData->SerialNo, status); + BUS_PDO_REPORT_STAGE_RESULT(pdoData->BusInterface, ViGEmPdoPrepareHardware, pdoData->SerialNo, status); + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSPDO, "%!FUNC! Exit with status %!STATUS!", status); + return status; } From 7167fe3d28148fd2ff6018ea484b767466c9b1f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 17:00:09 +0200 Subject: [PATCH 09/52] Converted Pdo_EvtIoInternalDeviceControl Added missing pageable definition --- sys/Driver.c | 1 + sys/buspdo.c | 109 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 86 insertions(+), 24 deletions(-) diff --git a/sys/Driver.c b/sys/Driver.c index 8a8887a..bff937d 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -32,6 +32,7 @@ SOFTWARE. #pragma alloc_text (PAGE, Bus_EvtDeviceAdd) #pragma alloc_text (PAGE, Bus_DeviceFileCreate) #pragma alloc_text (PAGE, Bus_FileClose) +#pragma alloc_text (PAGE, Bus_EvtDriverContextCleanup) #pragma alloc_text (PAGE, Bus_PdoStageResult) #endif diff --git a/sys/buspdo.c b/sys/buspdo.c index b3f1cd5..6955abd 100644 --- a/sys/buspdo.c +++ b/sys/buspdo.c @@ -601,6 +601,9 @@ VOID Pdo_EvtIoInternalDeviceControl( PPDO_DEVICE_DATA pdoData; PIO_STACK_LOCATION irpStack; + + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSPDO, "%!FUNC! Entry"); + hDevice = WdfIoQueueGetDevice(Queue); pdoData = PdoGetData(hDevice); // No help from the framework available from here on @@ -611,7 +614,9 @@ VOID Pdo_EvtIoInternalDeviceControl( { case IOCTL_INTERNAL_USB_SUBMIT_URB: - KdPrint((DRIVERNAME ">> IOCTL_INTERNAL_USB_SUBMIT_URB\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> IOCTL_INTERNAL_USB_SUBMIT_URB"); urb = (PURB)URB_FROM_IRP(irp); @@ -619,7 +624,9 @@ VOID Pdo_EvtIoInternalDeviceControl( { case URB_FUNCTION_CONTROL_TRANSFER: - KdPrint((DRIVERNAME ">> >> URB_FUNCTION_CONTROL_TRANSFER\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> URB_FUNCTION_CONTROL_TRANSFER"); switch (urb->UrbControlTransfer.SetupPacket[6]) { @@ -655,7 +662,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case URB_FUNCTION_CONTROL_TRANSFER_EX: - KdPrint((DRIVERNAME ">> >> URB_FUNCTION_CONTROL_TRANSFER_EX\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> URB_FUNCTION_CONTROL_TRANSFER_EX"); status = STATUS_UNSUCCESSFUL; @@ -663,7 +672,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: - KdPrint((DRIVERNAME ">> >> URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER"); status = UsbPdo_BulkOrInterruptTransfer(urb, hDevice, Request); @@ -671,7 +682,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case URB_FUNCTION_SELECT_CONFIGURATION: - KdPrint((DRIVERNAME ">> >> URB_FUNCTION_SELECT_CONFIGURATION\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> URB_FUNCTION_SELECT_CONFIGURATION"); status = UsbPdo_SelectConfiguration(urb, pdoData); @@ -679,7 +692,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case URB_FUNCTION_SELECT_INTERFACE: - KdPrint((DRIVERNAME ">> >> URB_FUNCTION_SELECT_INTERFACE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> URB_FUNCTION_SELECT_INTERFACE"); status = UsbPdo_SelectInterface(urb, pdoData); @@ -687,13 +702,17 @@ VOID Pdo_EvtIoInternalDeviceControl( case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE: - KdPrint((DRIVERNAME ">> >> URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE"); switch (urb->UrbControlDescriptorRequest.DescriptorType) { case USB_DEVICE_DESCRIPTOR_TYPE: - KdPrint((DRIVERNAME ">> >> >> USB_DEVICE_DESCRIPTOR_TYPE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> >> USB_DEVICE_DESCRIPTOR_TYPE"); status = UsbPdo_GetDeviceDescriptorType(urb, pdoData); @@ -701,7 +720,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case USB_CONFIGURATION_DESCRIPTOR_TYPE: - KdPrint((DRIVERNAME ">> >> >> USB_CONFIGURATION_DESCRIPTOR_TYPE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> >> USB_CONFIGURATION_DESCRIPTOR_TYPE"); status = UsbPdo_GetConfigurationDescriptorType(urb, pdoData); @@ -714,7 +735,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case USB_STRING_DESCRIPTOR_TYPE: - KdPrint((DRIVERNAME ">> >> >> USB_STRING_DESCRIPTOR_TYPE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> >> USB_STRING_DESCRIPTOR_TYPE"); status = UsbPdo_GetStringDescriptorType(urb, pdoData); @@ -726,28 +749,40 @@ VOID Pdo_EvtIoInternalDeviceControl( break; case USB_INTERFACE_DESCRIPTOR_TYPE: - KdPrint((DRIVERNAME ">> >> >> USB_INTERFACE_DESCRIPTOR_TYPE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> >> USB_INTERFACE_DESCRIPTOR_TYPE"); break; case USB_ENDPOINT_DESCRIPTOR_TYPE: - KdPrint((DRIVERNAME ">> >> >> USB_ENDPOINT_DESCRIPTOR_TYPE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> >> USB_ENDPOINT_DESCRIPTOR_TYPE"); break; default: - KdPrint((DRIVERNAME ">> >> >> Unknown descriptor type\n")); + + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> >> Unknown descriptor type"); + break; } - KdPrint((DRIVERNAME "<< <<\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + "<< <<"); break; case URB_FUNCTION_GET_STATUS_FROM_DEVICE: - KdPrint((DRIVERNAME ">> >> URB_FUNCTION_GET_STATUS_FROM_DEVICE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> URB_FUNCTION_GET_STATUS_FROM_DEVICE"); // Defaults always succeed status = STATUS_SUCCESS; @@ -763,7 +798,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case URB_FUNCTION_ABORT_PIPE: - KdPrint((DRIVERNAME ">> >> URB_FUNCTION_ABORT_PIPE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> URB_FUNCTION_ABORT_PIPE"); status = UsbPdo_AbortPipe(hDevice); @@ -773,7 +810,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case URB_FUNCTION_CLASS_INTERFACE: - KdPrint((DRIVERNAME ">> >> URB_FUNCTION_CLASS_INTERFACE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> URB_FUNCTION_CLASS_INTERFACE"); status = UsbPdo_ClassInterface(urb, hDevice, pdoData); @@ -781,7 +820,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE: - KdPrint((DRIVERNAME ">> >> URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE"); status = UsbPdo_GetDescriptorFromInterface(urb, pdoData); @@ -795,17 +836,26 @@ VOID Pdo_EvtIoInternalDeviceControl( break; default: - KdPrint((DRIVERNAME ">> >> Unknown function: 0x%X\n", urb->UrbHeader.Function)); + + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> >> Unknown function: 0x%X", + urb->UrbHeader.Function); + break; } - KdPrint((DRIVERNAME "<<\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + "<<"); break; case IOCTL_INTERNAL_USB_GET_PORT_STATUS: - KdPrint((DRIVERNAME ">> IOCTL_INTERNAL_USB_GET_PORT_STATUS\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> IOCTL_INTERNAL_USB_GET_PORT_STATUS"); // We report the (virtual) port as always active *(unsigned long *)irpStack->Parameters.Others.Argument1 = USBD_PORT_ENABLED | USBD_PORT_CONNECTED; @@ -816,7 +866,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case IOCTL_INTERNAL_USB_RESET_PORT: - KdPrint((DRIVERNAME ">> IOCTL_INTERNAL_USB_RESET_PORT\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> IOCTL_INTERNAL_USB_RESET_PORT"); // Sure, why not ;) status = STATUS_SUCCESS; @@ -825,7 +877,9 @@ VOID Pdo_EvtIoInternalDeviceControl( case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION: - KdPrint((DRIVERNAME ">> IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION"); // TODO: implement // This happens if the I/O latency is too high so HIDUSB aborts communication. @@ -834,7 +888,12 @@ VOID Pdo_EvtIoInternalDeviceControl( break; default: - KdPrint((DRIVERNAME ">> Unknown I/O control code 0x%X\n", IoControlCode)); + + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_BUSPDO, + ">> Unknown I/O control code 0x%X", + IoControlCode); + break; } @@ -842,5 +901,7 @@ VOID Pdo_EvtIoInternalDeviceControl( { WdfRequestComplete(Request, status); } + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSPDO, "%!FUNC! Exit with status %!STATUS!", status); } From d00ac496b51c5815704b8cf62f157bfd894289a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 17:04:19 +0200 Subject: [PATCH 10/52] Added build information to trace log --- sys/Driver.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sys/Driver.c b/sys/Driver.c index bff937d..90abf91 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -54,6 +54,11 @@ NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING Registry // WPP_INIT_TRACING(DriverObject, RegistryPath); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DRIVER, + "Loading Virtual Gamepad Emulation Bus Driver [built: %s %s]", + __DATE__, __TIME__); + // // Register cleanup callback // From d92981e68bf5bfefd8f40d336be0a3cd6631a73b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 17:09:52 +0200 Subject: [PATCH 11/52] Converted Bus_EvtDeviceAdd --- sys/Driver.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/sys/Driver.c b/sys/Driver.c index 90abf91..b070a4a 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -101,7 +101,7 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) PAGED_CODE(); - KdPrint((DRIVERNAME "Bus_EvtDeviceAdd: 0x%p\n", Driver)); + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry"); WdfDeviceInitSetDeviceType(DeviceInit, FILE_DEVICE_BUS_EXTENDER); // More than one process may talk to the bus at the same time @@ -137,16 +137,19 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "Error creating device 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "WdfDeviceCreate failed with status %!STATUS!", + status); return status; } - KdPrint((DRIVERNAME "Created FDO: 0x%X\n", device)); - pFDOData = FdoGetData(device); if (pFDOData == NULL) { - KdPrint((DRIVERNAME "Error creating device context\n")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "FdoGetData failed"); return STATUS_UNSUCCESSFUL; } @@ -163,7 +166,10 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) status = WdfCollectionCreate(&collectionAttributes, &pFDOData->PendingPluginRequests); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfCollectionCreate failed with status 0x%X\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "WdfCollectionCreate failed with status %!STATUS!", + status); return STATUS_UNSUCCESSFUL; } @@ -173,7 +179,10 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) status = WdfSpinLockCreate(&collectionAttributes, &pFDOData->PendingPluginRequestsLock); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfSpinLockCreate failed with status 0x%X\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "WdfSpinLockCreate failed with status %!STATUS!", + status); return STATUS_UNSUCCESSFUL; } @@ -211,7 +220,10 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) &queryInterfaceConfig); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfDeviceAddQueryInterface failed 0x%0x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "WdfDeviceAddQueryInterface failed with status %!STATUS!", + status); return(status); } @@ -231,7 +243,10 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfIoQueueCreate failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "WdfIoQueueCreate failed with status %!STATUS!", + status); return status; } @@ -243,7 +258,10 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfDeviceCreateDeviceInterface failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "WdfDeviceCreateDeviceInterface failed with status %!STATUS!", + status); return status; } From ec34da1566181720d7686b3824f4bb7d2b7f8e14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 17:10:47 +0200 Subject: [PATCH 12/52] Minor fix --- sys/Driver.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/Driver.c b/sys/Driver.c index b070a4a..73bde90 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -277,6 +277,8 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) #pragma endregion + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit with status %!STATUS!", status); + return status; } From c4b25bb82d285f720824f180b40d53ebfb6a0664 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 17:15:39 +0200 Subject: [PATCH 13/52] Converted Bus_DeviceFileCreate --- sys/Driver.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/sys/Driver.c b/sys/Driver.c index 73bde90..a51aa9f 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -303,17 +303,25 @@ Bus_DeviceFileCreate( PAGED_CODE(); + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry"); + pFileData = FileObjectGetData(FileObject); + if (pFileData == NULL) { - KdPrint((DRIVERNAME "Bus_DeviceFileCreate: ERROR! File handle context not found\n")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "FileObjectGetData failed to return file object from WDFFILEOBJECT 0x%p", + FileObject); } else { pFDOData = FdoGetData(Device); if (pFDOData == NULL) { - KdPrint((DRIVERNAME "Bus_DeviceFileCreate: ERROR! FDO context not found\n")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "FdoGetData failed"); status = STATUS_NO_SUCH_DEVICE; } else @@ -324,11 +332,16 @@ Bus_DeviceFileCreate( pFileData->SessionId = sessionId; status = STATUS_SUCCESS; - KdPrint((DRIVERNAME "Bus_DeviceFileCreate: File id=%d. Device refcount=%d\n", (int)sessionId, (int)refCount)); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DRIVER, + "File/session id = %d, device ref. count = %d", + (int)sessionId, (int)refCount); } } WdfRequestComplete(Request, status); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit with status %!STATUS!", status); } // From 5c71c361bc85f84996b1b889a61f87051d394211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 17:23:47 +0200 Subject: [PATCH 14/52] Converted Bus_FileClose --- sys/Driver.c | 46 +++++++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/sys/Driver.c b/sys/Driver.c index a51aa9f..5b4877c 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -56,7 +56,7 @@ NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING Registry TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, - "Loading Virtual Gamepad Emulation Bus Driver [built: %s %s]", + "Loading Virtual Gamepad Emulation Bus Driver [built: %s %s]", __DATE__, __TIME__); // @@ -366,13 +366,17 @@ Bus_FileClose( PAGED_CODE(); - KdPrint((DRIVERNAME "Bus_FileClose called\n")); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry"); // Check common context pFileData = FileObjectGetData(FileObject); if (pFileData == NULL) { - KdPrint((DRIVERNAME "Bus_FileClose: ERROR! File handle context not found\n")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "FileObjectGetData failed to return file object from WDFFILEOBJECT 0x%p", + FileObject); return; } @@ -381,14 +385,19 @@ Bus_FileClose( pFDOData = FdoGetData(device); if (pFDOData == NULL) { - KdPrint((DRIVERNAME "Bus_FileClose: ERROR! FDO context not found\n")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "FdoGetData failed"); status = STATUS_NO_SUCH_DEVICE; } else { refCount = InterlockedDecrement(&pFDOData->InterfaceReferenceCounter); - KdPrint((DRIVERNAME "Bus_FileClose: Device refcount=%d\n", (int)refCount)); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DRIVER, + "Device ref. count = %d", + (int)refCount); } list = WdfFdoGetDefaultChildList(device); @@ -408,37 +417,48 @@ Bus_FileClose( break; } - KdPrint((DRIVERNAME "Bus_FileClose enumerate: status=%d devicePID=%d currentPID=%d fileSessionId=%d deviceSessionId=%d ownerIsDriver=%d\n", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_DRIVER, + "PDO properties: status = %!STATUS!, pdoPID = %d, curPID = %d, pdoSID = %d, curSID = %d, internal = %d", (int)childInfo.Status, (int)description.OwnerProcessId, (int)CURRENT_PROCESS_ID(), - (int)pFileData->SessionId, (int)description.SessionId, - (int)description.OwnerIsDriver)); + (int)pFileData->SessionId, + (int)description.OwnerIsDriver + ); // Only unplug devices with matching session id if (childInfo.Status == WdfChildListRetrieveDeviceSuccess && description.SessionId == pFileData->SessionId && !description.OwnerIsDriver) { - KdPrint((DRIVERNAME "Bus_FileClose unplugging\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DRIVER, + "Unplugging device with serial %d", + description.SerialNo); // "Unplug" child status = WdfChildListUpdateChildDescriptionAsMissing(list, &description.Header); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfChildListUpdateChildDescriptionAsMissing failed with status 0x%X\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "WdfChildListUpdateChildDescriptionAsMissing failed with status %!STATUS!", + status); } } } WdfChildListEndIteration(list, &iterator); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit with status %!STATUS!", status); } VOID Bus_EvtDriverContextCleanup( _In_ WDFOBJECT DriverObject - ) +) /*++ Routine Description: @@ -456,14 +476,14 @@ Return Value: { UNREFERENCED_PARAMETER(DriverObject); - PAGED_CODE (); + PAGED_CODE(); TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry"); // // Stop WPP Tracing // - WPP_CLEANUP( WdfDriverWdmGetDriverObject( (WDFDRIVER) DriverObject) ); + WPP_CLEANUP(WdfDriverWdmGetDriverObject((WDFDRIVER)DriverObject)); } From cd523a62f335fd23ae334ef67d93b028c9df0722 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 19:33:04 +0200 Subject: [PATCH 15/52] Converted Ds4_PreparePdo --- sys/Ds4.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/sys/Ds4.c b/sys/Ds4.c index c312947..b6b6625 100644 --- a/sys/Ds4.c +++ b/sys/Ds4.c @@ -35,14 +35,26 @@ NTSTATUS Ds4_PreparePdo(PWDFDEVICE_INIT DeviceInit, PUNICODE_STRING DeviceId, PU // prepare device description status = RtlUnicodeStringInit(DeviceDescription, L"Virtual DualShock 4 Controller"); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "RtlUnicodeStringInit failed with status %!STATUS!", + status); return status; + } // Set hardware IDs RtlUnicodeStringInit(&buffer, L"USB\\VID_054C&PID_05C4&REV_0100"); status = WdfPdoInitAddHardwareID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfPdoInitAddHardwareID failed with status %!STATUS!", + status); return status; + } RtlUnicodeStringCopy(DeviceId, &buffer); @@ -50,26 +62,50 @@ NTSTATUS Ds4_PreparePdo(PWDFDEVICE_INIT DeviceInit, PUNICODE_STRING DeviceId, PU status = WdfPdoInitAddHardwareID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfPdoInitAddHardwareID failed with status %!STATUS!", + status); return status; + } // Set compatible IDs RtlUnicodeStringInit(&buffer, L"USB\\Class_03&SubClass_00&Prot_00"); status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfPdoInitAddCompatibleID (#01) failed with status %!STATUS!", + status); return status; + } RtlUnicodeStringInit(&buffer, L"USB\\Class_03&SubClass_00"); status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfPdoInitAddCompatibleID (#02) failed with status %!STATUS!", + status); return status; + } RtlUnicodeStringInit(&buffer, L"USB\\Class_03"); status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfPdoInitAddCompatibleID (#03) failed with status %!STATUS!", + status); return status; + } return STATUS_SUCCESS; } From 71308d491ad6f822a486aee11abe36874541d27b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 19:33:54 +0200 Subject: [PATCH 16/52] Converted Ds4_PrepareHardware --- sys/Ds4.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sys/Ds4.c b/sys/Ds4.c index b6b6625..b7e4acc 100644 --- a/sys/Ds4.c +++ b/sys/Ds4.c @@ -129,7 +129,10 @@ NTSTATUS Ds4_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfDeviceAddQueryInterface failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "WdfDeviceAddQueryInterface failed with status %!STATUS!", + status); return status; } From 7a9b6f597cb65f57a3f62bb7a5ba5fe97e464297 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 19:39:13 +0200 Subject: [PATCH 17/52] Converted Ds4_AssignPdoContext --- sys/Ds4.c | 78 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 18 deletions(-) diff --git a/sys/Ds4.c b/sys/Ds4.c index b7e4acc..d25d068 100644 --- a/sys/Ds4.c +++ b/sys/Ds4.c @@ -130,7 +130,7 @@ NTSTATUS Ds4_PrepareHardware(WDFDEVICE Device) if (!NT_SUCCESS(status)) { TraceEvents(TRACE_LEVEL_ERROR, - TRACE_DRIVER, + TRACE_DS4, "WdfDeviceAddQueryInterface failed with status %!STATUS!", status); return status; @@ -166,8 +166,6 @@ NTSTATUS Ds4_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION NTSTATUS status; PDS4_DEVICE_DATA ds4 = Ds4GetData(Device); - KdPrint((DRIVERNAME "Initializing DS4 context...\n")); - // Initialize periodic timer WDF_TIMER_CONFIG timerConfig; WDF_TIMER_CONFIG_INIT_PERIODIC(&timerConfig, Ds4_PendingUsbRequestsTimerFunc, DS4_QUEUE_FLUSH_PERIOD); @@ -183,7 +181,10 @@ NTSTATUS Ds4_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION status = WdfTimerCreate(&timerConfig, &timerAttribs, &ds4->PendingUsbInRequestsTimer); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfTimerCreate failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfTimerCreate failed with status %!STATUS!", + status); return status; } @@ -197,38 +198,71 @@ NTSTATUS Ds4_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION status = WdfDriverOpenParametersRegistryKey(WdfGetDriver(), STANDARD_RIGHTS_ALL, WDF_NO_OBJECT_ATTRIBUTES, &keyParams); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfDriverOpenParametersRegistryKey failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfDriverOpenParametersRegistryKey failed with status %!STATUS!", + status); return status; } RtlUnicodeStringInit(&keyName, L"Targets"); - status = WdfRegistryCreateKey(keyParams, &keyName, - KEY_ALL_ACCESS, REG_OPTION_NON_VOLATILE, NULL, WDF_NO_OBJECT_ATTRIBUTES, &keyTargets); + status = WdfRegistryCreateKey( + keyParams, + &keyName, + KEY_ALL_ACCESS, + REG_OPTION_NON_VOLATILE, + NULL, + WDF_NO_OBJECT_ATTRIBUTES, + &keyTargets + ); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRegistryCreateKey failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfRegistryCreateKey failed with status %!STATUS!", + status); return status; } RtlUnicodeStringInit(&keyName, L"DualShock"); - status = WdfRegistryCreateKey(keyTargets, &keyName, - KEY_ALL_ACCESS, REG_OPTION_NON_VOLATILE, NULL, WDF_NO_OBJECT_ATTRIBUTES, &keyDS); + status = WdfRegistryCreateKey( + keyTargets, + &keyName, + KEY_ALL_ACCESS, + REG_OPTION_NON_VOLATILE, + NULL, + WDF_NO_OBJECT_ATTRIBUTES, + &keyDS + ); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRegistryCreateKey failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfRegistryCreateKey failed with status %!STATUS!", + status); return status; } DECLARE_UNICODE_STRING_SIZE(serialPath, 4); RtlUnicodeStringPrintf(&serialPath, L"%04d", Description->SerialNo); - status = WdfRegistryCreateKey(keyDS, &serialPath, - KEY_ALL_ACCESS, REG_OPTION_NON_VOLATILE, NULL, WDF_NO_OBJECT_ATTRIBUTES, &keySerial); + status = WdfRegistryCreateKey( + keyDS, + &serialPath, + KEY_ALL_ACCESS, + REG_OPTION_NON_VOLATILE, + NULL, + WDF_NO_OBJECT_ATTRIBUTES, + &keySerial + ); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRegistryCreateKey failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfRegistryCreateKey failed with status %!STATUS!", + status); return status; } @@ -236,13 +270,15 @@ NTSTATUS Ds4_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION status = WdfRegistryQueryValue(keySerial, &valueName, sizeof(MAC_ADDRESS), &ds4->TargetMacAddress, NULL, NULL); - KdPrint((DRIVERNAME "MAC-Address: %02X:%02X:%02X:%02X:%02X:%02X\n", + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DS4, + "MAC-Address: %02X:%02X:%02X:%02X:%02X:%02X\n", ds4->TargetMacAddress.Vendor0, ds4->TargetMacAddress.Vendor1, ds4->TargetMacAddress.Vendor2, ds4->TargetMacAddress.Nic0, ds4->TargetMacAddress.Nic1, - ds4->TargetMacAddress.Nic2)); + ds4->TargetMacAddress.Nic2); if (status == STATUS_OBJECT_NAME_NOT_FOUND) { @@ -251,13 +287,19 @@ NTSTATUS Ds4_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION status = WdfRegistryAssignValue(keySerial, &valueName, REG_BINARY, sizeof(MAC_ADDRESS), (PVOID)&ds4->TargetMacAddress); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRegistryAssignValue failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfRegistryAssignValue failed with status %!STATUS!", + status); return status; } } else if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRegistryQueryValue failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DS4, + "WdfRegistryQueryValue failed with status %!STATUS!", + status); return status; } From 0f09aa3f74ebfba41441fb186d48e7d7a852e090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 19:40:42 +0200 Subject: [PATCH 18/52] Converted Ds4_PendingUsbRequestsTimerFunc --- sys/Ds4.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sys/Ds4.c b/sys/Ds4.c index d25d068..d93fcab 100644 --- a/sys/Ds4.c +++ b/sys/Ds4.c @@ -428,6 +428,8 @@ VOID Ds4_PendingUsbRequestsTimerFunc( PIO_STACK_LOCATION irpStack; PPDO_DEVICE_DATA pdoData; + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_DS4, "%!FUNC! Entry"); + hChild = WdfTimerGetParentObject(Timer); pdoData = PdoGetData(hChild); ds4Data = Ds4GetData(hChild); @@ -456,5 +458,7 @@ VOID Ds4_PendingUsbRequestsTimerFunc( // Complete pending request WdfRequestComplete(usbRequest, status); } + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DS4, "%!FUNC! Exit with status %!STATUS!", status); } From e454e0061e8c06616c541bf6067e446d97c6276c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 19:54:39 +0200 Subject: [PATCH 19/52] Converted Bus_EvtIoDeviceControl --- sys/Queue.c | 93 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 77 insertions(+), 16 deletions(-) diff --git a/sys/Queue.c b/sys/Queue.c index 05a1e25..5e67522 100644 --- a/sys/Queue.c +++ b/sys/Queue.c @@ -54,14 +54,16 @@ VOID Bus_EvtIoDeviceControl( Device = WdfIoQueueGetDevice(Queue); - KdPrint((DRIVERNAME "Bus_EvtIoDeviceControl: 0x%p\n", Device)); + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_QUEUE, "%!FUNC! Entry (device: 0x%p)", Device); switch (IoControlCode) { #pragma region IOCTL_VIGEM_CHECK_VERSION case IOCTL_VIGEM_CHECK_VERSION: - KdPrint((DRIVERNAME "IOCTL_VIGEM_CHECK_VERSION\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_QUEUE, + "IOCTL_VIGEM_CHECK_VERSION"); status = WdfRequestRetrieveInputBuffer(Request, sizeof(VIGEM_CHECK_VERSION), (PVOID)&pCheckVersion, &length); @@ -73,13 +75,20 @@ VOID Bus_EvtIoDeviceControl( status = (pCheckVersion->Version == VIGEM_COMMON_VERSION) ? STATUS_SUCCESS : STATUS_NOT_SUPPORTED; + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_QUEUE, + "Requested version: 0x%04X, compiled version: 0x%04X", + pCheckVersion->Version, VIGEM_COMMON_VERSION); + break; #pragma endregion #pragma region IOCTL_VIGEM_PLUGIN_TARGET case IOCTL_VIGEM_PLUGIN_TARGET: - KdPrint((DRIVERNAME "IOCTL_VIGEM_PLUGIN_TARGET\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_QUEUE, + "IOCTL_VIGEM_PLUGIN_TARGET"); status = Bus_PlugInDevice(Device, Request, FALSE, &length); @@ -89,7 +98,9 @@ VOID Bus_EvtIoDeviceControl( #pragma region IOCTL_VIGEM_UNPLUG_TARGET case IOCTL_VIGEM_UNPLUG_TARGET: - KdPrint((DRIVERNAME "IOCTL_VIGEM_UNPLUG_TARGET\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_QUEUE, + "IOCTL_VIGEM_UNPLUG_TARGET"); status = Bus_UnPlugDevice(Device, Request, FALSE, &length); @@ -99,13 +110,18 @@ VOID Bus_EvtIoDeviceControl( #pragma region IOCTL_XUSB_SUBMIT_REPORT case IOCTL_XUSB_SUBMIT_REPORT: - KdPrint((DRIVERNAME "IOCTL_XUSB_SUBMIT_REPORT\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_QUEUE, + "IOCTL_XUSB_SUBMIT_REPORT"); status = WdfRequestRetrieveInputBuffer(Request, sizeof(XUSB_SUBMIT_REPORT), (PVOID)&xusbSubmit, &length); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRequestRetrieveInputBuffer failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_QUEUE, + "WdfRequestRetrieveInputBuffer failed with status %!STATUS!", + status); break; } @@ -114,6 +130,10 @@ VOID Bus_EvtIoDeviceControl( // This request only supports a single PDO at a time if (xusbSubmit->SerialNo == 0) { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_QUEUE, + "Invalid serial 0 submitted"); + status = STATUS_INVALID_PARAMETER; break; } @@ -127,12 +147,17 @@ VOID Bus_EvtIoDeviceControl( #pragma region IOCTL_XUSB_REQUEST_NOTIFICATION case IOCTL_XUSB_REQUEST_NOTIFICATION: - KdPrint((DRIVERNAME "IOCTL_XUSB_REQUEST_NOTIFICATION\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_QUEUE, + "IOCTL_XUSB_REQUEST_NOTIFICATION"); // Don't accept the request if the output buffer can't hold the results if (OutputBufferLength < sizeof(XUSB_REQUEST_NOTIFICATION)) { - KdPrint((DRIVERNAME "IOCTL_XUSB_REQUEST_NOTIFICATION: output buffer too small: %ul\n", OutputBufferLength)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_QUEUE, + "Output buffer %d too small, require at least %d", + OutputBufferLength, sizeof(XUSB_REQUEST_NOTIFICATION)); break; } @@ -140,7 +165,10 @@ VOID Bus_EvtIoDeviceControl( if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRequestRetrieveInputBuffer failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_QUEUE, + "WdfRequestRetrieveInputBuffer failed with status %!STATUS!", + status); break; } @@ -149,6 +177,10 @@ VOID Bus_EvtIoDeviceControl( // This request only supports a single PDO at a time if (xusbNotify->SerialNo == 0) { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_QUEUE, + "Invalid serial 0 submitted"); + status = STATUS_INVALID_PARAMETER; break; } @@ -162,13 +194,18 @@ VOID Bus_EvtIoDeviceControl( #pragma region IOCTL_DS4_SUBMIT_REPORT case IOCTL_DS4_SUBMIT_REPORT: - KdPrint((DRIVERNAME "IOCTL_DS4_SUBMIT_REPORT\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_QUEUE, + "IOCTL_DS4_SUBMIT_REPORT"); status = WdfRequestRetrieveInputBuffer(Request, sizeof(DS4_SUBMIT_REPORT), (PVOID)&ds4Submit, &length); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRequestRetrieveInputBuffer failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_QUEUE, + "WdfRequestRetrieveInputBuffer failed with status %!STATUS!", + status); break; } @@ -177,6 +214,10 @@ VOID Bus_EvtIoDeviceControl( // This request only supports a single PDO at a time if (ds4Submit->SerialNo == 0) { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_QUEUE, + "Invalid serial 0 submitted"); + status = STATUS_INVALID_PARAMETER; break; } @@ -190,12 +231,17 @@ VOID Bus_EvtIoDeviceControl( #pragma region IOCTL_DS4_REQUEST_NOTIFICATION case IOCTL_DS4_REQUEST_NOTIFICATION: - KdPrint((DRIVERNAME "IOCTL_DS4_REQUEST_NOTIFICATION\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_QUEUE, + "IOCTL_DS4_REQUEST_NOTIFICATION"); // Don't accept the request if the output buffer can't hold the results if (OutputBufferLength < sizeof(DS4_REQUEST_NOTIFICATION)) { - KdPrint((DRIVERNAME "IOCTL_DS4_REQUEST_NOTIFICATION: output buffer too small: %ul\n", OutputBufferLength)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_QUEUE, + "Output buffer %d too small, require at least %d", + OutputBufferLength, sizeof(DS4_REQUEST_NOTIFICATION)); break; } @@ -203,7 +249,10 @@ VOID Bus_EvtIoDeviceControl( if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfRequestRetrieveInputBuffer failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_QUEUE, + "WdfRequestRetrieveInputBuffer failed with status %!STATUS!", + status); break; } @@ -212,6 +261,10 @@ VOID Bus_EvtIoDeviceControl( // This request only supports a single PDO at a time if (ds4Notify->SerialNo == 0) { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_QUEUE, + "Invalid serial 0 submitted"); + status = STATUS_INVALID_PARAMETER; break; } @@ -225,7 +278,9 @@ VOID Bus_EvtIoDeviceControl( #pragma region IOCTL_XGIP_SUBMIT_REPORT case IOCTL_XGIP_SUBMIT_REPORT: - KdPrint((DRIVERNAME "IOCTL_XGIP_SUBMIT_REPORT\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_QUEUE, + "IOCTL_XGIP_SUBMIT_REPORT"); status = WdfRequestRetrieveInputBuffer(Request, sizeof(XGIP_SUBMIT_REPORT), (PVOID)&xgipSubmit, &length); @@ -279,7 +334,11 @@ VOID Bus_EvtIoDeviceControl( #pragma endregion default: - KdPrint((DRIVERNAME "UNKNOWN IOCTL CODE 0x%x\n", IoControlCode)); + + TraceEvents(TRACE_LEVEL_WARNING, + TRACE_QUEUE, + "Unknown I/O control code 0x%X", IoControlCode); + break; // default status is STATUS_INVALID_PARAMETER } @@ -287,6 +346,8 @@ VOID Bus_EvtIoDeviceControl( { WdfRequestCompleteWithInformation(Request, status, length); } + + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_QUEUE, "%!FUNC! Exit with status %!STATUS!", status); } VOID Bus_EvtIoInternalDeviceControl( From dda0a3a6b15030ca9ea2a0f1dab86b8dee2d67d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 19:55:33 +0200 Subject: [PATCH 20/52] typecast fix --- sys/Queue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/Queue.c b/sys/Queue.c index 5e67522..3c9dd40 100644 --- a/sys/Queue.c +++ b/sys/Queue.c @@ -157,7 +157,7 @@ VOID Bus_EvtIoDeviceControl( TraceEvents(TRACE_LEVEL_ERROR, TRACE_QUEUE, "Output buffer %d too small, require at least %d", - OutputBufferLength, sizeof(XUSB_REQUEST_NOTIFICATION)); + (int)OutputBufferLength, (int)sizeof(XUSB_REQUEST_NOTIFICATION)); break; } @@ -241,7 +241,7 @@ VOID Bus_EvtIoDeviceControl( TraceEvents(TRACE_LEVEL_ERROR, TRACE_QUEUE, "Output buffer %d too small, require at least %d", - OutputBufferLength, sizeof(DS4_REQUEST_NOTIFICATION)); + (int)OutputBufferLength, (int)sizeof(DS4_REQUEST_NOTIFICATION)); break; } From a880595370d8ce535b8673959b84c3a76790f9e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 19:58:06 +0200 Subject: [PATCH 21/52] Converted Bus_EvtIoDefault --- sys/Queue.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/sys/Queue.c b/sys/Queue.c index 3c9dd40..a3a8235 100644 --- a/sys/Queue.c +++ b/sys/Queue.c @@ -350,6 +350,11 @@ VOID Bus_EvtIoDeviceControl( TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_QUEUE, "%!FUNC! Exit with status %!STATUS!", status); } +// +// Gets called upon driver-to-driver communication. +// +// TODO: incomplete and unused currently +// VOID Bus_EvtIoInternalDeviceControl( _In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, @@ -405,7 +410,9 @@ VOID Bus_EvtIoDefault( UNREFERENCED_PARAMETER(Queue); UNREFERENCED_PARAMETER(Request); - KdPrint((DRIVERNAME "Bus_EvtIoDefault called\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_QUEUE, "%!FUNC! Entry"); WdfRequestComplete(Request, STATUS_INVALID_DEVICE_REQUEST); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_QUEUE, "%!FUNC! Exit"); } \ No newline at end of file From 96ef7f6db0dfcbaa80452553d039f623556b82b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 20:04:34 +0200 Subject: [PATCH 22/52] Converted UsbPdo_GetStringDescriptorType --- sys/usbpdo.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/sys/usbpdo.c b/sys/usbpdo.c index cacce60..801d5e4 100644 --- a/sys/usbpdo.c +++ b/sys/usbpdo.c @@ -34,7 +34,9 @@ BOOLEAN USB_BUSIFFN UsbPdo_IsDeviceHighSpeed(IN PVOID BusContext) { UNREFERENCED_PARAMETER(BusContext); - KdPrint((DRIVERNAME "UsbPdo_IsDeviceHighSpeed: TRUE\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_USBPDO, + "IsDeviceHighSpeed: TRUE"); return TRUE; } @@ -56,7 +58,10 @@ NTSTATUS USB_BUSIFFN UsbPdo_QueryBusInformation( UNREFERENCED_PARAMETER(BusInformationBufferLength); UNREFERENCED_PARAMETER(BusInformationActualLength); - KdPrint((DRIVERNAME "UsbPdo_QueryBusInformation: STATUS_UNSUCCESSFUL\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_USBPDO, + "QueryBusInformation: %!STATUS!", STATUS_UNSUCCESSFUL); + return STATUS_UNSUCCESSFUL; } @@ -68,7 +73,10 @@ NTSTATUS USB_BUSIFFN UsbPdo_SubmitIsoOutUrb(IN PVOID BusContext, IN PURB Urb) UNREFERENCED_PARAMETER(BusContext); UNREFERENCED_PARAMETER(Urb); - KdPrint((DRIVERNAME "UsbPdo_SubmitIsoOutUrb: STATUS_UNSUCCESSFUL\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_USBPDO, + "SubmitIsoOutUrb: %!STATUS!", STATUS_UNSUCCESSFUL); + return STATUS_UNSUCCESSFUL; } @@ -80,7 +88,10 @@ NTSTATUS USB_BUSIFFN UsbPdo_QueryBusTime(IN PVOID BusContext, IN OUT PULONG Curr UNREFERENCED_PARAMETER(BusContext); UNREFERENCED_PARAMETER(CurrentUsbFrame); - KdPrint((DRIVERNAME "UsbPdo_QueryBusTime: STATUS_UNSUCCESSFUL\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_USBPDO, + "QueryBusTime: %!STATUS!", STATUS_UNSUCCESSFUL); + return STATUS_UNSUCCESSFUL; } @@ -95,7 +106,9 @@ VOID USB_BUSIFFN UsbPdo_GetUSBDIVersion( { UNREFERENCED_PARAMETER(BusContext); - KdPrint((DRIVERNAME "UsbPdo_GetUSBDIVersion: 0x500, 0x200\n")); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_USBPDO, + "GetUSBDIVersion: 0x500, 0x200"); if (VersionInformation != NULL) { @@ -241,7 +254,10 @@ NTSTATUS UsbPdo_GetStringDescriptorType(PURB urb, PPDO_DEVICE_DATA pCommon) } case 1: { - KdPrint((DRIVERNAME "LanguageId = 0x%X\n", urb->UrbControlDescriptorRequest.LanguageId)); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + "LanguageId = 0x%X", + urb->UrbControlDescriptorRequest.LanguageId); if (urb->UrbControlDescriptorRequest.TransferBufferLength < DS4_MANUFACTURER_NAME_LENGTH) { @@ -269,7 +285,10 @@ NTSTATUS UsbPdo_GetStringDescriptorType(PURB urb, PPDO_DEVICE_DATA pCommon) } case 2: { - KdPrint((DRIVERNAME "LanguageId = 0x%X\n", urb->UrbControlDescriptorRequest.LanguageId)); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + "LanguageId = 0x%X", + urb->UrbControlDescriptorRequest.LanguageId); if (urb->UrbControlDescriptorRequest.TransferBufferLength < DS4_PRODUCT_NAME_LENGTH) { @@ -628,7 +647,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R // Notify user-mode process that new data is available status = WdfIoQueueRetrieveNextRequest(pdoData->PendingNotificationRequests, ¬ifyRequest); - + if (NT_SUCCESS(status)) { PXUSB_REQUEST_NOTIFICATION notify = NULL; From 5b4884d03c894246d388b2942197f296697bffa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 20:06:55 +0200 Subject: [PATCH 23/52] Converted UsbPdo_SelectConfiguration --- sys/usbpdo.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/sys/usbpdo.c b/sys/usbpdo.c index 801d5e4..409a25f 100644 --- a/sys/usbpdo.c +++ b/sys/usbpdo.c @@ -335,10 +335,16 @@ NTSTATUS UsbPdo_SelectConfiguration(PURB urb, PPDO_DEVICE_DATA pCommon) pInfo = &urb->UrbSelectConfiguration.Interface; KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: TotalLength %d\n", urb->UrbHeader.Length)); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: TotalLength %d", + urb->UrbHeader.Length); if (urb->UrbHeader.Length == sizeof(struct _URB_SELECT_CONFIGURATION)) { - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: NULL ConfigurationDescriptor\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: NULL ConfigurationDescriptor"); return STATUS_SUCCESS; } @@ -348,7 +354,9 @@ NTSTATUS UsbPdo_SelectConfiguration(PURB urb, PPDO_DEVICE_DATA pCommon) if (urb->UrbHeader.Length < XUSB_CONFIGURATION_SIZE) { - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Invalid ConfigurationDescriptor\n")); + TraceEvents(TRACE_LEVEL_WARNING, + TRACE_USBPDO, + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Invalid ConfigurationDescriptor\n"); return STATUS_INVALID_PARAMETER; } @@ -360,7 +368,9 @@ NTSTATUS UsbPdo_SelectConfiguration(PURB urb, PPDO_DEVICE_DATA pCommon) if (urb->UrbHeader.Length < DS4_CONFIGURATION_SIZE) { - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Invalid ConfigurationDescriptor\n")); + TraceEvents(TRACE_LEVEL_WARNING, + TRACE_USBPDO, + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Invalid ConfigurationDescriptor"); return STATUS_INVALID_PARAMETER; } @@ -372,7 +382,9 @@ NTSTATUS UsbPdo_SelectConfiguration(PURB urb, PPDO_DEVICE_DATA pCommon) if (urb->UrbHeader.Length < XGIP_CONFIGURATION_SIZE) { - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Invalid ConfigurationDescriptor\n")); + TraceEvents(TRACE_LEVEL_WARNING, + TRACE_USBPDO, + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Invalid ConfigurationDescriptor"); return STATUS_INVALID_PARAMETER; } From 7c72c3ce23b50ab47154b147c911f9c5fea640af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 20:08:36 +0200 Subject: [PATCH 24/52] Converted UsbPdo_SelectInterface --- sys/usbpdo.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/sys/usbpdo.c b/sys/usbpdo.c index 409a25f..86d3e22 100644 --- a/sys/usbpdo.c +++ b/sys/usbpdo.c @@ -334,7 +334,6 @@ NTSTATUS UsbPdo_SelectConfiguration(PURB urb, PPDO_DEVICE_DATA pCommon) pInfo = &urb->UrbSelectConfiguration.Interface; - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: TotalLength %d\n", urb->UrbHeader.Length)); TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_USBPDO, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: TotalLength %d", @@ -406,16 +405,20 @@ NTSTATUS UsbPdo_SelectInterface(PURB urb, PPDO_DEVICE_DATA pCommon) { PUSBD_INTERFACE_INFORMATION pInfo = &urb->UrbSelectInterface.Interface; - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_INTERFACE: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> URB_FUNCTION_SELECT_INTERFACE: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, - pInfo->NumberOfPipes)); + pInfo->NumberOfPipes); - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_INTERFACE: Class %d, SubClass %d, Protocol %d\n", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> URB_FUNCTION_SELECT_INTERFACE: Class %d, SubClass %d, Protocol %d", (int)pInfo->Class, (int)pInfo->SubClass, - (int)pInfo->Protocol)); + (int)pInfo->Protocol); switch (pCommon->TargetType) { @@ -487,7 +490,10 @@ NTSTATUS UsbPdo_SelectInterface(PURB urb, PPDO_DEVICE_DATA pCommon) } case DualShock4Wired: { - KdPrint((DRIVERNAME "Warning: not implemented\n")); + TraceEvents(TRACE_LEVEL_WARNING, + TRACE_USBPDO, + "Not implemented"); + break; } default: From bbc6607e55372426e73110de50d0f1863e8c6ada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 20:20:43 +0200 Subject: [PATCH 25/52] Converted UsbPdo_BulkOrInterruptTransfer --- sys/usbpdo.c | 49 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 12 deletions(-) diff --git a/sys/usbpdo.c b/sys/usbpdo.c index 86d3e22..df73822 100644 --- a/sys/usbpdo.c +++ b/sys/usbpdo.c @@ -517,7 +517,9 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R if (pdoData == NULL) { - KdPrint((DRIVERNAME ">> >> >> Invalid common context\n")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_USBPDO, + ">> >> >> PdoGetData failed"); return STATUS_INVALID_PARAMETER; } @@ -530,7 +532,10 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R // Check context if (xusb == NULL) { - KdPrint((DRIVERNAME "No XUSB context found on device %p\n", Device)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_USBPDO, + "No XUSB context found on device %p\n", + Device); return STATUS_UNSUCCESSFUL; } @@ -538,7 +543,9 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R // Data coming FROM us TO higher driver if (pTransfer->TransferFlags & USBD_TRANSFER_DIRECTION_IN) { - KdPrint((DRIVERNAME ">> >> >> Incoming request, queuing...\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> Incoming request, queuing..."); if (XUSB_IS_DATA_PIPE(pTransfer)) { @@ -622,16 +629,21 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R } // Data coming FROM the higher driver TO us - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: Handle %p, Flags %X, Length %d\n", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: Handle %p, Flags %X, Length %d\n", pTransfer->PipeHandle, pTransfer->TransferFlags, - pTransfer->TransferBufferLength)); + pTransfer->TransferBufferLength); if (pTransfer->TransferBufferLength == XUSB_LEDSET_SIZE) // Led { PUCHAR Buffer = pTransfer->TransferBuffer; - KdPrint((DRIVERNAME "-- LED Buffer: %02X %02X %02X\n", Buffer[0], Buffer[1], Buffer[2])); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + "-- LED Buffer: %02X %02X %02X\n", + Buffer[0], Buffer[1], Buffer[2]); // extract LED byte to get controller slot if (Buffer[0] == 0x01 && Buffer[1] == 0x03 && Buffer[2] >= 0x02) @@ -641,7 +653,10 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R if (Buffer[2] == 0x04) xusb->LedNumber = 2; if (Buffer[2] == 0x05) xusb->LedNumber = 3; - KdPrint((DRIVERNAME "-- LED Number: %d\n", xusb->LedNumber)); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_USBPDO, + "-- LED Number: %d\n", + xusb->LedNumber); } } @@ -650,7 +665,9 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R { PUCHAR Buffer = pTransfer->TransferBuffer; - KdPrint((DRIVERNAME "-- Rumble Buffer: %02X %02X %02X %02X %02X %02X %02X %02X\n", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + "-- Rumble Buffer: %02X %02X %02X %02X %02X %02X %02X %02X\n", Buffer[0], Buffer[1], Buffer[2], @@ -658,7 +675,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R Buffer[4], Buffer[5], Buffer[6], - Buffer[7])); + Buffer[7]); RtlCopyBytes(xusb->Rumble, Buffer, pTransfer->TransferBufferLength); } @@ -685,7 +702,10 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R } else { - KdPrint((DRIVERNAME "WdfRequestRetrieveOutputBuffer failed with status 0x%X\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_USBPDO, + "WdfRequestRetrieveOutputBuffer failed with status %!STATUS!", + status); } } @@ -699,7 +719,9 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R if (pTransfer->TransferFlags & USBD_TRANSFER_DIRECTION_IN && pTransfer->PipeHandle == (USBD_PIPE_HANDLE)0xFFFF0084) { - // KdPrint((DRIVERNAME ">> >> >> Incoming request, queuing...\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> Incoming request, queuing..."); /* This request is sent periodically and relies on data the "feeder" has to supply, so we queue this request and return with STATUS_PENDING. @@ -734,7 +756,10 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R } else { - KdPrint((DRIVERNAME "WdfRequestRetrieveOutputBuffer failed with status 0x%X\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_USBPDO, + "WdfRequestRetrieveOutputBuffer failed with status %!STATUS!", + status); } } From 84f9bdd3be7fe0bc7d895299792a5be3c65d7ee7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 20:24:02 +0200 Subject: [PATCH 26/52] Converted UsbPdo_AbortPipe --- sys/usbpdo.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sys/usbpdo.c b/sys/usbpdo.c index df73822..a97b769 100644 --- a/sys/usbpdo.c +++ b/sys/usbpdo.c @@ -642,7 +642,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_USBPDO, - "-- LED Buffer: %02X %02X %02X\n", + "-- LED Buffer: %02X %02X %02X\n", Buffer[0], Buffer[1], Buffer[2]); // extract LED byte to get controller slot @@ -655,7 +655,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_USBPDO, - "-- LED Number: %d\n", + "-- LED Number: %d\n", xusb->LedNumber); } } @@ -704,7 +704,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R { TraceEvents(TRACE_LEVEL_ERROR, TRACE_USBPDO, - "WdfRequestRetrieveOutputBuffer failed with status %!STATUS!", + "WdfRequestRetrieveOutputBuffer failed with status %!STATUS!", status); } } @@ -813,7 +813,9 @@ NTSTATUS UsbPdo_AbortPipe(WDFDEVICE Device) // Check context if (ds4 == NULL) { - KdPrint((DRIVERNAME "No DS4 context found on device %p\n", Device)); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_USBPDO, + "No DS4 context found on device %p\n", Device); return STATUS_UNSUCCESSFUL; } From a827193a705921f13c2498f41b549db74297955d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 20:26:32 +0200 Subject: [PATCH 27/52] Converted UsbPdo_ClassInterface --- sys/usbpdo.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/sys/usbpdo.c b/sys/usbpdo.c index a97b769..0e96d46 100644 --- a/sys/usbpdo.c +++ b/sys/usbpdo.c @@ -843,13 +843,17 @@ NTSTATUS UsbPdo_ClassInterface(PURB urb, WDFDEVICE Device, PPDO_DEVICE_DATA pCom { struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST* pRequest = &urb->UrbControlVendorClassRequest; - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_CLASS_INTERFACE\n")); - KdPrint((DRIVERNAME ">> >> >> TransferFlags = 0x%X, Request = 0x%X, Value = 0x%X, Index = 0x%X, BufLen = %d\n", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> URB_FUNCTION_CLASS_INTERFACE"); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> TransferFlags = 0x%X, Request = 0x%X, Value = 0x%X, Index = 0x%X, BufLen = %d", pRequest->TransferFlags, pRequest->Request, pRequest->Value, pRequest->Index, - pRequest->TransferBufferLength)); + pRequest->TransferBufferLength); switch (pCommon->TargetType) { @@ -864,7 +868,10 @@ NTSTATUS UsbPdo_ClassInterface(PURB urb, WDFDEVICE Device, PPDO_DEVICE_DATA pCom UCHAR reportId = HID_GET_REPORT_ID(pRequest); UCHAR reportType = HID_GET_REPORT_TYPE(pRequest); - KdPrint((DRIVERNAME ">> >> >> >> GET_REPORT(%d): %d\n", reportType, reportId)); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> >> GET_REPORT(%d): %d", + reportType, reportId); switch (reportType) { @@ -948,7 +955,10 @@ NTSTATUS UsbPdo_ClassInterface(PURB urb, WDFDEVICE Device, PPDO_DEVICE_DATA pCom UCHAR reportId = HID_GET_REPORT_ID(pRequest); UCHAR reportType = HID_GET_REPORT_TYPE(pRequest); - KdPrint((DRIVERNAME ">> >> >> >> SET_REPORT(%d): %d\n", reportType, reportId)); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> >> SET_REPORT(%d): %d", + reportType, reportId); switch (reportType) { From 24fa7635a9ebcff36a0ddea83952727942c8ee82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 20:27:39 +0200 Subject: [PATCH 28/52] Converted UsbPdo_GetDescriptorFromInterface --- sys/usbpdo.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sys/usbpdo.c b/sys/usbpdo.c index 0e96d46..3467b7c 100644 --- a/sys/usbpdo.c +++ b/sys/usbpdo.c @@ -1260,7 +1260,10 @@ NTSTATUS UsbPdo_GetDescriptorFromInterface(PURB urb, PPDO_DEVICE_DATA pCommon) struct _URB_CONTROL_DESCRIPTOR_REQUEST* pRequest = &urb->UrbControlDescriptorRequest; - KdPrint((DRIVERNAME ">> >> >> _URB_CONTROL_DESCRIPTOR_REQUEST: Buffer Length %d\n", pRequest->TransferBufferLength)); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + ">> >> >> _URB_CONTROL_DESCRIPTOR_REQUEST: Buffer Length %d", + pRequest->TransferBufferLength); switch (pCommon->TargetType) { From b3db45fdb7f049420a3a4e87a688f96c9e475257 Mon Sep 17 00:00:00 2001 From: megadrago88 Date: Sat, 12 May 2018 14:32:36 -0400 Subject: [PATCH 29/52] Convert Xusb_PrepareHardware --- sys/xusb.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sys/xusb.c b/sys/xusb.c index 90e5a70..18d0bff 100644 --- a/sys/xusb.c +++ b/sys/xusb.c @@ -102,7 +102,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n", + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n", GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data3, @@ -114,7 +114,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data4[5], GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data4[6], GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data4[7], - status)); + status); return status; } @@ -126,7 +126,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n", + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n", GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data3, @@ -138,7 +138,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data4[5], GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data4[6], GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data4[7], - status)); + status); return status; } @@ -150,7 +150,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n", + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n", GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data3, @@ -162,7 +162,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data4[5], GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data4[6], GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data4[7], - status)); + status); return status; } @@ -190,7 +190,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfDeviceAddQueryInterface failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfDeviceAddQueryInterface failed status 0x%x\n", status); return status; } From 05f05e10f1b9ecdf9c7a330afb0a5d93e7c67252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sat, 12 May 2018 20:32:36 +0200 Subject: [PATCH 30/52] Fixed tracing level --- sys/buspdo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/buspdo.c b/sys/buspdo.c index 6955abd..c455b0e 100644 --- a/sys/buspdo.c +++ b/sys/buspdo.c @@ -902,6 +902,6 @@ VOID Pdo_EvtIoInternalDeviceControl( WdfRequestComplete(Request, status); } - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_BUSPDO, "%!FUNC! Exit with status %!STATUS!", status); + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_BUSPDO, "%!FUNC! Exit with status %!STATUS!", status); } From 78aa25497392c57f520cdde8e2c1eac8baea06cb Mon Sep 17 00:00:00 2001 From: megadrago88 Date: Sat, 12 May 2018 14:34:14 -0400 Subject: [PATCH 31/52] Convert Xusb_AssignPdoContext --- sys/xusb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/xusb.c b/sys/xusb.c index 18d0bff..2c03a6a 100644 --- a/sys/xusb.c +++ b/sys/xusb.c @@ -205,7 +205,7 @@ NTSTATUS Xusb_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION WDF_OBJECT_ATTRIBUTES_INIT(&attributes); attributes.ParentObject = Device; - KdPrint((DRIVERNAME "Initializing XUSB context...\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_XUSB, "Initializing XUSB context...\n"); PXUSB_DEVICE_DATA xusb = XusbGetData(Device); @@ -225,7 +225,7 @@ NTSTATUS Xusb_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION status = WdfIoQueueCreate(Device, &holdingInQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &xusb->HoldingUsbInRequests); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfIoQueueCreate (HoldingUsbInRequests) failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfIoQueueCreate (HoldingUsbInRequests) failed 0x%x\n", status); return status; } From d4b82250666a958bb564f48785c9c59cd0c790d0 Mon Sep 17 00:00:00 2001 From: megadrago88 Date: Sat, 12 May 2018 14:35:32 -0400 Subject: [PATCH 32/52] Convert Xusb_SelectConfiguration --- sys/xusb.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/sys/xusb.c b/sys/xusb.c index 2c03a6a..884a05e 100644 --- a/sys/xusb.c +++ b/sys/xusb.c @@ -394,11 +394,11 @@ VOID Xusb_GetDeviceDescriptorType(PUSB_DEVICE_DESCRIPTOR pDescriptor, PPDO_DEVIC VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) { - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, - pInfo->NumberOfPipes)); + pInfo->NumberOfPipes); pInfo->Class = 0xFF; pInfo->SubClass = 0x5D; @@ -424,11 +424,11 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, - pInfo->NumberOfPipes)); + pInfo->NumberOfPipes); pInfo->Class = 0xFF; pInfo->SubClass = 0x5D; @@ -470,11 +470,11 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, - pInfo->NumberOfPipes)); + pInfo->NumberOfPipes); pInfo->Class = 0xFF; pInfo->SubClass = 0x5D; @@ -492,11 +492,11 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, - pInfo->NumberOfPipes)); + pInfo->NumberOfPipes); pInfo->Class = 0xFF; pInfo->SubClass = 0xFD; From 351d872272c9e45c2a0bc2c873a5729138873c53 Mon Sep 17 00:00:00 2001 From: megadrago88 Date: Sat, 12 May 2018 15:11:19 -0400 Subject: [PATCH 33/52] Removed /n's --- sys/xusb.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/sys/xusb.c b/sys/xusb.c index 884a05e..43bd20e 100644 --- a/sys/xusb.c +++ b/sys/xusb.c @@ -102,7 +102,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n", + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)", GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data3, @@ -126,7 +126,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n", + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)", GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data3, @@ -150,7 +150,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)\n", + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)", GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data3, @@ -190,7 +190,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfDeviceAddQueryInterface failed status 0x%x\n", status); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfDeviceAddQueryInterface failed status 0x%x", status); return status; } @@ -205,7 +205,7 @@ NTSTATUS Xusb_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION WDF_OBJECT_ATTRIBUTES_INIT(&attributes); attributes.ParentObject = Device; - TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_XUSB, "Initializing XUSB context...\n"); + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_XUSB, "Initializing XUSB context..."); PXUSB_DEVICE_DATA xusb = XusbGetData(Device); @@ -225,7 +225,7 @@ NTSTATUS Xusb_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION status = WdfIoQueueCreate(Device, &holdingInQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &xusb->HoldingUsbInRequests); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfIoQueueCreate (HoldingUsbInRequests) failed 0x%x\n", status); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfIoQueueCreate (HoldingUsbInRequests) failed 0x%x", status); return status; } @@ -394,7 +394,7 @@ VOID Xusb_GetDeviceDescriptorType(PUSB_DEVICE_DESCRIPTOR pDescriptor, PPDO_DEVIC VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) { - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, @@ -424,7 +424,7 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, @@ -470,7 +470,7 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, @@ -492,7 +492,7 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, From 2133df8e4d6d8b7706aa0ea0af25337765045adf Mon Sep 17 00:00:00 2001 From: megadrago88 Date: Sat, 12 May 2018 15:15:50 -0400 Subject: [PATCH 34/52] Update Xusb_PrepareHardware --- sys/xusb.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/xusb.c b/sys/xusb.c index 43bd20e..44dfd87 100644 --- a/sys/xusb.c +++ b/sys/xusb.c @@ -102,7 +102,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)", + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (Failed with status %!STATUS!)", GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data3, @@ -126,7 +126,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)", + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (Failed with status %!STATUS!)", GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data3, @@ -150,7 +150,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (status 0x%x)", + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (Failed with status %!STATUS!)", GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data3, @@ -190,7 +190,7 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfDeviceAddQueryInterface failed status 0x%x", status); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfDeviceAddQueryInterface failed with status %!STATUS!", status); return status; } From bda8b60c8f0452bb08e015ed9b812b14e655c1e0 Mon Sep 17 00:00:00 2001 From: megadrago88 Date: Sat, 12 May 2018 15:16:45 -0400 Subject: [PATCH 35/52] Update Xusb_AssignPdoContext --- sys/xusb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/xusb.c b/sys/xusb.c index 44dfd87..8dee2a2 100644 --- a/sys/xusb.c +++ b/sys/xusb.c @@ -225,7 +225,7 @@ NTSTATUS Xusb_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION status = WdfIoQueueCreate(Device, &holdingInQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &xusb->HoldingUsbInRequests); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfIoQueueCreate (HoldingUsbInRequests) failed 0x%x", status); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfIoQueueCreate (HoldingUsbInRequests) failed with status %!STATUS!", status); return status; } From a9115fc487da3996bd740b2a4790a349c142bf64 Mon Sep 17 00:00:00 2001 From: megadrago88 Date: Sat, 12 May 2018 15:26:06 -0400 Subject: [PATCH 36/52] Convert Xgip_PrepareHardware --- sys/xgip.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/xgip.c b/sys/xgip.c index b113bd9..f07bd60 100644 --- a/sys/xgip.c +++ b/sys/xgip.c @@ -105,7 +105,7 @@ NTSTATUS Xgip_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfDeviceAddQueryInterface failed status 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XGIP, "WdfDeviceAddQueryInterface failed with status %!STATUS!", status); return status; } @@ -382,7 +382,7 @@ VOID Xgip_SysInitTimerFunc( urb->UrbBulkOrInterruptTransfer.TransferBufferLength = (ULONG)size; RtlCopyBytes(urb->UrbBulkOrInterruptTransfer.TransferBuffer, Buffer, size); - KdPrint((DRIVERNAME "[%X] Buffer length: %d\n", + KdPrint((DRIVERNAME "[%X] Buffer length: %d\n", ((PUCHAR)urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0], urb->UrbBulkOrInterruptTransfer.TransferBufferLength)); From 293dfbf764598098e0322a8dd9c5289b0397944a Mon Sep 17 00:00:00 2001 From: megadrago88 Date: Sat, 12 May 2018 15:29:19 -0400 Subject: [PATCH 37/52] Convert Xgip_AssignPdoContext --- sys/xgip.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sys/xgip.c b/sys/xgip.c index f07bd60..33a05a0 100644 --- a/sys/xgip.c +++ b/sys/xgip.c @@ -128,7 +128,7 @@ NTSTATUS Xgip_AssignPdoContext(WDFDEVICE Device) PXGIP_DEVICE_DATA xgip = XgipGetData(Device); - KdPrint((DRIVERNAME "Initializing XGIP context...\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_XGIP, "Initializing XGIP context..."); RtlZeroMemory(xgip, sizeof(XGIP_DEVICE_DATA)); @@ -145,7 +145,7 @@ NTSTATUS Xgip_AssignPdoContext(WDFDEVICE Device) status = WdfIoQueueCreate(Device, &pendingUsbQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &xgip->PendingUsbInRequests); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfIoQueueCreate failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XGIP, "WdfIoQueueCreate failed with status %!STATUS!", status); return status; } @@ -155,7 +155,7 @@ NTSTATUS Xgip_AssignPdoContext(WDFDEVICE Device) status = WdfIoQueueCreate(Device, ¬ificationsQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &xgip->PendingNotificationRequests); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfIoQueueCreate failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XGIP, "WdfIoQueueCreate failed with status %!STATUS!", status); return status; } @@ -167,7 +167,7 @@ NTSTATUS Xgip_AssignPdoContext(WDFDEVICE Device) status = WdfCollectionCreate(&collectionAttribs, &xgip->XboxgipSysInitCollection); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfCollectionCreate failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XGIP, "WdfCollectionCreate failed with status %!STATUS!", status); return status; } @@ -186,7 +186,7 @@ NTSTATUS Xgip_AssignPdoContext(WDFDEVICE Device) status = WdfTimerCreate(&timerConfig, &timerAttribs, &xgip->XboxgipSysInitTimer); if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "WdfTimerCreate failed 0x%x\n", status)); + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XGIP, "WdfTimerCreate failed with status %!STATUS!", status); return status; } From 693483b072f522b2652243ed570881c0cb0c4e4b Mon Sep 17 00:00:00 2001 From: megadrago88 Date: Sat, 12 May 2018 15:30:42 -0400 Subject: [PATCH 38/52] Convert Xgip_SelectConfiguration --- sys/xgip.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/xgip.c b/sys/xgip.c index 33a05a0..5284b4c 100644 --- a/sys/xgip.c +++ b/sys/xgip.c @@ -292,11 +292,11 @@ VOID Xgip_GetDeviceDescriptorType(PUSB_DEVICE_DESCRIPTOR pDescriptor, PPDO_DEVIC VOID Xgip_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) { - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XGIP, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, - pInfo->NumberOfPipes)); + pInfo->NumberOfPipes); pInfo->Class = 0xFF; pInfo->SubClass = 0x47; @@ -322,11 +322,11 @@ VOID Xgip_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XGIP, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, - pInfo->NumberOfPipes)); + pInfo->NumberOfPipes); pInfo->Class = 0xFF; pInfo->SubClass = 0x47; From fc04ccc0998c6096cd1bcc52c5d6c599c1972468 Mon Sep 17 00:00:00 2001 From: megadrago88 Date: Sat, 12 May 2018 15:33:23 -0400 Subject: [PATCH 39/52] convert Xgip_SysInitTimerFunc --- sys/xgip.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sys/xgip.c b/sys/xgip.c index 5284b4c..387d26a 100644 --- a/sys/xgip.c +++ b/sys/xgip.c @@ -355,14 +355,14 @@ VOID Xgip_SysInitTimerFunc( // Is TRUE when collection is filled up if (xgip->XboxgipSysInitReady) { - KdPrint((DRIVERNAME "XBOXGIP ready, completing requests...\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_XGIP, "XBOXGIP ready, completing requests..."); // Get pending IN request status = WdfIoQueueRetrieveNextRequest(xgip->PendingUsbInRequests, &usbRequest); if (NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "Request found\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_XGIP, "Request found"); // Get top memory object mem = (WDFMEMORY)WdfCollectionGetFirstItem(xgip->XboxgipSysInitCollection); @@ -382,9 +382,9 @@ VOID Xgip_SysInitTimerFunc( urb->UrbBulkOrInterruptTransfer.TransferBufferLength = (ULONG)size; RtlCopyBytes(urb->UrbBulkOrInterruptTransfer.TransferBuffer, Buffer, size); - KdPrint((DRIVERNAME "[%X] Buffer length: %d\n", + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XGIP, "[%X] Buffer length: %d", ((PUCHAR)urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0], - urb->UrbBulkOrInterruptTransfer.TransferBufferLength)); + urb->UrbBulkOrInterruptTransfer.TransferBufferLength); // Complete pending request WdfRequestComplete(usbRequest, status); @@ -397,7 +397,7 @@ VOID Xgip_SysInitTimerFunc( // Stop timer when collection is purged if (WdfCollectionGetCount(xgip->XboxgipSysInitCollection) == 0) { - KdPrint((DRIVERNAME "Collection finished\n")); + TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_XGIP, "Collection finished"); WdfTimerStop(xgip->XboxgipSysInitTimer, FALSE); } From 59f01e728751053a1fe21edf30c6fea406d52080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 14:13:09 +0200 Subject: [PATCH 40/52] Unified style --- sys/xusb.c | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/sys/xusb.c b/sys/xusb.c index 8dee2a2..af937e6 100644 --- a/sys/xusb.c +++ b/sys/xusb.c @@ -102,7 +102,10 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (Failed with status %!STATUS!)", + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X " \ + "(WdfDeviceAddQueryInterface failed with status %!STATUS!)", GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data3, @@ -126,7 +129,10 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (Failed with status %!STATUS!)", + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X " \ + "(WdfDeviceAddQueryInterface failed with status %!STATUS!)", GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data3, @@ -150,7 +156,10 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X (Failed with status %!STATUS!)", + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X " \ + "(WdfDeviceAddQueryInterface failed with status %!STATUS!)", GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data1, GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data2, GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data3, @@ -190,7 +199,10 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfDeviceAddQueryInterface failed with status %!STATUS!", status); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "WdfDeviceAddQueryInterface failed with status %!STATUS!", + status); return status; } @@ -225,7 +237,10 @@ NTSTATUS Xusb_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION status = WdfIoQueueCreate(Device, &holdingInQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &xusb->HoldingUsbInRequests); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, "WdfIoQueueCreate (HoldingUsbInRequests) failed with status %!STATUS!", status); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "WdfIoQueueCreate (HoldingUsbInRequests) failed with status %!STATUS!", + status); return status; } @@ -394,7 +409,9 @@ VOID Xusb_GetDeviceDescriptorType(PUSB_DEVICE_DESCRIPTOR pDescriptor, PPDO_DEVIC VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) { - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_XUSB, + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, @@ -424,7 +441,9 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_XUSB, + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, @@ -470,7 +489,9 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_XUSB, + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, @@ -492,7 +513,9 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_XUSB, + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, From 5dfce363b3cdbee453daf65c30e22d71965dbe18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 14:15:47 +0200 Subject: [PATCH 41/52] Added additional tracing to Xusb_PreparePdo --- sys/xusb.c | 75 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/sys/xusb.c b/sys/xusb.c index af937e6..1df896a 100644 --- a/sys/xusb.c +++ b/sys/xusb.c @@ -39,7 +39,13 @@ NTSTATUS Xusb_PreparePdo( // prepare device description status = RtlUnicodeStringInit(DeviceDescription, L"Virtual Xbox 360 Controller"); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "RtlUnicodeStringInit failed with status %!STATUS!", + status); return status; + } // Set hardware ID RtlUnicodeStringPrintf(&buffer, L"USB\\VID_%04X&PID_%04X", VendorId, ProductId); @@ -48,32 +54,63 @@ NTSTATUS Xusb_PreparePdo( status = WdfPdoInitAddHardwareID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "WdfPdoInitAddHardwareID failed with status %!STATUS!", + status); return status; + } + // Set compatible IDs RtlUnicodeStringInit(&buffer, L"USB\\MS_COMP_XUSB10"); status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "WdfPdoInitAddCompatibleID #1 failed with status %!STATUS!", + status); return status; + } RtlUnicodeStringInit(&buffer, L"USB\\Class_FF&SubClass_5D&Prot_01"); status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "WdfPdoInitAddCompatibleID #2 failed with status %!STATUS!", + status); return status; + } RtlUnicodeStringInit(&buffer, L"USB\\Class_FF&SubClass_5D"); status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "WdfPdoInitAddCompatibleID #3 failed with status %!STATUS!", + status); return status; + } RtlUnicodeStringInit(&buffer, L"USB\\Class_FF"); status = WdfPdoInitAddCompatibleID(DeviceInit, &buffer); if (!NT_SUCCESS(status)) + { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "WdfPdoInitAddCompatibleID #4 failed with status %!STATUS!", + status); return status; + } return STATUS_SUCCESS; } @@ -102,8 +139,8 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, - TRACE_XUSB, + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X " \ "(WdfDeviceAddQueryInterface failed with status %!STATUS!)", GUID_DEVINTERFACE_XUSB_UNKNOWN_0.Data1, @@ -129,8 +166,8 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, - TRACE_XUSB, + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X " \ "(WdfDeviceAddQueryInterface failed with status %!STATUS!)", GUID_DEVINTERFACE_XUSB_UNKNOWN_1.Data1, @@ -156,8 +193,8 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, - TRACE_XUSB, + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, "Couldn't register unknown interface GUID: %08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X " \ "(WdfDeviceAddQueryInterface failed with status %!STATUS!)", GUID_DEVINTERFACE_XUSB_UNKNOWN_2.Data1, @@ -199,9 +236,9 @@ NTSTATUS Xusb_PrepareHardware(WDFDEVICE Device) status = WdfDeviceAddQueryInterface(Device, &ifaceCfg); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, - TRACE_XUSB, - "WdfDeviceAddQueryInterface failed with status %!STATUS!", + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_XUSB, + "WdfDeviceAddQueryInterface failed with status %!STATUS!", status); return status; } @@ -237,9 +274,9 @@ NTSTATUS Xusb_AssignPdoContext(WDFDEVICE Device, PPDO_IDENTIFICATION_DESCRIPTION status = WdfIoQueueCreate(Device, &holdingInQueueConfig, WDF_NO_OBJECT_ATTRIBUTES, &xusb->HoldingUsbInRequests); if (!NT_SUCCESS(status)) { - TraceEvents(TRACE_LEVEL_ERROR, + TraceEvents(TRACE_LEVEL_ERROR, TRACE_XUSB, - "WdfIoQueueCreate (HoldingUsbInRequests) failed with status %!STATUS!", + "WdfIoQueueCreate (HoldingUsbInRequests) failed with status %!STATUS!", status); return status; } @@ -409,8 +446,8 @@ VOID Xusb_GetDeviceDescriptorType(PUSB_DEVICE_DESCRIPTOR pDescriptor, PPDO_DEVIC VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) { - TraceEvents(TRACE_LEVEL_VERBOSE, - TRACE_XUSB, + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, @@ -441,8 +478,8 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - TraceEvents(TRACE_LEVEL_VERBOSE, - TRACE_XUSB, + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, @@ -489,8 +526,8 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - TraceEvents(TRACE_LEVEL_VERBOSE, - TRACE_XUSB, + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, @@ -513,8 +550,8 @@ VOID Xusb_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) pInfo = (PUSBD_INTERFACE_INFORMATION)((PCHAR)pInfo + pInfo->Length); - TraceEvents(TRACE_LEVEL_VERBOSE, - TRACE_XUSB, + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_XUSB, ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, From e14d9857cc081beaea74af5784e6aec773018cd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 14:24:01 +0200 Subject: [PATCH 42/52] Replaced remaining high priority KdPrint calls --- sys/Driver.c | 20 ++++++++++++++++---- sys/Ds4.c | 6 ++++-- sys/buspdo.c | 6 +++++- sys/usbpdo.c | 5 ++++- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/sys/Driver.c b/sys/Driver.c index 5b4877c..4c6c2c8 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -509,7 +509,10 @@ Bus_PdoStageResult( PAGED_CODE(); - KdPrint((DRIVERNAME "Bus_PdoStageResult: Stage: %d, Serial: %d, status: 0x%X\n", Stage, Serial, Status)); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DRIVER, + "%!FUNC! Entry (stage = %d, serial = %d, status = %!STATUS!)", + Stage, Serial, Status); pFdoData = FdoGetData(InterfaceHeader->Context); @@ -522,14 +525,20 @@ Bus_PdoStageResult( items = WdfCollectionGetCount(pFdoData->PendingPluginRequests); - KdPrint((DRIVERNAME "Items count: %d\n", items)); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DRIVER, + "Items count: %d", + items); for (i = 0; i < items; i++) { curRequest = WdfCollectionGetItem(pFdoData->PendingPluginRequests, i); curSerial = PluginRequestGetData(curRequest)->Serial; - KdPrint((DRIVERNAME "Serial: %d, curSerial: %d\n", Serial, curSerial)); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DRIVER, + "Serial: %d, curSerial: %d", + Serial, curSerial); if (Serial == curSerial) { @@ -537,7 +546,10 @@ Bus_PdoStageResult( WdfCollectionRemove(pFdoData->PendingPluginRequests, curRequest); - KdPrint((DRIVERNAME "Removed item with serial: %d\n", curSerial)); + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DRIVER, + "Removed item with serial: %d", + curSerial); break; } diff --git a/sys/Ds4.c b/sys/Ds4.c index d93fcab..627375e 100644 --- a/sys/Ds4.c +++ b/sys/Ds4.c @@ -384,11 +384,13 @@ VOID Ds4_GetDeviceDescriptorType(PUSB_DEVICE_DESCRIPTOR pDescriptor, PPDO_DEVICE VOID Ds4_SelectConfiguration(PUSBD_INTERFACE_INFORMATION pInfo) { - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d\n", + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_DS4, + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Length %d, Interface %d, Alternate %d, Pipes %d", (int)pInfo->Length, (int)pInfo->InterfaceNumber, (int)pInfo->AlternateSetting, - pInfo->NumberOfPipes)); + pInfo->NumberOfPipes); pInfo->Class = 0x03; // HID pInfo->SubClass = 0x00; diff --git a/sys/buspdo.c b/sys/buspdo.c index c455b0e..791b822 100644 --- a/sys/buspdo.c +++ b/sys/buspdo.c @@ -417,7 +417,11 @@ NTSTATUS Bus_CreatePdo( if (!NT_SUCCESS(status)) { - KdPrint((DRIVERNAME "Couldn't initialize additional contexts\n")); + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_BUSPDO, + "Couldn't initialize additional contexts: %!STATUS!", + status); + goto endCreatePdo; } diff --git a/sys/usbpdo.c b/sys/usbpdo.c index 3467b7c..9a62cfd 100644 --- a/sys/usbpdo.c +++ b/sys/usbpdo.c @@ -231,7 +231,10 @@ NTSTATUS UsbPdo_GetConfigurationDescriptorType(PURB urb, PPDO_DEVICE_DATA pCommo // NTSTATUS UsbPdo_GetStringDescriptorType(PURB urb, PPDO_DEVICE_DATA pCommon) { - KdPrint((DRIVERNAME "Index = %d\n", urb->UrbControlDescriptorRequest.Index)); + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_USBPDO, + "Index = %d", + urb->UrbControlDescriptorRequest.Index); switch (pCommon->TargetType) { From d6a2d1c31e5b3dbf1b352c1ffc6d32303e71091c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 14:25:46 +0200 Subject: [PATCH 43/52] Added missing function exit trace --- sys/Driver.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/Driver.c b/sys/Driver.c index 4c6c2c8..341715d 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -556,4 +556,6 @@ Bus_PdoStageResult( } WdfSpinLockRelease(pFdoData->PendingPluginRequestsLock); } + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit"); } From 993c31008fc4914ad578e540cd66137dd7907a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 20:54:29 +0200 Subject: [PATCH 44/52] Removed redundant line feeds --- sys/usbpdo.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sys/usbpdo.c b/sys/usbpdo.c index 9a62cfd..e823bd2 100644 --- a/sys/usbpdo.c +++ b/sys/usbpdo.c @@ -358,7 +358,7 @@ NTSTATUS UsbPdo_SelectConfiguration(PURB urb, PPDO_DEVICE_DATA pCommon) { TraceEvents(TRACE_LEVEL_WARNING, TRACE_USBPDO, - ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Invalid ConfigurationDescriptor\n"); + ">> >> >> URB_FUNCTION_SELECT_CONFIGURATION: Invalid ConfigurationDescriptor"); return STATUS_INVALID_PARAMETER; } @@ -537,7 +537,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R { TraceEvents(TRACE_LEVEL_ERROR, TRACE_USBPDO, - "No XUSB context found on device %p\n", + "No XUSB context found on device %p", Device); return STATUS_UNSUCCESSFUL; @@ -634,7 +634,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R // Data coming FROM the higher driver TO us TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_USBPDO, - ">> >> >> URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: Handle %p, Flags %X, Length %d\n", + ">> >> >> URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: Handle %p, Flags %X, Length %d", pTransfer->PipeHandle, pTransfer->TransferFlags, pTransfer->TransferBufferLength); @@ -645,7 +645,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_USBPDO, - "-- LED Buffer: %02X %02X %02X\n", + "-- LED Buffer: %02X %02X %02X", Buffer[0], Buffer[1], Buffer[2]); // extract LED byte to get controller slot @@ -658,7 +658,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_USBPDO, - "-- LED Number: %d\n", + "-- LED Number: %d", xusb->LedNumber); } } @@ -670,7 +670,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R TraceEvents(TRACE_LEVEL_VERBOSE, TRACE_USBPDO, - "-- Rumble Buffer: %02X %02X %02X %02X %02X %02X %02X %02X\n", + "-- Rumble Buffer: %02X %02X %02X %02X %02X %02X %02X %02X", Buffer[0], Buffer[1], Buffer[2], @@ -775,7 +775,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R // Data coming FROM us TO higher driver if (pTransfer->TransferFlags & USBD_TRANSFER_DIRECTION_IN) { - KdPrint((DRIVERNAME ">> >> >> Incoming request, queuing...\n")); + KdPrint((DRIVERNAME ">> >> >> Incoming request, queuing...")); /* This request is sent periodically and relies on data the "feeder" has to supply, so we queue this request and return with STATUS_PENDING. @@ -786,7 +786,7 @@ NTSTATUS UsbPdo_BulkOrInterruptTransfer(PURB urb, WDFDEVICE Device, WDFREQUEST R } // Data coming FROM the higher driver TO us - KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: Handle %p, Flags %X, Length %d\n", + KdPrint((DRIVERNAME ">> >> >> URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: Handle %p, Flags %X, Length %d", pTransfer->PipeHandle, pTransfer->TransferFlags, pTransfer->TransferBufferLength)); @@ -818,7 +818,7 @@ NTSTATUS UsbPdo_AbortPipe(WDFDEVICE Device) { TraceEvents(TRACE_LEVEL_ERROR, TRACE_USBPDO, - "No DS4 context found on device %p\n", Device); + "No DS4 context found on device %p", Device); return STATUS_UNSUCCESSFUL; } From 9fb310c18e2c45a1733332b8c604499c128103d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 20:58:28 +0200 Subject: [PATCH 45/52] Minor styling adjustments --- sys/Driver.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sys/Driver.c b/sys/Driver.c index 341715d..a7595c9 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -499,11 +499,11 @@ Bus_PdoStageResult( _In_ NTSTATUS Status ) { - ULONG i; - PFDO_DEVICE_DATA pFdoData; - WDFREQUEST curRequest; - ULONG curSerial; - ULONG items; + ULONG i; + PFDO_DEVICE_DATA pFdoData; + WDFREQUEST curRequest; + ULONG curSerial; + ULONG items; UNREFERENCED_PARAMETER(InterfaceHeader); From 20449a589b5c399692690356e36b72e6fcedb781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 21:02:36 +0200 Subject: [PATCH 46/52] Added more comments --- sys/Context.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sys/Context.h b/sys/Context.h index 4bf4bbd..452177a 100644 --- a/sys/Context.h +++ b/sys/Context.h @@ -32,6 +32,9 @@ typedef struct _PDO_IDENTIFICATION_DESCRIPTION { WDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Header; // should contain this header + // + // Unique serial number of the device on the bus + // ULONG SerialNo; // @@ -165,6 +168,9 @@ WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(FDO_FILE_DATA, FileObjectGetData) // typedef struct _FDO_PLUGIN_REQUEST_DATA { + // + // Unique serial number of the device on the bus + // ULONG Serial; } FDO_PLUGIN_REQUEST_DATA, *PFDO_PLUGIN_REQUEST_DATA; From 299f9b6d5cacd2f6352a8426b763acc854a1491e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 21:14:37 +0200 Subject: [PATCH 47/52] Added necessary context fields Added tracking start timestamp --- sys/Context.h | 10 ++++++++++ sys/busenum.c | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/sys/Context.h b/sys/Context.h index 452177a..d273995 100644 --- a/sys/Context.h +++ b/sys/Context.h @@ -173,6 +173,16 @@ typedef struct _FDO_PLUGIN_REQUEST_DATA // ULONG Serial; + // + // High resolution timestamp taken when this request got moved to pending state + // + LONGLONG Timestamp; + + // + // Performance counter system frequency taken upon fetching timestamp + // + LARGE_INTEGER Frequency; + } FDO_PLUGIN_REQUEST_DATA, *PFDO_PLUGIN_REQUEST_DATA; WDF_DECLARE_CONTEXT_TYPE_WITH_NAME(FDO_PLUGIN_REQUEST_DATA, PluginRequestGetData) diff --git a/sys/busenum.c b/sys/busenum.c index 217981c..2f69ace 100644 --- a/sys/busenum.c +++ b/sys/busenum.c @@ -224,6 +224,11 @@ NTSTATUS Bus_PlugInDevice( // pReqData->Serial = plugIn->SerialNo; + // + // Timestamp the request to track its age + // + pReqData->Timestamp = KeQueryPerformanceCounter(&pReqData->Frequency).QuadPart; + // // Keep track of pending request in collection // From d16f9f5832d6eaea4c5e564b4e10bc9bcb9510ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 21:43:25 +0200 Subject: [PATCH 48/52] Implemented timer --- sys/Context.h | 5 +++++ sys/Driver.c | 33 +++++++++++++++++++++++++++++++++ sys/busenum.h | 2 ++ 3 files changed, 40 insertions(+) diff --git a/sys/Context.h b/sys/Context.h index d273995..efd88d5 100644 --- a/sys/Context.h +++ b/sys/Context.h @@ -143,6 +143,11 @@ typedef struct _FDO_DEVICE_DATA // WDFSPINLOCK PendingPluginRequestsLock; + // + // Periodic timer sweeping up orphaned requests + // + WDFTIMER PendingPluginRequestsCleanupTimer; + } FDO_DEVICE_DATA, *PFDO_DEVICE_DATA; #define FDO_FIRST_SESSION_ID 100 diff --git a/sys/Driver.c b/sys/Driver.c index a7595c9..562621f 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -93,9 +93,11 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) WDF_OBJECT_ATTRIBUTES fdoAttributes; WDF_OBJECT_ATTRIBUTES fileHandleAttributes; WDF_OBJECT_ATTRIBUTES collectionAttributes; + WDF_OBJECT_ATTRIBUTES timerAttributes; PFDO_DEVICE_DATA pFDOData; VIGEM_BUS_INTERFACE busInterface; PINTERFACE interfaceHeader; + WDF_TIMER_CONFIG reqTimerCfg; UNREFERENCED_PARAMETER(Driver); @@ -188,6 +190,25 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) #pragma endregion +#pragma region Create timer for sweeping up orphaned requests + + WDF_TIMER_CONFIG_INIT_PERIODIC(&reqTimerCfg, Bus_PlugInRequestCleanUpEvtTimerFunc, 500); + WDF_OBJECT_ATTRIBUTES_INIT(&timerAttributes); + timerAttributes.ParentObject = device; + + status = WdfTimerCreate(&reqTimerCfg, &timerAttributes, &pFDOData->PendingPluginRequestsCleanupTimer); + if (!NT_SUCCESS(status)) { + TraceEvents(TRACE_LEVEL_ERROR, + TRACE_DRIVER, + "WdfTimerCreate failed with status %!STATUS!", + status); + return status; + } + + WdfTimerStart(pFDOData->PendingPluginRequestsCleanupTimer, WDF_REL_TIMEOUT_IN_SEC(1)); + +#pragma endregion + #pragma region Add query interface // @@ -559,3 +580,15 @@ Bus_PdoStageResult( TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit"); } + +_Use_decl_annotations_ +VOID +Bus_PlugInRequestCleanUpEvtTimerFunc( + WDFTIMER Timer +) +{ + UNREFERENCED_PARAMETER(Timer); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry"); +} + diff --git a/sys/busenum.h b/sys/busenum.h index dea6a0c..ee703b6 100644 --- a/sys/busenum.h +++ b/sys/busenum.h @@ -102,6 +102,8 @@ EVT_WDF_TIMER Xgip_SysInitTimerFunc; EVT_WDF_OBJECT_CONTEXT_CLEANUP Bus_EvtDriverContextCleanup; +EVT_WDF_TIMER Bus_PlugInRequestCleanUpEvtTimerFunc; + #pragma endregion #pragma region Bus enumeration-specific functions From 301f9dd095b486d9c0d5fe0e73b539a9e89ced38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 22:15:07 +0200 Subject: [PATCH 49/52] Implemented Bus_PlugInRequestCleanUpEvtTimerFunc --- sys/Context.h | 2 +- sys/Driver.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++- sys/busenum.c | 2 +- 3 files changed, 54 insertions(+), 3 deletions(-) diff --git a/sys/Context.h b/sys/Context.h index efd88d5..94da20c 100644 --- a/sys/Context.h +++ b/sys/Context.h @@ -181,7 +181,7 @@ typedef struct _FDO_PLUGIN_REQUEST_DATA // // High resolution timestamp taken when this request got moved to pending state // - LONGLONG Timestamp; + LARGE_INTEGER Timestamp; // // Performance counter system frequency taken upon fetching timestamp diff --git a/sys/Driver.c b/sys/Driver.c index 562621f..a992bc9 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -587,8 +587,59 @@ Bus_PlugInRequestCleanUpEvtTimerFunc( WDFTIMER Timer ) { - UNREFERENCED_PARAMETER(Timer); + ULONG i; + PFDO_DEVICE_DATA pFdoData; + WDFREQUEST curRequest; + ULONG items; + WDFDEVICE device; + PFDO_PLUGIN_REQUEST_DATA pPluginData; + LONGLONG freq; + LARGE_INTEGER pcNow; + LONGLONG ellapsed; + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry"); + + device = WdfTimerGetParentObject(Timer); + pFdoData = FdoGetData(device); + + WdfSpinLockAcquire(pFdoData->PendingPluginRequestsLock); + + items = WdfCollectionGetCount(pFdoData->PendingPluginRequests); + + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DRIVER, + "Items count: %d", + items); + + for (i = 0; i < items; i++) + { + curRequest = WdfCollectionGetItem(pFdoData->PendingPluginRequests, i); + pPluginData = PluginRequestGetData(curRequest); + + freq = pPluginData->Frequency.QuadPart / 1000; + pcNow = KeQueryPerformanceCounter(NULL); + ellapsed = (pcNow.QuadPart - pPluginData->Timestamp.QuadPart) / freq; + + TraceEvents(TRACE_LEVEL_VERBOSE, + TRACE_DRIVER, + "PDO (serial = %d) age: %llu", + pPluginData->Serial, ellapsed); + + //if (Serial == curSerial) + //{ + // WdfRequestComplete(curRequest, Status); + // + // WdfCollectionRemove(pFdoData->PendingPluginRequests, curRequest); + // + // TraceEvents(TRACE_LEVEL_INFORMATION, + // TRACE_DRIVER, + // "Removed item with serial: %d", + // curSerial); + // + // break; + //} + } + WdfSpinLockRelease(pFdoData->PendingPluginRequestsLock); } diff --git a/sys/busenum.c b/sys/busenum.c index 2f69ace..183332d 100644 --- a/sys/busenum.c +++ b/sys/busenum.c @@ -227,7 +227,7 @@ NTSTATUS Bus_PlugInDevice( // // Timestamp the request to track its age // - pReqData->Timestamp = KeQueryPerformanceCounter(&pReqData->Frequency).QuadPart; + pReqData->Timestamp = KeQueryPerformanceCounter(&pReqData->Frequency); // // Keep track of pending request in collection From 3e0cca773aaaa1af18d5a82d7bb2ac82cb7b8cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 22:21:07 +0200 Subject: [PATCH 50/52] Finished Bus_PlugInRequestCleanUpEvtTimerFunc implementation --- sys/Driver.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/sys/Driver.c b/sys/Driver.c index a992bc9..d81cc73 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -626,19 +626,19 @@ Bus_PlugInRequestCleanUpEvtTimerFunc( "PDO (serial = %d) age: %llu", pPluginData->Serial, ellapsed); - //if (Serial == curSerial) - //{ - // WdfRequestComplete(curRequest, Status); - // - // WdfCollectionRemove(pFdoData->PendingPluginRequests, curRequest); - // - // TraceEvents(TRACE_LEVEL_INFORMATION, - // TRACE_DRIVER, - // "Removed item with serial: %d", - // curSerial); - // - // break; - //} + if (ellapsed > 500) + { + WdfRequestComplete(curRequest, STATUS_SUCCESS); + + WdfCollectionRemove(pFdoData->PendingPluginRequests, curRequest); + + TraceEvents(TRACE_LEVEL_INFORMATION, + TRACE_DRIVER, + "Removed item with serial: %d", + pPluginData->Serial); + + break; + } } WdfSpinLockRelease(pFdoData->PendingPluginRequestsLock); } From 8218e2bcddf8ea3ce121969f216aaa826a769d11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 22:27:53 +0200 Subject: [PATCH 51/52] Introduced variables --- sys/Driver.c | 15 +++++++++++---- sys/busenum.h | 5 +++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/sys/Driver.c b/sys/Driver.c index d81cc73..8e66b34 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -192,7 +192,11 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) #pragma region Create timer for sweeping up orphaned requests - WDF_TIMER_CONFIG_INIT_PERIODIC(&reqTimerCfg, Bus_PlugInRequestCleanUpEvtTimerFunc, 500); + WDF_TIMER_CONFIG_INIT_PERIODIC( + &reqTimerCfg, + Bus_PlugInRequestCleanUpEvtTimerFunc, + ORC_TIMER_START_DELAY + ); WDF_OBJECT_ATTRIBUTES_INIT(&timerAttributes); timerAttributes.ParentObject = device; @@ -205,7 +209,10 @@ NTSTATUS Bus_EvtDeviceAdd(IN WDFDRIVER Driver, IN PWDFDEVICE_INIT DeviceInit) return status; } - WdfTimerStart(pFDOData->PendingPluginRequestsCleanupTimer, WDF_REL_TIMEOUT_IN_SEC(1)); + WdfTimerStart( + pFDOData->PendingPluginRequestsCleanupTimer, + WDF_REL_TIMEOUT_IN_MS(ORC_TIMER_PERIODIC_DUE_TIME) + ); #pragma endregion @@ -617,7 +624,7 @@ Bus_PlugInRequestCleanUpEvtTimerFunc( curRequest = WdfCollectionGetItem(pFdoData->PendingPluginRequests, i); pPluginData = PluginRequestGetData(curRequest); - freq = pPluginData->Frequency.QuadPart / 1000; + freq = pPluginData->Frequency.QuadPart / ORC_PC_FREQUENCY_DIVIDER; pcNow = KeQueryPerformanceCounter(NULL); ellapsed = (pcNow.QuadPart - pPluginData->Timestamp.QuadPart) / freq; @@ -626,7 +633,7 @@ Bus_PlugInRequestCleanUpEvtTimerFunc( "PDO (serial = %d) age: %llu", pPluginData->Serial, ellapsed); - if (ellapsed > 500) + if (ellapsed >= ORC_REQUEST_MAX_AGE) { WdfRequestComplete(curRequest, STATUS_SUCCESS); diff --git a/sys/busenum.h b/sys/busenum.h index ee703b6..b115d9c 100644 --- a/sys/busenum.h +++ b/sys/busenum.h @@ -58,6 +58,11 @@ SOFTWARE. #define DRIVERNAME "ViGEm: " #define MAX_HARDWARE_ID_LENGTH 0xFF +#define ORC_PC_FREQUENCY_DIVIDER 1000 +#define ORC_TIMER_START_DELAY 500 // ms +#define ORC_TIMER_PERIODIC_DUE_TIME 500 // ms +#define ORC_REQUEST_MAX_AGE 500 // ms + #pragma endregion #pragma region Helpers From a9e34bfe502403db71f5be1ea57b82c637c6da9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=B6glinger?= Date: Sun, 13 May 2018 22:31:24 +0200 Subject: [PATCH 52/52] Added missing trace --- sys/Driver.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sys/Driver.c b/sys/Driver.c index 8e66b34..0c61645 100644 --- a/sys/Driver.c +++ b/sys/Driver.c @@ -648,5 +648,7 @@ Bus_PlugInRequestCleanUpEvtTimerFunc( } } WdfSpinLockRelease(pFdoData->PendingPluginRequestsLock); + + TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit"); }