* Hermès Bélusca-Maïto
*/
+/* INCLUDES *****************************************************************/
+
#define NDEBUG
#include "mkhive.h"
-#define STATUS_NO_LOG_SPACE ((NTSTATUS)0xC000017D)
-#define STATUS_CANNOT_DELETE ((NTSTATUS)0xC0000121)
+/* DATA *********************************************************************/
+
+typedef struct _REPARSE_POINT
+{
+ LIST_ENTRY ListEntry;
+ PCMHIVE SourceHive;
+ HCELL_INDEX SourceKeyCellOffset;
+ PCMHIVE DestinationHive;
+ HCELL_INDEX DestinationKeyCellOffset;
+} REPARSE_POINT, *PREPARSE_POINT;
+
+typedef struct _MEMKEY
+{
+ /* Information on hard disk structure */
+ HCELL_INDEX KeyCellOffset;
+ PCMHIVE RegistryHive;
+} MEMKEY, *PMEMKEY;
+
+#define HKEY_TO_MEMKEY(hKey) ((PMEMKEY)(hKey))
+#define MEMKEY_TO_HKEY(memKey) ((HKEY)(memKey))
static CMHIVE RootHive;
static PMEMKEY RootKey;
0x01, 0x02, 0x00, 0x00
};
+/* GLOBALS ******************************************************************/
HIVE_LIST_ENTRY RegistryHives[/*MAX_NUMBER_OF_REGISTRY_HIVES*/] =
{
};
C_ASSERT(_countof(RegistryHives) == MAX_NUMBER_OF_REGISTRY_HIVES);
+/* FUNCTIONS ****************************************************************/
static PMEMKEY
CreateInMemoryStructure(
IN BOOL Volatile,
OUT PHKEY Key)
{
+ NTSTATUS Status;
PWSTR LocalKeyName;
PWSTR End;
UNICODE_STRING KeyString;
- NTSTATUS Status;
PREPARSE_POINT CurrentReparsePoint;
PMEMKEY CurrentKey;
PCMHIVE ParentRegistryHive;
ParentKeyCell = (PCM_KEY_NODE)HvGetCell(&ParentRegistryHive->Hive, ParentCellOffset);
if (!ParentKeyCell)
- return STATUS_UNSUCCESSFUL;
+ return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
VERIFY_KEY_CELL(ParentKeyCell);
}
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);
if (!NT_SUCCESS(Status))
{
- DPRINT("RegpCreateOrOpenKey('%S'): Could not create or open subkey '%wZ'\n", KeyName, &KeyString);
- return ERROR_UNSUCCESSFUL;
+ DPRINT("RegpCreateOrOpenKey('%S'): Could not create or open subkey '%wZ', Status 0x%08x\n", KeyName, &KeyString, Status);
+ return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
}
ParentCellOffset = BlockOffset;
CurrentKey = CreateInMemoryStructure(ParentRegistryHive, ParentCellOffset);
if (!CurrentKey)
- return ERROR_OUTOFMEMORY;
+ return ERROR_NOT_ENOUGH_MEMORY; // STATUS_NO_MEMORY;
*Key = MEMKEY_TO_HKEY(CurrentKey);
IN LPCWSTR lpSubKey)
{
LONG rc;
+ NTSTATUS Status;
HKEY hTargetKey;
PMEMKEY Key; // ParentKey
PHHIVE Hive;
PCM_KEY_NODE Parent;
HCELL_INDEX ParentCell;
- NTSTATUS Status;
-
if (lpSubKey)
{
rc = RegOpenKeyW(hKey, lpSubKey, &hTargetKey);
if (hTargetKey == RootKey)
{
/* Fail */
- Status = STATUS_CANNOT_DELETE;
+ rc = ERROR_ACCESS_DENIED; // STATUS_CANNOT_DELETE;
goto Quit;
}
KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Key->KeyCellOffset);
if (!KeyNode)
{
- Status = ERROR_UNSUCCESSFUL;
+ rc = ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
goto Quit;
}
HvReleaseCell(Hive, ParentCell);
}
}
+ else
+ {
+ /* Fail */
+ rc = ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
+ }
}
else
{
/* Fail */
- Status = STATUS_CANNOT_DELETE;
+ rc = ERROR_ACCESS_DENIED; // STATUS_CANNOT_DELETE;
}
/* Release the cell */
if (lpSubKey)
RegCloseKey(hTargetKey);
- return Status;
+ return rc;
}
LONG WINAPI
/* Special handling of registry links */
if (cbData != sizeof(PVOID))
- return STATUS_INVALID_PARAMETER;
+ return ERROR_INVALID_PARAMETER; // STATUS_INVALID_PARAMETER;
DestKey = HKEY_TO_MEMKEY(*(PHKEY)lpData);
/* Create the link in registry hive (if applicable) */
if (Key->RegistryHive != DestKey->RegistryHive)
- return STATUS_SUCCESS;
+ return ERROR_SUCCESS;
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)
- return STATUS_UNSUCCESSFUL;
+ return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
Hive = &Key->RegistryHive->Hive;
KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Key->KeyCellOffset);
if (!KeyNode)
- return ERROR_UNSUCCESSFUL;
+ return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
ASSERT(KeyNode->Signature == CM_KEY_NODE_SIGNATURE);
/* Sanity check */
ASSERT(CellIndex == HCELL_NIL);
/* Fail */
- // Status = STATUS_INSUFFICIENT_RESOURCES;
- return ERROR_UNSUCCESSFUL;
+ Status = STATUS_INSUFFICIENT_RESOURCES;
}
if (CellIndex == HCELL_NIL)
{
// /**/HvReleaseCell(Hive, CellIndex);/**/
if (!NT_SUCCESS(Status))
- return ERROR_UNSUCCESSFUL;
+ return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
/* Get size of the allocated cell (if any) */
if (!(ValueCell->DataLength & CM_KEY_VALUE_SPECIAL_SIZE) &&
{
DataCell = HvGetCell(Hive, ValueCell->Data);
if (!DataCell)
- return ERROR_UNSUCCESSFUL;
+ return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
DataCellSize = (ULONG)(-HvGetCellSize(Hive, DataCell));
}
if (NewOffset == HCELL_NIL)
{
DPRINT("HvAllocateCell() has failed!\n");
- return ERROR_UNSUCCESSFUL;
+ return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
}
if (DataCell)
KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, ParentKey->KeyCellOffset);
if (!KeyNode)
- return ERROR_UNSUCCESSFUL;
+ return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
ASSERT(KeyNode->Signature == CM_KEY_NODE_SIGNATURE);
RtlInitUnicodeString(&ValueNameString, lpValueName);
CellIndex = CmpFindValueByName(Hive, KeyNode, &ValueNameString);
if (CellIndex == HCELL_NIL)
- return ERROR_FILE_NOT_FOUND;
+ return ERROR_FILE_NOT_FOUND; // STATUS_OBJECT_NAME_NOT_FOUND;
/* Get the value cell */
ValueCell = HvGetCell(Hive, CellIndex);
IN HKEY hKey,
IN LPCWSTR lpValueName OPTIONAL)
{
+ LONG rc;
+ NTSTATUS Status;
PMEMKEY Key = HKEY_TO_MEMKEY(hKey); // ParentKey
PHHIVE Hive = &Key->RegistryHive->Hive;
PCM_KEY_NODE KeyNode; // ParentNode
ULONG ChildIndex;
UNICODE_STRING ValueNameString;
- NTSTATUS Status;
-
KeyNode = (PCM_KEY_NODE)HvGetCell(Hive, Key->KeyCellOffset);
if (!KeyNode)
- return ERROR_UNSUCCESSFUL;
+ return ERROR_GEN_FAILURE; // STATUS_UNSUCCESSFUL;
ASSERT(KeyNode->Signature == CM_KEY_NODE_SIGNATURE);
}
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;
}
if (!CmpMarkValueDataDirty(Hive, ValueCell))
{
/* Not enough log space, fail */
- Status = STATUS_NO_LOG_SPACE;
+ rc = ERROR_NO_LOG_SPACE; // STATUS_NO_LOG_SPACE;
goto Quit;
}
if (!NT_SUCCESS(Status))
{
/* Set known error */
- Status = STATUS_INSUFFICIENT_RESOURCES;
+ rc = ERROR_NO_SYSTEM_RESOURCES; // STATUS_INSUFFICIENT_RESOURCES;
goto Quit;
}
if (!CmpFreeValue(Hive, CellIndex))
{
/* Failed to free the value, fail */
- Status = STATUS_INSUFFICIENT_RESOURCES;
+ rc = ERROR_NO_SYSTEM_RESOURCES; // STATUS_INSUFFICIENT_RESOURCES;
goto Quit;
}
}
/* Change default Status to success */
- Status = STATUS_SUCCESS;
+ rc = ERROR_SUCCESS;
Quit:
/* Check if we had a value */
if (KeyNode)
HvReleaseCell(Hive, Key->KeyCellOffset);
- return Status;
+ return rc;
}