HalpIrtAllocateIndex
NTSTATUS __stdcall HalpIrtAllocateIndex(UINT64 *IrtIndex, INT64 Count){
int v2;
int v3;
UINT64 v4;
unsigned int v5;
NTSTATUS RemappingTableEntry;
UINT32 v7;
int v9;
unsigned int v10;
UINT8 *v11;
__int64 v12;
_RTL_BITMAP *v13;
UINT32 ClearBitsAndSet;
UINT64 v15;
UINT32 v16;
unsigned int NextForwardRunClear;
UINT64 v18;
VOID *NodeOrParent;
_TABLE_SEARCH_RESULT v21;
char v22;
unsigned int v23;
unsigned int v24;
unsigned int v25;
unsigned int v26;
INT64 v27;
CHAR v28;
UINT64 StartingRunIndex;
v26 = v3;
v25 = v2;
v4 = StartingRunIndex;
v5 = 0;
RemappingTableEntry = 0;
v22 = 0;
v23 = 0;
v7 = Count;
if( StartingRunIndex )
v9 = *(_DWORD *)StartingRunIndex;
else
v9 = 0;
if( !*(&CmpDummyThreadEvent + 1958) )
{
*(_DWORD *)IrtIndex = 0;
return RemappingTableEntry;
}
if( (*(&CmpDummyThreadEvent + 7712) & 4) != 0 )
{
RemappingTableEntry = HalpIrtAllocateDeviceAperture(v2, v3, Count, v9, &v23);
if( RemappingTableEntry < 0 )
return RemappingTableEntry;
v5 = v23;
v22 = 1;
}
v10 = v5 / *(&CmpDummyThreadEvent + 1796);
v24 = v5 / *(&CmpDummyThreadEvent + 1796);
ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
v12 = 2i64 * v10;
if( !*((_QWORD *)&CmpDummyThreadEvent + 2 * v10 + 901) )
{
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
RemappingTableEntry = HalpIrtExtendRemappingRange(v10);
if( RemappingTableEntry < 0 )
goto LABEL_30;
ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
}
v13 = (_RTL_BITMAP *)((char *)&CmpDummyThreadEvent + 8 * v12 + 7200);
if( (*(&CmpDummyThreadEvent + 7712) & 1) != 0 )
{
v15 = v5 * *(&CmpDummyThreadEvent + 1938) % *(&CmpDummyThreadEvent + 1937);
v23 = v15 + *(&CmpDummyThreadEvent + 1938) - 1;
ClearBitsAndSet = -1;
while( 1 )
{
LODWORD(StartingRunIndex) = v15;
NextForwardRunClear = RtlFindNextForwardRunClear((INT64)v13, v15, &StartingRunIndex);
if( !NextForwardRunClear )
break;
if( NextForwardRunClear >= v7 )
{
v16 = -v7 & (v7 + StartingRunIndex - 1);
if( v16 - (unsigned int)StartingRunIndex < NextForwardRunClear
&& NextForwardRunClear + (_DWORD)StartingRunIndex - v16 >= v7 )
{
if( v16 + v7 - 1 <= v23 )
{
RtlSetBits(v13, v16, v7);
ClearBitsAndSet = v16;
}
break;
}
v15 = (unsigned int)StartingRunIndex + NextForwardRunClear;
}
else
{
v15 = (unsigned int)StartingRunIndex + NextForwardRunClear;
}
}
}
else
{
ClearBitsAndSet = (unsigned int)RtlFindClearBitsAndSet(
(_RTL_AVL_TABLE *)v13,
(VOID *)v7,
0i64,
v11,
NodeOrParent,
v21);
}
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
if( ClearBitsAndSet == -1 )
{
RemappingTableEntry = -1073741670;
}
else
{
RemappingTableEntry = 0;
v18 = ClearBitsAndSet + v24 * *(&CmpDummyThreadEvent + 1937);
*(_DWORD *)IrtIndex = v18;
if( v9 != 3 )
return RemappingTableEntry;
if( (*(&CmpDummyThreadEvent + 7712) & 2) == 0 )
return RemappingTableEntry;
LODWORD(NodeOrParent) = *(_DWORD *)(v4 + 56);
RemappingTableEntry = HalpIommuAllocateRemappingTableEntry(v18, v7, v25, v26, (INT64)NodeOrParent, v27, v28);
if( RemappingTableEntry >= 0 )
return RemappingTableEntry;
ExAcquireFastMutex((PFAST_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
RtlClearBits(v13, ClearBitsAndSet, v7);
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&CmpDummyThreadEvent + 7776));
*(_DWORD *)IrtIndex = -1;
}
LABEL_30:
if( v22 )
HalpIrtReleaseDeviceAperture(v5, v7);
return RemappingTableEntry;
}Referenced by:
HalpInterruptRemap
HalpInterruptRemapFixedLines