VfDeadlockInitializeResource

NTSTATUS __stdcall VfDeadlockInitializeResource(
        VOID *Resource,
        _VI_DEADLOCK_RESOURCE_TYPE Type,
        VOID *Caller,
        UINT64 DoNotAcquireLock){
  _VI_DEADLOCK_RESOURCE_TYPE v6; 
  VOID *v7; 
  UINT16 v8; 
  VOID *v9; 
  unsigned int v10; 
  __int64 v11; 
  UINT8 v12; 
  NTSTATUS v13; 
  _QWORD *v14; 
  _QWORD *v15; 
  VOID *Object; 
  VOID *NodesToFree; 
  VOID *BackTrace[8]; 

  Object = 0i64;
  NodesToFree = 0i64;
  memset(BackTrace, 0i64, sizeof(BackTrace));
  if( !(unsigned int)ViDeadlockCanProceed(Resource, v6) )
    return 0;
  if( *((_DWORD *)ViDeadlockGlobals + 8196) )
    return 0;
  if( *((int *)ViDeadlockGlobals + 8282) > 1024 )
    return 0;
  v7 = ViDeadlockAllocate(ViDeadlockResource);
  if( !v7 )
    return 0;
  v8 = RtlCaptureStackBackTrace(2ui64, 8ui64, BackTrace, 0i64);
  v9 = BackTrace[0];
  v10 = v8;
  v11 = 1i64;
  if( !v10 )
    v9 = Caller;
  if( v10 )
    v11 = v10;
  BackTrace[0] = v9;
  if( (unsigned int)v11 < 8 )
    BackTrace[v11] = 0i64;
  v12 = ViRaiseIrqlToDpcLevel();
  ViDeadlockDetectionLock(1ui64);
  v13 = ViDeadlockAddResource(Resource, VfDeadlockMutex, v7, BackTrace, &Object, &NodesToFree);
  ViDeadlockDetectionUnlock(1ui64);
  ViLowerIrql(v12);
  if( !v13 )
    ViDeadlockFree(v7, ViDeadlockResource);
  if( Object )
    ViDeadlockFree(Object, ViDeadlockResource);
  v14 = NodesToFree;
  if( NodesToFree )
  {
    do
    {
      v15 = (_QWORD *)*v14;
      ViDeadlockFree(v14, ViDeadlockNode);
      v14 = v15;
    }
    while( v15 );
  }
  return v13;
}

Referenced by:

VerifierKeInitializeMutant
VerifierKeInitializeMutex