SepRmCallLsa

INT64 __fastcall SepRmCallLsa(INT64 a1){
  char v1; 
  int v3; 
  INT64 v4; 
  _ETHREAD *CurrentThread; 
  INT64 v6; 
  __int64 v7; 
  signed __int32 v8; 
  void *v9; 
  INT64 result; 
  _ETHREAD *v11; 
  __int64 v12; 
  __int64 v13; 
  int v14; 
  NTSTATUS v15; 
  struct _KEVENT *v16; 
  _QWORD *v17; 
  __int64 *v18; 
  struct _KEVENT *v19; 
  __int64 v20; 
  char pbPreventCoaf[8]; 
  HANDLE Object; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  _KAPC_STATE ApcState; 
  Object = 0i64;
  v1 = SepRmAuditingEnabled;
  memset(&ApcState, 0, sizeof(ApcState));
  v3 = 1;
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( !AdtpRegisteredWithEtw )
  {
    SepAdtOpenEtwReadyEvent();
    if( (int)result < 0 )
      return result;
    v15 = NtWaitForSingleObject(Object, 1u, 0i64);
    NtClose(Object);
    if( v15 < 0 )
      return(unsigned int)v15;
  }
  if( v1 )
    KiStackAttachProcess((_KPROCESS *)SepRmLsaCallProcess, 0i64, &ApcState);
  do
  {
    v4 = 0i64;
    if( (*(_BYTE *)(a1 + 224) & 1) == 0 )
      goto LABEL_46;
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    ExAcquireResourceExclusiveLite((ERESOURCE *)(a1 + 32), 1u);
    v6 = *(_QWORD *)a1;
    if( *(_QWORD *)a1 == a1 )
    {
      v16 = *(struct _KEVENT **)(a1 + 192);
      if( v16 )
        KeSetEvent(v16, 0);
    }
    else if( *(_DWORD *)(v6 + 52) == *(_DWORD *)(a1 + 184) + 1 )
    {
      v4 = *(_QWORD *)a1;
      v7 = *(_QWORD *)v6;
      if( *(_QWORD *)(v6 + 8) != a1 || *(_QWORD *)(v7 + 8) != v6 )
LABEL_43:
        __fastfail(3u);
      *(_QWORD *)a1 = v7;
      *(_QWORD *)(v7 + 8) = a1;
    }
    ExReleaseResourceLite((PERESOURCE)(a1 + 32));
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    if( !v4 )
    {
LABEL_46:
      if( (*(_BYTE *)(a1 + 224) & 2) == 0 )
        continue;
      KeAcquireInStackQueuedSpinLock((UINT64 *)(a1 + 136), &LockHandle);
      v17 = (_QWORD *)(a1 + 16);
      v18 = *(__int64 **)(a1 + 16);
      if( v18 == (__int64 *)(a1 + 16) )
      {
        v19 = *(struct _KEVENT **)(a1 + 200);
        if( v19 )
          KeSetEvent(v19, 0);
      }
      else if( *((_DWORD *)v18 + 13) == *(_DWORD *)(a1 + 184) + 1 )
      {
        v4 = *(_QWORD *)(a1 + 16);
        v20 = *v18;
        if( (_QWORD *)v18[1] != v17 || *(__int64 **)(v20 + 8) != v18 )
          goto LABEL_43;
        *v17 = v20;
        *(_QWORD *)(v20 + 8) = v17;
      }
      KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
      __writecr8(LockHandle.OldIrql);
      if( !v4 )
        continue;
    }
    if( *(_DWORD *)(v4 + 32) != 1 || (*(_DWORD *)(*(_QWORD *)(v4 + 24) + 20i64) & 2) != 0 )
    {
      if( v1 )
        SepRmDispatchDataToLsa(v4);
    }
    else
    {
      v11 = (_ETHREAD *)KeGetCurrentThread();
      v12 = *(_QWORD *)(v4 + 56);
      pbPreventCoaf[0] = 0;
      v13 = *((_QWORD *)v11 + 193);
      *((_QWORD *)v11 + 193) = v12;
      v14 = AdtpWriteToEtw(*(_SE_ADT_PARAMETER_ARRAY **)(v4 + 24), (UINT8 *)pbPreventCoaf);
      *((_QWORD *)KeGetCurrentThread() + 193) = v13;
      if( v14 < 0 )
      {
        LODWORD(SepAdtLastAuditFailStatus) = v14;
        _InterlockedIncrement(&SepAdtAuditFailureCount);
        if( !pbPreventCoaf[0] )
          SepAuditFailed((unsigned int)v14);
      }
      if( (unsigned int)(*(_DWORD *)(v4 + 16) - 4) <= 1 )
        ExFreePoolWithTag(*(PVOID *)(v4 + 24), 0);
    }
    _InterlockedIncrement((volatile signed __int32 *)(a1 + 184));
    v8 = _InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 176), 0xFFFFFFFF);
    v9 = *(void **)(v4 + 56);
    v3 = v8 - 1;
    if( v9 )
    {
      ObfDereferenceObjectWithTag(v9, 0x69416553ui64);
      *(_QWORD *)(v4 + 56) = 0i64;
    }
    (*(void(__fastcall **)(INT64))(a1 + 216))(v4);
  }
  while( v3 );
  if( v1 )
    KiUnstackDetachProcess(&ApcState, 0i64);
  return 0i64;
}

Referenced by:

No references.