KERNEL32: implement CreateMailslot using NtCreateMailslotFile

Mike McCormack mike at codeweavers.com
Fri Mar 25 21:49:49 CST 2005


Breaking my patch up into smaller parts... the implementation of 
NtCreateMailslotFile is coming.

Mike


ChangeLog:
* implement CreateMailslot using NtCreateMailslotFile
-------------- next part --------------
Index: dlls/ntdll/file.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/file.c,v
retrieving revision 1.79
diff -u -p -r1.79 file.c
--- dlls/ntdll/file.c	23 Mar 2005 13:15:19 -0000	1.79
+++ dlls/ntdll/file.c	26 Mar 2005 03:47:02 -0000
@@ -1739,3 +1739,45 @@ NTSTATUS WINAPI NtCancelIoFile( HANDLE h
     timeout.u.LowPart = timeout.u.HighPart = 0;
     return io_status->u.Status = NtDelayExecution( TRUE, &timeout );
 }
+
+/******************************************************************************
+ *  NtCreateMailslotFile	[NTDLL.@]
+ *  ZwCreateMailslotFile	[NTDLL.@]
+ *
+ * PARAMS
+ *  pHandle          [O] pointer to receive the handle created
+ *  DesiredAccess    [I] access mode (read, write, etc)
+ *  ObjectAttributes [I] fully qualified NT path of the mailslot
+ *  IoStatusBlock    [O] receives completion status and other info
+ *  CreateOptions    [I]
+ *  MailslotQuota    [I]
+ *  MaxMessageSize   [I]
+ *  TimeOut          [I]
+ *
+ * RETURNS
+ *  An NT status code
+ */
+NTSTATUS WINAPI NtCreateMailslotFile(PHANDLE pHandle, ULONG DesiredAccess,
+     POBJECT_ATTRIBUTES attr, PIO_STATUS_BLOCK IoStatusBlock,
+     ULONG CreateOptions, ULONG MailslotQuota, ULONG MaxMessageSize,
+     PLARGE_INTEGER TimeOut)
+{
+    static const WCHAR leadin[] = {
+        '\\','?','?','\\','M','A','I','L','S','L','O','T','\\'};
+    NTSTATUS ret;
+
+    FIXME("%p %08lx %p %p %08lx %08lx %08lx %p\n",
+              pHandle, DesiredAccess, attr, IoStatusBlock,
+              CreateOptions, MailslotQuota, MaxMessageSize, TimeOut);
+
+    if (attr->ObjectName->Length < sizeof(leadin) ||
+        strncmpiW( attr->ObjectName->Buffer, 
+                   leadin, sizeof(leadin)/sizeof(leadin[0]) ))
+    {
+        return STATUS_OBJECT_NAME_INVALID;
+    }
+
+    ret = STATUS_NOT_IMPLEMENTED;
+
+    return ret;
+}
Index: dlls/ntdll/nt.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/nt.c,v
retrieving revision 1.74
diff -u -p -r1.74 nt.c
--- dlls/ntdll/nt.c	23 Feb 2005 20:29:17 -0000	1.74
+++ dlls/ntdll/nt.c	26 Mar 2005 03:47:02 -0000
@@ -540,16 +540,6 @@ NTSTATUS WINAPI NtQueryPerformanceCounte
 }
 
 /******************************************************************************
- *  NtCreateMailslotFile	[NTDLL.@]
- *  ZwCreateMailslotFile	[NTDLL.@]
- */
-NTSTATUS WINAPI NtCreateMailslotFile(DWORD x1,DWORD x2,DWORD x3,DWORD x4,DWORD x5,DWORD x6,DWORD x7,DWORD x8)
-{
-	FIXME("(0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub!\n",x1,x2,x3,x4,x5,x6,x7,x8);
-	return 0;
-}
-
-/******************************************************************************
  * NtQuerySystemInformation [NTDLL.@]
  * ZwQuerySystemInformation [NTDLL.@]
  *
Index: dlls/kernel/sync.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/sync.c,v
retrieving revision 1.72
diff -u -p -r1.72 sync.c
--- dlls/kernel/sync.c	22 Mar 2005 18:23:44 -0000	1.72
+++ dlls/kernel/sync.c	26 Mar 2005 03:47:02 -0000
@@ -1576,10 +1576,56 @@ HANDLE WINAPI CreateMailslotA( LPCSTR lp
 HANDLE WINAPI CreateMailslotW( LPCWSTR lpName, DWORD nMaxMessageSize,
                                DWORD lReadTimeout, LPSECURITY_ATTRIBUTES sa )
 {
-    FIXME("(%s,%ld,%ld,%p): stub\n", debugstr_w(lpName),
+    HANDLE handle = INVALID_HANDLE_VALUE;
+    OBJECT_ATTRIBUTES attr;
+    UNICODE_STRING nameW;
+    LARGE_INTEGER timeout;
+    IO_STATUS_BLOCK iosb;
+    NTSTATUS status;
+
+    TRACE("%s %ld %ld %p\n", debugstr_w(lpName),
           nMaxMessageSize, lReadTimeout, sa);
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-    return INVALID_HANDLE_VALUE;
+
+    if (!lpName)
+    {
+        SetLastError( ERROR_PATH_NOT_FOUND );
+        return INVALID_HANDLE_VALUE;
+    }
+
+    if (!RtlDosPathNameToNtPathName_U( lpName, &nameW, NULL, NULL ))
+    {
+        ERR("invalid name\n");
+        RtlFreeUnicodeString( &nameW );
+        return INVALID_HANDLE_VALUE;
+    }
+
+    if (nameW.Length >= MAX_PATH * sizeof(WCHAR) )
+    {
+        SetLastError( ERROR_FILENAME_EXCED_RANGE );
+        RtlFreeUnicodeString( &nameW );
+        return INVALID_HANDLE_VALUE;
+    }
+
+    attr.Length = sizeof(attr);
+    attr.RootDirectory = 0;
+    attr.Attributes = OBJ_CASE_INSENSITIVE;
+    attr.ObjectName = &nameW;
+    attr.SecurityDescriptor = sa ? sa->lpSecurityDescriptor : NULL;
+    attr.SecurityQualityOfService = NULL;
+
+    timeout.QuadPart = (ULONGLONG) lReadTimeout * -10000;;
+
+    SetLastError(0);
+
+    status = NtCreateMailslotFile( &handle, GENERIC_READ | GENERIC_WRITE, &attr,
+                                   &iosb, 0, 0, nMaxMessageSize, &timeout );
+    if (status)
+    {
+        SetLastError( RtlNtStatusToDosError(status) );
+        handle = INVALID_HANDLE_VALUE;
+    }
+
+    return handle;
 }
 
 
Index: include/winternl.h
===================================================================
RCS file: /home/wine/wine/include/winternl.h,v
retrieving revision 1.110
diff -u -p -r1.110 winternl.h
--- include/winternl.h	19 Mar 2005 17:14:12 -0000	1.110
+++ include/winternl.h	26 Mar 2005 03:47:03 -0000
@@ -1424,6 +1424,7 @@ NTSTATUS  WINAPI NtCreateEvent(PHANDLE,A
 NTSTATUS  WINAPI NtCreateFile(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,PLARGE_INTEGER,ULONG,ULONG,ULONG,ULONG,PVOID,ULONG);
 NTSTATUS  WINAPI NtCreateIoCompletion(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,ULONG);
 NTSTATUS  WINAPI NtCreateKey(PHKEY,ACCESS_MASK,const OBJECT_ATTRIBUTES*,ULONG,const UNICODE_STRING*,ULONG,PULONG);
+NTSTATUS  WINAPI NtCreateMailslotFile(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,ULONG,ULONG,ULONG,PLARGE_INTEGER);
 NTSTATUS  WINAPI NtCreateMutant(HANDLE*,ACCESS_MASK,const OBJECT_ATTRIBUTES*,BOOLEAN);
 NTSTATUS  WINAPI NtCreateNamedPipeFile(PHANDLE,ULONG,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,ULONG,ULONG,ULONG,ULONG,ULONG,ULONG,ULONG,ULONG,ULONG,PLARGE_INTEGER);
 NTSTATUS  WINAPI NtCreateSection(HANDLE*,ACCESS_MASK,const OBJECT_ATTRIBUTES*,const LARGE_INTEGER*,ULONG,ULONG,HANDLE);
Index: dlls/kernel/tests/mailslot.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/tests/mailslot.c,v
retrieving revision 1.5
diff -u -p -r1.5 mailslot.c
--- dlls/kernel/tests/mailslot.c	10 Feb 2005 19:19:36 -0000	1.5
+++ dlls/kernel/tests/mailslot.c	26 Mar 2005 03:47:03 -0000
@@ -57,21 +57,15 @@ static int mailslot_test()
     hSlot = CreateMailslot( "blah", 0, 0, NULL );
     ok( hSlot == INVALID_HANDLE_VALUE,
             "Created mailslot with invalid name\n");
-    todo_wine
-    {
-       ok( GetLastError() == ERROR_INVALID_NAME,
-           "error should be ERROR_INVALID_NAME\n");
-    }
+    ok( GetLastError() == ERROR_INVALID_NAME,
+            "error should be ERROR_INVALID_NAME\n");
 
     /* open a mailslot with a null name */
     hSlot = CreateMailslot( NULL, 0, 0, NULL );
     ok( hSlot == INVALID_HANDLE_VALUE,
             "Created mailslot with invalid name\n");
-    todo_wine
-    {
-        ok( GetLastError() == ERROR_PATH_NOT_FOUND,
+    ok( GetLastError() == ERROR_PATH_NOT_FOUND,
             "error should be ERROR_PATH_NOT_FOUND\n");
-    }
 
     todo_wine
     {


More information about the wine-patches mailing list