2 * PROJECT: ReactOS API tests
3 * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
4 * PURPOSE: Test for NtAcceptConnectPort
5 * PROGRAMMERS: Thomas Faber <thomas.faber@reactos.org>
12 #define TEST_CONNECTION_INFO_SIGNATURE1 0xaabb0123
13 #define TEST_CONNECTION_INFO_SIGNATURE2 0xaabb0124
14 typedef struct _TEST_CONNECTION_INFO
17 } TEST_CONNECTION_INFO
, *PTEST_CONNECTION_INFO
;
19 #define TEST_MESSAGE_MESSAGE 0x4455cdef
20 typedef struct _TEST_MESSAGE
24 } TEST_MESSAGE
, *PTEST_MESSAGE
;
26 static UNICODE_STRING PortName
= RTL_CONSTANT_STRING(L
"\\NtdllApitestNtAcceptConnectPortTestPort");
27 static UINT ServerThreadId
;
28 static UINT ClientThreadId
;
34 _Inout_ PVOID Parameter
)
39 HANDLE ServerPortHandle
= Parameter
;
41 /* Listen, but refuse the connection */
42 RtlZeroMemory(&Message
, sizeof(Message
));
43 Status
= NtListenPort(ServerPortHandle
,
45 ok_hex(Status
, STATUS_SUCCESS
);
47 ok(Message
.Header
.u1
.s1
.TotalLength
== RTL_SIZEOF_THROUGH_FIELD(TEST_MESSAGE
, Message
),
48 "TotalLength = %u, expected %lu\n",
49 Message
.Header
.u1
.s1
.TotalLength
, RTL_SIZEOF_THROUGH_FIELD(TEST_MESSAGE
, Message
));
50 ok(Message
.Header
.u1
.s1
.DataLength
== sizeof(TEST_CONNECTION_INFO
),
51 "DataLength = %u\n", Message
.Header
.u1
.s1
.DataLength
);
52 ok(Message
.Header
.u2
.s2
.Type
== LPC_CONNECTION_REQUEST
,
53 "Type = %x\n", Message
.Header
.u2
.s2
.Type
);
54 ok(Message
.Header
.ClientId
.UniqueProcess
== UlongToHandle(GetCurrentProcessId()),
55 "UniqueProcess = %p, expected %lx\n",
56 Message
.Header
.ClientId
.UniqueProcess
, GetCurrentProcessId());
57 ok(Message
.Header
.ClientId
.UniqueThread
== UlongToHandle(ClientThreadId
),
58 "UniqueThread = %p, expected %x\n",
59 Message
.Header
.ClientId
.UniqueThread
, ClientThreadId
);
60 ok(Message
.Message
== TEST_CONNECTION_INFO_SIGNATURE1
, "Message = %lx\n", Message
.Message
);
62 PortHandle
= (PVOID
)(ULONG_PTR
)0x55555555;
63 Status
= NtAcceptConnectPort(&PortHandle
,
69 ok_hex(Status
, STATUS_SUCCESS
);
70 ok(PortHandle
== (PVOID
)(ULONG_PTR
)0x55555555, "PortHandle = %p\n", PortHandle
);
72 /* Listen a second time, then accept */
73 RtlZeroMemory(&Message
, sizeof(Message
));
74 Status
= NtListenPort(ServerPortHandle
,
76 ok_hex(Status
, STATUS_SUCCESS
);
78 ok(Message
.Header
.u1
.s1
.TotalLength
== RTL_SIZEOF_THROUGH_FIELD(TEST_MESSAGE
, Message
),
79 "TotalLength = %u, expected %lu\n",
80 Message
.Header
.u1
.s1
.TotalLength
, RTL_SIZEOF_THROUGH_FIELD(TEST_MESSAGE
, Message
));
81 ok(Message
.Header
.u1
.s1
.DataLength
== sizeof(TEST_CONNECTION_INFO
),
82 "DataLength = %u\n", Message
.Header
.u1
.s1
.DataLength
);
83 ok(Message
.Header
.u2
.s2
.Type
== LPC_CONNECTION_REQUEST
,
84 "Type = %x\n", Message
.Header
.u2
.s2
.Type
);
85 ok(Message
.Header
.ClientId
.UniqueProcess
== UlongToHandle(GetCurrentProcessId()),
86 "UniqueProcess = %p, expected %lx\n",
87 Message
.Header
.ClientId
.UniqueProcess
, GetCurrentProcessId());
88 ok(Message
.Header
.ClientId
.UniqueThread
== UlongToHandle(ClientThreadId
),
89 "UniqueThread = %p, expected %x\n",
90 Message
.Header
.ClientId
.UniqueThread
, ClientThreadId
);
91 ok(Message
.Message
== TEST_CONNECTION_INFO_SIGNATURE2
, "Message = %lx\n", Message
.Message
);
93 Status
= NtAcceptConnectPort(&PortHandle
,
99 ok_hex(Status
, STATUS_SUCCESS
);
101 Status
= NtCompleteConnectPort(PortHandle
);
102 ok_hex(Status
, STATUS_SUCCESS
);
104 RtlZeroMemory(&Message
, sizeof(Message
));
105 Status
= NtReplyWaitReceivePort(PortHandle
,
109 ok_hex(Status
, STATUS_SUCCESS
);
111 ok(Message
.Header
.u1
.s1
.TotalLength
== sizeof(Message
),
112 "TotalLength = %u, expected %Iu\n",
113 Message
.Header
.u1
.s1
.TotalLength
, sizeof(Message
));
114 ok(Message
.Header
.u1
.s1
.DataLength
== sizeof(Message
.Message
),
115 "DataLength = %u\n", Message
.Header
.u1
.s1
.DataLength
);
116 ok(Message
.Header
.u2
.s2
.Type
== LPC_DATAGRAM
,
117 "Type = %x\n", Message
.Header
.u2
.s2
.Type
);
118 ok(Message
.Header
.ClientId
.UniqueProcess
== UlongToHandle(GetCurrentProcessId()),
119 "UniqueProcess = %p, expected %lx\n",
120 Message
.Header
.ClientId
.UniqueProcess
, GetCurrentProcessId());
121 ok(Message
.Header
.ClientId
.UniqueThread
== UlongToHandle(ClientThreadId
),
122 "UniqueThread = %p, expected %x\n",
123 Message
.Header
.ClientId
.UniqueThread
, ClientThreadId
);
124 ok(Message
.Message
== TEST_MESSAGE_MESSAGE
, "Message = %lx\n", Message
.Message
);
126 Status
= NtClose(PortHandle
);
127 ok_hex(Status
, STATUS_SUCCESS
);
135 _Inout_ PVOID Parameter
)
139 TEST_CONNECTION_INFO ConnectInfo
;
140 ULONG ConnectInfoLength
;
141 SECURITY_QUALITY_OF_SERVICE SecurityQos
;
142 TEST_MESSAGE Message
;
144 SecurityQos
.Length
= sizeof(SecurityQos
);
145 SecurityQos
.ImpersonationLevel
= SecurityIdentification
;
146 SecurityQos
.EffectiveOnly
= TRUE
;
147 SecurityQos
.ContextTrackingMode
= SECURITY_STATIC_TRACKING
;
149 /* Attempt to connect -- will be rejected */
150 ConnectInfo
.Signature
= TEST_CONNECTION_INFO_SIGNATURE1
;
151 ConnectInfoLength
= sizeof(ConnectInfo
);
152 PortHandle
= (PVOID
)(ULONG_PTR
)0x55555555;
153 Status
= NtConnectPort(&PortHandle
,
161 ok_hex(Status
, STATUS_PORT_CONNECTION_REFUSED
);
162 ok(PortHandle
== (PVOID
)(ULONG_PTR
)0x55555555, "PortHandle = %p\n", PortHandle
);
164 /* Try again, this time it will be accepted */
165 ConnectInfo
.Signature
= TEST_CONNECTION_INFO_SIGNATURE2
;
166 ConnectInfoLength
= sizeof(ConnectInfo
);
167 Status
= NtConnectPort(&PortHandle
,
175 ok_hex(Status
, STATUS_SUCCESS
);
176 if (!NT_SUCCESS(Status
))
178 skip("Failed to connect\n");
182 RtlZeroMemory(&Message
, sizeof(Message
));
183 Message
.Header
.u1
.s1
.TotalLength
= sizeof(Message
);
184 Message
.Header
.u1
.s1
.DataLength
= sizeof(Message
.Message
);
185 Message
.Message
= TEST_MESSAGE_MESSAGE
;
186 Status
= NtRequestPort(PortHandle
,
188 ok_hex(Status
, STATUS_SUCCESS
);
190 Status
= NtClose(PortHandle
);
191 ok_hex(Status
, STATUS_SUCCESS
);
196 START_TEST(NtAcceptConnectPort
)
199 OBJECT_ATTRIBUTES ObjectAttributes
;
201 HANDLE ThreadHandles
[2];
203 InitializeObjectAttributes(&ObjectAttributes
,
205 OBJ_CASE_INSENSITIVE
,
208 Status
= NtCreatePort(&PortHandle
,
210 sizeof(TEST_CONNECTION_INFO
),
211 sizeof(TEST_MESSAGE
),
212 2 * sizeof(TEST_MESSAGE
));
213 ok_hex(Status
, STATUS_SUCCESS
);
214 if (!NT_SUCCESS(Status
))
216 skip("Failed to create port\n");
220 ThreadHandles
[0] = (HANDLE
)_beginthreadex(NULL
,
226 ok(ThreadHandles
[0] != NULL
, "_beginthreadex failed\n");
228 ThreadHandles
[1] = (HANDLE
)_beginthreadex(NULL
,
234 ok(ThreadHandles
[1] != NULL
, "_beginthreadex failed\n");
236 Status
= NtWaitForMultipleObjects(RTL_NUMBER_OF(ThreadHandles
),
241 ok_hex(Status
, STATUS_SUCCESS
);
243 Status
= NtClose(ThreadHandles
[0]);
244 ok_hex(Status
, STATUS_SUCCESS
);
245 Status
= NtClose(ThreadHandles
[1]);
246 ok_hex(Status
, STATUS_SUCCESS
);
248 Status
= NtClose(PortHandle
);
249 ok_hex(Status
, STATUS_SUCCESS
);