Author: ion
Date: Sat Nov 12 18:28:16 2011
New Revision: 54365

URL: http://svn.reactos.org/svn/reactos?rev=54365&view=rev
Log:
[KERNEL32]: Fix mailslot code to use the static unicode string in the TEB for 
conversion, and correctly handle failure cases to bound names to MAX_PATH as 
Win32 demands. Also fix timeout conversions to use the correct timeout value 
for infinite timeout. 
[KERNEL32]: Reformat since 3-space identation is just murder.

Modified:
    trunk/reactos/dll/win32/kernel32/client/file/mailslot.c
    trunk/reactos/include/ndk/rtlfuncs.h

Modified: trunk/reactos/dll/win32/kernel32/client/file/mailslot.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/file/mailslot.c?rev=54365&r1=54364&r2=54365&view=diff
==============================================================================
--- trunk/reactos/dll/win32/kernel32/client/file/mailslot.c [iso-8859-1] 
(original)
+++ trunk/reactos/dll/win32/kernel32/client/file/mailslot.c [iso-8859-1] Sat 
Nov 12 18:28:16 2011
@@ -8,216 +8,226 @@
  * UPDATE HISTORY:
  */
 
-/* INCLUDES *****************************************************************/
+/* INCLUDES 
*******************************************************************/
 
 #include <k32.h>
 #define NDEBUG
 #include <debug.h>
-DEBUG_CHANNEL(kernel32file);
-
-/* FUNCTIONS ****************************************************************/
-
-/*
- * @implemented
- */
-HANDLE WINAPI
-CreateMailslotA(LPCSTR lpName,
-               DWORD nMaxMessageSize,
-               DWORD lReadTimeout,
-               LPSECURITY_ATTRIBUTES lpSecurityAttributes)
-{
-   HANDLE MailslotHandle;
-   UNICODE_STRING NameU;
-   ANSI_STRING NameA;
-
-   RtlInitAnsiString(&NameA, (LPSTR)lpName);
-   RtlAnsiStringToUnicodeString(&NameU, &NameA, TRUE);
-
-   MailslotHandle = CreateMailslotW(NameU.Buffer,
-                                   nMaxMessageSize,
-                                   lReadTimeout,
-                                   lpSecurityAttributes);
-
-   RtlFreeUnicodeString(&NameU);
-
-   return(MailslotHandle);
-}
-
-
-/*
- * @implemented
- */
-HANDLE WINAPI
-CreateMailslotW(LPCWSTR lpName,
-               DWORD nMaxMessageSize,
-               DWORD lReadTimeout,
-               LPSECURITY_ATTRIBUTES lpSecurityAttributes)
-{
-   OBJECT_ATTRIBUTES ObjectAttributes;
-   UNICODE_STRING MailslotName;
-   HANDLE MailslotHandle;
-   NTSTATUS Status;
-   BOOLEAN Result;
-   LARGE_INTEGER DefaultTimeOut;
-   IO_STATUS_BLOCK Iosb;
-   ULONG Attributes = OBJ_CASE_INSENSITIVE;
-   PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
-
-   Result = RtlDosPathNameToNtPathName_U(lpName,
-                                        &MailslotName,
-                                        NULL,
-                                        NULL);
-   if (!Result)
+
+/* FUNCTIONS 
******************************************************************/
+
+/*
+ * @implemented
+ */
+HANDLE
+WINAPI
+CreateMailslotA(IN LPCSTR lpName,
+                IN DWORD nMaxMessageSize,
+                IN DWORD lReadTimeout,
+                IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
+{
+    PUNICODE_STRING NameU;
+    ANSI_STRING NameA;
+    NTSTATUS Status;
+
+    NameU = &NtCurrentTeb()->StaticUnicodeString;
+
+    RtlInitAnsiString(&NameA, (LPSTR)lpName);
+    Status = RtlAnsiStringToUnicodeString(NameU, &NameA, FALSE);
+    if (!NT_SUCCESS(Status))
+    {
+        if (Status == STATUS_BUFFER_OVERFLOW)
+        {
+            SetLastError(ERROR_FILENAME_EXCED_RANGE);
+        }
+        else
+        {
+            BaseSetLastNTError(Status);
+        }
+
+        return INVALID_HANDLE_VALUE;
+    }
+
+    return CreateMailslotW(NameU->Buffer,
+                           nMaxMessageSize,
+                           lReadTimeout,
+                           lpSecurityAttributes);
+}
+
+/*
+ * @implemented
+ */
+HANDLE
+WINAPI
+CreateMailslotW(IN LPCWSTR lpName,
+                IN DWORD nMaxMessageSize,
+                IN DWORD lReadTimeout,
+                IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
+{
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    UNICODE_STRING MailslotName;
+    HANDLE MailslotHandle;
+    NTSTATUS Status;
+    BOOLEAN Result;
+    LARGE_INTEGER DefaultTimeOut;
+    IO_STATUS_BLOCK Iosb;
+    ULONG Attributes = OBJ_CASE_INSENSITIVE;
+    PSECURITY_DESCRIPTOR SecurityDescriptor = NULL;
+
+    Result = RtlDosPathNameToNtPathName_U(lpName, &MailslotName, NULL, NULL);
+    if (!Result)
+    {
+        SetLastError(ERROR_PATH_NOT_FOUND);
+        return INVALID_HANDLE_VALUE;
+    }
+
+    DPRINT("Mailslot name: %wZ\n", &MailslotName);
+
+    if (lpSecurityAttributes)
+    {
+        SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
+        if(lpSecurityAttributes->bInheritHandle) Attributes |= OBJ_INHERIT;
+    }
+
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &MailslotName,
+                               Attributes,
+                               NULL,
+                               SecurityDescriptor);
+
+    if (lReadTimeout == MAILSLOT_WAIT_FOREVER)
+    {
+        /* Set the max */
+        DefaultTimeOut.QuadPart = 0xFFFFFFFFFFFFFFFFLL;
+    }
+    else
+    {
+        /* Convert to NT format */
+        DefaultTimeOut.QuadPart = UInt32x32To64(-10000, lReadTimeout);
+    }
+
+    Status = NtCreateMailslotFile(&MailslotHandle,
+                                  GENERIC_READ | SYNCHRONIZE | WRITE_DAC,
+                                  &ObjectAttributes,
+                                  &Iosb,
+                                  FILE_WRITE_THROUGH,
+                                  0,
+                                  nMaxMessageSize,
+                                  &DefaultTimeOut);
+
+    if ((Status == STATUS_INVALID_DEVICE_REQUEST) ||
+        (Status == STATUS_NOT_SUPPORTED))
+    {
+        Status = STATUS_OBJECT_NAME_INVALID;
+    }
+
+    RtlFreeHeap(RtlGetProcessHeap(), 0, MailslotName.Buffer);
+
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("NtCreateMailslot failed (Status %x)!\n", Status);
+        BaseSetLastNTError(Status);
+        return INVALID_HANDLE_VALUE;
+    }
+
+    return MailslotHandle;
+}
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+GetMailslotInfo(IN HANDLE hMailslot,
+                IN LPDWORD lpMaxMessageSize,
+                IN LPDWORD lpNextSize,
+                IN LPDWORD lpMessageCount,
+                IN LPDWORD lpReadTimeout)
+{
+    FILE_MAILSLOT_QUERY_INFORMATION Buffer;
+    IO_STATUS_BLOCK Iosb;
+    NTSTATUS Status;
+    LARGE_INTEGER Timeout;
+
+    Status = NtQueryInformationFile(hMailslot,
+                                    &Iosb,
+                                    &Buffer,
+                                    sizeof(FILE_MAILSLOT_QUERY_INFORMATION),
+                                    FileMailslotQueryInformation);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("NtQueryInformationFile failed (Status %x)!\n", Status);
+        BaseSetLastNTError(Status);
+        return FALSE;
+     }
+
+     if (lpMaxMessageSize) *lpMaxMessageSize = Buffer.MaximumMessageSize;
+     if (lpNextSize) *lpNextSize = Buffer.NextMessageSize;
+     if (lpMessageCount) *lpMessageCount = Buffer.MessagesAvailable;
+
+     if (lpReadTimeout)
      {
-       SetLastError(ERROR_PATH_NOT_FOUND);
-       return(INVALID_HANDLE_VALUE);
+         if (Buffer.ReadTimeout.QuadPart == 0xFFFFFFFFFFFFFFFFLL)
+         {
+             *lpReadTimeout = MAILSLOT_WAIT_FOREVER;
+         }
+         else
+         {
+             Timeout.QuadPart = -Buffer.ReadTimeout.QuadPart;
+             Timeout = RtlExtendedLargeIntegerDivide(Timeout, 10000, NULL);
+             if (Timeout.HighPart == 0)
+             {
+                 *lpReadTimeout = Timeout.LowPart;
+             }
+             else
+             {
+                 *lpReadTimeout = 0xFFFFFFFE;
+             }
+         }
      }
 
-   TRACE("Mailslot name: %wZ\n", &MailslotName);
-
-   if(lpSecurityAttributes)
-     {
-       SecurityDescriptor = lpSecurityAttributes->lpSecurityDescriptor;
-       if(lpSecurityAttributes->bInheritHandle)
-          Attributes |= OBJ_INHERIT;
+   return TRUE;
+}
+
+/*
+ * @implemented
+ */
+BOOL
+WINAPI
+SetMailslotInfo(IN HANDLE hMailslot,
+                IN DWORD lReadTimeout)
+{
+    FILE_MAILSLOT_SET_INFORMATION Buffer;
+    LARGE_INTEGER Timeout;
+    IO_STATUS_BLOCK Iosb;
+    NTSTATUS Status;
+
+    if (lReadTimeout == MAILSLOT_WAIT_FOREVER)
+    {
+        /* Set the max */
+        Timeout.QuadPart = 0xFFFFFFFFFFFFFFFFLL;
+    }
+    else
+    {
+        /* Convert to NT format */
+        Timeout.QuadPart = UInt32x32To64(-10000, lReadTimeout);
+    }
+
+    Buffer.ReadTimeout = &Timeout;
+
+    Status = NtSetInformationFile(hMailslot,
+                                  &Iosb,
+                                  &Buffer,
+                                  sizeof(FILE_MAILSLOT_SET_INFORMATION),
+                                  FileMailslotSetInformation);
+    if (!NT_SUCCESS(Status))
+    {
+        DPRINT1("NtSetInformationFile failed (Status %x)!\n", Status);
+        BaseSetLastNTError(Status);
+        return FALSE;
      }
 
-   InitializeObjectAttributes(&ObjectAttributes,
-                             &MailslotName,
-                             Attributes,
-                             NULL,
-                             SecurityDescriptor);
-
-   if (lReadTimeout == MAILSLOT_WAIT_FOREVER)
-   {
-      /* Set the max */
-      DefaultTimeOut.LowPart = 0;
-      DefaultTimeOut.HighPart = 0x80000000;
-   }
-   else
-   {
-      /* Convert to NT format */
-      DefaultTimeOut.QuadPart = UInt32x32To64(-10000, lReadTimeout);
-   }
-
-   Status = NtCreateMailslotFile(&MailslotHandle,
-                                GENERIC_READ | SYNCHRONIZE | WRITE_DAC,
-                                &ObjectAttributes,
-                                &Iosb,
-                                FILE_WRITE_THROUGH,
-                                0,
-                                nMaxMessageSize,
-                                &DefaultTimeOut);
-
-   if (Status == STATUS_INVALID_DEVICE_REQUEST || Status == 
STATUS_NOT_SUPPORTED)
-   {
-       Status = STATUS_OBJECT_NAME_INVALID;
-   }
-
-   RtlFreeHeap(RtlGetProcessHeap(),
-               0,
-               MailslotName.Buffer);
-
-   if (!NT_SUCCESS(Status))
-     {
-       WARN("NtCreateMailslot failed (Status %x)!\n", Status);
-       BaseSetLastNTError (Status);
-       return(INVALID_HANDLE_VALUE);
-     }
-
-   return(MailslotHandle);
-}
-
-
-/*
- * @implemented
- */
-BOOL WINAPI
-GetMailslotInfo(HANDLE hMailslot,
-               LPDWORD lpMaxMessageSize,
-               LPDWORD lpNextSize,
-               LPDWORD lpMessageCount,
-               LPDWORD lpReadTimeout)
-{
-   FILE_MAILSLOT_QUERY_INFORMATION Buffer;
-   IO_STATUS_BLOCK Iosb;
-   NTSTATUS Status;
-
-   Status = NtQueryInformationFile(hMailslot,
-                                  &Iosb,
-                                  &Buffer,
-                                  sizeof(FILE_MAILSLOT_QUERY_INFORMATION),
-                                  FileMailslotQueryInformation);
-   if (!NT_SUCCESS(Status))
-     {
-       WARN("NtQueryInformationFile failed (Status %x)!\n", Status);
-       BaseSetLastNTError (Status);
-       return(FALSE);
-     }
-
-   if (lpMaxMessageSize != NULL)
-     {
-       *lpMaxMessageSize = Buffer.MaximumMessageSize;
-     }
-   if (lpNextSize != NULL)
-     {
-       *lpNextSize = Buffer.NextMessageSize;
-     }
-   if (lpMessageCount != NULL)
-     {
-       *lpMessageCount = Buffer.MessagesAvailable;
-     }
-   if (lpReadTimeout != NULL)
-     {
-       if (Buffer.ReadTimeout.LowPart == 0 &&
-           Buffer.ReadTimeout.HighPart == (LONG)0x80000000)
-           *lpReadTimeout = MAILSLOT_WAIT_FOREVER;
-       else
-           *lpReadTimeout = (DWORD)(Buffer.ReadTimeout.QuadPart / -10000);
-     }
-
-   return(TRUE);
-}
-
-
-/*
- * @implemented
- */
-BOOL WINAPI
-SetMailslotInfo(HANDLE hMailslot,
-               DWORD lReadTimeout)
-{
-   FILE_MAILSLOT_SET_INFORMATION Buffer;
-   LARGE_INTEGER Timeout;
-   IO_STATUS_BLOCK Iosb;
-   NTSTATUS Status;
-
-   if (lReadTimeout == MAILSLOT_WAIT_FOREVER)
-   {
-      /* Set the max */
-      Timeout.LowPart = 0;
-      Timeout.HighPart = 0x80000000;
-   }
-   else
-   {
-      /* Convert to NT format */
-      Timeout.QuadPart = UInt32x32To64(-10000, lReadTimeout);
-   }
-   Buffer.ReadTimeout = &Timeout;
-
-   Status = NtSetInformationFile(hMailslot,
-                                &Iosb,
-                                &Buffer,
-                                sizeof(FILE_MAILSLOT_SET_INFORMATION),
-                                FileMailslotSetInformation);
-   if (!NT_SUCCESS(Status))
-     {
-       WARN("NtSetInformationFile failed (Status %x)!\n", Status);
-       BaseSetLastNTError (Status);
-       return(FALSE);
-     }
-
-   return(TRUE);
+     return TRUE;
 }
 
 /* EOF */

Modified: trunk/reactos/include/ndk/rtlfuncs.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/ndk/rtlfuncs.h?rev=54365&r1=54364&r2=54365&view=diff
==============================================================================
--- trunk/reactos/include/ndk/rtlfuncs.h [iso-8859-1] (original)
+++ trunk/reactos/include/ndk/rtlfuncs.h [iso-8859-1] Sat Nov 12 18:28:16 2011
@@ -3554,7 +3554,17 @@
     Product.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
     return Product;
 }
+
 #endif
+
+NTSYSAPI
+LARGE_INTEGER
+NTAPI
+RtlExtendedLargeIntegerDivide(
+    IN LARGE_INTEGER Dividend,
+    IN ULONG Divisor,
+    OUT PULONG Remainder OPTIONAL
+);
 
 NTSYSAPI
 ULONG


Reply via email to