[MKHIVE] Return win32-like error codes for functions that expect to do so. Fix and comment out some unused ERROR_xxx/STATUS_xxx defines.

This commit is contained in:
Hermès Bélusca-Maïto 2018-10-14 17:10:04 +02:00
parent 8f82b00fa6
commit fc35f6eb4b
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
3 changed files with 51 additions and 47 deletions

View file

@ -42,13 +42,13 @@
// We only want to include host headers, so we define them manually // We only want to include host headers, so we define them manually
#define STATUS_SUCCESS ((NTSTATUS)0x00000000) #define STATUS_SUCCESS ((NTSTATUS)0x00000000)
#define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001) #define STATUS_UNSUCCESSFUL ((NTSTATUS)0xC0000001)
#define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002) // #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002)
#define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000D) // #define STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000D)
#define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017) // #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017)
#define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A) // #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A)
#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034) #define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034)
#define STATUS_INVALID_PARAMETER_2 ((NTSTATUS)0xC00000F0) // #define STATUS_INVALID_PARAMETER_2 ((NTSTATUS)0xC00000F0)
#define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005) // #define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005)
unsigned char BitScanForward(ULONG * Index, unsigned long Mask); unsigned char BitScanForward(ULONG * Index, unsigned long Mask);
unsigned char BitScanReverse(ULONG * const Index, unsigned long Mask); unsigned char BitScanReverse(ULONG * const Index, unsigned long Mask);

View file

@ -30,10 +30,7 @@
#define NDEBUG #define NDEBUG
#include "mkhive.h" #include "mkhive.h"
/* DEFINITIONS AND DATA *****************************************************/ /* DATA *********************************************************************/
#define STATUS_NO_LOG_SPACE ((NTSTATUS)0xC000017D)
#define STATUS_CANNOT_DELETE ((NTSTATUS)0xC0000121)
typedef struct _REPARSE_POINT typedef struct _REPARSE_POINT
{ {
@ -396,10 +393,10 @@ RegpCreateOrOpenKey(
IN BOOL Volatile, IN BOOL Volatile,
OUT PHKEY Key) OUT PHKEY Key)
{ {
NTSTATUS Status;
PWSTR LocalKeyName; PWSTR LocalKeyName;
PWSTR End; PWSTR End;
UNICODE_STRING KeyString; UNICODE_STRING KeyString;
NTSTATUS Status;
PREPARSE_POINT CurrentReparsePoint; PREPARSE_POINT CurrentReparsePoint;
PMEMKEY CurrentKey; PMEMKEY CurrentKey;
PCMHIVE ParentRegistryHive; PCMHIVE ParentRegistryHive;
@ -450,7 +447,7 @@ RegpCreateOrOpenKey(
ParentKeyCell = (PCM_KEY_NODE)HvGetCell(&ParentRegistryHive->Hive, ParentCellOffset); ParentKeyCell = (PCM_KEY_NODE)HvGetCell(&ParentRegistryHive->Hive, ParentCellOffset);
if (!ParentKeyCell) if (!ParentKeyCell)
return STATUS_UNSUCCESSFUL; return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
VERIFY_KEY_CELL(ParentKeyCell); VERIFY_KEY_CELL(ParentKeyCell);
@ -484,15 +481,15 @@ RegpCreateOrOpenKey(
} }
else // if (BlockOffset == HCELL_NIL) else // if (BlockOffset == HCELL_NIL)
{ {
Status = STATUS_OBJECT_NAME_NOT_FOUND; // ERROR_PATH_NOT_FOUND; Status = STATUS_OBJECT_NAME_NOT_FOUND;
} }
HvReleaseCell(&ParentRegistryHive->Hive, ParentCellOffset); HvReleaseCell(&ParentRegistryHive->Hive, ParentCellOffset);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
DPRINT("RegpCreateOrOpenKey('%S'): Could not create or open subkey '%wZ'\n", KeyName, &KeyString); DPRINT("RegpCreateOrOpenKey('%S'): Could not create or open subkey '%wZ', Status 0x%08x\n", KeyName, &KeyString, Status);
return ERROR_UNSUCCESSFUL; return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
} }
ParentCellOffset = BlockOffset; ParentCellOffset = BlockOffset;
@ -504,7 +501,7 @@ RegpCreateOrOpenKey(
CurrentKey = CreateInMemoryStructure(ParentRegistryHive, ParentCellOffset); CurrentKey = CreateInMemoryStructure(ParentRegistryHive, ParentCellOffset);
if (!CurrentKey) if (!CurrentKey)
return ERROR_OUTOFMEMORY; return ERROR_NOT_ENOUGH_MEMORY; // STATUS_NO_MEMORY;
*Key = MEMKEY_TO_HKEY(CurrentKey); *Key = MEMKEY_TO_HKEY(CurrentKey);
@ -557,6 +554,7 @@ RegDeleteKeyW(
IN LPCWSTR lpSubKey) IN LPCWSTR lpSubKey)
{ {
LONG rc; LONG rc;
NTSTATUS Status;
HKEY hTargetKey; HKEY hTargetKey;
PMEMKEY Key; // ParentKey PMEMKEY Key; // ParentKey
PHHIVE Hive; PHHIVE Hive;
@ -564,8 +562,6 @@ RegDeleteKeyW(
PCM_KEY_NODE Parent; PCM_KEY_NODE Parent;
HCELL_INDEX ParentCell; HCELL_INDEX ParentCell;
NTSTATUS Status;
if (lpSubKey) if (lpSubKey)
{ {
rc = RegOpenKeyW(hKey, lpSubKey, &hTargetKey); rc = RegOpenKeyW(hKey, lpSubKey, &hTargetKey);
@ -581,7 +577,7 @@ RegDeleteKeyW(
if (hTargetKey == RootKey) if (hTargetKey == RootKey)
{ {
/* Fail */ /* Fail */
Status = STATUS_CANNOT_DELETE; rc = ERROR_ACCESS_DENIED; // STATUS_CANNOT_DELETE;
goto Quit; goto Quit;
} }
@ -593,7 +589,7 @@ RegDeleteKeyW(
KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Key->KeyCellOffset); KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Key->KeyCellOffset);
if (!KeyNode) if (!KeyNode)
{ {
Status = ERROR_UNSUCCESSFUL; rc = ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
goto Quit; goto Quit;
} }
@ -622,11 +618,16 @@ RegDeleteKeyW(
HvReleaseCell(Hive, ParentCell); HvReleaseCell(Hive, ParentCell);
} }
} }
else
{
/* Fail */
rc = ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
}
} }
else else
{ {
/* Fail */ /* Fail */
Status = STATUS_CANNOT_DELETE; rc = ERROR_ACCESS_DENIED; // STATUS_CANNOT_DELETE;
} }
/* Release the cell */ /* Release the cell */
@ -636,7 +637,7 @@ Quit:
if (lpSubKey) if (lpSubKey)
RegCloseKey(hTargetKey); RegCloseKey(hTargetKey);
return Status; return rc;
} }
LONG WINAPI LONG WINAPI
@ -675,7 +676,7 @@ RegSetValueExW(
/* Special handling of registry links */ /* Special handling of registry links */
if (cbData != sizeof(PVOID)) if (cbData != sizeof(PVOID))
return STATUS_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER; // STATUS_INVALID_PARAMETER;
DestKey = HKEY_TO_MEMKEY(*(PHKEY)lpData); DestKey = HKEY_TO_MEMKEY(*(PHKEY)lpData);
@ -683,20 +684,20 @@ RegSetValueExW(
/* Create the link in registry hive (if applicable) */ /* Create the link in registry hive (if applicable) */
if (Key->RegistryHive != DestKey->RegistryHive) if (Key->RegistryHive != DestKey->RegistryHive)
return STATUS_SUCCESS; return ERROR_SUCCESS;
DPRINT1("Save link to registry\n"); DPRINT1("Save link to registry\n");
return STATUS_NOT_IMPLEMENTED; return ERROR_INVALID_FUNCTION; // STATUS_NOT_IMPLEMENTED;
} }
if ((cbData & ~CM_KEY_VALUE_SPECIAL_SIZE) != cbData) if ((cbData & ~CM_KEY_VALUE_SPECIAL_SIZE) != cbData)
return STATUS_UNSUCCESSFUL; return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
Hive = &Key->RegistryHive->Hive; Hive = &Key->RegistryHive->Hive;
KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Key->KeyCellOffset); KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Key->KeyCellOffset);
if (!KeyNode) if (!KeyNode)
return ERROR_UNSUCCESSFUL; return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
ASSERT(KeyNode->Signature == CM_KEY_NODE_SIGNATURE); ASSERT(KeyNode->Signature == CM_KEY_NODE_SIGNATURE);
@ -714,8 +715,7 @@ RegSetValueExW(
/* Sanity check */ /* Sanity check */
ASSERT(CellIndex == HCELL_NIL); ASSERT(CellIndex == HCELL_NIL);
/* Fail */ /* Fail */
// Status = STATUS_INSUFFICIENT_RESOURCES; Status = STATUS_INSUFFICIENT_RESOURCES;
return ERROR_UNSUCCESSFUL;
} }
if (CellIndex == HCELL_NIL) if (CellIndex == HCELL_NIL)
{ {
@ -738,7 +738,7 @@ RegSetValueExW(
// /**/HvReleaseCell(Hive, CellIndex);/**/ // /**/HvReleaseCell(Hive, CellIndex);/**/
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
return ERROR_UNSUCCESSFUL; return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
/* Get size of the allocated cell (if any) */ /* Get size of the allocated cell (if any) */
if (!(ValueCell->DataLength & CM_KEY_VALUE_SPECIAL_SIZE) && if (!(ValueCell->DataLength & CM_KEY_VALUE_SPECIAL_SIZE) &&
@ -746,7 +746,7 @@ RegSetValueExW(
{ {
DataCell = HvGetCell(Hive, ValueCell->Data); DataCell = HvGetCell(Hive, ValueCell->Data);
if (!DataCell) if (!DataCell)
return ERROR_UNSUCCESSFUL; return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
DataCellSize = (ULONG)(-HvGetCellSize(Hive, DataCell)); DataCellSize = (ULONG)(-HvGetCellSize(Hive, DataCell));
} }
@ -781,7 +781,7 @@ RegSetValueExW(
if (NewOffset == HCELL_NIL) if (NewOffset == HCELL_NIL)
{ {
DPRINT("HvAllocateCell() has failed!\n"); DPRINT("HvAllocateCell() has failed!\n");
return ERROR_UNSUCCESSFUL; return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
} }
if (DataCell) if (DataCell)
@ -873,7 +873,7 @@ RegQueryValueExW(
KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, ParentKey->KeyCellOffset); KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, ParentKey->KeyCellOffset);
if (!KeyNode) if (!KeyNode)
return ERROR_UNSUCCESSFUL; return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
ASSERT(KeyNode->Signature == CM_KEY_NODE_SIGNATURE); ASSERT(KeyNode->Signature == CM_KEY_NODE_SIGNATURE);
@ -881,7 +881,7 @@ RegQueryValueExW(
RtlInitUnicodeString(&ValueNameString, lpValueName); RtlInitUnicodeString(&ValueNameString, lpValueName);
CellIndex = CmpFindValueByName(Hive, KeyNode, &ValueNameString); CellIndex = CmpFindValueByName(Hive, KeyNode, &ValueNameString);
if (CellIndex == HCELL_NIL) if (CellIndex == HCELL_NIL)
return ERROR_FILE_NOT_FOUND; return ERROR_FILE_NOT_FOUND; // STATUS_OBJECT_NAME_NOT_FOUND;
/* Get the value cell */ /* Get the value cell */
ValueCell = HvGetCell(Hive, CellIndex); ValueCell = HvGetCell(Hive, CellIndex);
@ -899,6 +899,8 @@ RegDeleteValueW(
IN HKEY hKey, IN HKEY hKey,
IN LPCWSTR lpValueName OPTIONAL) IN LPCWSTR lpValueName OPTIONAL)
{ {
LONG rc;
NTSTATUS Status;
PMEMKEY Key = HKEY_TO_MEMKEY(hKey); // ParentKey PMEMKEY Key = HKEY_TO_MEMKEY(hKey); // ParentKey
PHHIVE Hive = &Key->RegistryHive->Hive; PHHIVE Hive = &Key->RegistryHive->Hive;
PCM_KEY_NODE KeyNode; // ParentNode PCM_KEY_NODE KeyNode; // ParentNode
@ -907,11 +909,9 @@ RegDeleteValueW(
ULONG ChildIndex; ULONG ChildIndex;
UNICODE_STRING ValueNameString; UNICODE_STRING ValueNameString;
NTSTATUS Status;
KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Key->KeyCellOffset); KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Key->KeyCellOffset);
if (!KeyNode) if (!KeyNode)
return ERROR_UNSUCCESSFUL; return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
ASSERT(KeyNode->Signature == CM_KEY_NODE_SIGNATURE); ASSERT(KeyNode->Signature == CM_KEY_NODE_SIGNATURE);
@ -928,7 +928,7 @@ RegDeleteValueW(
} }
if (CellIndex == HCELL_NIL) if (CellIndex == HCELL_NIL)
{ {
Status = ERROR_FILE_NOT_FOUND; // STATUS_OBJECT_NAME_NOT_FOUND; rc = ERROR_FILE_NOT_FOUND; // STATUS_OBJECT_NAME_NOT_FOUND;
goto Quit; goto Quit;
} }
@ -945,7 +945,7 @@ RegDeleteValueW(
if (!CmpMarkValueDataDirty(Hive, ValueCell)) if (!CmpMarkValueDataDirty(Hive, ValueCell))
{ {
/* Not enough log space, fail */ /* Not enough log space, fail */
Status = STATUS_NO_LOG_SPACE; rc = ERROR_NO_LOG_SPACE; // STATUS_NO_LOG_SPACE;
goto Quit; goto Quit;
} }
@ -958,7 +958,7 @@ RegDeleteValueW(
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
/* Set known error */ /* Set known error */
Status = STATUS_INSUFFICIENT_RESOURCES; rc = ERROR_NO_SYSTEM_RESOURCES; // STATUS_INSUFFICIENT_RESOURCES;
goto Quit; goto Quit;
} }
@ -966,7 +966,7 @@ RegDeleteValueW(
if (!CmpFreeValue(Hive, CellIndex)) if (!CmpFreeValue(Hive, CellIndex))
{ {
/* Failed to free the value, fail */ /* Failed to free the value, fail */
Status = STATUS_INSUFFICIENT_RESOURCES; rc = ERROR_NO_SYSTEM_RESOURCES; // STATUS_INSUFFICIENT_RESOURCES;
goto Quit; goto Quit;
} }
@ -985,7 +985,7 @@ RegDeleteValueW(
} }
/* Change default Status to success */ /* Change default Status to success */
Status = STATUS_SUCCESS; rc = ERROR_SUCCESS;
Quit: Quit:
/* Check if we had a value */ /* Check if we had a value */
@ -1000,7 +1000,7 @@ Quit:
if (KeyNode) if (KeyNode)
HvReleaseCell(Hive, Key->KeyCellOffset); HvReleaseCell(Hive, Key->KeyCellOffset);
return Status; return rc;
} }

View file

@ -20,12 +20,16 @@ typedef struct _HIVE_LIST_ENTRY
extern HIVE_LIST_ENTRY RegistryHives[]; extern HIVE_LIST_ENTRY RegistryHives[];
#define ERROR_SUCCESS 0L #define ERROR_SUCCESS 0L
#define ERROR_UNSUCCESSFUL 1L #define ERROR_INVALID_FUNCTION 1L
#define ERROR_FILE_NOT_FOUND 2L #define ERROR_FILE_NOT_FOUND 2L
#define ERROR_OUTOFMEMORY 14L #define ERROR_ACCESS_DENIED 5L
#define ERROR_NOT_ENOUGH_MEMORY 8L
#define ERROR_GEN_FAILURE 31L
#define ERROR_INVALID_PARAMETER 87L #define ERROR_INVALID_PARAMETER 87L
#define ERROR_MORE_DATA 234L // #define ERROR_MORE_DATA 234L
#define ERROR_NO_MORE_ITEMS 259L // #define ERROR_NO_MORE_ITEMS 259L
#define ERROR_NO_LOG_SPACE 1019L
#define ERROR_NO_SYSTEM_RESOURCES 1450L
#define REG_NONE 0 #define REG_NONE 0
#define REG_SZ 1 #define REG_SZ 1