MiAddPartitionDataToCrashDump

__int64 __fastcall MiAddPartitionDataToCrashDump(__int64 (__fastcall **a1)(_QWORD, __int64, __int64)){
  unsigned int v1; 
  int v3; 
  unsigned int v4; 
  unsigned int v5; 
  int v6; 
  char *v7; 
  unsigned int v8; 
  unsigned int v9; 
  char *v10; 
  __int64 i; 
  unsigned __int64 v12; 
  unsigned int SizeOfBitMap; 
  unsigned int v14; 
  v1 = 0;
  v3 = MmAddRangeToCrashDump(a1, qword_140C4E388, 8i64);
  if( v3 >= 0 )
  {
    v3 = MmAddRangeToCrashDump(a1, (unsigned __int64)qword_140C4E368, 16i64);
    if( v3 >= 0 )
    {
      v3 = MmAddRangeToCrashDump(
             a1,
             (unsigned __int64)qword_140C4E368->Buffer,
             8
           * (((unsigned __int64)qword_140C4E368->SizeOfBitMap >> 6) + ((qword_140C4E368->SizeOfBitMap & 0x3F) != 0)));
      if( v3 >= 0 )
      {
        do
        {
          v4 = v1 < qword_140C4E368->SizeOfBitMap ? v1 : 0;
          v5 = qword_140C4E368->SizeOfBitMap - 1;
          v6 = ((__int64)qword_140C4E368->Buffer & 4) != 0i64 ? 0x20 : 0;
          v7 = (char *)qword_140C4E368->Buffer - (((__int64)qword_140C4E368->Buffer & 4) != 0 ? 4 : 0);
          while( 1 )
          {
            v8 = v6 + v5;
            if( v5 - v4 == -1 )
              goto LABEL_6;
            v10 = &v7[8 * ((unsigned __int64)(v6 + v4) >> 6)];
            for( i = ~*(_QWORD *)v10 | ((1i64 << ((v6 + v4) & 0x3F)) - 1); i == -1; i = ~*(_QWORD *)v10 )
            {
              v10 += 8;
              if( v10 > &v7[8 * ((unsigned __int64)v8 >> 6)] )
                goto LABEL_6;
            }
            _BitScanForward64(&v12, ~i);
            v9 = v12 + ((unsigned int)((v10 - v7) >> 3) << 6);
            if( v9 > v8 )
            {
LABEL_6:
              v9 = -1;
            }
            else if( v9 != -1 )
            {
              break;
            }
            if( !v4 )
              break;
            SizeOfBitMap = v1 + 1;
            if( v1 + 1 > qword_140C4E368->SizeOfBitMap )
              SizeOfBitMap = qword_140C4E368->SizeOfBitMap;
            v5 = SizeOfBitMap - 1;
            v4 = 0;
          }
          v14 = v9 - v6;
          if( v9 == -1 )
            v14 = -1;
          if( v14 < v1 )
            break;
          if( v14 == -1 )
            break;
          v1 = v14 + 1;
          v3 = MiAddPartitionToCrashDump(a1, *(_QWORD *)(qword_140C4E388 + 8i64 * v14));
        }
        while( v3 >= 0 );
        if( v3 >= 0 )
        {
          if( qword_140C4E3A8 )
            v3 = MmAddRangeToCrashDump(
                   a1,
                   qword_140C4E3A8,
                   8 * (((unsigned __int64)qword_140C4E3A0 >> 6) + ((qword_140C4E3A0 & 0x3F) != 0)));
          if( v3 >= 0 && qword_140C4E3B0 )
            return(unsigned int)MmAddRangeToCrashDump(a1, qword_140C4E3B0, 0x200000i64);
        }
      }
    }
  }
  return(unsigned int)v3;
}

Referenced by:

MmAddPrivateDataToCrashDump