|
Navigation
- Home
- Community
- Development
- myReactOS
- Fundraiser 2012
Doxygen
- Main Page
- Alphabetical List
- Data Structures
- Directories
- File List
- Data Fields
- Globals
- Related Pages
Search
|
|
|
Definition at line 19 of file cminit.c.
Referenced by CmInitSystem1(), CmpInitHiveFromFile(), and CmpInitializeSystemHive().
{
PCMHIVE Hive;
FILE_STANDARD_INFORMATION FileInformation;
IO_STATUS_BLOCK IoStatusBlock;
FILE_FS_SIZE_INFORMATION FileSizeInformation;
NTSTATUS Status;
ULONG Cluster;
*RegistryHive = NULL;
if (((External) && ((Primary) || (Log))) ||
((Log) && !(Primary)) ||
((HiveFlags & HIVE_VOLATILE) && ((Primary) || (External) || (Log))) ||
((OperationType == HINIT_MEMORY) && (!HiveData)) ||
((Log) && (FileType != HFILE_TYPE_LOG)))
{
return STATUS_INVALID_PARAMETER;
}
if (Primary)
{
Status = ZwQueryVolumeInformationFile(Primary,
&IoStatusBlock,
&FileSizeInformation,
sizeof(FILE_FS_SIZE_INFORMATION),
FileFsSizeInformation);
if (!NT_SUCCESS(Status)) return Status;
if (FileSizeInformation.BytesPerSector > HBLOCK_SIZE)
{
return STATUS_REGISTRY_IO_FAILED;
}
Cluster = FileSizeInformation.BytesPerSector / HSECTOR_SIZE;
Cluster = max(1, Cluster);
}
else
{
Cluster = 1;
}
Hive = ExAllocatePoolWithTag(NonPagedPool, sizeof(CMHIVE), TAG_CM);
if (!Hive) return STATUS_INSUFFICIENT_RESOURCES;
Hive->UnloadEvent = NULL;
Hive->RootKcb = NULL;
Hive->Frozen = FALSE;
Hive->UnloadWorkItem = NULL;
Hive->GrowOnlyMode = FALSE;
Hive->GrowOffset = 0;
Hive->CellRemapArray = NULL;
Hive->UseCountLog.Next = 0;
Hive->LockHiveLog.Next = 0;
Hive->FileObject = NULL;
Hive->NotifyList.Flink = NULL;
Hive->NotifyList.Blink = NULL;
Hive->HiveIsLoading = TRUE;
Hive->CreatorOwner = KeGetCurrentThread();
InitializeListHead(&Hive->KcbConvertListHead);
InitializeListHead(&Hive->KnodeConvertListHead);
InitializeListHead(&Hive->TrustClassEntry);
Hive->ViewLock = ExAllocatePoolWithTag(NonPagedPool,
sizeof(KGUARDED_MUTEX),
TAG_CM);
if (!Hive->ViewLock) return STATUS_INSUFFICIENT_RESOURCES;
Hive->FlusherLock = ExAllocatePoolWithTag(NonPagedPool,
sizeof(ERESOURCE),
TAG_CM);
if (!Hive->FlusherLock) return STATUS_INSUFFICIENT_RESOURCES;
Hive->FileHandles[HFILE_TYPE_PRIMARY] = Primary;
Hive->FileHandles[HFILE_TYPE_LOG] = Log;
Hive->FileHandles[HFILE_TYPE_EXTERNAL] = External;
KeInitializeGuardedMutex(Hive->ViewLock);
Hive->ViewLockOwner = NULL;
ExInitializeResourceLite(Hive->FlusherLock);
ExInitializePushLock(&Hive->HiveLock);
Hive->HiveLockOwner = NULL;
ExInitializePushLock(&Hive->WriterLock);
Hive->WriterLockOwner = NULL;
ExInitializePushLock(&Hive->SecurityLock);
Hive->HiveSecurityLockOwner = NULL;
RtlInitEmptyUnicodeString(&Hive->FileUserName, NULL, 0);
RtlInitEmptyUnicodeString(&Hive->FileFullPath, NULL, 0);
CmpInitHiveViewList(Hive);
CmpInitSecurityCache(Hive);
Hive->Flags = 0;
Hive->FlushCount = 0;
Hive->Flags = HiveFlags;
if (Primary)
{
ZwQueryInformationFile(Primary,
&IoStatusBlock,
&FileInformation,
sizeof(FileInformation),
FileStandardInformation);
Cluster = FileInformation.EndOfFile.LowPart;
}
Status = HvInitialize(&Hive->Hive,
OperationType,
FileType,
HiveFlags,
HiveData,
CmpAllocate,
CmpFree,
CmpFileSetSize,
CmpFileWrite,
CmpFileRead,
CmpFileFlush,
Cluster,
(PUNICODE_STRING)FileName);
if (!NT_SUCCESS(Status))
{
ExFreePool(Hive->ViewLock);
ExFreePool(Hive->FlusherLock);
ExFreePool(Hive);
return Status;
}
if ((OperationType == HINIT_FILE) ||
(OperationType == HINIT_MEMORY) ||
(OperationType == HINIT_MEMORY_INPLACE) ||
(OperationType == HINIT_MAPFILE))
{
if (CmCheckRegistry((PCMHIVE)Hive, TRUE))
{
ExFreePool(Hive->ViewLock);
ExFreePool(Hive->FlusherLock);
ExFreePool(Hive);
return STATUS_REGISTRY_CORRUPT;
}
}
ExAcquirePushLockExclusive(&CmpHiveListHeadLock);
InsertHeadList(&CmpHiveListHead, &Hive->HiveList);
ExReleasePushLock(&CmpHiveListHeadLock);
*RegistryHive = (PCMHIVE)Hive;
return STATUS_SUCCESS;
}
|
Generated on Sun May 27 2012 06:03:26 for ReactOS by
1.7.6.1
|