Merge 13159:13510 from trunk
[reactos.git] / reactos / ntoskrnl / lpc / create.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/lpc/create.c
6 * PURPOSE: Communication mechanism
7 *
8 * PROGRAMMERS: David Welch (welch@cwcom.net)
9 */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <ntoskrnl.h>
14 #define NDEBUG
15 #include <internal/debug.h>
16
17 /**********************************************************************
18 * NAME
19 * LpcpVerifyCreateParameters/5
20 *
21 * DESCRIPTION
22 * Verify user parameters in NtCreatePort and in
23 * NtCreateWaitablePort.
24 *
25 * ARGUMENTS
26 *
27 * RETURN VALUE
28 */
29 STATIC NTSTATUS STDCALL
30 LpcpVerifyCreateParameters (IN PHANDLE PortHandle,
31 IN POBJECT_ATTRIBUTES ObjectAttributes,
32 IN ULONG MaxConnectInfoLength,
33 IN ULONG MaxDataLength,
34 IN ULONG MaxPoolUsage)
35 {
36 if (NULL == PortHandle)
37 {
38 return (STATUS_INVALID_PARAMETER_1);
39 }
40 if (NULL == ObjectAttributes)
41 {
42 return (STATUS_INVALID_PARAMETER_2);
43 }
44 if ((ObjectAttributes->Attributes & OBJ_OPENLINK)
45 || (ObjectAttributes->Attributes & OBJ_OPENIF)
46 || (ObjectAttributes->Attributes & OBJ_EXCLUSIVE)
47 || (ObjectAttributes->Attributes & OBJ_PERMANENT)
48 || (ObjectAttributes->Attributes & OBJ_INHERIT))
49 {
50 return (STATUS_INVALID_PORT_ATTRIBUTES);
51 }
52 if (MaxConnectInfoLength > PORT_MAX_DATA_LENGTH)
53 {
54 return (STATUS_INVALID_PARAMETER_3);
55 }
56 if (MaxDataLength > PORT_MAX_MESSAGE_LENGTH)
57 {
58 return (STATUS_INVALID_PARAMETER_4);
59 }
60 /* TODO: some checking is done also on MaxPoolUsage
61 * to avoid choking the executive */
62 return (STATUS_SUCCESS);
63 }
64
65
66 /**********************************************************************
67 * NAME
68 * NiCreatePort/4
69 *
70 * DESCRIPTION
71 *
72 * ARGUMENTS
73 *
74 * RETURN VALUE
75 */
76 NTSTATUS STDCALL
77 NiCreatePort (PVOID ObjectBody,
78 PVOID Parent,
79 PWSTR RemainingPath,
80 POBJECT_ATTRIBUTES ObjectAttributes)
81 {
82 if (RemainingPath == NULL)
83 {
84 return (STATUS_SUCCESS);
85 }
86
87 if (wcschr(RemainingPath+1, '\\') != NULL)
88 {
89 return (STATUS_UNSUCCESSFUL);
90 }
91
92 return (STATUS_SUCCESS);
93 }
94
95
96 /**********************************************************************
97 * NAME EXPORTED
98 * NtCreatePort/5
99 *
100 * DESCRIPTION
101 *
102 * ARGUMENTS
103 * PortHandle,
104 * ObjectAttributes,
105 * MaxConnectInfoLength,
106 * MaxDataLength,
107 * MaxPoolUsage: size of NP zone the NP part of msgs is kept in
108 *
109 * RETURN VALUE
110 */
111 /*EXPORTED*/ NTSTATUS STDCALL
112 NtCreatePort (PHANDLE PortHandle,
113 POBJECT_ATTRIBUTES ObjectAttributes,
114 ULONG MaxConnectInfoLength,
115 ULONG MaxDataLength,
116 ULONG MaxPoolUsage)
117 {
118 PEPORT Port;
119 NTSTATUS Status;
120
121 DPRINT("NtCreatePort() Name %x\n", ObjectAttributes->ObjectName->Buffer);
122
123 /* Verify parameters */
124 Status = LpcpVerifyCreateParameters (PortHandle,
125 ObjectAttributes,
126 MaxConnectInfoLength,
127 MaxDataLength,
128 MaxPoolUsage);
129 if (STATUS_SUCCESS != Status)
130 {
131 return (Status);
132 }
133
134 /* Ask Ob to create the object */
135 Status = ObCreateObject (ExGetPreviousMode(),
136 LpcPortObjectType,
137 ObjectAttributes,
138 ExGetPreviousMode(),
139 NULL,
140 sizeof(EPORT),
141 0,
142 0,
143 (PVOID*)&Port);
144 if (!NT_SUCCESS(Status))
145 {
146 return (Status);
147 }
148
149 Status = ObInsertObject ((PVOID)Port,
150 NULL,
151 PORT_ALL_ACCESS,
152 0,
153 NULL,
154 PortHandle);
155 if (!NT_SUCCESS(Status))
156 {
157 ObDereferenceObject (Port);
158 return (Status);
159 }
160
161 Status = LpcpInitializePort (Port, EPORT_TYPE_SERVER_RQST_PORT, NULL);
162 Port->MaxConnectInfoLength = PORT_MAX_DATA_LENGTH;
163 Port->MaxDataLength = PORT_MAX_MESSAGE_LENGTH;
164 Port->MaxPoolUsage = MaxPoolUsage;
165
166 ObDereferenceObject (Port);
167
168 return (Status);
169 }
170
171 /**********************************************************************
172 * NAME EXPORTED
173 * NtCreateWaitablePort/5
174 *
175 * DESCRIPTION
176 * Waitable ports can be connected to with NtSecureConnectPort.
177 * No port interface can be used with waitable ports but
178 * NtReplyWaitReceivePort and NtReplyWaitReceivePortEx.
179 * Present only in w2k+.
180 *
181 * ARGUMENTS
182 * PortHandle,
183 * ObjectAttributes,
184 * MaxConnectInfoLength,
185 * MaxDataLength,
186 * MaxPoolUsage
187 *
188 * RETURN VALUE
189 */
190 /*EXPORTED*/ NTSTATUS STDCALL
191 NtCreateWaitablePort (OUT PHANDLE PortHandle,
192 IN POBJECT_ATTRIBUTES ObjectAttributes,
193 IN ULONG MaxConnectInfoLength,
194 IN ULONG MaxDataLength,
195 IN ULONG MaxPoolUsage)
196 {
197 NTSTATUS Status;
198
199 /* Verify parameters */
200 Status = LpcpVerifyCreateParameters (PortHandle,
201 ObjectAttributes,
202 MaxConnectInfoLength,
203 MaxDataLength,
204 MaxPoolUsage);
205 if (STATUS_SUCCESS != Status)
206 {
207 return (Status);
208 }
209 /* TODO */
210 return (STATUS_NOT_IMPLEMENTED);
211 }
212
213 /* EOF */