IvtHandleInterrupt
CHAR __stdcall IvtHandleInterrupt(INT64 a1){
CHAR v1;
__int64 v3;
int v4;
int v5;
unsigned int v6;
__int64 v7;
unsigned int v8;
__int64 v9;
void *v10;
void *BugCheckParameter4;
__int64 v12;
void *v14;
char v15;
__int64 *v16;
__int64 v17;
signed __int32 v18[8];
v1 = 0;
v3 = *(_QWORD *)(a1 + 8);
if( *(_BYTE *)(a1 + 268) )
{
v4 = *(_DWORD *)(v3 + 220);
if( (v4 & 1) != 0 )
{
v1 = 1;
*(_DWORD *)(v3 + 220) = v4;
_InterlockedOr(v18, 0);
}
}
v5 = *(_DWORD *)(v3 + 52);
if( (v5 & 2) != 0 && v5 != -1 )
{
v6 = 0;
v7 = v3 + 16 * ((*(_QWORD *)(a1 + 176) >> 24) & 0x3FFi64);
v8 = *(unsigned __int8 *)(a1 + 181) + 1;
if( *(unsigned __int8 *)(a1 + 181) != -1 )
{
do
{
v9 = *(_QWORD *)(v7 + 16i64 * ((v6 + BYTE1(v5)) % v8) + 8);
if( v9 >= 0 )
break;
v10 = (void *)(*(_QWORD *)(v7 + 16i64 * ((v6 + BYTE1(v5)) % v8)) >> 12);
BugCheckParameter4 = (void *)BYTE4(v9);
v12 = (unsigned __int16)v9;
if( (unsigned int)BYTE4(v9) - 32 > 8 )
{
v14 = 0i64;
v15 = 0;
v16 = 0i64;
while( 1 )
{
if( !v16 )
{
if( !KxTryToAcquireSpinLock((INT32 *)&HalpDmaAdapterListLock) )
{
if( v15 )
LABEL_28:
KxReleaseSpinLock(&HalpDmaAdapterListLock);
KeBugCheckEx(0xE6u, (PVOID)0x26, v14, v10, BugCheckParameter4);
}
v16 = &HalpDmaAdapterList;
}
v16 = (__int64 *)*v16;
if( v16 == &HalpDmaAdapterList )
{
v16 = 0i64;
v17 = 0i64;
v14 = 0i64;
}
else
{
v17 = v16[9];
v14 = (void *)v16[8];
}
v15 = 1;
if( !v14
|| v17
&& *(_DWORD *)v17 == 1
&& *(unsigned __int16 *)(v17 + 12) == v12
&& *(unsigned __int16 *)(v17 + 8) == *(_DWORD *)(a1 + 212) )
{
goto LABEL_28;
}
}
}
*(_QWORD *)(v7 + 16i64 * ((v6 + BYTE1(v5)) % v8) + 8) = v9;
_InterlockedOr(v18, 0);
++v6;
}
while( v6 < v8 );
}
if( *(_BYTE *)(a1 + 268) )
v5 &= ~0x80u;
*(_DWORD *)(*(_QWORD *)(a1 + 8) + 52i64) = v5 | 1;
_InterlockedOr(v18, 0);
}
return v1;
}Referenced by:
No references.