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.…
==============================================================================
--- 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