master
h 72 lines 2.24 KB
Raw
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 };