SC_GPT::ReadPartitionTable

__int64 __fastcall SC_GPT::ReadPartitionTable(SC_GPT *this, struct SC_DISK_LAYOUT **a2){
  __int64 v4; 
  unsigned int v5; 
  unsigned int v6; 
  int Header; 
  __int64 v8; 
  int v9; 
  unsigned int v10; 
  UINT64 v11; 
  VOID **v12; 
  VOID **v13; 
  struct _GPT_ENTRY *v14; 
  __int64 v16; 
  unsigned int v17; 
  char *v18; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  int v22; 
  struct _GPT_ENTRY *v23; 

  v23 = 0i64;
  v4 = *(_QWORD *)(*(_QWORD *)this + 256i64);
  *a2 = 0i64;
  v5 = 2 - ((*(_BYTE *)(*(_QWORD *)this + 192i64) & 1) != 0);
  v6 = 0;
  do
  {
    Header = SC_GPT::ReadHeader(this, v6, (struct GPT_HEADER *)v4);
    if( Header >= 0 )
    {
      Header = SC_GPT::ReadEntries(this, (struct GPT_HEADER *)v4, &v23);
      if( Header >= 0 )
        goto LABEL_6;
    }
    ++v6;
  }
  while( v6 < v5 );
  if( Header < 0 )
  {
LABEL_13:
    v14 = v23;
    goto LABEL_14;
  }
LABEL_6:
  v8 = *(_QWORD *)this;
  v9 = *(_DWORD *)(*(_QWORD *)this + 192i64);
  if( (v9 & 1) != 0 || v6 || *(_QWORD *)(v4 + 32) == *(_QWORD *)(v8 + 240) - 1i64 )
    v10 = v9 & 0xFFFFFFFD;
  else
    v10 = v9 | 2;
  *(_DWORD *)(v8 + 192) = v10;
  v11 = (unsigned int)(144 * *(_DWORD *)(v4 + 80) + 48);
  v12 = SC_ENV::Allocate(v11);
  v13 = v12;
  if( !v12 )
  {
    Header = -1073741670;
    goto LABEL_13;
  }
  memset(v12, 0i64, v11);
  v14 = v23;
  v16 = 0i64;
  *(_DWORD *)v13 = 1;
  v17 = 0;
  *(_OWORD *)(v13 + 1) = *(_OWORD *)(v4 + 56);
  v13[3] = (VOID *)(*(_QWORD *)(v4 + 40) << *(_DWORD *)(*(_QWORD *)this + 232i64));
  v13[4] = (VOID *)((*(_QWORD *)(v4 + 48) - *(_QWORD *)(v4 + 40) + 1i64) << *(_DWORD *)(*(_QWORD *)this + 232i64));
  for( *((_DWORD *)v13 + 10) = *(_DWORD *)(v4 + 80); v17 < *(_DWORD *)(v4 + 80); ++v17 )
  {
    v18 = (char *)v14 + 128 * (unsigned __int64)v17;
    v19 = *(_QWORD *)v18 - *(_QWORD *)&VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN.Data1;
    if( *(_QWORD *)v18 == *(_QWORD *)&VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN.Data1 )
      v19 = *((_QWORD *)v18 + 1) - *(_QWORD *)VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN.Data4;
    if( v19 )
    {
      v20 = 18 * v16;
      LODWORD(v13[v20 + 6]) = 1;
      v13[v20 + 7] = (VOID *)(*((_QWORD *)v18 + 4) << *(_DWORD *)(*(_QWORD *)this + 232i64));
      v21 = *((_QWORD *)v18 + 5) - *((_QWORD *)v18 + 4) + 1i64;
      v22 = *(_DWORD *)(*(_QWORD *)this + 232i64);
      LODWORD(v13[v20 + 9]) = -1;
      v13[v20 + 8] = (VOID *)(v21 << v22);
      v16 = (unsigned int)(v16 + 1);
      *(_OWORD *)&v13[v20 + 10] = *(_OWORD *)v18;
      *(_OWORD *)&v13[v20 + 12] = *((_OWORD *)v18 + 1);
      v13[v20 + 14] = (VOID *)*((_QWORD *)v18 + 6);
      *(_OWORD *)&v13[v20 + 15] = *(_OWORD *)(v18 + 56);
      *(_OWORD *)&v13[v20 + 17] = *(_OWORD *)(v18 + 72);
      *(_OWORD *)&v13[v20 + 19] = *(_OWORD *)(v18 + 88);
      *(_OWORD *)&v13[v20 + 21] = *(_OWORD *)(v18 + 104);
      v13[v20 + 23] = (VOID *)*((_QWORD *)v18 + 15);
    }
  }
  *((_DWORD *)v13 + 1) = v16;
  *a2 = (struct SC_DISK_LAYOUT *)v13;
LABEL_14:
  if( v14 )
    SC_ENV::Free(v14);
  return(unsigned int)Header;
}

Referenced by:

No references.