RtlLockBootStatusData
NTSTATUS __stdcall RtlLockBootStatusData(VOID **BootStatusDataHandle){
WCHAR *v1;
int v3;
WCHAR v4;
UINT64 ShareAccess;
UINT64 OpenOptions;
_UNICODE_STRING DestinationString;
_IO_STATUS_BLOCK IoStatusBlock;
_OBJECT_ATTRIBUTES ObjectAttributes;
char v11;
VOID *FileHandle;
WCHAR *SourceString;
FileHandle = 0i64;
v1 = 0i64;
memset(&ObjectAttributes, 0, sizeof(ObjectAttributes));
SourceString = 0i64;
v3 = 0;
v11 = 0;
DestinationString = 0i64;
IoStatusBlock = 0i64;
RtlpAcquireBootStatusLock();
++BootStatReferenceCount;
if( BootStatFileHandleAcquired )
{
if( BootStatusDataHandle )
{
*BootStatusDataHandle = *(VOID **)&BootStatFileHandle;
goto LABEL_10;
}
goto LABEL_4;
}
RtlpGetBootStatusPath((const wchar_t **)&SourceString, &v11, v4);
v1 = SourceString;
RtlInitUnicodeString(&DestinationString, SourceString);
ObjectAttributes.RootDirectory = 0i64;
LODWORD(OpenOptions) = 32;
ObjectAttributes.ObjectName = &DestinationString;
ObjectAttributes.Length = 48;
ObjectAttributes.Attributes = 704;
LODWORD(ShareAccess) = 1;
*(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
v3 = ZwOpenFile(&FileHandle, 0x12019Fui64, &ObjectAttributes, &IoStatusBlock, ShareAccess, OpenOptions);
if( v3 < 0 )
{
*(_QWORD *)&BootStatFileHandle = 0i64;
BootStatReferenceCount = 0;
BootStatFileHandleAcquired = 0;
if( BootStatusDataHandle )
*BootStatusDataHandle = 0i64;
}
else
{
*(_QWORD *)&BootStatFileHandle = FileHandle;
BootStatFileHandleAcquired = 1;
RtlInitializeBootStatDataCache();
if( !BootStatusDataHandle )
{
LABEL_4:
BootStatKeepHandleOpen = 1;
goto LABEL_10;
}
*BootStatusDataHandle = FileHandle;
}
LABEL_10:
RtlpReleaseBootStatusLock();
if( v11 )
ExFreePoolWithTag(v1, 0);
return v3;
}Referenced by:
CmCompleteRegistryInitialization
PoClearTransitionMarker
PopBootStatCheckIntegrity
PopBootStatGet
PopBootStatSet