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.