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