2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/file/mailslot.c
5 * PURPOSE: Mailslot functions
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
10 /* INCLUDES *******************************************************************/
16 /* FUNCTIONS ******************************************************************/
23 CreateMailslotA(IN LPCSTR lpName
,
24 IN DWORD nMaxMessageSize
,
25 IN DWORD lReadTimeout
,
26 IN LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
28 /* Call the W(ide) function */
29 ConvertWin32AnsiObjectApiToUnicodeApi2(Mailslot
, lpName
, nMaxMessageSize
, lReadTimeout
, lpSecurityAttributes
);
37 CreateMailslotW(IN LPCWSTR lpName
,
38 IN DWORD nMaxMessageSize
,
39 IN DWORD lReadTimeout
,
40 IN LPSECURITY_ATTRIBUTES lpSecurityAttributes
)
42 OBJECT_ATTRIBUTES ObjectAttributes
;
43 UNICODE_STRING MailslotName
;
44 HANDLE MailslotHandle
;
47 LARGE_INTEGER DefaultTimeOut
;
49 ULONG Attributes
= OBJ_CASE_INSENSITIVE
;
50 PSECURITY_DESCRIPTOR SecurityDescriptor
= NULL
;
52 Result
= RtlDosPathNameToNtPathName_U(lpName
, &MailslotName
, NULL
, NULL
);
55 SetLastError(ERROR_PATH_NOT_FOUND
);
56 return INVALID_HANDLE_VALUE
;
59 DPRINT("Mailslot name: %wZ\n", &MailslotName
);
61 if (lpSecurityAttributes
)
63 SecurityDescriptor
= lpSecurityAttributes
->lpSecurityDescriptor
;
64 if(lpSecurityAttributes
->bInheritHandle
) Attributes
|= OBJ_INHERIT
;
67 InitializeObjectAttributes(&ObjectAttributes
,
73 if (lReadTimeout
== MAILSLOT_WAIT_FOREVER
)
76 DefaultTimeOut
.QuadPart
= 0xFFFFFFFFFFFFFFFFLL
;
80 /* Convert to NT format */
81 DefaultTimeOut
.QuadPart
= lReadTimeout
* -10000LL;
84 Status
= NtCreateMailslotFile(&MailslotHandle
,
85 GENERIC_READ
| SYNCHRONIZE
| WRITE_DAC
,
93 if ((Status
== STATUS_INVALID_DEVICE_REQUEST
) ||
94 (Status
== STATUS_NOT_SUPPORTED
))
96 Status
= STATUS_OBJECT_NAME_INVALID
;
99 RtlFreeHeap(RtlGetProcessHeap(), 0, MailslotName
.Buffer
);
101 if (!NT_SUCCESS(Status
))
103 DPRINT1("NtCreateMailslot failed (Status %x)!\n", Status
);
104 BaseSetLastNTError(Status
);
105 return INVALID_HANDLE_VALUE
;
108 return MailslotHandle
;
116 GetMailslotInfo(IN HANDLE hMailslot
,
117 IN LPDWORD lpMaxMessageSize
,
118 IN LPDWORD lpNextSize
,
119 IN LPDWORD lpMessageCount
,
120 IN LPDWORD lpReadTimeout
)
122 FILE_MAILSLOT_QUERY_INFORMATION Buffer
;
123 IO_STATUS_BLOCK Iosb
;
125 LARGE_INTEGER Timeout
;
127 Status
= NtQueryInformationFile(hMailslot
,
130 sizeof(FILE_MAILSLOT_QUERY_INFORMATION
),
131 FileMailslotQueryInformation
);
132 if (!NT_SUCCESS(Status
))
134 DPRINT1("NtQueryInformationFile failed (Status %x)!\n", Status
);
135 BaseSetLastNTError(Status
);
139 if (lpMaxMessageSize
) *lpMaxMessageSize
= Buffer
.MaximumMessageSize
;
140 if (lpNextSize
) *lpNextSize
= Buffer
.NextMessageSize
;
141 if (lpMessageCount
) *lpMessageCount
= Buffer
.MessagesAvailable
;
145 if (Buffer
.ReadTimeout
.QuadPart
== 0xFFFFFFFFFFFFFFFFLL
)
147 *lpReadTimeout
= MAILSLOT_WAIT_FOREVER
;
151 Timeout
.QuadPart
= -Buffer
.ReadTimeout
.QuadPart
;
152 Timeout
= RtlExtendedLargeIntegerDivide(Timeout
, 10000, NULL
);
153 if (Timeout
.HighPart
== 0)
155 *lpReadTimeout
= Timeout
.LowPart
;
159 *lpReadTimeout
= 0xFFFFFFFE;
172 SetMailslotInfo(IN HANDLE hMailslot
,
173 IN DWORD lReadTimeout
)
175 FILE_MAILSLOT_SET_INFORMATION Buffer
;
176 LARGE_INTEGER Timeout
;
177 IO_STATUS_BLOCK Iosb
;
180 if (lReadTimeout
== MAILSLOT_WAIT_FOREVER
)
183 Timeout
.QuadPart
= 0xFFFFFFFFFFFFFFFFLL
;
187 /* Convert to NT format */
188 Timeout
.QuadPart
= lReadTimeout
* -10000LL;
191 Buffer
.ReadTimeout
= &Timeout
;
193 Status
= NtSetInformationFile(hMailslot
,
196 sizeof(FILE_MAILSLOT_SET_INFORMATION
),
197 FileMailslotSetInformation
);
198 if (!NT_SUCCESS(Status
))
200 DPRINT1("NtSetInformationFile failed (Status %x)!\n", Status
);
201 BaseSetLastNTError(Status
);