ViDeadlockRemoveMemoryRangeThreads
VOID __stdcall ViDeadlockRemoveMemoryRangeThreads(
UINT8 *StartOfRange,
UINT8 *EndOfRange,
UINT8 *StartOfAllocation,
UINT8 *EndOfAllocation){
UINT8 *v4;
_VI_DEADLOCK_THREAD *v6;
unsigned int v7;
UINT64 v8;
_QWORD **v9;
_QWORD *v10;
_VI_DEADLOCK_THREAD *v11;
_ETHREAD *Thread;
UINT8 OldIrql;
v4 = EndOfRange;
v6 = 0i64;
v7 = 0;
v8 = ViDeadlockDatabaseHashIndex(StartOfRange);
OldIrql = ViRaiseIrqlToDpcLevel();
LABEL_2:
ViDeadlockDetectionLock(v7);
v9 = (_QWORD **)(16 * v8 + *((_QWORD *)ViDeadlockGlobals + 2050));
v10 = *v9;
if( *v9 != v9
&& (unsigned int)VfUtilAddressRangeFit((_VF_ADDRESS_RANGE *)ViDeadlockGlobals + v8 + 1026, StartOfRange, v4) )
{
while( v10 != v9 )
{
v11 = (_VI_DEADLOCK_THREAD *)(v10 - 3);
v10 = (_QWORD *)*v10;
if( v11->Thread >= (_ETHREAD *)StartOfAllocation && v11->Thread < (_ETHREAD *)EndOfAllocation )
{
if( !v7 )
{
v7 = 1;
if( !(unsigned int)ViDeadlockDetectionTryConvertSharedToExclusive() )
{
ViDeadlockDetectionUnlock(0i64);
v4 = EndOfRange;
goto LABEL_2;
}
}
ViDeadlockRemoveThread(v11, 0i64);
v11->Thread = (_ETHREAD *)v6;
v6 = v11;
}
}
}
ViDeadlockDetectionUnlock(v7);
ViLowerIrql(OldIrql);
if( v6 )
{
do
{
Thread = v6->Thread;
ViDeadlockFree(v6, ViDeadlockThread);
v6 = (_VI_DEADLOCK_THREAD *)Thread;
}
while( Thread );
}
}Referenced by:
VfDeadlockDeleteMemoryRange