KiIntSteerDisable
NTSTATUS __stdcall KiIntSteerDisable(_KINTERRUPT **InterruptObjectArray, UINT64 InterruptObjectCount){
_KINTERRUPT **v2;
unsigned int v3;
_QWORD *IntTrackEntry;
unsigned __int64 v5;
__int64 v6;
_KINTERRUPT *v7;
__int64 v8;
INT64 *v9;
_QWORD *v10;
INT64 v11;
INT64 *v12;
v2 = InterruptObjectArray;
v3 = InterruptObjectCount;
IntTrackEntry = (*InterruptObjectArray)->IntTrackEntry;
if( IntTrackEntry )
{
KiIntSteerLogState(
(__int64)(*InterruptObjectArray)->IntTrackEntry,
(__int64)PPM_ETW_INTERRUPT_STEERING_STATE_DISCONNECT);
v5 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&KiIntTrackSpinlock);
if( v3 )
{
v6 = v3;
do
{
v7 = *v2;
_InterlockedAnd(&(*v2)->InternalState, 0xFFFFFFFB);
v7->IntTrackEntry = 0i64;
++v2;
--v6;
}
while( v6 );
}
v8 = *IntTrackEntry;
v9 = (INT64 *)IntTrackEntry[2];
v10 = (_QWORD *)IntTrackEntry[1];
if( *(_QWORD **)(*IntTrackEntry + 8i64) == IntTrackEntry && (_QWORD *)*v10 == IntTrackEntry )
{
*v10 = v8;
*(_QWORD *)(v8 + 8) = v10;
ExFreePoolWithTag(IntTrackEntry, 0x6B725449u);
if( (INT64 *)v9[2] != v9 + 2 )
{
LABEL_11:
KxReleaseSpinLock(&KiIntTrackSpinlock);
__writecr8(v5);
return 0;
}
--KiIntTrackRootCount;
v11 = *v9;
v12 = (INT64 *)v9[1];
if( *(INT64 **)(*v9 + 8) == v9 && (INT64 *)*v12 == v9 )
{
*v12 = v11;
*(_QWORD *)(v11 + 8) = v12;
KiIntSteerUpdateDeviceInterruptMask((INT64)(v9 + 20), 1i64, v11);
ExFreePoolWithTag(v9, 0x6B725449u);
goto LABEL_11;
}
}
__fastfail(3u);
}
return 0;
}Referenced by:
KeDisconnectInterrupt