Author: fireball Date: Wed Dec 19 20:46:58 2007 New Revision: 31331
URL: http://svn.reactos.org/svn/reactos?rev=31331&view=rev Log: - Fix dangerous passing of possibly unterminated wide string to RtlQueryRegistryValues (by opening the keys and passing handle instead). - Fix incorrect string operation (assuming that the string is terminated). Spotted by hpoussin.
Modified: trunk/reactos/ntoskrnl/io/iomgr/driver.c
Modified: trunk/reactos/ntoskrnl/io/iomgr/driver.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/iomgr/driver.c?... ============================================================================== --- trunk/reactos/ntoskrnl/io/iomgr/driver.c (original) +++ trunk/reactos/ntoskrnl/io/iomgr/driver.c Wed Dec 19 20:46:58 2007 @@ -268,8 +268,10 @@ { RTL_QUERY_REGISTRY_TABLE QueryTable[3]; ULONG ServiceStart; - UNICODE_STRING ServiceImagePath; + UNICODE_STRING ServiceImagePath, CCSName; NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE CCSKey, ServiceKey;
DPRINT("IopLoadServiceModule(%wZ, 0x%p)\n", ServiceName, ModuleObject);
@@ -277,6 +279,36 @@ if (ServiceName->Buffer == NULL) return STATUS_UNSUCCESSFUL;
+ /* Open CurrentControlSet */ + RtlInitUnicodeString(&CCSName, + L"\Registry\Machine\SYSTEM\CurrentControlSet\Services"); + InitializeObjectAttributes(&ObjectAttributes, + &CCSName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + Status = ZwOpenKey(&CCSKey, KEY_READ, &ObjectAttributes); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("ZwOpenKey() failed with Status %08X\n", Status); + return Status; + } + + /* Open service key */ + InitializeObjectAttributes(&ObjectAttributes, + ServiceName, + OBJ_CASE_INSENSITIVE, + CCSKey, + NULL); + Status = ZwOpenKey(&ServiceKey, KEY_READ, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + DPRINT1("ZwOpenKey() failed with Status %08X\n", Status); + ZwClose(CCSKey); + return Status; + } + /* * Get information about the service. */ @@ -293,12 +325,15 @@ QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; QueryTable[1].EntryContext = &ServiceImagePath;
- Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, - ServiceName->Buffer, QueryTable, NULL, NULL); + Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, + (PWSTR)ServiceKey, QueryTable, NULL, NULL); + + ZwClose(ServiceKey); + ZwClose(CCSKey);
if (!NT_SUCCESS(Status)) { - DPRINT("RtlQueryRegistryValues() failed (Status %x)\n", Status); + DPRINT1("RtlQueryRegistryValues() failed (Status %x)\n", Status); return Status; }
@@ -412,9 +447,12 @@ wcscpy(NameBuffer, FILESYSTEM_ROOT_NAME); else wcscpy(NameBuffer, DRIVER_ROOT_NAME); - wcscat(NameBuffer, ServiceName->Buffer);
RtlInitUnicodeString(&DriverName, NameBuffer); + DriverName.MaximumLength = sizeof(NameBuffer); + + RtlAppendUnicodeStringToString(&DriverName, ServiceName); + DPRINT("Driver name: '%wZ'\n", &DriverName); } else