IopStoreArcInformation

NTSTATUS __stdcall IopStoreArcInformation(_LOADER_PARAMETER_BLOCK *LoaderBlock){
  __int64 **v1; 
  int v2; 
  NTSTATUS v3; 
  __int64 *i; 
  CHAR *Pool_1; 
  __int64 v6; 
  UINT64 v7; 
  CHAR *v8; 
  CHAR *v9; 
  CHAR **v10; 
  PVOID *j; 
  PVOID *m; 
  PVOID *v14; 
  __int64 v15; 
  int v16; 
  PVOID *k; 
  v1 = (__int64 **)*((_QWORD *)LoaderBlock + 29);
  v2 = dword_140C19650;
  v3 = 0;
  qword_140D2D858 = (__int64)&IoArcTableListHead;
  IoArcTableListHead = &IoArcTableListHead;
  for( i = *v1; ; i = (__int64 *)*i )
  {
    if( i == (__int64 *)v1 )
    {
      for( j = (PVOID *)IoArcTableListHead; j != &IoArcTableListHead; j = (PVOID *)*j )
      {
        if( !*((_BYTE *)j + 36) && !*((_BYTE *)j + 72) )
        {
          v16 = *((_DWORD *)j + 8);
          for( k = (PVOID *)*j; k != &IoArcTableListHead; k = (PVOID *)*k )
          {
            if( !*((_BYTE *)k + 36) && !*((_BYTE *)k + 72) && v16 == *((_DWORD *)k + 8) )
            {
              *((_BYTE *)j + 72) = 1;
              *((_BYTE *)k + 72) = 1;
            }
          }
        }
      }
      if( v2 == 1 )
      {
        for( m = (PVOID *)IoArcTableListHead; m != &IoArcTableListHead; m = (PVOID *)*m )
        {
          if( *((_BYTE *)m + 76) && *((_BYTE *)m + 72) )
            IopAmbiguousSystemDisk = 1;
        }
      }
      return v3;
    }
    Pool_1 = IopVerifierExAllocatePool_1(NonPagedPoolNx, 0x50ui64);
    if( !Pool_1 )
      goto LABEL_27;
    v6 = -1i64;
    do
      ++v6;
    while( *(_BYTE *)(i[3] + v6) );
    v7 = v6 + 1;
    v8 = IopVerifierExAllocatePool_1(NonPagedPoolNx, v7);
    v9 = Pool_1;
    if( !v8 )
      break;
    memset((INT64)Pool_1, 0i64);
    *(_OWORD *)Pool_1 = *(_OWORD *)i;
    *((_OWORD *)Pool_1 + 1) = *((_OWORD *)i + 1);
    *((_OWORD *)Pool_1 + 2) = *((_OWORD *)i + 2);
    *((_OWORD *)Pool_1 + 3) = *((_OWORD *)i + 3);
    RtlStringCbCopyA(v8, v7, (PSTR)i[3]);
    *((_QWORD *)Pool_1 + 3) = v8;
    if( v2 == 1 && v7 >= 9 && !strnicmp(&v8[v7 - 9], "rdisk(0)", 8ui64) )
      Pool_1[76] = 1;
    v10 = (CHAR **)qword_140D2D858;
    if( *(PVOID **)qword_140D2D858 != &IoArcTableListHead )
LABEL_30:
      __fastfail(3u);
    *(_QWORD *)Pool_1 = &IoArcTableListHead;
    *((_QWORD *)Pool_1 + 1) = v10;
    *v10 = Pool_1;
    qword_140D2D858 = (__int64)Pool_1;
  }
  while( 1 )
  {
    ExFreePoolWithTag(v9, 0);
LABEL_27:
    v14 = (PVOID *)IoArcTableListHead;
    if( IoArcTableListHead == &IoArcTableListHead )
      return -1073741670;
    if( *((PVOID **)IoArcTableListHead + 1) != &IoArcTableListHead )
      goto LABEL_30;
    v15 = *(_QWORD *)IoArcTableListHead;
    if( *(PVOID *)(*(_QWORD *)IoArcTableListHead + 8i64) != IoArcTableListHead )
      goto LABEL_30;
    IoArcTableListHead = *(PVOID *)IoArcTableListHead;
    *(_QWORD *)(v15 + 8) = &IoArcTableListHead;
    ExFreePoolWithTag(v14[3], 0);
    v9 = (CHAR *)v14;
  }
}

Referenced by:

IoInitSystemPreDrivers