ViDeadlockAddResource
UINT64 __stdcall ViDeadlockAddResource(
VOID *Resource,
_VI_DEADLOCK_RESOURCE_TYPE Type,
VOID *ReservedResource,
VOID **StackTrace,
VOID **ResourceToFree,
VOID **NodesToFree){
__int64 v6;
_VI_DEADLOCK_RESOURCE *Param3;
unsigned int v11;
_VI_DEADLOCK_RESOURCE *v12;
_ETHREAD *CurrentThread;
_VF_ADDRESS_RANGE *v14;
__int64 v15;
_QWORD *v16;
unsigned __int64 v17;
__int64 v18;
__int64 v19;
UINT64 v20;
__int64 v21;
UINT64 v23;
v6 = Type;
if( (unsigned int)Type > VfDeadlockEresource )
return 0i64;
Param3 = ViDeadlockSearchResource(Resource, NodesToFree);
v11 = 0;
v12 = Param3;
if( Param3 )
{
if( (ViDeadlockResourceTypeInfo[v6] & 8) == 0 )
{
ViDeadlockPreprocessOptions(
(UINT64 *)((char *)&qword_140C12D90 + 4),
(CHAR *)"Re-initializing active lock 0x%p.",
0x1005ui64,
(UINT64)Resource,
(UINT64)Param3,
0i64,
v23);
VfReportIssueWithOptions(
0xC4ui64,
0x1005u,
(ULONG_PTR)Resource,
(ULONG_PTR)v12,
0,
(UINT64 *)((char *)&qword_140C12D90 + 4));
}
if( v12->ThreadOwner )
{
ViDeadlockPreprocessOptions(
&qword_140C12D84,
(CHAR *)"Re-initializing active lock 0x%p.",
0x1005ui64,
(UINT64)Resource,
(UINT64)v12,
1ui64,
v23);
VfReportIssueWithOptions(0xC4ui64, 0x1005u, (ULONG_PTR)Resource, (ULONG_PTR)v12, 1u, &qword_140C12D84);
}
ViDeadlockRemoveResource(v12, 0i64, NodesToFree);
*ResourceToFree = v12;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (Resource >= CurrentThread->Tcb.InitialStack || Resource <= CurrentThread->Tcb.StackLimit) && ReservedResource )
{
v14 = (_VF_ADDRESS_RANGE *)ViDeadlockGlobals;
*((_QWORD *)ReservedResource + 4) = (char *)ReservedResource + 24;
*((_QWORD *)ReservedResource + 3) = (char *)ReservedResource + 24;
*((_QWORD *)ReservedResource + 15) = 0i64;
*((_QWORD *)ReservedResource + 23) = 0i64;
*((_DWORD *)ReservedResource + 1) = 0;
*((_QWORD *)ReservedResource + 2) = 0i64;
*(_DWORD *)ReservedResource = v6;
*((_QWORD *)ReservedResource + 1) = Resource;
*(_OWORD *)((char *)ReservedResource + 56) = *(_OWORD *)StackTrace;
v15 = (((unsigned __int64)Resource >> 12) * (unsigned __int128)0x40100401004011ui64) >> 64;
*(_OWORD *)((char *)ReservedResource + 72) = *((_OWORD *)StackTrace + 1);
*(_OWORD *)((char *)ReservedResource + 88) = *((_OWORD *)StackTrace + 2);
*(_OWORD *)((char *)ReservedResource + 104) = *((_OWORD *)StackTrace + 3);
v16 = (char *)ReservedResource + 40;
v17 = ((unsigned __int64)Resource >> 12) - 1023 * ((v15 + ((((unsigned __int64)Resource >> 12) - v15) >> 1)) >> 9);
v18 = (__int64)&v14[1].Start[16 * v17];
v19 = *(_QWORD *)v18;
if( *(_QWORD *)(*(_QWORD *)v18 + 8i64) != v18 )
__fastfail(3u);
v20 = (unsigned int)ViDeadlockResourceTypeSizeInfo[v6];
*v16 = v19;
v16[1] = v18;
*(_QWORD *)(v19 + 8) = v16;
*(_QWORD *)v18 = v16;
VfUtilAddressRangeAdd(&v14[v17 + 2], (UINT8 *)Resource, v20);
++*(_QWORD *)(v21 + 24);
return 1;
}
return v11;
}Referenced by:
VfDeadlockAcquireResource
VfDeadlockInitializeResource