IvtIommuSendCommand
INT64 __fastcall IvtIommuSendCommand(_QWORD *a1, _QWORD *a2, INT64 a3){
void *v3;
int v5;
unsigned __int8 CurrentIrql;
__int64 v7;
unsigned __int64 v8;
__int64 v9;
__int64 v10;
unsigned int v11;
unsigned int v12;
__int64 v13;
__int64 v14;
__int64 v15;
INT64 result;
int v17[8];
struct _IO_WORKITEM LockHandle;
__int64 v19;
v5 = a3;
memset(&LockHandle, 0, 24);
if( (_DWORD)a3 == 1 )
{
CurrentIrql = 0;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
LockHandle.WorkItem.List.Flink = 0i64;
LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)(a1 + 21);
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)(a1 + 21), (WORK_QUEUE_TYPE)a3, v3);
}
v7 = a1[1];
v8 = *(_QWORD *)(v7 + 136);
v9 = a1[9];
v19 = v9;
v10 = ((unsigned int)(v8 >> 4) & 0x7FFF) + 1;
v11 = 0;
v12 = 0;
v13 = a1[11] >> 4;
if( (_DWORD)v10 != (_DWORD)v13 )
v12 = ((v8 >> 4) & 0x7FFF) + 1;
v14 = v12;
if( v12 == ((*(_QWORD *)(v7 + 128) >> 4) & 0x7FFFi64) )
{
do
{
if( (++v11 & dword_140C4A13C) != 0 || !qword_140C4A140 )
_mm_pause();
else
qword_140C4A140(v11, v10, v13);
}
while( v14 == ((*(_QWORD *)(v7 + 128) >> 4) & 0x7FFFi64) );
v9 = v19;
}
v15 = 2 * ((v8 >> 4) & 0x7FFF);
*(_QWORD *)(v9 + 8 * v15) = *a2;
result = a2[1];
*(_QWORD *)(v9 + 8 * v15 + 8) = result;
*(_QWORD *)(v7 + 136) = ((unsigned int)v8 ^ (16 * (_DWORD)v14)) & 0x7FFF0 ^ v8;
_InterlockedOr(v17, 0);
if( !v5 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
result = CurrentIrql;
__writecr8(CurrentIrql);
}
return result;
}Referenced by:
IvtFlushTbInternal
IvtInvalidateAllContextEntries
IvtInvalidateContextEntry
IvtInvalidateExtendedContextEntry
IvtInvalidateRemappingTableEntries
IvtIommuWaitCommand