Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
fe092462
Commit
fe092462
authored
Jan 29, 2016
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Add a helper to validate attributes in open calls, and use a common pattern in all calls.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
b3064d74
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
110 additions
and
132 deletions
+110
-132
ntdll_misc.h
dlls/ntdll/ntdll_misc.h
+1
-0
om.c
dlls/ntdll/om.c
+23
-42
reg.c
dlls/ntdll/reg.c
+2
-0
sync.c
dlls/ntdll/sync.c
+73
-59
om.c
dlls/ntdll/tests/om.c
+0
-21
virtual.c
dlls/ntdll/virtual.c
+7
-6
winternl.h
include/winternl.h
+4
-4
No files found.
dlls/ntdll/ntdll_misc.h
View file @
fe092462
...
...
@@ -99,6 +99,7 @@ extern int server_get_unix_fd( HANDLE handle, unsigned int access, int *unix_fd,
extern
int
server_pipe
(
int
fd
[
2
]
)
DECLSPEC_HIDDEN
;
extern
NTSTATUS
alloc_object_attributes
(
const
OBJECT_ATTRIBUTES
*
attr
,
struct
object_attributes
**
ret
,
data_size_t
*
ret_len
)
DECLSPEC_HIDDEN
;
extern
NTSTATUS
validate_open_object_attributes
(
const
OBJECT_ATTRIBUTES
*
attr
)
DECLSPEC_HIDDEN
;
/* module handling */
extern
LIST_ENTRY
tls_links
DECLSPEC_HIDDEN
;
...
...
dlls/ntdll/om.c
View file @
fe092462
...
...
@@ -429,34 +429,24 @@ NTSTATUS WINAPI NtClose( HANDLE Handle )
* Success: ERROR_SUCCESS.
* Failure: An NTSTATUS error code.
*/
NTSTATUS
WINAPI
NtOpenDirectoryObject
(
PHANDLE
DirectoryHandle
,
ACCESS_MASK
DesiredAccess
,
POBJECT_ATTRIBUTES
ObjectAttributes
)
NTSTATUS
WINAPI
NtOpenDirectoryObject
(
HANDLE
*
handle
,
ACCESS_MASK
access
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
NTSTATUS
ret
;
if
(
!
DirectoryHandle
)
return
STATUS_ACCESS_VIOLATION
;
if
(
!
ObjectAttributes
)
return
STATUS_INVALID_PARAMETER
;
TRACE
(
"(%p,0x%08x,%s)
\n
"
,
DirectoryHandle
,
DesiredAccess
,
debugstr_ObjectAttributes
(
ObjectAttributes
));
/* Have to test it here because server won't know difference between
* ObjectName == NULL and ObjectName == "" */
if
(
!
ObjectAttributes
->
ObjectName
)
{
if
(
ObjectAttributes
->
RootDirectory
)
return
STATUS_OBJECT_NAME_INVALID
;
else
return
STATUS_OBJECT_PATH_SYNTAX_BAD
;
}
if
(
!
handle
)
return
STATUS_ACCESS_VIOLATION
;
if
((
ret
=
validate_open_object_attributes
(
attr
)))
return
ret
;
TRACE
(
"(%p,0x%08x,%s)
\n
"
,
handle
,
access
,
debugstr_ObjectAttributes
(
attr
));
SERVER_START_REQ
(
open_directory
)
{
req
->
access
=
DesiredAccess
;
req
->
attributes
=
ObjectAttributes
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
ObjectAttributes
->
RootDirectory
);
if
(
ObjectAttributes
->
ObjectName
)
wine_server_add_data
(
req
,
ObjectAttributes
->
ObjectName
->
Buffer
,
ObjectAttributes
->
ObjectName
->
Length
);
req
->
access
=
access
;
req
->
attributes
=
attr
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
->
RootDirectory
);
if
(
attr
->
ObjectName
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
attr
->
ObjectName
->
Length
);
ret
=
wine_server_call
(
req
);
*
DirectoryH
andle
=
wine_server_ptr_handle
(
reply
->
handle
);
*
h
andle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
SERVER_END_REQ
;
return
ret
;
...
...
@@ -586,34 +576,25 @@ NTSTATUS WINAPI NtQueryDirectoryObject(HANDLE handle, PDIRECTORY_BASIC_INFORMATI
* Success: ERROR_SUCCESS.
* Failure: An NTSTATUS error code.
*/
NTSTATUS
WINAPI
NtOpenSymbolicLinkObject
(
OUT
PHANDLE
LinkHandle
,
IN
ACCESS_MASK
DesiredA
ccess
,
IN
POBJECT_ATTRIBUTES
ObjectAttributes
)
NTSTATUS
WINAPI
NtOpenSymbolicLinkObject
(
HANDLE
*
handle
,
ACCESS_MASK
a
ccess
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
NTSTATUS
ret
;
TRACE
(
"(%p,0x%08x,%s)
\n
"
,
LinkHandle
,
DesiredAccess
,
debugstr_ObjectAttributes
(
ObjectAttributes
));
if
(
!
LinkHandle
)
return
STATUS_ACCESS_VIOLATION
;
if
(
!
ObjectAttributes
)
return
STATUS_INVALID_PARAMETER
;
/* Have to test it here because server won't know difference between
* ObjectName == NULL and ObjectName == "" */
if
(
!
ObjectAttributes
->
ObjectName
)
{
if
(
ObjectAttributes
->
RootDirectory
)
return
STATUS_OBJECT_NAME_INVALID
;
else
return
STATUS_OBJECT_PATH_SYNTAX_BAD
;
}
TRACE
(
"(%p,0x%08x,%s)
\n
"
,
handle
,
access
,
debugstr_ObjectAttributes
(
attr
));
if
(
!
handle
)
return
STATUS_ACCESS_VIOLATION
;
if
((
ret
=
validate_open_object_attributes
(
attr
)))
return
ret
;
SERVER_START_REQ
(
open_symlink
)
{
req
->
access
=
DesiredAccess
;
req
->
attributes
=
ObjectAttributes
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
ObjectAttributes
->
RootDirectory
);
if
(
ObjectAttributes
->
ObjectName
)
wine_server_add_data
(
req
,
ObjectAttributes
->
ObjectName
->
Buffer
,
ObjectAttributes
->
ObjectName
->
Length
);
req
->
access
=
access
;
req
->
attributes
=
attr
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
->
RootDirectory
);
if
(
attr
->
ObjectName
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
attr
->
ObjectName
->
Length
);
ret
=
wine_server_call
(
req
);
*
LinkH
andle
=
wine_server_ptr_handle
(
reply
->
handle
);
*
h
andle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
SERVER_END_REQ
;
return
ret
;
...
...
dlls/ntdll/reg.c
View file @
fe092462
...
...
@@ -130,6 +130,8 @@ NTSTATUS WINAPI NtOpenKeyEx( PHANDLE retkey, ACCESS_MASK access, const OBJECT_AT
if
(
!
retkey
||
!
attr
||
!
attr
->
ObjectName
)
return
STATUS_ACCESS_VIOLATION
;
if
(
attr
->
Length
>
sizeof
(
OBJECT_ATTRIBUTES
))
return
STATUS_INVALID_PARAMETER
;
if
((
ret
=
validate_open_object_attributes
(
attr
)))
return
ret
;
TRACE
(
"(%p,%s,%x,%p)
\n
"
,
attr
->
RootDirectory
,
debugstr_us
(
attr
->
ObjectName
),
access
,
retkey
);
if
(
options
)
...
...
dlls/ntdll/sync.c
View file @
fe092462
...
...
@@ -151,6 +151,19 @@ NTSTATUS alloc_object_attributes( const OBJECT_ATTRIBUTES *attr, struct object_a
return
STATUS_SUCCESS
;
}
NTSTATUS
validate_open_object_attributes
(
const
OBJECT_ATTRIBUTES
*
attr
)
{
if
(
!
attr
)
return
STATUS_INVALID_PARAMETER
;
if
(
attr
->
ObjectName
)
{
if
(
attr
->
ObjectName
->
Length
&
(
sizeof
(
WCHAR
)
-
1
))
return
STATUS_OBJECT_NAME_INVALID
;
}
else
if
(
attr
->
RootDirectory
)
return
STATUS_OBJECT_NAME_INVALID
;
return
STATUS_SUCCESS
;
}
/*
* Semaphores
*/
...
...
@@ -191,21 +204,21 @@ NTSTATUS WINAPI NtCreateSemaphore( OUT PHANDLE SemaphoreHandle,
/******************************************************************************
* NtOpenSemaphore (NTDLL.@)
*/
NTSTATUS
WINAPI
NtOpenSemaphore
(
OUT
PHANDLE
SemaphoreHandle
,
IN
ACCESS_MASK
access
,
IN
const
OBJECT_ATTRIBUTES
*
attr
)
NTSTATUS
WINAPI
NtOpenSemaphore
(
HANDLE
*
handle
,
ACCESS_MASK
access
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
DWORD
len
=
attr
&&
attr
->
ObjectName
?
attr
->
ObjectName
->
Length
:
0
;
NTSTATUS
ret
;
if
((
ret
=
validate_open_object_attributes
(
attr
)))
return
ret
;
SERVER_START_REQ
(
open_semaphore
)
{
req
->
access
=
access
;
req
->
attributes
=
(
attr
)
?
attr
->
Attributes
:
0
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
?
attr
->
RootDirectory
:
0
);
if
(
len
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
len
);
req
->
access
=
access
;
req
->
attributes
=
attr
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
->
RootDirectory
);
if
(
attr
->
ObjectName
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
attr
->
ObjectName
->
Length
);
ret
=
wine_server_call
(
req
);
*
SemaphoreH
andle
=
wine_server_ptr_handle
(
reply
->
handle
);
*
h
andle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
SERVER_END_REQ
;
return
ret
;
...
...
@@ -298,22 +311,21 @@ NTSTATUS WINAPI NtCreateEvent( PHANDLE EventHandle, ACCESS_MASK DesiredAccess,
* NtOpenEvent (NTDLL.@)
* ZwOpenEvent (NTDLL.@)
*/
NTSTATUS
WINAPI
NtOpenEvent
(
OUT
PHANDLE
EventHandle
,
IN
ACCESS_MASK
DesiredAccess
,
IN
const
OBJECT_ATTRIBUTES
*
attr
)
NTSTATUS
WINAPI
NtOpenEvent
(
HANDLE
*
handle
,
ACCESS_MASK
access
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
DWORD
len
=
attr
&&
attr
->
ObjectName
?
attr
->
ObjectName
->
Length
:
0
;
NTSTATUS
ret
;
if
((
ret
=
validate_open_object_attributes
(
attr
)))
return
ret
;
SERVER_START_REQ
(
open_event
)
{
req
->
access
=
DesiredAccess
;
req
->
attributes
=
(
attr
)
?
attr
->
Attributes
:
0
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
?
attr
->
RootDirectory
:
0
);
if
(
len
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
len
);
req
->
access
=
access
;
req
->
attributes
=
attr
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
->
RootDirectory
);
if
(
attr
->
ObjectName
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
attr
->
ObjectName
->
Length
);
ret
=
wine_server_call
(
req
);
*
EventH
andle
=
wine_server_ptr_handle
(
reply
->
handle
);
*
h
andle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
SERVER_END_REQ
;
return
ret
;
...
...
@@ -464,21 +476,21 @@ NTSTATUS WINAPI NtCreateMutant(OUT HANDLE* MutantHandle,
* NtOpenMutant [NTDLL.@]
* ZwOpenMutant [NTDLL.@]
*/
NTSTATUS
WINAPI
NtOpenMutant
(
OUT
HANDLE
*
MutantHandle
,
IN
ACCESS_MASK
access
,
IN
const
OBJECT_ATTRIBUTES
*
attr
)
NTSTATUS
WINAPI
NtOpenMutant
(
HANDLE
*
handle
,
ACCESS_MASK
access
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
NTSTATUS
status
;
DWORD
len
=
attr
&&
attr
->
ObjectName
?
attr
->
ObjectName
->
Length
:
0
;
if
((
status
=
validate_open_object_attributes
(
attr
)))
return
status
;
SERVER_START_REQ
(
open_mutex
)
{
req
->
access
=
access
;
req
->
attributes
=
(
attr
)
?
attr
->
Attributes
:
0
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
?
attr
->
RootDirectory
:
0
);
if
(
len
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
len
);
req
->
attributes
=
attr
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
->
RootDirectory
);
if
(
attr
->
ObjectName
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
attr
->
ObjectName
->
Length
);
status
=
wine_server_call
(
req
);
*
MutantH
andle
=
wine_server_ptr_handle
(
reply
->
handle
);
*
h
andle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
SERVER_END_REQ
;
return
status
;
...
...
@@ -550,17 +562,19 @@ NTSTATUS WINAPI NtCreateJobObject( PHANDLE handle, ACCESS_MASK access, const OBJ
* NtOpenJobObject [NTDLL.@]
* ZwOpenJobObject [NTDLL.@]
*/
NTSTATUS
WINAPI
NtOpenJobObject
(
PHANDLE
handle
,
ACCESS_MASK
access
,
const
OBJECT_ATTRIBUTES
*
attr
)
NTSTATUS
WINAPI
NtOpenJobObject
(
HANDLE
*
handle
,
ACCESS_MASK
access
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
DWORD
len
=
attr
&&
attr
->
ObjectName
?
attr
->
ObjectName
->
Length
:
0
;
NTSTATUS
ret
;
if
((
ret
=
validate_open_object_attributes
(
attr
)))
return
ret
;
SERVER_START_REQ
(
open_job
)
{
req
->
access
=
access
;
req
->
attributes
=
attr
?
attr
->
Attributes
:
0
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
?
attr
->
RootDirectory
:
0
);
if
(
len
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
len
);
req
->
access
=
access
;
req
->
attributes
=
attr
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
->
RootDirectory
);
if
(
attr
->
ObjectName
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
attr
->
ObjectName
->
Length
);
ret
=
wine_server_call
(
req
);
*
handle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
...
...
@@ -780,19 +794,19 @@ NTSTATUS WINAPI NtCreateTimer(OUT HANDLE *handle,
* NtOpenTimer [NTDLL.@]
* ZwOpenTimer [NTDLL.@]
*/
NTSTATUS
WINAPI
NtOpenTimer
(
OUT
PHANDLE
handle
,
IN
ACCESS_MASK
access
,
IN
const
OBJECT_ATTRIBUTES
*
attr
)
NTSTATUS
WINAPI
NtOpenTimer
(
HANDLE
*
handle
,
ACCESS_MASK
access
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
DWORD
len
=
(
attr
&&
attr
->
ObjectName
)
?
attr
->
ObjectName
->
Length
:
0
;
NTSTATUS
status
;
NTSTATUS
status
;
if
((
status
=
validate_open_object_attributes
(
attr
)))
return
status
;
SERVER_START_REQ
(
open_timer
)
{
req
->
access
=
access
;
req
->
attributes
=
(
attr
)
?
attr
->
Attributes
:
0
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
?
attr
->
RootDirectory
:
0
);
if
(
len
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
len
);
req
->
access
=
access
;
req
->
attributes
=
attr
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
?
attr
->
RootDirectory
:
0
);
if
(
attr
->
ObjectName
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
attr
->
ObjectName
->
Length
);
status
=
wine_server_call
(
req
);
*
handle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
...
...
@@ -1092,15 +1106,17 @@ NTSTATUS WINAPI NtCreateKeyedEvent( HANDLE *handle, ACCESS_MASK access,
*/
NTSTATUS
WINAPI
NtOpenKeyedEvent
(
HANDLE
*
handle
,
ACCESS_MASK
access
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
DWORD
len
=
attr
&&
attr
->
ObjectName
?
attr
->
ObjectName
->
Length
:
0
;
NTSTATUS
ret
;
if
((
ret
=
validate_open_object_attributes
(
attr
)))
return
ret
;
SERVER_START_REQ
(
open_keyed_event
)
{
req
->
access
=
access
;
req
->
attributes
=
attr
?
attr
->
Attributes
:
0
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
?
attr
->
RootDirectory
:
0
);
if
(
len
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
len
);
req
->
access
=
access
;
req
->
attributes
=
attr
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
->
RootDirectory
);
if
(
attr
->
ObjectName
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
attr
->
ObjectName
->
Length
);
ret
=
wine_server_call
(
req
);
*
handle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
...
...
@@ -1275,24 +1291,22 @@ NTSTATUS WINAPI NtRemoveIoCompletion( HANDLE CompletionPort, PULONG_PTR Completi
* ObjectAttributes [I] completion object name
*
*/
NTSTATUS
WINAPI
NtOpenIoCompletion
(
PHANDLE
CompletionPort
,
ACCESS_MASK
DesiredAccess
,
POBJECT_ATTRIBUTES
ObjectAttributes
)
NTSTATUS
WINAPI
NtOpenIoCompletion
(
HANDLE
*
handle
,
ACCESS_MASK
access
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
NTSTATUS
status
;
TRACE
(
"(%p, 0x%x, %p)
\n
"
,
CompletionPort
,
DesiredAccess
,
ObjectAttributes
);
if
(
!
CompletionPort
||
!
ObjectAttributes
||
!
ObjectAttributes
->
ObjectName
)
return
STATUS_INVALID_PARAMETER
;
if
(
!
handle
)
return
STATUS_INVALID_PARAMETER
;
if
((
status
=
validate_open_object_attributes
(
attr
)))
return
status
;
SERVER_START_REQ
(
open_completion
)
{
req
->
access
=
DesiredAccess
;
req
->
rootdir
=
wine_server_obj_handle
(
ObjectAttributes
->
RootDirectory
);
wine_server_add_data
(
req
,
ObjectAttributes
->
ObjectName
->
Buffer
,
ObjectAttributes
->
ObjectName
->
Length
);
if
(
!
(
status
=
wine_server_call
(
req
)))
*
CompletionPort
=
wine_server_ptr_handle
(
reply
->
handle
);
req
->
access
=
access
;
req
->
attributes
=
attr
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
->
RootDirectory
);
if
(
attr
->
ObjectName
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
attr
->
ObjectName
->
Length
);
status
=
wine_server_call
(
req
);
*
handle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
SERVER_END_REQ
;
return
status
;
...
...
dlls/ntdll/tests/om.c
View file @
fe092462
...
...
@@ -514,52 +514,42 @@ static void test_name_limits(void)
status
=
pNtCreateMutant
(
&
ret
,
GENERIC_ALL
,
&
attr2
,
FALSE
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtCreateMutant failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenMutant
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtOpenMutant failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtCreateSemaphore
(
&
ret
,
GENERIC_ALL
,
&
attr2
,
1
,
2
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtCreateSemaphore failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenSemaphore
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtOpenSemaphore failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtCreateEvent
(
&
ret
,
GENERIC_ALL
,
&
attr2
,
1
,
0
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtCreateEvent failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenEvent
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtOpenEvent failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtCreateKeyedEvent
(
&
ret
,
GENERIC_ALL
,
&
attr2
,
0
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtCreateKeyedEvent failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenKeyedEvent
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtOpenKeyedEvent failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtCreateTimer
(
&
ret
,
GENERIC_ALL
,
&
attr2
,
NotificationTimer
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtCreateTimer failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenTimer
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtOpenTimer failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtCreateIoCompletion
(
&
ret
,
GENERIC_ALL
,
&
attr2
,
0
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtCreateCompletion failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenIoCompletion
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtOpenCompletion failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtCreateJobObject
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtCreateJobObject failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenJobObject
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtOpenJobObject failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtCreateDirectoryObject
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtCreateDirectoryObject failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenDirectoryObject
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtOpenDirectoryObject failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtCreateSymbolicLinkObject
(
&
ret
,
GENERIC_ALL
,
&
attr2
,
&
target
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtCreateSymbolicLinkObject failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenSymbolicLinkObject
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtOpenSymbolicLinkObject failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtCreateSection
(
&
ret
,
SECTION_MAP_WRITE
,
&
attr2
,
&
size
,
PAGE_READWRITE
,
SEC_COMMIT
,
0
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtCreateSection failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenSection
(
&
ret
,
SECTION_MAP_WRITE
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"%u: NtOpenSection failed %x
\n
"
,
str
.
Length
,
status
);
str
.
Length
=
65532
;
...
...
@@ -620,7 +610,6 @@ static void test_name_limits(void)
status
=
pNtCreateSection
(
&
ret
,
SECTION_MAP_WRITE
,
&
attr
,
&
size
,
PAGE_READWRITE
,
SEC_COMMIT
,
0
);
ok
(
status
==
STATUS_SUCCESS
,
"%u: NtCreateSection failed %x
\n
"
,
str
.
Length
,
status
);
status
=
pNtOpenSection
(
&
ret2
,
SECTION_MAP_WRITE
,
&
attr
);
todo_wine
ok
(
status
==
STATUS_SUCCESS
,
"%u: NtOpenSection failed %x
\n
"
,
str
.
Length
,
status
);
pNtClose
(
ret2
);
pNtClose
(
ret
);
...
...
@@ -686,7 +675,6 @@ static void test_name_limits(void)
ok
(
status
==
STATUS_SUCCESS
,
"NULL: NtCreateMutant failed %x
\n
"
,
status
);
pNtClose
(
ret
);
status
=
pNtOpenMutant
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"NULL: NtOpenMutant failed %x
\n
"
,
status
);
status
=
pNtOpenMutant
(
&
ret
,
GENERIC_ALL
,
&
attr3
);
ok
(
status
==
STATUS_OBJECT_PATH_SYNTAX_BAD
,
"NULL: NtOpenMutant failed %x
\n
"
,
status
);
...
...
@@ -696,7 +684,6 @@ static void test_name_limits(void)
ok
(
status
==
STATUS_SUCCESS
,
"NULL: NtCreateSemaphore failed %x
\n
"
,
status
);
pNtClose
(
ret
);
status
=
pNtOpenSemaphore
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"NULL: NtOpenSemaphore failed %x
\n
"
,
status
);
status
=
pNtOpenSemaphore
(
&
ret
,
GENERIC_ALL
,
&
attr3
);
ok
(
status
==
STATUS_OBJECT_PATH_SYNTAX_BAD
,
"NULL: NtOpenSemaphore failed %x
\n
"
,
status
);
...
...
@@ -706,7 +693,6 @@ static void test_name_limits(void)
ok
(
status
==
STATUS_SUCCESS
,
"NULL: NtCreateEvent failed %x
\n
"
,
status
);
pNtClose
(
ret
);
status
=
pNtOpenEvent
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"NULL: NtOpenEvent failed %x
\n
"
,
status
);
status
=
pNtOpenEvent
(
&
ret
,
GENERIC_ALL
,
&
attr3
);
ok
(
status
==
STATUS_OBJECT_PATH_SYNTAX_BAD
,
"NULL: NtOpenEvent failed %x
\n
"
,
status
);
...
...
@@ -716,7 +702,6 @@ static void test_name_limits(void)
ok
(
status
==
STATUS_SUCCESS
,
"NULL: NtCreateKeyedEvent failed %x
\n
"
,
status
);
pNtClose
(
ret
);
status
=
pNtOpenKeyedEvent
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"NULL: NtOpenKeyedEvent failed %x
\n
"
,
status
);
status
=
pNtOpenKeyedEvent
(
&
ret
,
GENERIC_ALL
,
&
attr3
);
ok
(
status
==
STATUS_OBJECT_PATH_SYNTAX_BAD
,
"NULL: NtOpenKeyedEvent failed %x
\n
"
,
status
);
...
...
@@ -726,7 +711,6 @@ static void test_name_limits(void)
ok
(
status
==
STATUS_SUCCESS
,
"NULL: NtCreateTimer failed %x
\n
"
,
status
);
pNtClose
(
ret
);
status
=
pNtOpenTimer
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"NULL: NtOpenTimer failed %x
\n
"
,
status
);
status
=
pNtOpenTimer
(
&
ret
,
GENERIC_ALL
,
&
attr3
);
ok
(
status
==
STATUS_OBJECT_PATH_SYNTAX_BAD
,
"NULL: NtOpenTimer failed %x
\n
"
,
status
);
...
...
@@ -736,10 +720,8 @@ static void test_name_limits(void)
ok
(
status
==
STATUS_SUCCESS
,
"NULL: NtCreateCompletion failed %x
\n
"
,
status
);
pNtClose
(
ret
);
status
=
pNtOpenIoCompletion
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"NULL: NtOpenCompletion failed %x
\n
"
,
status
);
status
=
pNtOpenIoCompletion
(
&
ret
,
GENERIC_ALL
,
&
attr3
);
todo_wine
ok
(
status
==
STATUS_OBJECT_PATH_SYNTAX_BAD
,
"NULL: NtOpenCompletion failed %x
\n
"
,
status
);
status
=
pNtCreateJobObject
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"NULL: NtCreateJobObject failed %x
\n
"
,
status
);
...
...
@@ -747,7 +729,6 @@ static void test_name_limits(void)
ok
(
status
==
STATUS_SUCCESS
,
"NULL: NtCreateJobObject failed %x
\n
"
,
status
);
pNtClose
(
ret
);
status
=
pNtOpenJobObject
(
&
ret
,
GENERIC_ALL
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"NULL: NtOpenJobObject failed %x
\n
"
,
status
);
status
=
pNtOpenJobObject
(
&
ret
,
GENERIC_ALL
,
&
attr3
);
ok
(
status
==
STATUS_OBJECT_PATH_SYNTAX_BAD
,
"NULL: NtOpenJobObject failed %x
\n
"
,
status
);
...
...
@@ -775,7 +756,6 @@ static void test_name_limits(void)
ok
(
status
==
STATUS_SUCCESS
,
"NULL: NtCreateSection failed %x
\n
"
,
status
);
pNtClose
(
ret
);
status
=
pNtOpenSection
(
&
ret
,
SECTION_MAP_WRITE
,
&
attr2
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
,
"NULL: NtOpenSection failed %x
\n
"
,
status
);
status
=
pNtOpenSection
(
&
ret
,
SECTION_MAP_WRITE
,
&
attr3
);
ok
(
status
==
STATUS_OBJECT_PATH_SYNTAX_BAD
,
"NULL: NtOpenSection failed %x
\n
"
,
status
);
...
...
@@ -898,7 +878,6 @@ static void test_name_limits(void)
pNtClose
(
ret
);
}
status
=
pNtOpenKey
(
&
ret
,
GENERIC_ALL
,
&
attr
);
todo_wine
ok
(
status
==
STATUS_OBJECT_NAME_INVALID
||
status
==
STATUS_INVALID_PARAMETER
||
broken
(
status
==
STATUS_OBJECT_NAME_NOT_FOUND
),
/* wow64 */
...
...
dlls/ntdll/virtual.c
View file @
fe092462
...
...
@@ -2498,17 +2498,18 @@ NTSTATUS WINAPI NtCreateSection( HANDLE *handle, ACCESS_MASK access, const OBJEC
NTSTATUS
WINAPI
NtOpenSection
(
HANDLE
*
handle
,
ACCESS_MASK
access
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
NTSTATUS
ret
;
DWORD
len
=
(
attr
&&
attr
->
ObjectName
)
?
attr
->
ObjectName
->
Length
:
0
;
if
(
len
>
MAX_PATH
*
sizeof
(
WCHAR
))
return
STATUS_NAME_TOO_LONG
;
if
(
(
ret
=
validate_open_object_attributes
(
attr
)))
return
ret
;
SERVER_START_REQ
(
open_mapping
)
{
req
->
access
=
access
;
req
->
access
=
access
;
req
->
attributes
=
attr
->
Attributes
;
req
->
rootdir
=
wine_server_obj_handle
(
attr
->
RootDirectory
);
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
len
);
if
(
!
(
ret
=
wine_server_call
(
req
)))
*
handle
=
wine_server_ptr_handle
(
reply
->
handle
);
req
->
rootdir
=
wine_server_obj_handle
(
attr
->
RootDirectory
);
if
(
attr
->
ObjectName
)
wine_server_add_data
(
req
,
attr
->
ObjectName
->
Buffer
,
attr
->
ObjectName
->
Length
);
ret
=
wine_server_call
(
req
);
*
handle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
SERVER_END_REQ
;
return
ret
;
...
...
include/winternl.h
View file @
fe092462
...
...
@@ -2191,11 +2191,11 @@ NTSYSAPI NTSTATUS WINAPI NtMapViewOfSection(HANDLE,HANDLE,PVOID*,ULONG,SIZE_T,c
NTSYSAPI
NTSTATUS
WINAPI
NtNotifyChangeDirectoryFile
(
HANDLE
,
HANDLE
,
PIO_APC_ROUTINE
,
PVOID
,
PIO_STATUS_BLOCK
,
PVOID
,
ULONG
,
ULONG
,
BOOLEAN
);
NTSYSAPI
NTSTATUS
WINAPI
NtNotifyChangeKey
(
HANDLE
,
HANDLE
,
PIO_APC_ROUTINE
,
PVOID
,
PIO_STATUS_BLOCK
,
ULONG
,
BOOLEAN
,
PVOID
,
ULONG
,
BOOLEAN
);
NTSYSAPI
NTSTATUS
WINAPI
NtNotifyChangeMultipleKeys
(
HANDLE
,
ULONG
,
OBJECT_ATTRIBUTES
*
,
HANDLE
,
PIO_APC_ROUTINE
,
PVOID
,
PIO_STATUS_BLOCK
,
ULONG
,
BOOLEAN
,
PVOID
,
ULONG
,
BOOLEAN
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenDirectoryObject
(
PHANDLE
,
ACCESS_MASK
,
POBJECT_ATTRIBUTES
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenDirectoryObject
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenEvent
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenEventPair
(
PHANDLE
,
ACCESS_MASK
,
POBJECT_ATTRIBUTES
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenEventPair
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenFile
(
PHANDLE
,
ACCESS_MASK
,
POBJECT_ATTRIBUTES
,
PIO_STATUS_BLOCK
,
ULONG
,
ULONG
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenIoCompletion
(
PHANDLE
,
ACCESS_MASK
,
POBJECT_ATTRIBUTES
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenIoCompletion
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenJobObject
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenKey
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenKeyEx
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
,
ULONG
);
...
...
@@ -2209,7 +2209,7 @@ NTSYSAPI NTSTATUS WINAPI NtOpenProcessToken(HANDLE,DWORD,HANDLE *);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenProcessTokenEx
(
HANDLE
,
DWORD
,
DWORD
,
HANDLE
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenSection
(
HANDLE
*
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenSemaphore
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenSymbolicLinkObject
(
PHANDLE
,
ACCESS_MASK
,
POBJECT_ATTRIBUTES
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenSymbolicLinkObject
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenThread
(
HANDLE
*
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
,
const
CLIENT_ID
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenThreadToken
(
HANDLE
,
DWORD
,
BOOLEAN
,
HANDLE
*
);
NTSYSAPI
NTSTATUS
WINAPI
NtOpenThreadTokenEx
(
HANDLE
,
DWORD
,
BOOLEAN
,
DWORD
,
HANDLE
*
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment