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.