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 ****************************************************************/
23 CreateMailslotA(LPCSTR lpName
,
24 DWORD nMaxMessageSize
,
26 LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
28 HANDLE MailslotHandle
;
32 RtlInitAnsiString(&NameA
, (LPSTR
)lpName
);
33 RtlAnsiStringToUnicodeString(&NameU
, &NameA
, TRUE
);
35 MailslotHandle
= CreateMailslotW(NameU
.Buffer
,
38 lpSecurityAttributes
);
40 RtlFreeUnicodeString(&NameU
);
42 return(MailslotHandle
);
50 CreateMailslotW(LPCWSTR lpName
,
51 DWORD nMaxMessageSize
,
53 LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
55 OBJECT_ATTRIBUTES ObjectAttributes
;
56 UNICODE_STRING MailslotName
;
57 HANDLE MailslotHandle
;
60 LARGE_INTEGER DefaultTimeOut
;
62 ULONG Attributes
= OBJ_CASE_INSENSITIVE
;
63 PSECURITY_DESCRIPTOR SecurityDescriptor
= NULL
;
65 Result
= RtlDosPathNameToNtPathName_U(lpName
,
71 SetLastError(ERROR_PATH_NOT_FOUND
);
72 return(INVALID_HANDLE_VALUE
);
75 TRACE("Mailslot name: %wZ\n", &MailslotName
);
77 if(lpSecurityAttributes
)
79 SecurityDescriptor
= lpSecurityAttributes
->lpSecurityDescriptor
;
80 if(lpSecurityAttributes
->bInheritHandle
)
81 Attributes
|= OBJ_INHERIT
;
84 InitializeObjectAttributes(&ObjectAttributes
,
90 if (lReadTimeout
== MAILSLOT_WAIT_FOREVER
)
93 DefaultTimeOut
.LowPart
= 0;
94 DefaultTimeOut
.HighPart
= 0x80000000;
98 /* Convert to NT format */
99 DefaultTimeOut
.QuadPart
= UInt32x32To64(-10000, lReadTimeout
);
102 Status
= NtCreateMailslotFile(&MailslotHandle
,
103 GENERIC_READ
| SYNCHRONIZE
| WRITE_DAC
,
111 if (Status
== STATUS_INVALID_DEVICE_REQUEST
|| Status
== STATUS_NOT_SUPPORTED
)
113 Status
= STATUS_OBJECT_NAME_INVALID
;
116 RtlFreeHeap(RtlGetProcessHeap(),
118 MailslotName
.Buffer
);
120 if (!NT_SUCCESS(Status
))
122 WARN("NtCreateMailslot failed (Status %x)!\n", Status
);
123 SetLastErrorByStatus (Status
);
124 return(INVALID_HANDLE_VALUE
);
127 return(MailslotHandle
);
135 GetMailslotInfo(HANDLE hMailslot
,
136 LPDWORD lpMaxMessageSize
,
138 LPDWORD lpMessageCount
,
139 LPDWORD lpReadTimeout
)
141 FILE_MAILSLOT_QUERY_INFORMATION Buffer
;
142 IO_STATUS_BLOCK Iosb
;
145 Status
= NtQueryInformationFile(hMailslot
,
148 sizeof(FILE_MAILSLOT_QUERY_INFORMATION
),
149 FileMailslotQueryInformation
);
150 if (!NT_SUCCESS(Status
))
152 WARN("NtQueryInformationFile failed (Status %x)!\n", Status
);
153 SetLastErrorByStatus (Status
);
157 if (lpMaxMessageSize
!= NULL
)
159 *lpMaxMessageSize
= Buffer
.MaximumMessageSize
;
161 if (lpNextSize
!= NULL
)
163 *lpNextSize
= Buffer
.NextMessageSize
;
165 if (lpMessageCount
!= NULL
)
167 *lpMessageCount
= Buffer
.MessagesAvailable
;
169 if (lpReadTimeout
!= NULL
)
171 if (Buffer
.ReadTimeout
.LowPart
== 0 &&
172 Buffer
.ReadTimeout
.HighPart
== (LONG
)0x80000000)
173 *lpReadTimeout
= MAILSLOT_WAIT_FOREVER
;
175 *lpReadTimeout
= (DWORD
)(Buffer
.ReadTimeout
.QuadPart
/ -10000);
186 SetMailslotInfo(HANDLE hMailslot
,
189 FILE_MAILSLOT_SET_INFORMATION Buffer
;
190 LARGE_INTEGER Timeout
;
191 IO_STATUS_BLOCK Iosb
;
194 if (lReadTimeout
== MAILSLOT_WAIT_FOREVER
)
198 Timeout
.HighPart
= 0x80000000;
202 /* Convert to NT format */
203 Timeout
.QuadPart
= UInt32x32To64(-10000, lReadTimeout
);
205 Buffer
.ReadTimeout
= &Timeout
;
207 Status
= NtSetInformationFile(hMailslot
,
210 sizeof(FILE_MAILSLOT_SET_INFORMATION
),
211 FileMailslotSetInformation
);
212 if (!NT_SUCCESS(Status
))
214 WARN("NtSetInformationFile failed (Status %x)!\n", Status
);
215 SetLastErrorByStatus (Status
);