- fixed RegSetValueEx to take the null-terminating byte for strings into
account when the caller forgot it
- capture the driver service name string in NtLoadDriver
Modified: trunk/reactos/lib/advapi32/reg/reg.c
Modified: trunk/reactos/ntoskrnl/io/driver.c
_____
Modified: trunk/reactos/lib/advapi32/reg/reg.c
--- trunk/reactos/lib/advapi32/reg/reg.c 2005-05-05 00:07:27 UTC
(rev 14983)
+++ trunk/reactos/lib/advapi32/reg/reg.c 2005-05-05 02:46:17 UTC
(rev 14984)
@@ -3003,14 +3003,21 @@
pValueName = NULL;
}
- if ((dwType == REG_SZ) ||
- (dwType == REG_MULTI_SZ) ||
- (dwType == REG_EXPAND_SZ))
+ if (((dwType == REG_SZ) ||
+ (dwType == REG_MULTI_SZ) ||
+ (dwType == REG_EXPAND_SZ)) &&
+ (cbData != 0))
{
+ /* NT adds one if the caller forgot the NULL-termination
character */
+ if (lpData[cbData - 1] != '\0')
+ {
+ cbData++;
+ }
+
RtlInitAnsiString (&AnsiString,
NULL);
AnsiString.Buffer = (PSTR)lpData;
- AnsiString.Length = cbData;
+ AnsiString.Length = cbData - 1;
AnsiString.MaximumLength = cbData;
RtlAnsiStringToUnicodeString (&Data,
&AnsiString,
@@ -3088,6 +3095,15 @@
RtlInitUnicodeString (&ValueName, L"");
}
pValueName = &ValueName;
+
+ if (((dwType == REG_SZ) ||
+ (dwType == REG_MULTI_SZ) ||
+ (dwType == REG_EXPAND_SZ)) &&
+ (cbData != 0) && (*(((PWCHAR)lpData) + (cbData / sizeof(WCHAR)) -
1) != L'\0'))
+ {
+ /* NT adds one if the caller forgot the NULL-termination
character */
+ cbData += sizeof(WCHAR);
+ }
Status = NtSetValueKey (KeyHandle,
pValueName,
@@ -3118,51 +3134,41 @@
LPCSTR lpData,
DWORD cbData)
{
- WCHAR SubKeyNameBuffer[MAX_PATH+1];
- UNICODE_STRING SubKeyName;
- UNICODE_STRING Data;
- ANSI_STRING AnsiString;
- LONG DataSize;
- LONG ErrorCode;
+ LONG ret;
+ HKEY hSubKey;
+
+ if (dwType != REG_SZ)
+ {
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ if (lpSubKey != NULL && lpSubKey[0] != '\0')
+ {
+ ret = RegCreateKeyA(hKey,
+ lpSubKey,
+ &hSubKey);
- if (lpData == NULL)
- {
- SetLastError (ERROR_INVALID_PARAMETER);
- return ERROR_INVALID_PARAMETER;
- }
+ if (ret != ERROR_SUCCESS)
+ {
+ return ret;
+ }
+ }
+ else
+ hSubKey = hKey;
+
+ ret = RegSetValueExA(hSubKey,
+ NULL,
+ 0,
+ REG_SZ,
+ lpData,
+ strlen(lpData) + 1);
+
+ if (hSubKey != hKey)
+ {
+ RegCloseKey(hSubKey);
+ }
- RtlInitUnicodeString (&SubKeyName, NULL);
- RtlInitUnicodeString (&Data, NULL);
- if (lpSubKey != NULL && (strlen(lpSubKey) != 0))
- {
- RtlInitAnsiString (&AnsiString, (LPSTR)lpSubKey);
- SubKeyName.Buffer = &SubKeyNameBuffer[0];
- SubKeyName.MaximumLength = sizeof(SubKeyNameBuffer);
- RtlAnsiStringToUnicodeString (&SubKeyName, &AnsiString, FALSE);
- }
-
- DataSize = cbData * sizeof(WCHAR);
- Data.MaximumLength = DataSize;
- Data.Buffer = RtlAllocateHeap (ProcessHeap,
- 0,
- DataSize);
- if (Data.Buffer == NULL)
- {
- SetLastError (ERROR_OUTOFMEMORY);
- return ERROR_OUTOFMEMORY;
- }
-
- ErrorCode = RegSetValueW (hKey,
- (LPCWSTR)SubKeyName.Buffer,
- dwType,
- Data.Buffer,
- DataSize);
-
- RtlFreeHeap (ProcessHeap,
- 0,
- Data.Buffer);
-
- return ErrorCode;
+ return ret;
}
_____
Modified: trunk/reactos/ntoskrnl/io/driver.c
--- trunk/reactos/ntoskrnl/io/driver.c 2005-05-05 00:07:27 UTC (rev
14983)
+++ trunk/reactos/ntoskrnl/io/driver.c 2005-05-05 02:46:17 UTC (rev
14984)
@@ -1311,7 +1311,7 @@
IopBootLog(&Service->ImagePath, NT_SUCCESS(Status) ? TRUE : FALSE);
if (!NT_SUCCESS(Status))
{
- DPRINT("NtLoadDriver() failed (Status %lx)\n", Status);
+ DPRINT("IopLoadDriver() failed (Status %lx)\n", Status);
#if 0
if (Service->ErrorControl == 1)
{
@@ -1783,42 +1783,66 @@
RTL_QUERY_REGISTRY_TABLE QueryTable[3];
UNICODE_STRING ImagePath;
UNICODE_STRING ServiceName;
+ UNICODE_STRING CapturedDriverServiceName;
+ KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
ULONG Type;
PDEVICE_NODE DeviceNode;
PMODULE_OBJECT ModuleObject;
PDRIVER_OBJECT DriverObject;
- LPWSTR Start;
+ WCHAR *cur;
+
+ PAGED_CODE();
+
+ PreviousMode = KeGetPreviousMode();
- DPRINT("NtLoadDriver('%wZ')\n", DriverServiceName);
-
/*
* Check security privileges
*/
/* FIXME: Uncomment when privileges will be correctly implemented. */
#if 0
- if (!SeSinglePrivilegeCheck(SeLoadDriverPrivilege,
KeGetPreviousMode()))
+ if (!SeSinglePrivilegeCheck(SeLoadDriverPrivilege, PreviousMode))
{
DPRINT("Privilege not held\n");
return STATUS_PRIVILEGE_NOT_HELD;
}
#endif
+ Status = RtlCaptureUnicodeString(&CapturedDriverServiceName,
+ PreviousMode,
+ PagedPool,
+ FALSE,
+ DriverServiceName);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ DPRINT("NtLoadDriver('%wZ')\n", &CapturedDriverServiceName);
+
RtlInitUnicodeString(&ImagePath, NULL);
/*
* Get the service name from the registry key name.
*/
+ ASSERT(CapturedDriverServiceName.Length >= sizeof(WCHAR));
- Start = wcsrchr(DriverServiceName->Buffer, L'\\');
- if (Start == NULL)
- Start = DriverServiceName->Buffer;
- else
- Start++;
+ ServiceName = CapturedDriverServiceName;
+ cur = CapturedDriverServiceName.Buffer +
(CapturedDriverServiceName.Length / sizeof(WCHAR)) - 1;
+ while (CapturedDriverServiceName.Buffer != cur)
+ {
+ if(*cur == L'\\')
+ {
+ ServiceName.Buffer = cur + 1;
+ ServiceName.Length = CapturedDriverServiceName.Length -
+ (USHORT)((ULONG_PTR)ServiceName.Buffer -
+
(ULONG_PTR)CapturedDriverServiceName.Buffer);
+ break;
+ }
+ cur--;
+ }
- RtlInitUnicodeString(&ServiceName, Start);
-
/*
* Get service type.
*/
@@ -1836,13 +1860,13 @@
QueryTable[1].EntryContext = &ImagePath;
Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE,
- DriverServiceName->Buffer, QueryTable, NULL, NULL);
+ CapturedDriverServiceName.Buffer, QueryTable, NULL, NULL);
if (!NT_SUCCESS(Status))
{
DPRINT("RtlQueryRegistryValues() failed (Status %lx)\n", Status);
RtlFreeUnicodeString(&ImagePath);
- return Status;
+ goto ReleaseCapturedString;
}
/*
@@ -1854,10 +1878,10 @@
if (!NT_SUCCESS(Status))
{
DPRINT("IopNormalizeImagePath() failed (Status %x)\n", Status);
- return Status;
+ goto ReleaseCapturedString;
}
- DPRINT("FullImagePath: '%S'\n", ImagePath.Buffer);
+ DPRINT("FullImagePath: '%wZ'\n", &ImagePath);
DPRINT("Type: %lx\n", Type);
/*
@@ -1868,7 +1892,8 @@
if (ModuleObject != NULL)
{
DPRINT("Image already loaded\n");
- return STATUS_IMAGE_ALREADY_LOADED;
+ Status = STATUS_IMAGE_ALREADY_LOADED;
+ goto ReleaseCapturedString;
}
/*
@@ -1881,7 +1906,7 @@
if (!NT_SUCCESS(Status))
{
DPRINT("IopCreateDeviceNode() failed (Status %lx)\n", Status);
- return Status;
+ goto ReleaseCapturedString;
}
/*
@@ -1894,19 +1919,14 @@
{
DPRINT("LdrLoadModule() failed (Status %lx)\n", Status);
IopFreeDeviceNode(DeviceNode);
- return Status;
+ goto ReleaseCapturedString;
}
/*
* Set a service name for the device node
*/
- Start = wcsrchr(DriverServiceName->Buffer, L'\\');
- if (Start == NULL)
- Start = DriverServiceName->Buffer;
- else
- Start++;
- RtlpCreateUnicodeString(&DeviceNode->ServiceName, Start,
NonPagedPool);
+ RtlpCreateUnicodeString(&DeviceNode->ServiceName,
ServiceName.Buffer, NonPagedPool);
/*
* Initialize the driver module
@@ -1925,10 +1945,15 @@
DPRINT("IopInitializeDriver() failed (Status %lx)\n", Status);
LdrUnloadModule(ModuleObject);
IopFreeDeviceNode(DeviceNode);
- return Status;
+ goto ReleaseCapturedString;
}
IopInitializeDevice(DeviceNode, DriverObject);
+
+ReleaseCapturedString:
+ RtlReleaseCapturedUnicodeString(&CapturedDriverServiceName,
+ PreviousMode,
+ FALSE);
return Status;
}