NtQueryBootEntryOrder
INT64 __fastcall NtQueryBootEntryOrder(UINT64 *Ids, UINT64 *Count){
INT64 result;
INT8 v5;
__int64 v6;
unsigned int v7;
_ETHREAD *v8;
int EnvironmentVariable;
unsigned int v10;
__int64 v11;
unsigned __int16 *v12;
_DWORD *i;
unsigned int v14;
PVOID Value;
PVOID P;
_ETHREAD *CurrentThread;
UINT64 Length;
Value = 0i64;
LODWORD(Length) = 0;
P = 0i64;
if( dword_140C19650 != 2 )
return 3221225474i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v5 = *((_BYTE *)CurrentThread + 562);
if( v5 )
{
v6 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)Count < 0x7FFFFFFF0000i64 )
v6 = (__int64)Count;
*(_DWORD *)v6 = *(_DWORD *)v6;
v7 = 4 * *(_DWORD *)Count;
LODWORD(Length) = v7;
if( !Ids )
{
LODWORD(Length) = 0;
v7 = 0;
}
if( v7 )
ProbeForWrite(Ids, v7, 4ui64);
if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeSystemEnvironmentPrivilege, v5) )
return 3221225569i64;
}
else
{
LODWORD(Length) = Ids != 0i64 ? 4 * *(_DWORD *)Count : 0;
}
if( !(_DWORD)Length
|| (result = ExLockUserBuffer(Ids, (unsigned int)Length, v5, IoWriteAccess, &Value, &P), (int)result >= 0) )
{
LODWORD(Length) = (unsigned int)Length >> 1;
v8 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v8 + 242);
ExAcquireFastMutexUnsafe(&ExpEnvironmentLock);
EnvironmentVariable = IoGetEnvironmentVariableEx(
(WCHAR *)L"BootOrder",
(GUID *)&EfiBootVariablesGuid,
Value,
&Length,
0i64);
ExReleaseFastMutexUnsafe(&ExpEnvironmentLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( EnvironmentVariable < 0 )
{
if( EnvironmentVariable == -1073741568 )
{
LODWORD(Length) = 0;
EnvironmentVariable = 0;
}
}
else
{
v10 = (unsigned int)Length >> 1;
v11 = ((unsigned int)Length >> 1) - 1;
v12 = (unsigned __int16 *)((char *)Value + 2 * v11);
for( i = (char *)Value + 4 * v11; v10; --v10 )
*i-- = *v12--;
}
v14 = 2 * Length;
LODWORD(Length) = 2 * Length;
if( P )
{
ExUnlockUserBuffer(P);
v14 = Length;
}
*(_DWORD *)Count = v14 >> 2;
return(unsigned int)EnvironmentVariable;
}
return result;
}Referenced by:
No references.