MiInsertHotPatchRecord

VOID __fastcall MiInsertHotPatchRecord(RTL_BALANCED_NODE **a1, RTL_BALANCED_NODE *a2, INT64 a3){
  __int64 *v3; 
  int v4; 
  RTL_BALANCED_NODE *v5; 
  _ETHREAD *CurrentThread; 
  bool v8; 
  __int64 *v9; 
  int v10; 
  int v11; 
  __int64 v12; 
  v3 = 0i64;
  v4 = a3;
  v5 = a2;
  if( (_DWORD)a3 )
  {
    CurrentThread = 0i64;
  }
  else
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 243);
    ExAcquirePushLockExclusiveEx((UINT64)&MiHotPatchListLock, 0i64);
    v5 = a2;
  }
  v8 = 0;
LABEL_5:
  v9 = (__int64 *)*a1;
  v10 = 1;
  if( *a1 )
  {
    while( 1 )
    {
      v11 = MiCompareHotPatchNodes((INT64)v5, (INT64)v9);
      if( v11 <= 0 )
      {
        if( v11 >= 0 )
        {
          v3 = v9;
          RtlAvlRemoveNode((unsigned __int64 *)a1, v9);
          v5 = a2;
          goto LABEL_5;
        }
        v12 = *v9;
        if( !*v9 )
          break;
      }
      else
      {
        v12 = v9[1];
        if( !v12 )
        {
          v8 = 1;
          break;
        }
      }
      v9 = (__int64 *)v12;
      v5 = a2;
    }
  }
  RtlAvlInsertNodeEx((unsigned __int64 *)a1, (__int64)v9, v8, a2);
  if( MiHotPatchGeneration != -1 )
    v10 = MiHotPatchGeneration + 1;
  MiHotPatchGeneration = v10;
  if( !v4 )
  {
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&MiHotPatchListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)&MiHotPatchListLock);
    KeAbPostRelease(&MiHotPatchListLock);
    KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  }
  if( v3 )
    ExFreePoolWithTag(v3, 0);
}

Referenced by:

MiLoadHotPatch
MiLoadHotPatchForUserSid
MmRegisterHotPatch