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