RtlpGetSetBootStatusData
NTSTATUS __stdcall RtlpGetSetBootStatusData(_HANDLE FileHandle, INT64 a2, INT64 a3){
VOID *v3;
VOID *v4;
int v5;
char v6;
VOID *v7;
NTSTATUS result;
int v9;
__int64 Length;
size_t Size;
unsigned int Buffer;
_LARGE_INTEGER ByteOffset;
_IO_STATUS_BLOCK IoStatusBlock;
_IO_STATUS_BLOCK v15;
size_t v16;
_DWORD *v17;
Buffer = 0;
v4 = v3;
Size = 0;
v5 = a3;
ByteOffset.QuadPart = 0i64;
v6 = a2;
v7 = *(VOID **)&FileHandle;
IoStatusBlock = 0i64;
v15 = 0i64;
result = ZwReadFile(FileHandle, 0, 0i64, 0i64, &IoStatusBlock, &Buffer, 4u, &ByteOffset, 0i64);
if( result >= 0 )
{
result = RtlBootStatusItemInfo(v5, &ByteOffset, &Size);
v9 = result;
if( result >= 0 )
{
ByteOffset.anonymous_0.HighPart = 0;
Length = Size;
if( Size + (unsigned __int64)ByteOffset.anonymous_0.LowPart > Buffer )
{
return -1073741735;
}
else if( v16 < Size )
{
return -1073741789;
}
else
{
if( v6 )
{
if( BootStatFileHandleAcquired && *(VOID **)&BootStatFileHandle == v7 && BootStatDataCache )
{
IoStatusBlock.Information = Size;
memmove(v4, (char *)BootStatDataCache + ByteOffset.anonymous_0.LowPart, Size);
}
else
{
v9 = ZwReadFile((_HANDLE)v7, 0, 0i64, 0i64, &IoStatusBlock, v4, Size, &ByteOffset, 0i64);
}
}
else
{
if( BootStatFileHandleAcquired && *(VOID **)&BootStatFileHandle == v7 && BootStatDataCache )
memmove((char *)BootStatDataCache + ByteOffset.anonymous_0.LowPart, v4, Size);
v9 = ZwWriteFile((_HANDLE)v7, 0, 0i64, 0i64, &IoStatusBlock, v4, Length, &ByteOffset, 0i64);
if( v9 >= 0 && !BootStatDisableFlush )
v9 = ZwFlushBuffersFile(v7, &v15);
RtlpRecordBootStatusData(1, (__int64)v4, ByteOffset.QuadPart, Length);
}
if( v9 >= 0 )
{
if( v17 )
*v17 = IoStatusBlock.Information;
}
return v9;
}
}
}
return result;
}Referenced by:
RtlGetSetBootStatusData