SepRmCommandServerThread

VOID __stdcall SepRmCommandServerThread(VOID *StartContext){
  NTSTATUS v1; 
  _RM_REPLY_MESSAGE *v2; 
  NTSTATUS v3; 
  PKINTERRUPT_ROUTINE **v4; 
  UINT32 v5; 
  PKINTERRUPT_ROUTINE *v6; 
  _EJOB *v7; 
  __int64 v8; 
  __int16 v9; 
  _EJOB *v10; 
  _EJOB *v11; 
  _ETHREAD *CurrentThread; 
  INT64 v13; 
  bool v14; 
  UINT8 inited; 
  _ETHREAD *v16; 
  UINT8 v17; 
  INT64 v18; 
  bool v19; 
  _ESERVERSILO_GLOBALS *ServerSiloGlobals; 
  INT64 v21; 
  INT64 v22; 
  __m256i Silo; 
  __int128 Object_8; 
  INT64 v25[3]; 
  __int64 v26; 
  _RM_COMMAND_MESSAGE CommandMessage; 
  int v28; 
  _BYTE v29[504]; 
  _RM_REPLY_MESSAGE ReplyMessage[128]; 

  memset(v29, 0i64, sizeof(v29));
  memset(&ReplyMessage[2], 0i64, 0x1F8u);
  Silo.m256i_i64[0] = 0i64;
  SepRmLsaCallProcess = KeGetCurrentThread()->ApcState.Process;
  ObfReferenceObject(SepRmLsaCallProcess);
  v1 = PoRequestShutdownEvent(0i64);
  if( v1 < 0 )
  {
    ZwClose(PortHandle);
    PortHandle = 0i64;
    SepAuditFailed((unsigned int)v1);
  }
  else
  {
    v28 = 0;
    ReplyMessage[1] = 0;
    v2 = 0i64;
    CommandMessage = 33554904;
    ReplyMessage[0] = 33554904;
    while( 1 )
    {
      while( 1 )
      {
        while( 1 )
        {
          do
          {
            v3 = ZwReplyWaitReceivePort(
                   PortHandle,
                   (INT64)&Silo,
                   (INT64)v2,
                   (INT64)&CommandMessage,
                   v21,
                   v22,
                   Silo.m256i_i64[0],
                   Silo.m256i_i64[1]);
            v2 = 0i64;
          }
          while( v3 < 0 && (v3 == -1073741823 || v3 == -1073741813 || v3 == -1073741281) );
          v7 = (_EJOB *)Silo.m256i_i64[0];
          if( Silo.m256i_i64[0] == -8 )
          {
            LODWORD(v8) = HalSystemVectorDispatchEntry(v5, v4, v6);
            v7 = (_EJOB *)v8;
            Silo.m256i_i64[0] = v8;
          }
          v9 = v28 & 0x7FFF;
          LOWORD(v28) = v9;
          if( v9 != 1 )
            break;
          if( (unsigned int)(*(_DWORD *)&v29[32] - 1) <= 0xB )
          {
            LODWORD(v10) = PsAttachSiloToCurrentThread((INT64)v7);
            v11 = v10;
            ((void(__fastcall *)(_RM_COMMAND_MESSAGE *, _RM_REPLY_MESSAGE *))SepRmCommandDispatch[*(int *)&v29[32]])(
              &CommandMessage,
              ReplyMessage);
            PsDetachSiloFromCurrentThread(v11);
            v2 = ReplyMessage;
            ReplyMessage[6] = *(_DWORD *)&v29[16];
            *(_OWORD *)&ReplyMessage[2] = *(_OWORD *)v29;
          }
        }
        if( v9 == 5 )
          break;
        if( v9 == 10 )
          SepRmLsaConnectRequest(&CommandMessage);
      }
      if( PsIsHostSilo(v7) )
      {
        SepRmAuditingEnabled = 0;
        v26 = 0i64;
        memset(v25, 0, sizeof(v25));
        memset(&Silo.m256i_u64[1], 0, 24);
        Object_8 = 0i64;
        KeInitializeEvent((INT64)&Silo.m256i_i64[1], 0, 0);
        KeInitializeEvent((INT64)&v25[1], 0, 0);
        KeInitializeEvent((INT64)&Object_8, 0, 0);
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        --CurrentThread->Tcb.KernelApcDisable;
        ExAcquireResourceExclusiveLite((UINT64)&stru_140C543C0, 1, v13);
        qword_140C54460 = (__int64)&Silo.m256i_i64[1];
        v14 = *(_QWORD *)&SepLsaAuditQueueInfo == (_QWORD)&SepLsaAuditQueueInfo;
        ExReleaseResourceLite(&stru_140C543C0);
        KeLeaveCriticalRegion();
        inited = SepAdtInitLsaDeadEventForNonPagedList((_KEVENT *)&Object_8);
        v16 = (_ETHREAD *)KeGetCurrentThread();
        v17 = inited;
        --v16->Tcb.KernelApcDisable;
        ExAcquireResourceExclusiveLite((UINT64)&stru_140C54280, 1, v18);
        qword_140C54320 = (__int64)&v25[1];
        v19 = *(_QWORD *)&SepLsaDeletedLogonQueueInfo == (_QWORD)&SepLsaDeletedLogonQueueInfo;
        ExReleaseResourceLite(&stru_140C54280);
        KeLeaveCriticalRegion();
        if( !v14 )
          KeWaitForSingleObject((UINT64)&Silo.m256i_u64[1], 0, 0, 0, 0i64);
        if( v17 )
          KeWaitForSingleObject((UINT64)&Object_8, 0, 0, 0, 0i64);
        if( !v19 )
          KeWaitForSingleObject((UINT64)&v25[1], 0, 0, 0, 0i64);
        ZwClose(PortHandle);
        PortHandle = 0i64;
        v7 = (_EJOB *)Silo.m256i_i64[0];
      }
      ServerSiloGlobals = PsGetServerSiloGlobals(v7);
      SepRmCleanupRmLsaState(&ServerSiloGlobals->SeRmSiloState);
      if( PsIsHostSilo((_EJOB *)Silo.m256i_i64[0]) )
        break;
      ObfDereferenceObjectWithTag((VOID *)Silo.m256i_i64[0], 0x74536553ui64);
      Silo.m256i_i64[0] = (__int64)MmBadPointer;
    }
  }
}

Referenced by:

No references.