MiUpdatePerSessionProto

VOID __stdcall MiUpdatePerSessionProto(
        _CONTROL_AREA *ControlArea,
        _SUBSECTION *Subsection,
        _MI_PER_SESSION_PROTOS *Protos,
        UINT64 Insert){
  INT64 *v4; 
  int v5; 
  unsigned __int64 v8; 
  __int64 v9; 
  bool v10; 
  __int64 v11; 
  v4 = (INT64 *)((char *)ControlArea + 72);
  v5 = Insert;
  v8 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)ControlArea + 18);
  if( !v5 )
  {
    RtlAvlRemoveNode((unsigned __int64 *)Subsection + 3, (__int64 *)Protos);
    goto LABEL_9;
  }
  v9 = *((_QWORD *)Subsection + 3);
  v10 = 0;
  if( !v9 )
    goto LABEL_8;
  while( *((_DWORD *)Protos + 16) < *(_DWORD *)(v9 + 64) )
  {
    v11 = *(_QWORD *)v9;
    if( !*(_QWORD *)v9 )
      goto LABEL_8;
LABEL_5:
    v9 = v11;
  }
  v11 = *(_QWORD *)(v9 + 8);
  if( v11 )
    goto LABEL_5;
  v10 = 1;
LABEL_8:
  RtlAvlInsertNodeEx((unsigned __int64 *)Subsection + 3, v9, v10, Protos);
LABEL_9:
  ExReleaseSpinLockExclusiveFromDpcLevel(v4);
  __writecr8(v8);
}

Referenced by:

MiCreatePerSessionProtos
MiDereferenceSubsectionProtos