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