HalpDpReplaceBegin

INT64 __fastcall HalpDpReplaceBegin(INT64 a1, CHAR **a2){
  __int64 v2; 
  unsigned int v3; 
  __int64 v6; 
  __int64 v7; 
  int v8; 
  unsigned int *PoolWithTag; 
  unsigned int *v10; 
  CHAR a5; 
  char v12; 
  __int64 v13; 
  VOID *v14; 
  void *v15; 
  unsigned int a7; 
  v2 = *(_QWORD *)(a1 + 16);
  v3 = 0;
  a7 = 0;
  v6 = *(unsigned int *)(v2 + 16);
  v7 = *(unsigned int *)(*(_QWORD *)(a1 + 8) + 16i64);
  if( (unsigned int)v6 < (unsigned int)v7 )
    return(unsigned int)-1073741811;
  PoolWithTag = (unsigned int *)ExAllocatePoolWithTag(
                                  NonPagedPoolNx,
                                  (unsigned int)(4 * (v6 + 2 * (v7 + 16))),
                                  0x206C6148ui64);
  v10 = PoolWithTag;
  if( !PoolWithTag )
    return(unsigned int)-1073741670;
  memset((INT64)PoolWithTag, 0i64);
  *v10 = v7;
  a5 = 1;
  v12 = (*(_DWORD *)a1 & 2) != 0;
  *((_BYTE *)v10 + 45) = v12;
  if( !(_DWORD)v7 )
  {
LABEL_11:
    if( v12 )
    {
      if( (_DWORD)v7 )
      {
        v14 = ExAllocatePoolWithTag(NonPagedPoolNx, v3 * (unsigned int)v7, 0x206C6148ui64);
        *((_QWORD *)v10 + 4) = v14;
        if( !v14 )
        {
          v8 = -1073741670;
          goto LABEL_15;
        }
      }
      HalpBuildResumeStructures();
    }
    *a2 = (CHAR *)v10;
    return 0;
  }
  *((_QWORD *)v10 + 1) = v10 + 32;
  v13 = (__int64)&v10[v7 + 32];
  *((_QWORD *)v10 + 2) = v13;
  *((_QWORD *)v10 + 3) = v13 + 4 * v6;
  memmove((UINT8 *)v10 + 128, (UINT8 *)(*(_QWORD *)(a1 + 8) + 20i64), 4 * v7);
  memmove(*((UINT8 **)v10 + 2), (UINT8 *)(*(_QWORD *)(a1 + 16) + 20i64), 4 * v6);
  HalpDpSortApicList(*((_QWORD *)v10 + 1), (unsigned int)v7);
  HalpDpSortApicList(*((_QWORD *)v10 + 2), (unsigned int)v6);
  if( (*(_DWORD *)a1 & 1) != 0 )
    *((_BYTE *)v10 + 44) = 1;
  else
    a5 = *((_BYTE *)v10 + 44);
  v8 = HalpInterruptDpReplaceBegin(
         *((CHAR **)v10 + 1),
         *((CHAR **)v10 + 2),
         *((CHAR **)v10 + 3),
         *v10,
         a5,
         *((_BYTE *)v10 + 45),
         &a7);
  if( v8 >= 0 )
  {
    v3 = a7;
    v12 = *((_BYTE *)v10 + 45);
    v10[10] = a7;
    goto LABEL_11;
  }
LABEL_15:
  v15 = (void *)*((_QWORD *)v10 + 4);
  if( v15 )
    ExFreePoolWithTag(v15, 0x206C6148u);
  ExFreePoolWithTag(v10, 0x206C6148u);
  return(unsigned int)v8;
}

Referenced by:

No references.