Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmailslot.c
Go to the documentation of this file.
00001 /* $Id: mailslot.c 55791 2012-02-21 19:19:44Z ion $ 00002 * 00003 * COPYRIGHT: See COPYING in the top level directory 00004 * PROJECT: ReactOS system libraries 00005 * FILE: lib/kernel32/file/mailslot.c 00006 * PURPOSE: Mailslot functions 00007 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl) 00008 * UPDATE HISTORY: 00009 */ 00010 00011 /* INCLUDES *******************************************************************/ 00012 00013 #include <k32.h> 00014 #define NDEBUG 00015 #include <debug.h> 00016 00017 /* FUNCTIONS ******************************************************************/ 00018 00019 /* 00020 * @implemented 00021 */ 00022 HANDLE 00023 WINAPI 00024 CreateMailslotA(IN LPCSTR lpName, 00025 IN DWORD nMaxMessageSize, 00026 IN DWORD lReadTimeout, 00027 IN LPSECURITY_ATTRIBUTES lpSecurityAttributes) 00028 { 00029 /* Call the W(ide) function */ 00030 ConvertWin32AnsiObjectApiToUnicodeApi2(Mailslot, lpName, nMaxMessageSize, lReadTimeout, lpSecurityAttributes); 00031 } 00032 00033 /* 00034 * @implemented 00035 */ 00036 HANDLE 00037 WINAPI 00038 CreateMailslotW(IN LPCWSTR lpName, 00039 IN DWORD nMaxMessageSize, 00040 IN DWORD lReadTimeout, 00041 IN LPSECURITY_ATTRIBUTES lpSecurityAttributes) 00042 { 00043 OBJECT_ATTRIBUTES ObjectAttributes; 00044 UNICODE_STRING MailslotName; 00045 HANDLE MailslotHandle; 00046 NTSTATUS Status; 00047 BOOLEAN Result; 00048 LARGE_INTEGER DefaultTimeOut; 00049 IO_STATUS_BLOCK Iosb; 00050 ULONG Attributes = OBJ_CASE_INSENSITIVE; 00051 PSECURITY_DESCRIPTOR SecurityDescriptor = NULL; 00052 00053 Result = RtlDosPathNameToNtPathName_U(lpName, &MailslotName, NULL, NULL); 00054 if (!Result) 00055 { 00056 SetLastError(ERROR_PATH_NOT_FOUND); 00057 return INVALID_HANDLE_VALUE; 00058 } 00059 00060 DPRINT("Mailslot name: %wZ\n", &MailslotName); 00061 00062 if (lpSecurityAttributes) 00063 { 00064 SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor; 00065 if(lpSecurityAttributes->bInheritHandle) Attributes |= OBJ_INHERIT; 00066 } 00067 00068 InitializeObjectAttributes(&ObjectAttributes, 00069 &MailslotName, 00070 Attributes, 00071 NULL, 00072 SecurityDescriptor); 00073 00074 if (lReadTimeout == MAILSLOT_WAIT_FOREVER) 00075 { 00076 /* Set the max */ 00077 DefaultTimeOut.QuadPart = 0xFFFFFFFFFFFFFFFFLL; 00078 } 00079 else 00080 { 00081 /* Convert to NT format */ 00082 DefaultTimeOut.QuadPart = UInt32x32To64(-10000, lReadTimeout); 00083 } 00084 00085 Status = NtCreateMailslotFile(&MailslotHandle, 00086 GENERIC_READ | SYNCHRONIZE | WRITE_DAC, 00087 &ObjectAttributes, 00088 &Iosb, 00089 FILE_WRITE_THROUGH, 00090 0, 00091 nMaxMessageSize, 00092 &DefaultTimeOut); 00093 00094 if ((Status == STATUS_INVALID_DEVICE_REQUEST) || 00095 (Status == STATUS_NOT_SUPPORTED)) 00096 { 00097 Status = STATUS_OBJECT_NAME_INVALID; 00098 } 00099 00100 RtlFreeHeap(RtlGetProcessHeap(), 0, MailslotName.Buffer); 00101 00102 if (!NT_SUCCESS(Status)) 00103 { 00104 DPRINT1("NtCreateMailslot failed (Status %x)!\n", Status); 00105 BaseSetLastNTError(Status); 00106 return INVALID_HANDLE_VALUE; 00107 } 00108 00109 return MailslotHandle; 00110 } 00111 00112 /* 00113 * @implemented 00114 */ 00115 BOOL 00116 WINAPI 00117 GetMailslotInfo(IN HANDLE hMailslot, 00118 IN LPDWORD lpMaxMessageSize, 00119 IN LPDWORD lpNextSize, 00120 IN LPDWORD lpMessageCount, 00121 IN LPDWORD lpReadTimeout) 00122 { 00123 FILE_MAILSLOT_QUERY_INFORMATION Buffer; 00124 IO_STATUS_BLOCK Iosb; 00125 NTSTATUS Status; 00126 LARGE_INTEGER Timeout; 00127 00128 Status = NtQueryInformationFile(hMailslot, 00129 &Iosb, 00130 &Buffer, 00131 sizeof(FILE_MAILSLOT_QUERY_INFORMATION), 00132 FileMailslotQueryInformation); 00133 if (!NT_SUCCESS(Status)) 00134 { 00135 DPRINT1("NtQueryInformationFile failed (Status %x)!\n", Status); 00136 BaseSetLastNTError(Status); 00137 return FALSE; 00138 } 00139 00140 if (lpMaxMessageSize) *lpMaxMessageSize = Buffer.MaximumMessageSize; 00141 if (lpNextSize) *lpNextSize = Buffer.NextMessageSize; 00142 if (lpMessageCount) *lpMessageCount = Buffer.MessagesAvailable; 00143 00144 if (lpReadTimeout) 00145 { 00146 if (Buffer.ReadTimeout.QuadPart == 0xFFFFFFFFFFFFFFFFLL) 00147 { 00148 *lpReadTimeout = MAILSLOT_WAIT_FOREVER; 00149 } 00150 else 00151 { 00152 Timeout.QuadPart = -Buffer.ReadTimeout.QuadPart; 00153 Timeout = RtlExtendedLargeIntegerDivide(Timeout, 10000, NULL); 00154 if (Timeout.HighPart == 0) 00155 { 00156 *lpReadTimeout = Timeout.LowPart; 00157 } 00158 else 00159 { 00160 *lpReadTimeout = 0xFFFFFFFE; 00161 } 00162 } 00163 } 00164 00165 return TRUE; 00166 } 00167 00168 /* 00169 * @implemented 00170 */ 00171 BOOL 00172 WINAPI 00173 SetMailslotInfo(IN HANDLE hMailslot, 00174 IN DWORD lReadTimeout) 00175 { 00176 FILE_MAILSLOT_SET_INFORMATION Buffer; 00177 LARGE_INTEGER Timeout; 00178 IO_STATUS_BLOCK Iosb; 00179 NTSTATUS Status; 00180 00181 if (lReadTimeout == MAILSLOT_WAIT_FOREVER) 00182 { 00183 /* Set the max */ 00184 Timeout.QuadPart = 0xFFFFFFFFFFFFFFFFLL; 00185 } 00186 else 00187 { 00188 /* Convert to NT format */ 00189 Timeout.QuadPart = UInt32x32To64(-10000, lReadTimeout); 00190 } 00191 00192 Buffer.ReadTimeout = &Timeout; 00193 00194 Status = NtSetInformationFile(hMailslot, 00195 &Iosb, 00196 &Buffer, 00197 sizeof(FILE_MAILSLOT_SET_INFORMATION), 00198 FileMailslotSetInformation); 00199 if (!NT_SUCCESS(Status)) 00200 { 00201 DPRINT1("NtSetInformationFile failed (Status %x)!\n", Status); 00202 BaseSetLastNTError(Status); 00203 return FALSE; 00204 } 00205 00206 return TRUE; 00207 } 00208 00209 /* EOF */ Generated on Sat May 26 2012 04:22:58 for ReactOS by
1.7.6.1
|