| 1 | /*++ |
| 2 | |
| 3 | Copyright (c) Microsoft. All rights reserved. |
| 4 | |
| 5 | Module Name: |
| 6 | |
| 7 | LxssMessagePort.h |
| 8 | |
| 9 | Abstract: |
| 10 | |
| 11 | This file contains declarations for the message port wrapper class. |
| 12 | |
| 13 | --*/ |
| 14 | |
| 15 | #pragma once |
| 16 | |
| 17 | #include "LxssPort.h" |
| 18 | |
| 19 | class LxssServerPort; |
| 20 | |
| 21 | class LxssMessagePort : public LxssPort |
| 22 | { |
| 23 | public: |
| 24 | static inline DWORD c_defaultMessageTimeout = 30000; |
| 25 | |
| 26 | LxssMessagePort(_In_ HANDLE MessagePort); |
| 27 | LxssMessagePort(_In_ LxssMessagePort&& Source); |
| 28 | LxssMessagePort(_In_ std::unique_ptr<LxssMessagePort>&& SourcePointer); |
| 29 | virtual ~LxssMessagePort() = default; |
| 30 | |
| 31 | std::shared_ptr<LxssPort> CreateSessionLeader(_In_ HANDLE ClientProcess) override; |
| 32 | void DisconnectConsole(_In_ HANDLE ClientProcess) override; |
| 33 | wil::cs_leave_scope_exit Lock() override; |
| 34 | void Receive(_Out_writes_bytes_(Length) PVOID Buffer, _In_ ULONG Length, _In_opt_ HANDLE ClientProcess = nullptr, _In_ DWORD Timeout = INFINITE) override; |
| 35 | void Send(_In_reads_bytes_(Length) PVOID Buffer, _In_ ULONG Length) override; |
| 36 | |
| 37 | wil::unique_handle CreateUnnamedServer(_Out_ PLXBUS_SERVER_ID ServerId) const; |
| 38 | |
| 39 | LXBUS_IPC_CONSOLE_ID |
| 40 | MarshalConsole(_In_ PCLXBUS_IPC_MESSAGE_MARSHAL_CONSOLE_DATA ConsoleData) const; |
| 41 | |
| 42 | LXBUS_IPC_FORK_TOKEN_ID |
| 43 | MarshalForkToken(_In_ HANDLE TokenHandle) const; |
| 44 | |
| 45 | LXBUS_IPC_HANDLE_ID |
| 46 | MarshalHandle(_In_ PCLXBUS_IPC_MESSAGE_MARSHAL_HANDLE_DATA HandleData) const; |
| 47 | |
| 48 | LXBUS_IPC_PROCESS_ID |
| 49 | MarshalProcess(_In_ HANDLE ProcessHandle, _In_ bool TerminateOnClose) const; |
| 50 | |
| 51 | std::vector<gsl::byte> Receive(DWORD Timeout = c_defaultMessageTimeout); |
| 52 | |
| 53 | void ReleaseConsole(_In_ LXBUS_IPC_CONSOLE_ID ConsoleId) const; |
| 54 | |
| 55 | void ReleaseForkToken(_In_ LXBUS_IPC_FORK_TOKEN_ID HandleId) const; |
| 56 | |
| 57 | void ReleaseHandle(_In_ LXBUS_IPC_HANDLE_ID HandleId) const; |
| 58 | |
| 59 | void SetServerPort(_In_ const std::shared_ptr<LxssServerPort>& ServerPort); |
| 60 | |
| 61 | wil::unique_handle UnmarshalProcess(_In_ LXBUS_IPC_PROCESS_ID ProcessId) const; |
| 62 | |
| 63 | wil::unique_handle UnmarshalVfsFile(_In_ LXBUS_IPC_HANDLE_ID VfsFileId) const; |
| 64 | |
| 65 | private: |
| 66 | void WaitForMessage(_In_ PIO_STATUS_BLOCK IoStatus, _In_ DWORD Timeout = INFINITE) const; |
| 67 | |
| 68 | wil::critical_section m_lock; |
| 69 | wil::unique_handle m_messagePort; |
| 70 | wil::unique_event m_messageEvent; |
| 71 | std::shared_ptr<LxssServerPort> m_serverPort; |
| 72 | }; |