2 * Unit test suite for object manager functions
4 * Copyright 2005 Robert Shearman
5 * Copyright 2005 Vitaliy Margolen
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "ntdll_test.h"
28 static HANDLE (WINAPI
*pCreateWaitableTimerA
)(SECURITY_ATTRIBUTES
*, BOOL
, LPCSTR
);
29 static BOOLEAN (WINAPI
*pRtlCreateUnicodeStringFromAsciiz
)(PUNICODE_STRING
, LPCSTR
);
30 static VOID (WINAPI
*pRtlInitUnicodeString
)( PUNICODE_STRING
, LPCWSTR
);
31 static VOID (WINAPI
*pRtlFreeUnicodeString
)(PUNICODE_STRING
);
32 static NTSTATUS (WINAPI
*pNtCreateEvent
) ( PHANDLE
, ACCESS_MASK
, const POBJECT_ATTRIBUTES
, BOOLEAN
, BOOLEAN
);
33 static NTSTATUS (WINAPI
*pNtOpenEvent
) ( PHANDLE
, ACCESS_MASK
, const POBJECT_ATTRIBUTES
);
34 static NTSTATUS (WINAPI
*pNtPulseEvent
) ( HANDLE
, PULONG
);
35 static NTSTATUS (WINAPI
*pNtQueryEvent
) ( HANDLE
, EVENT_INFORMATION_CLASS
, PVOID
, ULONG
, PULONG
);
36 static NTSTATUS (WINAPI
*pNtCreateJobObject
)( PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
37 static NTSTATUS (WINAPI
*pNtOpenJobObject
)( PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
38 static NTSTATUS (WINAPI
*pNtCreateKey
)( PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
, ULONG
,
39 const UNICODE_STRING
*, ULONG
, PULONG
);
40 static NTSTATUS (WINAPI
*pNtOpenKey
)( PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
41 static NTSTATUS (WINAPI
*pNtDeleteKey
)( HANDLE
);
42 static NTSTATUS (WINAPI
*pNtCreateMailslotFile
)( PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
, PIO_STATUS_BLOCK
,
43 ULONG
, ULONG
, ULONG
, PLARGE_INTEGER
);
44 static NTSTATUS (WINAPI
*pNtCreateMutant
)( PHANDLE
, ACCESS_MASK
, const POBJECT_ATTRIBUTES
, BOOLEAN
);
45 static NTSTATUS (WINAPI
*pNtOpenMutant
) ( PHANDLE
, ACCESS_MASK
, const POBJECT_ATTRIBUTES
);
46 static NTSTATUS (WINAPI
*pNtCreateSemaphore
)( PHANDLE
, ACCESS_MASK
,const POBJECT_ATTRIBUTES
,LONG
,LONG
);
47 static NTSTATUS (WINAPI
*pNtOpenSemaphore
)( PHANDLE
, ACCESS_MASK
, const POBJECT_ATTRIBUTES
);
48 static NTSTATUS (WINAPI
*pNtCreateTimer
) ( PHANDLE
, ACCESS_MASK
, const POBJECT_ATTRIBUTES
, TIMER_TYPE
);
49 static NTSTATUS (WINAPI
*pNtOpenTimer
)( PHANDLE
, ACCESS_MASK
, const POBJECT_ATTRIBUTES
);
50 static NTSTATUS (WINAPI
*pNtCreateSection
)( PHANDLE
, ACCESS_MASK
, const POBJECT_ATTRIBUTES
, const PLARGE_INTEGER
,
51 ULONG
, ULONG
, HANDLE
);
52 static NTSTATUS (WINAPI
*pNtOpenSection
)( PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
53 static NTSTATUS (WINAPI
*pNtOpenFile
) ( PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
, PIO_STATUS_BLOCK
, ULONG
, ULONG
);
54 static NTSTATUS (WINAPI
*pNtClose
) ( HANDLE
);
55 static NTSTATUS (WINAPI
*pNtCreateNamedPipeFile
)( PHANDLE
, ULONG
, POBJECT_ATTRIBUTES
, PIO_STATUS_BLOCK
,
56 ULONG
, ULONG
, ULONG
, ULONG
, ULONG
, ULONG
, ULONG
, ULONG
, ULONG
, PLARGE_INTEGER
);
57 static NTSTATUS (WINAPI
*pNtOpenDirectoryObject
)(PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
58 static NTSTATUS (WINAPI
*pNtCreateDirectoryObject
)(PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
59 static NTSTATUS (WINAPI
*pNtOpenSymbolicLinkObject
)(PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
60 static NTSTATUS (WINAPI
*pNtCreateSymbolicLinkObject
)(PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
, PUNICODE_STRING
);
61 static NTSTATUS (WINAPI
*pNtQuerySymbolicLinkObject
)(HANDLE
,PUNICODE_STRING
,PULONG
);
62 static NTSTATUS (WINAPI
*pNtQueryObject
)(HANDLE
,OBJECT_INFORMATION_CLASS
,PVOID
,ULONG
,PULONG
);
63 static NTSTATUS (WINAPI
*pNtReleaseSemaphore
)(HANDLE
, ULONG
, PULONG
);
64 static NTSTATUS (WINAPI
*pNtCreateKeyedEvent
)( HANDLE
*, ACCESS_MASK
, const OBJECT_ATTRIBUTES
*, ULONG
);
65 static NTSTATUS (WINAPI
*pNtOpenKeyedEvent
)( HANDLE
*, ACCESS_MASK
, const OBJECT_ATTRIBUTES
* );
66 static NTSTATUS (WINAPI
*pNtWaitForKeyedEvent
)( HANDLE
, const void *, BOOLEAN
, const LARGE_INTEGER
* );
67 static NTSTATUS (WINAPI
*pNtReleaseKeyedEvent
)( HANDLE
, const void *, BOOLEAN
, const LARGE_INTEGER
* );
68 static NTSTATUS (WINAPI
*pNtCreateIoCompletion
)(PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
, ULONG
);
69 static NTSTATUS (WINAPI
*pNtOpenIoCompletion
)( PHANDLE
, ACCESS_MASK
, POBJECT_ATTRIBUTES
);
71 #define KEYEDEVENT_WAIT 0x0001
72 #define KEYEDEVENT_WAKE 0x0002
73 #define KEYEDEVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x0003)
75 static void test_case_sensitive (void)
77 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};
78 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};
79 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};
80 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};
82 OBJECT_ATTRIBUTES attr
;
84 HANDLE Event
, Mutant
, h
;
86 pRtlInitUnicodeString(&str
, buffer1
);
87 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
88 status
= pNtCreateMutant(&Mutant
, GENERIC_ALL
, &attr
, FALSE
);
89 ok(status
== STATUS_SUCCESS
, "Failed to create Mutant(%08x)\n", status
);
91 status
= pNtCreateEvent(&Event
, GENERIC_ALL
, &attr
, FALSE
, FALSE
);
92 ok(status
== STATUS_OBJECT_NAME_COLLISION
|| status
== STATUS_OBJECT_TYPE_MISMATCH
,
93 "NtCreateEvent should have failed with STATUS_OBJECT_NAME_COLLISION or STATUS_OBJECT_TYPE_MISMATCH got (%08x)\n", status
);
95 pRtlInitUnicodeString(&str
, buffer2
);
96 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
97 status
= pNtCreateEvent(&Event
, GENERIC_ALL
, &attr
, FALSE
, FALSE
);
98 ok(status
== STATUS_SUCCESS
, "Failed to create Event(%08x)\n", status
);
100 pRtlInitUnicodeString(&str
, buffer3
);
101 InitializeObjectAttributes(&attr
, &str
, OBJ_CASE_INSENSITIVE
, 0, NULL
);
102 status
= pNtOpenMutant(&h
, GENERIC_ALL
, &attr
);
103 ok(status
== STATUS_OBJECT_TYPE_MISMATCH
,
104 "NtOpenMutant should have failed with STATUS_OBJECT_TYPE_MISMATCH got(%08x)\n", status
);
108 pRtlInitUnicodeString(&str
, buffer4
);
109 InitializeObjectAttributes(&attr
, &str
, OBJ_CASE_INSENSITIVE
, 0, NULL
);
110 status
= pNtCreateMutant(&Mutant
, GENERIC_ALL
, &attr
, FALSE
);
111 ok(status
== STATUS_OBJECT_NAME_COLLISION
|| status
== STATUS_OBJECT_TYPE_MISMATCH
,
112 "NtCreateMutant should have failed with STATUS_OBJECT_NAME_COLLISION or STATUS_OBJECT_TYPE_MISMATCH got (%08x)\n", status
);
114 status
= pNtCreateEvent(&h
, GENERIC_ALL
, &attr
, FALSE
, FALSE
);
115 ok(status
== STATUS_OBJECT_NAME_COLLISION
,
116 "NtCreateEvent should have failed with STATUS_OBJECT_NAME_COLLISION got(%08x)\n", status
);
119 status
= pNtCreateMutant(&Mutant
, GENERIC_ALL
, &attr
, FALSE
);
120 ok(status
== STATUS_OBJECT_PATH_NOT_FOUND
,
121 "NtCreateMutant should have failed with STATUS_OBJECT_PATH_NOT_FOUND got(%08x)\n", status
);
126 static void test_namespace_pipe(void)
128 static const WCHAR buffer1
[] = {'\\','?','?','\\','P','I','P','E','\\','t','e','s','t','\\','p','i','p','e',0};
129 static const WCHAR buffer2
[] = {'\\','?','?','\\','P','I','P','E','\\','T','E','S','T','\\','P','I','P','E',0};
130 static const WCHAR buffer3
[] = {'\\','?','?','\\','p','i','p','e','\\','t','e','s','t','\\','p','i','p','e',0};
131 static const WCHAR buffer4
[] = {'\\','?','?','\\','p','i','p','e','\\','t','e','s','t',0};
132 OBJECT_ATTRIBUTES attr
;
134 IO_STATUS_BLOCK iosb
;
136 LARGE_INTEGER timeout
;
139 timeout
.QuadPart
= -10000;
141 pRtlInitUnicodeString(&str
, buffer1
);
142 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
143 status
= pNtCreateNamedPipeFile(&pipe
, GENERIC_READ
|GENERIC_WRITE
, &attr
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
,
144 FILE_CREATE
, FILE_PIPE_FULL_DUPLEX
, FALSE
, FALSE
, FALSE
, 1, 256, 256, &timeout
);
145 ok(status
== STATUS_SUCCESS
, "Failed to create NamedPipe(%08x)\n", status
);
147 status
= pNtCreateNamedPipeFile(&pipe
, GENERIC_READ
|GENERIC_WRITE
, &attr
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
,
148 FILE_CREATE
, FILE_PIPE_FULL_DUPLEX
, FALSE
, FALSE
, FALSE
, 1, 256, 256, &timeout
);
149 ok(status
== STATUS_INSTANCE_NOT_AVAILABLE
,
150 "NtCreateNamedPipeFile should have failed with STATUS_INSTANCE_NOT_AVAILABLE got(%08x)\n", status
);
152 pRtlInitUnicodeString(&str
, buffer2
);
153 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
154 status
= pNtCreateNamedPipeFile(&pipe
, GENERIC_READ
|GENERIC_WRITE
, &attr
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
,
155 FILE_CREATE
, FILE_PIPE_FULL_DUPLEX
, FALSE
, FALSE
, FALSE
, 1, 256, 256, &timeout
);
156 ok(status
== STATUS_INSTANCE_NOT_AVAILABLE
,
157 "NtCreateNamedPipeFile should have failed with STATUS_INSTANCE_NOT_AVAILABLE got(%08x)\n", status
);
159 h
= CreateFileA("\\\\.\\pipe\\test\\pipe", GENERIC_READ
, FILE_SHARE_READ
|FILE_SHARE_WRITE
, NULL
,
160 OPEN_EXISTING
, 0, 0 );
161 ok(h
!= INVALID_HANDLE_VALUE
, "Failed to open NamedPipe (%u)\n", GetLastError());
164 pRtlInitUnicodeString(&str
, buffer3
);
165 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
166 status
= pNtOpenFile(&h
, GENERIC_READ
, &attr
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
, 0);
167 ok(status
== STATUS_OBJECT_PATH_NOT_FOUND
||
168 status
== STATUS_PIPE_NOT_AVAILABLE
||
169 status
== STATUS_OBJECT_NAME_INVALID
|| /* vista */
170 status
== STATUS_OBJECT_NAME_NOT_FOUND
, /* win8 */
171 "NtOpenFile should have failed with STATUS_OBJECT_PATH_NOT_FOUND got(%08x)\n", status
);
173 pRtlInitUnicodeString(&str
, buffer4
);
174 InitializeObjectAttributes(&attr
, &str
, OBJ_CASE_INSENSITIVE
, 0, NULL
);
175 status
= pNtOpenFile(&h
, GENERIC_READ
, &attr
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
, 0);
176 ok(status
== STATUS_OBJECT_NAME_NOT_FOUND
||
177 status
== STATUS_OBJECT_NAME_INVALID
, /* vista */
178 "NtOpenFile should have failed with STATUS_OBJECT_NAME_NOT_FOUND got(%08x)\n", status
);
183 #define DIRECTORY_QUERY (0x0001)
184 #define SYMBOLIC_LINK_QUERY 0x0001
186 #define DIR_TEST_CREATE_FAILURE(h,e) \
187 status = pNtCreateDirectoryObject(h, DIRECTORY_QUERY, &attr);\
188 ok(status == e,"NtCreateDirectoryObject should have failed with %s got(%08x)\n", #e, status);
189 #define DIR_TEST_OPEN_FAILURE(h,e) \
190 status = pNtOpenDirectoryObject(h, DIRECTORY_QUERY, &attr);\
191 ok(status == e,"NtOpenDirectoryObject should have failed with %s got(%08x)\n", #e, status);
192 #define DIR_TEST_CREATE_OPEN_FAILURE(h,n,e) \
193 pRtlCreateUnicodeStringFromAsciiz(&str, n);\
194 DIR_TEST_CREATE_FAILURE(h,e) DIR_TEST_OPEN_FAILURE(h,e)\
195 pRtlFreeUnicodeString(&str);
197 #define DIR_TEST_CREATE_SUCCESS(h) \
198 status = pNtCreateDirectoryObject(h, DIRECTORY_QUERY, &attr); \
199 ok(status == STATUS_SUCCESS, "Failed to create Directory(%08x)\n", status);
200 #define DIR_TEST_OPEN_SUCCESS(h) \
201 status = pNtOpenDirectoryObject(h, DIRECTORY_QUERY, &attr); \
202 ok(status == STATUS_SUCCESS, "Failed to open Directory(%08x)\n", status);
203 #define DIR_TEST_CREATE_OPEN_SUCCESS(h,n) \
204 pRtlCreateUnicodeStringFromAsciiz(&str, n);\
205 DIR_TEST_CREATE_SUCCESS(&h) pNtClose(h); DIR_TEST_OPEN_SUCCESS(&h) pNtClose(h); \
206 pRtlFreeUnicodeString(&str);
208 static BOOL
is_correct_dir( HANDLE dir
, const char *name
)
212 OBJECT_ATTRIBUTES attr
;
215 pRtlCreateUnicodeStringFromAsciiz(&str
, name
);
216 InitializeObjectAttributes(&attr
, &str
, OBJ_OPENIF
, dir
, NULL
);
217 status
= pNtCreateMutant(&h
, GENERIC_ALL
, &attr
, FALSE
);
218 pRtlFreeUnicodeString(&str
);
219 if (h
) pNtClose( h
);
220 return (status
== STATUS_OBJECT_NAME_EXISTS
);
223 /* return a handle to the BaseNamedObjects dir where kernel32 objects get created */
224 static HANDLE
get_base_dir(void)
226 static const char objname
[] = "om.c_get_base_dir_obj";
229 OBJECT_ATTRIBUTES attr
;
233 h
= CreateMutexA(NULL
, FALSE
, objname
);
234 ok(h
!= 0, "CreateMutexA failed got ret=%p (%d)\n", h
, GetLastError());
235 InitializeObjectAttributes(&attr
, &str
, OBJ_OPENIF
, 0, NULL
);
237 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\BaseNamedObjects\\Local");
238 status
= pNtOpenDirectoryObject(&dir
, DIRECTORY_QUERY
, &attr
);
239 pRtlFreeUnicodeString(&str
);
240 if (!status
&& is_correct_dir( dir
, objname
)) goto done
;
241 if (!status
) pNtClose( dir
);
243 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\BaseNamedObjects");
244 status
= pNtOpenDirectoryObject(&dir
, DIRECTORY_QUERY
, &attr
);
245 pRtlFreeUnicodeString(&str
);
246 if (!status
&& is_correct_dir( dir
, objname
)) goto done
;
247 if (!status
) pNtClose( dir
);
249 for (i
= 0; i
< 20; i
++)
252 sprintf( name
, "\\BaseNamedObjects\\Session\\%u", i
);
253 pRtlCreateUnicodeStringFromAsciiz(&str
, name
);
254 status
= pNtOpenDirectoryObject(&dir
, DIRECTORY_QUERY
, &attr
);
255 pRtlFreeUnicodeString(&str
);
256 if (!status
&& is_correct_dir( dir
, objname
)) goto done
;
257 if (!status
) pNtClose( dir
);
266 static void test_name_collisions(void)
270 OBJECT_ATTRIBUTES attr
;
271 HANDLE dir
, h
, h1
, h2
;
275 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
276 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\");
277 DIR_TEST_CREATE_FAILURE(&h
, STATUS_OBJECT_NAME_COLLISION
)
278 InitializeObjectAttributes(&attr
, &str
, OBJ_OPENIF
, 0, NULL
);
280 DIR_TEST_CREATE_FAILURE(&h
, STATUS_OBJECT_NAME_EXISTS
)
282 status
= pNtCreateMutant(&h
, GENERIC_ALL
, &attr
, FALSE
);
283 ok(status
== STATUS_OBJECT_TYPE_MISMATCH
,
284 "NtCreateMutant should have failed with STATUS_OBJECT_TYPE_MISMATCH got(%08x)\n", status
);
285 pRtlFreeUnicodeString(&str
);
287 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\??\\PIPE\\om.c-mutant");
288 status
= pNtCreateMutant(&h
, GENERIC_ALL
, &attr
, FALSE
);
289 ok(status
== STATUS_OBJECT_TYPE_MISMATCH
|| status
== STATUS_OBJECT_PATH_NOT_FOUND
,
290 "NtCreateMutant should have failed with STATUS_OBJECT_TYPE_MISMATCH got(%08x)\n", status
);
291 pRtlFreeUnicodeString(&str
);
293 if (!(dir
= get_base_dir()))
295 win_skip( "couldn't find the BaseNamedObjects dir\n" );
298 pRtlCreateUnicodeStringFromAsciiz(&str
, "om.c-test");
299 InitializeObjectAttributes(&attr
, &str
, OBJ_OPENIF
, dir
, NULL
);
300 h
= CreateMutexA(NULL
, FALSE
, "om.c-test");
301 ok(h
!= 0, "CreateMutexA failed got ret=%p (%d)\n", h
, GetLastError());
302 status
= pNtCreateMutant(&h1
, GENERIC_ALL
, &attr
, FALSE
);
303 ok(status
== STATUS_OBJECT_NAME_EXISTS
&& h1
!= NULL
,
304 "NtCreateMutant should have succeeded with STATUS_OBJECT_NAME_EXISTS got(%08x)\n", status
);
305 h2
= CreateMutexA(NULL
, FALSE
, "om.c-test");
306 winerr
= GetLastError();
307 ok(h2
!= 0 && winerr
== ERROR_ALREADY_EXISTS
,
308 "CreateMutexA should have succeeded with ERROR_ALREADY_EXISTS got ret=%p (%d)\n", h2
, winerr
);
313 h
= CreateEventA(NULL
, FALSE
, FALSE
, "om.c-test");
314 ok(h
!= 0, "CreateEventA failed got ret=%p (%d)\n", h
, GetLastError());
315 status
= pNtCreateEvent(&h1
, GENERIC_ALL
, &attr
, FALSE
, FALSE
);
316 ok(status
== STATUS_OBJECT_NAME_EXISTS
&& h1
!= NULL
,
317 "NtCreateEvent should have succeeded with STATUS_OBJECT_NAME_EXISTS got(%08x)\n", status
);
318 h2
= CreateEventA(NULL
, FALSE
, FALSE
, "om.c-test");
319 winerr
= GetLastError();
320 ok(h2
!= 0 && winerr
== ERROR_ALREADY_EXISTS
,
321 "CreateEventA should have succeeded with ERROR_ALREADY_EXISTS got ret=%p (%d)\n", h2
, winerr
);
326 h
= CreateSemaphoreA(NULL
, 1, 2, "om.c-test");
327 ok(h
!= 0, "CreateSemaphoreA failed got ret=%p (%d)\n", h
, GetLastError());
328 status
= pNtCreateSemaphore(&h1
, GENERIC_ALL
, &attr
, 1, 2);
329 ok(status
== STATUS_OBJECT_NAME_EXISTS
&& h1
!= NULL
,
330 "NtCreateSemaphore should have succeeded with STATUS_OBJECT_NAME_EXISTS got(%08x)\n", status
);
331 h2
= CreateSemaphoreA(NULL
, 1, 2, "om.c-test");
332 winerr
= GetLastError();
333 ok(h2
!= 0 && winerr
== ERROR_ALREADY_EXISTS
,
334 "CreateSemaphoreA should have succeeded with ERROR_ALREADY_EXISTS got ret=%p (%d)\n", h2
, winerr
);
339 h
= pCreateWaitableTimerA(NULL
, TRUE
, "om.c-test");
340 ok(h
!= 0, "CreateWaitableTimerA failed got ret=%p (%d)\n", h
, GetLastError());
341 status
= pNtCreateTimer(&h1
, GENERIC_ALL
, &attr
, NotificationTimer
);
342 ok(status
== STATUS_OBJECT_NAME_EXISTS
&& h1
!= NULL
,
343 "NtCreateTimer should have succeeded with STATUS_OBJECT_NAME_EXISTS got(%08x)\n", status
);
344 h2
= pCreateWaitableTimerA(NULL
, TRUE
, "om.c-test");
345 winerr
= GetLastError();
346 ok(h2
!= 0 && winerr
== ERROR_ALREADY_EXISTS
,
347 "CreateWaitableTimerA should have succeeded with ERROR_ALREADY_EXISTS got ret=%p (%d)\n", h2
, winerr
);
352 h
= CreateFileMappingA(INVALID_HANDLE_VALUE
, NULL
, PAGE_READWRITE
, 0, 256, "om.c-test");
353 ok(h
!= 0, "CreateFileMappingA failed got ret=%p (%d)\n", h
, GetLastError());
354 size
.u
.LowPart
= 256;
356 status
= pNtCreateSection(&h1
, SECTION_MAP_WRITE
, &attr
, &size
, PAGE_READWRITE
, SEC_COMMIT
, 0);
357 ok(status
== STATUS_OBJECT_NAME_EXISTS
&& h1
!= NULL
,
358 "NtCreateSection should have succeeded with STATUS_OBJECT_NAME_EXISTS got(%08x)\n", status
);
359 h2
= CreateFileMappingA(INVALID_HANDLE_VALUE
, NULL
, PAGE_READWRITE
, 0, 256, "om.c-test");
360 winerr
= GetLastError();
361 ok(h2
!= 0 && winerr
== ERROR_ALREADY_EXISTS
,
362 "CreateFileMappingA should have succeeded with ERROR_ALREADY_EXISTS got ret=%p (%d)\n", h2
, winerr
);
367 pRtlFreeUnicodeString(&str
);
371 static void test_name_limits(void)
373 static const WCHAR pipeW
[] = {'\\','D','e','v','i','c','e','\\','N','a','m','e','d','P','i','p','e','\\'};
374 static const WCHAR mailslotW
[] = {'\\','D','e','v','i','c','e','\\','M','a','i','l','S','l','o','t','\\'};
375 static const WCHAR registryW
[] = {'\\','R','E','G','I','S','T','R','Y','\\','M','a','c','h','i','n','e','\\','S','O','F','T','W','A','R','E','\\','M','i','c','r','o','s','o','f','t','\\'};
376 OBJECT_ATTRIBUTES attr
, attr2
, attr3
;
377 IO_STATUS_BLOCK iosb
;
378 LARGE_INTEGER size
, timeout
;
379 UNICODE_STRING str
, target
;
384 InitializeObjectAttributes( &attr
, &str
, 0, 0, NULL
);
385 InitializeObjectAttributes( &attr2
, &str
, 0, (HANDLE
)0xdeadbeef, NULL
);
386 InitializeObjectAttributes( &attr3
, &str
, 0, 0, NULL
);
387 str
.Buffer
= HeapAlloc( GetProcessHeap(), 0, 65536 + sizeof(registryW
));
388 str
.MaximumLength
= 65534;
389 for (i
= 0; i
< 65536 / sizeof(WCHAR
); i
++) str
.Buffer
[i
] = 'a';
390 size
.QuadPart
= 4096;
391 pRtlCreateUnicodeStringFromAsciiz( &target
, "\\DosDevices" );
393 if (!(attr
.RootDirectory
= get_base_dir()))
395 win_skip( "couldn't find the BaseNamedObjects dir\n" );
400 status
= pNtCreateMutant( &ret
, GENERIC_ALL
, &attr2
, FALSE
);
402 ok( status
== STATUS_SUCCESS
, "%u: NtCreateMutant failed %x\n", str
.Length
, status
);
403 attr3
.RootDirectory
= ret
;
404 status
= pNtOpenMutant( &ret2
, GENERIC_ALL
, &attr
);
405 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "%u: NtOpenMutant failed %x\n", str
.Length
, status
);
406 status
= pNtOpenMutant( &ret2
, GENERIC_ALL
, &attr3
);
408 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
|| status
== STATUS_INVALID_HANDLE
,
409 "%u: NtOpenMutant failed %x\n", str
.Length
, status
);
411 status
= pNtCreateSemaphore( &ret
, GENERIC_ALL
, &attr2
, 1, 2 );
413 ok( status
== STATUS_SUCCESS
, "%u: NtCreateSemaphore failed %x\n", str
.Length
, status
);
414 attr3
.RootDirectory
= ret
;
415 status
= pNtOpenSemaphore( &ret2
, GENERIC_ALL
, &attr
);
416 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "%u: NtOpenSemaphore failed %x\n", str
.Length
, status
);
417 status
= pNtOpenSemaphore( &ret2
, GENERIC_ALL
, &attr3
);
419 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
|| status
== STATUS_INVALID_HANDLE
,
420 "%u: NtOpenSemaphore failed %x\n", str
.Length
, status
);
422 status
= pNtCreateEvent( &ret
, GENERIC_ALL
, &attr2
, 1, 0 );
424 ok( status
== STATUS_SUCCESS
, "%u: NtCreateEvent failed %x\n", str
.Length
, status
);
425 attr3
.RootDirectory
= ret
;
426 status
= pNtOpenEvent( &ret2
, GENERIC_ALL
, &attr
);
427 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "%u: NtOpenEvent failed %x\n", str
.Length
, status
);
428 status
= pNtOpenEvent( &ret2
, GENERIC_ALL
, &attr3
);
430 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
|| status
== STATUS_INVALID_HANDLE
,
431 "%u: NtOpenEvent failed %x\n", str
.Length
, status
);
433 status
= pNtCreateKeyedEvent( &ret
, GENERIC_ALL
, &attr2
, 0 );
435 ok( status
== STATUS_SUCCESS
, "%u: NtCreateKeyedEvent failed %x\n", str
.Length
, status
);
436 attr3
.RootDirectory
= ret
;
437 status
= pNtOpenKeyedEvent( &ret2
, GENERIC_ALL
, &attr
);
438 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "%u: NtOpenKeyedEvent failed %x\n", str
.Length
, status
);
439 status
= pNtOpenKeyedEvent( &ret2
, GENERIC_ALL
, &attr3
);
441 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
|| status
== STATUS_INVALID_HANDLE
,
442 "%u: NtOpenKeyedEvent failed %x\n", str
.Length
, status
);
444 status
= pNtCreateTimer( &ret
, GENERIC_ALL
, &attr2
, NotificationTimer
);
446 ok( status
== STATUS_SUCCESS
, "%u: NtCreateTimer failed %x\n", str
.Length
, status
);
447 attr3
.RootDirectory
= ret
;
448 status
= pNtOpenTimer( &ret2
, GENERIC_ALL
, &attr
);
449 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "%u: NtOpenTimer failed %x\n", str
.Length
, status
);
450 status
= pNtOpenTimer( &ret2
, GENERIC_ALL
, &attr3
);
452 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
|| status
== STATUS_INVALID_HANDLE
,
453 "%u: NtOpenTimer failed %x\n", str
.Length
, status
);
455 status
= pNtCreateIoCompletion( &ret
, GENERIC_ALL
, &attr2
, 0 );
457 ok( status
== STATUS_SUCCESS
, "%u: NtCreateCompletion failed %x\n", str
.Length
, status
);
458 attr3
.RootDirectory
= ret
;
459 status
= pNtOpenIoCompletion( &ret2
, GENERIC_ALL
, &attr
);
460 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "%u: NtOpenCompletion failed %x\n", str
.Length
, status
);
461 status
= pNtOpenIoCompletion( &ret2
, GENERIC_ALL
, &attr3
);
463 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
|| status
== STATUS_INVALID_HANDLE
,
464 "%u: NtOpenCompletion failed %x\n", str
.Length
, status
);
466 status
= pNtCreateJobObject( &ret
, GENERIC_ALL
, &attr2
);
468 ok( status
== STATUS_SUCCESS
, "%u: NtCreateJobObject failed %x\n", str
.Length
, status
);
469 attr3
.RootDirectory
= ret
;
470 status
= pNtOpenJobObject( &ret2
, GENERIC_ALL
, &attr
);
471 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "%u: NtOpenJobObject failed %x\n", str
.Length
, status
);
472 status
= pNtOpenJobObject( &ret2
, GENERIC_ALL
, &attr3
);
474 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
|| status
== STATUS_INVALID_HANDLE
,
475 "%u: NtOpenJobObject failed %x\n", str
.Length
, status
);
477 status
= pNtCreateDirectoryObject( &ret
, GENERIC_ALL
, &attr2
);
479 ok( status
== STATUS_SUCCESS
, "%u: NtCreateDirectoryObject failed %x\n", str
.Length
, status
);
480 attr3
.RootDirectory
= ret
;
481 status
= pNtOpenDirectoryObject( &ret2
, GENERIC_ALL
, &attr
);
482 ok( status
== STATUS_SUCCESS
|| broken(status
== STATUS_ACCESS_DENIED
), /* winxp */
483 "%u: NtOpenDirectoryObject failed %x\n", str
.Length
, status
);
484 if (!status
) pNtClose( ret2
);
485 status
= pNtOpenDirectoryObject( &ret2
, GENERIC_ALL
, &attr3
);
487 ok( status
== STATUS_SUCCESS
, "%u: NtOpenDirectoryObject failed %x\n", str
.Length
, status
);
490 status
= pNtCreateSymbolicLinkObject( &ret
, GENERIC_ALL
, &attr2
, &target
);
492 ok( status
== STATUS_SUCCESS
, "%u: NtCreateSymbolicLinkObject failed %x\n", str
.Length
, status
);
493 attr3
.RootDirectory
= ret
;
494 status
= pNtOpenSymbolicLinkObject( &ret2
, GENERIC_ALL
, &attr
);
495 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "%u: NtOpenSymbolicLinkObject failed %x\n", str
.Length
, status
);
496 status
= pNtOpenSymbolicLinkObject( &ret2
, GENERIC_ALL
, &attr3
);
498 ok( status
== STATUS_SUCCESS
, "%u: NtOpenSymbolicLinkObject failed %x\n", str
.Length
, status
);
501 status
= pNtCreateSection( &ret
, SECTION_MAP_WRITE
, &attr2
, &size
, PAGE_READWRITE
, SEC_COMMIT
, 0 );
503 ok( status
== STATUS_SUCCESS
, "%u: NtCreateSection failed %x\n", str
.Length
, status
);
504 attr3
.RootDirectory
= ret
;
505 status
= pNtOpenSection( &ret2
, SECTION_MAP_WRITE
, &attr
);
506 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "%u: NtOpenSection failed %x\n", str
.Length
, status
);
507 status
= pNtOpenSection( &ret2
, SECTION_MAP_WRITE
, &attr3
);
509 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
|| status
== STATUS_INVALID_HANDLE
,
510 "%u: NtOpenSection failed %x\n", str
.Length
, status
);
514 status
= pNtCreateMutant( &ret
, GENERIC_ALL
, &attr2
, FALSE
);
515 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateMutant failed %x\n", str
.Length
, status
);
516 status
= pNtOpenMutant( &ret
, GENERIC_ALL
, &attr2
);
518 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenMutant failed %x\n", str
.Length
, status
);
519 status
= pNtCreateSemaphore( &ret
, GENERIC_ALL
, &attr2
, 1, 2 );
520 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateSemaphore failed %x\n", str
.Length
, status
);
521 status
= pNtOpenSemaphore( &ret
, GENERIC_ALL
, &attr2
);
523 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenSemaphore failed %x\n", str
.Length
, status
);
524 status
= pNtCreateEvent( &ret
, GENERIC_ALL
, &attr2
, 1, 0 );
525 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateEvent failed %x\n", str
.Length
, status
);
526 status
= pNtOpenEvent( &ret
, GENERIC_ALL
, &attr2
);
528 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenEvent failed %x\n", str
.Length
, status
);
529 status
= pNtCreateKeyedEvent( &ret
, GENERIC_ALL
, &attr2
, 0 );
530 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateKeyedEvent failed %x\n", str
.Length
, status
);
531 status
= pNtOpenKeyedEvent( &ret
, GENERIC_ALL
, &attr2
);
533 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenKeyedEvent failed %x\n", str
.Length
, status
);
534 status
= pNtCreateTimer( &ret
, GENERIC_ALL
, &attr2
, NotificationTimer
);
535 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateTimer failed %x\n", str
.Length
, status
);
536 status
= pNtOpenTimer( &ret
, GENERIC_ALL
, &attr2
);
538 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenTimer failed %x\n", str
.Length
, status
);
539 status
= pNtCreateIoCompletion( &ret
, GENERIC_ALL
, &attr2
, 0 );
540 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateCompletion failed %x\n", str
.Length
, status
);
541 status
= pNtOpenIoCompletion( &ret
, GENERIC_ALL
, &attr2
);
543 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenCompletion failed %x\n", str
.Length
, status
);
544 status
= pNtCreateJobObject( &ret
, GENERIC_ALL
, &attr2
);
545 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateJobObject failed %x\n", str
.Length
, status
);
546 status
= pNtOpenJobObject( &ret
, GENERIC_ALL
, &attr2
);
548 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenJobObject failed %x\n", str
.Length
, status
);
549 status
= pNtCreateDirectoryObject( &ret
, GENERIC_ALL
, &attr2
);
550 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateDirectoryObject failed %x\n", str
.Length
, status
);
551 status
= pNtOpenDirectoryObject( &ret
, GENERIC_ALL
, &attr2
);
553 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenDirectoryObject failed %x\n", str
.Length
, status
);
554 status
= pNtCreateSymbolicLinkObject( &ret
, GENERIC_ALL
, &attr2
, &target
);
555 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateSymbolicLinkObject failed %x\n", str
.Length
, status
);
556 status
= pNtOpenSymbolicLinkObject( &ret
, GENERIC_ALL
, &attr2
);
558 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenSymbolicLinkObject failed %x\n", str
.Length
, status
);
559 status
= pNtCreateSection( &ret
, SECTION_MAP_WRITE
, &attr2
, &size
, PAGE_READWRITE
, SEC_COMMIT
, 0 );
560 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateSection failed %x\n", str
.Length
, status
);
561 status
= pNtOpenSection( &ret
, SECTION_MAP_WRITE
, &attr2
);
563 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenSection failed %x\n", str
.Length
, status
);
566 status
= pNtCreateMutant( &ret
, GENERIC_ALL
, &attr
, FALSE
);
567 ok( status
== STATUS_SUCCESS
, "%u: NtCreateMutant failed %x\n", str
.Length
, status
);
568 status
= pNtOpenMutant( &ret2
, GENERIC_ALL
, &attr
);
569 ok( status
== STATUS_SUCCESS
, "%u: NtOpenMutant failed %x\n", str
.Length
, status
);
572 status
= pNtCreateSemaphore( &ret
, GENERIC_ALL
, &attr
, 1, 2 );
573 ok( status
== STATUS_SUCCESS
, "%u: NtCreateSemaphore failed %x\n", str
.Length
, status
);
574 status
= pNtOpenSemaphore( &ret2
, GENERIC_ALL
, &attr
);
575 ok( status
== STATUS_SUCCESS
, "%u: NtOpenSemaphore failed %x\n", str
.Length
, status
);
578 status
= pNtCreateEvent( &ret
, GENERIC_ALL
, &attr
, 1, 0 );
579 ok( status
== STATUS_SUCCESS
, "%u: NtCreateEvent failed %x\n", str
.Length
, status
);
580 status
= pNtOpenEvent( &ret2
, GENERIC_ALL
, &attr
);
581 ok( status
== STATUS_SUCCESS
, "%u: NtOpenEvent failed %x\n", str
.Length
, status
);
584 status
= pNtCreateKeyedEvent( &ret
, GENERIC_ALL
, &attr
, 0 );
585 ok( status
== STATUS_SUCCESS
, "%u: NtCreateKeyedEvent failed %x\n", str
.Length
, status
);
586 status
= pNtOpenKeyedEvent( &ret2
, GENERIC_ALL
, &attr
);
587 ok( status
== STATUS_SUCCESS
, "%u: NtOpenKeyedEvent failed %x\n", str
.Length
, status
);
590 status
= pNtCreateTimer( &ret
, GENERIC_ALL
, &attr
, NotificationTimer
);
591 ok( status
== STATUS_SUCCESS
, "%u: NtCreateTimer failed %x\n", str
.Length
, status
);
592 status
= pNtOpenTimer( &ret2
, GENERIC_ALL
, &attr
);
593 ok( status
== STATUS_SUCCESS
, "%u: NtOpenTimer failed %x\n", str
.Length
, status
);
596 status
= pNtCreateIoCompletion( &ret
, GENERIC_ALL
, &attr
, 0 );
597 ok( status
== STATUS_SUCCESS
, "%u: NtCreateCompletion failed %x\n", str
.Length
, status
);
598 status
= pNtOpenIoCompletion( &ret2
, GENERIC_ALL
, &attr
);
599 ok( status
== STATUS_SUCCESS
, "%u: NtOpenCompletion failed %x\n", str
.Length
, status
);
602 status
= pNtCreateJobObject( &ret
, GENERIC_ALL
, &attr
);
603 ok( status
== STATUS_SUCCESS
, "%u: NtCreateJobObject failed %x\n", str
.Length
, status
);
604 status
= pNtOpenJobObject( &ret2
, GENERIC_ALL
, &attr
);
605 ok( status
== STATUS_SUCCESS
, "%u: NtOpenJobObject failed %x\n", str
.Length
, status
);
608 status
= pNtCreateDirectoryObject( &ret
, GENERIC_ALL
, &attr
);
609 ok( status
== STATUS_SUCCESS
, "%u: NtCreateDirectoryObject failed %x\n", str
.Length
, status
);
610 status
= pNtOpenDirectoryObject( &ret2
, GENERIC_ALL
, &attr
);
611 ok( status
== STATUS_SUCCESS
, "%u: NtOpenDirectoryObject failed %x\n", str
.Length
, status
);
614 status
= pNtCreateSymbolicLinkObject( &ret
, GENERIC_ALL
, &attr
, &target
);
615 ok( status
== STATUS_SUCCESS
, "%u: NtCreateSymbolicLinkObject failed %x\n", str
.Length
, status
);
616 status
= pNtOpenSymbolicLinkObject( &ret2
, GENERIC_ALL
, &attr
);
617 ok( status
== STATUS_SUCCESS
, "%u: NtOpenSymbolicLinkObject failed %x\n", str
.Length
, status
);
620 status
= pNtCreateSection( &ret
, SECTION_MAP_WRITE
, &attr
, &size
, PAGE_READWRITE
, SEC_COMMIT
, 0 );
621 ok( status
== STATUS_SUCCESS
, "%u: NtCreateSection failed %x\n", str
.Length
, status
);
622 status
= pNtOpenSection( &ret2
, SECTION_MAP_WRITE
, &attr
);
624 ok( status
== STATUS_SUCCESS
, "%u: NtOpenSection failed %x\n", str
.Length
, status
);
629 status
= pNtCreateMutant( &ret
, GENERIC_ALL
, &attr
, FALSE
);
630 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateMutant failed %x\n", str
.Length
, status
);
631 status
= pNtOpenMutant( &ret
, GENERIC_ALL
, &attr
);
633 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenMutant failed %x\n", str
.Length
, status
);
634 status
= pNtCreateSemaphore( &ret
, GENERIC_ALL
, &attr
, 1, 2 );
635 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateSemaphore failed %x\n", str
.Length
, status
);
636 status
= pNtOpenSemaphore( &ret
, GENERIC_ALL
, &attr
);
638 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenSemaphore failed %x\n", str
.Length
, status
);
639 status
= pNtCreateEvent( &ret
, GENERIC_ALL
, &attr
, 1, 0 );
640 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateEvent failed %x\n", str
.Length
, status
);
641 status
= pNtOpenEvent( &ret
, GENERIC_ALL
, &attr
);
643 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenEvent failed %x\n", str
.Length
, status
);
644 status
= pNtCreateKeyedEvent( &ret
, GENERIC_ALL
, &attr
, 0 );
645 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateKeyedEvent failed %x\n", str
.Length
, status
);
646 status
= pNtOpenKeyedEvent( &ret
, GENERIC_ALL
, &attr
);
648 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenKeyedEvent failed %x\n", str
.Length
, status
);
649 status
= pNtCreateTimer( &ret
, GENERIC_ALL
, &attr
, NotificationTimer
);
650 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateTimer failed %x\n", str
.Length
, status
);
651 status
= pNtOpenTimer( &ret
, GENERIC_ALL
, &attr
);
653 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenTimer failed %x\n", str
.Length
, status
);
654 status
= pNtCreateIoCompletion( &ret
, GENERIC_ALL
, &attr
, 0 );
655 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateCompletion failed %x\n", str
.Length
, status
);
656 status
= pNtOpenIoCompletion( &ret
, GENERIC_ALL
, &attr
);
658 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenCompletion failed %x\n", str
.Length
, status
);
659 status
= pNtCreateJobObject( &ret
, GENERIC_ALL
, &attr
);
660 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateJobObject failed %x\n", str
.Length
, status
);
661 status
= pNtOpenJobObject( &ret
, GENERIC_ALL
, &attr
);
663 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenJobObject failed %x\n", str
.Length
, status
);
664 status
= pNtCreateDirectoryObject( &ret
, GENERIC_ALL
, &attr
);
665 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateDirectoryObject failed %x\n", str
.Length
, status
);
666 status
= pNtOpenDirectoryObject( &ret
, GENERIC_ALL
, &attr
);
668 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenDirectoryObject failed %x\n", str
.Length
, status
);
669 status
= pNtCreateSymbolicLinkObject( &ret
, GENERIC_ALL
, &attr
, &target
);
670 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateSymbolicLinkObject failed %x\n", str
.Length
, status
);
671 status
= pNtOpenSymbolicLinkObject( &ret
, GENERIC_ALL
, &attr
);
673 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenSymbolicLinkObject failed %x\n", str
.Length
, status
);
674 status
= pNtCreateSection( &ret
, SECTION_MAP_WRITE
, &attr
, &size
, PAGE_READWRITE
, SEC_COMMIT
, 0 );
675 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateSection failed %x\n", str
.Length
, status
);
676 status
= pNtOpenSection( &ret
, SECTION_MAP_WRITE
, &attr
);
678 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtOpenSection failed %x\n", str
.Length
, status
);
680 /* null ObjectName, with or without RootDirectory */
681 attr3
.RootDirectory
= 0;
682 attr2
.ObjectName
= attr3
.ObjectName
= NULL
;
683 status
= pNtCreateMutant( &ret
, GENERIC_ALL
, &attr2
, FALSE
);
684 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateMutant failed %x\n", status
);
685 status
= pNtCreateMutant( &ret
, GENERIC_ALL
, &attr3
, FALSE
);
686 ok( status
== STATUS_SUCCESS
, "NULL: NtCreateMutant failed %x\n", status
);
688 status
= pNtOpenMutant( &ret
, GENERIC_ALL
, &attr2
);
690 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtOpenMutant failed %x\n", status
);
691 status
= pNtOpenMutant( &ret
, GENERIC_ALL
, &attr3
);
692 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtOpenMutant failed %x\n", status
);
693 status
= pNtCreateSemaphore( &ret
, GENERIC_ALL
, &attr2
, 1, 2 );
694 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateSemaphore failed %x\n", status
);
695 status
= pNtCreateSemaphore( &ret
, GENERIC_ALL
, &attr3
, 1, 2 );
696 ok( status
== STATUS_SUCCESS
, "NULL: NtCreateSemaphore failed %x\n", status
);
698 status
= pNtOpenSemaphore( &ret
, GENERIC_ALL
, &attr2
);
700 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtOpenSemaphore failed %x\n", status
);
701 status
= pNtOpenSemaphore( &ret
, GENERIC_ALL
, &attr3
);
702 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtOpenSemaphore failed %x\n", status
);
703 status
= pNtCreateEvent( &ret
, GENERIC_ALL
, &attr2
, 1, 0 );
704 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateEvent failed %x\n", status
);
705 status
= pNtCreateEvent( &ret
, GENERIC_ALL
, &attr3
, 1, 0 );
706 ok( status
== STATUS_SUCCESS
, "NULL: NtCreateEvent failed %x\n", status
);
708 status
= pNtOpenEvent( &ret
, GENERIC_ALL
, &attr2
);
710 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtOpenEvent failed %x\n", status
);
711 status
= pNtOpenEvent( &ret
, GENERIC_ALL
, &attr3
);
712 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtOpenEvent failed %x\n", status
);
713 status
= pNtCreateKeyedEvent( &ret
, GENERIC_ALL
, &attr2
, 0 );
714 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateKeyedEvent failed %x\n", status
);
715 status
= pNtCreateKeyedEvent( &ret
, GENERIC_ALL
, &attr3
, 0 );
716 ok( status
== STATUS_SUCCESS
, "NULL: NtCreateKeyedEvent failed %x\n", status
);
718 status
= pNtOpenKeyedEvent( &ret
, GENERIC_ALL
, &attr2
);
720 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtOpenKeyedEvent failed %x\n", status
);
721 status
= pNtOpenKeyedEvent( &ret
, GENERIC_ALL
, &attr3
);
722 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtOpenKeyedEvent failed %x\n", status
);
723 status
= pNtCreateTimer( &ret
, GENERIC_ALL
, &attr2
, NotificationTimer
);
724 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateTimer failed %x\n", status
);
725 status
= pNtCreateTimer( &ret
, GENERIC_ALL
, &attr3
, NotificationTimer
);
726 ok( status
== STATUS_SUCCESS
, "NULL: NtCreateTimer failed %x\n", status
);
728 status
= pNtOpenTimer( &ret
, GENERIC_ALL
, &attr2
);
730 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtOpenTimer failed %x\n", status
);
731 status
= pNtOpenTimer( &ret
, GENERIC_ALL
, &attr3
);
732 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtOpenTimer failed %x\n", status
);
733 status
= pNtCreateIoCompletion( &ret
, GENERIC_ALL
, &attr2
, 0 );
734 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateCompletion failed %x\n", status
);
735 status
= pNtCreateIoCompletion( &ret
, GENERIC_ALL
, &attr3
, 0 );
736 ok( status
== STATUS_SUCCESS
, "NULL: NtCreateCompletion failed %x\n", status
);
738 status
= pNtOpenIoCompletion( &ret
, GENERIC_ALL
, &attr2
);
740 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtOpenCompletion failed %x\n", status
);
741 status
= pNtOpenIoCompletion( &ret
, GENERIC_ALL
, &attr3
);
743 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtOpenCompletion failed %x\n", status
);
744 status
= pNtCreateJobObject( &ret
, GENERIC_ALL
, &attr2
);
745 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateJobObject failed %x\n", status
);
746 status
= pNtCreateJobObject( &ret
, GENERIC_ALL
, &attr3
);
747 ok( status
== STATUS_SUCCESS
, "NULL: NtCreateJobObject failed %x\n", status
);
749 status
= pNtOpenJobObject( &ret
, GENERIC_ALL
, &attr2
);
751 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtOpenJobObject failed %x\n", status
);
752 status
= pNtOpenJobObject( &ret
, GENERIC_ALL
, &attr3
);
753 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtOpenJobObject failed %x\n", status
);
754 status
= pNtCreateDirectoryObject( &ret
, GENERIC_ALL
, &attr2
);
755 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateDirectoryObject failed %x\n", status
);
756 status
= pNtCreateDirectoryObject( &ret
, GENERIC_ALL
, &attr3
);
757 ok( status
== STATUS_SUCCESS
, "NULL: NtCreateDirectoryObject failed %x\n", status
);
759 status
= pNtOpenDirectoryObject( &ret
, GENERIC_ALL
, &attr2
);
760 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtOpenDirectoryObject failed %x\n", status
);
761 status
= pNtOpenDirectoryObject( &ret
, GENERIC_ALL
, &attr3
);
762 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtOpenDirectoryObject failed %x\n", status
);
763 status
= pNtCreateSymbolicLinkObject( &ret
, GENERIC_ALL
, &attr2
, &target
);
764 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateSymbolicLinkObject failed %x\n", status
);
765 status
= pNtCreateSymbolicLinkObject( &ret
, GENERIC_ALL
, &attr3
, &target
);
766 ok( status
== STATUS_SUCCESS
, "NULL: NtCreateSymbolicLinkObject failed %x\n", status
);
768 status
= pNtOpenSymbolicLinkObject( &ret
, GENERIC_ALL
, &attr2
);
769 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtOpenSymbolicLinkObject failed %x\n", status
);
770 status
= pNtOpenSymbolicLinkObject( &ret
, GENERIC_ALL
, &attr3
);
771 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtOpenSymbolicLinkObject failed %x\n", status
);
772 status
= pNtCreateSection( &ret
, SECTION_MAP_WRITE
, &attr2
, &size
, PAGE_READWRITE
, SEC_COMMIT
, 0 );
773 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateSection failed %x\n", status
);
774 status
= pNtCreateSection( &ret
, SECTION_MAP_WRITE
, &attr3
, &size
, PAGE_READWRITE
, SEC_COMMIT
, 0 );
775 ok( status
== STATUS_SUCCESS
, "NULL: NtCreateSection failed %x\n", status
);
777 status
= pNtOpenSection( &ret
, SECTION_MAP_WRITE
, &attr2
);
779 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtOpenSection failed %x\n", status
);
780 status
= pNtOpenSection( &ret
, SECTION_MAP_WRITE
, &attr3
);
781 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtOpenSection failed %x\n", status
);
782 attr2
.ObjectName
= attr3
.ObjectName
= &str
;
785 memcpy( str
.Buffer
, pipeW
, sizeof(pipeW
) );
786 for (i
= 0; i
< 65536 / sizeof(WCHAR
); i
++) str
.Buffer
[i
+ sizeof(pipeW
)/sizeof(WCHAR
)] = 'a';
788 attr
.RootDirectory
= 0;
789 attr
.Attributes
= OBJ_CASE_INSENSITIVE
;
790 timeout
.QuadPart
= -10000;
791 status
= pNtCreateNamedPipeFile( &ret
, GENERIC_ALL
, &attr
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
,
792 FILE_CREATE
, FILE_PIPE_FULL_DUPLEX
, 0, 0, 0, 1, 256, 256, &timeout
);
794 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "%u: NtCreateNamedPipeFile failed %x\n", str
.Length
, status
);
795 status
= pNtCreateNamedPipeFile( &ret
, GENERIC_ALL
, &attr2
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
,
796 FILE_CREATE
, FILE_PIPE_FULL_DUPLEX
, 0, 0, 0, 1, 256, 256, &timeout
);
797 ok( status
== STATUS_INVALID_HANDLE
, "%u: NtCreateNamedPipeFile failed %x\n", str
.Length
, status
);
799 status
= pNtCreateNamedPipeFile( &ret
, GENERIC_ALL
, &attr2
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
,
800 FILE_CREATE
, FILE_PIPE_FULL_DUPLEX
, 0, 0, 0, 1, 256, 256, &timeout
);
801 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateNamedPipeFile failed %x\n", str
.Length
, status
);
803 status
= pNtCreateNamedPipeFile( &ret
, GENERIC_ALL
, &attr
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
,
804 FILE_CREATE
, FILE_PIPE_FULL_DUPLEX
, 0, 0, 0, 1, 256, 256, &timeout
);
805 ok( status
== STATUS_SUCCESS
, "%u: NtCreateNamedPipeFile failed %x\n", str
.Length
, status
);
808 status
= pNtCreateNamedPipeFile( &ret
, GENERIC_ALL
, &attr
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
,
809 FILE_CREATE
, FILE_PIPE_FULL_DUPLEX
, 0, 0, 0, 1, 256, 256, &timeout
);
810 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateNamedPipeFile failed %x\n", str
.Length
, status
);
811 attr3
.RootDirectory
= 0;
812 attr2
.ObjectName
= attr3
.ObjectName
= NULL
;
813 status
= pNtCreateNamedPipeFile( &ret
, GENERIC_ALL
, &attr2
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
,
814 FILE_CREATE
, FILE_PIPE_FULL_DUPLEX
, 0, 0, 0, 1, 256, 256, &timeout
);
815 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateNamedPipeFile failed %x\n", status
);
816 status
= pNtCreateNamedPipeFile( &ret
, GENERIC_ALL
, &attr3
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
,
817 FILE_CREATE
, FILE_PIPE_FULL_DUPLEX
, 0, 0, 0, 1, 256, 256, &timeout
);
819 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtCreateNamedPipeFile failed %x\n", status
);
820 attr2
.ObjectName
= attr3
.ObjectName
= &str
;
823 memcpy( str
.Buffer
, mailslotW
, sizeof(mailslotW
) );
824 for (i
= 0; i
< 65536 / sizeof(WCHAR
); i
++) str
.Buffer
[i
+ sizeof(mailslotW
)/sizeof(WCHAR
)] = 'a';
826 status
= pNtCreateMailslotFile( &ret
, GENERIC_ALL
, &attr
, &iosb
, 0, 0, 0, NULL
);
828 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "%u: NtCreateMailslotFile failed %x\n", str
.Length
, status
);
829 status
= pNtCreateMailslotFile( &ret
, GENERIC_ALL
, &attr2
, &iosb
, 0, 0, 0, NULL
);
830 ok( status
== STATUS_INVALID_HANDLE
, "%u: NtCreateMailslotFile failed %x\n", str
.Length
, status
);
832 status
= pNtCreateMailslotFile( &ret
, GENERIC_ALL
, &attr2
, &iosb
, 0, 0, 0, NULL
);
833 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateMailslotFile failed %x\n", str
.Length
, status
);
835 status
= pNtCreateMailslotFile( &ret
, GENERIC_ALL
, &attr
, &iosb
, 0, 0, 0, NULL
);
836 ok( status
== STATUS_SUCCESS
, "%u: NtCreateMailslotFile failed %x\n", str
.Length
, status
);
839 status
= pNtCreateMailslotFile( &ret
, GENERIC_ALL
, &attr
, &iosb
, 0, 0, 0, NULL
);
840 ok( status
== STATUS_OBJECT_NAME_INVALID
, "%u: NtCreateMailslotFile failed %x\n", str
.Length
, status
);
841 attr3
.RootDirectory
= 0;
842 attr2
.ObjectName
= attr3
.ObjectName
= NULL
;
843 status
= pNtCreateMailslotFile( &ret
, GENERIC_ALL
, &attr2
, &iosb
, 0, 0, 0, NULL
);
845 ok( status
== STATUS_OBJECT_NAME_INVALID
, "NULL: NtCreateMailslotFile failed %x\n", status
);
846 status
= pNtCreateMailslotFile( &ret
, GENERIC_ALL
, &attr3
, &iosb
, 0, 0, 0, NULL
);
847 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "NULL: NtCreateMailslotFile failed %x\n", status
);
848 attr2
.ObjectName
= attr3
.ObjectName
= &str
;
851 memcpy( str
.Buffer
, registryW
, sizeof(registryW
) );
852 for (i
= 0; i
< 65536 / sizeof(WCHAR
); i
++) str
.Buffer
[i
+ sizeof(registryW
)/sizeof(WCHAR
)] = 'a';
854 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr
, 0, NULL
, 0, NULL
);
856 ok( status
== STATUS_OBJECT_PATH_SYNTAX_BAD
, "%u: NtCreateKey failed %x\n", str
.Length
, status
);
857 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr2
, 0, NULL
, 0, NULL
);
858 ok( status
== STATUS_INVALID_HANDLE
, "%u: NtCreateKey failed %x\n", str
.Length
, status
);
859 status
= pNtOpenKey( &ret
, GENERIC_ALL
, &attr2
);
860 ok( status
== STATUS_INVALID_HANDLE
, "%u: NtOpenKey failed %x\n", str
.Length
, status
);
861 str
.Length
= sizeof(registryW
) + 250 * sizeof(WCHAR
) + 1;
862 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr
, 0, NULL
, 0, NULL
);
863 ok( status
== STATUS_OBJECT_NAME_INVALID
||
864 status
== STATUS_INVALID_PARAMETER
||
865 broken( status
== STATUS_SUCCESS
), /* wow64 */
866 "%u: NtCreateKey failed %x\n", str
.Length
, status
);
872 str
.Length
= sizeof(registryW
) + 256 * sizeof(WCHAR
);
873 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr
, 0, NULL
, 0, NULL
);
874 ok( status
== STATUS_SUCCESS
|| status
== STATUS_ACCESS_DENIED
,
875 "%u: NtCreateKey failed %x\n", str
.Length
, status
);
878 status
= pNtOpenKey( &ret2
, KEY_READ
, &attr
);
879 ok( status
== STATUS_SUCCESS
, "%u: NtOpenKey failed %x\n", str
.Length
, status
);
881 attr3
.RootDirectory
= ret
;
883 status
= pNtOpenKey( &ret2
, KEY_READ
, &attr3
);
884 ok( status
== STATUS_SUCCESS
, "%u: NtOpenKey failed %x\n", str
.Length
, status
);
889 str
.Length
= sizeof(registryW
) + 256 * sizeof(WCHAR
) + 1;
890 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr
, 0, NULL
, 0, NULL
);
891 ok( status
== STATUS_OBJECT_NAME_INVALID
||
892 status
== STATUS_INVALID_PARAMETER
||
893 broken( status
== STATUS_SUCCESS
), /* win7 */
894 "%u: NtCreateKey failed %x\n", str
.Length
, status
);
900 status
= pNtOpenKey( &ret
, GENERIC_ALL
, &attr
);
902 ok( status
== STATUS_OBJECT_NAME_INVALID
||
903 status
== STATUS_INVALID_PARAMETER
||
904 broken( status
== STATUS_OBJECT_NAME_NOT_FOUND
), /* wow64 */
905 "%u: NtOpenKey failed %x\n", str
.Length
, status
);
907 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr
, 0, NULL
, 0, NULL
);
908 ok( status
== STATUS_INVALID_PARAMETER
, "%u: NtCreateKey failed %x\n", str
.Length
, status
);
909 status
= pNtOpenKey( &ret
, GENERIC_ALL
, &attr
);
911 ok( status
== STATUS_INVALID_PARAMETER
, "%u: NtOpenKey failed %x\n", str
.Length
, status
);
913 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr
, 0, NULL
, 0, NULL
);
914 ok( status
== STATUS_INVALID_PARAMETER
, "%u: NtCreateKey failed %x\n", str
.Length
, status
);
915 status
= pNtOpenKey( &ret
, GENERIC_ALL
, &attr
);
917 ok( status
== STATUS_INVALID_PARAMETER
, "%u: NtOpenKey failed %x\n", str
.Length
, status
);
918 /* some Windows versions change the error past 2050 chars, others past 4066 chars, some don't */
920 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr
, 0, NULL
, 0, NULL
);
921 ok( status
== STATUS_BUFFER_OVERFLOW
||
922 status
== STATUS_BUFFER_TOO_SMALL
||
923 status
== STATUS_INVALID_PARAMETER
,
924 "%u: NtCreateKey failed %x\n", str
.Length
, status
);
925 status
= pNtOpenKey( &ret
, GENERIC_ALL
, &attr
);
927 ok( status
== STATUS_BUFFER_OVERFLOW
||
928 status
== STATUS_BUFFER_TOO_SMALL
||
929 status
== STATUS_INVALID_PARAMETER
,
930 "%u: NtOpenKey failed %x\n", str
.Length
, status
);
932 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr
, 0, NULL
, 0, NULL
);
933 ok( status
== STATUS_OBJECT_NAME_INVALID
||
934 status
== STATUS_BUFFER_OVERFLOW
||
935 status
== STATUS_BUFFER_TOO_SMALL
,
936 "%u: NtCreateKey failed %x\n", str
.Length
, status
);
937 status
= pNtOpenKey( &ret
, GENERIC_ALL
, &attr
);
939 ok( status
== STATUS_OBJECT_NAME_INVALID
||
940 status
== STATUS_BUFFER_OVERFLOW
||
941 status
== STATUS_BUFFER_TOO_SMALL
,
942 "%u: NtOpenKey failed %x\n", str
.Length
, status
);
943 attr3
.RootDirectory
= 0;
944 attr2
.ObjectName
= attr3
.ObjectName
= NULL
;
945 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr2
, 0, NULL
, 0, NULL
);
947 ok( status
== STATUS_ACCESS_VIOLATION
|| status
== STATUS_INVALID_HANDLE
,
948 "NULL: NtCreateKey failed %x\n", status
);
949 status
= pNtCreateKey( &ret
, GENERIC_ALL
, &attr3
, 0, NULL
, 0, NULL
);
951 ok( status
== STATUS_ACCESS_VIOLATION
, "NULL: NtCreateKey failed %x\n", status
);
952 status
= pNtOpenKey( &ret
, GENERIC_ALL
, &attr2
);
953 ok( status
== STATUS_ACCESS_VIOLATION
|| status
== STATUS_INVALID_HANDLE
,
954 "NULL: NtOpenKey failed %x\n", status
);
955 status
= pNtOpenKey( &ret
, GENERIC_ALL
, &attr3
);
956 ok( status
== STATUS_ACCESS_VIOLATION
, "NULL: NtOpenKey failed %x\n", status
);
957 attr2
.ObjectName
= attr3
.ObjectName
= &str
;
959 pRtlFreeUnicodeString( &str
);
960 pRtlFreeUnicodeString( &target
);
963 static void test_directory(void)
967 OBJECT_ATTRIBUTES attr
;
971 /* No name and/or no attributes */
972 status
= pNtCreateDirectoryObject(NULL
, DIRECTORY_QUERY
, &attr
);
973 ok(status
== STATUS_ACCESS_VIOLATION
|| status
== STATUS_INVALID_PARAMETER
,
974 "NtCreateDirectoryObject should have failed with STATUS_ACCESS_VIOLATION got(%08x)\n", status
);
975 status
= pNtOpenDirectoryObject(NULL
, DIRECTORY_QUERY
, &attr
);
976 ok(status
== STATUS_ACCESS_VIOLATION
|| status
== STATUS_INVALID_PARAMETER
,
977 "NtOpenDirectoryObject should have failed with STATUS_ACCESS_VIOLATION got(%08x)\n", status
);
979 status
= pNtCreateDirectoryObject(&h
, DIRECTORY_QUERY
, NULL
);
980 ok(status
== STATUS_SUCCESS
, "Failed to create Directory without attributes(%08x)\n", status
);
982 status
= pNtOpenDirectoryObject(&h
, DIRECTORY_QUERY
, NULL
);
983 ok(status
== STATUS_INVALID_PARAMETER
,
984 "NtOpenDirectoryObject should have failed with STATUS_INVALID_PARAMETER got(%08x)\n", status
);
986 InitializeObjectAttributes(&attr
, NULL
, 0, 0, NULL
);
987 DIR_TEST_CREATE_SUCCESS(&dir
)
988 DIR_TEST_OPEN_FAILURE(&h
, STATUS_OBJECT_PATH_SYNTAX_BAD
)
991 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
993 pRtlCreateUnicodeStringFromAsciiz(&str
, "");
994 DIR_TEST_CREATE_SUCCESS(&h
)
996 DIR_TEST_OPEN_FAILURE(&h
, STATUS_OBJECT_PATH_SYNTAX_BAD
)
997 pRtlFreeUnicodeString(&str
);
1000 DIR_TEST_CREATE_OPEN_FAILURE(&h
, "BaseNamedObjects", STATUS_OBJECT_PATH_SYNTAX_BAD
)
1001 DIR_TEST_CREATE_OPEN_FAILURE(&h
, "\\BaseNamedObjects\\", STATUS_OBJECT_NAME_INVALID
)
1002 DIR_TEST_CREATE_OPEN_FAILURE(&h
, "\\\\BaseNamedObjects", STATUS_OBJECT_NAME_INVALID
)
1003 DIR_TEST_CREATE_OPEN_FAILURE(&h
, "\\BaseNamedObjects\\\\om.c-test", STATUS_OBJECT_NAME_INVALID
)
1004 DIR_TEST_CREATE_OPEN_FAILURE(&h
, "\\BaseNamedObjects\\om.c-test\\", STATUS_OBJECT_PATH_NOT_FOUND
)
1006 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\BaseNamedObjects\\om.c-test");
1007 DIR_TEST_CREATE_SUCCESS(&h
)
1008 DIR_TEST_OPEN_SUCCESS(&dir1
)
1009 pRtlFreeUnicodeString(&str
);
1014 /* Use of root directory */
1016 /* Can't use symlinks as a directory */
1017 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\BaseNamedObjects\\Local");
1018 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
1019 status
= pNtOpenSymbolicLinkObject(&dir
, SYMBOLIC_LINK_QUERY
, &attr
);
1020 is_nt4
= (status
== STATUS_OBJECT_NAME_NOT_FOUND
); /* nt4 doesn't have Local\\ symlink */
1024 ULONG len
, full_len
;
1026 ok(status
== STATUS_SUCCESS
, "Failed to open SymbolicLink(%08x)\n", status
);
1027 pRtlFreeUnicodeString(&str
);
1028 InitializeObjectAttributes(&attr
, &str
, 0, dir
, NULL
);
1029 pRtlCreateUnicodeStringFromAsciiz(&str
, "one more level");
1030 DIR_TEST_CREATE_FAILURE(&h
, STATUS_OBJECT_TYPE_MISMATCH
)
1031 pRtlFreeUnicodeString(&str
);
1033 str
.Buffer
= buffer
;
1034 str
.MaximumLength
= sizeof(buffer
);
1036 memset( buffer
, 0xaa, sizeof(buffer
) );
1037 status
= pNtQuerySymbolicLinkObject( dir
, &str
, &len
);
1038 ok( status
== STATUS_SUCCESS
, "NtQuerySymbolicLinkObject failed %08x\n", status
);
1039 if (status
!= STATUS_SUCCESS
)
1041 full_len
= str
.Length
+ sizeof(WCHAR
);
1042 ok( len
== full_len
, "bad length %u/%u\n", len
, full_len
);
1043 if (len
== full_len
)
1044 ok( buffer
[len
/ sizeof(WCHAR
) - 1] == 0, "no terminating null\n" );
1046 str
.MaximumLength
= str
.Length
;
1048 status
= pNtQuerySymbolicLinkObject( dir
, &str
, &len
);
1049 ok( status
== STATUS_BUFFER_TOO_SMALL
, "NtQuerySymbolicLinkObject failed %08x\n", status
);
1050 ok( len
== full_len
, "bad length %u/%u\n", len
, full_len
);
1052 str
.MaximumLength
= 0;
1054 status
= pNtQuerySymbolicLinkObject( dir
, &str
, &len
);
1055 ok( status
== STATUS_BUFFER_TOO_SMALL
, "NtQuerySymbolicLinkObject failed %08x\n", status
);
1056 ok( len
== full_len
, "bad length %u/%u\n", len
, full_len
);
1058 str
.MaximumLength
= str
.Length
+ sizeof(WCHAR
);
1060 status
= pNtQuerySymbolicLinkObject( dir
, &str
, &len
);
1061 ok( status
== STATUS_SUCCESS
, "NtQuerySymbolicLinkObject failed %08x\n", status
);
1062 ok( len
== full_len
, "bad length %u/%u\n", len
, full_len
);
1068 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\BaseNamedObjects");
1069 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
1070 DIR_TEST_OPEN_SUCCESS(&dir
)
1071 pRtlFreeUnicodeString(&str
);
1073 InitializeObjectAttributes(&attr
, NULL
, 0, dir
, NULL
);
1074 DIR_TEST_OPEN_FAILURE(&h
, STATUS_OBJECT_NAME_INVALID
)
1076 InitializeObjectAttributes(&attr
, &str
, 0, dir
, NULL
);
1077 DIR_TEST_CREATE_OPEN_SUCCESS(h
, "")
1078 DIR_TEST_CREATE_OPEN_FAILURE(&h
, "\\", STATUS_OBJECT_PATH_SYNTAX_BAD
)
1079 DIR_TEST_CREATE_OPEN_FAILURE(&h
, "\\om.c-test", STATUS_OBJECT_PATH_SYNTAX_BAD
)
1080 DIR_TEST_CREATE_OPEN_FAILURE(&h
, "\\om.c-test\\", STATUS_OBJECT_PATH_SYNTAX_BAD
)
1081 DIR_TEST_CREATE_OPEN_FAILURE(&h
, "om.c-test\\", STATUS_OBJECT_PATH_NOT_FOUND
)
1083 pRtlCreateUnicodeStringFromAsciiz(&str
, "om.c-test");
1084 DIR_TEST_CREATE_SUCCESS(&dir1
)
1085 DIR_TEST_OPEN_SUCCESS(&h
)
1086 pRtlFreeUnicodeString(&str
);
1092 /* Nested directories */
1093 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\");
1094 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
1095 DIR_TEST_OPEN_SUCCESS(&dir
)
1096 InitializeObjectAttributes(&attr
, &str
, 0, dir
, NULL
);
1097 DIR_TEST_OPEN_FAILURE(&h
, STATUS_OBJECT_PATH_SYNTAX_BAD
)
1098 pRtlFreeUnicodeString(&str
);
1101 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
1102 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\BaseNamedObjects\\om.c-test");
1103 DIR_TEST_CREATE_SUCCESS(&dir
)
1104 pRtlFreeUnicodeString(&str
);
1105 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\BaseNamedObjects\\om.c-test\\one more level");
1106 DIR_TEST_CREATE_SUCCESS(&h
)
1107 pRtlFreeUnicodeString(&str
);
1109 InitializeObjectAttributes(&attr
, &str
, 0, dir
, NULL
);
1110 pRtlCreateUnicodeStringFromAsciiz(&str
, "one more level");
1111 DIR_TEST_CREATE_SUCCESS(&h
)
1112 pRtlFreeUnicodeString(&str
);
1119 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
1120 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\BaseNamedObjects\\Global\\om.c-test");
1121 DIR_TEST_CREATE_SUCCESS(&dir
)
1122 pRtlFreeUnicodeString(&str
);
1123 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\BaseNamedObjects\\Local\\om.c-test\\one more level");
1124 DIR_TEST_CREATE_SUCCESS(&h
)
1125 pRtlFreeUnicodeString(&str
);
1127 InitializeObjectAttributes(&attr
, &str
, 0, dir
, NULL
);
1128 pRtlCreateUnicodeStringFromAsciiz(&str
, "one more level");
1129 DIR_TEST_CREATE_SUCCESS(&dir
)
1130 pRtlFreeUnicodeString(&str
);
1135 /* Create other objects using RootDirectory */
1137 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
1138 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\BaseNamedObjects");
1139 DIR_TEST_OPEN_SUCCESS(&dir
)
1140 pRtlFreeUnicodeString(&str
);
1141 InitializeObjectAttributes(&attr
, &str
, 0, dir
, NULL
);
1143 /* Test invalid paths */
1144 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\om.c-mutant");
1145 status
= pNtCreateMutant(&h
, GENERIC_ALL
, &attr
, FALSE
);
1146 ok(status
== STATUS_OBJECT_PATH_SYNTAX_BAD
,
1147 "NtCreateMutant should have failed with STATUS_OBJECT_PATH_SYNTAX_BAD got(%08x)\n", status
);
1148 pRtlFreeUnicodeString(&str
);
1149 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\om.c-mutant\\");
1150 status
= pNtCreateMutant(&h
, GENERIC_ALL
, &attr
, FALSE
);
1151 ok(status
== STATUS_OBJECT_PATH_SYNTAX_BAD
,
1152 "NtCreateMutant should have failed with STATUS_OBJECT_PATH_SYNTAX_BAD got(%08x)\n", status
);
1153 pRtlFreeUnicodeString(&str
);
1155 pRtlCreateUnicodeStringFromAsciiz(&str
, "om.c\\-mutant");
1156 status
= pNtCreateMutant(&h
, GENERIC_ALL
, &attr
, FALSE
);
1157 ok(status
== STATUS_OBJECT_PATH_NOT_FOUND
,
1158 "NtCreateMutant should have failed with STATUS_OBJECT_PATH_NOT_FOUND got(%08x)\n", status
);
1159 pRtlFreeUnicodeString(&str
);
1161 pRtlCreateUnicodeStringFromAsciiz(&str
, "om.c-mutant");
1162 status
= pNtCreateMutant(&h
, GENERIC_ALL
, &attr
, FALSE
);
1163 ok(status
== STATUS_SUCCESS
, "Failed to create Mutant(%08x)\n", status
);
1164 pRtlFreeUnicodeString(&str
);
1170 #define SYMLNK_TEST_CREATE_OPEN_FAILURE2(h,n,t,e,e2) \
1171 pRtlCreateUnicodeStringFromAsciiz(&str, n);\
1172 pRtlCreateUnicodeStringFromAsciiz(&target, t);\
1173 status = pNtCreateSymbolicLinkObject(h, SYMBOLIC_LINK_QUERY, &attr, &target);\
1174 ok(status == e || status == e2, \
1175 "NtCreateSymbolicLinkObject should have failed with %s or %s got(%08x)\n", #e, #e2, status);\
1176 status = pNtOpenSymbolicLinkObject(h, SYMBOLIC_LINK_QUERY, &attr);\
1177 ok(status == e || status == e2, \
1178 "NtOpenSymbolicLinkObject should have failed with %s or %s got(%08x)\n", #e, #e2, status);\
1179 pRtlFreeUnicodeString(&target);\
1180 pRtlFreeUnicodeString(&str);
1182 #define SYMLNK_TEST_CREATE_OPEN_FAILURE(h,n,t,e) SYMLNK_TEST_CREATE_OPEN_FAILURE2(h,n,t,e,e)
1184 static void test_symboliclink(void)
1187 UNICODE_STRING str
, target
;
1188 OBJECT_ATTRIBUTES attr
;
1189 HANDLE dir
, link
, h
;
1190 IO_STATUS_BLOCK iosb
;
1192 /* No name and/or no attributes */
1193 InitializeObjectAttributes(&attr
, NULL
, 0, 0, NULL
);
1194 SYMLNK_TEST_CREATE_OPEN_FAILURE2(NULL
, "", "", STATUS_ACCESS_VIOLATION
, STATUS_INVALID_PARAMETER
)
1196 status
= pNtCreateSymbolicLinkObject(&h
, SYMBOLIC_LINK_QUERY
, NULL
, NULL
);
1197 ok(status
== STATUS_ACCESS_VIOLATION
,
1198 "NtCreateSymbolicLinkObject should have failed with STATUS_ACCESS_VIOLATION got(%08x)\n", status
);
1199 status
= pNtOpenSymbolicLinkObject(&h
, SYMBOLIC_LINK_QUERY
, NULL
);
1200 ok(status
== STATUS_INVALID_PARAMETER
,
1201 "NtOpenSymbolicLinkObject should have failed with STATUS_INVALID_PARAMETER got(%08x)\n", status
);
1204 pRtlCreateUnicodeStringFromAsciiz(&target
, "\\DosDevices");
1205 status
= pNtCreateSymbolicLinkObject(&h
, SYMBOLIC_LINK_QUERY
, NULL
, &target
);
1206 ok(status
== STATUS_SUCCESS
|| status
== STATUS_ACCESS_VIOLATION
, /* nt4 */
1207 "NtCreateSymbolicLinkObject failed(%08x)\n", status
);
1208 pRtlFreeUnicodeString(&target
);
1209 if (!status
) pNtClose(h
);
1211 InitializeObjectAttributes(&attr
, NULL
, 0, 0, NULL
);
1212 status
= pNtCreateSymbolicLinkObject(&link
, SYMBOLIC_LINK_QUERY
, &attr
, &target
);
1213 ok(status
== STATUS_INVALID_PARAMETER
||
1214 broken(status
== STATUS_SUCCESS
), /* nt4 */
1215 "NtCreateSymbolicLinkObject should have failed with STATUS_INVALID_PARAMETER got(%08x)\n", status
);
1216 if (!status
) pNtClose(h
);
1217 status
= pNtOpenSymbolicLinkObject(&h
, SYMBOLIC_LINK_QUERY
, &attr
);
1218 ok(status
== STATUS_OBJECT_PATH_SYNTAX_BAD
,
1219 "NtOpenSymbolicLinkObject should have failed with STATUS_OBJECT_PATH_SYNTAX_BAD got(%08x)\n", status
);
1222 pRtlCreateUnicodeStringFromAsciiz(&target
, "anywhere");
1223 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
1225 pRtlCreateUnicodeStringFromAsciiz(&str
, "");
1226 status
= pNtCreateSymbolicLinkObject(&link
, SYMBOLIC_LINK_QUERY
, &attr
, &target
);
1227 ok(status
== STATUS_SUCCESS
, "Failed to create SymbolicLink(%08x)\n", status
);
1228 status
= pNtOpenSymbolicLinkObject(&h
, SYMBOLIC_LINK_QUERY
, &attr
);
1229 ok(status
== STATUS_OBJECT_PATH_SYNTAX_BAD
,
1230 "NtOpenSymbolicLinkObject should have failed with STATUS_OBJECT_PATH_SYNTAX_BAD got(%08x)\n", status
);
1232 pRtlFreeUnicodeString(&str
);
1234 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\");
1235 status
= pNtCreateSymbolicLinkObject(&h
, SYMBOLIC_LINK_QUERY
, &attr
, &target
);
1236 todo_wine
ok(status
== STATUS_OBJECT_TYPE_MISMATCH
,
1237 "NtCreateSymbolicLinkObject should have failed with STATUS_OBJECT_TYPE_MISMATCH got(%08x)\n", status
);
1238 pRtlFreeUnicodeString(&str
);
1239 pRtlFreeUnicodeString(&target
);
1241 SYMLNK_TEST_CREATE_OPEN_FAILURE(&h
, "BaseNamedObjects", "->Somewhere", STATUS_OBJECT_PATH_SYNTAX_BAD
)
1242 SYMLNK_TEST_CREATE_OPEN_FAILURE(&h
, "\\BaseNamedObjects\\", "->Somewhere", STATUS_OBJECT_NAME_INVALID
)
1243 SYMLNK_TEST_CREATE_OPEN_FAILURE(&h
, "\\\\BaseNamedObjects", "->Somewhere", STATUS_OBJECT_NAME_INVALID
)
1244 SYMLNK_TEST_CREATE_OPEN_FAILURE(&h
, "\\BaseNamedObjects\\\\om.c-test", "->Somewhere", STATUS_OBJECT_NAME_INVALID
)
1245 SYMLNK_TEST_CREATE_OPEN_FAILURE2(&h
, "\\BaseNamedObjects\\om.c-test\\", "->Somewhere",
1246 STATUS_OBJECT_NAME_INVALID
, STATUS_OBJECT_PATH_NOT_FOUND
)
1250 if (!(dir
= get_base_dir()))
1252 win_skip( "couldn't find the BaseNamedObjects dir\n" );
1256 InitializeObjectAttributes(&attr
, &str
, 0, dir
, NULL
);
1257 pRtlCreateUnicodeStringFromAsciiz(&str
, "test-link");
1258 pRtlCreateUnicodeStringFromAsciiz(&target
, "\\DosDevices");
1259 status
= pNtCreateSymbolicLinkObject(&link
, SYMBOLIC_LINK_QUERY
, &attr
, &target
);
1260 ok(status
== STATUS_SUCCESS
, "Failed to create SymbolicLink(%08x)\n", status
);
1261 pRtlFreeUnicodeString(&str
);
1262 pRtlFreeUnicodeString(&target
);
1264 pRtlCreateUnicodeStringFromAsciiz(&str
, "test-link\\NUL");
1265 status
= pNtOpenFile(&h
, GENERIC_READ
, &attr
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
, 0);
1266 ok(status
== STATUS_SUCCESS
, "Failed to open NUL device(%08x)\n", status
);
1267 status
= pNtOpenFile(&h
, GENERIC_READ
, &attr
, &iosb
, FILE_SHARE_READ
|FILE_SHARE_WRITE
, FILE_DIRECTORY_FILE
);
1268 ok(status
== STATUS_SUCCESS
, "Failed to open NUL device(%08x)\n", status
);
1269 pRtlFreeUnicodeString(&str
);
1276 static void test_query_object(void)
1278 static const WCHAR name
[] = {'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s',
1279 '\\','t','e','s','t','_','e','v','e','n','t'};
1280 static const WCHAR type_event
[] = {'E','v','e','n','t'};
1281 static const WCHAR type_file
[] = {'F','i','l','e'};
1282 static const WCHAR type_iocompletion
[] = {'I','o','C','o','m','p','l','e','t','i','o','n'};
1283 static const WCHAR type_directory
[] = {'D','i','r','e','c','t','o','r','y'};
1284 static const WCHAR type_section
[] = {'S','e','c','t','i','o','n'};
1288 ULONG len
, expected_len
;
1289 OBJECT_ATTRIBUTES attr
;
1290 UNICODE_STRING path
, *str
;
1291 char dir
[MAX_PATH
], tmp_path
[MAX_PATH
], file1
[MAX_PATH
+ 16];
1294 InitializeObjectAttributes( &attr
, &path
, 0, 0, 0 );
1296 handle
= CreateEventA( NULL
, FALSE
, FALSE
, "test_event" );
1299 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, 0, &len
);
1300 ok( status
== STATUS_INFO_LENGTH_MISMATCH
, "NtQueryObject failed %x\n", status
);
1301 ok( len
>= sizeof(UNICODE_STRING
) + sizeof(name
) + sizeof(WCHAR
), "unexpected len %u\n", len
);
1304 status
= pNtQueryObject( handle
, ObjectTypeInformation
, buffer
, 0, &len
);
1305 ok( status
== STATUS_INFO_LENGTH_MISMATCH
, "NtQueryObject failed %x\n", status
);
1306 ok( len
>= sizeof(OBJECT_TYPE_INFORMATION
) + sizeof(type_event
) + sizeof(WCHAR
), "unexpected len %u\n", len
);
1309 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, sizeof(UNICODE_STRING
), &len
);
1310 ok( status
== STATUS_INFO_LENGTH_MISMATCH
, "NtQueryObject failed %x\n", status
);
1311 ok( len
>= sizeof(UNICODE_STRING
) + sizeof(name
) + sizeof(WCHAR
), "unexpected len %u\n", len
);
1314 status
= pNtQueryObject( handle
, ObjectTypeInformation
, buffer
, sizeof(OBJECT_TYPE_INFORMATION
), &len
);
1315 ok( status
== STATUS_INFO_LENGTH_MISMATCH
, "NtQueryObject failed %x\n", status
);
1316 ok( len
>= sizeof(OBJECT_TYPE_INFORMATION
) + sizeof(type_event
) + sizeof(WCHAR
), "unexpected len %u\n", len
);
1319 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, sizeof(buffer
), &len
);
1320 ok( status
== STATUS_SUCCESS
, "NtQueryObject failed %x\n", status
);
1321 ok( len
> sizeof(UNICODE_STRING
), "unexpected len %u\n", len
);
1322 str
= (UNICODE_STRING
*)buffer
;
1323 ok( sizeof(UNICODE_STRING
) + str
->Length
+ sizeof(WCHAR
) == len
, "unexpected len %u\n", len
);
1324 ok( str
->Length
>= sizeof(name
), "unexpected len %u\n", str
->Length
);
1325 ok( len
> sizeof(UNICODE_STRING
) + sizeof("\\test_event") * sizeof(WCHAR
),
1326 "name too short %s\n", wine_dbgstr_w(str
->Buffer
) );
1327 /* there can be a \\Sessions prefix in the name */
1328 ok( !memcmp( str
->Buffer
+ (str
->Length
- sizeof(name
)) / sizeof(WCHAR
), name
, sizeof(name
) ),
1329 "wrong name %s\n", wine_dbgstr_w(str
->Buffer
) );
1330 trace( "got %s len %u\n", wine_dbgstr_w(str
->Buffer
), len
);
1332 len
-= sizeof(WCHAR
);
1333 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, len
, &len
);
1334 ok( status
== STATUS_INFO_LENGTH_MISMATCH
, "NtQueryObject failed %x\n", status
);
1335 ok( len
>= sizeof(UNICODE_STRING
) + sizeof(name
) + sizeof(WCHAR
), "unexpected len %u\n", len
);
1338 memset( buffer
, 0, sizeof(buffer
) );
1339 status
= pNtQueryObject( handle
, ObjectTypeInformation
, buffer
, sizeof(buffer
), &len
);
1340 ok( status
== STATUS_SUCCESS
, "NtQueryObject failed %x\n", status
);
1341 ok( len
> sizeof(OBJECT_TYPE_INFORMATION
), "unexpected len %u\n", len
);
1342 str
= (UNICODE_STRING
*)buffer
;
1343 ok( len
>= sizeof(OBJECT_TYPE_INFORMATION
) + str
->Length
+ sizeof(WCHAR
), "unexpected len %u\n", len
);
1344 ok( str
->Buffer
&& !memcmp( str
->Buffer
, type_event
, sizeof(type_event
) ),
1345 "wrong/bad type name %s (%p)\n", wine_dbgstr_w(str
->Buffer
), str
->Buffer
);
1347 len
-= sizeof(WCHAR
);
1348 status
= pNtQueryObject( handle
, ObjectTypeInformation
, buffer
, len
, &len
);
1349 ok( status
== STATUS_INFO_LENGTH_MISMATCH
, "NtQueryObject failed %x\n", status
);
1350 ok( len
>= sizeof(OBJECT_TYPE_INFORMATION
) + sizeof(type_event
) + sizeof(WCHAR
), "unexpected len %u\n", len
);
1354 handle
= CreateEventA( NULL
, FALSE
, FALSE
, NULL
);
1356 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, sizeof(buffer
), &len
);
1357 ok( status
== STATUS_SUCCESS
, "NtQueryObject failed %x\n", status
);
1358 ok( len
== sizeof(UNICODE_STRING
), "unexpected len %u\n", len
);
1359 str
= (UNICODE_STRING
*)buffer
;
1360 ok( str
->Length
== 0, "unexpected len %u\n", len
);
1361 ok( str
->Buffer
== NULL
, "unexpected ptr %p\n", str
->Buffer
);
1364 GetWindowsDirectoryA( dir
, MAX_PATH
);
1365 handle
= CreateFileA( dir
, GENERIC_READ
, FILE_SHARE_READ
| FILE_SHARE_WRITE
, NULL
, OPEN_EXISTING
,
1366 FILE_FLAG_BACKUP_SEMANTICS
, 0 );
1368 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, sizeof(buffer
), &len
);
1369 ok( status
== STATUS_SUCCESS
, "NtQueryObject failed %x\n", status
);
1370 ok( len
> sizeof(UNICODE_STRING
), "unexpected len %u\n", len
);
1371 str
= (UNICODE_STRING
*)buffer
;
1372 expected_len
= sizeof(UNICODE_STRING
) + str
->Length
+ sizeof(WCHAR
);
1373 ok( len
== expected_len
|| broken(len
== expected_len
- sizeof(WCHAR
)), /* NT4 */
1374 "unexpected len %u\n", len
);
1375 trace( "got %s len %u\n", wine_dbgstr_w(str
->Buffer
), len
);
1378 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, 0, &len
);
1379 ok( status
== STATUS_INFO_LENGTH_MISMATCH
|| broken(status
== STATUS_INSUFFICIENT_RESOURCES
),
1380 "NtQueryObject failed %x\n", status
);
1381 ok( len
== expected_len
|| broken(!len
|| len
== sizeof(UNICODE_STRING
)),
1382 "unexpected len %u\n", len
);
1385 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, sizeof(UNICODE_STRING
), &len
);
1386 ok( status
== STATUS_BUFFER_OVERFLOW
|| broken(status
== STATUS_INSUFFICIENT_RESOURCES
1387 || status
== STATUS_INFO_LENGTH_MISMATCH
),
1388 "NtQueryObject failed %x\n", status
);
1389 ok( len
== expected_len
|| broken(!len
),
1390 "unexpected len %u\n", len
);
1393 memset( buffer
, 0, sizeof(buffer
) );
1394 status
= pNtQueryObject( handle
, ObjectTypeInformation
, buffer
, sizeof(buffer
), &len
);
1395 ok( status
== STATUS_SUCCESS
, "NtQueryObject failed %x\n", status
);
1396 ok( len
> sizeof(OBJECT_TYPE_INFORMATION
), "unexpected len %u\n", len
);
1397 str
= (UNICODE_STRING
*)buffer
;
1398 expected_len
= sizeof(OBJECT_TYPE_INFORMATION
) + str
->Length
+ sizeof(WCHAR
);
1399 ok( len
>= expected_len
, "unexpected len %u\n", len
);
1400 ok( str
->Buffer
&& !memcmp( str
->Buffer
, type_file
, sizeof(type_file
) ),
1401 "wrong/bad type name %s (%p)\n", wine_dbgstr_w(str
->Buffer
), str
->Buffer
);
1405 GetTempPathA(MAX_PATH
, tmp_path
);
1406 GetTempFileNameA(tmp_path
, "foo", 0, file1
);
1407 handle
= CreateFileA(file1
, GENERIC_WRITE
| DELETE
, 0, NULL
, CREATE_ALWAYS
, 0, 0);
1409 memset( buffer
, 0, sizeof(buffer
) );
1410 status
= pNtQueryObject( handle
, ObjectTypeInformation
, buffer
, sizeof(buffer
), &len
);
1411 ok( status
== STATUS_SUCCESS
, "NtQueryObject failed %x\n", status
);
1412 ok( len
> sizeof(OBJECT_TYPE_INFORMATION
), "unexpected len %u\n", len
);
1413 str
= (UNICODE_STRING
*)buffer
;
1414 expected_len
= sizeof(OBJECT_TYPE_INFORMATION
) + str
->Length
+ sizeof(WCHAR
);
1415 ok( len
>= expected_len
, "unexpected len %u\n", len
);
1416 ok( str
->Buffer
&& !memcmp( str
->Buffer
, type_file
, sizeof(type_file
) ),
1417 "wrong/bad type name %s (%p)\n", wine_dbgstr_w(str
->Buffer
), str
->Buffer
);
1418 DeleteFileA( file1
);
1421 status
= pNtCreateIoCompletion( &handle
, IO_COMPLETION_ALL_ACCESS
, NULL
, 0 );
1422 ok( status
== STATUS_SUCCESS
, "NtCreateIoCompletion failed %x\n", status
);
1424 memset( buffer
, 0, sizeof(buffer
) );
1425 status
= pNtQueryObject( handle
, ObjectTypeInformation
, buffer
, sizeof(buffer
), &len
);
1426 ok( status
== STATUS_SUCCESS
, "NtQueryObject failed %x\n", status
);
1427 ok( len
> sizeof(OBJECT_TYPE_INFORMATION
), "unexpected len %u\n", len
);
1428 str
= (UNICODE_STRING
*)buffer
;
1429 expected_len
= sizeof(OBJECT_TYPE_INFORMATION
) + str
->Length
+ sizeof(WCHAR
);
1430 ok( len
>= expected_len
, "unexpected len %u\n", len
);
1431 ok( str
->Buffer
&& !memcmp( str
->Buffer
, type_iocompletion
, sizeof(type_iocompletion
) ),
1432 "wrong/bad type name %s (%p)\n", wine_dbgstr_w(str
->Buffer
), str
->Buffer
);
1435 status
= pNtCreateDirectoryObject( &handle
, DIRECTORY_QUERY
, NULL
);
1436 ok(status
== STATUS_SUCCESS
, "Failed to create Directory %08x\n", status
);
1438 memset( buffer
, 0, sizeof(buffer
) );
1439 status
= pNtQueryObject( handle
, ObjectTypeInformation
, buffer
, sizeof(buffer
), &len
);
1440 ok( status
== STATUS_SUCCESS
, "NtQueryObject failed %x\n", status
);
1441 ok( len
> sizeof(OBJECT_TYPE_INFORMATION
), "unexpected len %u\n", len
);
1442 str
= (UNICODE_STRING
*)buffer
;
1443 expected_len
= sizeof(OBJECT_TYPE_INFORMATION
) + str
->Length
+ sizeof(WCHAR
);
1444 ok( len
>= expected_len
, "unexpected len %u\n", len
);
1445 ok( str
->Buffer
&& !memcmp( str
->Buffer
, type_directory
, sizeof(type_directory
) ),
1446 "wrong/bad type name %s (%p)\n", wine_dbgstr_w(str
->Buffer
), str
->Buffer
);
1449 size
.u
.LowPart
= 256;
1450 size
.u
.HighPart
= 0;
1451 status
= pNtCreateSection( &handle
, SECTION_MAP_WRITE
, NULL
, &size
, PAGE_READWRITE
, SEC_COMMIT
, 0 );
1452 ok( status
== STATUS_SUCCESS
, "NtCreateSection returned %x\n", status
);
1454 memset( buffer
, 0, sizeof(buffer
) );
1455 status
= pNtQueryObject( handle
, ObjectTypeInformation
, buffer
, sizeof(buffer
), &len
);
1456 ok( status
== STATUS_SUCCESS
, "NtQueryObject failed %x\n", status
);
1457 ok( len
> sizeof(OBJECT_TYPE_INFORMATION
), "unexpected len %u\n", len
);
1458 str
= (UNICODE_STRING
*)buffer
;
1459 expected_len
= sizeof(OBJECT_TYPE_INFORMATION
) + str
->Length
+ sizeof(WCHAR
);
1460 ok( len
>= expected_len
, "unexpected len %u\n", len
);
1461 ok( str
->Buffer
&& !memcmp( str
->Buffer
, type_section
, sizeof(type_section
) ),
1462 "wrong/bad type name %s (%p)\n", wine_dbgstr_w(str
->Buffer
), str
->Buffer
);
1465 handle
= CreateMailslotA( "\\\\.\\mailslot\\test_mailslot", 100, 1000, NULL
);
1466 ok( handle
!= INVALID_HANDLE_VALUE
, "CreateMailslot failed err %u\n", GetLastError() );
1468 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, sizeof(buffer
), &len
);
1469 ok( status
== STATUS_SUCCESS
, "NtQueryObject returned %x\n", status
);
1470 str
= (UNICODE_STRING
*)buffer
;
1471 ok( len
> sizeof(UNICODE_STRING
), "unexpected len %u\n", len
);
1472 str
= (UNICODE_STRING
*)buffer
;
1473 expected_len
= sizeof(UNICODE_STRING
) + str
->Length
+ sizeof(WCHAR
);
1474 ok( len
== expected_len
|| broken(len
== expected_len
- sizeof(WCHAR
)), /* NT4 */
1475 "unexpected len %u\n", len
);
1477 ok( len
> sizeof(UNICODE_STRING
) + sizeof("\\test_mailslot") * sizeof(WCHAR
),
1478 "name too short %s\n", wine_dbgstr_w(str
->Buffer
) );
1479 trace( "got %s len %u\n", wine_dbgstr_w(str
->Buffer
), len
);
1482 handle
= CreateNamedPipeA( "\\\\.\\pipe\\test_pipe", PIPE_ACCESS_DUPLEX
, PIPE_READMODE_BYTE
,
1483 1, 1000, 1000, 1000, NULL
);
1484 ok( handle
!= INVALID_HANDLE_VALUE
, "CreateNamedPipe failed err %u\n", GetLastError() );
1486 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, sizeof(buffer
), &len
);
1487 ok( status
== STATUS_SUCCESS
, "NtQueryObject returned %x\n", status
);
1488 str
= (UNICODE_STRING
*)buffer
;
1490 ok( len
> sizeof(UNICODE_STRING
), "unexpected len %u\n", len
);
1491 str
= (UNICODE_STRING
*)buffer
;
1492 expected_len
= sizeof(UNICODE_STRING
) + str
->Length
+ sizeof(WCHAR
);
1494 ok( len
== expected_len
|| broken(len
== expected_len
- sizeof(WCHAR
)), /* NT4 */
1495 "unexpected len %u\n", len
);
1497 ok( len
> sizeof(UNICODE_STRING
) + sizeof("\\test_pipe") * sizeof(WCHAR
),
1498 "name too short %s\n", wine_dbgstr_w(str
->Buffer
) );
1499 trace( "got %s len %u\n", wine_dbgstr_w(str
->Buffer
), len
);
1502 pRtlCreateUnicodeStringFromAsciiz( &path
, "\\REGISTRY\\Machine\\Software\\Classes" );
1503 status
= pNtCreateKey( &handle
, KEY_ALL_ACCESS
, &attr
, 0, 0, 0, 0 );
1504 ok( status
== STATUS_SUCCESS
|| status
== STATUS_ACCESS_DENIED
,
1505 "NtCreateKey failed status %x\n", status
);
1506 pRtlFreeUnicodeString( &path
);
1507 if (status
== STATUS_SUCCESS
)
1510 status
= pNtQueryObject( handle
, ObjectNameInformation
, buffer
, sizeof(buffer
), &len
);
1511 ok( status
== STATUS_SUCCESS
, "NtQueryObject returned %x\n", status
);
1512 str
= (UNICODE_STRING
*)buffer
;
1514 ok( len
> sizeof(UNICODE_STRING
), "unexpected len %u\n", len
);
1515 str
= (UNICODE_STRING
*)buffer
;
1516 expected_len
= sizeof(UNICODE_STRING
) + str
->Length
+ sizeof(WCHAR
);
1518 ok( len
== expected_len
|| broken(len
== expected_len
- sizeof(WCHAR
)), /* NT4 */
1519 "unexpected len %u\n", len
);
1521 ok( len
> sizeof(UNICODE_STRING
) + sizeof("\\Classes") * sizeof(WCHAR
),
1522 "name too short %s\n", wine_dbgstr_w(str
->Buffer
) );
1523 trace( "got %s len %u\n", wine_dbgstr_w(str
->Buffer
), len
);
1528 static void test_type_mismatch(void)
1532 OBJECT_ATTRIBUTES attr
;
1534 attr
.Length
= sizeof(attr
);
1535 attr
.RootDirectory
= 0;
1536 attr
.ObjectName
= NULL
;
1537 attr
.Attributes
= 0;
1538 attr
.SecurityDescriptor
= NULL
;
1539 attr
.SecurityQualityOfService
= NULL
;
1541 res
= pNtCreateEvent( &h
, 0, &attr
, 0, 0 );
1542 ok(!res
, "can't create event: %x\n", res
);
1544 res
= pNtReleaseSemaphore( h
, 30, NULL
);
1545 ok(res
== STATUS_OBJECT_TYPE_MISMATCH
, "expected 0xc0000024, got %x\n", res
);
1550 static void test_event(void)
1556 OBJECT_ATTRIBUTES attr
;
1557 EVENT_BASIC_INFORMATION info
;
1558 static const WCHAR eventName
[] = {'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s','\\','t','e','s','t','E','v','e','n','t',0};
1560 pRtlInitUnicodeString(&str
, eventName
);
1561 InitializeObjectAttributes(&attr
, &str
, 0, 0, NULL
);
1563 status
= pNtCreateEvent(&Event
, GENERIC_ALL
, &attr
, 1, 0);
1564 ok( status
== STATUS_SUCCESS
, "NtCreateEvent failed %08x\n", status
);
1566 status
= pNtPulseEvent(Event
, NULL
);
1567 ok( status
== STATUS_SUCCESS
, "NtPulseEvent failed %08x\n", status
);
1569 status
= pNtQueryEvent(Event
, EventBasicInformation
, &info
, sizeof(info
), NULL
);
1570 ok( status
== STATUS_SUCCESS
, "NtQueryEvent failed %08x\n", status
);
1571 ok( info
.EventType
== 1 && info
.EventState
== 0,
1572 "NtQueryEvent failed, expected 1 0, got %d %d\n", info
.EventType
, info
.EventState
);
1574 status
= pNtOpenEvent(&Event2
, GENERIC_ALL
, &attr
);
1575 ok( status
== STATUS_SUCCESS
, "NtOpenEvent failed %08x\n", status
);
1579 status
= pNtQueryEvent(Event2
, EventBasicInformation
, &info
, sizeof(info
), NULL
);
1580 ok( status
== STATUS_SUCCESS
, "NtQueryEvent failed %08x\n", status
);
1581 ok( info
.EventType
== 1 && info
.EventState
== 0,
1582 "NtQueryEvent failed, expected 1 0, got %d %d\n", info
.EventType
, info
.EventState
);
1587 static const WCHAR keyed_nameW
[] = {'\\','B','a','s','e','N','a','m','e','d','O','b','j','e','c','t','s',
1588 '\\','W','i','n','e','T','e','s','t','E','v','e','n','t',0};
1590 static DWORD WINAPI
keyed_event_thread( void *arg
)
1594 LARGE_INTEGER timeout
;
1595 OBJECT_ATTRIBUTES attr
;
1599 attr
.Length
= sizeof(attr
);
1600 attr
.RootDirectory
= 0;
1601 attr
.ObjectName
= &str
;
1602 attr
.Attributes
= 0;
1603 attr
.SecurityDescriptor
= NULL
;
1604 attr
.SecurityQualityOfService
= NULL
;
1605 RtlInitUnicodeString( &str
, keyed_nameW
);
1607 status
= pNtOpenKeyedEvent( &handle
, KEYEDEVENT_ALL_ACCESS
, &attr
);
1608 ok( !status
, "NtOpenKeyedEvent failed %x\n", status
);
1610 for (i
= 0; i
< 20; i
++)
1613 status
= pNtWaitForKeyedEvent( handle
, (void *)(i
* 2), 0, NULL
);
1615 status
= pNtReleaseKeyedEvent( handle
, (void *)(i
* 2), 0, NULL
);
1616 ok( status
== STATUS_SUCCESS
, "%li: failed %x\n", i
, status
);
1620 status
= pNtReleaseKeyedEvent( handle
, (void *)0x1234, 0, NULL
);
1621 ok( status
== STATUS_SUCCESS
, "NtReleaseKeyedEvent %x\n", status
);
1623 timeout
.QuadPart
= -10000;
1624 status
= pNtWaitForKeyedEvent( handle
, (void *)0x5678, 0, &timeout
);
1625 ok( status
== STATUS_TIMEOUT
, "NtWaitForKeyedEvent %x\n", status
);
1626 status
= pNtReleaseKeyedEvent( handle
, (void *)0x9abc, 0, &timeout
);
1627 ok( status
== STATUS_TIMEOUT
, "NtReleaseKeyedEvent %x\n", status
);
1633 static void test_keyed_events(void)
1635 OBJECT_ATTRIBUTES attr
;
1637 HANDLE handle
, event
, thread
;
1639 LARGE_INTEGER timeout
;
1642 if (!pNtCreateKeyedEvent
)
1644 win_skip( "Keyed events not supported\n" );
1648 attr
.Length
= sizeof(attr
);
1649 attr
.RootDirectory
= 0;
1650 attr
.ObjectName
= &str
;
1651 attr
.Attributes
= 0;
1652 attr
.SecurityDescriptor
= NULL
;
1653 attr
.SecurityQualityOfService
= NULL
;
1654 RtlInitUnicodeString( &str
, keyed_nameW
);
1656 status
= pNtCreateKeyedEvent( &handle
, KEYEDEVENT_ALL_ACCESS
| SYNCHRONIZE
, &attr
, 0 );
1657 ok( !status
, "NtCreateKeyedEvent failed %x\n", status
);
1659 status
= WaitForSingleObject( handle
, 1000 );
1660 ok( status
== 0, "WaitForSingleObject %x\n", status
);
1662 timeout
.QuadPart
= -100000;
1663 status
= pNtWaitForKeyedEvent( handle
, (void *)255, 0, &timeout
);
1664 ok( status
== STATUS_INVALID_PARAMETER_1
, "NtWaitForKeyedEvent %x\n", status
);
1665 status
= pNtReleaseKeyedEvent( handle
, (void *)255, 0, &timeout
);
1666 ok( status
== STATUS_INVALID_PARAMETER_1
, "NtReleaseKeyedEvent %x\n", status
);
1668 status
= pNtWaitForKeyedEvent( handle
, (void *)254, 0, &timeout
);
1669 ok( status
== STATUS_TIMEOUT
, "NtWaitForKeyedEvent %x\n", status
);
1670 status
= pNtReleaseKeyedEvent( handle
, (void *)254, 0, &timeout
);
1671 ok( status
== STATUS_TIMEOUT
, "NtReleaseKeyedEvent %x\n", status
);
1673 status
= pNtWaitForKeyedEvent( handle
, NULL
, 0, &timeout
);
1674 ok( status
== STATUS_TIMEOUT
, "NtWaitForKeyedEvent %x\n", status
);
1675 status
= pNtReleaseKeyedEvent( handle
, NULL
, 0, &timeout
);
1676 ok( status
== STATUS_TIMEOUT
, "NtReleaseKeyedEvent %x\n", status
);
1678 status
= pNtWaitForKeyedEvent( (HANDLE
)0xdeadbeef, (void *)9, 0, &timeout
);
1679 ok( status
== STATUS_INVALID_PARAMETER_1
, "NtWaitForKeyedEvent %x\n", status
);
1680 status
= pNtReleaseKeyedEvent( (HANDLE
)0xdeadbeef, (void *)9, 0, &timeout
);
1681 ok( status
== STATUS_INVALID_PARAMETER_1
, "NtReleaseKeyedEvent %x\n", status
);
1683 status
= pNtWaitForKeyedEvent( (HANDLE
)0xdeadbeef, (void *)8, 0, &timeout
);
1684 ok( status
== STATUS_INVALID_HANDLE
, "NtWaitForKeyedEvent %x\n", status
);
1685 status
= pNtReleaseKeyedEvent( (HANDLE
)0xdeadbeef, (void *)8, 0, &timeout
);
1686 ok( status
== STATUS_INVALID_HANDLE
, "NtReleaseKeyedEvent %x\n", status
);
1688 thread
= CreateThread( NULL
, 0, keyed_event_thread
, 0, 0, NULL
);
1689 for (i
= 0; i
< 20; i
++)
1692 status
= pNtReleaseKeyedEvent( handle
, (void *)(i
* 2), 0, NULL
);
1694 status
= pNtWaitForKeyedEvent( handle
, (void *)(i
* 2), 0, NULL
);
1695 ok( status
== STATUS_SUCCESS
, "%li: failed %x\n", i
, status
);
1698 status
= pNtWaitForKeyedEvent( handle
, (void *)0x1234, 0, &timeout
);
1699 ok( status
== STATUS_SUCCESS
, "NtWaitForKeyedEvent %x\n", status
);
1700 status
= pNtWaitForKeyedEvent( handle
, (void *)0x5678, 0, &timeout
);
1701 ok( status
== STATUS_TIMEOUT
, "NtWaitForKeyedEvent %x\n", status
);
1702 status
= pNtReleaseKeyedEvent( handle
, (void *)0x9abc, 0, &timeout
);
1703 ok( status
== STATUS_TIMEOUT
, "NtReleaseKeyedEvent %x\n", status
);
1705 ok( WaitForSingleObject( thread
, 30000 ) == 0, "wait failed\n" );
1709 /* test access rights */
1711 status
= pNtCreateKeyedEvent( &handle
, KEYEDEVENT_WAIT
, &attr
, 0 );
1712 ok( !status
, "NtCreateKeyedEvent failed %x\n", status
);
1713 status
= pNtWaitForKeyedEvent( handle
, (void *)8, 0, &timeout
);
1714 ok( status
== STATUS_TIMEOUT
, "NtWaitForKeyedEvent %x\n", status
);
1715 status
= pNtReleaseKeyedEvent( handle
, (void *)8, 0, &timeout
);
1716 ok( status
== STATUS_ACCESS_DENIED
, "NtReleaseKeyedEvent %x\n", status
);
1719 status
= pNtCreateKeyedEvent( &handle
, KEYEDEVENT_WAKE
, &attr
, 0 );
1720 ok( !status
, "NtCreateKeyedEvent failed %x\n", status
);
1721 status
= pNtWaitForKeyedEvent( handle
, (void *)8, 0, &timeout
);
1722 ok( status
== STATUS_ACCESS_DENIED
, "NtWaitForKeyedEvent %x\n", status
);
1723 status
= pNtReleaseKeyedEvent( handle
, (void *)8, 0, &timeout
);
1724 ok( status
== STATUS_TIMEOUT
, "NtReleaseKeyedEvent %x\n", status
);
1727 status
= pNtCreateKeyedEvent( &handle
, KEYEDEVENT_ALL_ACCESS
, &attr
, 0 );
1728 ok( !status
, "NtCreateKeyedEvent failed %x\n", status
);
1729 status
= WaitForSingleObject( handle
, 1000 );
1730 ok( status
== WAIT_FAILED
&& GetLastError() == ERROR_ACCESS_DENIED
,
1731 "WaitForSingleObject %x err %u\n", status
, GetLastError() );
1732 status
= pNtWaitForKeyedEvent( handle
, (void *)8, 0, &timeout
);
1733 ok( status
== STATUS_TIMEOUT
, "NtWaitForKeyedEvent %x\n", status
);
1734 status
= pNtReleaseKeyedEvent( handle
, (void *)8, 0, &timeout
);
1735 ok( status
== STATUS_TIMEOUT
, "NtReleaseKeyedEvent %x\n", status
);
1738 /* GENERIC_READ gives wait access */
1739 status
= pNtCreateKeyedEvent( &handle
, GENERIC_READ
, &attr
, 0 );
1740 ok( !status
, "NtCreateKeyedEvent failed %x\n", status
);
1741 status
= pNtWaitForKeyedEvent( handle
, (void *)8, 0, &timeout
);
1742 ok( status
== STATUS_TIMEOUT
, "NtWaitForKeyedEvent %x\n", status
);
1743 status
= pNtReleaseKeyedEvent( handle
, (void *)8, 0, &timeout
);
1744 ok( status
== STATUS_ACCESS_DENIED
, "NtReleaseKeyedEvent %x\n", status
);
1747 /* GENERIC_WRITE gives wake access */
1748 status
= pNtCreateKeyedEvent( &handle
, GENERIC_WRITE
, &attr
, 0 );
1749 ok( !status
, "NtCreateKeyedEvent failed %x\n", status
);
1750 status
= pNtWaitForKeyedEvent( handle
, (void *)8, 0, &timeout
);
1751 ok( status
== STATUS_ACCESS_DENIED
, "NtWaitForKeyedEvent %x\n", status
);
1752 status
= pNtReleaseKeyedEvent( handle
, (void *)8, 0, &timeout
);
1753 ok( status
== STATUS_TIMEOUT
, "NtReleaseKeyedEvent %x\n", status
);
1755 /* it's not an event */
1756 status
= pNtPulseEvent( handle
, NULL
);
1757 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "NtPulseEvent %x\n", status
);
1759 status
= pNtCreateEvent( &event
, GENERIC_ALL
, &attr
, FALSE
, FALSE
);
1760 ok( status
== STATUS_OBJECT_NAME_COLLISION
|| status
== STATUS_OBJECT_TYPE_MISMATCH
,
1761 "CreateEvent %x\n", status
);
1765 status
= pNtCreateEvent( &event
, GENERIC_ALL
, &attr
, FALSE
, FALSE
);
1766 ok( status
== 0, "CreateEvent %x\n", status
);
1767 status
= pNtWaitForKeyedEvent( event
, (void *)8, 0, &timeout
);
1768 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "NtWaitForKeyedEvent %x\n", status
);
1769 status
= pNtReleaseKeyedEvent( event
, (void *)8, 0, &timeout
);
1770 ok( status
== STATUS_OBJECT_TYPE_MISMATCH
, "NtReleaseKeyedEvent %x\n", status
);
1774 static void test_null_device(void)
1776 OBJECT_ATTRIBUTES attr
;
1777 IO_STATUS_BLOCK iosb
;
1786 memset(buf
, 0xAA, sizeof(buf
));
1787 memset(&ov
, 0, sizeof(ov
));
1788 ov
.hEvent
= CreateEventA(NULL
, TRUE
, FALSE
, NULL
);
1790 pRtlCreateUnicodeStringFromAsciiz(&str
, "\\Device\\Null");
1791 InitializeObjectAttributes(&attr
, &str
, OBJ_CASE_INSENSITIVE
, 0, NULL
);
1792 status
= pNtOpenSymbolicLinkObject(&null
, SYMBOLIC_LINK_QUERY
, &attr
);
1793 ok(status
== STATUS_OBJECT_TYPE_MISMATCH
,
1794 "expected STATUS_OBJECT_TYPE_MISMATCH, got %08x\n", status
);
1796 status
= pNtOpenFile(&null
, GENERIC_READ
| GENERIC_WRITE
, &attr
, &iosb
,
1797 FILE_SHARE_READ
| FILE_SHARE_WRITE
, 0);
1798 ok(status
== STATUS_SUCCESS
,
1799 "expected STATUS_SUCCESS, got %08x\n", status
);
1801 SetLastError(0xdeadbeef);
1802 ret
= WriteFile(null
, buf
, sizeof(buf
), &num_bytes
, NULL
);
1803 ok(!ret
, "WriteFile unexpectedly succeeded\n");
1804 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
1805 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1807 SetLastError(0xdeadbeef);
1808 ret
= ReadFile(null
, buf
, sizeof(buf
), &num_bytes
, NULL
);
1809 ok(!ret
, "ReadFile unexpectedly succeeded\n");
1810 ok(GetLastError() == ERROR_INVALID_PARAMETER
,
1811 "expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError());
1813 num_bytes
= 0xdeadbeef;
1814 SetLastError(0xdeadbeef);
1815 ret
= WriteFile(null
, buf
, sizeof(buf
), &num_bytes
, &ov
);
1816 if (ret
|| GetLastError() != ERROR_IO_PENDING
)
1818 ok(ret
, "WriteFile failed with error %u\n", GetLastError());
1822 num_bytes
= 0xdeadbeef;
1823 ret
= GetOverlappedResult(null
, &ov
, &num_bytes
, TRUE
);
1824 ok(ret
, "GetOverlappedResult failed with error %u\n", GetLastError());
1826 ok(num_bytes
== sizeof(buf
), "expected num_bytes = %u, got %u\n",
1827 (DWORD
)sizeof(buf
), num_bytes
);
1829 num_bytes
= 0xdeadbeef;
1830 SetLastError(0xdeadbeef);
1831 ret
= ReadFile(null
, buf
, sizeof(buf
), &num_bytes
, &ov
);
1832 if (ret
|| GetLastError() != ERROR_IO_PENDING
)
1834 ok(!ret
, "ReadFile unexpectedly succeeded\n");
1838 num_bytes
= 0xdeadbeef;
1839 ret
= GetOverlappedResult(null
, &ov
, &num_bytes
, TRUE
);
1840 ok(!ret
, "GetOverlappedResult unexpectedly succeeded\n");
1842 ok(GetLastError() == ERROR_HANDLE_EOF
,
1843 "expected ERROR_HANDLE_EOF, got %u\n", GetLastError());
1847 null
= CreateFileA("\\\\.\\Null", GENERIC_READ
| GENERIC_WRITE
,
1848 FILE_SHARE_READ
| FILE_SHARE_WRITE
, NULL
,
1849 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
1850 ok(null
== INVALID_HANDLE_VALUE
, "CreateFileA unexpectedly succeeded\n");
1851 ok(GetLastError() == ERROR_FILE_NOT_FOUND
,
1852 "expected ERROR_FILE_NOT_FOUND, got %u\n", GetLastError());
1854 null
= CreateFileA("\\\\.\\Device\\Null", GENERIC_READ
| GENERIC_WRITE
,
1855 FILE_SHARE_READ
| FILE_SHARE_WRITE
, NULL
,
1856 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
1857 ok(null
== INVALID_HANDLE_VALUE
, "CreateFileA unexpectedly succeeded\n");
1858 ok(GetLastError() == ERROR_PATH_NOT_FOUND
,
1859 "expected ERROR_PATH_NOT_FOUND, got %u\n", GetLastError());
1861 pRtlFreeUnicodeString(&str
);
1862 CloseHandle(ov
.hEvent
);
1867 HMODULE hntdll
= GetModuleHandleA("ntdll.dll");
1868 HMODULE hkernel32
= GetModuleHandleA("kernel32.dll");
1872 skip("not running on NT, skipping test\n");
1876 pCreateWaitableTimerA
= (void *)GetProcAddress(hkernel32
, "CreateWaitableTimerA");
1878 pRtlCreateUnicodeStringFromAsciiz
= (void *)GetProcAddress(hntdll
, "RtlCreateUnicodeStringFromAsciiz");
1879 pRtlFreeUnicodeString
= (void *)GetProcAddress(hntdll
, "RtlFreeUnicodeString");
1880 pNtCreateEvent
= (void *)GetProcAddress(hntdll
, "NtCreateEvent");
1881 pNtCreateJobObject
= (void *)GetProcAddress(hntdll
, "NtCreateJobObject");
1882 pNtOpenJobObject
= (void *)GetProcAddress(hntdll
, "NtOpenJobObject");
1883 pNtCreateKey
= (void *)GetProcAddress(hntdll
, "NtCreateKey");
1884 pNtOpenKey
= (void *)GetProcAddress(hntdll
, "NtOpenKey");
1885 pNtDeleteKey
= (void *)GetProcAddress(hntdll
, "NtDeleteKey");
1886 pNtCreateMailslotFile
= (void *)GetProcAddress(hntdll
, "NtCreateMailslotFile");
1887 pNtCreateMutant
= (void *)GetProcAddress(hntdll
, "NtCreateMutant");
1888 pNtOpenEvent
= (void *)GetProcAddress(hntdll
, "NtOpenEvent");
1889 pNtQueryEvent
= (void *)GetProcAddress(hntdll
, "NtQueryEvent");
1890 pNtPulseEvent
= (void *)GetProcAddress(hntdll
, "NtPulseEvent");
1891 pNtOpenMutant
= (void *)GetProcAddress(hntdll
, "NtOpenMutant");
1892 pNtOpenFile
= (void *)GetProcAddress(hntdll
, "NtOpenFile");
1893 pNtClose
= (void *)GetProcAddress(hntdll
, "NtClose");
1894 pRtlInitUnicodeString
= (void *)GetProcAddress(hntdll
, "RtlInitUnicodeString");
1895 pNtCreateNamedPipeFile
= (void *)GetProcAddress(hntdll
, "NtCreateNamedPipeFile");
1896 pNtOpenDirectoryObject
= (void *)GetProcAddress(hntdll
, "NtOpenDirectoryObject");
1897 pNtCreateDirectoryObject
= (void *)GetProcAddress(hntdll
, "NtCreateDirectoryObject");
1898 pNtOpenSymbolicLinkObject
= (void *)GetProcAddress(hntdll
, "NtOpenSymbolicLinkObject");
1899 pNtCreateSymbolicLinkObject
= (void *)GetProcAddress(hntdll
, "NtCreateSymbolicLinkObject");
1900 pNtQuerySymbolicLinkObject
= (void *)GetProcAddress(hntdll
, "NtQuerySymbolicLinkObject");
1901 pNtCreateSemaphore
= (void *)GetProcAddress(hntdll
, "NtCreateSemaphore");
1902 pNtOpenSemaphore
= (void *)GetProcAddress(hntdll
, "NtOpenSemaphore");
1903 pNtCreateTimer
= (void *)GetProcAddress(hntdll
, "NtCreateTimer");
1904 pNtOpenTimer
= (void *)GetProcAddress(hntdll
, "NtOpenTimer");
1905 pNtCreateSection
= (void *)GetProcAddress(hntdll
, "NtCreateSection");
1906 pNtOpenSection
= (void *)GetProcAddress(hntdll
, "NtOpenSection");
1907 pNtQueryObject
= (void *)GetProcAddress(hntdll
, "NtQueryObject");
1908 pNtReleaseSemaphore
= (void *)GetProcAddress(hntdll
, "NtReleaseSemaphore");
1909 pNtCreateKeyedEvent
= (void *)GetProcAddress(hntdll
, "NtCreateKeyedEvent");
1910 pNtOpenKeyedEvent
= (void *)GetProcAddress(hntdll
, "NtOpenKeyedEvent");
1911 pNtWaitForKeyedEvent
= (void *)GetProcAddress(hntdll
, "NtWaitForKeyedEvent");
1912 pNtReleaseKeyedEvent
= (void *)GetProcAddress(hntdll
, "NtReleaseKeyedEvent");
1913 pNtCreateIoCompletion
= (void *)GetProcAddress(hntdll
, "NtCreateIoCompletion");
1914 pNtOpenIoCompletion
= (void *)GetProcAddress(hntdll
, "NtOpenIoCompletion");
1916 test_case_sensitive();
1917 test_namespace_pipe();
1918 test_name_collisions();
1921 test_symboliclink();
1922 test_query_object();
1923 test_type_mismatch();
1925 test_keyed_events();