[ros-dev] [ros-diffs] [cgutman] 53249: [NTOSKRNL] - Rewrite IopIsAcpiComputer (and rename to IopIsFirmwareMapperDisabled) to eliminate the need for the ENABLE_ACPI define - IopIsFirmwareMapperDisabled now reads the regi...
Alex Ionescu
ionucu at videotron.ca
Mon Aug 15 03:19:14 UTC 2011
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, <cgutman at svn.reactos.org> 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
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.reactos.org/pipermail/ros-dev/attachments/20110814/bcd2c8a8/attachment-0001.htm>
More information about the Ros-dev
mailing list