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