RtlInsertDynamicFunctionTable

NTSTATUS __stdcall RtlInsertDynamicFunctionTable(
        _DYNAMIC_FUNCTION_TABLE *DynamicTable,
        INT64 a2,
        INT64 r8_0,
        INT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        INT64 a8){
  unsigned __int64 MaximumAddress; 
  unsigned __int64 v10; 
  unsigned int EntryCount; 
  NTSTATUS v13; 
  UINT64 v14; 
  char *bf_0; 
  unsigned int v16; 
  unsigned int v17; 
  unsigned int v18; 
  unsigned __int64 *v19; 
  __int64 v20; 
  bool v21; 
  __int64 v22; 
  PVOID v23; 
  _ETHREAD *v24; 
  unsigned int SessionId; 
  unsigned __int8 v26; 
  _KLOCK_ENTRY *v27; 
  int v28; 
  __int64 v29; 
  __int64 v30; 
  _KLOCK_ENTRY_BOOST_BITMAP v31; 
  __int64 v32; 
  __int64 v33; 
  unsigned __int64 v34; 
  __int64 v35; 
  char *PoolWithQuotaTag; 
  _OWORD *v37; 
  int v38; 
  int v39; 
  unsigned __int64 BaseAddress; 
  unsigned __int64 v41; 
  _EX_PUSH_LOCK *Process; 
  _ETHREAD *CurrentThread; 
  UINT64 a3; 
  PVOID P; 

  if( ((unsigned __int8)DynamicTable & 3) != 0 )
    ExRaiseDatatypeMisalignment();
  BaseAddress = DynamicTable->BaseAddress;
  MaximumAddress = DynamicTable->MaximumAddress;
  v41 = MaximumAddress;
  if( MaximumAddress < BaseAddress )
    return -1073741675;
  v10 = MaximumAddress - BaseAddress;
  if( v10 > 0xFFFFFFFF )
    return -1073741675;
  v39 = v10;
  EntryCount = DynamicTable->EntryCount;
  if( EntryCount > 0x15555555 )
    return -1073741675;
  v38 = 12 * EntryCount;
  P = 0i64;
  v13 = 0;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  Process = (_EX_PUSH_LOCK *)CurrentThread->Tcb.Process;
  --CurrentThread->Tcb.SpecialApcDisable;
  v14 = (UINT64)&Process[266];
  ExAcquirePushLockExclusiveEx(Process + 266, 0i64);
  bf_0 = (char *)Process[265]._bf_0;
  if( bf_0 )
  {
    v16 = *(_DWORD *)bf_0;
    v17 = *((_DWORD *)bf_0 + 1);
  }
  else
  {
    v16 = 0;
    v17 = 0;
  }
  if( v16 + 1 <= v17 )
    goto LABEL_11;
  v33 = v17 + 10;
  if( (unsigned int)v33 < v17 || (v34 = 24 * v33 + 16, v34 >= 0xFFFFFFFF) )
  {
    v13 = -1073741675;
    goto LABEL_22;
  }
  v35 = Process[265]._bf_0;
  P = (PVOID)v35;
  PoolWithQuotaTag = (char *)ExAllocatePoolWithQuotaTag((POOL_TYPE)9, (unsigned int)v34, 0x46447452ui64);
  bf_0 = PoolWithQuotaTag;
  if( PoolWithQuotaTag )
  {
    v37 = PoolWithQuotaTag + 16;
    if( v16 )
    {
      memmove(v37, (const VOID *)(v35 + 16), 24 * v16);
    }
    else
    {
      *v37 = 0i64;
      *((_QWORD *)PoolWithQuotaTag + 4) = 0i64;
      v16 = 1;
    }
    *(_DWORD *)bf_0 = v16;
    *((_DWORD *)bf_0 + 1) = v33;
    bf_0[12] = 0;
    Process[265]._bf_0 = (__int64)bf_0;
LABEL_11:
    v18 = 1;
    if( v16 > 1 )
    {
      v19 = (unsigned __int64 *)(bf_0 + 48);
      do
      {
        if( BaseAddress < *v19 )
          break;
        ++v18;
        v19 += 3;
      }
      while( v18 < v16 );
    }
    if( *(_QWORD *)&bf_0[24 * v18] + (unsigned __int64)*(unsigned int *)&bf_0[24 * v18 + 8] <= BaseAddress )
    {
      v20 = v18;
      v21 = v18 == v16;
      if( v18 >= v16 )
      {
LABEL_19:
        if( !v21 )
          memmove(&bf_0[16 * v18 + 40 + 8 * v18], &bf_0[16 * v18 + 16 + 8 * v18], 24 * (v16 - v18));
        v22 = 3 * v20;
        *(_QWORD *)&bf_0[8 * v22 + 16] = DynamicTable;
        *(_QWORD *)&bf_0[8 * v22 + 24] = BaseAddress;
        *(_DWORD *)&bf_0[8 * v22 + 32] = v39;
        *(_DWORD *)&bf_0[8 * v22 + 36] = v38;
        *(_DWORD *)bf_0 = v16 + 1;
        goto LABEL_22;
      }
      if( *(_QWORD *)&bf_0[24 * v18 + 24] >= v41 )
      {
        v21 = v18 == v16;
        goto LABEL_19;
      }
    }
    v13 = -1073741800;
LABEL_22:
    v23 = P;
    goto LABEL_23;
  }
  v13 = -1073741670;
  v23 = 0i64;
LABEL_23:
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v14, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)v14);
  LODWORD(a3) = 0;
  v24 = (_ETHREAD *)KeGetCurrentThread();
  if( MiGetSystemRegionType(v14) == 1 )
    SessionId = MmGetSessionIdEx(v24->Tcb.ApcState.Process);
  else
    SessionId = -1;
  --v24->Tcb.SpecialApcDisable;
  v26 = ++v24->Tcb.AbAllocationRegionCount;
  v27 = 0i64;
  v28 = ((char)v24->Tcb.AbEntrySummary | (char)v24->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
  while( 1 )
  {
    v21 = !_BitScanReverse((unsigned int *)&v29, v28);
    if( v21 )
      break;
    v28 &= ~(1 << v29);
    v30 = (__int64)&v24->Tcb.LockEntries[v29];
    if( (*(_BYTE *)(v30 + 26) & 1) != 0
      && (*(_DWORD *)(v30 + 32) & 1) == 0
      && (*(_QWORD *)(v30 + 32) & 0x7FFFFFFFFFFFFFFCi64) == (v14 & 0x7FFFFFFFFFFFFFFCi64)
      && *(_DWORD *)(v30 + 40) == SessionId )
    {
      *(_BYTE *)(v30 + 26) &= ~1u;
      if( *(_QWORD *)(v30 + 32) )
      {
        v27 = (_KLOCK_ENTRY *)v30;
        break;
      }
    }
  }
  if( v27 )
  {
    v27->CrossThreadReleasableAndBusyByte |= 2u;
    if( v27->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
      KiAbEntryRemoveFromTree(v27);
    v31.AllFields = (unsigned int)v27->BoostBitmap;
    LODWORD(a3) = v31.AllFields & 0x1FFFF;
    v27->BoostBitmap.AllFields = v31.AllFields & 0xFFFE0000;
    v27->ThreadLocalFlags &= ~1u;
    v27->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
    v32 = v27 - v24->Tcb.LockEntries;
    if( v26 == 1 )
      v24->Tcb.AbEntrySummary |= 1 << v32;
    else
      _InterlockedOr8((volatile signed __int8 *)&v24->Tcb.AbOrphanedEntrySummary, 1 << v32);
  }
  else if( (*(&v24->Tcb.MiscFlags + 1) & 0x10000) == 0 )
  {
    KeBugCheckEx(0x162u, v24, (PVOID)v14, (PVOID)SessionId, 0i64);
  }
  --v24->Tcb.AbAllocationRegionCount;
  KiAbThreadRemoveBoosts(&v24->Tcb, (VOID *)v14, &a3);
  v21 = v24->Tcb.SpecialApcDisable++ == -1;
  if( v21 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v24->Tcb.ApcState.ApcListHead[0].Flink != &v24->Tcb.152 )
    KiCheckForKernelApcDelivery();
  KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
  if( v23 )
    ExFreePoolWithTag(v23, 0x46447452u);
  return v13;
}

Referenced by:

NtSetInformationProcess