diff --git a/dlls/ntdll/tests/.cvsignore b/dlls/ntdll/tests/.cvsignore index 4b0154e26d5..e0042f1a8ad 100644 --- a/dlls/ntdll/tests/.cvsignore +++ b/dlls/ntdll/tests/.cvsignore @@ -5,6 +5,7 @@ error.ok generated.ok info.ok large_int.ok +om.ok path.ok reg.ok rtl.ok diff --git a/dlls/ntdll/tests/Makefile.in b/dlls/ntdll/tests/Makefile.in index b0e462feb5c..50c0e53857e 100644 --- a/dlls/ntdll/tests/Makefile.in +++ b/dlls/ntdll/tests/Makefile.in @@ -13,6 +13,7 @@ CTESTS = \ info.c \ large_int.c \ path.c \ + om.c \ reg.c \ rtl.c \ rtlbitmap.c \ diff --git a/dlls/ntdll/tests/om.c b/dlls/ntdll/tests/om.c new file mode 100644 index 00000000000..00e3141dbc3 --- /dev/null +++ b/dlls/ntdll/tests/om.c @@ -0,0 +1,158 @@ +/* + * 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 *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 *pNtOpenFile) ( PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, ULONG, ULONG ); +static NTSTATUS (WINAPI *pNtClose) ( HANDLE ); +static VOID (WINAPI *pRtlInitUnicodeString)( PUNICODE_STRING, LPCWSTR ); +static NTSTATUS (WINAPI *pNtCreateNamedPipeFile)( PHANDLE, ULONG, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, + ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, ULONG, PLARGE_INTEGER ); + + +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); + todo_wine 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); + todo_wine 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); + todo_wine 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, + "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); + todo_wine ok(status == STATUS_OBJECT_NAME_NOT_FOUND, + "pNtOpenFile should have failed with STATUS_OBJECT_NAME_NOT_FOUND got(%08lx)\n", status); + + pNtClose(pipe); +} + +START_TEST(om) +{ + HMODULE hntdll = GetModuleHandleA("ntdll.dll"); + if (hntdll) + { + 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"); + + test_case_sensitive(); + test_namespace_pipe(); + } +}