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