WdipSemReserveInstanceTableEntry

_QWORD *__fastcall WdipSemReserveInstanceTableEntry(unsigned __int64 a1, GUID *a2){
  _ETHREAD *CurrentThread; 
  _QWORD *v3; 
  _QWORD *v6; 
  _QWORD *v7; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = 0i64;
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&qword_140C1A3B8, 0i64);
  if( a1 && a2 )
  {
    if( (unsigned int)dword_140C1A3B0 >= 0x80 )
    {
      WdipSemLogInflightLimitExceededInformation((const _GUID *)a1, *(_WORD *)(a1 + 16), a2);
    }
    else if( !WdipSemQueryEnabledInstanceTable(a2) )
    {
      WdipSemBuildScenarioInstance(a1);
      v3 = v6;
      if( v6 )
      {
        v7 = (_QWORD *)qword_140C1A3A8;
        if( *(INT64 ***)qword_140C1A3A8 != &WdipSemEnabledInstanceTable )
          __fastfail(3u);
        *v3 = &WdipSemEnabledInstanceTable;
        v3[1] = v7;
        *v7 = v3;
        ++dword_140C1A3B0;
        qword_140C1A3A8 = (__int64)v3;
      }
    }
  }
  ExReleasePushLockEx((UINT64)&qword_140C1A3B8, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  return v3;
}

Referenced by:

WdipSemEnableScenario