ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

mailslot.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.