Implemented RegSaveKey[A/W]().

Added missing calls to MapDefaultKey().

svn path=/trunk/; revision=2228
This commit is contained in:
Eric Kohl 2001-09-03 23:11:59 +00:00
parent 63d1ecea6e
commit 0cb3991a23

View file

@ -1,4 +1,4 @@
/* $Id: reg.c,v 1.13 2001/09/01 15:36:43 chorns Exp $ /* $Id: reg.c,v 1.14 2001/09/03 23:11:59 ekohl Exp $
* *
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries * PROJECT: ReactOS system libraries
@ -1043,6 +1043,15 @@ RegEnumValueW(
DWORD dwError = ERROR_SUCCESS; DWORD dwError = ERROR_SUCCESS;
ULONG BufferSize; ULONG BufferSize;
ULONG ResultSize; ULONG ResultSize;
HANDLE KeyHandle;
Status = MapDefaultKey(&KeyHandle, hKey);
if (!NT_SUCCESS(Status))
{
dwError = RtlNtStatusToDosError(Status);
SetLastError(dwError);
return(dwError);
}
BufferSize = sizeof (KEY_VALUE_FULL_INFORMATION) + BufferSize = sizeof (KEY_VALUE_FULL_INFORMATION) +
*lpcbValueName * sizeof(WCHAR); *lpcbValueName * sizeof(WCHAR);
@ -1065,7 +1074,7 @@ RegEnumValueW(
} }
Status = NtEnumerateValueKey( Status = NtEnumerateValueKey(
hKey, KeyHandle,
(ULONG)dwIndex, (ULONG)dwIndex,
KeyValueFullInformation, KeyValueFullInformation,
ValueInfo, ValueInfo,
@ -1865,10 +1874,19 @@ RegQueryValueExW(
DWORD dwError = ERROR_SUCCESS; DWORD dwError = ERROR_SUCCESS;
ULONG BufferSize; ULONG BufferSize;
ULONG ResultSize; ULONG ResultSize;
HANDLE KeyHandle;
DPRINT("hKey 0x%X lpValueName %S lpData 0x%X lpcbData %d\n", DPRINT("hKey 0x%X lpValueName %S lpData 0x%X lpcbData %d\n",
hKey, lpValueName, lpData, lpcbData ? *lpcbData : 0); hKey, lpValueName, lpData, lpcbData ? *lpcbData : 0);
Status = MapDefaultKey(&KeyHandle, hKey);
if (!NT_SUCCESS(Status))
{
dwError = RtlNtStatusToDosError(Status);
SetLastError(dwError);
return(dwError);
}
if ((lpData) && (!lpcbData)) if ((lpData) && (!lpcbData))
{ {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
@ -2082,34 +2100,99 @@ RegRestoreKeyW(
/************************************************************************ /************************************************************************
* RegSaveKeyA * RegSaveKeyA
*/ */
LONG LONG STDCALL
STDCALL RegSaveKeyA(HKEY hKey,
RegSaveKeyA(
HKEY hKey,
LPCSTR lpFile, LPCSTR lpFile,
LPSECURITY_ATTRIBUTES lpSecurityAttributes LPSECURITY_ATTRIBUTES lpSecurityAttributes)
)
{ {
UNIMPLEMENTED; UNICODE_STRING FileName;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); LONG ErrorCode;
return ERROR_CALL_NOT_IMPLEMENTED;
RtlCreateUnicodeStringFromAsciiz(&FileName,
(LPSTR)lpFile);
ErrorCode = RegSaveKeyW(hKey,
FileName.Buffer,
lpSecurityAttributes);
RtlFreeUnicodeString(&FileName);
return(ErrorCode);
} }
/************************************************************************ /************************************************************************
* RegSaveKeyW * RegSaveKeyW
*/ */
LONG LONG STDCALL
STDCALL RegSaveKeyW(HKEY hKey,
RegSaveKeyW(
HKEY hKey,
LPCWSTR lpFile, LPCWSTR lpFile,
LPSECURITY_ATTRIBUTES lpSecurityAttributes LPSECURITY_ATTRIBUTES lpSecurityAttributes)
)
{ {
UNIMPLEMENTED; PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); OBJECT_ATTRIBUTES ObjectAttributes;
return ERROR_CALL_NOT_IMPLEMENTED; UNICODE_STRING NtName;
IO_STATUS_BLOCK IoStatusBlock;
HANDLE FileHandle;
HANDLE KeyHandle;
NTSTATUS Status;
LONG ErrorCode;
Status = MapDefaultKey(&KeyHandle,
hKey);
if (!NT_SUCCESS(Status))
{
ErrorCode = RtlNtStatusToDosError(Status);
SetLastError(ErrorCode);
return(ErrorCode);
}
if (!RtlDosPathNameToNtPathName_U((LPWSTR)lpFile,
&NtName,
NULL,
NULL))
{
SetLastError(ERROR_INVALID_PARAMETER);
return(ERROR_INVALID_PARAMETER);
}
if (lpSecurityAttributes != NULL)
SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
InitializeObjectAttributes(&ObjectAttributes,
&NtName,
OBJ_CASE_INSENSITIVE,
NULL,
SecurityDescriptor);
Status = NtCreateFile(&FileHandle,
GENERIC_WRITE | SYNCHRONIZE,
&ObjectAttributes,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_CREATE,
FILE_OPEN_FOR_BACKUP_INTENT | FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0);
RtlFreeUnicodeString(&NtName);
if (!NT_SUCCESS(Status))
{
ErrorCode = RtlNtStatusToDosError(Status);
SetLastError(ErrorCode);
return(ErrorCode);
}
Status = NtSaveKey(KeyHandle,
FileHandle);
NtClose(FileHandle);
if (!NT_SUCCESS(Status))
{
ErrorCode = RtlNtStatusToDosError(Status);
SetLastError(ErrorCode);
return(ErrorCode);
}
return(ERROR_SUCCESS);
} }