#define NDEBUG
#include <debug.h>
-
-/* GLOBALS ******************************************************************/
+/* DEFINES ******************************************************************/
#define MAX_DEFAULT_HANDLES 6
+#define REG_MAX_NAME_SIZE 256
+#define REG_MAX_DATA_SIZE 2048
+
+/* GLOBALS ******************************************************************/
static CRITICAL_SECTION HandleTableCS;
static HANDLE DefaultHandleTable[MAX_DEFAULT_HANDLES];
-
+static HANDLE ProcessHeap;
/* PROTOTYPES ***************************************************************/
* RegInitDefaultHandles
*/
BOOL
-RegInitialize(VOID)
+RegInitialize (VOID)
{
DPRINT("RegInitialize()\n");
- RtlZeroMemory(DefaultHandleTable,
- MAX_DEFAULT_HANDLES * sizeof(HANDLE));
- RtlInitializeCriticalSection(&HandleTableCS);
+ ProcessHeap = RtlGetProcessHeap();
+ RtlZeroMemory (DefaultHandleTable,
+ MAX_DEFAULT_HANDLES * sizeof(HANDLE));
+ RtlInitializeCriticalSection (&HandleTableCS);
+
return TRUE;
}
* RegInit
*/
BOOL
-RegCleanup(VOID)
+RegCleanup (VOID)
{
DPRINT("RegCleanup()\n");
- CloseDefaultKeys();
- RtlDeleteCriticalSection(&HandleTableCS);
- return(TRUE);
+ CloseDefaultKeys ();
+ RtlDeleteCriticalSection (&HandleTableCS);
+
+ return TRUE;
}
static NTSTATUS
-MapDefaultKey(PHKEY RealKey,
- HKEY Key)
+MapDefaultKey (PHKEY RealKey,
+ HKEY Key)
{
PHANDLE Handle;
ULONG Index;
if (((ULONG)Key & 0xF0000000) != 0x80000000)
{
*RealKey = Key;
- return(STATUS_SUCCESS);
+ return STATUS_SUCCESS;
}
/* Handle special cases here */
Index = (ULONG)Key & 0x0FFFFFFF;
if (Index >= MAX_DEFAULT_HANDLES)
- return(STATUS_INVALID_PARAMETER);
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
- RtlEnterCriticalSection(&HandleTableCS);
+ RtlEnterCriticalSection (&HandleTableCS);
Handle = &DefaultHandleTable[Index];
if (*Handle == NULL)
{
switch (Index)
{
case 0: /* HKEY_CLASSES_ROOT */
- Status = OpenClassesRootKey(Handle);
+ Status = OpenClassesRootKey (Handle);
break;
case 1: /* HKEY_CURRENT_USER */
- Status = RtlOpenCurrentUser(KEY_ALL_ACCESS, Handle);
+ Status = RtlOpenCurrentUser (MAXIMUM_ALLOWED,
+ Handle);
break;
case 2: /* HKEY_LOCAL_MACHINE */
- Status = OpenLocalMachineKey(Handle);
+ Status = OpenLocalMachineKey (Handle);
break;
case 3: /* HKEY_USERS */
- Status = OpenUsersKey(Handle);
+ Status = OpenUsersKey (Handle);
break;
#if 0
case 4: /* HKEY_PERFORMANCE_DATA */
- Status = OpenPerformanceDataKey(Handle);
+ Status = OpenPerformanceDataKey (Handle);
break;
#endif
case 5: /* HKEY_CURRENT_CONFIG */
- Status = OpenCurrentConfigKey(Handle);
+ Status = OpenCurrentConfigKey (Handle);
break;
case 6: /* HKEY_DYN_DATA */
Status = STATUS_INVALID_PARAMETER;
}
}
- RtlLeaveCriticalSection(&HandleTableCS);
+ RtlLeaveCriticalSection (&HandleTableCS);
if (NT_SUCCESS(Status))
{
*RealKey = (HKEY)*Handle;
}
- return(Status);
+ return Status;
}
static VOID
-CloseDefaultKeys(VOID)
+CloseDefaultKeys (VOID)
{
ULONG i;
- RtlEnterCriticalSection(&HandleTableCS);
+ RtlEnterCriticalSection (&HandleTableCS);
for (i = 0; i < MAX_DEFAULT_HANDLES; i++)
{
if (DefaultHandleTable[i] != NULL)
{
- NtClose(DefaultHandleTable[i]);
+ NtClose (DefaultHandleTable[i]);
DefaultHandleTable[i] = NULL;
}
}
- RtlLeaveCriticalSection(&HandleTableCS);
+ RtlLeaveCriticalSection (&HandleTableCS);
}
static NTSTATUS
-OpenClassesRootKey(PHANDLE KeyHandle)
+OpenClassesRootKey (PHANDLE KeyHandle)
{
OBJECT_ATTRIBUTES Attributes;
UNICODE_STRING KeyName = UNICODE_STRING_INITIALIZER(L"\\Registry\\Machine\\Software\\CLASSES");
DPRINT("OpenClassesRootKey()\n");
- InitializeObjectAttributes(&Attributes,
- &KeyName,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
- return(NtOpenKey(KeyHandle,
- KEY_ALL_ACCESS,
- &Attributes));
+ InitializeObjectAttributes (&Attributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+ return NtOpenKey (KeyHandle,
+ MAXIMUM_ALLOWED,
+ &Attributes);
}
static NTSTATUS
-OpenLocalMachineKey(PHANDLE KeyHandle)
+OpenLocalMachineKey (PHANDLE KeyHandle)
{
OBJECT_ATTRIBUTES Attributes;
UNICODE_STRING KeyName = UNICODE_STRING_INITIALIZER(L"\\Registry\\Machine");
DPRINT("OpenLocalMachineKey()\n");
- InitializeObjectAttributes(&Attributes,
- &KeyName,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
- return(NtOpenKey(KeyHandle,
- KEY_ALL_ACCESS,
- &Attributes));
+ InitializeObjectAttributes (&Attributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+ return NtOpenKey (KeyHandle,
+ MAXIMUM_ALLOWED,
+ &Attributes);
}
static NTSTATUS
-OpenUsersKey(PHANDLE KeyHandle)
+OpenUsersKey (PHANDLE KeyHandle)
{
OBJECT_ATTRIBUTES Attributes;
UNICODE_STRING KeyName = UNICODE_STRING_INITIALIZER(L"\\Registry\\User");
DPRINT("OpenUsersKey()\n");
- InitializeObjectAttributes(&Attributes,
- &KeyName,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
- return(NtOpenKey(KeyHandle,
- KEY_ALL_ACCESS,
- &Attributes));
+ InitializeObjectAttributes (&Attributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+ return NtOpenKey (KeyHandle,
+ KEY_ALL_ACCESS,
+ &Attributes);
}
static NTSTATUS
-OpenCurrentConfigKey(PHANDLE KeyHandle)
+OpenCurrentConfigKey (PHANDLE KeyHandle)
{
OBJECT_ATTRIBUTES Attributes;
UNICODE_STRING KeyName =
DPRINT("OpenCurrentConfigKey()\n");
- InitializeObjectAttributes(&Attributes,
- &KeyName,
- OBJ_CASE_INSENSITIVE,
- NULL,
- NULL);
- return(NtOpenKey(KeyHandle,
- KEY_ALL_ACCESS,
- &Attributes));
+ InitializeObjectAttributes (&Attributes,
+ &KeyName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+ return NtOpenKey (KeyHandle,
+ MAXIMUM_ALLOWED,
+ &Attributes);
}
+
/************************************************************************
* RegCloseKey
+ *
+ * @implemented
*/
LONG STDCALL
-RegCloseKey(HKEY hKey)
+RegCloseKey (HKEY hKey)
{
+ LONG ErrorCode;
NTSTATUS Status;
/* don't close null handle or a pseudo handle */
if ((!hKey) || (((ULONG)hKey & 0xF0000000) == 0x80000000))
- return(ERROR_INVALID_HANDLE);
+ {
+ return ERROR_INVALID_HANDLE;
+ }
- Status = NtClose(hKey);
+ Status = NtClose (hKey);
if (!NT_SUCCESS(Status))
{
- LONG ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
}
- return(ERROR_SUCCESS);
+
+ return ERROR_SUCCESS;
}
/************************************************************************
* RegConnectRegistryA
+ *
+ * @unimplemented
*/
LONG STDCALL
-RegConnectRegistryA(LPCSTR lpMachineName,
- HKEY hKey,
- PHKEY phkResult)
+RegConnectRegistryA (LPCSTR lpMachineName,
+ HKEY hKey,
+ PHKEY phkResult)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return ERROR_CALL_NOT_IMPLEMENTED;
/************************************************************************
* RegConnectRegistryW
+ *
+ * @unimplemented
*/
LONG STDCALL
-RegConnectRegistryW(LPCWSTR lpMachineName,
- HKEY hKey,
- PHKEY phkResult)
+RegConnectRegistryW (LPCWSTR lpMachineName,
+ HKEY hKey,
+ PHKEY phkResult)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return ERROR_CALL_NOT_IMPLEMENTED;
/************************************************************************
* RegCreateKeyExA
+ *
+ * @implemented
*/
LONG STDCALL
-RegCreateKeyExA(HKEY hKey,
- LPCSTR lpSubKey,
- DWORD Reserved,
- LPSTR lpClass,
- DWORD dwOptions,
- REGSAM samDesired,
- LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- PHKEY phkResult,
- LPDWORD lpdwDisposition)
+RegCreateKeyExA (HKEY hKey,
+ LPCSTR lpSubKey,
+ DWORD Reserved,
+ LPSTR lpClass,
+ DWORD dwOptions,
+ REGSAM samDesired,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
+ PHKEY phkResult,
+ LPDWORD lpdwDisposition)
{
UNICODE_STRING SubKeyString;
UNICODE_STRING ClassString;
OBJECT_ATTRIBUTES Attributes;
- NTSTATUS Status;
HKEY ParentKey;
+ LONG ErrorCode;
+ NTSTATUS Status;
- DPRINT("RegCreateKeyExW() called\n");
+ DPRINT("RegCreateKeyExA() called\n");
/* get the real parent key */
- Status = MapDefaultKey(&ParentKey, hKey);
+ Status = MapDefaultKey (&ParentKey,
+ hKey);
if (!NT_SUCCESS(Status))
{
- LONG ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
}
DPRINT("ParentKey %x\n", (ULONG)ParentKey);
if (lpClass != NULL)
- RtlCreateUnicodeStringFromAsciiz(&ClassString, lpClass);
- RtlCreateUnicodeStringFromAsciiz(&SubKeyString, (LPSTR)lpSubKey);
- InitializeObjectAttributes(&Attributes,
- &SubKeyString,
- OBJ_CASE_INSENSITIVE,
- (HANDLE)ParentKey,
- (PSECURITY_DESCRIPTOR)lpSecurityAttributes);
- Status = NtCreateKey(phkResult,
- samDesired,
- &Attributes,
- 0,
- (lpClass == NULL)? NULL : &ClassString,
- dwOptions,
- (PULONG)lpdwDisposition);
- RtlFreeUnicodeString(&SubKeyString);
+ {
+ RtlCreateUnicodeStringFromAsciiz (&ClassString,
+ lpClass);
+ }
+ RtlCreateUnicodeStringFromAsciiz (&SubKeyString,
+ (LPSTR)lpSubKey);
+ InitializeObjectAttributes (&Attributes,
+ &SubKeyString,
+ OBJ_CASE_INSENSITIVE,
+ (HANDLE)ParentKey,
+ (PSECURITY_DESCRIPTOR)lpSecurityAttributes);
+ Status = NtCreateKey (phkResult,
+ samDesired,
+ &Attributes,
+ 0,
+ (lpClass == NULL)? NULL : &ClassString,
+ dwOptions,
+ (PULONG)lpdwDisposition);
+ RtlFreeUnicodeString (&SubKeyString);
if (lpClass != NULL)
- RtlFreeUnicodeString(&ClassString);
+ {
+ RtlFreeUnicodeString (&ClassString);
+ }
DPRINT("Status %x\n", Status);
if (!NT_SUCCESS(Status))
{
- LONG ErrorCode = RtlNtStatusToDosError(Status);
+ ErrorCode = RtlNtStatusToDosError (Status);
SetLastError (ErrorCode);
return ErrorCode;
}
- return(ERROR_SUCCESS);
+ return ERROR_SUCCESS;
}
/************************************************************************
* RegCreateKeyExW
+ *
+ * @implemented
*/
LONG STDCALL
RegCreateKeyExW(HKEY hKey,
UNICODE_STRING SubKeyString;
UNICODE_STRING ClassString;
OBJECT_ATTRIBUTES Attributes;
- NTSTATUS Status;
HKEY ParentKey;
+ LONG ErrorCode;
+ NTSTATUS Status;
DPRINT("RegCreateKeyExW() called\n");
/* get the real parent key */
- Status = MapDefaultKey (&ParentKey, hKey);
- if (!NT_SUCCESS(Status)) {
- LONG ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
+ Status = MapDefaultKey (&ParentKey,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError(Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
DPRINT("ParentKey %x\n", (ULONG)ParentKey);
- RtlInitUnicodeString (&ClassString, lpClass);
- RtlInitUnicodeString (&SubKeyString, lpSubKey);
+
+ RtlInitUnicodeString (&ClassString,
+ lpClass);
+ RtlInitUnicodeString (&SubKeyString,
+ lpSubKey);
InitializeObjectAttributes (&Attributes,
- &SubKeyString,
- OBJ_CASE_INSENSITIVE,
- (HANDLE)ParentKey,
- (PSECURITY_DESCRIPTOR)lpSecurityAttributes);
+ &SubKeyString,
+ OBJ_CASE_INSENSITIVE,
+ (HANDLE)ParentKey,
+ (PSECURITY_DESCRIPTOR)lpSecurityAttributes);
Status = NtCreateKey (phkResult,
- samDesired,
- &Attributes,
- 0,
- (lpClass == NULL)? NULL : &ClassString,
- dwOptions,
- (PULONG)lpdwDisposition);
+ samDesired,
+ &Attributes,
+ 0,
+ (lpClass == NULL)? NULL : &ClassString,
+ dwOptions,
+ (PULONG)lpdwDisposition);
DPRINT("Status %x\n", Status);
- if (!NT_SUCCESS(Status)) {
- LONG ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
return ERROR_SUCCESS;
}
/************************************************************************
* RegCreateKeyA
+ *
+ * @implemented
*/
LONG STDCALL
-RegCreateKeyA(HKEY hKey,
- LPCSTR lpSubKey,
- PHKEY phkResult)
+RegCreateKeyA (HKEY hKey,
+ LPCSTR lpSubKey,
+ PHKEY phkResult)
{
- return(RegCreateKeyExA(hKey,
- lpSubKey,
- 0,
- NULL,
- 0,
- KEY_ALL_ACCESS,
- NULL,
- phkResult,
- NULL));
+ return RegCreateKeyExA (hKey,
+ lpSubKey,
+ 0,
+ NULL,
+ 0,
+ KEY_ALL_ACCESS,
+ NULL,
+ phkResult,
+ NULL);
}
/************************************************************************
* RegCreateKeyW
+ *
+ * @implemented
*/
LONG STDCALL
-RegCreateKeyW(HKEY hKey,
- LPCWSTR lpSubKey,
- PHKEY phkResult)
+RegCreateKeyW (HKEY hKey,
+ LPCWSTR lpSubKey,
+ PHKEY phkResult)
{
- return(RegCreateKeyExW(hKey,
- lpSubKey,
- 0,
- NULL,
- 0,
- KEY_ALL_ACCESS,
- NULL,
- phkResult,
- NULL));
+ return RegCreateKeyExW (hKey,
+ lpSubKey,
+ 0,
+ NULL,
+ 0,
+ KEY_ALL_ACCESS,
+ NULL,
+ phkResult,
+ NULL);
}
/************************************************************************
* RegDeleteKeyA
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegDeleteKeyA(
- HKEY hKey,
- LPCSTR lpSubKey)
+LONG STDCALL
+RegDeleteKeyA (HKEY hKey,
+ LPCSTR lpSubKey)
{
OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING SubKeyStringW;
- ANSI_STRING SubKeyStringA;
-// HANDLE ParentKey;
+ UNICODE_STRING SubKeyName;
HKEY ParentKey;
HANDLE TargetKey;
NTSTATUS Status;
LONG ErrorCode;
- Status = MapDefaultKey(&ParentKey, hKey);
+ Status = MapDefaultKey (&ParentKey,
+ hKey);
if (!NT_SUCCESS(Status))
{
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
}
- RtlInitAnsiString(&SubKeyStringA, (LPSTR)lpSubKey);
- RtlAnsiStringToUnicodeString(&SubKeyStringW, &SubKeyStringA, TRUE);
+ RtlCreateUnicodeStringFromAsciiz (&SubKeyName,
+ (LPSTR)lpSubKey);
InitializeObjectAttributes(&ObjectAttributes,
- &SubKeyStringW,
+ &SubKeyName,
OBJ_CASE_INSENSITIVE,
(HANDLE)ParentKey,
NULL);
- Status = NtOpenKey(&TargetKey, DELETE, &ObjectAttributes);
- RtlFreeUnicodeString(&SubKeyStringW);
+ Status = NtOpenKey (&TargetKey,
+ DELETE,
+ &ObjectAttributes);
+ RtlFreeUnicodeString (&SubKeyName);
if (!NT_SUCCESS(Status))
{
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
return ErrorCode;
}
- Status = NtDeleteKey(TargetKey);
- NtClose(TargetKey);
+ Status = NtDeleteKey (TargetKey);
+ NtClose (TargetKey);
if (!NT_SUCCESS(Status))
{
ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
+ SetLastError (ErrorCode);
return ErrorCode;
}
/************************************************************************
* RegDeleteKeyW
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegDeleteKeyW(
- HKEY hKey,
- LPCWSTR lpSubKey)
+LONG STDCALL
+RegDeleteKeyW (HKEY hKey,
+ LPCWSTR lpSubKey)
{
OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING SubKeyString;
+ UNICODE_STRING SubKeyName;
HKEY ParentKey;
HANDLE TargetKey;
NTSTATUS Status;
LONG ErrorCode;
- Status = MapDefaultKey(&ParentKey, hKey);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
- RtlInitUnicodeString(&SubKeyString, (LPWSTR)lpSubKey);
+ Status = MapDefaultKey (&ParentKey,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+ RtlInitUnicodeString (&SubKeyName,
+ (LPWSTR)lpSubKey);
InitializeObjectAttributes (&ObjectAttributes,
- &SubKeyString,
- OBJ_CASE_INSENSITIVE,
- (HANDLE)ParentKey,
- NULL);
- Status = NtOpenKey(&TargetKey, DELETE, &ObjectAttributes);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
- Status = NtDeleteKey(TargetKey);
- NtClose(TargetKey);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
+ &SubKeyName,
+ OBJ_CASE_INSENSITIVE,
+ (HANDLE)ParentKey,
+ NULL);
+ Status = NtOpenKey (&TargetKey,
+ DELETE,
+ &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ Status = NtDeleteKey (TargetKey);
+ NtClose (TargetKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
return ERROR_SUCCESS;
}
/************************************************************************
* RegDeleteValueA
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegDeleteValueA(
- HKEY hKey,
- LPCSTR lpValueName)
+LONG STDCALL
+RegDeleteValueA (HKEY hKey,
+ LPCSTR lpValueName)
{
- UNICODE_STRING ValueNameW;
- ANSI_STRING ValueNameA;
- NTSTATUS Status;
- LONG ErrorCode;
+ UNICODE_STRING ValueName;
HKEY KeyHandle;
+ LONG ErrorCode;
+ NTSTATUS Status;
+
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ RtlCreateUnicodeStringFromAsciiz (&ValueName,
+ (LPSTR)lpValueName);
+ Status = NtDeleteValueKey (KeyHandle,
+ &ValueName);
+ RtlFreeUnicodeString (&ValueName);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
- Status = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
- RtlInitAnsiString(&ValueNameA, (LPSTR)lpValueName);
- RtlAnsiStringToUnicodeString(&ValueNameW, &ValueNameA, TRUE);
- Status = NtDeleteValueKey(KeyHandle, &ValueNameW);
- RtlFreeUnicodeString (&ValueNameW);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
return ERROR_SUCCESS;
}
/************************************************************************
* RegDeleteValueW
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegDeleteValueW(
- HKEY hKey,
- LPCWSTR lpValueName)
+LONG STDCALL
+RegDeleteValueW (HKEY hKey,
+ LPCWSTR lpValueName)
{
UNICODE_STRING ValueName;
NTSTATUS Status;
LONG ErrorCode;
HKEY KeyHandle;
- Status = MapDefaultKey(&KeyHandle, hKey);
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
if (!NT_SUCCESS(Status))
- {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
- RtlInitUnicodeString(&ValueName, (LPWSTR)lpValueName);
- Status = NtDeleteValueKey(KeyHandle, &ValueName);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ RtlInitUnicodeString (&ValueName,
+ (LPWSTR)lpValueName);
+
+ Status = NtDeleteValueKey (KeyHandle,
+ &ValueName);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
return ERROR_SUCCESS;
}
/************************************************************************
- * RegEnumKeyExW
+ * RegEnumKeyA
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegEnumKeyExW(
- HKEY hKey,
- DWORD dwIndex,
- LPWSTR lpName,
- LPDWORD lpcbName,
- LPDWORD lpReserved,
- LPWSTR lpClass,
- LPDWORD lpcbClass,
- PFILETIME lpftLastWriteTime)
+LONG STDCALL
+RegEnumKeyA (HKEY hKey,
+ DWORD dwIndex,
+ LPSTR lpName,
+ DWORD cbName)
{
- PKEY_NODE_INFORMATION KeyInfo;
- NTSTATUS Status;
- DWORD dwError = ERROR_SUCCESS;
- ULONG BufferSize;
- ULONG ResultSize;
- HKEY KeyHandle;
-
- Status = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(Status)) {
- dwError = RtlNtStatusToDosError(Status);
- SetLastError (dwError);
- return dwError;
- }
-
- BufferSize = sizeof (KEY_NODE_INFORMATION) + *lpcbName * sizeof(WCHAR);
- if (lpClass)
- BufferSize += *lpcbClass;
-
- //
- // I think this is a memory leak, always allocated again below ???
- //
- // KeyInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize);
- //
-
- /* We don't know the exact size of the data returned, so call
- NtEnumerateKey() with a buffer size determined from parameters
- to this function. If that call fails with a status code of
- STATUS_BUFFER_OVERFLOW, allocate a new buffer and try again */
- while (TRUE) {
- KeyInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize);
- if (KeyInfo == NULL) {
- SetLastError(ERROR_OUTOFMEMORY);
- return ERROR_OUTOFMEMORY;
- }
- Status = NtEnumerateKey(
- KeyHandle,
- (ULONG)dwIndex,
- KeyNodeInformation,
- KeyInfo,
- BufferSize,
- &ResultSize);
-
- DPRINT("NtEnumerateKey() returned status 0x%X\n", Status);
-
- if (Status == STATUS_BUFFER_OVERFLOW) {
- RtlFreeHeap(RtlGetProcessHeap(), 0, KeyInfo);
- BufferSize = ResultSize;
- continue;
- }
- if (!NT_SUCCESS(Status)) {
- dwError = RtlNtStatusToDosError(Status);
- SetLastError(dwError);
- break;
- } else {
- if ((lpClass) && (*lpcbClass != 0) && (KeyInfo->ClassLength > *lpcbClass)) {
- dwError = ERROR_MORE_DATA;
- SetLastError(dwError);
- break;
- }
- RtlMoveMemory(lpName, KeyInfo->Name, KeyInfo->NameLength);
- *lpcbName = (DWORD)(KeyInfo->NameLength / sizeof(WCHAR));
- lpName[KeyInfo->NameLength / sizeof(WCHAR)] = 0;
- if (lpClass) {
- RtlMoveMemory(lpClass,
- (PVOID)((ULONG_PTR)KeyInfo->Name + KeyInfo->ClassOffset),
- KeyInfo->ClassLength);
- *lpcbClass = (DWORD)(KeyInfo->ClassLength / sizeof(WCHAR));
- }
- if (lpftLastWriteTime) {
- /* FIXME: Fill lpftLastWriteTime */
- }
- break;
- }
- }
- RtlFreeHeap (RtlGetProcessHeap(), 0, KeyInfo);
- return dwError;
+ DWORD dwLength;
+
+ dwLength = cbName;
+ return RegEnumKeyExA (hKey,
+ dwIndex,
+ lpName,
+ &dwLength,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
}
/************************************************************************
* RegEnumKeyW
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegEnumKeyW(
- HKEY hKey,
- DWORD dwIndex,
- LPWSTR lpName,
- DWORD cbName)
+LONG STDCALL
+RegEnumKeyW (HKEY hKey,
+ DWORD dwIndex,
+ LPWSTR lpName,
+ DWORD cbName)
{
- DWORD dwLength = cbName;
-
- return RegEnumKeyExW(hKey,
- dwIndex,
- lpName,
- &dwLength,
- NULL,
- NULL,
- NULL,
- NULL);
+ DWORD dwLength;
+
+ dwLength = cbName;
+ return RegEnumKeyExW (hKey,
+ dwIndex,
+ lpName,
+ &dwLength,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
}
/************************************************************************
* RegEnumKeyExA
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegEnumKeyExA(
- HKEY hKey,
- DWORD dwIndex,
- LPSTR lpName,
- LPDWORD lpcbName,
- LPDWORD lpReserved,
- LPSTR lpClass,
- LPDWORD lpcbClass,
- PFILETIME lpftLastWriteTime)
+LONG STDCALL
+RegEnumKeyExA (HKEY hKey,
+ DWORD dwIndex,
+ LPSTR lpName,
+ LPDWORD lpcbName,
+ LPDWORD lpReserved,
+ LPSTR lpClass,
+ LPDWORD lpcbClass,
+ PFILETIME lpftLastWriteTime)
{
- WCHAR Name[MAX_PATH+1];
- UNICODE_STRING UnicodeStringName;
- WCHAR Class[MAX_PATH+1];
- UNICODE_STRING UnicodeStringClass;
- ANSI_STRING AnsiString;
- LONG ErrorCode;
+ union
+ {
+ KEY_NODE_INFORMATION Node;
+ KEY_BASIC_INFORMATION Basic;
+ } *KeyInfo;
+
+ UNICODE_STRING StringU;
+ ANSI_STRING StringA;
+ LONG ErrorCode = ERROR_SUCCESS;
DWORD NameLength;
DWORD ClassLength;
+ DWORD BufferSize;
+ DWORD ResultSize;
+ HKEY KeyHandle;
+ NTSTATUS Status;
- DPRINT("hKey 0x%x dwIndex %d lpName 0x%x *lpcbName %d lpClass 0x%x lpcbClass %d\n",
- hKey, dwIndex, lpName, *lpcbName, lpClass, lpcbClass);
-
- if ((lpClass) && (!lpcbClass)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- return ERROR_INVALID_PARAMETER;
- }
- RtlInitUnicodeString(&UnicodeStringName, NULL);
- UnicodeStringName.Buffer = &Name[0];
- UnicodeStringName.MaximumLength = sizeof(Name);
- RtlInitUnicodeString(&UnicodeStringClass, NULL);
- if (lpClass) {
- UnicodeStringClass.Buffer = &Class[0];
- UnicodeStringClass.MaximumLength = sizeof(Class);
- ClassLength = *lpcbClass;
- } else {
- ClassLength = 0;
- }
- NameLength = *lpcbName;
- ErrorCode = RegEnumKeyExW(
- hKey,
- dwIndex,
- UnicodeStringName.Buffer,
- &NameLength,
- lpReserved,
- UnicodeStringClass.Buffer,
- &ClassLength,
- lpftLastWriteTime);
-
- if (ErrorCode != ERROR_SUCCESS)
- return ErrorCode;
-
- UnicodeStringName.Length = NameLength * sizeof(WCHAR);
- UnicodeStringClass.Length = ClassLength * sizeof(WCHAR);
- RtlInitAnsiString(&AnsiString, NULL);
- AnsiString.Buffer = lpName;
- AnsiString.MaximumLength = *lpcbName;
- RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeStringName, FALSE);
- *lpcbName = AnsiString.Length;
+ DPRINT("RegEnumKeyExA(hKey 0x%x, dwIndex %d, lpName 0x%x, *lpcbName %d, lpClass 0x%x, lpcbClass %d)\n",
+ hKey, dwIndex, lpName, *lpcbName, lpClass, lpcbClass ? *lpcbClass : 0);
- DPRINT("Key Namea0 Length %d\n", UnicodeStringName.Length);
- DPRINT("Key Namea1 Length %d\n", NameLength);
- DPRINT("Key Namea Length %d\n", *lpcbName);
- DPRINT("Key Namea %s\n", lpName);
+ if ((lpClass) && (!lpcbClass))
+ {
+ SetLastError (ERROR_INVALID_PARAMETER);
+ return ERROR_INVALID_PARAMETER;
+ }
+ Status = MapDefaultKey(&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
- if (lpClass) {
- RtlInitAnsiString(&AnsiString, NULL);
- AnsiString.Buffer = lpClass;
- AnsiString.MaximumLength = *lpcbClass;
- RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeStringClass, FALSE);
- *lpcbClass = AnsiString.Length;
- }
- return ERROR_SUCCESS;
+ if (*lpcbName > 0)
+ {
+ NameLength = min (*lpcbName - 1 , REG_MAX_NAME_SIZE) * sizeof (WCHAR);
+ }
+ else
+ {
+ NameLength = 0;
+ }
+ if (lpClass)
+ {
+ if (*lpcbClass > 0)
+ {
+ ClassLength = min (*lpcbClass -1, REG_MAX_NAME_SIZE) * sizeof(WCHAR);
+ }
+ else
+ {
+ ClassLength = 0;
+ }
+ /* The class name should start at a dword boundary */
+ BufferSize = ((sizeof(KEY_NODE_INFORMATION) + NameLength + 3) & ~3) + ClassLength;
+ }
+ else
+ {
+ BufferSize = sizeof(KEY_BASIC_INFORMATION) + NameLength;
+ }
+
+ KeyInfo = RtlAllocateHeap (ProcessHeap,
+ 0,
+ BufferSize);
+
+ if (KeyInfo == NULL)
+ {
+ SetLastError (ERROR_OUTOFMEMORY);
+ return ERROR_OUTOFMEMORY;
+ }
+
+ Status = NtEnumerateKey (KeyHandle,
+ (ULONG)dwIndex,
+ lpClass == NULL ? KeyBasicInformation : KeyNodeInformation,
+ KeyInfo,
+ BufferSize,
+ &ResultSize);
+ DPRINT("NtEnumerateKey() returned status 0x%X\n", Status);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ }
+ else
+ {
+ if (lpClass == NULL)
+ {
+ if (KeyInfo->Basic.NameLength > NameLength)
+ {
+ ErrorCode = ERROR_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ StringU.Buffer = KeyInfo->Basic.Name;
+ StringU.Length = KeyInfo->Basic.NameLength;
+ StringU.MaximumLength = KeyInfo->Basic.NameLength;
+ }
+ }
+ else
+ {
+ if (KeyInfo->Node.NameLength > NameLength ||
+ KeyInfo->Node.ClassLength > ClassLength)
+ {
+ ErrorCode = ERROR_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ StringA.Buffer = lpClass;
+ StringA.Length = 0;
+ StringA.MaximumLength = *lpcbClass;
+ StringU.Buffer = (PWCHAR)((ULONG_PTR)KeyInfo->Node.Name + KeyInfo->Node.ClassOffset);
+ StringU.Length = KeyInfo->Node.ClassLength;
+ StringU.MaximumLength = KeyInfo->Node.ClassLength;
+ RtlUnicodeStringToAnsiString (&StringA, &StringU, FALSE);
+ lpClass[StringA.Length] = 0;
+ *lpcbClass = StringA.Length;
+ StringU.Buffer = KeyInfo->Node.Name;
+ StringU.Length = KeyInfo->Node.NameLength;
+ StringU.MaximumLength = KeyInfo->Node.NameLength;
+ }
+ }
+ if (ErrorCode == ERROR_SUCCESS)
+ {
+ StringA.Buffer = lpName;
+ StringA.Length = 0;
+ StringA.MaximumLength = *lpcbName;
+ RtlUnicodeStringToAnsiString (&StringA, &StringU, FALSE);
+ lpName[StringA.Length] = 0;
+ *lpcbName = StringA.Length;
+ if (lpftLastWriteTime != NULL)
+ {
+ if (lpClass == NULL)
+ {
+ lpftLastWriteTime->dwLowDateTime = KeyInfo->Basic.LastWriteTime.u.LowPart;
+ lpftLastWriteTime->dwHighDateTime = KeyInfo->Basic.LastWriteTime.u.HighPart;
+ }
+ else
+ {
+ lpftLastWriteTime->dwLowDateTime = KeyInfo->Node.LastWriteTime.u.LowPart;
+ lpftLastWriteTime->dwHighDateTime = KeyInfo->Node.LastWriteTime.u.HighPart;
+ }
+ }
+ }
+ }
+
+ DPRINT("Key Namea0 Length %d\n", StringU.Length);
+ DPRINT("Key Namea1 Length %d\n", NameLength);
+ DPRINT("Key Namea Length %d\n", *lpcbName);
+ DPRINT("Key Namea %s\n", lpName);
+
+ RtlFreeHeap (ProcessHeap,
+ 0,
+ KeyInfo);
+
+ if (ErrorCode != ERROR_SUCCESS)
+ {
+ SetLastError(ErrorCode);
+ }
+
+ return ErrorCode;
}
/************************************************************************
- * RegEnumKeyA
+ * RegEnumKeyExW
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegEnumKeyA(
- HKEY hKey,
- DWORD dwIndex,
- LPSTR lpName,
- DWORD cbName)
+LONG STDCALL
+RegEnumKeyExW (HKEY hKey,
+ DWORD dwIndex,
+ LPWSTR lpName,
+ LPDWORD lpcbName,
+ LPDWORD lpReserved,
+ LPWSTR lpClass,
+ LPDWORD lpcbClass,
+ PFILETIME lpftLastWriteTime)
{
- DWORD dwLength = cbName;
-
- return RegEnumKeyExA(hKey,
- dwIndex,
- lpName,
- &dwLength,
- NULL,
- NULL,
- NULL,
- NULL);
+ union
+ {
+ KEY_NODE_INFORMATION Node;
+ KEY_BASIC_INFORMATION Basic;
+ } *KeyInfo;
+
+ ULONG BufferSize;
+ ULONG ResultSize;
+ ULONG NameLength;
+ ULONG ClassLength;
+ HKEY KeyHandle;
+ LONG ErrorCode = ERROR_SUCCESS;
+ NTSTATUS Status;
+
+ Status = MapDefaultKey(&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+ if (*lpcbName > 0)
+ {
+ NameLength = min (*lpcbName - 1, REG_MAX_NAME_SIZE) * sizeof (WCHAR);
+ }
+ else
+ {
+ NameLength = 0;
+ }
+ if (lpClass)
+ {
+ if (*lpcbClass > 0)
+ {
+ ClassLength = min (*lpcbClass - 1, REG_MAX_NAME_SIZE) * sizeof(WCHAR);
+ }
+ else
+ {
+ ClassLength = 0;
+ }
+ BufferSize = ((sizeof(KEY_NODE_INFORMATION) + NameLength + 3) & ~3) + ClassLength;
+ }
+ else
+ {
+ BufferSize = sizeof(KEY_BASIC_INFORMATION) + NameLength;
+ }
+ KeyInfo = RtlAllocateHeap (ProcessHeap,
+ 0,
+ BufferSize);
+ if (KeyInfo == NULL)
+ {
+ SetLastError (ERROR_OUTOFMEMORY);
+ return ERROR_OUTOFMEMORY;
+ }
+
+ Status = NtEnumerateKey (KeyHandle,
+ (ULONG)dwIndex,
+ lpClass ? KeyNodeInformation : KeyBasicInformation,
+ KeyInfo,
+ BufferSize,
+ &ResultSize);
+ DPRINT("NtEnumerateKey() returned status 0x%X\n", Status);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ }
+ else
+ {
+ if (lpClass == NULL)
+ {
+ if (KeyInfo->Basic.NameLength > NameLength)
+ {
+ ErrorCode = ERROR_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ RtlCopyMemory (lpName,
+ KeyInfo->Basic.Name,
+ KeyInfo->Basic.NameLength);
+ *lpcbName = (DWORD)(KeyInfo->Basic.NameLength / sizeof(WCHAR));
+ lpName[*lpcbName] = 0;
+ }
+ }
+ else
+ {
+ if (KeyInfo->Node.NameLength > NameLength ||
+ KeyInfo->Node.ClassLength > ClassLength)
+ {
+ ErrorCode = ERROR_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ RtlCopyMemory (lpName,
+ KeyInfo->Node.Name,
+ KeyInfo->Node.NameLength);
+ *lpcbName = KeyInfo->Node.NameLength / sizeof(WCHAR);
+ lpName[*lpcbName] = 0;
+ RtlCopyMemory (lpClass,
+ (PVOID)((ULONG_PTR)KeyInfo->Node.Name + KeyInfo->Node.ClassOffset),
+ KeyInfo->Node.ClassLength);
+ *lpcbClass = (DWORD)(KeyInfo->Node.ClassLength / sizeof(WCHAR));
+ lpClass[*lpcbClass] = 0;
+ }
+ }
+ if (ErrorCode == ERROR_SUCCESS && lpftLastWriteTime != NULL)
+ {
+ if (lpClass == NULL)
+ {
+ lpftLastWriteTime->dwLowDateTime = KeyInfo->Basic.LastWriteTime.u.LowPart;
+ lpftLastWriteTime->dwHighDateTime = KeyInfo->Basic.LastWriteTime.u.HighPart;
+ }
+ else
+ {
+ lpftLastWriteTime->dwLowDateTime = KeyInfo->Node.LastWriteTime.u.LowPart;
+ lpftLastWriteTime->dwHighDateTime = KeyInfo->Node.LastWriteTime.u.HighPart;
+ }
+ }
+ }
+
+ RtlFreeHeap (ProcessHeap,
+ 0,
+ KeyInfo);
+
+ if (ErrorCode != ERROR_SUCCESS)
+ {
+ SetLastError(ErrorCode);
+ }
+ return ErrorCode;
}
/************************************************************************
- * RegEnumValueW
+ * RegEnumValueA
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegEnumValueW(
- HKEY hKey,
- DWORD dwIndex,
- LPWSTR lpValueName,
- LPDWORD lpcbValueName,
- LPDWORD lpReserved,
- LPDWORD lpType,
- LPBYTE lpData,
- LPDWORD lpcbData)
+LONG STDCALL
+RegEnumValueA (HKEY hKey,
+ DWORD dwIndex,
+ LPSTR lpValueName,
+ LPDWORD lpcbValueName,
+ LPDWORD lpReserved,
+ LPDWORD lpType,
+ LPBYTE lpData,
+ LPDWORD lpcbData)
{
- PKEY_VALUE_FULL_INFORMATION ValueInfo;
- NTSTATUS Status;
- DWORD dwError = ERROR_SUCCESS;
+ union
+ {
+ KEY_VALUE_FULL_INFORMATION Full;
+ KEY_VALUE_BASIC_INFORMATION Basic;
+ } *ValueInfo;
+
+ ULONG NameLength;
ULONG BufferSize;
+ ULONG DataLength;
ULONG ResultSize;
HKEY KeyHandle;
+ LONG ErrorCode;
+ NTSTATUS Status;
+ UNICODE_STRING StringU;
+ ANSI_STRING StringA;
+ BOOL IsStringType;
- Status = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(Status)) {
- dwError = RtlNtStatusToDosError(Status);
- SetLastError(dwError);
- return(dwError);
- }
- BufferSize = sizeof (KEY_VALUE_FULL_INFORMATION) + *lpcbValueName * sizeof(WCHAR);
- if (lpcbData)
- BufferSize += *lpcbData;
-
- /* We don't know the exact size of the data returned, so call
- NtEnumerateValueKey() with a buffer size determined from parameters
- to this function. If that call fails with a status code of
- STATUS_BUFFER_OVERFLOW, allocate a new buffer and try again */
- while (TRUE) {
- ValueInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize);
- if (ValueInfo == NULL) {
+ ErrorCode = ERROR_SUCCESS;
+
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ if (*lpcbValueName > 0)
+ {
+ NameLength = min (*lpcbValueName - 1, REG_MAX_NAME_SIZE) * sizeof(WCHAR);
+ }
+ else
+ {
+ NameLength = 0;
+ }
+ if (lpData)
+ {
+ DataLength = min (*lpcbData * sizeof(WCHAR), REG_MAX_DATA_SIZE);
+ BufferSize = ((sizeof(KEY_VALUE_FULL_INFORMATION) + NameLength + 3) & ~3) + DataLength;
+ }
+ else
+ {
+ BufferSize = sizeof(KEY_VALUE_BASIC_INFORMATION) + NameLength;
+ }
+
+ ValueInfo = RtlAllocateHeap (ProcessHeap,
+ 0,
+ BufferSize);
+ if (ValueInfo == NULL)
+ {
SetLastError(ERROR_OUTOFMEMORY);
return ERROR_OUTOFMEMORY;
}
- Status = NtEnumerateValueKey(
- KeyHandle,
- (ULONG)dwIndex,
- KeyValueFullInformation,
- ValueInfo,
- BufferSize,
- &ResultSize);
-
- DPRINT("NtEnumerateValueKey() returned status 0x%X\n", Status);
-
- if (Status == STATUS_BUFFER_OVERFLOW) {
- RtlFreeHeap(RtlGetProcessHeap(), 0, ValueInfo);
- BufferSize = ResultSize;
- continue;
- }
- if (!NT_SUCCESS(Status)) {
- dwError = RtlNtStatusToDosError(Status);
- SetLastError(dwError);
- break;
- } else {
- if ((lpData) && (*lpcbData != 0) && (ValueInfo->DataLength > *lpcbData)) {
- dwError = ERROR_MORE_DATA;
- SetLastError(dwError);
- break;
- }
- RtlCopyMemory(lpValueName, ValueInfo->Name, ValueInfo->NameLength);
- *lpcbValueName = (DWORD)(ValueInfo->NameLength / sizeof(WCHAR));
- lpValueName[ValueInfo->NameLength / sizeof(WCHAR)] = 0;
- if (lpType)
- *lpType = ValueInfo->Type;
- if (lpData) {
- RtlCopyMemory(lpData,
- //(PVOID)((ULONG_PTR)ValueInfo->Name + ValueInfo->DataOffset),
- (PVOID)((ULONG_PTR)ValueInfo + ValueInfo->DataOffset),
- ValueInfo->DataLength);
- *lpcbData = (DWORD)ValueInfo->DataLength;
-/*
- RtlCopyMemory((PCHAR) ValueFullInformation + ValueFullInformation->DataOffset,
- DataCell->Data,
- ValueCell->DataSize & LONG_MAX);
- */
- }
- break;
+
+ Status = NtEnumerateValueKey (KeyHandle,
+ (ULONG)dwIndex,
+ lpData ? KeyValueFullInformation : KeyValueBasicInformation,
+ ValueInfo,
+ BufferSize,
+ &ResultSize);
+
+ DPRINT("NtEnumerateValueKey() returned status 0x%X\n", Status);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
}
- }
- RtlFreeHeap (RtlGetProcessHeap(), 0, ValueInfo);
- return dwError;
+ else
+ {
+ if (lpData)
+ {
+ IsStringType = (ValueInfo->Full.Type == REG_SZ) ||
+ (ValueInfo->Full.Type == REG_MULTI_SZ) ||
+ (ValueInfo->Full.Type == REG_EXPAND_SZ);
+ if (ValueInfo->Full.NameLength > NameLength ||
+ (!IsStringType && ValueInfo->Full.DataLength > *lpcbData) ||
+ ValueInfo->Full.DataLength > DataLength)
+ {
+ ErrorCode = ERROR_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ if (IsStringType)
+ {
+ StringU.Buffer = (PWCHAR)((ULONG_PTR)ValueInfo + ValueInfo->Full.DataOffset);
+ StringU.Length = ValueInfo->Full.DataLength;
+ StringU.MaximumLength = DataLength;
+ StringA.Buffer = (PCHAR)lpData;
+ StringA.Length = 0;
+ StringA.MaximumLength = *lpcbData;
+ RtlUnicodeStringToAnsiString (&StringA,
+ &StringU,
+ FALSE);
+ *lpcbData = StringA.Length;
+ }
+ else
+ {
+ RtlCopyMemory(lpData,
+ (PVOID)((ULONG_PTR)ValueInfo + ValueInfo->Full.DataOffset),
+ ValueInfo->Full.DataLength);
+ *lpcbData = ValueInfo->Full.DataLength;
+ }
+ StringU.Buffer = ValueInfo->Full.Name;
+ StringU.Length = ValueInfo->Full.NameLength;
+ StringU.MaximumLength = NameLength;
+ }
+ }
+ else
+ {
+ if (ValueInfo->Basic.NameLength > NameLength)
+ {
+ ErrorCode = ERROR_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ StringU.Buffer = ValueInfo->Basic.Name;
+ StringU.Length = ValueInfo->Basic.NameLength;
+ StringU.MaximumLength = NameLength;
+ }
+ }
+ if (ErrorCode == ERROR_SUCCESS)
+ {
+ StringA.Buffer = (PCHAR)lpValueName;
+ StringA.Length = 0;
+ StringA.MaximumLength = *lpcbValueName;
+ RtlUnicodeStringToAnsiString (&StringA,
+ &StringU,
+ FALSE);
+ StringA.Buffer[StringA.Length] = 0;
+ *lpcbValueName = StringA.Length;
+ if (lpType)
+ {
+ *lpType = lpData ? ValueInfo->Full.Type : ValueInfo->Basic.Type;
+ }
+ }
+ }
+ RtlFreeHeap (ProcessHeap,
+ 0,
+ ValueInfo);
+ if (ErrorCode != ERROR_SUCCESS)
+ {
+ SetLastError(ErrorCode);
+ }
+ return ErrorCode;
}
/************************************************************************
- * RegEnumValueA
+ * RegEnumValueW
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegEnumValueA(
- HKEY hKey,
- DWORD dwIndex,
- LPSTR lpValueName,
- LPDWORD lpcbValueName,
- LPDWORD lpReserved,
- LPDWORD lpType,
- LPBYTE lpData,
- LPDWORD lpcbData)
+LONG STDCALL
+RegEnumValueW (HKEY hKey,
+ DWORD dwIndex,
+ LPWSTR lpValueName,
+ LPDWORD lpcbValueName,
+ LPDWORD lpReserved,
+ LPDWORD lpType,
+ LPBYTE lpData,
+ LPDWORD lpcbData)
{
- WCHAR ValueName[MAX_PATH+1];
- UNICODE_STRING UnicodeString;
- ANSI_STRING AnsiString;
+ union
+ {
+ KEY_VALUE_FULL_INFORMATION Full;
+ KEY_VALUE_BASIC_INFORMATION Basic;
+ } *ValueInfo;
+
+ ULONG NameLength;
+ ULONG BufferSize;
+ ULONG DataLength;
+ ULONG ResultSize;
+ HKEY KeyHandle;
LONG ErrorCode;
- DWORD ValueNameLength;
- BYTE* lpDataBuffer = NULL;
- DWORD cbData = 0;
- DWORD Type;
- ANSI_STRING AnsiDataString;
- UNICODE_STRING UnicodeDataString;
+ NTSTATUS Status;
+
+ ErrorCode = ERROR_SUCCESS;
- if (lpData != NULL /*&& lpcbData != NULL*/) {
- cbData = *lpcbData; // this should always be valid if lpData is valid
- lpDataBuffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, (*lpcbData) * sizeof(WCHAR));
- if (lpDataBuffer == NULL) {
- SetLastError(ERROR_OUTOFMEMORY);
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ if (*lpcbValueName > 0)
+ {
+ NameLength = min (*lpcbValueName - 1, REG_MAX_NAME_SIZE) * sizeof(WCHAR);
+ }
+ else
+ {
+ NameLength = 0;
+ }
+ if (lpData)
+ {
+ DataLength = min(*lpcbData, REG_MAX_DATA_SIZE);
+ BufferSize = ((sizeof(KEY_VALUE_FULL_INFORMATION) + NameLength + 3) & ~3) + DataLength;
+ }
+ else
+ {
+ BufferSize = sizeof(KEY_VALUE_BASIC_INFORMATION) + NameLength;
+ }
+ ValueInfo = RtlAllocateHeap (ProcessHeap,
+ 0,
+ BufferSize);
+ if (ValueInfo == NULL)
+ {
+ SetLastError (ERROR_OUTOFMEMORY);
return ERROR_OUTOFMEMORY;
}
- }
- RtlInitUnicodeString(&UnicodeString, NULL);
- UnicodeString.Buffer = &ValueName[0];
- UnicodeString.MaximumLength = sizeof(ValueName);
- ValueNameLength = *lpcbValueName;
- ErrorCode = RegEnumValueW(
- hKey,
- dwIndex,
- UnicodeString.Buffer,
- &ValueNameLength,
- lpReserved,
- &Type,
- lpDataBuffer,
- &cbData);
+ Status = NtEnumerateValueKey (KeyHandle,
+ (ULONG)dwIndex,
+ lpData ? KeyValueFullInformation : KeyValueBasicInformation,
+ ValueInfo,
+ BufferSize,
+ &ResultSize);
+
+ DPRINT("NtEnumerateValueKey() returned status 0x%X\n", Status);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ }
+ else
+ {
+ if (lpData)
+ {
+ if (ValueInfo->Full.DataLength > DataLength ||
+ ValueInfo->Full.NameLength > NameLength)
+ {
+ ErrorCode = ERROR_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ RtlCopyMemory (lpValueName,
+ ValueInfo->Full.Name,
+ ValueInfo->Full.NameLength);
+ *lpcbValueName = (DWORD)(ValueInfo->Full.NameLength / sizeof(WCHAR));
+ lpValueName[*lpcbValueName] = 0;
+ RtlCopyMemory (lpData,
+ (PVOID)((ULONG_PTR)ValueInfo + ValueInfo->Full.DataOffset),
+ ValueInfo->Full.DataLength);
+ *lpcbData = (DWORD)ValueInfo->Full.DataLength;
+ }
+ }
+ else
+ {
+ if (ValueInfo->Basic.NameLength > NameLength)
+ {
+ ErrorCode = ERROR_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ RtlCopyMemory (lpValueName,
+ ValueInfo->Basic.Name,
+ ValueInfo->Basic.NameLength);
+ *lpcbValueName = (DWORD)(ValueInfo->Basic.NameLength / sizeof(WCHAR));
+ lpValueName[*lpcbValueName] = 0;
+ }
+ }
+ if (ErrorCode == ERROR_SUCCESS && lpType != NULL)
+ {
+ *lpType = lpData ? ValueInfo->Full.Type : ValueInfo->Basic.Type;
+ }
+ }
+ RtlFreeHeap (ProcessHeap,
+ 0,
+ ValueInfo);
if (ErrorCode != ERROR_SUCCESS)
- return ErrorCode;
- UnicodeString.Length = ValueNameLength * sizeof(WCHAR);
- RtlInitAnsiString(&AnsiString, NULL);
- AnsiString.Buffer = lpValueName;
- AnsiString.MaximumLength = *lpcbValueName;
- RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, FALSE);
- *lpcbValueName = AnsiString.Length;
-// if (lpData != lpDataBuffer) { // did we use a temp buffer
- if (lpDataBuffer) { // did we use a temp buffer
- if ((Type == REG_SZ) || (Type == REG_MULTI_SZ) || (Type == REG_EXPAND_SZ)) {
- RtlInitUnicodeString(&UnicodeDataString, NULL);
- UnicodeDataString.Buffer = (WCHAR*)lpDataBuffer;
- UnicodeDataString.MaximumLength = (*lpcbData) * sizeof(WCHAR);
- UnicodeDataString.Length = cbData /* * sizeof(WCHAR)*/;
- RtlInitAnsiString(&AnsiDataString, NULL);
- AnsiDataString.Buffer = lpData;
- AnsiDataString.MaximumLength = *lpcbData;
- RtlUnicodeStringToAnsiString(&AnsiDataString, &UnicodeDataString, FALSE);
- *lpcbData = AnsiDataString.Length;
-// else if (Type == REG_EXPAND_SZ) {
- } else {
- memcpy(lpData, lpDataBuffer, min(*lpcbData, cbData));
- *lpcbData = cbData;
- }
- RtlFreeHeap(RtlGetProcessHeap(), 0, lpDataBuffer);
- }
- if (lpType != NULL) {
- *lpType = Type;
- }
- return ERROR_SUCCESS;
+ {
+ SetLastError(ErrorCode);
+ }
+ return ErrorCode;
}
/************************************************************************
* RegFlushKey
+ *
+ * @implemented
*/
LONG STDCALL
RegFlushKey(HKEY hKey)
{
HKEY KeyHandle;
- NTSTATUS Status;
LONG ErrorCode;
+ NTSTATUS Status;
if (hKey == HKEY_PERFORMANCE_DATA)
- return(ERROR_SUCCESS);
+ {
+ return ERROR_SUCCESS;
+ }
- Status = MapDefaultKey(&KeyHandle, hKey);
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
if (!NT_SUCCESS(Status))
{
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
}
- Status = NtFlushKey(KeyHandle);
+ Status = NtFlushKey (KeyHandle);
if (!NT_SUCCESS(Status))
{
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
}
- return(ERROR_SUCCESS);
+ return ERROR_SUCCESS;
}
/************************************************************************
* RegGetKeySecurity
+ *
+ * @unimplemented
*/
LONG STDCALL
RegGetKeySecurity (HKEY hKey,
PSECURITY_DESCRIPTOR pSecurityDescriptor,
LPDWORD lpcbSecurityDescriptor)
{
+#if 0
+ HKEY KeyHandle;
+ LONG ErrorCode;
+ NTSTATUS Status;
+
+ if (hKey = HKEY_PERFORMANCE_DATA)
+ {
+ return ERROR_INVALID_HANDLE;
+ }
+
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ Status = NtQuerySecurityObject ()
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ return ERROR_SUCCESS;
+#endif
+
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return ERROR_CALL_NOT_IMPLEMENTED;
/************************************************************************
* RegLoadKeyA
+ *
+ * @implemented
*/
LONG STDCALL
RegLoadKeyA (HKEY hKey,
/************************************************************************
* RegLoadKeyW
+ *
+ * @implemented
*/
LONG STDCALL
RegLoadKeyW (HKEY hKey,
NTSTATUS Status;
if (hKey == HKEY_PERFORMANCE_DATA)
- return ERROR_INVALID_HANDLE;
+ {
+ return ERROR_INVALID_HANDLE;
+ }
- Status = MapDefaultKey (&KeyHandle, hKey);
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
if (!NT_SUCCESS(Status))
{
ErrorCode = RtlNtStatusToDosError (Status);
/************************************************************************
* RegNotifyChangeKeyValue
+ *
+ * @unimplemented
*/
LONG STDCALL
-RegNotifyChangeKeyValue(HKEY hKey,
- BOOL bWatchSubtree,
- DWORD dwNotifyFilter,
- HANDLE hEvent,
- BOOL fAsynchronous)
+RegNotifyChangeKeyValue (HKEY hKey,
+ BOOL bWatchSubtree,
+ DWORD dwNotifyFilter,
+ HANDLE hEvent,
+ BOOL fAsynchronous)
{
IO_STATUS_BLOCK IoStatusBlock;
HANDLE KeyHandle;
if (hKey == HKEY_PERFORMANCE_DATA)
{
- return (ERROR_INVALID_HANDLE);
+ return ERROR_INVALID_HANDLE;
}
- if (fAsynchronous && hEvent == NULL)
+ if (fAsynchronous == TRUE && hEvent == NULL)
{
- return (ERROR_INVALID_PARAMETER);
+ return ERROR_INVALID_PARAMETER;
}
Status = MapDefaultKey (&KeyHandle,
hKey);
if (!NT_SUCCESS(Status))
{
- return (RtlNtStatusToDosError (Status));
+ return RtlNtStatusToDosError (Status);
}
/* FIXME: Remote key handles must fail */
fAsynchronous);
if (!NT_SUCCESS(Status) && Status != STATUS_TIMEOUT)
{
- return (RtlNtStatusToDosError (Status));
+ return RtlNtStatusToDosError (Status);
}
- return (ERROR_SUCCESS);
+ return ERROR_SUCCESS;
}
/************************************************************************
* RegOpenKeyA
+ *
+ * @implemented
*/
LONG STDCALL
-RegOpenKeyA(HKEY hKey,
- LPCSTR lpSubKey,
- PHKEY phkResult)
+RegOpenKeyA (HKEY hKey,
+ LPCSTR lpSubKey,
+ PHKEY phkResult)
{
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING SubKeyString;
LONG ErrorCode;
NTSTATUS Status;
- Status = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
- }
- RtlCreateUnicodeStringFromAsciiz(&SubKeyString, (LPSTR)lpSubKey);
- InitializeObjectAttributes(&ObjectAttributes,
- &SubKeyString,
- OBJ_CASE_INSENSITIVE,
- KeyHandle,
- NULL);
- Status = NtOpenKey(phkResult, KEY_ALL_ACCESS, &ObjectAttributes);
- RtlFreeUnicodeString(&SubKeyString);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
- }
- return(ERROR_SUCCESS);
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ RtlCreateUnicodeStringFromAsciiz (&SubKeyString,
+ (LPSTR)lpSubKey);
+ InitializeObjectAttributes (&ObjectAttributes,
+ &SubKeyString,
+ OBJ_CASE_INSENSITIVE,
+ KeyHandle,
+ NULL);
+ Status = NtOpenKey (phkResult,
+ MAXIMUM_ALLOWED,
+ &ObjectAttributes);
+ RtlFreeUnicodeString (&SubKeyString);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ return ERROR_SUCCESS;
}
*
* 19981101 Ariadne
* 19990525 EA
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegOpenKeyW(
- HKEY hKey,
- LPCWSTR lpSubKey,
- PHKEY phkResult)
+LONG STDCALL
+RegOpenKeyW (HKEY hKey,
+ LPCWSTR lpSubKey,
+ PHKEY phkResult)
{
- NTSTATUS errCode;
- UNICODE_STRING SubKeyString;
OBJECT_ATTRIBUTES ObjectAttributes;
- HKEY KeyHandle;
- LONG ErrorCode;
-
- errCode = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(errCode)) {
- ErrorCode = RtlNtStatusToDosError(errCode);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
- RtlInitUnicodeString(&SubKeyString, (LPWSTR)lpSubKey);
- InitializeObjectAttributes(&ObjectAttributes,
- &SubKeyString,
- OBJ_CASE_INSENSITIVE,
- KeyHandle,
- NULL);
- errCode = NtOpenKey(phkResult, KEY_ALL_ACCESS, &ObjectAttributes);
- if (!NT_SUCCESS(errCode)) {
- ErrorCode = RtlNtStatusToDosError(errCode);
- SetLastError(ErrorCode);
- return ErrorCode;
- }
+ UNICODE_STRING SubKeyString;
+ HKEY KeyHandle;
+ LONG ErrorCode;
+ NTSTATUS Status;
+
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ RtlInitUnicodeString (&SubKeyString,
+ (LPWSTR)lpSubKey);
+ InitializeObjectAttributes (&ObjectAttributes,
+ &SubKeyString,
+ OBJ_CASE_INSENSITIVE,
+ KeyHandle,
+ NULL);
+ Status = NtOpenKey (phkResult,
+ MAXIMUM_ALLOWED,
+ &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError(ErrorCode);
+ return ErrorCode;
+ }
+
return ERROR_SUCCESS;
}
/************************************************************************
* RegOpenKeyExA
+ *
+ * @implemented
*/
LONG STDCALL
-RegOpenKeyExA(HKEY hKey,
- LPCSTR lpSubKey,
- DWORD ulOptions,
- REGSAM samDesired,
- PHKEY phkResult)
+RegOpenKeyExA (HKEY hKey,
+ LPCSTR lpSubKey,
+ DWORD ulOptions,
+ REGSAM samDesired,
+ PHKEY phkResult)
{
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING SubKeyString;
LONG ErrorCode;
NTSTATUS Status;
- Status = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
- }
- RtlCreateUnicodeStringFromAsciiz(&SubKeyString, (LPSTR)lpSubKey);
- InitializeObjectAttributes(&ObjectAttributes,
- &SubKeyString,
- OBJ_CASE_INSENSITIVE,
- KeyHandle,
- NULL);
- Status = NtOpenKey(phkResult, samDesired, &ObjectAttributes);
- RtlFreeUnicodeString(&SubKeyString);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
- }
- return(ERROR_SUCCESS);
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ RtlCreateUnicodeStringFromAsciiz (&SubKeyString,
+ (LPSTR)lpSubKey);
+ InitializeObjectAttributes (&ObjectAttributes,
+ &SubKeyString,
+ OBJ_CASE_INSENSITIVE,
+ KeyHandle,
+ NULL);
+ Status = NtOpenKey (phkResult,
+ samDesired,
+ &ObjectAttributes);
+ RtlFreeUnicodeString (&SubKeyString);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ return ERROR_SUCCESS;
+}
+
+
+/************************************************************************
+ * RegOpenKeyExW
+ *
+ * @implemented
+ */
+LONG STDCALL
+RegOpenKeyExW (HKEY hKey,
+ LPCWSTR lpSubKey,
+ DWORD ulOptions,
+ REGSAM samDesired,
+ PHKEY phkResult)
+{
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING SubKeyString;
+ HKEY KeyHandle;
+ LONG ErrorCode;
+ NTSTATUS Status;
+
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ if (lpSubKey != NULL)
+ {
+ RtlInitUnicodeString (&SubKeyString,
+ (LPWSTR)lpSubKey);
+ }
+ else
+ {
+ RtlInitUnicodeString (&SubKeyString,
+ (LPWSTR)L"");
+ }
+ InitializeObjectAttributes (&ObjectAttributes,
+ &SubKeyString,
+ OBJ_CASE_INSENSITIVE,
+ KeyHandle,
+ NULL);
+ Status = NtOpenKey (phkResult,
+ samDesired,
+ &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ return ERROR_SUCCESS;
}
/************************************************************************
- * RegOpenKeyExW
+ * RegQueryInfoKeyA
+ *
+ * @implemented
*/
LONG STDCALL
-RegOpenKeyExW(HKEY hKey,
- LPCWSTR lpSubKey,
- DWORD ulOptions,
- REGSAM samDesired,
- PHKEY phkResult)
+RegQueryInfoKeyA (HKEY hKey,
+ LPSTR lpClass,
+ LPDWORD lpcbClass,
+ LPDWORD lpReserved,
+ LPDWORD lpcSubKeys,
+ LPDWORD lpcbMaxSubKeyLen,
+ LPDWORD lpcbMaxClassLen,
+ LPDWORD lpcValues,
+ LPDWORD lpcbMaxValueNameLen,
+ LPDWORD lpcbMaxValueLen,
+ LPDWORD lpcbSecurityDescriptor,
+ PFILETIME lpftLastWriteTime)
{
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING SubKeyString;
- HKEY KeyHandle;
+ WCHAR ClassName[MAX_PATH];
+ UNICODE_STRING UnicodeString;
+ ANSI_STRING AnsiString;
LONG ErrorCode;
- NTSTATUS Status;
- Status = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return(ErrorCode);
- }
- if (lpSubKey != NULL) {
- RtlInitUnicodeString(&SubKeyString, (LPWSTR)lpSubKey);
- } else {
- RtlInitUnicodeString(&SubKeyString, (LPWSTR)L"");
- }
- InitializeObjectAttributes(&ObjectAttributes,
- &SubKeyString,
- OBJ_CASE_INSENSITIVE,
- KeyHandle,
- NULL);
- Status = NtOpenKey(phkResult, samDesired, &ObjectAttributes);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
- }
- return(ERROR_SUCCESS);
+ RtlInitUnicodeString (&UnicodeString,
+ NULL);
+ if (lpClass != NULL)
+ {
+ UnicodeString.Buffer = &ClassName[0];
+ UnicodeString.MaximumLength = sizeof(ClassName);
+ AnsiString.MaximumLength = *lpcbClass;
+ }
+
+ ErrorCode = RegQueryInfoKeyW (hKey,
+ UnicodeString.Buffer,
+ lpcbClass,
+ lpReserved,
+ lpcSubKeys,
+ lpcbMaxSubKeyLen,
+ lpcbMaxClassLen,
+ lpcValues,
+ lpcbMaxValueNameLen,
+ lpcbMaxValueLen,
+ lpcbSecurityDescriptor,
+ lpftLastWriteTime);
+ if ((ErrorCode == ERROR_SUCCESS) && (lpClass != NULL))
+ {
+ AnsiString.Buffer = lpClass;
+ AnsiString.Length = 0;
+ UnicodeString.Length = *lpcbClass * sizeof(WCHAR);
+ RtlUnicodeStringToAnsiString (&AnsiString,
+ &UnicodeString,
+ FALSE);
+ *lpcbClass = AnsiString.Length;
+ lpClass[AnsiString.Length] = 0;
+ }
+
+ return ErrorCode;
}
/************************************************************************
* RegQueryInfoKeyW
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegQueryInfoKeyW(
- HKEY hKey,
- LPWSTR lpClass,
- LPDWORD lpcbClass,
- LPDWORD lpReserved,
- LPDWORD lpcSubKeys,
- LPDWORD lpcbMaxSubKeyLen,
- LPDWORD lpcbMaxClassLen,
- LPDWORD lpcValues,
- LPDWORD lpcbMaxValueNameLen,
- LPDWORD lpcbMaxValueLen,
- LPDWORD lpcbSecurityDescriptor,
- PFILETIME lpftLastWriteTime)
+LONG STDCALL
+RegQueryInfoKeyW (HKEY hKey,
+ LPWSTR lpClass,
+ LPDWORD lpcbClass,
+ LPDWORD lpReserved,
+ LPDWORD lpcSubKeys,
+ LPDWORD lpcbMaxSubKeyLen,
+ LPDWORD lpcbMaxClassLen,
+ LPDWORD lpcValues,
+ LPDWORD lpcbMaxValueNameLen,
+ LPDWORD lpcbMaxValueLen,
+ LPDWORD lpcbSecurityDescriptor,
+ PFILETIME lpftLastWriteTime)
{
KEY_FULL_INFORMATION FullInfoBuffer;
PKEY_FULL_INFORMATION FullInfo;
ULONG FullInfoSize;
+ ULONG ClassLength;
HKEY KeyHandle;
NTSTATUS Status;
- LONG ErrorCode;
+ LONG ErrorCode = ERROR_SUCCESS;
ULONG Length;
if ((lpClass) && (!lpcbClass))
return ERROR_INVALID_PARAMETER;
}
- Status = MapDefaultKey(&KeyHandle, hKey);
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
if (!NT_SUCCESS(Status))
{
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
}
- if (lpClass) {
- FullInfoSize = sizeof(KEY_FULL_INFORMATION) + *lpcbClass;
- FullInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, FullInfoSize);
- if (!FullInfo) {
- SetLastError(ERROR_OUTOFMEMORY);
- return ERROR_OUTOFMEMORY;
+ if (lpClass != NULL)
+ {
+ if (*lpcbClass > 0)
+ {
+ ClassLength = min(*lpcbClass - 1, REG_MAX_NAME_SIZE) * sizeof(WCHAR);
+ }
+ else
+ {
+ ClassLength = 0;
+ }
+ FullInfoSize = sizeof(KEY_FULL_INFORMATION) + ((ClassLength + 3) & ~3);
+ FullInfo = RtlAllocateHeap (ProcessHeap,
+ 0,
+ FullInfoSize);
+ if (FullInfo == NULL)
+ {
+ SetLastError (ERROR_OUTOFMEMORY);
+ return ERROR_OUTOFMEMORY;
+ }
+ FullInfo->ClassLength = ClassLength;
+ }
+ else
+ {
+ FullInfoSize = sizeof(KEY_FULL_INFORMATION);
+ FullInfo = &FullInfoBuffer;
+ FullInfo->ClassLength = 0;
}
- FullInfo->ClassLength = *lpcbClass;
- } else {
- FullInfoSize = sizeof(KEY_FULL_INFORMATION);
- FullInfo = &FullInfoBuffer;
- FullInfo->ClassLength = 1;
- }
FullInfo->ClassOffset = FIELD_OFFSET(KEY_FULL_INFORMATION, Class);
- Status = NtQueryKey(
- KeyHandle,
- KeyFullInformation,
- FullInfo,
- FullInfoSize,
- &Length);
- if (!NT_SUCCESS(Status)) {
- if (lpClass) {
- RtlFreeHeap(RtlGetProcessHeap(), 0, FullInfo);
- }
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return ErrorCode;
- }
- if (lpcSubKeys) {
- *lpcSubKeys = FullInfo->SubKeys;
- }
- if (lpcbMaxSubKeyLen) {
- *lpcbMaxSubKeyLen = FullInfo->MaxNameLen;
- }
- if (lpcbMaxClassLen) {
- *lpcbMaxClassLen = FullInfo->MaxClassLen;
- }
- if (lpcValues) {
- *lpcValues = FullInfo->Values;
- }
- if (lpcbMaxValueNameLen) {
- *lpcbMaxValueNameLen = FullInfo->MaxValueNameLen;
- }
- if (lpcbMaxValueLen) {
- *lpcbMaxValueLen = FullInfo->MaxValueDataLen;
- }
- if (lpcbSecurityDescriptor) {
- *lpcbSecurityDescriptor = 0;
- /* FIXME */
- }
- if (lpftLastWriteTime != NULL) {
- lpftLastWriteTime->dwLowDateTime = FullInfo->LastWriteTime.u.LowPart;
- lpftLastWriteTime->dwHighDateTime = FullInfo->LastWriteTime.u.HighPart;
- }
- if (lpClass) {
- wcsncpy(lpClass, FullInfo->Class, *lpcbClass);
- RtlFreeHeap(RtlGetProcessHeap(), 0, FullInfo);
- }
- SetLastError(ERROR_SUCCESS);
- return ERROR_SUCCESS;
-}
+ Status = NtQueryKey (KeyHandle,
+ KeyFullInformation,
+ FullInfo,
+ FullInfoSize,
+ &Length);
+ DPRINT("NtQueryKey() returned status 0x%X\n", Status);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ }
+ else
+ {
+ DPRINT("SubKeys %d\n", FullInfo->SubKeys);
+ if (lpcSubKeys != NULL)
+ {
+ *lpcSubKeys = FullInfo->SubKeys;
+ }
-/************************************************************************
- * RegQueryInfoKeyA
- */
-LONG
-STDCALL
-RegQueryInfoKeyA(
- HKEY hKey,
- LPSTR lpClass,
- LPDWORD lpcbClass,
- LPDWORD lpReserved,
- LPDWORD lpcSubKeys,
- LPDWORD lpcbMaxSubKeyLen,
- LPDWORD lpcbMaxClassLen,
- LPDWORD lpcValues,
- LPDWORD lpcbMaxValueNameLen,
- LPDWORD lpcbMaxValueLen,
- LPDWORD lpcbSecurityDescriptor,
- PFILETIME lpftLastWriteTime)
-{
- WCHAR ClassName[MAX_PATH];
- UNICODE_STRING UnicodeString;
- ANSI_STRING AnsiString;
- LONG ErrorCode;
+ DPRINT("MaxNameLen %lu\n", FullInfo->MaxNameLen);
+ if (lpcbMaxSubKeyLen != NULL)
+ {
+ *lpcbMaxSubKeyLen = FullInfo->MaxNameLen / sizeof(WCHAR) + 1;
+ }
+
+ DPRINT("MaxClassLen %lu\n", FullInfo->MaxClassLen);
+ if (lpcbMaxClassLen != NULL)
+ {
+ *lpcbMaxClassLen = FullInfo->MaxClassLen / sizeof(WCHAR) + 1;
+ }
+
+ DPRINT("Values %lu\n", FullInfo->Values);
+ if (lpcValues)
+ {
+ *lpcValues = FullInfo->Values;
+ }
+
+ DPRINT("MaxValueNameLen %lu\n", FullInfo->MaxValueNameLen);
+ if (lpcbMaxValueNameLen)
+ {
+ *lpcbMaxValueNameLen = FullInfo->MaxValueNameLen / sizeof(WCHAR) + 1;
+ }
+
+ DPRINT("MaxValueDataLen %lu\n", FullInfo->MaxValueDataLen);
+ if (lpcbMaxValueLen)
+ {
+ *lpcbMaxValueLen = FullInfo->MaxValueDataLen;
+ }
+
+ if (lpcbSecurityDescriptor)
+ {
+ *lpcbSecurityDescriptor = 0;
+ /* FIXME */
+ }
+
+ if (lpftLastWriteTime != NULL)
+ {
+ lpftLastWriteTime->dwLowDateTime = FullInfo->LastWriteTime.u.LowPart;
+ lpftLastWriteTime->dwHighDateTime = FullInfo->LastWriteTime.u.HighPart;
+ }
+
+ if (lpClass != NULL)
+ {
+ if (FullInfo->ClassLength > ClassLength)
+ {
+ ErrorCode = ERROR_BUFFER_OVERFLOW;
+ }
+ else
+ {
+ RtlCopyMemory (lpClass,
+ FullInfo->Class,
+ FullInfo->ClassLength);
+ *lpcbClass = FullInfo->ClassLength / sizeof(WCHAR);
+ lpClass[*lpcbClass] = 0;
+ }
+ }
+ }
+ if (lpClass != NULL)
+ {
+ RtlFreeHeap (ProcessHeap,
+ 0,
+ FullInfo);
+ }
+ if (ErrorCode != ERROR_SUCCESS)
+ {
+ SetLastError(ErrorCode);
+ }
- RtlInitUnicodeString(&UnicodeString, NULL);
- if (lpClass) {
- UnicodeString.Buffer = &ClassName[0];
- UnicodeString.MaximumLength = sizeof(ClassName);
- }
- ErrorCode = RegQueryInfoKeyW(
- hKey,
- UnicodeString.Buffer,
- lpcbClass,
- lpReserved,
- lpcSubKeys,
- lpcbMaxSubKeyLen,
- lpcbMaxClassLen,
- lpcValues,
- lpcbMaxValueNameLen,
- lpcbMaxValueLen,
- lpcbSecurityDescriptor,
- lpftLastWriteTime);
-
- if ((ErrorCode == ERROR_SUCCESS) && (lpClass)) {
- RtlInitAnsiString(&AnsiString, NULL);
- AnsiString.Buffer = lpClass;
- AnsiString.MaximumLength = *lpcbClass;
- RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, FALSE);
- *lpcbClass = AnsiString.Length;
- }
return ErrorCode;
}
/************************************************************************
* RegQueryMultipleValuesA
+ *
+ * @unimplemented
*/
-LONG
-STDCALL
-RegQueryMultipleValuesA(
- HKEY hKey,
- PVALENTA val_list,
- DWORD num_vals,
- LPSTR lpValueBuf,
- LPDWORD ldwTotsize)
+LONG STDCALL
+RegQueryMultipleValuesA (HKEY hKey,
+ PVALENTA val_list,
+ DWORD num_vals,
+ LPSTR lpValueBuf,
+ LPDWORD ldwTotsize)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
/************************************************************************
* RegQueryMultipleValuesW
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegQueryMultipleValuesW(
- HKEY hKey,
- PVALENTW val_list,
- DWORD num_vals,
- LPWSTR lpValueBuf,
- LPDWORD ldwTotsize)
+LONG STDCALL
+RegQueryMultipleValuesW (HKEY hKey,
+ PVALENTW val_list,
+ DWORD num_vals,
+ LPWSTR lpValueBuf,
+ LPDWORD ldwTotsize)
{
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return ERROR_CALL_NOT_IMPLEMENTED;
+ ULONG i;
+ DWORD maxBytes = *ldwTotsize;
+ HRESULT status;
+ LPSTR bufptr = (LPSTR)lpValueBuf;
+
+ if ( maxBytes >= (1024*1024) )
+ return ERROR_TRANSFER_TOO_LONG;
+
+ *ldwTotsize = 0;
+
+ //TRACE("(%p,%p,%ld,%p,%p=%ld)\n", hKey, val_list, num_vals, lpValueBuf, ldwTotsize, *ldwTotsize);
+
+ for(i=0; i < num_vals; ++i)
+ {
+ val_list[i].ve_valuelen=0;
+ status = RegQueryValueExW(hKey, val_list[i].ve_valuename, NULL, NULL, NULL, &val_list[i].ve_valuelen);
+ if(status != ERROR_SUCCESS)
+ {
+ return status;
+ }
+
+ if(lpValueBuf != NULL && *ldwTotsize + val_list[i].ve_valuelen <= maxBytes)
+ {
+ status = RegQueryValueExW(hKey, val_list[i].ve_valuename, NULL, &val_list[i].ve_type,
+ bufptr, &val_list[i].ve_valuelen);
+ if(status != ERROR_SUCCESS)
+ {
+ return status;
+ }
+
+ val_list[i].ve_valueptr = (DWORD_PTR)bufptr;
+
+ bufptr += val_list[i].ve_valuelen;
+ }
+
+ *ldwTotsize += val_list[i].ve_valuelen;
+ }
+ return lpValueBuf != NULL && *ldwTotsize <= maxBytes ? ERROR_SUCCESS : ERROR_MORE_DATA;
}
/************************************************************************
* RegQueryValueExW
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegQueryValueExW(
- HKEY hKey,
- LPCWSTR lpValueName,
- LPDWORD lpReserved,
- LPDWORD lpType,
- LPBYTE lpData,
- LPDWORD lpcbData)
+LONG STDCALL
+RegQueryValueExW (HKEY hKey,
+ LPCWSTR lpValueName,
+ LPDWORD lpReserved,
+ LPDWORD lpType,
+ LPBYTE lpData,
+ LPDWORD lpcbData)
{
PKEY_VALUE_PARTIAL_INFORMATION ValueInfo;
UNICODE_STRING ValueName;
NTSTATUS Status;
- DWORD dwError = ERROR_SUCCESS;
+ LONG ErrorCode = ERROR_SUCCESS;
ULONG BufferSize;
ULONG ResultSize;
HKEY KeyHandle;
DPRINT("hKey 0x%X lpValueName %S lpData 0x%X lpcbData %d\n",
- hKey, lpValueName, lpData, lpcbData ? *lpcbData : 0);
- Status = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(Status)) {
- dwError = RtlNtStatusToDosError(Status);
- SetLastError(dwError);
- return(dwError);
- }
- if ((lpData) && (!lpcbData)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- return ERROR_INVALID_PARAMETER;
- }
- RtlInitUnicodeString (&ValueName, lpValueName);
+ hKey, lpValueName, lpData, lpcbData ? *lpcbData : 0);
+
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ if (lpData != NULL && lpcbData == NULL)
+ {
+ SetLastError (ERROR_INVALID_PARAMETER);
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ RtlInitUnicodeString (&ValueName,
+ lpValueName);
BufferSize = sizeof (KEY_VALUE_PARTIAL_INFORMATION) + *lpcbData;
- ValueInfo = RtlAllocateHeap (RtlGetProcessHeap(),
- 0,
- BufferSize);
- if (ValueInfo == NULL) {
- SetLastError(ERROR_OUTOFMEMORY);
- return ERROR_OUTOFMEMORY;
- }
+ ValueInfo = RtlAllocateHeap (ProcessHeap,
+ 0,
+ BufferSize);
+ if (ValueInfo == NULL)
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return ERROR_OUTOFMEMORY;
+ }
+
Status = NtQueryValueKey (hKey,
- &ValueName,
- KeyValuePartialInformation,
- ValueInfo,
- BufferSize,
- &ResultSize);
+ &ValueName,
+ KeyValuePartialInformation,
+ ValueInfo,
+ BufferSize,
+ &ResultSize);
DPRINT("Status 0x%X\n", Status);
- if (Status == STATUS_BUFFER_TOO_SMALL) {
- /* Return ERROR_SUCCESS and the buffer space needed for a successful call */
- dwError = ERROR_SUCCESS;
- }
- else if (!NT_SUCCESS(Status)) {
- dwError = RtlNtStatusToDosError(Status);
- SetLastError(dwError);
- }
- else {
- if (lpType) {
- *lpType = ValueInfo->Type;
+ if (Status == STATUS_BUFFER_TOO_SMALL)
+ {
+ /* Return ERROR_SUCCESS and the buffer space needed for a successful call */
+ ErrorCode = ERROR_SUCCESS;
}
- RtlMoveMemory(lpData, ValueInfo->Data, ValueInfo->DataLength);
- if ((ValueInfo->Type == REG_SZ) ||
- (ValueInfo->Type == REG_MULTI_SZ) ||
- (ValueInfo->Type == REG_EXPAND_SZ)) {
- ((PWSTR)lpData)[ValueInfo->DataLength / sizeof(WCHAR)] = 0;
+ else if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ }
+ else
+ {
+ if (lpType != NULL)
+ {
+ *lpType = ValueInfo->Type;
+ }
+ RtlMoveMemory (lpData,
+ ValueInfo->Data,
+ ValueInfo->DataLength);
+ if ((ValueInfo->Type == REG_SZ) ||
+ (ValueInfo->Type == REG_MULTI_SZ) ||
+ (ValueInfo->Type == REG_EXPAND_SZ))
+ {
+ ((PWSTR)lpData)[ValueInfo->DataLength / sizeof(WCHAR)] = 0;
+ }
}
- }
DPRINT("Type %d Size %d\n", ValueInfo->Type, ValueInfo->DataLength);
- if (NULL != lpcbData) {
- *lpcbData = (DWORD)ValueInfo->DataLength;
- }
- RtlFreeHeap(RtlGetProcessHeap(), 0, ValueInfo);
- return dwError;
+
+ if (NULL != lpcbData)
+ {
+ *lpcbData = (DWORD)ValueInfo->DataLength;
+ }
+ RtlFreeHeap (ProcessHeap,
+ 0,
+ ValueInfo);
+
+ return ErrorCode;
}
/************************************************************************
* RegQueryValueExA
+ *
+ * @unimplemented
*/
LONG
STDCALL
if (lpData) {
ValueData.MaximumLength = *lpcbData * sizeof(WCHAR);
ValueData.Buffer = RtlAllocateHeap(
- RtlGetProcessHeap(),
+ ProcessHeap,
0,
ValueData.MaximumLength);
if (!ValueData.Buffer) {
*lpcbData = ResultSize;
}
if (ValueData.Buffer) {
- RtlFreeHeap(RtlGetProcessHeap(), 0, ValueData.Buffer);
+ RtlFreeHeap(ProcessHeap, 0, ValueData.Buffer);
}
return ErrorCode;
}
/************************************************************************
- * RegQueryValueW
+ * RegQueryValueA
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegQueryValueW(
- HKEY hKey,
- LPCWSTR lpSubKey,
- LPWSTR lpValue,
- PLONG lpcbValue)
+LONG STDCALL
+RegQueryValueA (HKEY hKey,
+ LPCSTR lpSubKey,
+ LPSTR lpValue,
+ PLONG lpcbValue)
{
- NTSTATUS errCode;
- UNICODE_STRING SubKeyString;
- OBJECT_ATTRIBUTES ObjectAttributes;
- HKEY KeyHandle;
- HANDLE RealKey;
- LONG ErrorCode;
- BOOL CloseRealKey;
-
- errCode = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(errCode)) {
- ErrorCode = RtlNtStatusToDosError(errCode);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
- if ((lpSubKey) && (wcslen(lpSubKey) != 0)) {
- RtlInitUnicodeString(&SubKeyString, (LPWSTR)lpSubKey);
- InitializeObjectAttributes(&ObjectAttributes,
- &SubKeyString,
- OBJ_CASE_INSENSITIVE,
- KeyHandle,
- NULL);
- errCode = NtOpenKey(
- &RealKey,
- KEY_ALL_ACCESS,
- & ObjectAttributes);
- if (!NT_SUCCESS(errCode)) {
- ErrorCode = RtlNtStatusToDosError(errCode);
- SetLastError(ErrorCode);
- return ErrorCode;
+ WCHAR SubKeyNameBuffer[MAX_PATH+1];
+ UNICODE_STRING SubKeyName;
+ UNICODE_STRING Value;
+ ANSI_STRING AnsiString;
+ LONG ValueSize;
+ LONG ErrorCode;
+
+ if (lpValue != NULL &&
+ lpcbValue == NULL)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return ERROR_INVALID_PARAMETER;
}
- CloseRealKey = TRUE;
- } else {
- RealKey = hKey;
- CloseRealKey = FALSE;
- }
- ErrorCode = RegQueryValueExW(
- RealKey,
- NULL,
- NULL,
- NULL,
- (LPBYTE)lpValue,
- (LPDWORD)lpcbValue);
- if (CloseRealKey) {
- NtClose(RealKey);
- }
+
+ RtlInitUnicodeString (&SubKeyName,
+ NULL);
+ RtlInitUnicodeString (&Value,
+ NULL);
+ if (lpSubKey != NULL &&
+ strlen(lpSubKey) != 0)
+ {
+ RtlInitAnsiString (&AnsiString,
+ (LPSTR)lpSubKey);
+ SubKeyName.Buffer = &SubKeyNameBuffer[0];
+ SubKeyName.MaximumLength = sizeof(SubKeyNameBuffer);
+ RtlAnsiStringToUnicodeString (&SubKeyName,
+ &AnsiString,
+ FALSE);
+ }
+
+ if (lpValue != NULL)
+ {
+ ValueSize = *lpcbValue * sizeof(WCHAR);
+ Value.MaximumLength = ValueSize;
+ Value.Buffer = RtlAllocateHeap (ProcessHeap,
+ 0,
+ ValueSize);
+ if (Value.Buffer == NULL)
+ {
+ SetLastError(ERROR_OUTOFMEMORY);
+ return ERROR_OUTOFMEMORY;
+ }
+ }
+ else
+ {
+ ValueSize = 0;
+ }
+
+ ErrorCode = RegQueryValueW (hKey,
+ (LPCWSTR)SubKeyName.Buffer,
+ Value.Buffer,
+ &ValueSize);
+ if (ErrorCode == ERROR_SUCCESS)
+ {
+ Value.Length = ValueSize;
+ RtlInitAnsiString (&AnsiString,
+ NULL);
+ AnsiString.Buffer = lpValue;
+ AnsiString.MaximumLength = *lpcbValue;
+ RtlUnicodeStringToAnsiString (&AnsiString,
+ &Value,
+ FALSE);
+ }
+
+ *lpcbValue = ValueSize;
+ if (Value.Buffer != NULL)
+ {
+ RtlFreeHeap (ProcessHeap,
+ 0,
+ Value.Buffer);
+ }
+
return ErrorCode;
}
/************************************************************************
- * RegQueryValueA
+ * RegQueryValueW
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegQueryValueA(
- HKEY hKey,
- LPCSTR lpSubKey,
- LPSTR lpValue,
- PLONG lpcbValue)
+LONG STDCALL
+RegQueryValueW (HKEY hKey,
+ LPCWSTR lpSubKey,
+ LPWSTR lpValue,
+ PLONG lpcbValue)
{
- WCHAR SubKeyNameBuffer[MAX_PATH+1];
- UNICODE_STRING SubKeyName;
- UNICODE_STRING Value;
- ANSI_STRING AnsiString;
- LONG ValueSize;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING SubKeyString;
+ HKEY KeyHandle;
+ HANDLE RealKey;
LONG ErrorCode;
+ BOOL CloseRealKey;
+ NTSTATUS Status;
- if ((lpValue) && (!lpcbValue)) {
- SetLastError(ERROR_INVALID_PARAMETER);
- return ERROR_INVALID_PARAMETER;
- }
- RtlInitUnicodeString(&SubKeyName, NULL);
- RtlInitUnicodeString(&Value, NULL);
- if ((lpSubKey) && (strlen(lpSubKey) != 0)) {
- RtlInitAnsiString(&AnsiString, (LPSTR)lpSubKey);
- SubKeyName.Buffer = &SubKeyNameBuffer[0];
- SubKeyName.MaximumLength = sizeof(SubKeyNameBuffer);
- RtlAnsiStringToUnicodeString(&SubKeyName, &AnsiString, FALSE);
- }
- if (lpValue) {
- ValueSize = *lpcbValue * sizeof(WCHAR);
- Value.MaximumLength = ValueSize;
- Value.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, ValueSize);
- if (!Value.Buffer) {
- SetLastError(ERROR_OUTOFMEMORY);
- return ERROR_OUTOFMEMORY;
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
}
- } else {
- ValueSize = 0;
- }
- ErrorCode = RegQueryValueW(
- hKey,
- (LPCWSTR)SubKeyName.Buffer,
- Value.Buffer,
- &ValueSize);
- if (ErrorCode == ERROR_SUCCESS) {
- Value.Length = ValueSize;
- RtlInitAnsiString(&AnsiString, NULL);
- AnsiString.Buffer = lpValue;
- AnsiString.MaximumLength = *lpcbValue;
- RtlUnicodeStringToAnsiString(&AnsiString, &Value, FALSE);
- }
- *lpcbValue = ValueSize;
- if (Value.Buffer) {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Value.Buffer);
- }
+
+ if (lpSubKey != NULL &&
+ wcslen(lpSubKey) != 0)
+ {
+ RtlInitUnicodeString (&SubKeyString,
+ (LPWSTR)lpSubKey);
+ InitializeObjectAttributes (&ObjectAttributes,
+ &SubKeyString,
+ OBJ_CASE_INSENSITIVE,
+ KeyHandle,
+ NULL);
+ Status = NtOpenKey (&RealKey,
+ KEY_ALL_ACCESS,
+ &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+ CloseRealKey = TRUE;
+ }
+ else
+ {
+ RealKey = hKey;
+ CloseRealKey = FALSE;
+ }
+
+ ErrorCode = RegQueryValueExW (RealKey,
+ NULL,
+ NULL,
+ NULL,
+ (LPBYTE)lpValue,
+ (LPDWORD)lpcbValue);
+ if (CloseRealKey)
+ {
+ NtClose (RealKey);
+ }
+
return ErrorCode;
}
/************************************************************************
* RegReplaceKeyA
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegReplaceKeyA(
- HKEY hKey,
- LPCSTR lpSubKey,
- LPCSTR lpNewFile,
- LPCSTR lpOldFile)
+LONG STDCALL
+RegReplaceKeyA (HKEY hKey,
+ LPCSTR lpSubKey,
+ LPCSTR lpNewFile,
+ LPCSTR lpOldFile)
{
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return ERROR_CALL_NOT_IMPLEMENTED;
+ UNICODE_STRING lpSubKeyW;
+ UNICODE_STRING lpNewFileW;
+ UNICODE_STRING lpOldFileW;
+ LONG ret;
+
+ RtlCreateUnicodeStringFromAsciiz( &lpSubKeyW, (PCSZ)lpSubKey );
+ RtlCreateUnicodeStringFromAsciiz( &lpOldFileW, (PCSZ)lpOldFile );
+ RtlCreateUnicodeStringFromAsciiz( &lpNewFileW, (PCSZ)lpNewFile );
+ ret = RegReplaceKeyW( hKey, lpSubKeyW.Buffer, lpNewFileW.Buffer, lpOldFileW.Buffer );
+ RtlFreeUnicodeString( &lpOldFileW );
+ RtlFreeUnicodeString( &lpNewFileW );
+ RtlFreeUnicodeString( &lpSubKeyW );
+ return ret;
}
/************************************************************************
* RegReplaceKeyW
+ *
+ * @unimplemented
*/
-LONG
-STDCALL
-RegReplaceKeyW(
- HKEY hKey,
- LPCWSTR lpSubKey,
- LPCWSTR lpNewFile,
- LPCWSTR lpOldFile)
+LONG STDCALL
+RegReplaceKeyW (HKEY hKey,
+ LPCWSTR lpSubKey,
+ LPCWSTR lpNewFile,
+ LPCWSTR lpOldFile)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
/************************************************************************
* RegRestoreKeyA
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegRestoreKeyA(
- HKEY hKey,
- LPCSTR lpFile,
- DWORD dwFlags)
+LONG STDCALL
+RegRestoreKeyA (HKEY hKey,
+ LPCSTR lpFile,
+ DWORD dwFlags)
{
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return ERROR_CALL_NOT_IMPLEMENTED;
+ UNICODE_STRING lpFileW;
+ LONG ret;
+
+ RtlCreateUnicodeStringFromAsciiz( &lpFileW, (PCSZ)lpFile );
+ ret = RegRestoreKeyW( hKey, lpFileW.Buffer, dwFlags );
+ RtlFreeUnicodeString( &lpFileW );
+ return ret;
}
/************************************************************************
* RegRestoreKeyW
+ *
+ * @unimplemented
*/
-LONG
-STDCALL
-RegRestoreKeyW(
- HKEY hKey,
- LPCWSTR lpFile,
- DWORD dwFlags)
+LONG STDCALL
+RegRestoreKeyW (HKEY hKey,
+ LPCWSTR lpFile,
+ DWORD dwFlags)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
/************************************************************************
* RegSaveKeyA
+ *
+ * @implemented
*/
LONG STDCALL
RegSaveKeyA(HKEY hKey,
UNICODE_STRING FileName;
LONG ErrorCode;
- RtlCreateUnicodeStringFromAsciiz(&FileName, (LPSTR)lpFile);
- ErrorCode = RegSaveKeyW(hKey, FileName.Buffer, lpSecurityAttributes);
- RtlFreeUnicodeString(&FileName);
- return(ErrorCode);
+ RtlCreateUnicodeStringFromAsciiz (&FileName,
+ (LPSTR)lpFile);
+ ErrorCode = RegSaveKeyW (hKey,
+ FileName.Buffer,
+ lpSecurityAttributes);
+ RtlFreeUnicodeString (&FileName);
+
+ return ErrorCode;
}
/************************************************************************
* RegSaveKeyW
+ *
+ * @implemented
*/
LONG STDCALL
-RegSaveKeyW(HKEY hKey,
- LPCWSTR lpFile,
- LPSECURITY_ATTRIBUTES lpSecurityAttributes)
+RegSaveKeyW (HKEY hKey,
+ LPCWSTR lpFile,
+ LPSECURITY_ATTRIBUTES lpSecurityAttributes)
{
PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
OBJECT_ATTRIBUTES ObjectAttributes;
hKey);
if (!NT_SUCCESS(Status))
{
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
}
if (!RtlDosPathNameToNtPathName_U ((LPWSTR)lpFile,
NULL,
NULL))
{
- SetLastError(ERROR_INVALID_PARAMETER);
- return(ERROR_INVALID_PARAMETER);
+ SetLastError (ERROR_INVALID_PARAMETER);
+ return ERROR_INVALID_PARAMETER;
}
if (lpSecurityAttributes != NULL)
FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
- RtlFreeUnicodeString(&NtName);
+ RtlFreeUnicodeString (&NtName);
if (!NT_SUCCESS(Status))
{
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
}
- Status = NtSaveKey(KeyHandle,
- FileHandle);
- NtClose(FileHandle);
+ Status = NtSaveKey (KeyHandle,
+ FileHandle);
+ NtClose (FileHandle);
if (!NT_SUCCESS(Status))
{
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return(ErrorCode);
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
}
- return(ERROR_SUCCESS);
+ return ERROR_SUCCESS;
}
/************************************************************************
* RegSetKeySecurity
+ *
+ * @implemented
*/
LONG STDCALL
-RegSetKeySecurity(HKEY hKey,
- SECURITY_INFORMATION SecurityInformation,
- PSECURITY_DESCRIPTOR pSecurityDescriptor)
-{
- UNIMPLEMENTED;
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return ERROR_CALL_NOT_IMPLEMENTED;
-}
-
-
-/************************************************************************
- * RegSetValueExW
- */
-LONG
-STDCALL
-RegSetValueExW(
- HKEY hKey,
- LPCWSTR lpValueName,
- DWORD Reserved,
- DWORD dwType,
- CONST BYTE* lpData,
- DWORD cbData)
+RegSetKeySecurity (HKEY hKey,
+ SECURITY_INFORMATION SecurityInformation,
+ PSECURITY_DESCRIPTOR pSecurityDescriptor)
{
- UNICODE_STRING ValueName;
- PUNICODE_STRING pValueName;
HKEY KeyHandle;
NTSTATUS Status;
LONG ErrorCode;
- Status = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(Status)) {
- ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError(ErrorCode);
- return ErrorCode;
- }
- if (lpValueName) {
- RtlInitUnicodeString(&ValueName, lpValueName);
- pValueName = &ValueName;
- } else {
- pValueName = NULL;
- }
- Status = NtSetValueKey(
- KeyHandle,
- pValueName,
- 0,
- dwType,
- (PVOID)lpData,
- (ULONG)cbData);
- if (!NT_SUCCESS(Status)) {
- LONG ErrorCode = RtlNtStatusToDosError(Status);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
+ if (hKey == HKEY_PERFORMANCE_DATA)
+ return ERROR_INVALID_HANDLE;
+
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ Status = NtSetSecurityObject (KeyHandle,
+ SecurityInformation,
+ pSecurityDescriptor);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
return ERROR_SUCCESS;
}
/************************************************************************
* RegSetValueExA
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegSetValueExA(
- HKEY hKey,
- LPCSTR lpValueName,
- DWORD Reserved,
- DWORD dwType,
- CONST BYTE* lpData,
- DWORD cbData)
+LONG STDCALL
+RegSetValueExA (HKEY hKey,
+ LPCSTR lpValueName,
+ DWORD Reserved,
+ DWORD dwType,
+ CONST BYTE* lpData,
+ DWORD cbData)
{
UNICODE_STRING ValueName;
LPWSTR pValueName;
LPBYTE pData;
DWORD DataSize;
- if (!lpData) {
- SetLastError(ERROR_INVALID_PARAMETER);
- return ERROR_INVALID_PARAMETER;
- }
- if ((lpValueName) && (strlen(lpValueName) != 0)) {
- RtlCreateUnicodeStringFromAsciiz(&ValueName, (LPSTR)lpValueName);
- pValueName = (LPWSTR)ValueName.Buffer;
- } else {
- pValueName = NULL;
- }
- if ((dwType == REG_SZ) || (dwType == REG_MULTI_SZ) || (dwType == REG_EXPAND_SZ)) {
- RtlInitAnsiString(&AnsiString, NULL);
- AnsiString.Buffer = (LPSTR)lpData;
- AnsiString.Length = cbData;
- AnsiString.MaximumLength = cbData;
- RtlAnsiStringToUnicodeString(&Data, &AnsiString, TRUE);
- pData = (LPBYTE)Data.Buffer;
- DataSize = cbData * sizeof(WCHAR);
- } else {
- RtlInitUnicodeString(&Data, NULL);
- pData = (LPBYTE)lpData;
- DataSize = cbData;
- }
- ErrorCode = RegSetValueExW(
- hKey,
- pValueName,
- Reserved,
- dwType,
- pData,
- DataSize);
- if (pValueName) {
- RtlFreeHeap(RtlGetProcessHeap(), 0, ValueName.Buffer);
- }
- if (Data.Buffer) {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Data.Buffer);
- }
+ if (lpData == NULL)
+ {
+ SetLastError (ERROR_INVALID_PARAMETER);
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ if (lpValueName != NULL &&
+ strlen(lpValueName) != 0)
+ {
+ RtlCreateUnicodeStringFromAsciiz (&ValueName,
+ (LPSTR)lpValueName);
+ pValueName = (LPWSTR)ValueName.Buffer;
+ }
+ else
+ {
+ pValueName = NULL;
+ }
+
+ if ((dwType == REG_SZ) ||
+ (dwType == REG_MULTI_SZ) ||
+ (dwType == REG_EXPAND_SZ))
+ {
+ RtlInitAnsiString (&AnsiString,
+ NULL);
+ AnsiString.Buffer = (LPSTR)lpData;
+ AnsiString.Length = cbData;
+ AnsiString.MaximumLength = cbData;
+ RtlAnsiStringToUnicodeString (&Data,
+ &AnsiString,
+ TRUE);
+ pData = (LPBYTE)Data.Buffer;
+ DataSize = cbData * sizeof(WCHAR);
+ }
+ else
+ {
+ RtlInitUnicodeString (&Data,
+ NULL);
+ pData = (LPBYTE)lpData;
+ DataSize = cbData;
+ }
+
+ ErrorCode = RegSetValueExW (hKey,
+ pValueName,
+ Reserved,
+ dwType,
+ pData,
+ DataSize);
+ if (pValueName != NULL)
+ {
+ RtlFreeHeap (ProcessHeap,
+ 0,
+ ValueName.Buffer);
+ }
+
+ if (Data.Buffer != NULL)
+ {
+ RtlFreeHeap (ProcessHeap,
+ 0,
+ Data.Buffer);
+ }
+
return ErrorCode;
}
/************************************************************************
- * RegSetValueW
+ * RegSetValueExW
+ *
+ * @implemented
*/
-LONG
-STDCALL
-RegSetValueW(
- HKEY hKey,
- LPCWSTR lpSubKey,
- DWORD dwType,
- LPCWSTR lpData,
- DWORD cbData)
+LONG STDCALL
+RegSetValueExW (HKEY hKey,
+ LPCWSTR lpValueName,
+ DWORD Reserved,
+ DWORD dwType,
+ CONST BYTE* lpData,
+ DWORD cbData)
{
- NTSTATUS errCode;
- UNICODE_STRING SubKeyString;
- OBJECT_ATTRIBUTES ObjectAttributes;
- HKEY KeyHandle;
- HANDLE RealKey;
- LONG ErrorCode;
- BOOL CloseRealKey;
-
- errCode = MapDefaultKey(&KeyHandle, hKey);
- if (!NT_SUCCESS(errCode)) {
- ErrorCode = RtlNtStatusToDosError(errCode);
- SetLastError (ErrorCode);
- return ErrorCode;
- }
- if ((lpSubKey) && (wcslen(lpSubKey) != 0)) {
- RtlInitUnicodeString(&SubKeyString, (LPWSTR)lpSubKey);
- InitializeObjectAttributes(&ObjectAttributes,
- &SubKeyString,
- OBJ_CASE_INSENSITIVE,
- KeyHandle,
- NULL);
- errCode = NtOpenKey(&RealKey, KEY_ALL_ACCESS, &ObjectAttributes);
- if (!NT_SUCCESS(errCode)) {
- ErrorCode = RtlNtStatusToDosError(errCode);
- SetLastError(ErrorCode);
+ UNICODE_STRING ValueName;
+ PUNICODE_STRING pValueName;
+ HKEY KeyHandle;
+ NTSTATUS Status;
+ LONG ErrorCode;
+
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
return ErrorCode;
}
- CloseRealKey = TRUE;
- } else {
- RealKey = hKey;
- CloseRealKey = FALSE;
- }
- ErrorCode = RegSetValueExW(
- RealKey,
- NULL,
- 0,
- dwType,
- (LPBYTE)lpData,
- cbData);
- if (CloseRealKey) {
- NtClose(RealKey);
- }
- return ErrorCode;
+
+ if (lpValueName != NULL)
+ {
+ RtlInitUnicodeString (&ValueName,
+ lpValueName);
+ pValueName = &ValueName;
+ }
+ else
+ {
+ pValueName = NULL;
+ }
+
+ Status = NtSetValueKey (KeyHandle,
+ pValueName,
+ 0,
+ dwType,
+ (PVOID)lpData,
+ (ULONG)cbData);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ return ERROR_SUCCESS;
}
/************************************************************************
* RegSetValueA
+ *
+ * @implemented
*/
LONG STDCALL
-RegSetValueA(HKEY hKey,
- LPCSTR lpSubKey,
- DWORD dwType,
- LPCSTR lpData,
- DWORD cbData)
+RegSetValueA (HKEY hKey,
+ LPCSTR lpSubKey,
+ DWORD dwType,
+ LPCSTR lpData,
+ DWORD cbData)
{
WCHAR SubKeyNameBuffer[MAX_PATH+1];
UNICODE_STRING SubKeyName;
LONG DataSize;
LONG ErrorCode;
- if (!lpData) {
- SetLastError(ERROR_INVALID_PARAMETER);
- return ERROR_INVALID_PARAMETER;
- }
- RtlInitUnicodeString(&SubKeyName, NULL);
- RtlInitUnicodeString(&Data, NULL);
- if ((lpSubKey) && (strlen(lpSubKey) != 0)) {
- RtlInitAnsiString(&AnsiString, (LPSTR)lpSubKey);
- SubKeyName.Buffer = &SubKeyNameBuffer[0];
- SubKeyName.MaximumLength = sizeof(SubKeyNameBuffer);
- RtlAnsiStringToUnicodeString(&SubKeyName, &AnsiString, FALSE);
- }
+ if (lpData == NULL)
+ {
+ SetLastError (ERROR_INVALID_PARAMETER);
+ return ERROR_INVALID_PARAMETER;
+ }
+
+ 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(RtlGetProcessHeap(), 0, DataSize);
- if (!Data.Buffer) {
- SetLastError(ERROR_OUTOFMEMORY);
- return ERROR_OUTOFMEMORY;
- }
- ErrorCode = RegSetValueW(
- hKey,
- (LPCWSTR)SubKeyName.Buffer,
- dwType,
- Data.Buffer,
- DataSize);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Data.Buffer);
+ 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;
+}
+
+
+/************************************************************************
+ * RegSetValueW
+ *
+ * @implemented
+ */
+LONG STDCALL
+RegSetValueW (HKEY hKey,
+ LPCWSTR lpSubKey,
+ DWORD dwType,
+ LPCWSTR lpData,
+ DWORD cbData)
+{
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING SubKeyString;
+ HKEY KeyHandle;
+ HANDLE RealKey;
+ LONG ErrorCode;
+ BOOL CloseRealKey;
+ NTSTATUS Status;
+
+ Status = MapDefaultKey (&KeyHandle,
+ hKey);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+
+ if ((lpSubKey) && (wcslen(lpSubKey) != 0))
+ {
+ RtlInitUnicodeString (&SubKeyString,
+ (LPWSTR)lpSubKey);
+ InitializeObjectAttributes (&ObjectAttributes,
+ &SubKeyString,
+ OBJ_CASE_INSENSITIVE,
+ KeyHandle,
+ NULL);
+ Status = NtOpenKey (&RealKey,
+ KEY_ALL_ACCESS,
+ &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ ErrorCode = RtlNtStatusToDosError (Status);
+ SetLastError (ErrorCode);
+ return ErrorCode;
+ }
+ CloseRealKey = TRUE;
+ }
+ else
+ {
+ RealKey = hKey;
+ CloseRealKey = FALSE;
+ }
+
+ ErrorCode = RegSetValueExW (RealKey,
+ NULL,
+ 0,
+ dwType,
+ (LPBYTE)lpData,
+ cbData);
+ if (CloseRealKey == TRUE)
+ {
+ NtClose (RealKey);
+ }
+
return ErrorCode;
}
/************************************************************************
* RegUnLoadKeyA
+ *
+ * @implemented
*/
LONG STDCALL
RegUnLoadKeyA (HKEY hKey,
/************************************************************************
* RegUnLoadKeyW
+ *
+ * @implemented
*/
LONG STDCALL
RegUnLoadKeyW (HKEY hKey,