20_SystemConfigurationInformation = { 0, 0, 0, 0, 0, 0, 0,
FALSE,
FALSE, 0, 0 };
37 L"FloatingPointProcessor",
47 L"MultifunctionAdapter",
55 L"ParallelController",
57 L"KeyboardController",
61 L"FloppyDiskPeripheral",
67 L"KeyboardPeripheral",
68 L"TerminalPeripheral",
73 L"DockingInformation",
74 L"RealModeIrqRoutingTable",
75 L"RealModePCIEnumeration",
113 HANDLE ControllerKeyHandle;
116 ULONG ControllerNumber;
117 ULONG ControllerLoop;
118 ULONG MaximumControllerNumber;
122 HANDLE PeripheralKeyHandle;
125 ULONG PeripheralNumber;
126 ULONG PeripheralLoop;
127 ULONG MaximumPeripheralNumber;
131 ULONG LenFullInformation;
132 ULONG LenKeyFullInformation;
134 WCHAR TempBuffer[14];
137 L"Configuration Data",
138 L"Component Information"
144 TempString.
Buffer = TempBuffer;
151 if (
Query->ControllerNumber && *(
Query->ControllerNumber))
153 ControllerNumber = *
Query->ControllerNumber;
154 MaximumControllerNumber = ControllerNumber + 1;
159 &ControllerRootRegName,
174 Status = ZwQueryKey(ControllerKeyHandle,
KeyFullInformation, ControllerFullInformation, LenFullInformation, &LenFullInformation);
176 ControllerKeyHandle =
NULL;
182 if (ControllerFullInformation !=
NULL)
188 ControllerNumber = 0;
189 MaximumControllerNumber = ControllerFullInformation->
SubKeys;
193 ControllerFullInformation =
NULL;
197 ControllerRegName = ControllerRootRegName;
200 for (; ControllerNumber < MaximumControllerNumber; ControllerNumber++)
203 ControllerRootRegName = ControllerRegName;
218 &ControllerRootRegName,
228 for (ControllerLoop = 0; ControllerLoop < 3; ControllerLoop++)
243 Status = ZwQueryValueKey(ControllerKeyHandle, &ControllerString,
KeyValueFullInformation, ControllerInformation[ControllerLoop], LenKeyFullInformation, &LenKeyFullInformation);
248 ControllerKeyHandle =
NULL;
256 if (!
Query->PeripheralType || !(*
Query->PeripheralType))
260 &ControllerRootRegName,
264 *
Query->ControllerType,
266 ControllerInformation,
281 if (
Query->PeripheralNumber && *
Query->PeripheralNumber)
283 PeripheralNumber = *
Query->PeripheralNumber;
284 MaximumPeripheralNumber = PeripheralNumber + 1;
289 &ControllerRootRegName,
305 Status = ZwQueryKey(PeripheralKeyHandle,
KeyFullInformation, PeripheralFullInformation, LenFullInformation, &LenFullInformation);
307 PeripheralKeyHandle =
NULL;
318 PeripheralNumber = 0;
319 MaximumPeripheralNumber = PeripheralFullInformation->
SubKeys;
323 PeripheralFullInformation =
NULL;
327 ControllerRegName = ControllerRootRegName;
330 for (; PeripheralNumber < MaximumPeripheralNumber; PeripheralNumber++)
333 ControllerRootRegName = ControllerRegName;
348 &ControllerRootRegName,
357 for (PeripheralLoop = 0; PeripheralLoop < 3; PeripheralLoop++)
367 PeripheralInformation[PeripheralLoop] =
NULL;
375 Status = ZwQueryValueKey(PeripheralKeyHandle, &PeripheralString,
KeyValueFullInformation, PeripheralInformation[PeripheralLoop], LenKeyFullInformation, &LenKeyFullInformation);
380 PeripheralKeyHandle =
NULL;
387 &ControllerRootRegName,
391 *
Query->ControllerType,
393 ControllerInformation,
394 *
Query->PeripheralType,
396 PeripheralInformation);
400 for (PeripheralLoop = 0; PeripheralLoop < 3; PeripheralLoop++)
402 if (PeripheralInformation[PeripheralLoop])
405 PeripheralInformation[PeripheralLoop] =
NULL;
416 for (ControllerLoop = 0; ControllerLoop < 3; ControllerLoop++)
418 if (ControllerInformation[ControllerLoop])
421 ControllerInformation[ControllerLoop] =
NULL;
466 ULONG LenBasicInformation = 0;
467 ULONG LenFullInformation;
468 ULONG LenKeyFullInformation;
485 if (!FullInformation)
508 if ((
Query->BusNumber) && (*(
Query->BusNumber)) == *Bus)
break;
563 L"Configuration Data",
564 L"Component Information"};
566 for (SubBusLoop = 0; SubBusLoop < 3; SubBusLoop++)
619 for (SubBusLoop = 0; SubBusLoop < 3; SubBusLoop++)
632 SubRootKeyHandle =
NULL;
644 SubRootKeyHandle =
NULL;
648 if (BasicInformation)
662 ULONG IntInterfaces = 0;
663 PWSTR IntSymbolicLinkList;
690 *Interfaces = IntInterfaces;
704 WCHAR LinkTargetBuffer[256];
707 ASSERT(NtSystemPartitionDeviceName->MaximumLength >= NtSystemPartitionDeviceName->Length +
sizeof(
WCHAR));
708 ASSERT(NtSystemPartitionDeviceName->Buffer[NtSystemPartitionDeviceName->Length /
sizeof(
WCHAR)] ==
UNICODE_NULL);
709 ASSERT(OsLoaderPathName->MaximumLength >= OsLoaderPathName->Length +
sizeof(
WCHAR));
714 NtSystemPartitionDeviceName,
725 DPRINT(
"Failed to open symlink %wZ, Status=%lx\n", NtSystemPartitionDeviceName,
Status);
736 Status = ZwQuerySymbolicLinkObject(LinkHandle,
745 DPRINT(
"Failed querying symlink %wZ, Status=%lx\n", NtSystemPartitionDeviceName,
Status);
755 &CmRegistryMachineSystemName,
759 DPRINT(
"Failed to open HKLM\\SYSTEM, Status=%lx\n",
Status);
778 DPRINT(
"Failed opening/creating Setup key, Status=%lx\n",
Status);
794 DPRINT(
"Failed writing SystemPartition value, Status=%lx\n",
Status);
801 if (OsLoaderPathName->Length >
sizeof(
WCHAR) &&
804 OsLoaderPathName->Length -=
sizeof(
WCHAR);
805 OsLoaderPathName->Buffer[OsLoaderPathName->Length /
sizeof(
WCHAR)] =
UNICODE_NULL;
813 OsLoaderPathName->Buffer,
817 DPRINT(
"Failed writing OsLoaderPath value, Status=%lx\n",
Status);
842 ULONG DriverListSize,
845 ULONG DeviceListSize,
874 DPRINT1(
"IoReportResourceUsage is halfplemented!\n");
887 *ConflictDetected =
TRUE;
889 if (!OverrideConflict)
891 DPRINT1(
"Denying an attempt to claim resources currently in use by another device!\n");
896 DPRINT1(
"Proceeding with conflicting resources\n");
906 *ConflictDetected =
FALSE;
921 DPRINT1(
"IopLegacyResourceAllocation is halfplemented!\n");
938 DPRINT1(
"Denying an attempt to claim resources currently in use by another device!\n");
979 if (RequestedResources)
982 if (!(RequestedResources->AlternativeLists) || !(RequestedResources->List[0].Count))
985 RequestedResources =
NULL;
1030 ULONG BusLoopNumber = -1;
1057 Query.ControllerType = ControllerType;
1058 Query.ControllerNumber = ControllerNumber;
1059 Query.PeripheralType = PeripheralType;
1060 Query.PeripheralNumber = PeripheralNumber;
1061 Query.CalloutRoutine = CalloutRoutine;
1109 L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP");
1115 Status = ZwCreateKey(&ResourcemapKey,
1127 L"Hardware Abstraction Layer");
1133 Status = ZwCreateKey(&HalKey,
#define OBJ_NAME_PATH_SEPARATOR
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended)
static const CLASS_AND_INTERFACES ExpectedInterfaces[]
_In_ ULONG _In_opt_ WDFREQUEST _In_opt_ PVOID _In_ size_t _In_ PVOID _In_ size_t _Out_ size_t * DataLength
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define NT_SUCCESS(StatCode)
static const WCHAR Strings[]
static const WCHAR DescriptionKey[]
#define ExAllocatePoolWithTag(hernya, size, tag)
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
enum _INTERFACE_TYPE * PINTERFACE_TYPE
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
struct IO_QUERY * PIO_QUERY
VOID NTAPI IopStoreSystemPartitionInformation(IN PUNICODE_STRING NtSystemPartitionDeviceName, IN PUNICODE_STRING OsLoaderPathName)
NTSTATUS NTAPI IopLegacyResourceAllocation(IN ARBITER_REQUEST_SOURCE AllocationType, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements, IN OUT PCM_RESOURCE_LIST *AllocatedResources)
NTSTATUS NTAPI IoAssignResources(IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject, IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources, IN OUT PCM_RESOURCE_LIST *AllocatedResources)
NTSTATUS NTAPI IopQueryBusDescription(PIO_QUERY Query, UNICODE_STRING RootKey, HANDLE RootKeyHandle, PULONG Bus, BOOLEAN KeyIsRoot)
NTSTATUS NTAPI IoReportHalResourceUsage(PUNICODE_STRING HalDescription, PCM_RESOURCE_LIST RawList, PCM_RESOURCE_LIST TranslatedList, ULONG ListSize)
NTSTATUS NTAPI IoReportResourceUsage(PUNICODE_STRING DriverClassName, PDRIVER_OBJECT DriverObject, PCM_RESOURCE_LIST DriverList, ULONG DriverListSize, PDEVICE_OBJECT DeviceObject, PCM_RESOURCE_LIST DeviceList, ULONG DeviceListSize, BOOLEAN OverrideConflict, PBOOLEAN ConflictDetected)
NTSTATUS NTAPI IoQueryDeviceDescription(PINTERFACE_TYPE BusType OPTIONAL, PULONG BusNumber OPTIONAL, PCONFIGURATION_TYPE ControllerType OPTIONAL, PULONG ControllerNumber OPTIONAL, PCONFIGURATION_TYPE PeripheralType OPTIONAL, PULONG PeripheralNumber OPTIONAL, PIO_QUERY_DEVICE_ROUTINE CalloutRoutine, PVOID Context)
NTSTATUS NTAPI IopFetchConfigurationInformation(OUT PWSTR *SymbolicLinkList, IN GUID Guid, IN ULONG ExpectedInterfaces, IN PULONG Interfaces)
static CONFIGURATION_INFORMATION _SystemConfigurationInformation
PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID)
NTSTATUS NTAPI IopQueryDeviceDescription(PIO_QUERY Query, UNICODE_STRING RootKey, HANDLE RootKeyHandle, ULONG Bus, PKEY_VALUE_FULL_INFORMATION *BusInformation)
#define ExFreePoolWithTag(_P, _T)
#define InitializeObjectAttributes(p, n, a, r, s)
_Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PCM_RESOURCE_LIST * AllocatedResources
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
#define DNF_LEGACY_RESOURCE_DEVICENODE
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG AllocationType
NTSYSAPI NTSTATUS NTAPI ZwOpenSymbolicLinkObject(_Out_ PHANDLE SymbolicLinkHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define SYMBOLIC_LINK_QUERY
@ KeyValueFullInformation
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
struct _KEY_BASIC_INFORMATION KEY_BASIC_INFORMATION
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define REG_OPTION_NON_VOLATILE
#define REG_RESOURCE_LIST
NTSYSAPI NTSTATUS NTAPI RtlIntegerToUnicodeString(ULONG Value, ULONG Base, PUNICODE_STRING String)
#define REG_OPTION_VOLATILE
NTSTATUS NTAPI IopOpenRegistryKeyEx(PHANDLE KeyHandle, HANDLE ParentKey, PUNICODE_STRING Name, ACCESS_MASK DesiredAccess)
PDEVICE_NODE FASTCALL IopGetDeviceNode(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI IopFixupResourceListWithRequirements(IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList, OUT PCM_RESOURCE_LIST *ResourceList)
NTSTATUS NTAPI IopCreateRegistryKeyEx(OUT PHANDLE Handle, IN HANDLE BaseHandle OPTIONAL, IN PUNICODE_STRING KeyName, IN ACCESS_MASK DesiredAccess, IN ULONG CreateOptions, OUT PULONG Disposition OPTIONAL)
NTSTATUS NTAPI IopDetectResourceConflict(IN PCM_RESOURCE_LIST ResourceList, IN BOOLEAN Silent, OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor)
NTSTATUS NTAPI IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL, IN ULONG Flags, OUT PWSTR *SymbolicLinkList)
#define STATUS_NO_MORE_ENTRIES
#define STATUS_NOT_IMPLEMENTED
#define STATUS_CONFLICTING_ADDRESSES
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
_Check_return_ _CRTIMP int __cdecl wcsncmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_OVERFLOW
PULONG MinorVersion OPTIONAL
PIO_QUERY_DEVICE_ROUTINE CalloutRoutine
PCONFIGURATION_TYPE PeripheralType
PCONFIGURATION_TYPE ControllerType
#define RTL_CONSTANT_STRING(s)
#define STATUS_INVALID_PARAMETER
#define STATUS_UNSUCCESSFUL
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
_In_ WDFDEVICE _In_ PPNP_BUS_INFORMATION BusInformation
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID InterfaceType
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
_In_opt_ PUNICODE_STRING DriverClassName
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE _In_ ULONG BusNumber
_In_opt_ PUNICODE_STRING _In_ PDRIVER_OBJECT _In_ PDEVICE_OBJECT _In_ INTERFACE_TYPE BusType
_In_opt_ PDEVICE_OBJECT _In_ ULONG _Outptr_result_nullonfailure_ _At_ * SymbolicLinkList(return==0, __drv_allocatesMem(Mem))) PZZWSTR *SymbolicLinkList
_In_ INTERFACE_TYPE _In_ ULONG _In_ ULONG _In_opt_ PCM_RESOURCE_LIST _In_opt_ PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements
enum _ARBITER_REQUEST_SOURCE ARBITER_REQUEST_SOURCE
@ ArbiterRequestLegacyAssigned
NTSTATUS(NTAPI * PIO_QUERY_DEVICE_ROUTINE)(_In_ PVOID Context, _In_ PUNICODE_STRING PathName, _In_ INTERFACE_TYPE BusType, _In_ ULONG BusNumber, _In_ PKEY_VALUE_FULL_INFORMATION *BusInformation, _In_ CONFIGURATION_TYPE ControllerType, _In_ ULONG ControllerNumber, _In_ PKEY_VALUE_FULL_INFORMATION *ControllerInformation, _In_ CONFIGURATION_TYPE PeripheralType, _In_ ULONG PeripheralNumber, _In_ PKEY_VALUE_FULL_INFORMATION *PeripheralInformation)
_Inout_ PUNICODE_STRING LinkTarget