MiBuildImportsForBootDrivers

NTSTATUS __stdcall MiBuildImportsForBootDrivers(){
  INT64 v0; 
  int v1; 
  unsigned int v2; 
  INT64 v3; 
  INT64 v4; 
  PVOID v5; 
  __int16 v6; 
  char *Pool; 
  INT64 i; 
  unsigned __int64 *v9; 
  unsigned __int64 v10; 
  unsigned int v11; 
  unsigned __int64 v12; 
  unsigned int j; 
  unsigned int v14; 
  __int64 v15; 
  __int64 *v16; 
  __int64 v17; 
  __int64 v18; 
  _QWORD *v19; 
  unsigned int v20; 
  char *v21; 
  __int64 v22; 
  __int64 v23; 
  INT64 v24; 
  unsigned int v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  INT64 k; 
  void *v30; 
  UINT64 Size; 
  INT64 *v32; 

  v0 = PsLoadedModuleList;
  v1 = 0;
  v32 = &PsLoadedModuleList;
  LODWORD(Size) = 0;
  v2 = 0;
  v3 = 0i64;
  v4 = 0i64;
  if( (INT64 *)PsLoadedModuleList == &PsLoadedModuleList )
    return -1073741275;
  do
  {
    v5 = *(PVOID *)(v0 + 48);
    if( (PVOID)PsNtosImageBase == v5 )
    {
      v3 = v0;
    }
    else if( PsHalImageBase == v5 )
    {
      v4 = v0;
    }
    v6 = (*(_DWORD *)(v0 + 104) & 0x4000000) == 0 || v0 == v4 || v0 == v3;
    *(_WORD *)(v0 + 108) = v6;
    ++v2;
    *(_QWORD *)(v0 + 136) = 1i64;
    v0 = *(_QWORD *)v0;
  }
  while( (INT64 *)v0 != &PsLoadedModuleList );
  if( !v3 || !v4 )
    return -1073741275;
  Pool = (char *)MiAllocatePool(256i64, 8i64 * v2, 0x54446D4Dui64);
  if( Pool )
  {
    for( i = PsLoadedModuleList; (INT64 *)i != &PsLoadedModuleList; i = *(_QWORD *)i )
    {
      v9 = (unsigned __int64 *)RtlImageDirectoryEntryToData(*(VOID **)(i + 48), 1u, 0xCu, &Size);
      if( !v9 )
        goto LABEL_15;
      memset(Pool, 0i64, 8 * v2);
      v10 = 0i64;
      v11 = (unsigned int)Size >> 3;
      v12 = 0i64;
      for( j = 0; j < v11; ++v9 )
      {
        if( !v10 || *v9 < v10 || *v9 >= v12 )
        {
          v24 = PsLoadedModuleList;
          v25 = 0;
          if( (INT64 *)PsLoadedModuleList != &PsLoadedModuleList )
          {
            v26 = *v9;
            while( 1 )
            {
              v10 = *(_QWORD *)(v24 + 48);
              v12 = v10 + *(unsigned int *)(v24 + 64);
              if( v26 >= v10 && v26 < v12 )
                break;
              v24 = *(_QWORD *)v24;
              ++v25;
              if( (INT64 *)v24 == v32 )
                goto LABEL_40;
            }
            *(_QWORD *)&Pool[8 * v25] = v24;
          }
LABEL_40:
          v27 = *v9;
          if( *v9 < v10 || v27 >= v12 )
          {
            if( v27 )
              goto LABEL_59;
            v10 = 0i64;
          }
        }
        ++j;
      }
      LODWORD(Size) = 0;
      v14 = 0;
      v15 = 0i64;
      if( !v2 )
        goto LABEL_15;
      v16 = (__int64 *)Pool;
      v17 = v2;
      do
      {
        v18 = *v16;
        if( *v16 && v18 != v3 && v18 != i && v18 != v4 )
        {
          v15 = *v16;
          ++v14;
        }
        ++v16;
        --v17;
      }
      while( v17 );
      LODWORD(Size) = v14;
      if( v14 )
      {
        if( v14 == 1 )
        {
          *(_QWORD *)(i + 136) = v15 | 1;
          ++*(_WORD *)(v15 + 108);
        }
        else
        {
          if( v14 > 0x1FFFFFFE || (v19 = MiAllocatePool(256i64, 8 * v14 + 8, 0x54446D4Dui64)) == 0i64 )
          {
LABEL_59:
            v1 = 1;
            break;
          }
          v20 = 0;
          *v19 = v14;
          v21 = Pool;
          v22 = v2;
          do
          {
            v23 = *(_QWORD *)v21;
            if( *(_QWORD *)v21 && v23 != v3 && v23 != i && v23 != v4 )
            {
              v19[v20 + 1] = v23;
              ++*(_WORD *)(*(_QWORD *)v21 + 108i64);
              ++v20;
            }
            v21 += 8;
            --v22;
          }
          while( v22 );
          *(_QWORD *)(i + 136) = v19;
        }
      }
      else
      {
LABEL_15:
        *(_QWORD *)(i + 136) = -2i64;
      }
    }
    ExFreePoolWithTag(Pool, 0);
    *(_QWORD *)(v3 + 136) = 1i64;
    *(_QWORD *)(v4 + 136) = 1i64;
    if( v1 != 1 )
      return 0;
    for( k = PsLoadedModuleList; (INT64 *)k != &PsLoadedModuleList; k = *(_QWORD *)k )
    {
      v30 = *(void **)(k + 136);
      if( v30 != (void *)1 && v30 != (void *)-2i64 && ((unsigned __int8)v30 & 1) == 0 )
        ExFreePoolWithTag(v30, 0);
      *(_QWORD *)(k + 136) = 1i64;
      *(_WORD *)(k + 108) = 1;
    }
  }
  return -1073741670;
}

Referenced by:

MiInitializeLoadedModuleList