At some point after initializing RAWFS you need to call HalInitPnpDriver -- which through the HAL private dispatch table should call into the HAL's PNP driver (either ACPI or PCAT).
Richard and I got that far with Gopher. Best regards, Alex Ionescu On Sun, Aug 14, 2011 at 10:15 PM, <[email protected]> wrote: > Author: cgutman > Date: Mon Aug 15 02:15:18 2011 > New Revision: 53249 > > URL: http://svn.reactos.org/svn/reactos?rev=53249&view=rev > Log: > [NTOSKRNL] > - Rewrite IopIsAcpiComputer (and rename to IopIsFirmwareMapperDisabled) to > eliminate the need for the ENABLE_ACPI define > - IopIsFirmwareMapperDisabled now reads the registry entry that HAL sets to > indicate that the firmware mapper should be disabled > - Partially rewrite IopUpdateRootKey so it does not interfere with HAL's > PnP driver > - ACPI is automatically enabled when the ACPI HAL is loaded and disabled > when the standard HAL is loaded > > Modified: > trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c > > Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c > URL: > http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c?rev=53249&r1=53248&r2=53249&view=diff > > ============================================================================== > --- trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c [iso-8859-1] (original) > +++ trunk/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c [iso-8859-1] Mon Aug 15 > 02:15:18 2011 > @@ -12,8 +12,6 @@ > #include <ntoskrnl.h> > #define NDEBUG > #include <debug.h> > - > -//#define ENABLE_ACPI > > /* GLOBALS > *******************************************************************/ > > @@ -2693,143 +2691,73 @@ > } > > static BOOLEAN INIT_FUNCTION > -IopIsAcpiComputer(VOID) > -{ > -#ifndef ENABLE_ACPI > - return FALSE; > -#else > - UNICODE_STRING MultiKeyPathU = > RTL_CONSTANT_STRING(L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System\\MultifunctionAdapter"); > - UNICODE_STRING IdentifierU = RTL_CONSTANT_STRING(L"Identifier"); > - UNICODE_STRING AcpiBiosIdentifier = RTL_CONSTANT_STRING(L"ACPI BIOS"); > +IopIsFirmwareMapperDisabled(VOID) > +{ > + UNICODE_STRING KeyPathU = > RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CURRENTCONTROLSET\\Control\\Pnp"); > + UNICODE_STRING KeyNameU = > RTL_CONSTANT_STRING(L"DisableFirmwareMapper"); > OBJECT_ATTRIBUTES ObjectAttributes; > - PKEY_BASIC_INFORMATION pDeviceInformation = NULL; > - ULONG DeviceInfoLength = sizeof(KEY_BASIC_INFORMATION) + 50 * > sizeof(WCHAR); > - PKEY_VALUE_PARTIAL_INFORMATION pValueInformation = NULL; > - ULONG ValueInfoLength = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + 50 * > sizeof(WCHAR); > - ULONG RequiredSize; > - ULONG IndexDevice = 0; > - UNICODE_STRING DeviceName, ValueName; > - HANDLE hDevicesKey = NULL; > - HANDLE hDeviceKey = NULL; > + HANDLE hPnpKey; > + PKEY_VALUE_PARTIAL_INFORMATION KeyInformation; > + ULONG DesiredLength, Length, KeyValue; > NTSTATUS Status; > - BOOLEAN ret = FALSE; > - > - InitializeObjectAttributes(&ObjectAttributes, &MultiKeyPathU, > OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL); > - Status = ZwOpenKey(&hDevicesKey, KEY_ENUMERATE_SUB_KEYS, > &ObjectAttributes); > - if (!NT_SUCCESS(Status)) > - { > - DPRINT("ZwOpenKey() failed with status 0x%08lx\n", Status); > - goto cleanup; > - } > - > - pDeviceInformation = ExAllocatePool(PagedPool, DeviceInfoLength); > - if (!pDeviceInformation) > - { > - DPRINT("ExAllocatePool() failed\n"); > - Status = STATUS_NO_MEMORY; > - goto cleanup; > - } > - > - pValueInformation = ExAllocatePool(PagedPool, ValueInfoLength); > - if (!pDeviceInformation) > - { > - DPRINT("ExAllocatePool() failed\n"); > - Status = STATUS_NO_MEMORY; > - goto cleanup; > - } > - > - while (TRUE) > - { > - Status = ZwEnumerateKey(hDevicesKey, IndexDevice, > KeyBasicInformation, pDeviceInformation, DeviceInfoLength, &RequiredSize); > - if (Status == STATUS_NO_MORE_ENTRIES) > - break; > - else if (Status == STATUS_BUFFER_OVERFLOW || Status == > STATUS_BUFFER_TOO_SMALL) > - { > - ExFreePool(pDeviceInformation); > - DeviceInfoLength = RequiredSize; > - pDeviceInformation = ExAllocatePool(PagedPool, DeviceInfoLength); > - if (!pDeviceInformation) > - { > - DPRINT("ExAllocatePool() failed\n"); > - Status = STATUS_NO_MEMORY; > - goto cleanup; > - } > - Status = ZwEnumerateKey(hDevicesKey, IndexDevice, > KeyBasicInformation, pDeviceInformation, DeviceInfoLength, &RequiredSize); > - } > - if (!NT_SUCCESS(Status)) > - { > - DPRINT("ZwEnumerateKey() failed with status 0x%08lx\n", Status); > - goto cleanup; > - } > - IndexDevice++; > - > - /* Open device key */ > - DeviceName.Length = DeviceName.MaximumLength = > pDeviceInformation->NameLength; > - DeviceName.Buffer = pDeviceInformation->Name; > - InitializeObjectAttributes(&ObjectAttributes, &DeviceName, > OBJ_KERNEL_HANDLE, hDevicesKey, NULL); > - Status = ZwOpenKey( > - &hDeviceKey, > - KEY_QUERY_VALUE, > - &ObjectAttributes); > - if (!NT_SUCCESS(Status)) > - { > - DPRINT("ZwOpenKey() failed with status 0x%08lx\n", Status); > - goto cleanup; > - } > - > - /* Read identifier */ > - Status = ZwQueryValueKey(hDeviceKey, &IdentifierU, > KeyValuePartialInformation, pValueInformation, ValueInfoLength, > &RequiredSize); > - if (Status == STATUS_BUFFER_OVERFLOW || Status == > STATUS_BUFFER_TOO_SMALL) > - { > - ExFreePool(pValueInformation); > - ValueInfoLength = RequiredSize; > - pValueInformation = ExAllocatePool(PagedPool, ValueInfoLength); > - if (!pValueInformation) > - { > - DPRINT("ExAllocatePool() failed\n"); > - Status = STATUS_NO_MEMORY; > - goto cleanup; > - } > - Status = ZwQueryValueKey(hDeviceKey, &IdentifierU, > KeyValuePartialInformation, pValueInformation, ValueInfoLength, > &RequiredSize); > - } > - if (!NT_SUCCESS(Status)) > - { > - DPRINT("ZwQueryValueKey() failed with status 0x%08lx\n", Status); > - goto nextdevice; > - } > - else if (pValueInformation->Type != REG_SZ) > - { > - DPRINT("Wrong registry type: got 0x%lx, expected 0x%lx\n", > pValueInformation->Type, REG_SZ); > - goto nextdevice; > - } > - > - ValueName.Length = ValueName.MaximumLength = > pValueInformation->DataLength; > - ValueName.Buffer = (PWCHAR)pValueInformation->Data; > - if (ValueName.Length >= sizeof(WCHAR) && > ValueName.Buffer[ValueName.Length / sizeof(WCHAR) - 1] == UNICODE_NULL) > - ValueName.Length -= sizeof(WCHAR); > - if (RtlCompareUnicodeString(&ValueName, &AcpiBiosIdentifier, FALSE) > == 0) > - { > - DPRINT("Found ACPI BIOS\n"); > - ret = TRUE; > - goto cleanup; > - } > - > -nextdevice: > - ZwClose(hDeviceKey); > - hDeviceKey = NULL; > - } > - > -cleanup: > - if (pDeviceInformation) > - ExFreePool(pDeviceInformation); > - if (pValueInformation) > - ExFreePool(pValueInformation); > - if (hDevicesKey) > - ZwClose(hDevicesKey); > - if (hDeviceKey) > - ZwClose(hDeviceKey); > - return ret; > -#endif > + > + InitializeObjectAttributes(&ObjectAttributes, &KeyPathU, > OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, NULL, NULL); > + Status = ZwOpenKey(&hPnpKey, KEY_QUERY_VALUE, &ObjectAttributes); > + if (NT_SUCCESS(Status)) > + { > + Status = ZwQueryValueKey(hPnpKey, > + &KeyNameU, > + KeyValuePartialInformation, > + NULL, > + 0, > + &DesiredLength); > + if ((Status == STATUS_BUFFER_TOO_SMALL) || > + (Status == STATUS_BUFFER_OVERFLOW)) > + { > + Length = DesiredLength; > + KeyInformation = ExAllocatePool(PagedPool, Length); > + if (KeyInformation) > + { > + Status = ZwQueryValueKey(hPnpKey, > + &KeyNameU, > + KeyValuePartialInformation, > + KeyInformation, > + Length, > + &DesiredLength); > + if (NT_SUCCESS(Status) && KeyInformation->DataLength == > sizeof(ULONG)) > + { > + KeyValue = (ULONG)(*KeyInformation->Data); > + } > + else > + { > + DPRINT1("ZwQueryValueKey(%wZ%wZ) failed\n", &KeyPathU, > &KeyNameU); > + KeyValue = 0; > + } > + > + ExFreePool(KeyInformation); > + } > + else > + { > + DPRINT1("Failed to allocate memory for registry query\n"); > + KeyValue = 0; > + } > + } > + else > + { > + DPRINT1("ZwQueryValueKey(%wZ%wZ) failed with status 0x%08lx\n", > &KeyPathU, &KeyNameU, Status); > + KeyValue = 0; > + } > + > + ZwClose(hPnpKey); > + } > + else > + { > + DPRINT1("ZwOpenKey(%wZ) failed with status 0x%08lx\n", &KeyPathU, > Status); > + } > + > + DPRINT1("Firmware mapper is %s\n", KeyValue != 0 ? "disabled" : > "enabled"); > + > + return (KeyValue != 0) ? TRUE : FALSE; > } > > NTSTATUS > @@ -2840,17 +2768,9 @@ > UNICODE_STRING EnumU = > RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Enum"); > UNICODE_STRING RootPathU = RTL_CONSTANT_STRING(L"Root"); > UNICODE_STRING MultiKeyPathU = > RTL_CONSTANT_STRING(L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System\\MultifunctionAdapter"); > - UNICODE_STRING DeviceDescU = RTL_CONSTANT_STRING(L"DeviceDesc"); > - UNICODE_STRING HardwareIDU = RTL_CONSTANT_STRING(L"HardwareID"); > - UNICODE_STRING LogConfU = RTL_CONSTANT_STRING(L"LogConf"); > - UNICODE_STRING HalAcpiDevice = RTL_CONSTANT_STRING(L"ACPI_HAL"); > - UNICODE_STRING HalAcpiId = RTL_CONSTANT_STRING(L"0000"); > - UNICODE_STRING HalAcpiDeviceDesc = RTL_CONSTANT_STRING(L"HAL ACPI"); > - UNICODE_STRING HalAcpiHardwareID = RTL_CONSTANT_STRING(L"*PNP0C08\0"); > OBJECT_ATTRIBUTES ObjectAttributes; > - HANDLE hEnum, hRoot, hHalAcpiDevice, hHalAcpiId, hLogConf; > + HANDLE hEnum, hRoot; > NTSTATUS Status; > - ULONG Disposition; > > InitializeObjectAttributes(&ObjectAttributes, &EnumU, OBJ_KERNEL_HANDLE > | OBJ_CASE_INSENSITIVE, NULL, NULL); > Status = ZwCreateKey(&hEnum, KEY_CREATE_SUB_KEY, &ObjectAttributes, 0, > NULL, 0, NULL); > @@ -2869,35 +2789,7 @@ > return Status; > } > > - if (IopIsAcpiComputer()) > - { > - InitializeObjectAttributes(&ObjectAttributes, &HalAcpiDevice, > OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, hRoot, NULL); > - Status = ZwCreateKey(&hHalAcpiDevice, KEY_CREATE_SUB_KEY, > &ObjectAttributes, 0, NULL, 0, NULL); > - ZwClose(hRoot); > - if (!NT_SUCCESS(Status)) > - return Status; > - InitializeObjectAttributes(&ObjectAttributes, &HalAcpiId, > OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, hHalAcpiDevice, NULL); > - Status = ZwCreateKey(&hHalAcpiId, KEY_CREATE_SUB_KEY | > KEY_SET_VALUE, &ObjectAttributes, 0, NULL, 0, &Disposition); > - ZwClose(hHalAcpiDevice); > - if (!NT_SUCCESS(Status)) > - return Status; > - if (Disposition == REG_CREATED_NEW_KEY) > - { > - Status = ZwSetValueKey(hHalAcpiId, &DeviceDescU, 0, REG_SZ, > HalAcpiDeviceDesc.Buffer, HalAcpiDeviceDesc.MaximumLength); > - if (NT_SUCCESS(Status)) > - Status = ZwSetValueKey(hHalAcpiId, &HardwareIDU, 0, > REG_MULTI_SZ, HalAcpiHardwareID.Buffer, HalAcpiHardwareID.MaximumLength); > - } > - if (NT_SUCCESS(Status)) > - { > - InitializeObjectAttributes(&ObjectAttributes, &LogConfU, > OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, hHalAcpiId, NULL); > - Status = ZwCreateKey(&hLogConf, 0, &ObjectAttributes, 0, NULL, > REG_OPTION_VOLATILE, NULL); > - if (NT_SUCCESS(Status)) > - ZwClose(hLogConf); > - } > - ZwClose(hHalAcpiId); > - return Status; > - } > - else > + if (!IopIsFirmwareMapperDisabled()) > { > Status = IopOpenRegistryKeyEx(&hEnum, NULL, &MultiKeyPathU, > KEY_ENUMERATE_SUB_KEYS); > if (!NT_SUCCESS(Status)) > @@ -2915,9 +2807,16 @@ > NULL, > 0); > ZwClose(hEnum); > - ZwClose(hRoot); > - return Status; > - } > + } > + else > + { > + /* Enumeration is disabled */ > + Status = STATUS_SUCCESS; > + } > + > + ZwClose(hRoot); > + > + return Status; > } > > NTSTATUS > > >
_______________________________________________ Ros-dev mailing list [email protected] http://www.reactos.org/mailman/listinfo/ros-dev
