HalpCreateSecondaryIcEntry

NTSTATUS __stdcall HalpCreateSecondaryIcEntry(_SECONDARY_INTERRUPT_PROVIDER_INTERFACE *Interface){
  __int64 v2; 
  VOID **PoolWithTag; 
  NTSTATUS v4; 
  VOID **v5; 
  unsigned __int64 v6; 
  VOID ***v7; 

  v2 = 16 * (Interface->GsivSize + 10i64);
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v2, 1399611720i64);
  v4 = 0;
  v5 = PoolWithTag;
  if( !PoolWithTag )
    return -1073741801;
  memset(PoolWithTag, 0i64, v2);
  *((_DWORD *)v5 + 4) = Interface->GsivBase;
  *((_DWORD *)v5 + 5) = Interface->GsivSize;
  *(_OWORD *)(v5 + 3) = *(_OWORD *)&Interface->Size;
  *(_OWORD *)(v5 + 5) = *(_OWORD *)&Interface->GsivBase;
  *(_OWORD *)(v5 + 7) = *(_OWORD *)&Interface->Reserved1;
  *(_OWORD *)(v5 + 9) = *(_OWORD *)&Interface->Reserved3;
  *(_OWORD *)(v5 + 11) = *(_OWORD *)&Interface->Reserved5;
  v5[13] = Interface->Reserved7;
  ObfReferenceObjectWithTag(v5[6], 0x536C6148ui64);
  *((_WORD *)v5 + 60) = 1;
  v5[17] = v5 + 16;
  v5[16] = v5 + 16;
  *((_BYTE *)v5 + 122) = 6;
  *((_DWORD *)v5 + 31) = 1;
  v6 = (unsigned __int8)HalpAcquireHighLevelLock((UINT64 *)&CmpDummyThreadEvent + 994);
  v7 = (VOID ***)*(&CmpDummyThreadEvent + 993);
  if( (_UNKNOWN *)**(&CmpDummyThreadEvent + 993) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 7936) )
    __fastfail(3u);
  *v5 = (char *)&CmpDummyThreadEvent + 7936;
  v5[1] = v7;
  *v7 = v5;
  *(&CmpDummyThreadEvent + 993) = v5;
  KxReleaseSpinLock((UINT64 *)&CmpDummyThreadEvent + 994);
  __writecr8(v6);
  return v4;
}

Referenced by:

HalpRegisterSecondaryIcInterface