a5c056b89a1cbb28f0cc2a609f7710ee3bf8f206
[reactos.git] / reactos / dll / win32 / kernel32 / client / file / mailslot.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/file/mailslot.c
5 * PURPOSE: Mailslot functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
7 * UPDATE HISTORY:
8 */
9
10 /* INCLUDES *******************************************************************/
11
12 #include <k32.h>
13 #define NDEBUG
14 #include <debug.h>
15
16 /* FUNCTIONS ******************************************************************/
17
18 /*
19 * @implemented
20 */
21 HANDLE
22 WINAPI
23 CreateMailslotA(IN LPCSTR lpName,
24 IN DWORD nMaxMessageSize,
25 IN DWORD lReadTimeout,
26 IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
27 {
28 /* Call the W(ide) function */
29 ConvertWin32AnsiObjectApiToUnicodeApi2(Mailslot, lpName, nMaxMessageSize, lReadTimeout, lpSecurityAttributes);
30 }
31
32 /*
33 * @implemented
34 */
35 HANDLE
36 WINAPI
37 CreateMailslotW(IN LPCWSTR lpName,
38 IN DWORD nMaxMessageSize,
39 IN DWORD lReadTimeout,
40 IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
41 {
42 OBJECT_ATTRIBUTES ObjectAttributes;
43 UNICODE_STRING MailslotName;
44 HANDLE MailslotHandle;
45 NTSTATUS Status;
46 BOOLEAN Result;
47 LARGE_INTEGER DefaultTimeOut;
48 IO_STATUS_BLOCK Iosb;
49 ULONG Attributes = OBJ_CASE_INSENSITIVE;
50 PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
51
52 Result = RtlDosPathNameToNtPathName_U(lpName, &MailslotName, NULL, NULL);
53 if (!Result)
54 {
55 SetLastError(ERROR_PATH_NOT_FOUND);
56 return INVALID_HANDLE_VALUE;
57 }
58
59 DPRINT("Mailslot name: %wZ\n", &MailslotName);
60
61 if (lpSecurityAttributes)
62 {
63 SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
64 if(lpSecurityAttributes->bInheritHandle) Attributes |= OBJ_INHERIT;
65 }
66
67 InitializeObjectAttributes(&ObjectAttributes,
68 &MailslotName,
69 Attributes,
70 NULL,
71 SecurityDescriptor);
72
73 if (lReadTimeout == MAILSLOT_WAIT_FOREVER)
74 {
75 /* Set the max */
76 DefaultTimeOut.QuadPart = 0xFFFFFFFFFFFFFFFFLL;
77 }
78 else
79 {
80 /* Convert to NT format */
81 DefaultTimeOut.QuadPart = lReadTimeout * -10000LL;
82 }
83
84 Status = NtCreateMailslotFile(&MailslotHandle,
85 GENERIC_READ | SYNCHRONIZE | WRITE_DAC,
86 &ObjectAttributes,
87 &Iosb,
88 FILE_WRITE_THROUGH,
89 0,
90 nMaxMessageSize,
91 &DefaultTimeOut);
92
93 if ((Status == STATUS_INVALID_DEVICE_REQUEST) ||
94 (Status == STATUS_NOT_SUPPORTED))
95 {
96 Status = STATUS_OBJECT_NAME_INVALID;
97 }
98
99 RtlFreeHeap(RtlGetProcessHeap(), 0, MailslotName.Buffer);
100
101 if (!NT_SUCCESS(Status))
102 {
103 DPRINT1("NtCreateMailslot failed (Status %x)!\n", Status);
104 BaseSetLastNTError(Status);
105 return INVALID_HANDLE_VALUE;
106 }
107
108 return MailslotHandle;
109 }
110
111 /*
112 * @implemented
113 */
114 BOOL
115 WINAPI
116 GetMailslotInfo(IN HANDLE hMailslot,
117 IN LPDWORD lpMaxMessageSize,
118 IN LPDWORD lpNextSize,
119 IN LPDWORD lpMessageCount,
120 IN LPDWORD lpReadTimeout)
121 {
122 FILE_MAILSLOT_QUERY_INFORMATION Buffer;
123 IO_STATUS_BLOCK Iosb;
124 NTSTATUS Status;
125 LARGE_INTEGER Timeout;
126
127 Status = NtQueryInformationFile(hMailslot,
128 &Iosb,
129 &Buffer,
130 sizeof(FILE_MAILSLOT_QUERY_INFORMATION),
131 FileMailslotQueryInformation);
132 if (!NT_SUCCESS(Status))
133 {
134 DPRINT1("NtQueryInformationFile failed (Status %x)!\n", Status);
135 BaseSetLastNTError(Status);
136 return FALSE;
137 }
138
139 if (lpMaxMessageSize) *lpMaxMessageSize = Buffer.MaximumMessageSize;
140 if (lpNextSize) *lpNextSize = Buffer.NextMessageSize;
141 if (lpMessageCount) *lpMessageCount = Buffer.MessagesAvailable;
142
143 if (lpReadTimeout)
144 {
145 if (Buffer.ReadTimeout.QuadPart == 0xFFFFFFFFFFFFFFFFLL)
146 {
147 *lpReadTimeout = MAILSLOT_WAIT_FOREVER;
148 }
149 else
150 {
151 Timeout.QuadPart = -Buffer.ReadTimeout.QuadPart;
152 Timeout = RtlExtendedLargeIntegerDivide(Timeout, 10000, NULL);
153 if (Timeout.HighPart == 0)
154 {
155 *lpReadTimeout = Timeout.LowPart;
156 }
157 else
158 {
159 *lpReadTimeout = 0xFFFFFFFE;
160 }
161 }
162 }
163
164 return TRUE;
165 }
166
167 /*
168 * @implemented
169 */
170 BOOL
171 WINAPI
172 SetMailslotInfo(IN HANDLE hMailslot,
173 IN DWORD lReadTimeout)
174 {
175 FILE_MAILSLOT_SET_INFORMATION Buffer;
176 LARGE_INTEGER Timeout;
177 IO_STATUS_BLOCK Iosb;
178 NTSTATUS Status;
179
180 if (lReadTimeout == MAILSLOT_WAIT_FOREVER)
181 {
182 /* Set the max */
183 Timeout.QuadPart = 0xFFFFFFFFFFFFFFFFLL;
184 }
185 else
186 {
187 /* Convert to NT format */
188 Timeout.QuadPart = lReadTimeout * -10000LL;
189 }
190
191 Buffer.ReadTimeout = &Timeout;
192
193 Status = NtSetInformationFile(hMailslot,
194 &Iosb,
195 &Buffer,
196 sizeof(FILE_MAILSLOT_SET_INFORMATION),
197 FileMailslotSetInformation);
198 if (!NT_SUCCESS(Status))
199 {
200 DPRINT1("NtSetInformationFile failed (Status %x)!\n", Status);
201 BaseSetLastNTError(Status);
202 return FALSE;
203 }
204
205 return TRUE;
206 }
207
208 /* EOF */