From 0b695a6f701296ffa420939b1d3ada5b44f2487f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 28 May 2023 22:44:08 +0200 Subject: [PATCH] [NTOS:IO] iorsrce.c: Add DBG traces for bus/device enumeration functions. --- ntoskrnl/io/iomgr/iorsrce.c | 74 +++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/ntoskrnl/io/iomgr/iorsrce.c b/ntoskrnl/io/iomgr/iorsrce.c index d5f40023728..01f2b104a84 100644 --- a/ntoskrnl/io/iomgr/iorsrce.c +++ b/ntoskrnl/io/iomgr/iorsrce.c @@ -12,8 +12,19 @@ /* INCLUDES *****************************************************************/ #include +#define NDEBUG #include +#ifndef NDEBUG + #define IORSRCTRACE(...) DbgPrint(__VA_ARGS__) +#else + #if defined(_MSC_VER) + #define IORSRCTRACE __noop + #else + #define IORSRCTRACE(...) do { if(0) { DbgPrint(__VA_ARGS__); } } while(0) + #endif +#endif + /* GLOBALS *******************************************************************/ static CONFIGURATION_INFORMATION @@ -150,6 +161,14 @@ IopQueryDeviceDescription( UNICODE_STRING TempString; WCHAR TempBuffer[14]; + IORSRCTRACE("\nIopQueryDeviceDescription(Query: 0x%p)\n" + " RootKey: '%wZ'\n" + " RootKeyHandle: 0x%p\n" + " Bus: %lu\n", + Query, + &RootKey, RootKeyHandle, + Bus); + /* Temporary string */ TempString.MaximumLength = sizeof(TempBuffer); TempString.Length = 0; @@ -164,9 +183,12 @@ IopQueryDeviceDescription( { ControllerNumber = *Query->ControllerNumber; MaximumControllerNumber = ControllerNumber + 1; + IORSRCTRACE(" Getting controller #%lu\n", ControllerNumber); } else { + IORSRCTRACE(" Enumerating controllers in '%wZ'...\n", &ControllerRootRegName); + /* Find out how many controllers there are */ InitializeObjectAttributes(&ObjectAttributes, &ControllerRootRegName, @@ -234,6 +256,8 @@ IopQueryDeviceDescription( if (!NT_SUCCESS(Status)) break; + IORSRCTRACE(" Retrieving controller '%wZ'\n", &ControllerRootRegName); + /* Open the registry key */ InitializeObjectAttributes(&ObjectAttributes, &ControllerRootRegName, @@ -289,6 +313,9 @@ IopQueryDeviceDescription( /* We now have bus *AND* controller information, is it enough? */ if (!Query->PeripheralType || !(*Query->PeripheralType)) { + IORSRCTRACE(" --> Bus #%lu Controller #%lu Callout: '%wZ'\n", + Bus, ControllerNumber, &ControllerRootRegName); + Status = Query->CalloutRoutine(Query->Context, &ControllerRootRegName, *Query->BusType, @@ -316,9 +343,12 @@ IopQueryDeviceDescription( { PeripheralNumber = *Query->PeripheralNumber; MaximumPeripheralNumber = PeripheralNumber + 1; + IORSRCTRACE(" Getting peripheral #%lu\n", PeripheralNumber); } else { + IORSRCTRACE(" Enumerating peripherals in '%wZ'...\n", &ControllerRootRegName); + /* Find out how many peripherals there are */ InitializeObjectAttributes(&ObjectAttributes, &ControllerRootRegName, @@ -385,6 +415,8 @@ IopQueryDeviceDescription( if (!NT_SUCCESS(Status)) break; + IORSRCTRACE(" Retrieving peripheral '%wZ'\n", &ControllerRootRegName); + /* Open the registry key */ InitializeObjectAttributes(&ObjectAttributes, &ControllerRootRegName, @@ -435,6 +467,9 @@ IopQueryDeviceDescription( /* We now have everything the caller could possibly want */ if (NT_SUCCESS(Status)) { + IORSRCTRACE(" --> Bus #%lu Controller #%lu Peripheral #%lu Callout: '%wZ'\n", + Bus, ControllerNumber, PeripheralNumber, &ControllerRootRegName); + Status = Query->CalloutRoutine(Query->Context, &ControllerRootRegName, *Query->BusType, @@ -531,6 +566,16 @@ IopQueryBusDescription( PKEY_VALUE_FULL_INFORMATION BusInformation[IoQueryDeviceMaxData] = {NULL, NULL, NULL}; + IORSRCTRACE("\nIopQueryBusDescription(Query: 0x%p)\n" + " RootKey: '%wZ'\n" + " RootKeyHandle: 0x%p\n" + " KeyIsRoot: %s\n" + " Bus: 0x%p (%lu)\n", + Query, + &RootKey, RootKeyHandle, + KeyIsRoot ? "TRUE" : "FALSE", + Bus, Bus ? *Bus : -1); + /* Retrieve the necessary buffer space */ Status = ZwQueryKey(RootKeyHandle, KeyFullInformation, @@ -587,6 +632,8 @@ IopQueryBusDescription( if (!NT_SUCCESS(Status)) break; + IORSRCTRACE(" Seen: '%.*ws'\n", BasicInformation->NameLength/sizeof(WCHAR), BasicInformation->Name); + /* What bus are we going to go down? (only check if this is a root key) */ if (KeyIsRoot) { @@ -622,6 +669,8 @@ IopQueryBusDescription( RtlAppendUnicodeToString(&SubRootRegName, L"\\"); RtlAppendUnicodeStringToString(&SubRootRegName, &BusString); + IORSRCTRACE(" SubRootRegName: '%wZ'\n", &SubRootRegName); + if (!KeyIsRoot) { /* Parsing a sub-bus key */ @@ -631,6 +680,8 @@ IopQueryBusDescription( /* Identifier string first */ RtlInitUnicodeString(&SubBusString, IoDeviceInfoNames[SubBusLoop]); + IORSRCTRACE(" Getting bus value: '%wZ'\n", &SubBusString); + /* Retrieve the necessary buffer space */ ZwQueryValueKey(SubRootKeyHandle, &SubBusString, @@ -670,6 +721,8 @@ IopQueryBusDescription( { if (Query->ControllerType == NULL) { + IORSRCTRACE(" --> Bus #%lu Callout: '%wZ'\n", *Bus, &SubRootRegName); + /* We don't want controller information: call the callback */ Status = Query->CalloutRoutine(Query->Context, &SubRootRegName, @@ -685,6 +738,8 @@ IopQueryBusDescription( } else { + IORSRCTRACE(" --> Getting device on Bus #%lu : '%wZ'\n", *Bus, &SubRootRegName); + /* We want controller information: get it */ Status = IopQueryDeviceDescription(Query, SubRootRegName, @@ -1143,6 +1198,25 @@ IoQueryDeviceDescription( HANDLE RootRegHandle; IO_QUERY Query; + IORSRCTRACE("\nIoQueryDeviceDescription()\n" + " BusType: 0x%p (%lu)\n" + " BusNumber: 0x%p (%lu)\n" + " ControllerType: 0x%p (%lu)\n" + " ControllerNumber: 0x%p (%lu)\n" + " PeripheralType: 0x%p (%lu)\n" + " PeripheralNumber: 0x%p (%lu)\n" + " CalloutRoutine: 0x%p\n" + " Context: 0x%p\n" + "--> Query: 0x%p\n", + BusType, BusType ? *BusType : -1, + BusNumber, BusNumber ? *BusNumber : -1, + ControllerType, ControllerType ? *ControllerType : -1, + ControllerNumber, ControllerNumber ? *ControllerNumber : -1, + PeripheralType, PeripheralType ? *PeripheralType : -1, + PeripheralNumber, PeripheralNumber ? *PeripheralNumber : -1, + CalloutRoutine, Context, + &Query); + /* Set up the string */ RootRegKey.Length = 0; RootRegKey.MaximumLength = 2048;