PfSnBuildDumpFromTrace

INT64 __fastcall PfSnBuildDumpFromTrace(CHAR **a1, INT64 a2){
  int v2; 
  CHAR **v4; 
  CHAR *PoolWithTag; 
  CHAR *v6; 
  _DWORD *v7; 
  UINT8 *v8; 
  __int64 *v9; 
  int v10; 
  UINT8 *v11; 
  unsigned int v12; 
  unsigned int v13; 
  int v14; 
  UINT64 v15; 
  unsigned int v16; 
  INT64 a3; 
  LODWORD(a3) = 0;
  v2 = 0;
  *a1 = 0i64;
  v4 = a1;
  if( *(int *)(a2 + 332) < 32 )
  {
    v16 = -1073741789;
    goto LABEL_11;
  }
  if( (*(_BYTE *)(a2 + 484) & 2) != 0 )
  {
    v16 = -1072103399;
LABEL_11:
    v6 = 0i64;
    goto LABEL_12;
  }
  PoolWithTag = (CHAR *)ExAllocatePoolWithTag(
                          PagedPool,
                          ((16 * (*(_DWORD *)(a2 + 120) + *(_DWORD *)(a2 + 344)) + 215) & 0xFFFFFFF8)
                        + 8 * (*(_DWORD *)(a2 + 480) + 2 * (*(_DWORD *)(a2 + 480) + 1)),
                          0x44506343ui64);
  *v4 = PoolWithTag;
  v6 = PoolWithTag;
  if( PoolWithTag )
  {
    memset((INT64)PoolWithTag, 0i64);
    v7 = v6 + 16;
    *((_DWORD *)v6 + 4) = 30;
    *((_DWORD *)v6 + 5) = 1128485697;
    v8 = (UINT8 *)((unsigned __int64)(v6 + 231) & 0xFFFFFFFFFFFFFFF8ui64);
    *(_OWORD *)(v6 + 28) = *(_OWORD *)(a2 + 24);
    *(_OWORD *)(v6 + 44) = *(_OWORD *)(a2 + 40);
    *(_OWORD *)(v6 + 60) = *(_OWORD *)(a2 + 56);
    *(_OWORD *)(v6 + 76) = *(_OWORD *)(a2 + 72);
    *((_DWORD *)v6 + 23) = *(_DWORD *)(a2 + 88);
    *((_QWORD *)v6 + 21) = *(_QWORD *)(a2 + 464);
    *((_QWORD *)v6 + 15) = *(_QWORD *)(a2 + 200);
    *((_DWORD *)v6 + 44) ^= (*((_DWORD *)v6 + 44) ^ *(unsigned __int16 *)(a2 + 484)) & 1;
    *((_DWORD *)v6 + 44) ^= ((unsigned __int8)*((_DWORD *)v6 + 44) ^ (unsigned __int8)(2 * *(_WORD *)(a2 + 486))) & 2;
    *((_DWORD *)v6 + 24) = (((_DWORD)v6 + 231) & 0xFFFFFFF8) - ((_DWORD)v6 + 16);
    v9 = *(__int64 **)(a2 + 104);
    if( v9 != (__int64 *)(a2 + 104) )
    {
      do
      {
        v10 = *((_DWORD *)v9 + 4);
        v11 = (UINT8 *)v9;
        v9 = (__int64 *)*v9;
        memmove(v8, v11 + 24, (unsigned int)(16 * v10));
        v8 += (unsigned int)(16 * v10);
        v2 += v10;
      }
      while( v9 != (__int64 *)(a2 + 104) );
      v4 = a1;
    }
    *((_DWORD *)v6 + 25) = v2;
    *((_DWORD *)v6 + 26) = *(_DWORD *)(a2 + 332);
    v12 = (((_DWORD)v8 + 7) & 0xFFFFFFF8) - (_DWORD)v7;
    *((_DWORD *)v6 + 27) = *(_DWORD *)(a2 + 336);
    *((_OWORD *)v6 + 8) = *(_OWORD *)(a2 + 284);
    *((_OWORD *)v6 + 9) = *(_OWORD *)(a2 + 300);
    *((_QWORD *)v6 + 20) = *(_QWORD *)(a2 + 316);
    *((_DWORD *)v6 + 28) = v12;
    v13 = 24 * *(_DWORD *)(a2 + 480);
    memmove((UINT8 *)((unsigned __int64)(v8 + 7) & 0xFFFFFFFFFFFFFFF8ui64), *(UINT8 **)(a2 + 472), v13);
    v14 = *(_DWORD *)(a2 + 480);
    v15 = v12 + v13;
    v7[2] = v15;
    v7[25] = v14;
    if( PfVerifyTraceBuffer(v7, v15, &a3) )
      return 0;
    v6 = *v4;
    v16 = -1073741823;
  }
  else
  {
    v16 = -1073741670;
  }
LABEL_12:
  if( v6 )
  {
    ExFreePoolWithTag(v6, 0);
    *v4 = 0i64;
  }
  return v16;
}

Referenced by:

PfSnEndTrace