ViDeadlockAnalyze

UINT64 __stdcall ViDeadlockAnalyze(
        VOID *ResourceAddress,
        _VI_DEADLOCK_NODE *AcquiredNode,
        UINT64 FirstCall,
        UINT64 Degree,
        VOID *Caller){
  int v5; 
  unsigned int v8; 
  PVOID v9; 
  bool v10; 
  _DWORD *v11; 
  int v12; 
  UINT64 v14; 
  __int64 v15; 
  _EXCEPTION_DISPOSITION *v16; 
  _KNOWN_CONTROLLER_TYPE v17; 
  _MEMORY_CACHING_TYPE_ORIG *v18; 
  _VI_DEADLOCK_RESOURCE *Root; 
  _LIST_ENTRY *p_ResourceList; 
  _LIST_ENTRY *Flink; 
  _VI_DEADLOCK_NODE *p_Blink; 
  _VI_DEADLOCK_NODE *Blink; 
  UINT64 v24; 
  _EXCEPTION_DISPOSITION *v25; 
  _KNOWN_CONTROLLER_TYPE v26; 
  _MEMORY_CACHING_TYPE_ORIG *v27; 
  _EXCEPTION_DISPOSITION *v28; 
  _KNOWN_CONTROLLER_TYPE v29; 
  _MEMORY_CACHING_TYPE_ORIG *v30; 
  unsigned int v31; 
  UINT64 v32; 
  unsigned int Degreea; 

  Degreea = Degree;
  v5 = FirstCall;
  v8 = 1;
  if( (_DWORD)FirstCall )
  {
    v9 = ViDeadlockGlobals;
    ++*((_DWORD *)ViDeadlockGlobals + 8201);
    v10 = *((_DWORD *)v9 + 8201) == 1073741822;
    *((_DWORD *)v9 + 8199) = 0;
    *((_DWORD *)v9 + 8216) = 0;
    *((_QWORD *)v9 + 4107) = 0i64;
    if( v10 )
      ViDeadlockState |= 8u;
    KeQueryCurrentStackInformation((_KERNEL_STACK_LIMITS *)v9 + 8283, (UINT64 *)v9 + 4142, (UINT64 *)v9 + 4143);
    LODWORD(Degree) = Degreea;
  }
  v11 = ViDeadlockGlobals;
  v12 = *((_DWORD *)ViDeadlockGlobals + 8201);
  if( AcquiredNode->u1.Whole >> 3 == v12 )
    return 0i64;
  ++*((_DWORD *)ViDeadlockGlobals + 8199);
  v14 = AcquiredNode->u1.Whole & 7 | (8 * v12);
  AcquiredNode->u1.Whole = v14;
  if( (unsigned int)Degree > v11[8202] )
  {
    ++v11[8204];
    return 0i64;
  }
  if( v11[8199] >= v11[8203] )
  {
    ++v11[8205];
    return 0i64;
  }
  LODWORD(v15) = KeGetCurrentStackPointer(v14, (_KPROFILE_SOURCE)v11);
  if( (unsigned __int64)(v15 - *((_QWORD *)ViDeadlockGlobals + 4142)) <= 0x1630 )
  {
    ++*((_DWORD *)ViDeadlockGlobals + 8206);
    return 0i64;
  }
  Root = AcquiredNode->Root;
  if( ResourceAddress != Root->ResourceAddress || (AcquiredNode->u1.Whole & 4) != 0 )
  {
    p_ResourceList = &Root->ResourceList;
    v8 = 0;
    Flink = p_ResourceList->Flink;
    if( p_ResourceList->Flink == p_ResourceList )
      goto LABEL_30;
    while( 1 )
    {
      p_Blink = (_VI_DEADLOCK_NODE *)&Flink[-3].Blink;
      Blink = (_VI_DEADLOCK_NODE *)Flink[-3].Blink;
      LODWORD(Flink[2].Flink) = (__int64)Flink[2].Flink & 7 | (8 * *((_DWORD *)ViDeadlockGlobals + 8201));
      if( Blink )
      {
        v24 = Degreea + 1;
        if( p_Blink == AcquiredNode )
          v24 = Degreea;
        v26 = (unsigned int)ViDeadlockAnalyze(ResourceAddress, Blink, 0i64, v24, Caller);
        v8 = v26;
        if( v26 )
          break;
      }
      Flink = Flink->Flink;
      if( Flink == p_ResourceList )
        goto LABEL_25;
    }
    ViDeadlockAddParticipant((_KNOWN_CONTROLLER_TYPE)((_DWORD)Flink - 40), v25, v26, v27);
    if( p_Blink != AcquiredNode )
      ViDeadlockAddParticipant((_KNOWN_CONTROLLER_TYPE)AcquiredNode, v28, v29, v30);
LABEL_25:
    if( !v8 )
    {
LABEL_30:
      if( v5 )
      {
        v31 = *((_DWORD *)ViDeadlockGlobals + 8199);
        if( v31 > *((_DWORD *)ViDeadlockGlobals + 8200) )
          *((_DWORD *)ViDeadlockGlobals + 8200) = v31;
      }
      return v8;
    }
  }
  else
  {
    ViDeadlockAddParticipant((_KNOWN_CONTROLLER_TYPE)AcquiredNode, v16, v17, v18);
  }
  if( v5 )
  {
    if( (unsigned int)ViDeadlockCertify(Caller, AcquiredNode) )
    {
      *((_QWORD *)ViDeadlockGlobals + 4107) = ResourceAddress;
      ViDeadlockPreprocessOptions(
        &qword_140C12D90,
        (CHAR *)"Type !deadlock in the debugger for more information.",
        0x1001ui64,
        (UINT64)ResourceAddress,
        (UINT64)AcquiredNode,
        0i64,
        v32);
      VfReportIssueWithOptions(
        0xC4ui64,
        0x1001u,
        (ULONG_PTR)ResourceAddress,
        (ULONG_PTR)AcquiredNode,
        0,
        &qword_140C12D90);
      return 0i64;
    }
    v8 = 0;
    goto LABEL_30;
  }
  return v8;
}

Referenced by:

VfDeadlockAcquireResource
ViDeadlockAnalyze