SepRmDispatchDataToLsa

NTSTATUS __stdcall SepRmDispatchDataToLsa(_SEP_LSA_WORK_ITEM *WorkQueueItem){
  NTSTATUS v2; 
  _EJOB *v3; 
  _ESERVERSILO_GLOBALS *ServerSiloGlobals; 
  _SEP_RM_LSA_CONNECTION_STATE *p_SeRmSiloState; 
  __int16 v6; 
  _SEP_LSA_WORK_ITEM v7; 
  size_t v8; 
  NTSTATUS v9; 
  VOID *v10; 
  UINT64 v12; 
  VOID *v13; 
  VOID *LsaViewPortMemory; 
  NTSTATUS v15; 
  VOID *LsaBufferAddress; 
  UINT64 RegionSize; 
  _BYTE RequestMessage[512]; 
  _BYTE ReplyMessage[512]; 

  v2 = 0;
  memset(RequestMessage, 0i64, sizeof(RequestMessage));
  memset(ReplyMessage, 0i64, sizeof(ReplyMessage));
  v3 = (_EJOB *)*((_QWORD *)WorkQueueItem + 7);
  LsaBufferAddress = 0i64;
  ServerSiloGlobals = PsGetServerSiloGlobals(v3);
  p_SeRmSiloState = &ServerSiloGlobals->SeRmSiloState;
  if( ServerSiloGlobals->SeRmSiloState.LsaCommandPortHandle )
  {
    v6 = *((_WORD *)WorkQueueItem + 18);
    *(_DWORD *)&ReplyMessage[40] = 0;
    v7 = WorkQueueItem[4];
    *(_WORD *)&RequestMessage[2] = v6 + 48;
    *(_WORD *)RequestMessage = v6 + 8;
    *(_WORD *)ReplyMessage = *((_WORD *)WorkQueueItem + 24);
    *(_WORD *)&ReplyMessage[2] = *(_WORD *)ReplyMessage + 40;
    *(_DWORD *)&RequestMessage[40] = WorkQueueItem[8];
    if( v7 == 1 )
    {
      v8 = WorkQueueItem[9];
      *(_DWORD *)&RequestMessage[44] = 1;
      if( v8 <= 0x1D0 )
      {
        memmove(&RequestMessage[48], WorkQueueItem + 6, v8);
        goto LABEL_5;
      }
    }
    else if( (unsigned int)(v7 - 4) <= 2 )
    {
      v12 = (unsigned int)WorkQueueItem[9];
      v13 = (VOID *)*((_QWORD *)WorkQueueItem + 3);
      if( (unsigned int)v12 > 0x1D0 )
      {
        if( (unsigned int)v12 > 0x1000 )
        {
          v15 = SepAdtCopyToLsaSharedMemory(p_SeRmSiloState->LsaProcessHandle, v13, v12, &LsaBufferAddress);
          v2 = v15;
          if( v15 < 0 )
          {
            SepAuditFailed((unsigned int)v15);
LABEL_5:
            if( v2 >= 0 )
            {
              if( WorkQueueItem[8] != 3 || *((_QWORD *)WorkQueueItem + 5) )
                v9 = ZwRequestWaitReplyPort(
                       (UINT64)p_SeRmSiloState->LsaCommandPortHandle,
                       (__m256i *)RequestMessage,
                       (UINT64)ReplyMessage);
              else
                v9 = ZwRequestPort((UINT64)p_SeRmSiloState->LsaCommandPortHandle, (__m256i *)RequestMessage);
              v2 = v9;
              if( v9 >= 0 )
              {
                v10 = (VOID *)*((_QWORD *)WorkQueueItem + 5);
                if( v10 )
                  memmove(v10, &ReplyMessage[44], WorkQueueItem[12]);
                v2 = *(_DWORD *)&ReplyMessage[40];
              }
              if( *(_DWORD *)&RequestMessage[44] == 3 )
              {
                RegionSize = 0i64;
                return ZwFreeVirtualMemory(
                         p_SeRmSiloState->LsaProcessHandle,
                         (VOID **)&RequestMessage[48],
                         &RegionSize,
                         0x8000ui64);
              }
            }
            return v2;
          }
          LsaViewPortMemory = LsaBufferAddress;
          *(_DWORD *)&RequestMessage[44] = 3;
        }
        else
        {
          memmove(p_SeRmSiloState->RmViewPortMemory, v13, v12);
          LsaViewPortMemory = p_SeRmSiloState->LsaViewPortMemory;
          *(_DWORD *)&RequestMessage[44] = 2;
        }
        v7 = WorkQueueItem[4];
        *(_QWORD *)&RequestMessage[48] = LsaViewPortMemory;
        *(_DWORD *)RequestMessage = 3670032;
      }
      else
      {
        memmove(&RequestMessage[48], v13, v12);
        *(_DWORD *)&RequestMessage[44] = 1;
      }
      if( (unsigned int)(v7 - 4) <= 1 )
        ExFreePoolWithTag(*((PVOID *)WorkQueueItem + 3), 0);
      goto LABEL_5;
    }
    return -1073741811;
  }
  return 0;
}

Referenced by:

SepAdtLogAuditRecord
SepRmCallLsa