HalpIommuCreateDevice
NTSTATUS __stdcall HalpIommuCreateDevice(VOID *Src){
int v1;
UINT8 **v2;
_BYTE *v3;
VOID *v4;
_BYTE *v5;
UINT8 **v6;
_KDEVICE_QUEUE *v7;
_HALP_ALLOC_CONTEXT *v8;
_LIST_ENTRY *i;
__int64 v10;
UINT8 *v11;
_LIST_ENTRY *v12;
NTSTATUS AcpiDeviceMapping;
_HALP_ALLOC_CONTEXT *v14;
UINT8 *v15;
UINT8 *v16;
_HALP_ALLOC_CONTEXT *v17;
VOID *v18;
UINT64 v19;
UINT8 v20;
int v21;
UINT8 v22;
_LIST_ENTRY *Blink;
_LIST_ENTRY *Flink;
_HALP_ALLOC_CONTEXT *v25;
UINT8 DmaOperation;
__int64 v28;
INT64 v29;
ULONG SortKey[4];
__int64 v31;
int v33;
UINT8 **v34;
VOID *v35;
v34 = v2;
v33 = v1;
v4 = 0i64;
v29 = 0i64;
v28 = 0i64;
v31 = 0i64;
v5 = v3;
v35 = 0i64;
v6 = v2;
v7 = (_KDEVICE_QUEUE *)Src;
*(_OWORD *)SortKey = 0i64;
if( v3 )
*v3 = 0;
ExAcquirePushLockExclusiveEx(&stru_140C49BA8, 0i64);
for( i = stru_140C49BB0.BufferList.Flink; i != (_LIST_ENTRY *)&stru_140C49BB0; i = *(_LIST_ENTRY **)v10 )
{
if( IidAreIdsStrictlyEqual((INT64 *)i[1].Flink, (INT64)v7) )
{
++*(_DWORD *)(v10 + 32);
*v6 = *(UINT8 **)(v10 + 24);
AcpiDeviceMapping = 0;
goto LABEL_34;
}
}
v11 = HalpMmAllocCtxAlloc(v8, 0x28ui64);
v12 = (_LIST_ENTRY *)v11;
if( !v11 )
{
AcpiDeviceMapping = -1073741670;
goto LABEL_34;
}
*(_OWORD *)v11 = 0i64;
*((_OWORD *)v11 + 1) = 0i64;
*((_QWORD *)v11 + 4) = 0i64;
AcpiDeviceMapping = HalpIommuCloneDeviceId(v7);
if( AcpiDeviceMapping < 0 )
goto LABEL_30;
v15 = HalpMmAllocCtxAlloc(v14, 0xD8ui64);
v16 = v15;
if( !v15 )
{
AcpiDeviceMapping = -1073741670;
LABEL_30:
Flink = v12[1].Flink;
if( Flink )
HalpMmAllocCtxFree(v14, Flink);
HalpMmAllocCtxFree(v14, v12);
if( v4 )
HalpMmAllocCtxFree(v25, v4);
goto LABEL_34;
}
v12[1].Blink = (_LIST_ENTRY *)v15;
memset(v15, 0i64, 0xD8u);
if( byte_140C49B2C )
{
if( *(_DWORD *)&v7->Type == 2 )
{
AcpiDeviceMapping = (unsigned int)HalpIommuQueryAcpiDeviceMapping(v7, (ULONG)SortKey);
if( AcpiDeviceMapping < 0 )
goto LABEL_29;
AcpiDeviceMapping = HalpIommuCloneDeviceId(SortKey);
if( AcpiDeviceMapping < 0 )
goto LABEL_29;
v7 = (_KDEVICE_QUEUE *)Src;
v4 = Src;
v35 = Src;
}
IommupHvRegisterDeviceId();
AcpiDeviceMapping = v21;
if( v21 >= 0 )
goto LABEL_21;
LABEL_29:
HalpMmAllocCtxFree(v17, v16);
goto LABEL_30;
}
AcpiDeviceMapping = HalpIommuCreateDeviceInternal((__int64)v7, v33, &v28, &v29, v5);
if( AcpiDeviceMapping < 0 )
goto LABEL_29;
LABEL_21:
if( byte_140C49B2C )
{
*((_QWORD *)v16 + 3) = 0i64;
}
else
{
*(_QWORD *)v16 = v28;
*((_QWORD *)v16 + 1) = v29;
}
if( !v4 )
{
v4 = v35;
AcpiDeviceMapping = HalpIommuCloneDeviceId(v7);
if( AcpiDeviceMapping < 0 )
goto LABEL_29;
}
*((_QWORD *)v16 + 4) = v4;
HalpIommuCheckDpptException((_MDL *)v7, v18, v19, v20, DmaOperation);
v16[16] = v22;
v17 = &stru_140C49BB0;
*v34 = v16;
LODWORD(v12[2].Flink) = 1;
Blink = stru_140C49BB0.BufferList.Blink;
if( stru_140C49BB0.BufferList.Blink->Flink != (_LIST_ENTRY *)&stru_140C49BB0 )
__fastfail(3u);
v12->Flink = (_LIST_ENTRY *)&stru_140C49BB0;
v12->Blink = Blink;
Blink->Flink = v12;
stru_140C49BB0.BufferList.Blink = v12;
if( AcpiDeviceMapping < 0 )
goto LABEL_29;
LABEL_34:
if( (_InterlockedExchangeAdd64(&stru_140C49BA8._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140C49BA8);
KeAbPostRelease(&stru_140C49BA8);
return AcpiDeviceMapping;
}Referenced by:
HalpDmaAllocateChildAdapterV3
HalpIommuUnblockDevice
IommuDomainAttachDevice