DbgkCaptureLiveDump

INT64 __fastcall DbgkCaptureLiveDump(INT64 a1, INT64 a2, UINT64 a3, INT64 a4){
  unsigned int v4; 
  REGHANDLE v7; 
  struct _DMA_ADAPTER *v8; 
  void *v9; 
  _DWORD *PoolWithTag; 
  UINT64 v11; 
  int v12; 
  __int64 v13; 
  int v14; 
  unsigned int i; 
  __int64 v16; 
  __int64 v17; 
  __int64 v18; 
  void *v19; 
  NTSTATUS v20; 
  UINT64 v21; 
  int v22; 
  char v23; 
  void *v24; 
  int v25; 
  UINT64 v26; 
  KPROCESSOR_MODE AccessMode; 
  char v29; 
  ULONGLONG RegHandle; 
  PVOID Object; 
  _QWORD *v32; 
  __int128 v33; 
  INT64 v34; 
  INT64 result[1280]; 
  __int128 v36[2]; 
  PVOID P[2]; 
  __int64(__fastcall *v38[6])(__int64, int, __int64, __int64, __int64, __int64); 
  INT64 v39[2]; 
  v4 = a3;
  v34 = a4;
  v7 = 0i64;
  AccessMode = *((_BYTE *)KeGetCurrentThread() + 562);
  v8 = 0i64;
  v9 = 0i64;
  memset((INT64)result, 0i64);
  PoolWithTag = 0i64;
  v32 = 0i64;
  *(_OWORD *)v39 = 0i64;
  RegHandle = 0i64;
  v33 = 0i64;
  if( !*(_DWORD *)(a1 + 44) || v4 < 0x40000 || (*(_DWORD *)a1 & 0xFFFFFFFE) != 0 )
    return 3221225485i64;
  if( DbgkpLkmdSqmIsOptedIn() )
  {
    EtwRegister(&stru_1400100F8, 0i64, 0i64, &RegHandle);
    v7 = RegHandle;
    if( RegHandle )
      DbgkpLkmdSqmIncrementDword(RegHandle, 0xCDCui64, v11);
  }
  memset(v36, 0, sizeof(v36));
  *(_OWORD *)P = 0i64;
  v12 = DbgkpTriageDumpInitialize((__int64)v36, a2, v4, v38);
  v13 = 0i64;
  v14 = v12;
  if( v12 >= 0 )
  {
    v14 = v38[0](
            (__int64)v36,
            *(_DWORD *)(a1 + 4),
            *(_QWORD *)(a1 + 8),
            *(_QWORD *)(a1 + 16),
            *(_QWORD *)(a1 + 24),
            *(_QWORD *)(a1 + 32));
    if( v14 >= 0 )
    {
      DbgkpLkmdSnapGlobals((__int64)result);
      LODWORD(RegHandle) = 4 * *(_DWORD *)(a1 + 44) + 4;
      PoolWithTag = ExAllocatePoolWithTag(PagedPool, (unsigned int)RegHandle, 0x704E534Bui64);
      if( PoolWithTag )
      {
        for( i = 0; i < *(_DWORD *)(a1 + 44); PoolWithTag[v16] = -1073741823 )
          v16 = i++;
        PoolWithTag[i] = 1112752980;
      }
      v14 = -1073741790;
      v29 = 1;
      if( *(_DWORD *)(a1 + 44) )
      {
        while( 1 )
        {
          v17 = *(_QWORD *)(a1 + 48);
          v18 = (unsigned int)(v13 + *(_DWORD *)(a1 + 40));
          v39[1] = 0i64;
          v39[0] = 3221225473i64;
          v19 = *(void **)(v17 + 8 * v18);
          Object = 0i64;
          v20 = ObReferenceObjectByHandle(v19, 0x1FFFFFu, (POBJECT_TYPE)PsThreadType, AccessMode, &Object, 0i64);
          v8 = (struct _DMA_ADAPTER *)Object;
          v22 = v20;
          v23 = v29;
          if( v22 != -1073741790 )
            v23 = 0;
          v29 = v23;
          if( v22 >= 0 )
          {
            if( !v9 )
            {
              IoThreadToProcess((_ETHREAD *)Object);
              v9 = v24;
              if( v24 )
              {
                ObfReferenceObjectWithTag(v24, 0x4C676244u);
                DbgkpLkmdSnapDataEx((INT64)result);
              }
            }
            v25 = DbgkpLkmdSnapThread((INT64)result, a1, (INT64)v8, (INT64)v39);
            if( !v25 )
              v25 = v39[0];
            if( PoolWithTag )
              PoolWithTag[v13] = v25;
            DbgkpLkmdFireCallbacks((INT64)result, 2i64, (INT64)v8);
            if( v7 )
              DbgkpLkmdSqmStatus(v7, (int *)v39, v26);
            HalPutDmaAdapter(v8);
            v8 = 0i64;
            if( LODWORD(v39[0]) == -1073741670 )
            {
LABEL_32:
              if( !v29 )
              {
                if( v9 )
                  DbgkpLkmdFireCallbacks((INT64)result, 1i64, (INT64)v9);
                LODWORD(v33) = *(_DWORD *)(a1 + 44);
                *((_QWORD *)&v33 + 1) = PoolWithTag;
                DbgkpLkmdSnapData((__int64)result, (__int64)&v33, 16i64);
                if( PoolWithTag )
                  DbgkpLkmdSnapData((__int64)result, (__int64)PoolWithTag, (unsigned int)RegHandle);
                if( (int)DbgkpLkmdSnapDataEx((INT64)result) >= 0 )
                  *v32 = &v33;
                v14 = ((__int64(__fastcall *)(__int128 *, INT64))v38[5])(v36, v34);
              }
              break;
            }
          }
          else
          {
            if( PoolWithTag )
              PoolWithTag[v13] = v22;
            if( v7 )
            {
              LODWORD(v39[0]) = v22;
              DbgkpLkmdSqmStatus(v7, (int *)v39, v21);
            }
          }
          v13 = (unsigned int)(v13 + 1);
          if( (unsigned int)v13 >= *(_DWORD *)(a1 + 44) )
            goto LABEL_32;
        }
      }
      if( v9 )
        ObfDereferenceObjectWithTag(v9, 0x4C676244ui64);
      if( v8 )
        HalPutDmaAdapter(v8);
    }
  }
  if( P[0] )
    ExFreePoolWithTag(P[0], 0x4D574454u);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0x704E534Bu);
  if( v7 )
    EtwUnregister(v7);
  return(unsigned int)v14;
}

Referenced by:

NtSystemDebugControl