IopLiveDumpWriteDumpFile

INT64 __fastcall IopLiveDumpWriteDumpFile(INT64 a1){
  INT64 v1; 
  __int64 v2; 
  void *v3; 
  VOID *v5; 
  union _LARGE_INTEGER v6; 
  unsigned __int64 v7; 
  _ETHREAD *CurrentThread; 
  int SecureDumpHeader; 
  UINT64 v10; 
  MDL *v11; 
  UINT64 v12; 
  int v13; 
  UINT64 v14; 
  __int128 v15; 
  int v16; 
  __int128 v17; 
  __int64 v18; 
  union _LARGE_INTEGER v19; 
  UINT64 v20; 
  VOID *PoolWithTag; 
  UINT64 v22; 
  union _LARGE_INTEGER ByteOffset; 
  _ETHREAD *v25; 
  __int64 v26; 
  __int128 v27; 
  __int128 v28; 
  __int64 v29; 
  __int128 v30; 
  __int128 v31; 
  __int64 v32; 
  v1 = *(_QWORD *)(a1 + 560);
  v2 = a1 + 680;
  v3 = *(void **)(a1 + 64);
  v26 = 0i64;
  v5 = 0i64;
  v27 = 0i64;
  v29 = 0i64;
  v28 = 0i64;
  v32 = 0i64;
  v30 = 0i64;
  v31 = 0i64;
  if( *(_BYTE *)(a1 + 880) )
    v6.QuadPart = *(_QWORD *)(v1 + 8224) + *(unsigned int *)(a1 + 888);
  else
    v6 = *(union _LARGE_INTEGER *)(v1 + 8224);
  ByteOffset = v6;
  v7 = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v25 = CurrentThread;
  if( !*(_QWORD *)(a1 + 736) )
  {
LABEL_14:
    v12 = RtlNumberOfSetBitsEx((_RTL_BITMAP_EX *)(a1 + 544));
    v13 = *(_DWORD *)(a1 + 984);
    v14 = v12;
    if( v13 )
    {
      v15 = *(_OWORD *)(a1 + 960);
      *(_QWORD *)&v28 = *(_QWORD *)(a1 + 976);
      v29 = *(_QWORD *)(a1 + 56);
      *(_QWORD *)(a1 + 56) = &v27;
      v27 = v15;
      DWORD2(v28) = v13;
    }
    v16 = *(_DWORD *)(a1 + 936);
    if( v16 )
    {
      v17 = *(_OWORD *)(a1 + 912);
      *(_QWORD *)&v31 = *(_QWORD *)(a1 + 928);
      v32 = *(_QWORD *)(a1 + 56);
      *(_QWORD *)(a1 + 56) = &v30;
      v30 = v17;
      DWORD2(v31) = v16;
    }
    SecureDumpHeader = IopLiveDumpWriteSecondaryData(v3, a1 + 48, &ByteOffset, &v26);
    if( SecureDumpHeader < 0 )
      goto LABEL_29;
    v18 = *(unsigned int *)(a1 + 888);
    v19 = ByteOffset;
    *(_DWORD *)(v1 + 4176) |= 0x10u;
    *(_QWORD *)(v1 + 4000) = v19.QuadPart - v18;
    *(_QWORD *)(v1 + 8232) = v14;
    *(_DWORD *)(v1 + 0x2000) = 1347241043;
    *(_DWORD *)(v1 + 8196) = 1347245380;
    if( *(_BYTE *)(a1 + 880) )
    {
      v20 = *(unsigned int *)(a1 + 888);
      ByteOffset.QuadPart = v20;
      PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, v20, 0x706D644Cui64);
      v5 = PoolWithTag;
      if( !PoolWithTag )
      {
        SecureDumpHeader = -1073741670;
        goto LABEL_29;
      }
      SecureDumpHeader = SecureDump_Get_SecureDumpHeader(v1, (INT64)PoolWithTag, *(unsigned int *)(a1 + 888));
      if( SecureDumpHeader < 0 )
        goto LABEL_27;
    }
    else
    {
      ByteOffset.QuadPart = 0i64;
    }
    SecureDumpHeader = IopLiveDumpWriteBuffer(v3, (VOID *)v1, *(unsigned int *)(v1 + 8224), &ByteOffset);
    if( *(_BYTE *)(a1 + 880) )
    {
      v22 = *(unsigned int *)(a1 + 888);
      ByteOffset.QuadPart = 0i64;
      SecureDumpHeader = IopLiveDumpWriteBuffer(v3, v5, v22, &ByteOffset);
    }
LABEL_27:
    if( v5 )
      ExFreePoolWithTag(v5, 0);
    goto LABEL_29;
  }
  while( 1 )
  {
    SecureDumpHeader = IopLiveDumpCheckTermination(a1, (INT64)CurrentThread);
    if( SecureDumpHeader < 0 )
      break;
    v10 = v7 >= *(_QWORD *)(v2 + 56) - 1i64 ? (unsigned int)(*(_DWORD *)(v2 + 40) << 12) : (unsigned int)BufferChunkSizeInBytes;
    SecureDumpHeader = IopLiveDumpWriteBuffer(v3, *(VOID **)(*(_QWORD *)(v2 + 72) + 8 * v7), v10, &ByteOffset);
    if( SecureDumpHeader < 0 )
      break;
    v11 = *(MDL **)(*(_QWORD *)(v2 + 80) + 8 * v7);
    if( v11 )
    {
      MmFreePagesFromMdl(v11);
      ExFreePoolWithTag(*(PVOID *)(*(_QWORD *)(v2 + 80) + 8 * v7), 0);
      *(_QWORD *)(*(_QWORD *)(v2 + 80) + 8 * v7) = 0i64;
    }
    else
    {
      MmFreeIndependentPages(*(PVOID *)(*(_QWORD *)(v2 + 72) + 8 * v7), (unsigned int)BufferChunkSizeInBytes);
    }
    *(_QWORD *)(*(_QWORD *)(v2 + 72) + 8 * v7++) = 0i64;
    CurrentThread = v25;
    if( v7 >= *(_QWORD *)(v2 + 56) )
      goto LABEL_14;
  }
LABEL_29:
  IopLiveDumpFreeDumpBuffers(v2);
  return(unsigned int)SecureDumpHeader;
}

Referenced by:

IoCaptureLiveDump
IoWriteDeferredLiveDumpData