DbgkWerAddSecondaryData

NTSTATUS __stdcall DbgkWerAddSecondaryData(VOID *ReportHandle, _GUID *Identifier, VOID *Data, UINT64 Size){
  __int64 v4; 
  int v8; 
  char *v9; 
  __int64 v10; 
  int v11; 
  NTSTATUS result; 
  VOID **PoolWithTag; 
  VOID **v14; 
  _GUID v15; 

  v4 = (unsigned int)Size;
  if( !ReportHandle || !Data || !Identifier || !(_DWORD)Size )
  {
    DbgPrintEx(5u, 0, "DBGK: DbgkWerAddSecondaryData: Invalid parameter.\n\n");
    return -1073741811;
  }
  v8 = *((_DWORD *)ReportHandle + 25);
  if( v8 != 1 )
  {
    if( v8 != 2 )
      return -1073741637;
    v10 = *((_QWORD *)ReportHandle + 16);
    if( v10 )
    {
      v9 = (char *)(v10 + 32);
      goto LABEL_10;
    }
    return -1073741811;
  }
  v9 = (char *)ReportHandle + 160;
LABEL_10:
  v11 = *((_DWORD *)ReportHandle + 23);
  if( (unsigned int)Size > v11 - *((_DWORD *)ReportHandle + 24) )
  {
    DbgPrintEx(
      5u,
      0,
      "DBGK: DbgkWerAddSecondaryData: Secondary data exceeds buffer. Size 0x%x Maxsize 0x%x Datasize 0x%x.\n\n",
      (unsigned int)Size,
      v11,
      *((_DWORD *)ReportHandle + 24));
    return -1073741670;
  }
  PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x28ui64, 1466393156i64);
  if( !PoolWithTag )
    return -1073741801;
  *(_OWORD *)PoolWithTag = 0i64;
  *((_OWORD *)PoolWithTag + 1) = 0i64;
  PoolWithTag[4] = 0i64;
  v14 = ExAllocatePoolWithTag(1ui64, (v4 + 4095) & 0xFFFFFFFFFFFFF000ui64, 1466393156i64);
  PoolWithTag[2] = v14;
  if( !v14 )
  {
    ExFreePoolWithTag(PoolWithTag, 0x57676244u);
    return -1073741801;
  }
  memmove(v14, Data, v4);
  v15 = *Identifier;
  *((_DWORD *)PoolWithTag + 6) = v4;
  *(_GUID *)PoolWithTag = v15;
  *((_DWORD *)ReportHandle + 24) += v4;
  if( *((_DWORD *)ReportHandle + 25) == 1 )
    ++*((_DWORD *)ReportHandle + 44);
  PoolWithTag[4] = (VOID *)*((_QWORD *)v9 + 1);
  result = 0;
  *((_QWORD *)v9 + 1) = PoolWithTag;
  return result;
}

Referenced by:

No references.