update for HEAD-2003021201
[reactos.git] / lib / kernel32 / file / mailslot.c
1 /* $Id$
2  *
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)
8  * UPDATE HISTORY:
9  */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <k32.h>
14
15 #define NDEBUG
16 #include <kernel32/kernel32.h>
17
18 /* FUNCTIONS ****************************************************************/
19
20 HANDLE STDCALL
21 CreateMailslotA(LPCSTR lpName,
22                 DWORD nMaxMessageSize,
23                 DWORD lReadTimeout,
24                 LPSECURITY_ATTRIBUTES lpSecurityAttributes)
25 {
26    HANDLE MailslotHandle;
27    UNICODE_STRING NameU;
28    ANSI_STRING NameA;
29    
30    RtlInitAnsiString(&NameA, (LPSTR)lpName);
31    RtlAnsiStringToUnicodeString(&NameU, &NameA, TRUE);
32    
33    MailslotHandle = CreateMailslotW(NameU.Buffer,
34                                     nMaxMessageSize,
35                                     lReadTimeout,
36                                     lpSecurityAttributes);
37    
38    RtlFreeUnicodeString(&NameU);
39    
40    return(MailslotHandle);
41 }
42
43
44 HANDLE STDCALL
45 CreateMailslotW(LPCWSTR lpName,
46                 DWORD nMaxMessageSize,
47                 DWORD lReadTimeout,
48                 LPSECURITY_ATTRIBUTES lpSecurityAttributes)
49 {
50    OBJECT_ATTRIBUTES ObjectAttributes;
51    UNICODE_STRING MailslotName;
52    HANDLE MailslotHandle;
53    NTSTATUS Status;
54    BOOLEAN Result;
55    LARGE_INTEGER DefaultTimeOut;
56    IO_STATUS_BLOCK Iosb;
57    
58    Result = RtlDosPathNameToNtPathName_U((LPWSTR)lpName,
59                                          &MailslotName,
60                                          NULL,
61                                          NULL);
62    if (!Result)
63      {
64         SetLastError(ERROR_PATH_NOT_FOUND);
65         return(INVALID_HANDLE_VALUE);
66      }
67    
68    DPRINT("Mailslot name: %wZ\n", &MailslotName);
69    
70    InitializeObjectAttributes(&ObjectAttributes,
71                               &MailslotName,
72                               OBJ_CASE_INSENSITIVE,
73                               NULL,
74                               NULL);
75    
76    DefaultTimeOut.QuadPart = lReadTimeout * 10000;
77    
78    Status = NtCreateMailslotFile(&MailslotHandle,
79                                  GENERIC_READ | SYNCHRONIZE | WRITE_DAC,
80                                  &ObjectAttributes,
81                                  &Iosb,
82                                  FILE_WRITE_THROUGH,
83                                  0,
84                                  nMaxMessageSize,
85                                  &DefaultTimeOut);
86    
87    RtlFreeUnicodeString(&MailslotName);
88    
89    if (!NT_SUCCESS(Status))
90      {
91         DPRINT("NtCreateMailslot failed (Status %x)!\n", Status);
92         SetLastErrorByStatus (Status);
93         return(INVALID_HANDLE_VALUE);
94      }
95    
96    return(MailslotHandle);
97 }
98
99
100 WINBOOL STDCALL
101 GetMailslotInfo(HANDLE hMailslot,
102                 LPDWORD lpMaxMessageSize,
103                 LPDWORD lpNextSize,
104                 LPDWORD lpMessageCount,
105                 LPDWORD lpReadTimeout)
106 {
107    FILE_MAILSLOT_QUERY_INFORMATION Buffer;
108    IO_STATUS_BLOCK Iosb;
109    NTSTATUS Status;
110    
111    Status = NtQueryInformationFile(hMailslot,
112                                    &Iosb,
113                                    &Buffer,
114                                    sizeof(FILE_MAILSLOT_QUERY_INFORMATION),
115                                    FileMailslotQueryInformation);
116    if (!NT_SUCCESS(Status))
117      {
118         DPRINT("NtQueryInformationFile failed (Status %x)!\n", Status);
119         SetLastErrorByStatus (Status);
120         return(FALSE);
121      }
122    
123    if (lpMaxMessageSize != NULL)
124      {
125         *lpMaxMessageSize = Buffer.MaxMessageSize;
126      }
127    if (lpNextSize != NULL)
128      {
129         *lpNextSize = Buffer.NextSize;
130      }
131    if (lpMessageCount != NULL)
132      {
133         *lpMessageCount = Buffer.MessageCount;
134      }
135    if (lpReadTimeout != NULL)
136      {
137         *lpReadTimeout = (DWORD)(Buffer.Timeout.QuadPart / -10000);
138      }
139    
140    return(TRUE);
141 }
142
143
144 WINBOOL STDCALL
145 SetMailslotInfo(HANDLE hMailslot,
146                 DWORD lReadTimeout)
147 {
148    FILE_MAILSLOT_SET_INFORMATION Buffer;
149    IO_STATUS_BLOCK Iosb;
150    NTSTATUS Status;
151    
152    Buffer.Timeout.QuadPart = lReadTimeout * -10000;
153    
154    Status = NtSetInformationFile(hMailslot,
155                                  &Iosb,
156                                  &Buffer,
157                                  sizeof(FILE_MAILSLOT_SET_INFORMATION),
158                                  FileMailslotSetInformation);
159    if (!NT_SUCCESS(Status))
160      {
161         DPRINT("NtSetInformationFile failed (Status %x)!\n", Status);
162         SetLastErrorByStatus (Status);
163         return(FALSE);
164      }
165    
166    return(TRUE);
167 }
168
169 /* EOF */