SC_GPT::WritePartitionTable
__int64 __fastcall SC_GPT::WritePartitionTable(SC_GPT *this, struct SC_DISK_LAYOUT *a2, char a3){
__int64 v3;
__int64 v6;
int v7;
unsigned int v8;
unsigned int v9;
unsigned int v10;
unsigned __int64 v11;
unsigned int v12;
int v13;
int Header;
unsigned int v15;
__int64 v16;
__int64 v17;
unsigned int v18;
__int64 v19;
UINT64 v20;
VOID **v21;
VOID **v22;
__int64 v23;
__int64 v24;
UINT64 v25;
__int64 v26;
__int64 v27;
int v28;
__int64 v29;
struct _GUID *v30;
__int64 v31;
unsigned __int64 v32;
unsigned int v33;
__int64 v34;
unsigned int v35;
__int128 *v36;
__int64 v37;
unsigned __int64 v38;
__int64 v39;
VOID *v40;
__int128 v41;
UINT8 *v42;
int v43;
__int64 v44;
__int64 v45;
__int64 v46;
UINT64 v47;
__int64 v48;
int v50;
int v51;
unsigned __int64 v52;
unsigned __int64 v53;
UINT8 *Buffer;
int v55;
unsigned int v57;
v3 = *(_QWORD *)this;
v51 = 0;
v6 = *(_QWORD *)(*(_QWORD *)this + 256i64);
if( a3 )
{
if( *(_WORD *)(v6 + 510) == 0xAA55 )
v51 = *(_DWORD *)(v6 + 440);
v7 = 128;
v50 = 128;
if( *((_DWORD *)a2 + 10) > 0x80u )
v7 = *((_DWORD *)a2 + 10);
v8 = -*(_DWORD *)(v3 + 228) & ((v7 << 7) + *(_DWORD *)(v3 + 228) - 1);
v9 = v8 >> *(_DWORD *)(v3 + 232);
v10 = v8 >> 7;
v11 = v9 + 2;
}
else
{
v12 = 2 - ((*(_BYTE *)(v3 + 192) & 1) != 0);
v13 = 0;
while( 1 )
{
Header = SC_GPT::ReadHeader(this, v13, (struct GPT_HEADER *)v6);
if( Header >= 0 )
break;
if( ++v13 >= v12 )
return(unsigned int)Header;
}
v3 = *(_QWORD *)this;
v10 = *(_DWORD *)(v6 + 80);
v11 = *(_QWORD *)(v6 + 40);
v50 = *(_DWORD *)(v6 + 84);
v8 = -*(_DWORD *)(*(_QWORD *)this + 228i64) & (v50 * v10 + *(_DWORD *)(*(_QWORD *)this + 228i64) - 1);
v9 = v8 >> *(_DWORD *)(*(_QWORD *)this + 232i64);
}
v15 = *((_DWORD *)a2 + 1);
v57 = v10;
v52 = v11;
if( v15 <= v10 )
{
v16 = 0i64;
if( v15 )
{
while( 1 )
{
v17 = *((_QWORD *)a2 + 18 * v16 + 10) - PARTITION_LEGACY_BL_GUID;
if( !v17 )
v17 = *((_QWORD *)a2 + 18 * v16 + 11) - *((_QWORD *)&PARTITION_LEGACY_BL_GUID + 1);
if( !v17 )
break;
v16 = (unsigned int)(v16 + 1);
if( (unsigned int)v16 >= v15 )
{
v3 = *(_QWORD *)this;
goto LABEL_20;
}
}
v3 = *(_QWORD *)this;
}
else
{
LABEL_20:
LODWORD(v16) = -1;
}
if( (_DWORD)v16 != -1 )
{
v3 = *(_QWORD *)this;
v18 = *(_DWORD *)(*(_QWORD *)this + 228i64);
v19 = *((_QWORD *)a2 + 18 * (unsigned int)v16 + 8);
if( v18 )
v19 /= (__int64)v18;
if( v11 < (unsigned __int64)v9 + v19 + 2 )
{
v11 = v9 + v19 + 2;
v52 = v11;
}
}
if( (*(_DWORD *)(v3 + 192) & 1) != 0 )
v53 = *(_QWORD *)(v3 + 240) - 1i64;
else
v53 = *(_QWORD *)(v3 + 240) - v9 - 2i64;
v20 = (2 << *(_DWORD *)(v3 + 232)) + v8;
v21 = SC_ENV::Allocate(v20);
v22 = v21;
if( !v21 )
return(unsigned int)-1073741670;
memset(v21, 0i64, v20);
v23 = 0i64;
v55 = 0;
v24 = 1 << *(_DWORD *)(*(_QWORD *)this + 232i64);
v25 = (UINT64)v22 + v20 - v24;
Buffer = (UINT8 *)v22 + v24;
if( *((_DWORD *)a2 + 1) )
{
v26 = (__int64)v22 + v24 + 32;
while( 1 )
{
v27 = 144 * v23;
v28 = *((_DWORD *)a2 + 36 * v23 + 12);
if( v28 )
{
if( v28 == 1 )
{
v29 = *(_QWORD *)((char *)a2 + v27 + 80) - *(_QWORD *)&VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN.Data1;
if( !v29 )
v29 = *(_QWORD *)((char *)a2 + v27 + 88) - *(_QWORD *)VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN.Data4;
if( !v29 )
goto LABEL_52;
}
}
else if( !*((_BYTE *)a2 + v27 + 80) )
{
goto LABEL_52;
}
v30 = (struct _GUID *)((char *)a2 + v27 + 96);
v31 = *(_QWORD *)&v30->Data1 - *(_QWORD *)&VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN.Data1;
if( *(_QWORD *)&v30->Data1 == *(_QWORD *)&VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN.Data1 )
v31 = *(_QWORD *)v30->Data4 - *(_QWORD *)VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN.Data4;
if( !v31 )
{
SC_ENV::CreateGuid(v30);
LODWORD(v23) = v55;
v30 = (struct _GUID *)((char *)a2 + v27 + 96);
}
*(_OWORD *)(v26 - 32) = *(_OWORD *)((char *)a2 + v27 + 80);
*(struct _GUID *)(v26 - 16) = *v30;
v32 = *(_QWORD *)((char *)a2 + v27 + 56);
v33 = *(_DWORD *)(*(_QWORD *)this + 228i64);
if( v33 )
v32 = (__int64)v32 / v33;
*(_QWORD *)v26 = v32;
v34 = *(_QWORD *)((char *)a2 + v27 + 64) - 1i64 + *(_QWORD *)((char *)a2 + v27 + 56);
v35 = *(_DWORD *)(*(_QWORD *)this + 228i64);
if( v35 )
v34 /= (__int64)v35;
*(_QWORD *)(v26 + 8) = v34;
*(_QWORD *)(v26 + 16) = *(_QWORD *)((char *)a2 + v27 + 112);
*(_OWORD *)(v26 + 24) = *(_OWORD *)((char *)a2 + v27 + 120);
*(_OWORD *)(v26 + 40) = *(_OWORD *)((char *)a2 + v27 + 136);
*(_OWORD *)(v26 + 56) = *(_OWORD *)((char *)a2 + v27 + 152);
*(_OWORD *)(v26 + 72) = *(_OWORD *)((char *)a2 + v27 + 168);
*(_QWORD *)(v26 + 88) = *(_QWORD *)((char *)a2 + v27 + 184);
if( v32 < v52 || v34 > v53 )
{
Header = -1073741811;
goto LABEL_68;
}
v26 += 128i64;
LABEL_52:
v23 = (unsigned int)(v23 + 1);
v55 = v23;
if( (unsigned int)v23 >= *((_DWORD *)a2 + 1) )
{
v11 = v52;
break;
}
}
}
v36 = (__int128 *)((char *)a2 + 8);
v37 = *((_QWORD *)a2 + 1) - *(_QWORD *)&VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN.Data1;
if( !v37 )
v37 = *((_QWORD *)a2 + 2) - *(_QWORD *)VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN.Data4;
if( !v37 )
SC_ENV::CreateGuid((struct _GUID *)((char *)a2 + 8));
v38 = v53 - v11;
v39 = v9;
*((_QWORD *)a2 + 4) = (v38 + 1) << *(_DWORD *)(*(_QWORD *)this + 232i64);
*((_DWORD *)a2 + 10) = v57;
*v22 = (VOID *)0x5452415020494645i64;
v22[6] = (VOID *)v53;
v22[4] = (VOID *)(v9 + v53 + 1);
v22[5] = (VOID *)v52;
v40 = (VOID *)(v52 - v9);
*((_DWORD *)v22 + 2) = 0x10000;
*((_DWORD *)v22 + 3) = 92;
v22[3] = (VOID *)1;
v41 = *v36;
*((_DWORD *)v22 + 20) = v57;
v22[9] = v40;
*(_OWORD *)(v22 + 7) = v41;
*((_DWORD *)v22 + 21) = v50;
*((_DWORD *)v22 + 22) = RtlComputeCrc32(0i64, Buffer, v9 << *(_DWORD *)(*(_QWORD *)this + 232i64));
*((_DWORD *)v22 + 4) = RtlComputeCrc32(0i64, (UINT8 *)v22, 0x5Cui64);
v42 = (UINT8 *)v22;
if( v40 == (VOID *)2 )
{
v43 = v9 + 1;
v44 = 1i64;
++v9;
}
else
{
Header = SC_DISK::WriteSectors(*(SC_DISK **)this, 1, 1i64, v22);
if( Header < 0 )
{
LABEL_68:
SC_ENV::Free(v22);
return(unsigned int)Header;
}
v44 = (__int64)v22[9];
v43 = v9 + 1;
v42 = Buffer;
}
Header = SC_DISK::WriteSectors(*(SC_DISK **)this, v9, v44, v42);
if( Header >= 0 )
{
if( (*(_DWORD *)(*(_QWORD *)this + 192i64) & 1) != 0 )
goto LABEL_66;
*(_OWORD *)v25 = *(_OWORD *)v22;
*(_OWORD *)(v25 + 16) = *((_OWORD *)v22 + 1);
*(_OWORD *)(v25 + 32) = *((_OWORD *)v22 + 2);
*(_OWORD *)(v25 + 48) = *((_OWORD *)v22 + 3);
*(_OWORD *)(v25 + 64) = *((_OWORD *)v22 + 4);
*(_QWORD *)(v25 + 80) = v22[10];
*(_DWORD *)(v25 + 88) = *((_DWORD *)v22 + 22);
v45 = *(_QWORD *)(v25 + 32);
v46 = *(_QWORD *)(v25 + 24);
v47 = *(unsigned int *)(v25 + 12);
*(_DWORD *)(v25 + 16) = 0;
*(_QWORD *)(v25 + 24) = v45;
v48 = v45 - v39;
*(_QWORD *)(v25 + 72) = v48;
*(_QWORD *)(v25 + 32) = v46;
*(_DWORD *)(v25 + 16) = RtlComputeCrc32(0i64, (UINT8 *)v25, v47);
Header = SC_DISK::WriteSectors(*(SC_DISK **)this, v43, v48, Buffer);
if( Header >= 0 )
{
LABEL_66:
*(_DWORD *)(*(_QWORD *)this + 192i64) &= ~2u;
if( a3 )
{
memset((VOID *)v6, 0i64, 0x200u);
*(_DWORD *)(v6 + 458) = -1;
*(_DWORD *)(v6 + 440) = v51;
*(_BYTE *)(v6 + 450) = -18;
*(_DWORD *)(v6 + 454) = 1;
MBR_ENTRY::ComputeChs((MBR_ENTRY *)(v6 + 446), (struct _DISK_GEOMETRY *)(*(_QWORD *)this + 208i64));
*(_WORD *)(v6 + 510) = -21931;
Header = SC_DISK::WriteSectors(*(SC_DISK **)this, 1, 0i64, 0i64);
}
}
}
goto LABEL_68;
}
return(unsigned int)-1073741811;
}Referenced by:
No references.