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 RtlFreeHeap(RtlGetProcessHeap(),
114 MailslotName
.Buffer
);
116 if (!NT_SUCCESS(Status
))
118 WARN("NtCreateMailslot failed (Status %x)!\n", Status
);
119 SetLastErrorByStatus (Status
);
120 return(INVALID_HANDLE_VALUE
);
123 return(MailslotHandle
);
131 GetMailslotInfo(HANDLE hMailslot
,
132 LPDWORD lpMaxMessageSize
,
134 LPDWORD lpMessageCount
,
135 LPDWORD lpReadTimeout
)
137 FILE_MAILSLOT_QUERY_INFORMATION Buffer
;
138 IO_STATUS_BLOCK Iosb
;
141 Status
= NtQueryInformationFile(hMailslot
,
144 sizeof(FILE_MAILSLOT_QUERY_INFORMATION
),
145 FileMailslotQueryInformation
);
146 if (!NT_SUCCESS(Status
))
148 WARN("NtQueryInformationFile failed (Status %x)!\n", Status
);
149 SetLastErrorByStatus (Status
);
153 if (lpMaxMessageSize
!= NULL
)
155 *lpMaxMessageSize
= Buffer
.MaximumMessageSize
;
157 if (lpNextSize
!= NULL
)
159 *lpNextSize
= Buffer
.NextMessageSize
;
161 if (lpMessageCount
!= NULL
)
163 *lpMessageCount
= Buffer
.MessagesAvailable
;
165 if (lpReadTimeout
!= NULL
)
167 if (Buffer
.ReadTimeout
.LowPart
== 0 &&
168 Buffer
.ReadTimeout
.HighPart
== 0x80000000)
169 *lpReadTimeout
= MAILSLOT_WAIT_FOREVER
;
171 *lpReadTimeout
= (DWORD
)(Buffer
.ReadTimeout
.QuadPart
/ -10000);
182 SetMailslotInfo(HANDLE hMailslot
,
185 FILE_MAILSLOT_SET_INFORMATION Buffer
;
186 LARGE_INTEGER Timeout
;
187 IO_STATUS_BLOCK Iosb
;
190 if (lReadTimeout
== MAILSLOT_WAIT_FOREVER
)
194 Timeout
.HighPart
= 0x80000000;
198 /* Convert to NT format */
199 Timeout
.QuadPart
= UInt32x32To64(-10000, lReadTimeout
);
201 Buffer
.ReadTimeout
= &Timeout
;
203 Status
= NtSetInformationFile(hMailslot
,
206 sizeof(FILE_MAILSLOT_SET_INFORMATION
),
207 FileMailslotSetInformation
);
208 if (!NT_SUCCESS(Status
))
210 WARN("NtSetInformationFile failed (Status %x)!\n", Status
);
211 SetLastErrorByStatus (Status
);