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