CmpStopSiloKeyLockTracker

INT64 __stdcall CmpStopSiloKeyLockTracker(PVOID BugCheckParameter2){
  _ETHREAD *CurrentThread; 
  _QWORD *v3; 
  PVOID *v4; 
  INT64 result; 
  PVOID *v6; 
  _QWORD *v7; 
  PVOID P; 
  PVOID *p_P; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)BugCheckParameter2, 0i64);
  *((_DWORD *)BugCheckParameter2 + 2) = *((_DWORD *)BugCheckParameter2 + 2) & 0xFFFFFFFC | 2;
  v3 = (_QWORD *)*((_QWORD *)BugCheckParameter2 + 2);
  p_P = &P;
  P = &P;
  if( v3 != (_QWORD *)((char *)BugCheckParameter2 + 16) )
  {
    v4 = (PVOID *)*((_QWORD *)BugCheckParameter2 + 3);
    P = v3;
    p_P = v4;
    v3[1] = &P;
    *v4 = &P;
    *((_QWORD *)BugCheckParameter2 + 3) = (char *)BugCheckParameter2 + 16;
    *((_QWORD *)BugCheckParameter2 + 2) = (char *)BugCheckParameter2 + 16;
  }
  ExReleasePushLockEx((UINT64)BugCheckParameter2, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  result = (INT64)&P;
  if( P != &P )
  {
    CmpLockRegistry();
    v6 = (PVOID *)P;
    v7 = *(_QWORD **)P;
    if( *((PVOID **)P + 1) != &P )
LABEL_5:
      __fastfail(3u);
    while( 1 )
    {
      if( (PVOID *)v7[1] != v6 )
        goto LABEL_5;
      P = v7;
      v7[1] = &P;
      if( v6 == &P )
        break;
      CmpFreeSiloKeyLockEntry(v6);
      v6 = (PVOID *)P;
      if( *((PVOID **)P + 1) != &P )
        goto LABEL_5;
      v7 = *(_QWORD **)P;
    }
    CmpUnlockRegistry();
  }
  return result;
}

Referenced by:

CmCleanupServerSiloState
CmpFreeSiloContextCallback