HalpIommuUnblockDevice
NTSTATUS __stdcall HalpIommuUnblockDevice(PVOID Src){
_QWORD *v1;
UINT64 v2;
UINT8 v3;
int IncreaseAliasTrack;
char v5;
char v6;
_QWORD *v7;
ULONG *v8;
INT64 v9;
char v10;
_KDEVICE_QUEUE *v11;
int AcpiDeviceMapping;
ULONG *v14;
NTSTATUS Device;
NTSTATUS v16;
_ETHREAD *CurrentThread;
unsigned int SessionId;
unsigned __int8 v19;
int v20;
bool v21;
__int64 v22;
_KLOCK_ENTRY *v23;
int v24;
unsigned int v25;
__int64 v26;
UINT8 v27;
__int64 v28;
__int128 v29;
__int64 v30;
ULONG SortKey[4];
__int64 v32;
UINT64 a3;
IncreaseAliasTrack = 0;
v30 = 0i64;
v29 = 0i64;
v32 = 0i64;
*(_OWORD *)SortKey = 0i64;
v5 = 0;
*v1 = 0i64;
v6 = 0;
v7 = v1;
v8 = (ULONG *)Src;
HalpIommuCheckDpptException((_MDL *)Src, v1, v2, v3, v27);
if( v10 || HalpIommuCheckExceptionList(v9) )
return 0;
if( byte_140C49B2C && !byte_140C49B2E )
return -1073741637;
if( *(_DWORD *)&v11->Type == 2 )
{
AcpiDeviceMapping = (unsigned int)HalpIommuQueryAcpiDeviceMapping(v11, (ULONG)SortKey);
v14 = SortKey;
if( AcpiDeviceMapping < 0 )
v14 = v8;
v8 = v14;
}
Device = HalpIommuCreateDevice(v8);
if( Device >= 0 )
{
v5 = 1;
if( *v8 == 1 && ((unsigned int)HalpIommuGetAcpiDeviceMapCount((INT64)v8) > 1 || (v8[1] & 1) != 0) )
{
ExAcquirePushLockExclusiveEx(&qword_140C49BA0, 0i64);
v6 = 1;
IncreaseAliasTrack = HalpIommuCreateIncreaseAliasTrack(v8);
if( IncreaseAliasTrack < 0 || MEMORY[0x18] > 1 )
goto LABEL_23;
}
if( byte_140C49B2C )
{
*(_QWORD *)&v29 = 4i64;
v30 = 0i64;
v28 = 0i64;
*((_QWORD *)&v29 + 1) = MEMORY[0x18];
v16 = ((__int64(__fastcall *)(__int128 *, __int64 *))qword_140C4A2B8)(&v29, &v28);
}
else
{
v16 = HalpIommuJoinDmaDomain(0i64, ::SortKey);
}
IncreaseAliasTrack = v16;
if( v6 )
{
LABEL_23:
if( (_InterlockedExchangeAdd64(&qword_140C49BA0._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&qword_140C49BA0);
LODWORD(a3) = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType((UINT64)&qword_140C49BA0) == 1 )
SessionId = MmGetSessionIdEx(CurrentThread->Tcb.ApcState.Process);
else
SessionId = -1;
--CurrentThread->Tcb.SpecialApcDisable;
v19 = ++CurrentThread->Tcb.AbAllocationRegionCount;
v20 = ((char)CurrentThread->Tcb.AbEntrySummary | (char)CurrentThread->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
v21 = !_BitScanReverse((unsigned int *)&v22, v20);
if( v21 )
break;
v23 = &CurrentThread->Tcb.LockEntries[v22];
v20 &= ~(1 << v22);
if( (v23->AcquiredByte & 1) != 0
&& (v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)&qword_140C49BA0 & 0x7FFFFFFFFFFFFFFCi64)
&& v23->LockState.SessionId == SessionId )
{
v23->AcquiredByte &= ~1u;
if( v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
{
if( v23 )
{
v23->CrossThreadReleasableAndBusyByte |= 2u;
if( v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v23);
v24 = v23->BoostBitmap.AllFields & 0x1FFFF;
v25 = v23->BoostBitmap.AllFields & 0xFFFE0000;
v23->ThreadLocalFlags &= ~1u;
LODWORD(a3) = v24;
v23->BoostBitmap.AllFields = v25;
v23->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v26 = v23 - CurrentThread->Tcb.LockEntries;
if( v19 == 1 )
CurrentThread->Tcb.AbEntrySummary |= 1 << v26;
else
_InterlockedOr8((volatile signed __int8 *)&CurrentThread->Tcb.AbOrphanedEntrySummary, 1 << v26);
goto LABEL_40;
}
break;
}
}
}
if( (*(&CurrentThread->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, CurrentThread, &qword_140C49BA0, (PVOID)SessionId, 0i64);
LABEL_40:
--CurrentThread->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&CurrentThread->Tcb, &qword_140C49BA0, &a3);
v21 = CurrentThread->Tcb.SpecialApcDisable++ == -1;
if( v21
&& ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
{
KiCheckForKernelApcDelivery();
}
}
}
else if( Device != -1073741275 )
{
IncreaseAliasTrack = Device;
}
if( IncreaseAliasTrack >= 0 )
{
*v7 = 0i64;
}
else if( v5 )
{
HalpIommuDeleteDevice(0i64);
}
return IncreaseAliasTrack;
}Referenced by:
No references.