mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 17:44:45 +00:00
work on registry files
svn path=/trunk/; revision=1360
This commit is contained in:
parent
522110434e
commit
b0a3240f8e
1 changed files with 39 additions and 92 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $Id: registry.c,v 1.33 2000/09/13 11:46:35 jean Exp $
|
||||
/* $Id: registry.c,v 1.34 2000/09/14 14:45:06 jean Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -19,7 +19,7 @@
|
|||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
||||
#define PROTO_REG 1 /* Comment out to disable */
|
||||
//#define PROTO_REG 1 /* Comment out to disable */
|
||||
|
||||
/* ----------------------------------------------------- Typedefs */
|
||||
|
||||
|
@ -48,6 +48,8 @@
|
|||
#define SOFTWARE_REG_FILE L"\\SystemRoot\\System32\\Config\\SOFTWARE"
|
||||
#define USER_REG_FILE L"\\SystemRoot\\System32\\Config\\USER"
|
||||
|
||||
#define KO_MARKED_FOR_DELETE 0x00000001
|
||||
|
||||
// BLOCK_OFFSET = offset in file after header block
|
||||
typedef DWORD BLOCK_OFFSET;
|
||||
|
||||
|
@ -100,6 +102,7 @@ typedef struct _KEY_BLOCK
|
|||
DWORD Unused4[5];
|
||||
WORD NameSize;
|
||||
WORD ClassSize;
|
||||
// FIXME : Name is char, not wchar
|
||||
WCHAR Name[0];
|
||||
} KEY_BLOCK, *PKEY_BLOCK;
|
||||
|
||||
|
@ -132,6 +135,7 @@ typedef struct _VALUE_BLOCK
|
|||
DWORD DataType;
|
||||
WORD Flags;
|
||||
WORD Unused1;
|
||||
// FIXME : Name is char, not wchar
|
||||
WCHAR Name[0];
|
||||
} VALUE_BLOCK, *PVALUE_BLOCK;
|
||||
|
||||
|
@ -169,21 +173,17 @@ typedef struct _KEY_OBJECT
|
|||
struct _KEY_OBJECT *SubKey;
|
||||
} KEY_OBJECT, *PKEY_OBJECT;
|
||||
|
||||
#define KO_MARKED_FOR_DELETE 0x00000001
|
||||
|
||||
/* ------------------------------------------------- File Statics */
|
||||
|
||||
#if PROTO_REG
|
||||
static POBJECT_TYPE CmiKeyType = NULL;
|
||||
static PREGISTRY_FILE CmiVolatileFile = NULL;
|
||||
static PKEY_OBJECT CmiKeyList = NULL;
|
||||
static KSPIN_LOCK CmiKeyListLock;
|
||||
static PREGISTRY_FILE CmiSystemFile = NULL;
|
||||
#endif
|
||||
|
||||
/* ----------------------------------------- Forward Declarations */
|
||||
|
||||
#if PROTO_REG
|
||||
static NTSTATUS CmiObjectParse(PVOID ParsedObject,
|
||||
PVOID *NextObject,
|
||||
PUNICODE_STRING FullPath,
|
||||
|
@ -259,8 +259,6 @@ static NTSTATUS CmiDestroyKeyBlock(PREGISTRY_FILE RegistryFile,
|
|||
static NTSTATUS CmiAllocateHashTableBlock(IN PREGISTRY_FILE RegistryFile,
|
||||
OUT PHASH_TABLE_BLOCK *HashBlock,
|
||||
IN ULONG HashTableSize);
|
||||
static PHASH_TABLE_BLOCK CmiGetHashTableBlock(PREGISTRY_FILE RegistryFile,
|
||||
BLOCK_OFFSET HashBlockOffset);
|
||||
static PKEY_BLOCK CmiGetKeyFromHashByIndex(PREGISTRY_FILE RegistryFile,
|
||||
PHASH_TABLE_BLOCK HashBlock,
|
||||
ULONG Index);
|
||||
|
@ -296,14 +294,12 @@ static VOID CmiLockBlock(PREGISTRY_FILE RegistryFile,
|
|||
static VOID CmiReleaseBlock(PREGISTRY_FILE RegistryFile,
|
||||
PVOID Block);
|
||||
|
||||
#endif
|
||||
|
||||
/* --------------------------------------------- Public Interface */
|
||||
|
||||
VOID
|
||||
CmInitializeRegistry(VOID)
|
||||
{
|
||||
#if PROTO_REG
|
||||
NTSTATUS Status;
|
||||
HANDLE RootKeyHandle;
|
||||
UNICODE_STRING RootKeyName;
|
||||
|
@ -380,28 +376,28 @@ CHECKPOINT;
|
|||
/* FIXME: create remaining structure needed for default handles */
|
||||
/* FIXME: load volatile registry data from ROSDTECT */
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
VOID
|
||||
CmInitializeRegistry2(VOID)
|
||||
{
|
||||
#ifdef xxx
|
||||
#ifdef PROTO_REG
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
PKEY_OBJECT NewKey;
|
||||
HANDLE KeyHandle;
|
||||
UNICODE_STRING KeyName;
|
||||
/* FIXME : delete temporary \Registry\Machine\System */
|
||||
RtlInitUnicodeString(&KeyName, REG_SYSTEM_KEY_NAME);
|
||||
InitializeObjectAttributes(&ObjectAttributes, &KeyName, 0, NULL, NULL);
|
||||
NewKey=ObCreateObject(&KeyHandle,
|
||||
STANDARD_RIGHTS_REQUIRED,
|
||||
&ObjectAttributes,
|
||||
CmiKeyType);
|
||||
/* load the SYSTEM Hive */
|
||||
CHECKPOINT;
|
||||
CmiSystemFile = CmiCreateRegistry(SYSTEM_REG_FILE);
|
||||
if( CmiSystemFile )
|
||||
{
|
||||
RtlInitUnicodeString(&KeyName, REG_SYSTEM_KEY_NAME);
|
||||
InitializeObjectAttributes(&ObjectAttributes, &KeyName, 0, NULL, NULL);
|
||||
NewKey=ObCreateObject(&KeyHandle,
|
||||
STANDARD_RIGHTS_REQUIRED,
|
||||
&ObjectAttributes,
|
||||
CmiKeyType);
|
||||
NewKey->RegistryFile = CmiSystemFile;
|
||||
NewKey->KeyBlock = CmiGetBlock(CmiSystemFile,32);
|
||||
NewKey->Flags = 0;
|
||||
|
@ -409,23 +405,36 @@ CHECKPOINT;
|
|||
NewKey->Name = NewKey->KeyBlock->Name;
|
||||
}
|
||||
CHECKPOINT;
|
||||
#endif
|
||||
/*
|
||||
/* tests :*/
|
||||
{
|
||||
// HANDLE HKey;
|
||||
NTSTATUS Status;
|
||||
PKEY_BLOCK SubKeyBlock;
|
||||
RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\Software\\Windows");
|
||||
InitializeObjectAttributes(&ObjectAttributes, &KeyName, 0, NULL, NULL);
|
||||
Status = CmiScanForSubKey(CmiSystemFile,
|
||||
NewKey->KeyBlock,
|
||||
&SubKeyBlock,
|
||||
L"Windows",
|
||||
L"ControlSet001",
|
||||
KEY_READ);
|
||||
CHECKPOINT;
|
||||
if(NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("found subkey ,ptr=%x\n",SubKeyBlock);
|
||||
DPRINT(" Id=%x\n",SubKeyBlock->SubBlockId);
|
||||
DPRINT(" Type=%x\n",SubKeyBlock->Type);
|
||||
DPRINT(" parent=%x\n",SubKeyBlock->ParentKeyOffset);
|
||||
DPRINT(" name=%x\n",SubKeyBlock->Name);
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("not found subkey ControlSet001\n");
|
||||
}
|
||||
//RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\Software\\Windows");
|
||||
//RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\System\\ControlSet001");
|
||||
// InitializeObjectAttributes(&ObjectAttributes, &KeyName, 0, NULL, NULL);
|
||||
// Status = NtOpenKey ( &HKey, KEY_READ , &ObjectAttributes);
|
||||
|
||||
}
|
||||
*/
|
||||
#endif
|
||||
}
|
||||
|
||||
VOID
|
||||
|
@ -447,7 +456,6 @@ NtCreateKey (
|
|||
OUT PULONG Disposition
|
||||
)
|
||||
{
|
||||
#if PROTO_REG
|
||||
PWSTR KeyNameBuf;
|
||||
NTSTATUS Status;
|
||||
PKEY_OBJECT CurKey, NewKey;
|
||||
|
@ -531,9 +539,6 @@ NtCreateKey (
|
|||
*Disposition = REG_CREATED_NEW_KEY;
|
||||
}
|
||||
return Status;
|
||||
#else
|
||||
UNIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -543,7 +548,6 @@ NtDeleteKey (
|
|||
IN HANDLE KeyHandle
|
||||
)
|
||||
{
|
||||
#ifdef PROTO_REG
|
||||
NTSTATUS Status;
|
||||
PKEY_OBJECT KeyObject;
|
||||
|
||||
|
@ -568,9 +572,6 @@ NtDeleteKey (
|
|||
ObDereferenceObject(KeyObject);
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
#else
|
||||
UNIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -585,7 +586,6 @@ NtEnumerateKey (
|
|||
OUT PULONG ResultLength
|
||||
)
|
||||
{
|
||||
#ifdef PROTO_REG
|
||||
NTSTATUS Status;
|
||||
PKEY_OBJECT KeyObject;
|
||||
PREGISTRY_FILE RegistryFile;
|
||||
|
@ -612,7 +612,7 @@ NtEnumerateKey (
|
|||
RegistryFile = KeyObject->RegistryFile;
|
||||
|
||||
/* Get pointer to SubKey */
|
||||
HashTableBlock = CmiGetHashTableBlock(RegistryFile, KeyBlock->HashTableOffset);
|
||||
HashTableBlock = CmiGetBlock(RegistryFile, KeyBlock->HashTableOffset);
|
||||
SubKeyBlock = CmiGetKeyFromHashByIndex(RegistryFile,
|
||||
HashTableBlock,
|
||||
Index);
|
||||
|
@ -722,9 +722,6 @@ NtEnumerateKey (
|
|||
ObDereferenceObject (KeyObject);
|
||||
|
||||
return Status;
|
||||
#else
|
||||
UNIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -739,7 +736,6 @@ NtEnumerateValueKey (
|
|||
OUT PULONG ResultLength
|
||||
)
|
||||
{
|
||||
#ifdef PROTO_REG
|
||||
NTSTATUS Status;
|
||||
PKEY_OBJECT KeyObject;
|
||||
PREGISTRY_FILE RegistryFile;
|
||||
|
@ -856,9 +852,6 @@ NtEnumerateValueKey (
|
|||
ObDereferenceObject(KeyObject);
|
||||
|
||||
return Status;
|
||||
#else
|
||||
UNIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -868,11 +861,7 @@ NtFlushKey (
|
|||
IN HANDLE KeyHandle
|
||||
)
|
||||
{
|
||||
#ifdef PROTO_REG
|
||||
return STATUS_SUCCESS;
|
||||
#else
|
||||
UNIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -884,7 +873,6 @@ NtOpenKey (
|
|||
IN POBJECT_ATTRIBUTES ObjectAttributes
|
||||
)
|
||||
{
|
||||
#ifdef PROTO_REG
|
||||
NTSTATUS Status;
|
||||
PWSTR KeyNameBuf;
|
||||
PREGISTRY_FILE FileToUse;
|
||||
|
@ -967,9 +955,6 @@ NtOpenKey (
|
|||
KeyHandle);
|
||||
|
||||
return Status;
|
||||
#else
|
||||
UNIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -983,7 +968,6 @@ NtQueryKey (
|
|||
OUT PULONG ResultLength
|
||||
)
|
||||
{
|
||||
#ifdef PROTO_REG
|
||||
NTSTATUS Status;
|
||||
PKEY_OBJECT KeyObject;
|
||||
PREGISTRY_FILE RegistryFile;
|
||||
|
@ -1108,9 +1092,6 @@ NtQueryKey (
|
|||
ObDereferenceObject (KeyObject);
|
||||
|
||||
return Status;
|
||||
#else
|
||||
UNIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -1125,7 +1106,6 @@ NtQueryValueKey (
|
|||
OUT PULONG ResultLength
|
||||
)
|
||||
{
|
||||
#ifdef PROTO_REG
|
||||
NTSTATUS Status;
|
||||
PKEY_OBJECT KeyObject;
|
||||
PREGISTRY_FILE RegistryFile;
|
||||
|
@ -1240,9 +1220,6 @@ NtQueryValueKey (
|
|||
ObDereferenceObject(KeyObject);
|
||||
|
||||
return Status;
|
||||
#else
|
||||
UNIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -1257,7 +1234,6 @@ NtSetValueKey (
|
|||
IN ULONG DataSize
|
||||
)
|
||||
{
|
||||
#ifdef PROTO_REG
|
||||
NTSTATUS Status;
|
||||
PKEY_OBJECT KeyObject;
|
||||
PREGISTRY_FILE RegistryFile;
|
||||
|
@ -1308,9 +1284,6 @@ NtSetValueKey (
|
|||
ObDereferenceObject (KeyObject);
|
||||
|
||||
return Status;
|
||||
#else
|
||||
UNIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
|
@ -1320,7 +1293,6 @@ NtDeleteValueKey (
|
|||
IN PUNICODE_STRING ValueName
|
||||
)
|
||||
{
|
||||
#ifdef PROTO_REG
|
||||
NTSTATUS Status;
|
||||
PKEY_OBJECT KeyObject;
|
||||
PREGISTRY_FILE RegistryFile;
|
||||
|
@ -1347,9 +1319,6 @@ NtDeleteValueKey (
|
|||
ObDereferenceObject(KeyObject);
|
||||
|
||||
return Status;
|
||||
#else
|
||||
UNIMPLEMENTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
|
@ -1544,7 +1513,6 @@ RtlWriteRegistryValue (
|
|||
/* ------------------------------------------ Private Implementation */
|
||||
|
||||
|
||||
#if PROTO_REG
|
||||
static NTSTATUS CmiObjectParse(PVOID ParsedObject,
|
||||
PVOID *NextObject,
|
||||
PUNICODE_STRING FullPath,
|
||||
|
@ -2145,7 +2113,7 @@ CmiGetMaxNameLength(PREGISTRY_FILE RegistryFile,
|
|||
PKEY_BLOCK CurSubKeyBlock;
|
||||
|
||||
MaxName = 0;
|
||||
HashBlock = CmiGetHashTableBlock(RegistryFile, KeyBlock->HashTableOffset);
|
||||
HashBlock = CmiGetBlock(RegistryFile, KeyBlock->HashTableOffset);
|
||||
if (HashBlock == 0)
|
||||
{
|
||||
return 0;
|
||||
|
@ -2178,7 +2146,7 @@ CmiGetMaxClassLength(PREGISTRY_FILE RegistryFile,
|
|||
PKEY_BLOCK CurSubKeyBlock;
|
||||
|
||||
MaxClass = 0;
|
||||
HashBlock = CmiGetHashTableBlock(RegistryFile, KeyBlock->HashTableOffset);
|
||||
HashBlock = CmiGetBlock(RegistryFile, KeyBlock->HashTableOffset);
|
||||
if (HashBlock == 0)
|
||||
{
|
||||
return 0;
|
||||
|
@ -2277,7 +2245,7 @@ CmiScanForSubKey(IN PREGISTRY_FILE RegistryFile,
|
|||
PHASH_TABLE_BLOCK HashBlock;
|
||||
PKEY_BLOCK CurSubKeyBlock;
|
||||
|
||||
HashBlock = CmiGetHashTableBlock(RegistryFile, KeyBlock->HashTableOffset);
|
||||
HashBlock = CmiGetBlock(RegistryFile, KeyBlock->HashTableOffset);
|
||||
*SubKeyBlock = NULL;
|
||||
if (HashBlock == 0)
|
||||
{
|
||||
|
@ -2343,7 +2311,7 @@ CmiAddSubKey(PREGISTRY_FILE RegistryFile,
|
|||
}
|
||||
else
|
||||
{
|
||||
HashBlock = CmiGetHashTableBlock(RegistryFile, KeyBlock->HashTableOffset);
|
||||
HashBlock = CmiGetBlock(RegistryFile, KeyBlock->HashTableOffset);
|
||||
if (KeyBlock->NumberOfSubKeys + 1 >= HashBlock->HashTableSize)
|
||||
{
|
||||
|
||||
|
@ -2685,26 +2653,6 @@ CmiAllocateHashTableBlock(IN PREGISTRY_FILE RegistryFile,
|
|||
return Status;
|
||||
}
|
||||
|
||||
static PHASH_TABLE_BLOCK
|
||||
CmiGetHashTableBlock(PREGISTRY_FILE RegistryFile,
|
||||
BLOCK_OFFSET HashBlockOffset)
|
||||
{
|
||||
PHASH_TABLE_BLOCK HashBlock;
|
||||
|
||||
if (RegistryFile->Filename == NULL)
|
||||
{
|
||||
CmiLockBlock(RegistryFile, (PVOID) HashBlockOffset);
|
||||
|
||||
HashBlock = (PHASH_TABLE_BLOCK) HashBlockOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
}
|
||||
|
||||
return HashBlock;
|
||||
}
|
||||
|
||||
static PKEY_BLOCK
|
||||
CmiGetKeyFromHashByIndex(PREGISTRY_FILE RegistryFile,
|
||||
PHASH_TABLE_BLOCK HashBlock,
|
||||
|
@ -3046,10 +2994,9 @@ CmiReleaseBlock(PREGISTRY_FILE RegistryFile,
|
|||
{
|
||||
if (RegistryFile->Filename != NULL)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
/* FIXME : implement */
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* EOF */
|
||||
|
|
Loading…
Reference in a new issue