-/* $Id: registry.c,v 1.44 2000/10/11 15:06:31 jean Exp $
+/* $Id: registry.c,v 1.45 2000/10/16 15:22:45 jean Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
PVOID Block);
static VOID CmiReleaseBlock(PREGISTRY_FILE RegistryFile,
PVOID Block);
-NTSTATUS
+static NTSTATUS
CmiAddFree(PREGISTRY_FILE RegistryFile,
PFREE_SUB_BLOCK FreeBlock,BLOCK_OFFSET FreeOffset);
key->NumberOfSubKeys = 0;
key->SizeOfSubKeys = 0;
key->SubKeys = NULL;
- /* FIXME : add key to subkeys of parent if needed */
+ /* add key to subkeys of parent if needed */
Status = CmiAddSubKey(key->RegistryFile,
key->ParentKey,
key,
TitleIndex,
Class,
CreateOptions);
-CHECKPOINT;
key->Name = key->KeyBlock->Name;
key->NameSize = key->KeyBlock->NameSize;
DPRINT("create key %x,file %S,offset=%x,parent=%x,NS=%d\n"
PKEY_VALUE_PARTIAL_INFORMATION ValuePartialInformation;
PKEY_VALUE_FULL_INFORMATION ValueFullInformation;
-CHECKPOINT;
/* Verify that the handle is valid and is a registry key */
Status = ObReferenceObjectByHandle(KeyHandle,
}
else
{
-CHECKPOINT;
Status = STATUS_UNSUCCESSFUL;
}
ObDereferenceObject(KeyObject);
PVOID Object;
UNICODE_STRING RemainingPath;
+/*
if (ObjectAttributes->RootDirectory == HKEY_LOCAL_MACHINE)
{
Status = ObCreateHandle(
&ObjectAttributes->RootDirectory
);
}
+*/
Status = ObFindObject(ObjectAttributes,&Object,&RemainingPath,CmiKeyType);
/*
if ( RemainingPath.Buffer != NULL )
UserMode,
(PVOID *)&KeyObject,
NULL);
-CHECKPOINT;
if (!NT_SUCCESS(Status))
{
return Status;
}
else
{
-CHECKPOINT;
Status = CmiReplaceValueData(RegistryFile,
ValueBlock,
Type,
{
return STATUS_SUCCESS;
}
-DPRINT("HB=%x\n",HashBlock);
// for (Idx = 0; Idx < HashBlock->HashTableSize; Idx++)
for (Idx = 0; Idx < KeyBlock->NumberOfSubKeys
&& Idx < HashBlock->HashTableSize; Idx++)
HashBlock->Table[Idx].KeyOffset != -1 &&
!strncmp(KeyName, (PCHAR) &HashBlock->Table[Idx].HashValue, 4))
{
-DPRINT("test block at offset : %x\n", HashBlock->Table[Idx].KeyOffset);
CurSubKeyBlock = CmiGetBlock(RegistryFile,
HashBlock->Table[Idx].KeyOffset);
-CHECKPOINT;
if ( CurSubKeyBlock->NameSize == KeyLength
&& !memcmp(KeyName, CurSubKeyBlock->Name, KeyLength))
{
-CHECKPOINT;
*SubKeyBlock = CurSubKeyBlock;
*BlockOffset = HashBlock->Table[Idx].KeyOffset;
break;
return Status;
if (KeyBlock->HashTableOffset == -1)
{
-CHECKPOINT;
Status = CmiAllocateHashTableBlock(RegistryFile,
&HashBlock,
&KeyBlock->HashTableOffset,
}
else
{
-CHECKPOINT;
HashBlock = CmiGetBlock(RegistryFile, KeyBlock->HashTableOffset);
if (KeyBlock->NumberOfSubKeys + 1 >= HashBlock->HashTableSize)
{
HashBlock = NewHashBlock;
}
}
-CHECKPOINT;
Status = CmiAddKeyToHashTable(RegistryFile, HashBlock, NewKeyBlock,NKBOffset);
if (NT_SUCCESS(Status))
{
}
else if ( ! (KeyBlock->NumberOfValues % REG_VALUE_LIST_BLOCK_MULTIPLE))
{
-CHECKPOINT;
Status = CmiAllocateBlock(RegistryFile,
(PVOID) &NewValueListBlock,
sizeof(BLOCK_OFFSET) *
for (i = 0; i < HashBlock->HashTableSize; i++)
{
-CHECKPOINT;
if (HashBlock->Table[i].KeyOffset == 0)
{
HashBlock->Table[i].KeyOffset = NKBOffset;
}
else
{
- /* FIXME : first search in free blocks */
- /* add a new block : */
- Status = CmiAddHeap(RegistryFile, (PVOID *)&NewBlock , pBlockOffset);
+ int i;
+ /* first search in free blocks */
+ NewBlock = NULL;
+ for (i=0 ; i<RegistryFile->FreeListSize ; i++)
+ {
+ if(RegistryFile->FreeList[i]->SubBlockSize >=BlockSize)
+ {
+ NewBlock = RegistryFile->FreeList[i];
+ if(pBlockOffset)
+ *pBlockOffset = RegistryFile->FreeListOffset[i];
+ memmove( &RegistryFile->FreeList[i]
+ ,&RegistryFile->FreeList[i+1]
+ ,sizeof(RegistryFile->FreeList[0])*RegistryFile->FreeListSize);
+ memmove( &RegistryFile->FreeListOffset[i]
+ ,&RegistryFile->FreeListOffset[i+1]
+ ,sizeof(RegistryFile->FreeListOffset[0])*RegistryFile->FreeListSize);
+ RegistryFile->FreeListSize--;
+ break;
+ }
+ }
+ /* first search in free blocks */
+ if (NewBlock == NULL)
+ {
+ /* add a new block : */
+ Status = CmiAddHeap(RegistryFile, (PVOID *)&NewBlock , pBlockOffset);
+ }
if (NT_SUCCESS(Status))
{
*Block = NewBlock;
CmiLockBlock(RegistryFile, *Block);
}
}
-
return Status;
}
return Status;
}
-NTSTATUS
+static NTSTATUS
CmiAddFree(PREGISTRY_FILE RegistryFile,
PFREE_SUB_BLOCK FreeBlock,BLOCK_OFFSET FreeOffset)
{
PFREE_SUB_BLOCK *tmpList;
BLOCK_OFFSET *tmpListOffset;
-DPRINT("Add free : offset=%x,size=%x\n",FreeOffset,FreeBlock->SubBlockSize);
- if( (++RegistryFile->FreeListSize) > RegistryFile->FreeListMax)
+ int minInd,maxInd,medInd;
+ if( (RegistryFile->FreeListSize+1) > RegistryFile->FreeListMax)
{
tmpList=ExAllocatePool(PagedPool
,sizeof(PFREE_SUB_BLOCK)*(RegistryFile->FreeListMax+32));
RegistryFile->FreeListOffset = tmpListOffset;
RegistryFile->FreeListMax +=32;
}
- RegistryFile->FreeList[RegistryFile->FreeListSize] = FreeBlock;
- RegistryFile->FreeListOffset[RegistryFile->FreeListSize ++] = FreeOffset;
+ /* add new offset to free list, maintening list in ascending order */
+ if ( RegistryFile->FreeListSize==0
+ || RegistryFile->FreeListOffset[RegistryFile->FreeListSize-1] < FreeOffset)
+ {
+ /* add to end of list : */
+ RegistryFile->FreeList[RegistryFile->FreeListSize] = FreeBlock;
+ RegistryFile->FreeListOffset[RegistryFile->FreeListSize ++] = FreeOffset;
+ }
+ else if (RegistryFile->FreeListOffset[0] > FreeOffset)
+ {
+ /* add to begin of list : */
+ memmove( &RegistryFile->FreeList[1],&RegistryFile->FreeList[0]
+ ,sizeof(RegistryFile->FreeList[0])*RegistryFile->FreeListSize);
+ memmove( &RegistryFile->FreeListOffset[1],&RegistryFile->FreeListOffset[0]
+ ,sizeof(RegistryFile->FreeListOffset[0])*RegistryFile->FreeListSize);
+ RegistryFile->FreeList[0] = FreeBlock;
+ RegistryFile->FreeListOffset[0] = FreeOffset;
+ RegistryFile->FreeListSize ++;
+ }
+ else
+ {
+ /* search where to insert : */
+ minInd=0;
+ maxInd=RegistryFile->FreeListSize-1;
+ while( (maxInd-minInd) >1)
+ {
+ medInd=(minInd+maxInd)/2;
+ if (RegistryFile->FreeListOffset[medInd] > FreeOffset)
+ maxInd=medInd;
+ else
+ minInd=medInd;
+ }
+ /* insert before maxInd : */
+ memmove( &RegistryFile->FreeList[maxInd+1],&RegistryFile->FreeList[maxInd]
+ ,sizeof(RegistryFile->FreeList[0])
+ *(RegistryFile->FreeListSize-minInd));
+ memmove( &RegistryFile->FreeListOffset[maxInd+1]
+ , &RegistryFile->FreeListOffset[maxInd]
+ , sizeof(RegistryFile->FreeListOffset[0])
+ *(RegistryFile->FreeListSize-minInd));
+ RegistryFile->FreeList[maxInd] = FreeBlock;
+ RegistryFile->FreeListOffset[maxInd] = FreeOffset;
+ RegistryFile->FreeListSize ++;
+ }
return STATUS_SUCCESS;
}
DPRINT1("error %x reading registry file at offset %x\n",Status,fileOffset.u.LowPart);
return NULL;
}
- /* FIXME : search free blocks and add to list */
+ /* search free blocks and add to list */
FreeOffset=32;
while(FreeOffset < tmpHeap.BlockSize)
{