extern PREGISTRY_FILE CmiVolatileFile;
void CmiCreateDefaultHeaderBlock(PHEADER_BLOCK HeaderBlock)
-{
+{
RtlZeroMemory(HeaderBlock, sizeof(HEADER_BLOCK));
HeaderBlock->BlockId = 0x66676572;
HeaderBlock->DateModified.dwLowDateTime = 0;
return Status;
}
-PREGISTRY_FILE
+PREGISTRY_FILE
CmiCreateRegistry(PWSTR Filename)
{
PREGISTRY_FILE RegistryFile;
return MaxName;
}
-ULONG
+ULONG
CmiGetMaxClassLength(PREGISTRY_FILE RegistryFile,
PKEY_BLOCK KeyBlock)
{
}
NTSTATUS
-CmiAddSubKey(PREGISTRY_FILE RegistryFile,
+CmiAddSubKey(PREGISTRY_FILE RegistryFile,
PKEY_OBJECT Parent,
PKEY_OBJECT SubKey,
PWSTR NewSubKeyName,
USHORT NewSubKeyNameSize,
ULONG TitleIndex,
- PUNICODE_STRING Class,
+ PUNICODE_STRING Class,
ULONG CreateOptions)
{
PKEY_BLOCK KeyBlock = Parent->KeyBlock;
}
if (KeyBlock->HashTableOffset == -1)
{
- Status = CmiAllocateHashTableBlock(RegistryFile,
+ Status = CmiAllocateHashTableBlock(RegistryFile,
&HashBlock,
&KeyBlock->HashTableOffset,
REG_INIT_HASH_TABLE_SIZE);
return Status;
}
-NTSTATUS
+NTSTATUS
CmiScanKeyForValue(IN PREGISTRY_FILE RegistryFile,
IN PKEY_BLOCK KeyBlock,
IN PCHAR ValueName,
OUT BLOCK_OFFSET *VBOffset)
{
ULONG Length;
- ULONG Idx;
- PVALUE_LIST_BLOCK ValueListBlock;
- PVALUE_BLOCK CurValueBlock;
- ValueListBlock = CmiGetBlock(RegistryFile,
+ ULONG Idx;
+ PVALUE_LIST_BLOCK ValueListBlock;
+ PVALUE_BLOCK CurValueBlock;
+
+ ValueListBlock = CmiGetBlock(RegistryFile,
KeyBlock->ValuesOffset,NULL);
*ValueBlock = NULL;
if (ValueListBlock == NULL)
IN ULONG Index,
OUT PVALUE_BLOCK *ValueBlock)
{
- PVALUE_LIST_BLOCK ValueListBlock;
- PVALUE_BLOCK CurValueBlock;
+ PVALUE_LIST_BLOCK ValueListBlock;
+ PVALUE_BLOCK CurValueBlock;
+
ValueListBlock = CmiGetBlock(RegistryFile,
KeyBlock->ValuesOffset,NULL);
*ValueBlock = NULL;
return STATUS_SUCCESS;
}
-NTSTATUS
+NTSTATUS
CmiAddValueToKey(IN PREGISTRY_FILE RegistryFile,
- IN PKEY_BLOCK KeyBlock,
- IN PCHAR ValueNameBuf,
+ IN PKEY_BLOCK KeyBlock,
+ IN PCHAR ValueNameBuf,
OUT PVALUE_BLOCK *pValueBlock,
OUT BLOCK_OFFSET *pVBOffset)
{
- NTSTATUS Status;
- PVALUE_LIST_BLOCK ValueListBlock, NewValueListBlock;
- BLOCK_OFFSET VBOffset;
- BLOCK_OFFSET VLBOffset;
- PVALUE_BLOCK NewValueBlock;
+ NTSTATUS Status;
+ PVALUE_LIST_BLOCK ValueListBlock, NewValueListBlock;
+ BLOCK_OFFSET VBOffset;
+ BLOCK_OFFSET VLBOffset;
+ PVALUE_BLOCK NewValueBlock;
Status = CmiAllocateValueBlock(RegistryFile,
&NewValueBlock,
{
return Status;
}
- ValueListBlock = CmiGetBlock(RegistryFile,
+ ValueListBlock = CmiGetBlock(RegistryFile,
KeyBlock->ValuesOffset,NULL);
if (ValueListBlock == NULL)
{
}
KeyBlock->ValuesOffset = VLBOffset;
}
- else if ( KeyBlock->NumberOfValues
- >= -(ValueListBlock->SubBlockSize-4)/sizeof(BLOCK_OFFSET))
+ else if (KeyBlock->NumberOfValues
+ >= ((LONG)(ValueListBlock->SubBlockSize-4))/(LONG)sizeof(BLOCK_OFFSET))
+// >= -(ValueListBlock->SubBlockSize-4)/sizeof(BLOCK_OFFSET))
{
+ DPRINT1("\n");
Status = CmiAllocateBlock(RegistryFile,
(PVOID) &NewValueListBlock,
sizeof(BLOCK_OFFSET) *
(KeyBlock->NumberOfValues +
- REG_VALUE_LIST_BLOCK_MULTIPLE),&VLBOffset);
+ REG_VALUE_LIST_BLOCK_MULTIPLE),
+ &VLBOffset);
if (!NT_SUCCESS(Status))
{
CmiDestroyValueBlock(RegistryFile,
- NewValueBlock,VBOffset);
- return Status;
+ NewValueBlock,
+ VBOffset);
+ return(Status);
}
RtlCopyMemory(&NewValueListBlock->Values[0],
&ValueListBlock->Values[0],
KeyBlock->ValuesOffset = VLBOffset;
ValueListBlock = NewValueListBlock;
}
+ DPRINT1("KeyBlock->NumberOfValues %d, ValueListBlock->SubBlockSize %d (%d %x)\n",
+ KeyBlock->NumberOfValues, ValueListBlock->SubBlockSize,
+ -(ValueListBlock->SubBlockSize-4)/sizeof(BLOCK_OFFSET),
+ -(ValueListBlock->SubBlockSize-4)/sizeof(BLOCK_OFFSET));
ValueListBlock->Values[KeyBlock->NumberOfValues] = VBOffset;
KeyBlock->NumberOfValues++;
CmiReleaseBlock(RegistryFile, ValueListBlock);
CmiReleaseBlock(RegistryFile, NewValueBlock);
*pValueBlock = NewValueBlock;
- return STATUS_SUCCESS;
+ return(STATUS_SUCCESS);
}
-NTSTATUS
+NTSTATUS
CmiDeleteValueFromKey(IN PREGISTRY_FILE RegistryFile,
IN PKEY_BLOCK KeyBlock,
IN PCHAR ValueName)
PVALUE_BLOCK CurValueBlock;
PHEAP_BLOCK pHeap;
- ValueListBlock = CmiGetBlock(RegistryFile,
+ ValueListBlock = CmiGetBlock(RegistryFile,
KeyBlock->ValuesOffset,NULL);
if (ValueListBlock == 0)
{
OUT BLOCK_OFFSET *HBOffset,
IN ULONG HashTableSize)
{
- NTSTATUS Status;
- ULONG NewHashSize;
- PHASH_TABLE_BLOCK NewHashBlock;
+ NTSTATUS Status;
+ ULONG NewHashSize;
+ PHASH_TABLE_BLOCK NewHashBlock;
Status = STATUS_SUCCESS;
*HashBlock = NULL;
return Status;
}
-PKEY_BLOCK
+PKEY_BLOCK
CmiGetKeyFromHashByIndex(PREGISTRY_FILE RegistryFile,
PHASH_TABLE_BLOCK HashBlock,
ULONG Index)
return KeyBlock;
}
-NTSTATUS
+NTSTATUS
CmiAddKeyToHashTable(PREGISTRY_FILE RegistryFile,
PHASH_TABLE_BLOCK HashBlock,
PKEY_BLOCK NewKeyBlock,
CmiDestroyBlock(PREGISTRY_FILE RegistryFile,
PVOID Block,BLOCK_OFFSET Offset)
{
- NTSTATUS Status;
- PHEAP_BLOCK pHeap;
+ NTSTATUS Status;
+ PHEAP_BLOCK pHeap;
Status = STATUS_SUCCESS;
ExFreePool(Block);
}
else
- {
- PFREE_SUB_BLOCK pFree = Block;
+ {
+ PFREE_SUB_BLOCK pFree = Block;
+
if (pFree->SubBlockSize <0)
pFree->SubBlockSize = -pFree->SubBlockSize;
CmiAddFree(RegistryFile,Block,Offset);
/* update time of heap */
if(RegistryFile->Filename && CmiGetBlock(RegistryFile, Offset,&pHeap))
ZwQuerySystemTime((PTIME) &pHeap->DateModified);
- /* FIXME : set first dword to block_offset of another free bloc ? */
+ /* FIXME : set first dword to block_offset of another free block ? */
/* FIXME : concatenate with previous and next block if free */
}
BLOCK_OFFSET BlockOffset,
OUT PHEAP_BLOCK * ppHeap)
{
- if( BlockOffset == 0 || BlockOffset == -1) return NULL;
+ if( BlockOffset == 0 || BlockOffset == -1)
+ return NULL;
if (RegistryFile->Filename == NULL)
{
}
else
{
- PHEAP_BLOCK pHeap;
+ PHEAP_BLOCK pHeap;
+
pHeap = RegistryFile->BlockList[BlockOffset/4096];
if(ppHeap) *ppHeap = pHeap;
return ((char *)pHeap
}
}
-void
+VOID
CmiLockBlock(PREGISTRY_FILE RegistryFile,
PVOID Block)
{
}
}
-void
+VOID
CmiReleaseBlock(PREGISTRY_FILE RegistryFile,
- PVOID Block)
+ PVOID Block)
{
if (RegistryFile->Filename != NULL)
{