HalpIommuDeleteDevice
NTSTATUS __stdcall HalpIommuDeleteDevice(UINT64 *Memory){
NTSTATUS v2;
char v3;
_LIST_ENTRY *v4;
_LIST_ENTRY *i;
__int64 v6;
_LIST_ENTRY *v8;
_LIST_ENTRY *v9;
_HALP_ALLOC_CONTEXT *v10;
_LIST_ENTRY *Flink;
_HALP_ALLOC_CONTEXT *v13;
VOID *v14;
v2 = 0;
v3 = 0;
v4 = 0i64;
ExAcquirePushLockExclusiveEx(&stru_140C49BA8, 0i64);
for( i = stru_140C49BB0.BufferList.Flink; i != (_LIST_ENTRY *)&stru_140C49BB0; i = *(_LIST_ENTRY **)v6 )
{
v4 = i;
if( IidAreIdsStrictlyEqual((INT64 *)i[1].Flink, Memory[4]) )
{
if( (*(_DWORD *)(v6 + 32))-- == 1 )
{
v8 = *(_LIST_ENTRY **)v6;
if( *(_QWORD *)(*(_QWORD *)v6 + 8i64) != v6 || (v9 = *(_LIST_ENTRY **)(v6 + 8), v9->Flink != (_LIST_ENTRY *)v6) )
__fastfail(3u);
v9->Flink = v8;
v3 = 1;
v8->Blink = v9;
break;
}
}
}
if( (_InterlockedExchangeAdd64(&stru_140C49BA8._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140C49BA8);
KeAbPostRelease(&stru_140C49BA8);
if( !v3 )
return 0;
if( v4 )
{
Flink = v4[1].Flink;
if( Flink )
HalpMmAllocCtxFree(v10, Flink);
HalpMmAllocCtxFree(v10, v4);
}
if( byte_140C49B2C )
v2 = IommupHvUnregisterDeviceId();
else(*(void(__fastcall **)(_QWORD, UINT64, _QWORD))(Memory[1] + 96))(*(_QWORD *)(Memory[1] + 16), *Memory, 0i64);
v14 = (VOID *)Memory[4];
if( v14 )
HalpMmAllocCtxFree(v13, v14);
HalpMmAllocCtxFree(v13, Memory);
return v2;
}Referenced by:
HalpDmaAllocateChildAdapterV3
HalpDmaFreeChildAdapter
HalpIommuBlockDevice
HalpIommuUnblockDevice
IommuDomainDetachDevice