reg.c
来自「一个类似windows」· C语言 代码 · 共 2,371 行 · 第 1/5 页
C
2,371 行
DELETE | KEY_ENUMERATE_SUB_KEYS,
&ObjectAttributes);
if (!NT_SUCCESS(Status2))
{
goto SubKeyFailure;
}
/* enqueue this key to the head of the deletion queue */
InsertHeadList(&delQueueHead,
&newDelKeys->ListEntry);
/* try again from the head of the list */
continue;
}
else
{
if (Status2 == STATUS_BUFFER_TOO_SMALL)
{
newDelKeys = RtlAllocateHeap(ProcessHeap,
0,
BufferSize + sizeof(REGP_DEL_KEYS));
if (newDelKeys != NULL)
{
BasicInfo = (PKEY_BASIC_INFORMATION)(newDelKeys + 1);
/* try again */
goto ReadFirstSubKey;
}
else
{
/* don't break, let's try to delete as many keys as possible */
Status2 = STATUS_INSUFFICIENT_RESOURCES;
goto SubKeyFailureNoFree;
}
}
else if (Status2 == STATUS_BUFFER_OVERFLOW)
{
PREG_DEL_KEYS newDelKeys2;
ASSERT(newDelKeys != NULL);
/* we need more memory to query the key name */
newDelKeys2 = RtlReAllocateHeap(ProcessHeap,
0,
newDelKeys,
BufferSize + sizeof(REGP_DEL_KEYS));
if (newDelKeys2 != NULL)
{
newDelKeys = newDelKeys2;
BasicInfo = (PKEY_BASIC_INFORMATION)(newDelKeys + 1);
/* try again */
goto ReadFirstSubKey;
}
else
{
/* don't break, let's try to delete as many keys as possible */
Status2 = STATUS_INSUFFICIENT_RESOURCES;
}
}
else if (Status2 == STATUS_NO_MORE_ENTRIES)
{
/* in some race conditions where another thread would delete
the same tree at the same time, newDelKeys could actually
be != NULL! */
if (newDelKeys != NULL)
{
RtlFreeHeap(ProcessHeap,
0,
newDelKeys);
}
break;
}
SubKeyFailure:
/* newDelKeys can be NULL here when NtEnumerateKey returned an
error other than STATUS_BUFFER_TOO_SMALL or STATUS_BUFFER_OVERFLOW! */
if (newDelKeys != NULL)
{
RtlFreeHeap(ProcessHeap,
0,
newDelKeys);
}
SubKeyFailureNoFree:
/* don't break, let's try to delete as many keys as possible */
if (NT_SUCCESS(Status))
{
Status = Status2;
}
}
Status2 = NtDeleteKey(delKeys->KeyHandle);
/* NOTE: do NOT close the handle anymore, it's invalid already! */
if (!NT_SUCCESS(Status2))
{
/* close the key handle so we don't leak handles for keys we were
unable to delete. But only do this for handles not supplied
by the caller! */
if (delKeys->KeyHandle != hKey)
{
NtClose(delKeys->KeyHandle);
}
if (NT_SUCCESS(Status))
{
/* don't break, let's try to delete as many keys as possible */
Status = Status2;
}
}
/* remove the entry from the list */
RemoveEntryList(&delKeys->ListEntry);
RtlFreeHeap(ProcessHeap,
0,
delKeys);
} while (!IsListEmpty(&delQueueHead));
}
else
Status = STATUS_INSUFFICIENT_RESOURCES;
return Status;
}
/************************************************************************
* RegDeleteTreeW
*
* @implemented
*/
LONG STDCALL
RegDeleteTreeW(IN HKEY hKey,
IN LPCWSTR lpSubKey OPTIONAL)
{
HANDLE KeyHandle, CurKey, SubKeyHandle = NULL;
NTSTATUS Status;
Status = MapDefaultKey(&KeyHandle,
hKey);
if (!NT_SUCCESS(Status))
{
return RtlNtStatusToDosError(Status);
}
if (lpSubKey != NULL)
{
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING SubKeyName;
RtlInitUnicodeString(&SubKeyName,
(LPWSTR)lpSubKey);
InitializeObjectAttributes(&ObjectAttributes,
&SubKeyName,
OBJ_CASE_INSENSITIVE,
KeyHandle,
NULL);
Status = NtOpenKey(&SubKeyHandle,
DELETE | KEY_ENUMERATE_SUB_KEYS,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
{
goto Cleanup;
}
CurKey = SubKeyHandle;
}
else
CurKey = KeyHandle;
Status = RegpDeleteTree(CurKey);
if (NT_SUCCESS(Status))
{
/* make sure we only close hKey (KeyHandle) when the caller specified a
subkey, because the handle would be invalid already! */
if (CurKey != KeyHandle)
{
ClosePredefKey(KeyHandle);
}
return ERROR_SUCCESS;
}
else
{
/* make sure we close all handles we created! */
if (SubKeyHandle != NULL)
{
NtClose(SubKeyHandle);
}
Cleanup:
ClosePredefKey(KeyHandle);
return RtlNtStatusToDosError(Status);
}
}
/************************************************************************
* RegDeleteTreeA
*
* @implemented
*/
LONG STDCALL
RegDeleteTreeA(IN HKEY hKey,
IN LPCSTR lpSubKey OPTIONAL)
{
UNICODE_STRING SubKeyName = {0};
LONG Ret;
if (lpSubKey != NULL &&
!RtlCreateUnicodeStringFromAsciiz(&SubKeyName,
(LPSTR)lpSubKey))
{
return ERROR_NOT_ENOUGH_MEMORY;
}
Ret = RegDeleteTreeW(hKey,
SubKeyName.Buffer);
RtlFreeUnicodeString(&SubKeyName);
return Ret;
}
/************************************************************************
* RegDisableReflectionKey
*
* @unimplemented
*/
LONG WINAPI
RegDisableReflectionKey(IN HKEY hBase)
{
DPRINT1("RegDisableReflectionKey(0x%p) UNIMPLEMENTED!\n", hBase);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/************************************************************************
* RegEnableReflectionKey
*
* @unimplemented
*/
LONG WINAPI
RegEnableReflectionKey(IN HKEY hBase)
{
DPRINT1("RegEnableReflectionKey(0x%p) UNIMPLEMENTED!\n", hBase);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/************************************************************************
* RegSetKeyValueW
*
* @implemented
*/
LONG STDCALL
RegSetKeyValueW(IN HKEY hKey,
IN LPCWSTR lpSubKey OPTIONAL,
IN LPCWSTR lpValueName OPTIONAL,
IN DWORD dwType,
IN LPCVOID lpData OPTIONAL,
IN DWORD cbData)
{
HANDLE KeyHandle, CurKey, SubKeyHandle = NULL;
NTSTATUS Status;
LONG Ret;
Status = MapDefaultKey(&KeyHandle,
hKey);
if (!NT_SUCCESS(Status))
{
return RtlNtStatusToDosError(Status);
}
if (lpSubKey != NULL)
{
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING SubKeyName;
RtlInitUnicodeString(&SubKeyName,
(LPWSTR)lpSubKey);
InitializeObjectAttributes(&ObjectAttributes,
&SubKeyName,
OBJ_CASE_INSENSITIVE,
KeyHandle,
NULL);
Status = NtOpenKey(&SubKeyHandle,
KEY_SET_VALUE,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
{
Ret = RtlNtStatusToDosError(Status);
goto Cleanup;
}
CurKey = SubKeyHandle;
}
else
CurKey = KeyHandle;
Ret = RegSetValueExW(CurKey,
lpValueName,
0,
dwType,
lpData,
cbData);
if (SubKeyHandle != NULL)
{
NtClose(SubKeyHandle);
}
Cleanup:
ClosePredefKey(KeyHandle);
return Ret;
}
/************************************************************************
* RegSetKeyValueA
*
* @implemented
*/
LONG STDCALL
RegSetKeyValueA(IN HKEY hKey,
IN LPCSTR lpSubKey OPTIONAL,
IN LPCSTR lpValueName OPTIONAL,
IN DWORD dwType,
IN LPCVOID lpData OPTIONAL,
IN DWORD cbData)
{
HANDLE KeyHandle, CurKey, SubKeyHandle = NULL;
NTSTATUS Status;
LONG Ret;
Status = MapDefaultKey(&KeyHandle,
hKey);
if (!NT_SUCCESS(Status))
{
return RtlNtStatusToDosError(Status);
}
if (lpSubKey != NULL)
{
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING SubKeyName;
if (!RtlCreateUnicodeStringFromAsciiz(&SubKeyName,
(LPSTR)lpSubKey))
{
Ret = ERROR_NOT_ENOUGH_MEMORY;
goto Cleanup;
}
InitializeObjectAttributes(&ObjectAttributes,
&SubKeyName,
OBJ_CASE_INSENSITIVE,
KeyHandle,
NULL);
Status = NtOpenKey(&SubKeyHandle,
KEY_SET_VALUE,
&ObjectAttributes);
RtlFreeUnicodeString(&SubKeyName);
if (!NT_SUCCESS(Status))
{
Ret = RtlNtStatusToDosError(Status);
goto Cleanup;
}
CurKey = SubKeyHandle;
}
else
CurKey = KeyHandle;
Ret = RegSetValueExA(CurKey,
lpValueName,
0,
dwType,
lpData,
cbData);
if (SubKeyHandle != NULL)
{
NtClose(SubKeyHandle);
}
Cleanup:
ClosePredefKey(KeyHandle);
return Ret;
}
/************************************************************************
* RegDeleteValueA
*
* @implemented
*/
LONG STDCALL
RegDeleteValueA (HKEY hKey,
LPCSTR lpValueName)
{
UNICODE_STRING ValueName;
HANDLE KeyHandle;
NTSTATUS Status;
Status = MapDefaultKey (&KeyHandle,
hKey);
if (!NT_SUCCESS(Status))
{
return RtlNtStatusToDosError (Status);
}
RtlCreateUnicodeStringFromAsciiz (&ValueName,
(LPSTR)lpValueName);
Status = NtDeleteValueKey (KeyHandle,
&ValueName);
RtlFreeUnicodeString (&ValueName);
ClosePredefKey(KeyHandle);
if (!NT_SUCCESS(Status))
{
return RtlNtStatusToDosError (Status);
}
return ERROR_SUCCESS;
}
/************************************************************************
* RegDeleteValueW
*
* @implemented
*/
LONG STDCALL
RegDeleteValueW (HKEY hKey,
LPCWSTR lpValueName)
{
UNICODE_STRING ValueName;
NTSTATUS Status;
HANDLE KeyHandle;
Status = MapDefaultKey (&KeyHandle,
hKey);
if (!NT_SUCCESS(Status))
{
return RtlNtStatusToDosError (Status);
}
RtlInitUnicodeString (&ValueName,
(LPWSTR)lpValueName);
Status = NtDeleteValueKey (KeyHandle,
&ValueName);
ClosePredefKey(KeyHandle);
if (!NT_SUCCESS(Status))
{
return RtlNtStatusToDosError (Status);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?