1 /* $Id: mailslot.c 55791 2012-02-21 19:19:44Z ion $
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)
11 /* INCLUDES *******************************************************************/
17 /* FUNCTIONS ******************************************************************/
24 CreateMailslotA(IN LPCSTR lpName
,
25 IN DWORD nMaxMessageSize
,
26 IN DWORD lReadTimeout
,
27 IN LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
29 /* Call the W(ide) function */
30 ConvertWin32AnsiObjectApiToUnicodeApi2(Mailslot
, lpName
, nMaxMessageSize
, lReadTimeout
, lpSecurityAttributes
);
38 CreateMailslotW(IN LPCWSTR lpName
,
39 IN DWORD nMaxMessageSize
,
40 IN DWORD lReadTimeout
,
41 IN LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
43 OBJECT_ATTRIBUTES ObjectAttributes
;
44 UNICODE_STRING MailslotName
;
45 HANDLE MailslotHandle
;
48 LARGE_INTEGER DefaultTimeOut
;
50 ULONG Attributes
= OBJ_CASE_INSENSITIVE
;
51 PSECURITY_DESCRIPTOR SecurityDescriptor
= NULL
;
53 Result
= RtlDosPathNameToNtPathName_U(lpName
, &MailslotName
, NULL
, NULL
);
56 SetLastError(ERROR_PATH_NOT_FOUND
);
57 return INVALID_HANDLE_VALUE
;
60 DPRINT("Mailslot name: %wZ\n", &MailslotName
);
62 if (lpSecurityAttributes
)
64 SecurityDescriptor
= lpSecurityAttributes
->lpSecurityDescriptor
;
65 if(lpSecurityAttributes
->bInheritHandle
) Attributes
|= OBJ_INHERIT
;
68 InitializeObjectAttributes(&ObjectAttributes
,
74 if (lReadTimeout
== MAILSLOT_WAIT_FOREVER
)
77 DefaultTimeOut
.QuadPart
= 0xFFFFFFFFFFFFFFFFLL
;
81 /* Convert to NT format */
82 DefaultTimeOut
.QuadPart
= UInt32x32To64(-10000, lReadTimeout
);
85 Status
= NtCreateMailslotFile(&MailslotHandle
,
86 GENERIC_READ
| SYNCHRONIZE
| WRITE_DAC
,
94 if ((Status
== STATUS_INVALID_DEVICE_REQUEST
) ||
95 (Status
== STATUS_NOT_SUPPORTED
))
97 Status
= STATUS_OBJECT_NAME_INVALID
;
100 RtlFreeHeap(RtlGetProcessHeap(), 0, MailslotName
.Buffer
);
102 if (!NT_SUCCESS(Status
))
104 DPRINT1("NtCreateMailslot failed (Status %x)!\n", Status
);
105 BaseSetLastNTError(Status
);
106 return INVALID_HANDLE_VALUE
;
109 return MailslotHandle
;
117 GetMailslotInfo(IN HANDLE hMailslot
,
118 IN LPDWORD lpMaxMessageSize
,
119 IN LPDWORD lpNextSize
,
120 IN LPDWORD lpMessageCount
,
121 IN LPDWORD lpReadTimeout
)
123 FILE_MAILSLOT_QUERY_INFORMATION Buffer
;
124 IO_STATUS_BLOCK Iosb
;
126 LARGE_INTEGER Timeout
;
128 Status
= NtQueryInformationFile(hMailslot
,
131 sizeof(FILE_MAILSLOT_QUERY_INFORMATION
),
132 FileMailslotQueryInformation
);
133 if (!NT_SUCCESS(Status
))
135 DPRINT1("NtQueryInformationFile failed (Status %x)!\n", Status
);
136 BaseSetLastNTError(Status
);
140 if (lpMaxMessageSize
) *lpMaxMessageSize
= Buffer
.MaximumMessageSize
;
141 if (lpNextSize
) *lpNextSize
= Buffer
.NextMessageSize
;
142 if (lpMessageCount
) *lpMessageCount
= Buffer
.MessagesAvailable
;
146 if (Buffer
.ReadTimeout
.QuadPart
== 0xFFFFFFFFFFFFFFFFLL
)
148 *lpReadTimeout
= MAILSLOT_WAIT_FOREVER
;
152 Timeout
.QuadPart
= -Buffer
.ReadTimeout
.QuadPart
;
153 Timeout
= RtlExtendedLargeIntegerDivide(Timeout
, 10000, NULL
);
154 if (Timeout
.HighPart
== 0)
156 *lpReadTimeout
= Timeout
.LowPart
;
160 *lpReadTimeout
= 0xFFFFFFFE;
173 SetMailslotInfo(IN HANDLE hMailslot
,
174 IN DWORD lReadTimeout
)
176 FILE_MAILSLOT_SET_INFORMATION Buffer
;
177 LARGE_INTEGER Timeout
;
178 IO_STATUS_BLOCK Iosb
;
181 if (lReadTimeout
== MAILSLOT_WAIT_FOREVER
)
184 Timeout
.QuadPart
= 0xFFFFFFFFFFFFFFFFLL
;
188 /* Convert to NT format */
189 Timeout
.QuadPart
= UInt32x32To64(-10000, lReadTimeout
);
192 Buffer
.ReadTimeout
= &Timeout
;
194 Status
= NtSetInformationFile(hMailslot
,
197 sizeof(FILE_MAILSLOT_SET_INFORMATION
),
198 FileMailslotSetInformation
);
199 if (!NT_SUCCESS(Status
))
201 DPRINT1("NtSetInformationFile failed (Status %x)!\n", Status
);
202 BaseSetLastNTError(Status
);