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