ExRegisterExtension

NTSTATUS __stdcall ExRegisterExtension(INT64 *a1, INT64 a2, INT64 a3){
  _ETHREAD *CurrentThread; 
  _BYTE *v6; 
  _EX_HOST *Host; 
  unsigned int v8; 
  unsigned int v9; 
  _ETHREAD *v10; 
  volatile signed __int64 *v11; 
  _BYTE *v12; 
  _BYTE *v13; 
  void(__fastcall *v14)(_QWORD, _QWORD); 
  PVOID v15; 
  void(__fastcall *v16)(__int64, _QWORD); 
  char v17; 
  _QWORD *v18; 
  NTSTATUS v20; 

  if( (a2 & 0xFFFF0000) != 0x10000 || !*(_QWORD *)(a3 + 8) && *(_WORD *)(a3 + 4) )
    return -1073741811;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v6 = KeAbPreAcquire(&ExpHostListLock, 0i64, 0i64);
  if( _InterlockedCompareExchange64(&ExpHostListLock._bf_0, 17i64, 0i64) )
    ExfAcquirePushLockSharedEx(&ExpHostListLock, v6, &ExpHostListLock);
  if( v6 )
    v6[26] |= 1u;
  Host = ExpFindHost(*(_WORD *)a3, *(_WORD *)(a3 + 2));
  if( _InterlockedCompareExchange64(&ExpHostListLock._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(&ExpHostListLock);
  KeAbPostRelease(&ExpHostListLock);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( !Host )
    return -1073741275;
  v8 = *(unsigned __int16 *)(a3 + 4);
  if( (unsigned __int16)v8 < *((_WORD *)Host + 14) )
  {
    v20 = -1073741811;
LABEL_40:
    ExpDereferenceHost(Host);
    return v20;
  }
  v9 = 0;
  if( *(_WORD *)(a3 + 4) )
  {
    while( *(_QWORD *)(*(_QWORD *)(a3 + 8) + 8i64 * v9) )
    {
      if( ++v9 >= v8 )
        goto LABEL_14;
    }
    v20 = -1073741790;
    goto LABEL_40;
  }
LABEL_14:
  v10 = (_ETHREAD *)KeGetCurrentThread();
  --v10->Tcb.KernelApcDisable;
  v11 = (volatile signed __int64 *)(Host + 18);
  v12 = KeAbPreAcquire(Host + 18, 0i64, 0i64);
  v13 = v12;
  if( _interlockedbittestandset64(Host + 18, 0i64) )
    ExfAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Host + 9, v12, Host + 18);
  if( v13 )
    v13[26] |= 1u;
  if( *((_QWORD *)Host + 10) || (Host[22] & 1) != 0 )
  {
    if( (_InterlockedExchangeAdd64(v11, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)Host + 9);
    KeAbPostRelease(Host + 18);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    v20 = -1073741771;
    goto LABEL_40;
  }
  v14 = (void(__fastcall *)(_QWORD, _QWORD))*((_QWORD *)Host + 6);
  if( v14 )
    v14(0i64, *((_QWORD *)Host + 7));
  v15 = *(PVOID *)(a3 + 8);
  if( !v15 )
    v15 = MmBadPointer;
  *((_QWORD *)Host + 10) = v15;
  _InterlockedExchange64((volatile __int64 *)Host + 8, 0i64);
  v16 = (void(__fastcall *)(__int64, _QWORD))*((_QWORD *)Host + 6);
  if( v16 )
    v16(1i64, *((_QWORD *)Host + 7));
  v17 = _InterlockedExchangeAdd64(v11, 0xFFFFFFFFFFFFFFFFui64);
  if( (v17 & 2) != 0 && (v17 & 4) == 0 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)Host + 9);
  KeAbPostRelease(Host + 18);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  v18 = *(_QWORD **)(a3 + 16);
  if( v18 )
    *v18 = *((_QWORD *)Host + 5);
  *a1 = (INT64)Host;
  return 0;
}

Referenced by:

No references.