add recent winehq object manager tests
Modified: trunk/reactos/regtests/winetests/ntdll/ntdll.xml
Added: trunk/reactos/regtests/winetests/ntdll/om.c
Modified: trunk/reactos/regtests/winetests/ntdll/testlist.c
_____
Modified: trunk/reactos/regtests/winetests/ntdll/ntdll.xml
--- trunk/reactos/regtests/winetests/ntdll/ntdll.xml 2005-11-22
06:57:36 UTC (rev 19453)
+++ trunk/reactos/regtests/winetests/ntdll/ntdll.xml 2005-11-22
07:18:44 UTC (rev 19454)
@@ -7,6 +7,7 @@
<file>error.c</file>
<file>info.c</file>
<file>large_int.c</file>
+ <file>om.c</file>
<file>path.c</file>
<file>reg.c</file>
<file>rtlbitmap.c</file>
_____
Added: trunk/reactos/regtests/winetests/ntdll/om.c
--- trunk/reactos/regtests/winetests/ntdll/om.c 2005-11-22 06:57:36 UTC
(rev 19453)
+++ trunk/reactos/regtests/winetests/ntdll/om.c 2005-11-22 07:18:44 UTC
(rev 19454)
@@ -0,0 +1,564 @@
+/*
+ * Unit test suite for object manager functions
+ *
+ * Copyright 2005 Robert Shearman
+ * Copyright 2005 Vitaliy Margolen
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+
+#include "ntdll_test.h"
+#include "winternl.h"
+#include "stdio.h"
+#include "winnt.h"
+#include "stdlib.h"
+
+static NTSTATUS (WINAPI
*pRtlCreateUnicodeStringFromAsciiz)(PUNICODE_STRING, LPCSTR);
+static VOID (WINAPI *pRtlInitUnicodeString)( PUNICODE_STRING,
LPCWSTR );
+static VOID (WINAPI *pRtlFreeUnicodeString)(PUNICODE_STRING);
+static NTSTATUS (WINAPI *pNtCreateEvent) ( PHANDLE, ACCESS_MASK, const
POBJECT_ATTRIBUTES, BOOLEAN, BOOLEAN);
+static NTSTATUS (WINAPI *pNtCreateMutant)( PHANDLE, ACCESS_MASK, const
POBJECT_ATTRIBUTES, BOOLEAN );
+static NTSTATUS (WINAPI *pNtOpenMutant) ( PHANDLE, ACCESS_MASK, const
POBJECT_ATTRIBUTES );
+static NTSTATUS (WINAPI *pNtCreateSemaphore)( PHANDLE,
ACCESS_MASK,const POBJECT_ATTRIBUTES,LONG,LONG );
+static NTSTATUS (WINAPI *pNtCreateTimer) ( PHANDLE, ACCESS_MASK, const
POBJECT_ATTRIBUTES, TIMER_TYPE );
+static NTSTATUS (WINAPI *pNtCreateSection)( PHANDLE, ACCESS_MASK, const
POBJECT_ATTRIBUTES, const PLARGE_INTEGER,
+ ULONG, ULONG, HANDLE );
+static NTSTATUS (WINAPI *pNtOpenFile) ( PHANDLE, ACCESS_MASK,
POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, ULONG, ULONG );
+static NTSTATUS (WINAPI *pNtClose) ( HANDLE );
+static NTSTATUS (WINAPI *pNtCreateNamedPipeFile)( PHANDLE, ULONG,
POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK,
+ ULONG, ULONG, ULONG, ULONG,
ULONG, ULONG, ULONG, ULONG, ULONG, PLARGE_INTEGER );
+static NTSTATUS (WINAPI *pNtOpenDirectoryObject)(PHANDLE, ACCESS_MASK,
POBJECT_ATTRIBUTES);
+static NTSTATUS (WINAPI *pNtCreateDirectoryObject)(PHANDLE,
ACCESS_MASK, POBJECT_ATTRIBUTES);
+static NTSTATUS (WINAPI *pNtOpenSymbolicLinkObject)(PHANDLE,
ACCESS_MASK, POBJECT_ATTRIBUTES);
+static NTSTATUS (WINAPI *pNtCreateSymbolicLinkObject)(PHANDLE,
ACCESS_MASK, POBJECT_ATTRIBUTES, PUNICODE_STRING);
+
+
+void test_case_sensitive (void)
+{
+ static const WCHAR buffer1[] =
{'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\
\','t','e','s','t',0};
+ static const WCHAR buffer2[] =
{'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\
\','T','e','s','t',0};
+ static const WCHAR buffer3[] =
{'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\
\','T','E','s','t',0};
+ static const WCHAR buffer4[] =
{'\\','B','A','S','E','N','a','m','e','d','O','b','j','e','c','t','s','\
\','t','e','s','t',0};
+ NTSTATUS status;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING str;
+ HANDLE Event, Mutant, h;
+
+ pRtlInitUnicodeString(&str, buffer1);
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtCreateMutant(&Mutant, GENERIC_ALL, &attr, FALSE);
+ ok(status == STATUS_SUCCESS, "Failed to create Mutant(%08lx)\n",
status);
+
+ status = pNtCreateEvent(&Event, GENERIC_ALL, &attr, FALSE, FALSE);
+ ok(status == STATUS_OBJECT_NAME_COLLISION,
+ "NtCreateEvent should have failed with
STATUS_OBJECT_NAME_COLLISION got(%08lx)\n", status);
+
+ pRtlInitUnicodeString(&str, buffer2);
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtCreateEvent(&Event, GENERIC_ALL, &attr, FALSE, FALSE);
+ ok(status == STATUS_SUCCESS, "Failed to create Event(%08lx)\n",
status);
+
+ pRtlInitUnicodeString(&str, buffer3);
+ InitializeObjectAttributes(&attr, &str, OBJ_CASE_INSENSITIVE, 0,
NULL);
+ status = pNtOpenMutant(&h, GENERIC_ALL, &attr);
+ ok(status == STATUS_OBJECT_TYPE_MISMATCH,
+ "NtOpenMutant should have failed with
STATUS_OBJECT_TYPE_MISMATCH got(%08lx)\n", status);
+
+ pNtClose(Mutant);
+
+ pRtlInitUnicodeString(&str, buffer4);
+ InitializeObjectAttributes(&attr, &str, OBJ_CASE_INSENSITIVE, 0,
NULL);
+ status = pNtCreateMutant(&Mutant, GENERIC_ALL, &attr, FALSE);
+ ok(status == STATUS_OBJECT_NAME_COLLISION,
+ "NtCreateMutant should have failed with
STATUS_OBJECT_NAME_COLLISION got(%08lx)\n", status);
+
+ status = pNtCreateEvent(&h, GENERIC_ALL, &attr, FALSE, FALSE);
+ ok(status == STATUS_OBJECT_NAME_COLLISION,
+ "NtCreateEvent should have failed with
STATUS_OBJECT_NAME_COLLISION got(%08lx)\n", status);
+
+ attr.Attributes = 0;
+ status = pNtCreateMutant(&Mutant, GENERIC_ALL, &attr, FALSE);
+ todo_wine ok(status == STATUS_OBJECT_PATH_NOT_FOUND,
+ "NtCreateMutant should have failed with
STATUS_OBJECT_PATH_NOT_FOUND got(%08lx)\n", status);
+
+ pNtClose(Event);
+}
+
+void test_namespace_pipe(void)
+{
+ static const WCHAR buffer1[] =
{'\\','?','?','\\','P','I','P','E','\\','t','e','s','t','\\','p','i','p'
,'e',0};
+ static const WCHAR buffer2[] =
{'\\','?','?','\\','P','I','P','E','\\','T','E','S','T','\\','P','I','P'
,'E',0};
+ static const WCHAR buffer3[] =
{'\\','?','?','\\','p','i','p','e','\\','t','e','s','t','\\','p','i','p'
,'e',0};
+ static const WCHAR buffer4[] =
{'\\','?','?','\\','p','i','p','e','\\','t','e','s','t',0};
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING str;
+ IO_STATUS_BLOCK iosb;
+ NTSTATUS status;
+ LARGE_INTEGER timeout;
+ HANDLE pipe, h;
+
+ timeout.QuadPart = -10000;
+
+ pRtlInitUnicodeString(&str, buffer1);
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtCreateNamedPipeFile(&pipe, GENERIC_READ|GENERIC_WRITE,
&attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE,
+ FILE_CREATE, FILE_PIPE_FULL_DUPLEX,
FALSE, FALSE, FALSE, 1, 256, 256, &timeout);
+ ok(status == STATUS_SUCCESS, "Failed to create NamedPipe(%08lx)\n",
status);
+
+ status = pNtCreateNamedPipeFile(&pipe, GENERIC_READ|GENERIC_WRITE,
&attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE,
+ FILE_CREATE, FILE_PIPE_FULL_DUPLEX,
FALSE, FALSE, FALSE, 1, 256, 256, &timeout);
+ ok(status == STATUS_INSTANCE_NOT_AVAILABLE,
+ "NtCreateNamedPipeFile should have failed with
STATUS_INSTANCE_NOT_AVAILABLE got(%08lx)\n", status);
+
+ pRtlInitUnicodeString(&str, buffer2);
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtCreateNamedPipeFile(&pipe, GENERIC_READ|GENERIC_WRITE,
&attr, &iosb, FILE_SHARE_READ|FILE_SHARE_WRITE,
+ FILE_CREATE, FILE_PIPE_FULL_DUPLEX,
FALSE, FALSE, FALSE, 1, 256, 256, &timeout);
+ todo_wine ok(status == STATUS_INSTANCE_NOT_AVAILABLE,
+ "NtCreateNamedPipeFile should have failed with
STATUS_INSTANCE_NOT_AVAILABLE got(%08lx)\n", status);
+
+ attr.Attributes = OBJ_CASE_INSENSITIVE;
+ status = pNtOpenFile(&h, GENERIC_READ, &attr, &iosb,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN);
+ ok(status == STATUS_SUCCESS, "Failed to open NamedPipe(%08lx)\n",
status);
+ pNtClose(h);
+
+ pRtlInitUnicodeString(&str, buffer3);
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtOpenFile(&h, GENERIC_READ, &attr, &iosb,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN);
+ todo_wine ok(status == STATUS_OBJECT_PATH_NOT_FOUND || status ==
STATUS_PIPE_NOT_AVAILABLE,
+ "pNtOpenFile should have failed with
STATUS_OBJECT_PATH_NOT_FOUND got(%08lx)\n", status);
+
+ pRtlInitUnicodeString(&str, buffer4);
+ InitializeObjectAttributes(&attr, &str, OBJ_CASE_INSENSITIVE, 0,
NULL);
+ status = pNtOpenFile(&h, GENERIC_READ, &attr, &iosb,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN);
+ ok(status == STATUS_OBJECT_NAME_NOT_FOUND,
+ "pNtOpenFile should have failed with
STATUS_OBJECT_NAME_NOT_FOUND got(%08lx)\n", status);
+
+ pNtClose(pipe);
+}
+
+#define DIRECTORY_QUERY (0x0001)
+#define SYMBOLIC_LINK_QUERY 0x0001
+
+#define DIR_TEST_CREATE_FAILURE(h,e) \
+ status = pNtCreateDirectoryObject(h, DIRECTORY_QUERY, &attr);\
+ ok(status == e,"NtCreateDirectoryObject should have failed with %s
got(%08lx)\n", #e, status);
+#define DIR_TEST_OPEN_FAILURE(h,e) \
+ status = pNtOpenDirectoryObject(h, DIRECTORY_QUERY, &attr);\
+ ok(status == e,"NtOpenDirectoryObject should have failed with %s
got(%08lx)\n", #e, status);
+#define DIR_TEST_CREATE_OPEN_FAILURE(h,n,e) \
+ pRtlCreateUnicodeStringFromAsciiz(&str, n);\
+ DIR_TEST_CREATE_FAILURE(h,e) DIR_TEST_OPEN_FAILURE(h,e)\
+ pRtlFreeUnicodeString(&str);
+
+#define DIR_TEST_CREATE_SUCCESS(h) \
+ status = pNtCreateDirectoryObject(h, DIRECTORY_QUERY, &attr); \
+ ok(status == STATUS_SUCCESS, "Failed to create Directory(%08lx)\n",
status);
+#define DIR_TEST_OPEN_SUCCESS(h) \
+ status = pNtOpenDirectoryObject(h, DIRECTORY_QUERY, &attr); \
+ ok(status == STATUS_SUCCESS, "Failed to open Directory(%08lx)\n",
status);
+#define DIR_TEST_CREATE_OPEN_SUCCESS(h,n) \
+ pRtlCreateUnicodeStringFromAsciiz(&str, n);\
+ DIR_TEST_CREATE_SUCCESS(h) pNtClose(h); DIR_TEST_OPEN_SUCCESS(h)
pNtClose(h); \
+ pRtlFreeUnicodeString(&str);
+
+static void test_name_collisions(void)
+{
+ NTSTATUS status;
+ UNICODE_STRING str;
+ OBJECT_ATTRIBUTES attr;
+ HANDLE dir, h, h1, h2;
+ DWORD winerr;
+ LARGE_INTEGER size;
+
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ pRtlCreateUnicodeStringFromAsciiz(&str, "\\");
+ h = 0;
+ todo_wine{ DIR_TEST_CREATE_FAILURE(&h,
STATUS_OBJECT_NAME_COLLISION) }
+ ok(h == 0, "Failed create returned valid handle! (%p)\n", h);
+ InitializeObjectAttributes(&attr, &str, OBJ_OPENIF, 0, NULL);
+
+ todo_wine{ DIR_TEST_CREATE_FAILURE(&h, STATUS_OBJECT_NAME_EXISTS) }
+ pNtClose(h);
+ status = pNtCreateMutant(&h, GENERIC_ALL, &attr, FALSE);
+ todo_wine ok(status == STATUS_OBJECT_TYPE_MISMATCH,
+ "NtCreateMutant should have failed with
STATUS_OBJECT_TYPE_MISMATCH got(%08lx)\n", status);
+ pRtlFreeUnicodeString(&str);
+
+ pRtlCreateUnicodeStringFromAsciiz(&str, "\\??\\PIPE\\om.c-mutant");
+ status = pNtCreateMutant(&h, GENERIC_ALL, &attr, FALSE);
+ todo_wine ok(status == STATUS_OBJECT_TYPE_MISMATCH,
+ "NtCreateMutant should have failed with
STATUS_OBJECT_TYPE_MISMATCH got(%08lx)\n", status);
+ pRtlFreeUnicodeString(&str);
+
+
+ pRtlCreateUnicodeStringFromAsciiz(&str, "\\BaseNamedObjects");
+ DIR_TEST_OPEN_SUCCESS(&dir)
+ pRtlCreateUnicodeStringFromAsciiz(&str, "om.c-test");
+ InitializeObjectAttributes(&attr, &str, OBJ_OPENIF, dir, NULL);
+
+ h = CreateMutexA(NULL, FALSE, "om.c-test");
+ ok(h != 0, "CreateMutexA failed got ret=%p (%ld)\n", h,
GetLastError());
+ status = pNtCreateMutant(&h1, GENERIC_ALL, &attr, FALSE);
+ ok(status == STATUS_OBJECT_NAME_EXISTS && h1 != NULL,
+ "NtCreateMutant should have succeeded with
STATUS_OBJECT_NAME_EXISTS got(%08lx)\n", status);
+ h2 = CreateMutexA(NULL, FALSE, "om.c-test");
+ winerr = GetLastError();
+ ok(h2 != 0 && winerr == ERROR_ALREADY_EXISTS,
+ "CreateMutexA should have succeeded with ERROR_ALREADY_EXISTS
got ret=%p (%ld)\n", h2, winerr);
+ pNtClose(h);
+ pNtClose(h1);
+ pNtClose(h2);
+
+ h = CreateEventA(NULL, FALSE, FALSE, "om.c-test");
+ ok(h != 0, "CreateEventA failed got ret=%p (%ld)\n", h,
GetLastError());
+ status = pNtCreateEvent(&h1, GENERIC_ALL, &attr, FALSE, FALSE);
+ ok(status == STATUS_OBJECT_NAME_EXISTS && h1 != NULL,
+ "NtCreateEvent should have succeeded with
STATUS_OBJECT_NAME_EXISTS got(%08lx)\n", status);
+ h2 = CreateEventA(NULL, FALSE, FALSE, "om.c-test");
+ winerr = GetLastError();
+ ok(h2 != 0 && winerr == ERROR_ALREADY_EXISTS,
+ "CreateEventA should have succeeded with ERROR_ALREADY_EXISTS
got ret=%p (%ld)\n", h2, winerr);
+ pNtClose(h);
+ pNtClose(h1);
+ pNtClose(h2);
+
+ h = CreateSemaphoreA(NULL, 1, 2, "om.c-test");
+ ok(h != 0, "CreateSemaphoreA failed got ret=%p (%ld)\n", h,
GetLastError());
+ status = pNtCreateSemaphore(&h1, GENERIC_ALL, &attr, 1, 2);
+ ok(status == STATUS_OBJECT_NAME_EXISTS && h1 != NULL,
+ "NtCreateSemaphore should have succeeded with
STATUS_OBJECT_NAME_EXISTS got(%08lx)\n", status);
+ h2 = CreateSemaphoreA(NULL, 1, 2, "om.c-test");
+ winerr = GetLastError();
+ ok(h2 != 0 && winerr == ERROR_ALREADY_EXISTS,
+ "CreateSemaphoreA should have succeeded with
ERROR_ALREADY_EXISTS got ret=%p (%ld)\n", h2, winerr);
+ pNtClose(h);
+ pNtClose(h1);
+ pNtClose(h2);
+
+ h = CreateWaitableTimerA(NULL, TRUE, "om.c-test");
+ ok(h != 0, "CreateWaitableTimerA failed got ret=%p (%ld)\n", h,
GetLastError());
+ status = pNtCreateTimer(&h1, GENERIC_ALL, &attr,
NotificationTimer);
+ ok(status == STATUS_OBJECT_NAME_EXISTS && h1 != NULL,
+ "NtCreateTimer should have succeeded with
STATUS_OBJECT_NAME_EXISTS got(%08lx)\n", status);
+ h2 = CreateWaitableTimerA(NULL, TRUE, "om.c-test");
+ winerr = GetLastError();
+ ok(h2 != 0 && winerr == ERROR_ALREADY_EXISTS,
+ "CreateWaitableTimerA should have succeeded with
ERROR_ALREADY_EXISTS got ret=%p (%ld)\n", h2, winerr);
+ pNtClose(h);
+ pNtClose(h1);
+ pNtClose(h2);
+
+ h = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
0, 256, "om.c-test");
+ ok(h != 0, "CreateFileMappingA failed got ret=%p (%ld)\n", h,
GetLastError());
+ size.u.LowPart = 256;
+ size.u.HighPart = 0;
+ status = pNtCreateSection(&h1, SECTION_MAP_WRITE, &attr, &size,
PAGE_READWRITE, SEC_COMMIT, 0);
+ ok(status == STATUS_OBJECT_NAME_EXISTS && h1 != NULL,
+ "NtCreateSection should have succeeded with
STATUS_OBJECT_NAME_EXISTS got(%08lx)\n", status);
+ h2 = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
0, 256, "om.c-test");
+ winerr = GetLastError();
+ ok(h2 != 0 && winerr == ERROR_ALREADY_EXISTS,
+ "CreateFileMappingA should have succeeded with
ERROR_ALREADY_EXISTS got ret=%p (%ld)\n", h2, winerr);
+ pNtClose(h);
+ pNtClose(h1);
+ pNtClose(h2);
+
+ pRtlFreeUnicodeString(&str);
+ pNtClose(dir);
+}
+
+void test_directory(void)
+{
+ NTSTATUS status;
+ UNICODE_STRING str;
+ OBJECT_ATTRIBUTES attr;
+ HANDLE dir, dir1, h;
+
+ /* No name and/or no attributes */
+ status = pNtCreateDirectoryObject(NULL, DIRECTORY_QUERY, &attr);
+ todo_wine ok(status == STATUS_ACCESS_VIOLATION,
+ "NtCreateDirectoryObject should have failed with
STATUS_ACCESS_VIOLATION got(%08lx)\n", status);
+ status = pNtOpenDirectoryObject(NULL, DIRECTORY_QUERY, &attr);
+ todo_wine ok(status == STATUS_ACCESS_VIOLATION,
+ "NtOpenDirectoryObject should have failed with
STATUS_ACCESS_VIOLATION got(%08lx)\n", status);
+
+ status = pNtCreateDirectoryObject(&h, DIRECTORY_QUERY, NULL);
+ ok(status == STATUS_SUCCESS, "Failed to create Directory without
attributes(%08lx)\n", status);
+ pNtClose(h);
+ status = pNtOpenDirectoryObject(&h, DIRECTORY_QUERY, NULL);
+ todo_wine ok(status == STATUS_INVALID_PARAMETER,
+ "NtOpenDirectoryObject should have failed with
STATUS_INVALID_PARAMETER got(%08lx)\n", status);
+
+ InitializeObjectAttributes(&attr, NULL, 0, 0, NULL);
+ DIR_TEST_CREATE_SUCCESS(&dir)
+ todo_wine{ DIR_TEST_OPEN_FAILURE(&h, STATUS_OBJECT_PATH_SYNTAX_BAD)
}
+
+ /* Bad name */
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+
+ pRtlCreateUnicodeStringFromAsciiz(&str, "");
+ DIR_TEST_CREATE_SUCCESS(&h)
+ pNtClose(h);
+ todo_wine{ DIR_TEST_OPEN_FAILURE(&h, STATUS_OBJECT_PATH_SYNTAX_BAD)
}
+ pRtlFreeUnicodeString(&str);
+ pNtClose(dir);
+
+ todo_wine{ DIR_TEST_CREATE_OPEN_FAILURE(&h, "BaseNamedObjects",
STATUS_OBJECT_PATH_SYNTAX_BAD) }
+ todo_wine{ DIR_TEST_CREATE_OPEN_FAILURE(&h, "\\BaseNamedObjects\\",
STATUS_OBJECT_NAME_INVALID) }
+ todo_wine{ DIR_TEST_CREATE_OPEN_FAILURE(&h, "\\\\BaseNamedObjects",
STATUS_OBJECT_NAME_INVALID) }
+ todo_wine{ DIR_TEST_CREATE_OPEN_FAILURE(&h,
"\\BaseNamedObjects\\\\om.c-test", STATUS_OBJECT_NAME_INVALID) }
+ todo_wine{ DIR_TEST_CREATE_OPEN_FAILURE(&h,
"\\BaseNamedObjects\\om.c-test\\", STATUS_OBJECT_PATH_NOT_FOUND) }
+
+ pRtlCreateUnicodeStringFromAsciiz(&str,
"\\BaseNamedObjects\\om.c-test");
+ DIR_TEST_CREATE_SUCCESS(&h)
+ DIR_TEST_OPEN_SUCCESS(&dir1)
+ pRtlFreeUnicodeString(&str);
+ pNtClose(h);
+ pNtClose(dir1);
+
+
+ /* Use of root directory */
+
+ /* Can't use symlinks as a directory */
+ pRtlCreateUnicodeStringFromAsciiz(&str,
"\\BaseNamedObjects\\Local");
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ status = pNtOpenSymbolicLinkObject(&dir, SYMBOLIC_LINK_QUERY,
&attr);\
+ todo_wine ok(status == STATUS_SUCCESS, "Failed to open
SymbolicLink(%08lx)\n", status);
+ pRtlFreeUnicodeString(&str);
+ InitializeObjectAttributes(&attr, &str, 0, dir, NULL);
+ pRtlCreateUnicodeStringFromAsciiz(&str, "one more level");
+ todo_wine{ DIR_TEST_CREATE_FAILURE(&h, STATUS_OBJECT_TYPE_MISMATCH)
}
+ pRtlFreeUnicodeString(&str);
+ pNtClose(h);
+ pNtClose(dir);
+
+ pRtlCreateUnicodeStringFromAsciiz(&str, "\\BaseNamedObjects");
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ DIR_TEST_OPEN_SUCCESS(&dir)
+ pRtlFreeUnicodeString(&str);
+
+ InitializeObjectAttributes(&attr, NULL, 0, dir, NULL);
+ todo_wine{ DIR_TEST_OPEN_FAILURE(&h, STATUS_OBJECT_NAME_INVALID) }
+
+ InitializeObjectAttributes(&attr, &str, 0, dir, NULL);
+ DIR_TEST_CREATE_OPEN_SUCCESS(&h, "")
+ todo_wine{ DIR_TEST_CREATE_OPEN_FAILURE(&h, "\\",
STATUS_OBJECT_PATH_SYNTAX_BAD) }
+ todo_wine{ DIR_TEST_CREATE_OPEN_FAILURE(&h, "\\om.c-test",
STATUS_OBJECT_PATH_SYNTAX_BAD) }
+ todo_wine{ DIR_TEST_CREATE_OPEN_FAILURE(&h, "\\om.c-test\\",
STATUS_OBJECT_PATH_SYNTAX_BAD) }
+ todo_wine{ DIR_TEST_CREATE_OPEN_FAILURE(&h, "om.c-test\\",
STATUS_OBJECT_PATH_NOT_FOUND) }
+
+ pRtlCreateUnicodeStringFromAsciiz(&str, "om.c-test");
+ DIR_TEST_CREATE_SUCCESS(&dir1)
+ DIR_TEST_OPEN_SUCCESS(&h)
+ pRtlFreeUnicodeString(&str);
+
+ pNtClose(h);
+ pNtClose(dir1);
+ pNtClose(dir);
+
+ /* Nested directories */
+ pRtlCreateUnicodeStringFromAsciiz(&str, "\\");
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ DIR_TEST_OPEN_SUCCESS(&dir)
+ InitializeObjectAttributes(&attr, &str, 0, dir, NULL);
+ todo_wine{ DIR_TEST_OPEN_FAILURE(&h, STATUS_OBJECT_PATH_SYNTAX_BAD)
}
+ pRtlFreeUnicodeString(&str);
+ pNtClose(dir);
+
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ pRtlCreateUnicodeStringFromAsciiz(&str,
"\\BaseNamedObjects\\om.c-test");
+ DIR_TEST_CREATE_SUCCESS(&dir)
+ pRtlFreeUnicodeString(&str);
+ pRtlCreateUnicodeStringFromAsciiz(&str,
"\\BaseNamedObjects\\om.c-test\\one more level");
+ DIR_TEST_CREATE_SUCCESS(&h)
+ pRtlFreeUnicodeString(&str);
+ pNtClose(h);
+ InitializeObjectAttributes(&attr, &str, 0, dir, NULL);
+ pRtlCreateUnicodeStringFromAsciiz(&str, "one more level");
+ DIR_TEST_CREATE_SUCCESS(&h)
+ pRtlFreeUnicodeString(&str);
+ pNtClose(h);
+
+ pNtClose(dir);
+
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ pRtlCreateUnicodeStringFromAsciiz(&str,
"\\BaseNamedObjects\\Global\\om.c-test");
+ DIR_TEST_CREATE_SUCCESS(&dir)
+ pRtlFreeUnicodeString(&str);
+ pRtlCreateUnicodeStringFromAsciiz(&str,
"\\BaseNamedObjects\\Local\\om.c-test\\one more level");
+ DIR_TEST_CREATE_SUCCESS(&h)
+ pRtlFreeUnicodeString(&str);
+ pNtClose(h);
+ InitializeObjectAttributes(&attr, &str, 0, dir, NULL);
+ pRtlCreateUnicodeStringFromAsciiz(&str, "one more level");
+ DIR_TEST_CREATE_SUCCESS(&dir)
+ pRtlFreeUnicodeString(&str);
+ pNtClose(h);
+
+ pNtClose(dir);
+
+
+ /* Create other objects using RootDirectory */
+
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+ pRtlCreateUnicodeStringFromAsciiz(&str, "\\BaseNamedObjects");
+ DIR_TEST_OPEN_SUCCESS(&dir)
+ pRtlFreeUnicodeString(&str);
+ InitializeObjectAttributes(&attr, &str, 0, dir, NULL);
+
+ /* Test inavalid paths */
+ pRtlCreateUnicodeStringFromAsciiz(&str, "\\om.c-mutant");
+ status = pNtCreateMutant(&h, GENERIC_ALL, &attr, FALSE);
+ todo_wine ok(status == STATUS_OBJECT_PATH_SYNTAX_BAD,
+ "NtCreateMutant should have failed with
STATUS_OBJECT_PATH_SYNTAX_BAD got(%08lx)\n", status);
+ pRtlFreeUnicodeString(&str);
+ pRtlCreateUnicodeStringFromAsciiz(&str, "\\om.c-mutant\\");
+ status = pNtCreateMutant(&h, GENERIC_ALL, &attr, FALSE);
+ todo_wine ok(status == STATUS_OBJECT_PATH_SYNTAX_BAD,
+ "NtCreateMutant should have failed with
STATUS_OBJECT_PATH_SYNTAX_BAD got(%08lx)\n", status);
+ pRtlFreeUnicodeString(&str);
+
+ pRtlCreateUnicodeStringFromAsciiz(&str, "om.c\\-mutant");
+ status = pNtCreateMutant(&h, GENERIC_ALL, &attr, FALSE);
+ todo_wine ok(status == STATUS_OBJECT_PATH_NOT_FOUND,
+ "NtCreateMutant should have failed with
STATUS_OBJECT_PATH_NOT_FOUND got(%08lx)\n", status);
+ pRtlFreeUnicodeString(&str);
+
+ pRtlCreateUnicodeStringFromAsciiz(&str, "om.c-mutant");
+ status = pNtCreateMutant(&h, GENERIC_ALL, &attr, FALSE);
+ ok(status == STATUS_SUCCESS, "Failed to create Mutant(%08lx)\n",
status);
+ pRtlFreeUnicodeString(&str);
+ pNtClose(h);
+
+ pNtClose(dir);
+}
+
+#define SYMLNK_TEST_CREATE_FAILURE(h,e) \
+ status = pNtCreateSymbolicLinkObject(h, SYMBOLIC_LINK_QUERY, &attr,
&target);\
+ ok(status == e,"NtCreateSymbolicLinkObject should have failed with
%s got(%08lx)\n", #e, status);
+#define SYMLNK_TEST_OPEN_FAILURE(h,e) \
+ status = pNtOpenSymbolicLinkObject(h, SYMBOLIC_LINK_QUERY, &attr);\
+ ok(status == e,"NtOpenSymbolicLinkObject should have failed with %s
got(%08lx)\n", #e, status);
+#define SYMLNK_TEST_CREATE_OPEN_FAILURE(h,n,t,e) \
+ pRtlCreateUnicodeStringFromAsciiz(&str, n);\
+ pRtlCreateUnicodeStringFromAsciiz(&target, t);\
+ SYMLNK_TEST_CREATE_FAILURE(h,e)\
+ SYMLNK_TEST_OPEN_FAILURE(h,e)\
+ pRtlFreeUnicodeString(&target);\
+ pRtlFreeUnicodeString(&str);
+
+#define SYMLNK_TEST_CREATE_SUCCESS(h) \
+ status = pNtCreateSymbolicLinkObject(h, SYMBOLIC_LINK_QUERY, &attr,
&target); \
+ ok(status == STATUS_SUCCESS, "Failed to create
SymbolicLink(%08lx)\n", status);
+#define SYMLNK_TEST_OPEN_SUCCESS(h) \
+ status = pNtOpenSymbolicLinkObject(h, SYMBOLIC_LINK_QUERY, &attr);
\
+ ok(status == STATUS_SUCCESS, "Failed to open
SymbolicLink(%08lx)\n", status);
+
+void test_symboliclink(void)
+{
+ NTSTATUS status;
+ UNICODE_STRING str, target;
+ OBJECT_ATTRIBUTES attr;
+ HANDLE dir, link, h;
+ IO_STATUS_BLOCK iosb;
+
+ /* No name and/or no attributes */
+ todo_wine{ SYMLNK_TEST_CREATE_OPEN_FAILURE(NULL, "", "",
STATUS_ACCESS_VIOLATION) }
+
+ status = pNtCreateSymbolicLinkObject(&h, SYMBOLIC_LINK_QUERY, NULL,
NULL);
+ todo_wine ok(status == STATUS_ACCESS_VIOLATION,
+ "NtCreateSymbolicLinkObject should have failed with
STATUS_ACCESS_VIOLATION got(%08lx)\n", status);
+ status = pNtOpenSymbolicLinkObject(&h, SYMBOLIC_LINK_QUERY, NULL);
+ todo_wine ok(status == STATUS_INVALID_PARAMETER,
+ "NtOpenSymbolicLinkObject should have failed with
STATUS_INVALID_PARAMETER got(%08lx)\n", status);
+
+ InitializeObjectAttributes(&attr, NULL, 0, 0, NULL);
+ todo_wine{ SYMLNK_TEST_CREATE_FAILURE(&link,
STATUS_INVALID_PARAMETER) }
+ todo_wine{ SYMLNK_TEST_OPEN_FAILURE(&h,
STATUS_OBJECT_PATH_SYNTAX_BAD) }
+
+ /* Bad name */
+ pRtlCreateUnicodeStringFromAsciiz(&target, "anywhere");
+ InitializeObjectAttributes(&attr, &str, 0, 0, NULL);
+
+ pRtlCreateUnicodeStringFromAsciiz(&str, "");
+ SYMLNK_TEST_CREATE_SUCCESS(&link)
+ todo_wine{ SYMLNK_TEST_OPEN_FAILURE(&h,
STATUS_OBJECT_PATH_SYNTAX_BAD) }
+ pNtClose(link);
+ pRtlFreeUnicodeString(&str);
+
+ pRtlCreateUnicodeStringFromAsciiz(&str, "\\");
+ todo_wine {SYMLNK_TEST_CREATE_FAILURE(&h,
STATUS_OBJECT_TYPE_MISMATCH)}
+ pRtlFreeUnicodeString(&str);
+ pRtlFreeUnicodeString(&target);
+
+ todo_wine{ SYMLNK_TEST_CREATE_OPEN_FAILURE(&h, "BaseNamedObjects",
"->Somewhere", STATUS_OBJECT_PATH_SYNTAX_BAD) }
+ todo_wine{ SYMLNK_TEST_CREATE_OPEN_FAILURE(&h,
"\\BaseNamedObjects\\", "->Somewhere", STATUS_OBJECT_NAME_INVALID)
}
+ todo_wine{ SYMLNK_TEST_CREATE_OPEN_FAILURE(&h,
"\\\\BaseNamedObjects", "->Somewhere", STATUS_OBJECT_NAME_INVALID)
}
+ todo_wine{ SYMLNK_TEST_CREATE_OPEN_FAILURE(&h,
"\\BaseNamedObjects\\\\om.c-test", "->Somewhere",
STATUS_OBJECT_NAME_INVALID) }
+ todo_wine{ SYMLNK_TEST_CREATE_OPEN_FAILURE(&h,
"\\BaseNamedObjects\\om.c-test\\", "->Somewhere",
STATUS_OBJECT_NAME_INVALID) }
+
+
+ /* Compaund test */
+ pRtlCreateUnicodeStringFromAsciiz(&str, "\\BaseNamedObjects");
+ DIR_TEST_OPEN_SUCCESS(&dir)
+ pRtlFreeUnicodeString(&str);
+
+ InitializeObjectAttributes(&attr, &str, 0, dir, NULL);
+ pRtlCreateUnicodeStringFromAsciiz(&str, "Local\\test-link");
+ pRtlCreateUnicodeStringFromAsciiz(&target, "\\DosDevices");
+ SYMLNK_TEST_CREATE_SUCCESS(&link)
+ pRtlFreeUnicodeString(&str);
+ pRtlFreeUnicodeString(&target);
+
+ pRtlCreateUnicodeStringFromAsciiz(&str, "Local\\test-link\\PIPE");
+ status = pNtOpenFile(&h, GENERIC_READ, &attr, &iosb,
FILE_SHARE_READ|FILE_SHARE_WRITE, FILE_OPEN);
+ todo_wine ok(status == STATUS_SUCCESS, "Failed to open
NamedPipe(%08lx)\n", status);
+ pRtlFreeUnicodeString(&str);
+
+ pNtClose(h);
+ pNtClose(link);
+ pNtClose(dir);
+}
+
+START_TEST(om)
+{
+ HMODULE hntdll = GetModuleHandleA("ntdll.dll");
+ if (hntdll)
+ {
+ pRtlCreateUnicodeStringFromAsciiz = (void
*)GetProcAddress(hntdll, "RtlCreateUnicodeStringFromAsciiz");
+ pRtlFreeUnicodeString = (void *)GetProcAddress(hntdll,
"RtlFreeUnicodeString");
+ pNtCreateEvent = (void *)GetProcAddress(hntdll,
"NtCreateEvent");
+ pNtCreateMutant = (void *)GetProcAddress(hntdll,
"NtCreateMutant");
+ pNtOpenMutant = (void *)GetProcAddress(hntdll,
"NtOpenMutant");
+ pNtOpenFile = (void *)GetProcAddress(hntdll,
"NtOpenFile");
+ pNtClose = (void *)GetProcAddress(hntdll,
"NtClose");
+ pRtlInitUnicodeString = (void *)GetProcAddress(hntdll,
"RtlInitUnicodeString");
+ pNtCreateNamedPipeFile = (void *)GetProcAddress(hntdll,
"NtCreateNamedPipeFile");
+ pNtOpenDirectoryObject = (void *)GetProcAddress(hntdll,
"NtOpenDirectoryObject");
+ pNtCreateDirectoryObject= (void *)GetProcAddress(hntdll,
"NtCreateDirectoryObject");
+ pNtOpenSymbolicLinkObject = (void *)GetProcAddress(hntdll,
"NtOpenSymbolicLinkObject");
+ pNtCreateSymbolicLinkObject = (void *)GetProcAddress(hntdll,
"NtCreateSymbolicLinkObject");
+ pNtCreateSemaphore = (void *)GetProcAddress(hntdll,
"NtCreateSemaphore");
+ pNtCreateTimer = (void *)GetProcAddress(hntdll,
"NtCreateTimer");
+ pNtCreateSection = (void *)GetProcAddress(hntdll,
"NtCreateSection");
+
+ test_case_sensitive();
+ test_namespace_pipe();
+ test_name_collisions();
+ test_directory();
+ test_symboliclink();
+ }
+}
_____
Modified: trunk/reactos/regtests/winetests/ntdll/testlist.c
--- trunk/reactos/regtests/winetests/ntdll/testlist.c 2005-11-22
06:57:36 UTC (rev 19453)
+++ trunk/reactos/regtests/winetests/ntdll/testlist.c 2005-11-22
07:18:44 UTC (rev 19454)
@@ -12,6 +12,7 @@
extern void func_error(void);
extern void func_info(void);
extern void func_large_int(void);
+extern void func_om(void);
extern void func_path(void);
extern void func_reg(void);
extern void func_rtl(void);
@@ -34,6 +35,7 @@
{ "error", func_error },
{ "info", func_info },
{ "large_int", func_large_int },
+ { "om", func_om },
{ "path", func_path },
{ "reg", func_reg },
{ "rtl", func_rtl },