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 *****************************************************************/
14 #include <wine/debug.h>
16 WINE_DEFAULT_DEBUG_CHANNEL(kernel32file
);
18 /* FUNCTIONS ****************************************************************/
24 CreateMailslotA(LPCSTR lpName
,
25 DWORD nMaxMessageSize
,
27 LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
29 HANDLE MailslotHandle
;
33 RtlInitAnsiString(&NameA
, (LPSTR
)lpName
);
34 RtlAnsiStringToUnicodeString(&NameU
, &NameA
, TRUE
);
36 MailslotHandle
= CreateMailslotW(NameU
.Buffer
,
39 lpSecurityAttributes
);
41 RtlFreeUnicodeString(&NameU
);
43 return(MailslotHandle
);
51 CreateMailslotW(LPCWSTR lpName
,
52 DWORD nMaxMessageSize
,
54 LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
56 OBJECT_ATTRIBUTES ObjectAttributes
;
57 UNICODE_STRING MailslotName
;
58 HANDLE MailslotHandle
;
61 LARGE_INTEGER DefaultTimeOut
;
63 ULONG Attributes
= OBJ_CASE_INSENSITIVE
;
64 PSECURITY_DESCRIPTOR SecurityDescriptor
= NULL
;
66 Result
= RtlDosPathNameToNtPathName_U(lpName
,
72 SetLastError(ERROR_PATH_NOT_FOUND
);
73 return(INVALID_HANDLE_VALUE
);
76 TRACE("Mailslot name: %wZ\n", &MailslotName
);
78 if(lpSecurityAttributes
)
80 SecurityDescriptor
= lpSecurityAttributes
->lpSecurityDescriptor
;
81 if(lpSecurityAttributes
->bInheritHandle
)
82 Attributes
|= OBJ_INHERIT
;
85 InitializeObjectAttributes(&ObjectAttributes
,
91 if (lReadTimeout
== MAILSLOT_WAIT_FOREVER
)
94 DefaultTimeOut
.LowPart
= 0;
95 DefaultTimeOut
.HighPart
= 0x80000000;
99 /* Convert to NT format */
100 DefaultTimeOut
.QuadPart
= UInt32x32To64(-10000, lReadTimeout
);
103 Status
= NtCreateMailslotFile(&MailslotHandle
,
104 GENERIC_READ
| SYNCHRONIZE
| WRITE_DAC
,
112 if (Status
== STATUS_INVALID_DEVICE_REQUEST
|| Status
== STATUS_NOT_SUPPORTED
)
114 Status
= STATUS_OBJECT_NAME_INVALID
;
117 RtlFreeHeap(RtlGetProcessHeap(),
119 MailslotName
.Buffer
);
121 if (!NT_SUCCESS(Status
))
123 WARN("NtCreateMailslot failed (Status %x)!\n", Status
);
124 SetLastErrorByStatus (Status
);
125 return(INVALID_HANDLE_VALUE
);
128 return(MailslotHandle
);
136 GetMailslotInfo(HANDLE hMailslot
,
137 LPDWORD lpMaxMessageSize
,
139 LPDWORD lpMessageCount
,
140 LPDWORD lpReadTimeout
)
142 FILE_MAILSLOT_QUERY_INFORMATION Buffer
;
143 IO_STATUS_BLOCK Iosb
;
146 Status
= NtQueryInformationFile(hMailslot
,
149 sizeof(FILE_MAILSLOT_QUERY_INFORMATION
),
150 FileMailslotQueryInformation
);
151 if (!NT_SUCCESS(Status
))
153 WARN("NtQueryInformationFile failed (Status %x)!\n", Status
);
154 SetLastErrorByStatus (Status
);
158 if (lpMaxMessageSize
!= NULL
)
160 *lpMaxMessageSize
= Buffer
.MaximumMessageSize
;
162 if (lpNextSize
!= NULL
)
164 *lpNextSize
= Buffer
.NextMessageSize
;
166 if (lpMessageCount
!= NULL
)
168 *lpMessageCount
= Buffer
.MessagesAvailable
;
170 if (lpReadTimeout
!= NULL
)
172 if (Buffer
.ReadTimeout
.LowPart
== 0 &&
173 Buffer
.ReadTimeout
.HighPart
== (LONG
)0x80000000)
174 *lpReadTimeout
= MAILSLOT_WAIT_FOREVER
;
176 *lpReadTimeout
= (DWORD
)(Buffer
.ReadTimeout
.QuadPart
/ -10000);
187 SetMailslotInfo(HANDLE hMailslot
,
190 FILE_MAILSLOT_SET_INFORMATION Buffer
;
191 LARGE_INTEGER Timeout
;
192 IO_STATUS_BLOCK Iosb
;
195 if (lReadTimeout
== MAILSLOT_WAIT_FOREVER
)
199 Timeout
.HighPart
= 0x80000000;
203 /* Convert to NT format */
204 Timeout
.QuadPart
= UInt32x32To64(-10000, lReadTimeout
);
206 Buffer
.ReadTimeout
= &Timeout
;
208 Status
= NtSetInformationFile(hMailslot
,
211 sizeof(FILE_MAILSLOT_SET_INFORMATION
),
212 FileMailslotSetInformation
);
213 if (!NT_SUCCESS(Status
))
215 WARN("NtSetInformationFile failed (Status %x)!\n", Status
);
216 SetLastErrorByStatus (Status
);