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 *****************************************************************/
16 #include "../include/debug.h"
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 DPRINT("Mailslot name: %wZ\n", &MailslotName
);
78 if(lpSecurityAttributes
)
80 SecurityDescriptor
= lpSecurityAttributes
->lpSecurityDescriptor
;
81 if(lpSecurityAttributes
->bInheritHandle
)
82 Attributes
|= OBJ_INHERIT
;
85 InitializeObjectAttributes(&ObjectAttributes
,
91 DefaultTimeOut
.QuadPart
= lReadTimeout
* 10000;
93 Status
= NtCreateMailslotFile(&MailslotHandle
,
94 GENERIC_READ
| SYNCHRONIZE
| WRITE_DAC
,
102 RtlFreeHeap(RtlGetProcessHeap(),
104 MailslotName
.Buffer
);
106 if (!NT_SUCCESS(Status
))
108 DPRINT("NtCreateMailslot failed (Status %x)!\n", Status
);
109 SetLastErrorByStatus (Status
);
110 return(INVALID_HANDLE_VALUE
);
113 return(MailslotHandle
);
121 GetMailslotInfo(HANDLE hMailslot
,
122 LPDWORD lpMaxMessageSize
,
124 LPDWORD lpMessageCount
,
125 LPDWORD lpReadTimeout
)
127 FILE_MAILSLOT_QUERY_INFORMATION Buffer
;
128 IO_STATUS_BLOCK Iosb
;
131 Status
= NtQueryInformationFile(hMailslot
,
134 sizeof(FILE_MAILSLOT_QUERY_INFORMATION
),
135 FileMailslotQueryInformation
);
136 if (!NT_SUCCESS(Status
))
138 DPRINT("NtQueryInformationFile failed (Status %x)!\n", Status
);
139 SetLastErrorByStatus (Status
);
143 if (lpMaxMessageSize
!= NULL
)
145 *lpMaxMessageSize
= Buffer
.MaximumMessageSize
;
147 if (lpNextSize
!= NULL
)
149 *lpNextSize
= Buffer
.NextMessageSize
;
151 if (lpMessageCount
!= NULL
)
153 *lpMessageCount
= Buffer
.MessagesAvailable
;
155 if (lpReadTimeout
!= NULL
)
157 *lpReadTimeout
= (DWORD
)(Buffer
.ReadTimeout
.QuadPart
/ -10000);
168 SetMailslotInfo(HANDLE hMailslot
,
171 FILE_MAILSLOT_SET_INFORMATION Buffer
;
172 LARGE_INTEGER Timeout
;
173 IO_STATUS_BLOCK Iosb
;
176 Timeout
.QuadPart
= lReadTimeout
* -10000;
177 Buffer
.ReadTimeout
= &Timeout
;
179 Status
= NtSetInformationFile(hMailslot
,
182 sizeof(FILE_MAILSLOT_SET_INFORMATION
),
183 FileMailslotSetInformation
);
184 if (!NT_SUCCESS(Status
))
186 DPRINT("NtSetInformationFile failed (Status %x)!\n", Status
);
187 SetLastErrorByStatus (Status
);