IvtAllocateContextTable
INT64 __fastcall IvtAllocateContextTable(INT64 a1, UINT64 a2){
INT64 v2;
__int64 v3;
UINT64 v4;
unsigned int v5;
__int64 v6;
__int64 v7;
INT64 *v8;
LONGLONG *v9;
MEMORY_CACHING_TYPE v10;
INT64 result;
unsigned __int8 CurrentIrql;
WORK_QUEUE_TYPE v13;
PVOID v14;
INT64 v15;
_BYTE LockHandle[72];
INT64 v17;
LARGE_INTEGER v18;
v17 = 0i64;
*(_QWORD *)&LockHandle[16] = 0i64;
v18.QuadPart = 0i64;
v2 = a1;
v3 = *(_QWORD *)(a1 + 184);
v4 = a2 >> 8;
v5 = (unsigned __int8)a2 >> 3;
v6 = (unsigned int)(2 * v4);
if( (v3 & 0x1000000) != 0 )
{
v7 = *(_QWORD *)(a1 + 32);
a1 = v6 + (v5 >= 0x10);
v8 = (INT64 *)(v7 + 8 * a1);
}
else
{
v8 = (INT64 *)(*(_QWORD *)(a1 + 32) + 8 * v6);
}
if( *v8 )
return 0i64;
v9 = (LONGLONG *)(*(_QWORD *)(v2 + 16) + 8 * v6);
if( (v3 & 0x1000000) != 0 && v5 >= 0x10 )
++v9;
v10 = v3 & 1;
result = ExtEnvAllocatePhysicalMemory(a1, 0x1000ui64, 0x1000ui64, v10, &v18, (INT64)&v17);
if( (int)result >= 0 )
{
memmove((UINT8 *)v17, *(UINT8 **)(v2 + 40), 0x1000ui64);
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
*(_QWORD *)LockHandle = 0i64;
*(_QWORD *)&LockHandle[8] = v2 + 168;
KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)(v2 + 168), v13, v14);
if( *v8 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
__writecr8(CurrentIrql);
ExtEnvFreePhysicalMemory(v15, (VOID *)v17, 0x1000ui64, (unsigned int)v10);
}
else
{
*v8 = v17;
*v9 = ((v18.QuadPart / 4096) << 12) | 1;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
__writecr8(CurrentIrql);
}
return 0i64;
}
return result;
}Referenced by:
HalpIvtpInitializeReservedDomain
IvtAttachDeviceDomainInternal
IvtProcessDeviceExceptions