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.