NtSetDriverEntryOrder
INT64 __fastcall NtSetDriverEntryOrder(UINT64 *Ids, UINT64 Count){
__int64 v2;
void *PoolWithTag;
_ETHREAD *CurrentThread;
char v7;
unsigned int v8;
char *v9;
unsigned int i;
_ETHREAD *v11;
unsigned int v12;
UINT64 Attributes;
v2 = (unsigned int)Count;
PoolWithTag = 0i64;
if( dword_140C19650 != 2 )
return 3221225474i64;
if( (unsigned int)Count > 0x3FFFFFFF )
return 3221225485i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = *((_BYTE *)CurrentThread + 562);
if( v7 && !SeSinglePrivilegeCheck(*(_QWORD *)&SeSystemEnvironmentPrivilege, *((_BYTE *)CurrentThread + 562)) )
return 3221225569i64;
if( (_DWORD)v2 )
{
v8 = 4 * v2;
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 2 * v2, 0x72766E45ui64);
if( !PoolWithTag )
return 3221225626i64;
if( v7 && v8 )
{
if( ((unsigned __int8)Ids & 3) != 0 )
ExRaiseDatatypeMisalignment();
v9 = (char *)Ids + v8;
if( (unsigned __int64)v9 > 0x7FFFFFFF0000i64 || v9 < (char *)Ids )
MEMORY[0x7FFFFFFF0000] = 0;
}
for( i = 0; i < (unsigned int)v2; ++i )
{
if( *((_DWORD *)Ids + i) > 0xFFFFu )
{
ExFreePoolWithTag(PoolWithTag, 0);
return 3221225485i64;
}
*((_WORD *)PoolWithTag + i) = *((_WORD *)Ids + 2 * i);
}
}
v11 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v11 + 242);
ExAcquireFastMutexUnsafe(&ExpEnvironmentLock);
LODWORD(Attributes) = 1;
v12 = IoSetEnvironmentVariableEx(
(WCHAR *)L"DriverOrder",
(GUID *)&EfiDriverVariablesGuid,
PoolWithTag,
(unsigned int)(2 * v2),
Attributes);
ExReleaseFastMutexUnsafe(&ExpEnvironmentLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( v12 == -1073741568 )
v12 = 0;
if( PoolWithTag )
ExFreePoolWithTag(PoolWithTag, 0);
return v12;
}Referenced by:
No references.