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
a510a7e1
Commit
a510a7e1
authored
Dec 12, 2005
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
server: Added access rights mapping to file objects.
parent
46d1b3e8
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
170 additions
and
63 deletions
+170
-63
sync.c
dlls/kernel/tests/sync.c
+0
-2
server.c
dlls/ntdll/server.c
+5
-0
directory.c
server/directory.c
+11
-1
fd.c
server/fd.c
+5
-5
file.c
server/file.c
+29
-15
file.h
server/file.h
+6
-0
mailslot.c
server/mailslot.c
+35
-13
mapping.c
server/mapping.c
+14
-4
named_pipe.c
server/named_pipe.c
+26
-4
object.c
server/object.c
+5
-1
process.c
server/process.c
+3
-3
registry.c
server/registry.c
+2
-2
serial.c
server/serial.c
+11
-1
sock.c
server/sock.c
+18
-12
No files found.
dlls/kernel/tests/sync.c
View file @
a510a7e1
...
...
@@ -109,9 +109,7 @@ static void test_signalandwait(void)
FILE_ATTRIBUTE_NORMAL
|
FILE_FLAG_DELETE_ON_CLOSE
,
NULL
);
r
=
pSignalObjectAndWait
(
file
,
file
,
0
,
FALSE
);
ok
(
r
==
WAIT_FAILED
,
"should fail
\n
"
);
todo_wine
{
ok
(
ERROR_INVALID_HANDLE
==
GetLastError
(),
"should return invalid handle error
\n
"
);
}
CloseHandle
(
file
);
}
...
...
dlls/ntdll/server.c
View file @
a510a7e1
...
...
@@ -484,6 +484,11 @@ int wine_server_handle_to_fd( obj_handle_t handle, unsigned int access, int *uni
obj_handle_t
fd_handle
;
int
ret
,
removable
=
-
1
,
fd
=
-
1
;
/* FIXME: callers should be fixed to pass the appropriate specific rights */
if
(
access
&
GENERIC_READ
)
access
|=
FILE_READ_DATA
;
if
(
access
&
GENERIC_WRITE
)
access
|=
FILE_WRITE_DATA
;
access
&=
~
(
GENERIC_READ
|
GENERIC_WRITE
);
RtlEnterCriticalSection
(
&
fd_cache_section
);
*
unix_fd
=
-
1
;
...
...
server/directory.c
View file @
a510a7e1
...
...
@@ -48,6 +48,7 @@ struct directory
};
static
void
directory_dump
(
struct
object
*
obj
,
int
verbose
);
static
unsigned
int
directory_map_access
(
struct
object
*
obj
,
unsigned
int
access
);
static
struct
object
*
directory_lookup_name
(
struct
object
*
obj
,
struct
unicode_str
*
name
,
unsigned
int
attr
);
static
void
directory_destroy
(
struct
object
*
obj
);
...
...
@@ -62,7 +63,7 @@ static const struct object_ops directory_ops =
NULL
,
/* satisfied */
no_signal
,
/* signal */
no_get_fd
,
/* get_fd */
no_map_access
,
/* map_access */
directory_map_access
,
/* map_access */
directory_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
directory_destroy
/* destroy */
...
...
@@ -121,6 +122,15 @@ static struct object *directory_lookup_name( struct object *obj, struct unicode_
return
NULL
;
}
static
unsigned
int
directory_map_access
(
struct
object
*
obj
,
unsigned
int
access
)
{
if
(
access
&
GENERIC_READ
)
access
|=
FILE_GENERIC_READ
;
if
(
access
&
GENERIC_WRITE
)
access
|=
FILE_GENERIC_WRITE
;
if
(
access
&
GENERIC_EXECUTE
)
access
|=
FILE_GENERIC_EXECUTE
;
if
(
access
&
GENERIC_ALL
)
access
|=
FILE_ALL_ACCESS
;
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
static
void
directory_destroy
(
struct
object
*
obj
)
{
struct
directory
*
dir
=
(
struct
directory
*
)
obj
;
...
...
server/fd.c
View file @
a510a7e1
...
...
@@ -142,7 +142,7 @@ struct fd
struct
closed_fd
*
closed
;
/* structure to store the unix fd at destroy time */
struct
object
*
user
;
/* object using this file descriptor */
struct
list
locks
;
/* list of locks on this fd */
unsigned
int
access
;
/* file access (
GENERIC_READ/WRITE
) */
unsigned
int
access
;
/* file access (
FILE_READ_DATA etc.
) */
unsigned
int
sharing
;
/* file sharing mode */
int
unix_fd
;
/* unix file descriptor */
int
fs_locks
:
1
;
/* can we use filesystem locks for this fd? */
...
...
@@ -1302,10 +1302,10 @@ static int check_sharing( struct fd *fd, unsigned int access, unsigned int shari
}
}
if
((
access
&
GENERIC_READ
)
&&
!
(
existing_sharing
&
FILE_SHARE_READ
))
return
0
;
if
((
access
&
GENERIC_WRITE
)
&&
!
(
existing_sharing
&
FILE_SHARE_WRITE
))
return
0
;
if
((
existing_access
&
GENERIC_READ
)
&&
!
(
sharing
&
FILE_SHARE_READ
))
return
0
;
if
((
existing_access
&
GENERIC_WRITE
)
&&
!
(
sharing
&
FILE_SHARE_WRITE
))
return
0
;
if
((
access
&
FILE_UNIX_READ_ACCESS
)
&&
!
(
existing_sharing
&
FILE_SHARE_READ
))
return
0
;
if
((
access
&
FILE_UNIX_WRITE_ACCESS
)
&&
!
(
existing_sharing
&
FILE_SHARE_WRITE
))
return
0
;
if
((
existing_access
&
FILE_UNIX_READ_ACCESS
)
&&
!
(
sharing
&
FILE_SHARE_READ
))
return
0
;
if
((
existing_access
&
FILE_UNIX_WRITE_ACCESS
)
&&
!
(
sharing
&
FILE_SHARE_WRITE
))
return
0
;
if
(
fd
->
closed
->
unlink
[
0
]
&&
!
(
existing_sharing
&
FILE_SHARE_DELETE
))
return
0
;
if
(
unlink
&&
!
(
sharing
&
FILE_SHARE_DELETE
))
return
0
;
return
1
;
...
...
server/file.c
View file @
a510a7e1
...
...
@@ -57,12 +57,13 @@ struct file
{
struct
object
obj
;
/* object header */
struct
fd
*
fd
;
/* file descriptor for this file */
unsigned
int
access
;
/* file access (
GENERIC_READ/WRITE
) */
unsigned
int
access
;
/* file access (
FILE_READ_DATA etc.
) */
unsigned
int
options
;
/* file options (FILE_DELETE_ON_CLOSE, FILE_SYNCHRONOUS...) */
};
static
void
file_dump
(
struct
object
*
obj
,
int
verbose
);
static
struct
fd
*
file_get_fd
(
struct
object
*
obj
);
static
unsigned
int
file_map_access
(
struct
object
*
obj
,
unsigned
int
access
);
static
void
file_destroy
(
struct
object
*
obj
);
static
int
file_get_poll_events
(
struct
fd
*
fd
);
...
...
@@ -79,7 +80,7 @@ static const struct object_ops file_ops =
no_satisfied
,
/* satisfied */
no_signal
,
/* signal */
file_get_fd
,
/* get_fd */
no_map_access
,
/* map_access */
file_map_access
,
/* map_access */
no_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
file_destroy
/* destroy */
...
...
@@ -108,7 +109,7 @@ static struct file *create_file_for_fd( int fd, unsigned int access, unsigned in
if
((
file
=
alloc_object
(
&
file_ops
)))
{
file
->
access
=
access
;
file
->
access
=
file_map_access
(
&
file
->
obj
,
access
)
;
file
->
options
=
FILE_SYNCHRONOUS_IO_NONALERT
;
if
(
!
(
file
->
fd
=
create_anonymous_fd
(
&
file_fd_ops
,
fd
,
&
file
->
obj
)))
{
...
...
@@ -125,7 +126,7 @@ static struct object *create_file( const char *nameptr, size_t len, unsigned int
unsigned
int
attrs
)
{
struct
file
*
file
;
int
flags
;
int
flags
,
rw_mode
;
char
*
name
;
mode_t
mode
;
...
...
@@ -144,13 +145,6 @@ static struct object *create_file( const char *nameptr, size_t len, unsigned int
default:
set_error
(
STATUS_INVALID_PARAMETER
);
goto
error
;
}
switch
(
access
&
(
GENERIC_READ
|
GENERIC_WRITE
))
{
case
0
:
break
;
case
GENERIC_READ
:
flags
|=
O_RDONLY
;
break
;
case
GENERIC_WRITE
:
flags
|=
O_WRONLY
;
break
;
case
GENERIC_READ
|
GENERIC_WRITE
:
flags
|=
O_RDWR
;
break
;
}
mode
=
(
attrs
&
FILE_ATTRIBUTE_READONLY
)
?
0444
:
0666
;
if
(
len
>=
4
&&
...
...
@@ -159,13 +153,24 @@ static struct object *create_file( const char *nameptr, size_t len, unsigned int
if
(
!
(
file
=
alloc_object
(
&
file_ops
)))
goto
error
;
file
->
access
=
access
;
file
->
access
=
file_map_access
(
&
file
->
obj
,
access
)
;
file
->
options
=
options
;
rw_mode
=
0
;
if
(
file
->
access
&
FILE_UNIX_READ_ACCESS
)
rw_mode
|=
FILE_READ_DATA
;
if
(
file
->
access
&
FILE_UNIX_WRITE_ACCESS
)
rw_mode
|=
FILE_WRITE_DATA
;
switch
(
rw_mode
)
{
case
0
:
break
;
case
FILE_READ_DATA
:
flags
|=
O_RDONLY
;
break
;
case
FILE_WRITE_DATA
:
flags
|=
O_WRONLY
;
break
;
case
FILE_READ_DATA
|
FILE_WRITE_DATA
:
flags
|=
O_RDWR
;
break
;
}
/* FIXME: should set error to STATUS_OBJECT_NAME_COLLISION if file existed before */
if
(
!
(
file
->
fd
=
alloc_fd
(
&
file_fd_ops
,
&
file
->
obj
))
||
!
(
file
->
fd
=
open_fd
(
file
->
fd
,
name
,
flags
|
O_NONBLOCK
|
O_LARGEFILE
,
&
mode
,
access
,
sharing
,
options
)))
&
mode
,
file
->
access
,
sharing
,
options
)))
{
free
(
name
);
release_object
(
file
);
...
...
@@ -223,8 +228,8 @@ static int file_get_poll_events( struct fd *fd )
struct
file
*
file
=
get_fd_user
(
fd
);
int
events
=
0
;
assert
(
file
->
obj
.
ops
==
&
file_ops
);
if
(
file
->
access
&
GENERIC_READ
)
events
|=
POLLIN
;
if
(
file
->
access
&
GENERIC_WRITE
)
events
|=
POLLOUT
;
if
(
file
->
access
&
FILE_UNIX_READ_ACCESS
)
events
|=
POLLIN
;
if
(
file
->
access
&
FILE_UNIX_WRITE_ACCESS
)
events
|=
POLLOUT
;
return
events
;
}
...
...
@@ -255,6 +260,15 @@ static struct fd *file_get_fd( struct object *obj )
return
(
struct
fd
*
)
grab_object
(
file
->
fd
);
}
static
unsigned
int
file_map_access
(
struct
object
*
obj
,
unsigned
int
access
)
{
if
(
access
&
GENERIC_READ
)
access
|=
FILE_GENERIC_READ
;
if
(
access
&
GENERIC_WRITE
)
access
|=
FILE_GENERIC_WRITE
;
if
(
access
&
GENERIC_EXECUTE
)
access
|=
FILE_GENERIC_EXECUTE
;
if
(
access
&
GENERIC_ALL
)
access
|=
FILE_ALL_ACCESS
;
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
static
void
file_destroy
(
struct
object
*
obj
)
{
struct
file
*
file
=
(
struct
file
*
)
obj
;
...
...
server/file.h
View file @
a510a7e1
...
...
@@ -125,4 +125,10 @@ static inline void async_terminate_queue( struct list *queue, int status )
while
(
!
list_empty
(
queue
))
async_terminate_head
(
queue
,
status
);
}
/* access rights that require Unix read permission */
#define FILE_UNIX_READ_ACCESS (FILE_READ_DATA|FILE_READ_ATTRIBUTES|FILE_READ_EA)
/* access rights that require Unix write permission */
#define FILE_UNIX_WRITE_ACCESS (FILE_WRITE_DATA|FILE_WRITE_ATTRIBUTES|FILE_WRITE_EA)
#endif
/* __WINE_SERVER_FILE_H */
server/mailslot.c
View file @
a510a7e1
...
...
@@ -62,16 +62,10 @@ struct mailslot
struct
list
writers
;
};
struct
mailslot_device
{
struct
object
obj
;
/* object header */
struct
fd
*
fd
;
/* pseudo-fd for ioctls */
struct
namespace
*
mailslots
;
/* mailslot namespace */
};
/* mailslot functions */
static
void
mailslot_dump
(
struct
object
*
,
int
);
static
struct
fd
*
mailslot_get_fd
(
struct
object
*
);
static
unsigned
int
mailslot_map_access
(
struct
object
*
obj
,
unsigned
int
access
);
static
void
mailslot_destroy
(
struct
object
*
);
static
const
struct
object_ops
mailslot_ops
=
...
...
@@ -84,7 +78,7 @@ static const struct object_ops mailslot_ops =
no_satisfied
,
/* satisfied */
no_signal
,
/* signal */
mailslot_get_fd
,
/* get_fd */
no_map_access
,
/* map_access */
mailslot_map_access
,
/* map_access */
no_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
mailslot_destroy
/* destroy */
...
...
@@ -103,17 +97,19 @@ static const struct fd_ops mailslot_fd_ops =
default_fd_cancel_async
/* cancel_async */
};
struct
mail_writer
{
struct
object
obj
;
struct
mailslot
*
mailslot
;
struct
list
entry
;
int
access
;
int
sharing
;
unsigned
int
access
;
unsigned
int
sharing
;
};
static
void
mail_writer_dump
(
struct
object
*
obj
,
int
verbose
);
static
struct
fd
*
mail_writer_get_fd
(
struct
object
*
obj
);
static
unsigned
int
mail_writer_map_access
(
struct
object
*
obj
,
unsigned
int
access
);
static
void
mail_writer_destroy
(
struct
object
*
obj
);
static
const
struct
object_ops
mail_writer_ops
=
...
...
@@ -126,7 +122,7 @@ static const struct object_ops mail_writer_ops =
NULL
,
/* satisfied */
no_signal
,
/* signal */
mail_writer_get_fd
,
/* get_fd */
no_map_access
,
/* map_access */
mail_writer_map_access
,
/* map_access */
no_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
mail_writer_destroy
/* destroy */
...
...
@@ -144,6 +140,14 @@ static const struct fd_ops mail_writer_fd_ops =
NULL
/* cancel_async */
};
struct
mailslot_device
{
struct
object
obj
;
/* object header */
struct
fd
*
fd
;
/* pseudo-fd for ioctls */
struct
namespace
*
mailslots
;
/* mailslot namespace */
};
static
void
mailslot_device_dump
(
struct
object
*
obj
,
int
verbose
);
static
struct
fd
*
mailslot_device_get_fd
(
struct
object
*
obj
);
static
struct
object
*
mailslot_device_lookup_name
(
struct
object
*
obj
,
struct
unicode_str
*
name
,
...
...
@@ -231,6 +235,15 @@ static struct fd *mailslot_get_fd( struct object *obj )
return
(
struct
fd
*
)
grab_object
(
mailslot
->
fd
);
}
static
unsigned
int
mailslot_map_access
(
struct
object
*
obj
,
unsigned
int
access
)
{
if
(
access
&
GENERIC_READ
)
access
|=
FILE_GENERIC_READ
;
if
(
access
&
GENERIC_WRITE
)
access
|=
FILE_GENERIC_WRITE
;
if
(
access
&
GENERIC_EXECUTE
)
access
|=
FILE_GENERIC_EXECUTE
;
if
(
access
&
GENERIC_ALL
)
access
|=
FILE_ALL_ACCESS
;
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
static
void
mailslot_queue_async
(
struct
fd
*
fd
,
void
*
apc
,
void
*
user
,
void
*
iosb
,
int
type
,
int
count
)
{
...
...
@@ -396,6 +409,15 @@ static struct fd *mail_writer_get_fd( struct object *obj )
return
(
struct
fd
*
)
grab_object
(
writer
->
mailslot
->
write_fd
);
}
static
unsigned
int
mail_writer_map_access
(
struct
object
*
obj
,
unsigned
int
access
)
{
if
(
access
&
GENERIC_READ
)
access
|=
FILE_GENERIC_READ
;
if
(
access
&
GENERIC_WRITE
)
access
|=
FILE_GENERIC_WRITE
;
if
(
access
&
GENERIC_EXECUTE
)
access
|=
FILE_GENERIC_EXECUTE
;
if
(
access
&
GENERIC_ALL
)
access
|=
FILE_ALL_ACCESS
;
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
/*
* Readers and writers cannot be mixed.
* If there's more than one writer, all writers must open with FILE_SHARE_WRITE
...
...
@@ -409,7 +431,7 @@ static struct mail_writer *create_mail_writer( struct mailslot *mailslot, unsign
{
writer
=
LIST_ENTRY
(
list_head
(
&
mailslot
->
writers
),
struct
mail_writer
,
entry
);
if
(((
access
&
GENERIC_WRITE
)
||
(
writer
->
access
&
GENERIC_WRITE
))
&&
if
(((
access
&
(
GENERIC_WRITE
|
FILE_WRITE_DATA
))
||
(
writer
->
access
&
FILE_WRITE_DATA
))
&&
!
((
sharing
&
FILE_SHARE_WRITE
)
&&
(
writer
->
sharing
&
FILE_SHARE_WRITE
)))
{
set_error
(
STATUS_SHARING_VIOLATION
);
...
...
@@ -423,7 +445,7 @@ static struct mail_writer *create_mail_writer( struct mailslot *mailslot, unsign
grab_object
(
mailslot
);
writer
->
mailslot
=
mailslot
;
writer
->
access
=
access
;
writer
->
access
=
mail_writer_map_access
(
&
writer
->
obj
,
access
)
;
writer
->
sharing
=
sharing
;
list_add_head
(
&
mailslot
->
writers
,
&
writer
->
entry
);
...
...
server/mapping.c
View file @
a510a7e1
...
...
@@ -53,6 +53,7 @@ struct mapping
static
void
mapping_dump
(
struct
object
*
obj
,
int
verbose
);
static
struct
fd
*
mapping_get_fd
(
struct
object
*
obj
);
static
unsigned
int
mapping_map_access
(
struct
object
*
obj
,
unsigned
int
access
);
static
void
mapping_destroy
(
struct
object
*
obj
);
static
const
struct
object_ops
mapping_ops
=
...
...
@@ -65,7 +66,7 @@ static const struct object_ops mapping_ops =
NULL
,
/* satisfied */
no_signal
,
/* signal */
mapping_get_fd
,
/* get_fd */
no_map_access
,
/* map_access */
mapping_map_access
,
/* map_access */
no_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
mapping_destroy
/* destroy */
...
...
@@ -164,7 +165,7 @@ static int build_shared_mapping( struct mapping *mapping, int fd,
/* create a temp file for the mapping */
if
(
!
(
mapping
->
shared_file
=
create_temp_file
(
GENERIC_READ
|
GENERIC_WRITE
)))
return
0
;
if
(
!
(
mapping
->
shared_file
=
create_temp_file
(
FILE_GENERIC_READ
|
FILE_
GENERIC_WRITE
)))
return
0
;
if
(
!
grow_file
(
mapping
->
shared_file
,
total_size
))
goto
error
;
if
((
shared_fd
=
get_file_unix_fd
(
mapping
->
shared_file
))
==
-
1
)
goto
error
;
...
...
@@ -293,8 +294,8 @@ static struct object *create_mapping( struct directory *root, const struct unico
mapping
->
shared_file
=
NULL
;
mapping
->
shared_size
=
0
;
if
(
protect
&
VPROT_READ
)
access
|=
GENERIC_READ
;
if
(
protect
&
VPROT_WRITE
)
access
|=
GENERIC_WRITE
;
if
(
protect
&
VPROT_READ
)
access
|=
FILE_READ_DATA
;
if
(
protect
&
VPROT_WRITE
)
access
|=
FILE_WRITE_DATA
;
if
(
handle
)
{
...
...
@@ -357,6 +358,15 @@ static struct fd *mapping_get_fd( struct object *obj )
return
get_obj_fd
(
(
struct
object
*
)
mapping
->
file
);
}
static
unsigned
int
mapping_map_access
(
struct
object
*
obj
,
unsigned
int
access
)
{
if
(
access
&
GENERIC_READ
)
access
|=
STANDARD_RIGHTS_READ
|
SECTION_QUERY
|
SECTION_MAP_READ
;
if
(
access
&
GENERIC_WRITE
)
access
|=
STANDARD_RIGHTS_WRITE
|
SECTION_MAP_WRITE
;
if
(
access
&
GENERIC_EXECUTE
)
access
|=
STANDARD_RIGHTS_EXECUTE
|
SECTION_MAP_EXECUTE
;
if
(
access
&
GENERIC_ALL
)
access
|=
SECTION_ALL_ACCESS
;
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
static
void
mapping_destroy
(
struct
object
*
obj
)
{
struct
mapping
*
mapping
=
(
struct
mapping
*
)
obj
;
...
...
server/named_pipe.c
View file @
a510a7e1
...
...
@@ -107,6 +107,7 @@ struct named_pipe_device
};
static
void
named_pipe_dump
(
struct
object
*
obj
,
int
verbose
);
static
unsigned
int
named_pipe_map_access
(
struct
object
*
obj
,
unsigned
int
access
);
static
void
named_pipe_destroy
(
struct
object
*
obj
);
static
const
struct
object_ops
named_pipe_ops
=
...
...
@@ -119,12 +120,15 @@ static const struct object_ops named_pipe_ops =
NULL
,
/* satisfied */
no_signal
,
/* signal */
no_get_fd
,
/* get_fd */
n
o_map_access
,
/* map_access */
n
amed_pipe_map_access
,
/* map_access */
no_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
named_pipe_destroy
/* destroy */
};
/* functions common to server and client */
static
unsigned
int
pipe_map_access
(
struct
object
*
obj
,
unsigned
int
access
);
/* server end functions */
static
void
pipe_server_dump
(
struct
object
*
obj
,
int
verbose
);
static
struct
fd
*
pipe_server_get_fd
(
struct
object
*
obj
);
...
...
@@ -142,7 +146,7 @@ static const struct object_ops pipe_server_ops =
no_satisfied
,
/* satisfied */
no_signal
,
/* signal */
pipe_server_get_fd
,
/* get_fd */
no_map_access
,
/* map_access */
pipe_map_access
,
/* map_access */
no_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
pipe_server_destroy
/* destroy */
...
...
@@ -175,7 +179,7 @@ static const struct object_ops pipe_client_ops =
no_satisfied
,
/* satisfied */
no_signal
,
/* signal */
pipe_client_get_fd
,
/* get_fd */
no_map_access
,
/* map_access */
pipe_map_access
,
/* map_access */
no_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
pipe_client_destroy
/* destroy */
...
...
@@ -207,7 +211,7 @@ static const struct object_ops named_pipe_device_ops =
no_satisfied
,
/* satisfied */
no_signal
,
/* signal */
named_pipe_device_get_fd
,
/* get_fd */
no_map_access
,
/* map_access */
pipe_map_access
,
/* map_access */
named_pipe_device_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
named_pipe_device_destroy
/* destroy */
...
...
@@ -232,6 +236,15 @@ static void named_pipe_dump( struct object *obj, int verbose )
fprintf
(
stderr
,
"
\n
"
);
}
static
unsigned
int
named_pipe_map_access
(
struct
object
*
obj
,
unsigned
int
access
)
{
if
(
access
&
GENERIC_READ
)
access
|=
STANDARD_RIGHTS_READ
;
if
(
access
&
GENERIC_WRITE
)
access
|=
STANDARD_RIGHTS_WRITE
|
FILE_CREATE_PIPE_INSTANCE
;
if
(
access
&
GENERIC_EXECUTE
)
access
|=
STANDARD_RIGHTS_EXECUTE
;
if
(
access
&
GENERIC_ALL
)
access
|=
STANDARD_RIGHTS_ALL
;
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
static
void
pipe_server_dump
(
struct
object
*
obj
,
int
verbose
)
{
struct
pipe_server
*
server
=
(
struct
pipe_server
*
)
obj
;
...
...
@@ -317,6 +330,15 @@ static void do_disconnect( struct pipe_server *server )
server
->
fd
=
NULL
;
}
static
unsigned
int
pipe_map_access
(
struct
object
*
obj
,
unsigned
int
access
)
{
if
(
access
&
GENERIC_READ
)
access
|=
FILE_GENERIC_READ
;
if
(
access
&
GENERIC_WRITE
)
access
|=
FILE_GENERIC_WRITE
;
if
(
access
&
GENERIC_EXECUTE
)
access
|=
FILE_GENERIC_EXECUTE
;
if
(
access
&
GENERIC_ALL
)
access
|=
FILE_ALL_ACCESS
;
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
static
void
pipe_server_destroy
(
struct
object
*
obj
)
{
struct
pipe_server
*
server
=
(
struct
pipe_server
*
)
obj
;
...
...
server/object.c
View file @
a510a7e1
...
...
@@ -314,7 +314,11 @@ struct fd *no_get_fd( struct object *obj )
unsigned
int
no_map_access
(
struct
object
*
obj
,
unsigned
int
access
)
{
return
access
;
if
(
access
&
GENERIC_READ
)
access
|=
STANDARD_RIGHTS_READ
;
if
(
access
&
GENERIC_WRITE
)
access
|=
STANDARD_RIGHTS_WRITE
;
if
(
access
&
GENERIC_EXECUTE
)
access
|=
STANDARD_RIGHTS_EXECUTE
;
if
(
access
&
GENERIC_ALL
)
access
|=
STANDARD_RIGHTS_ALL
;
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
struct
object
*
no_lookup_name
(
struct
object
*
obj
,
struct
unicode_str
*
name
,
...
...
server/process.c
View file @
a510a7e1
...
...
@@ -900,7 +900,7 @@ DECL_HANDLER(new_process)
info
->
data
=
NULL
;
if
(
req
->
exe_file
&&
!
(
info
->
exe_file
=
get_file_obj
(
current
->
process
,
req
->
exe_file
,
GENERIC_READ
)))
!
(
info
->
exe_file
=
get_file_obj
(
current
->
process
,
req
->
exe_file
,
FILE_READ_DATA
)))
goto
done
;
if
(
!
(
info
->
data
=
memdup
(
get_req_data
(),
info
->
data_size
)))
goto
done
;
...
...
@@ -999,7 +999,7 @@ DECL_HANDLER(init_process_done)
process
->
exe
.
size
=
req
->
module_size
;
process
->
exe
.
name
=
req
->
name
;
if
(
req
->
exe_file
)
file
=
get_file_obj
(
process
,
req
->
exe_file
,
GENERIC_READ
);
if
(
req
->
exe_file
)
file
=
get_file_obj
(
process
,
req
->
exe_file
,
FILE_READ_DATA
);
if
(
process
->
exe
.
file
)
release_object
(
process
->
exe
.
file
);
process
->
exe
.
file
=
file
;
...
...
@@ -1126,7 +1126,7 @@ DECL_HANDLER(load_dll)
struct
process_dll
*
dll
;
struct
file
*
file
=
NULL
;
if
(
req
->
handle
&&
!
(
file
=
get_file_obj
(
current
->
process
,
req
->
handle
,
GENERIC_READ
)))
if
(
req
->
handle
&&
!
(
file
=
get_file_obj
(
current
->
process
,
req
->
handle
,
FILE_READ_DATA
)))
return
;
if
((
dll
=
process_load_dll
(
current
->
process
,
file
,
req
->
base
,
...
...
server/registry.c
View file @
a510a7e1
...
...
@@ -1408,7 +1408,7 @@ static void load_registry( struct key *key, obj_handle_t handle )
struct
file
*
file
;
int
fd
;
if
(
!
(
file
=
get_file_obj
(
current
->
process
,
handle
,
GENERIC_READ
)))
return
;
if
(
!
(
file
=
get_file_obj
(
current
->
process
,
handle
,
FILE_READ_DATA
)))
return
;
fd
=
dup
(
get_file_unix_fd
(
file
)
);
release_object
(
file
);
if
(
fd
!=
-
1
)
...
...
@@ -1550,7 +1550,7 @@ static void save_registry( struct key *key, obj_handle_t handle )
set_error
(
STATUS_KEY_DELETED
);
return
;
}
if
(
!
(
file
=
get_file_obj
(
current
->
process
,
handle
,
GENERIC_WRITE
)))
return
;
if
(
!
(
file
=
get_file_obj
(
current
->
process
,
handle
,
FILE_WRITE_DATA
)))
return
;
fd
=
dup
(
get_file_unix_fd
(
file
)
);
release_object
(
file
);
if
(
fd
!=
-
1
)
...
...
server/serial.c
View file @
a510a7e1
...
...
@@ -58,6 +58,7 @@
static
void
serial_dump
(
struct
object
*
obj
,
int
verbose
);
static
struct
fd
*
serial_get_fd
(
struct
object
*
obj
);
static
unsigned
int
serial_map_access
(
struct
object
*
obj
,
unsigned
int
access
);
static
void
serial_destroy
(
struct
object
*
obj
);
static
int
serial_get_poll_events
(
struct
fd
*
fd
);
...
...
@@ -102,7 +103,7 @@ static const struct object_ops serial_ops =
no_satisfied
,
/* satisfied */
no_signal
,
/* signal */
serial_get_fd
,
/* get_fd */
no_map_access
,
/* map_access */
serial_map_access
,
/* map_access */
no_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
serial_destroy
/* destroy */
...
...
@@ -168,6 +169,15 @@ static struct fd *serial_get_fd( struct object *obj )
return
(
struct
fd
*
)
grab_object
(
serial
->
fd
);
}
static
unsigned
int
serial_map_access
(
struct
object
*
obj
,
unsigned
int
access
)
{
if
(
access
&
GENERIC_READ
)
access
|=
FILE_GENERIC_READ
;
if
(
access
&
GENERIC_WRITE
)
access
|=
FILE_GENERIC_WRITE
;
if
(
access
&
GENERIC_EXECUTE
)
access
|=
FILE_GENERIC_EXECUTE
;
if
(
access
&
GENERIC_ALL
)
access
|=
FILE_ALL_ACCESS
;
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
static
void
serial_destroy
(
struct
object
*
obj
)
{
struct
serial
*
serial
=
(
struct
serial
*
)
obj
;
...
...
server/sock.c
View file @
a510a7e1
...
...
@@ -90,6 +90,7 @@ struct sock
static
void
sock_dump
(
struct
object
*
obj
,
int
verbose
);
static
int
sock_signaled
(
struct
object
*
obj
,
struct
thread
*
thread
);
static
struct
fd
*
sock_get_fd
(
struct
object
*
obj
);
static
unsigned
int
sock_map_access
(
struct
object
*
obj
,
unsigned
int
access
);
static
void
sock_destroy
(
struct
object
*
obj
);
static
int
sock_get_poll_events
(
struct
fd
*
fd
);
...
...
@@ -111,7 +112,7 @@ static const struct object_ops sock_ops =
no_satisfied
,
/* satisfied */
no_signal
,
/* signal */
sock_get_fd
,
/* get_fd */
no_map_access
,
/* map_access */
sock_map_access
,
/* map_access */
no_lookup_name
,
/* lookup_name */
no_close_handle
,
/* close_handle */
sock_destroy
/* destroy */
...
...
@@ -457,6 +458,15 @@ static int sock_signaled( struct object *obj, struct thread *thread )
return
check_fd_events
(
sock
->
fd
,
sock_get_poll_events
(
sock
->
fd
)
)
!=
0
;
}
static
unsigned
int
sock_map_access
(
struct
object
*
obj
,
unsigned
int
access
)
{
if
(
access
&
GENERIC_READ
)
access
|=
FILE_GENERIC_READ
;
if
(
access
&
GENERIC_WRITE
)
access
|=
FILE_GENERIC_WRITE
;
if
(
access
&
GENERIC_EXECUTE
)
access
|=
FILE_GENERIC_EXECUTE
;
if
(
access
&
GENERIC_ALL
)
access
|=
FILE_ALL_ACCESS
;
return
access
&
~
(
GENERIC_READ
|
GENERIC_WRITE
|
GENERIC_EXECUTE
|
GENERIC_ALL
);
}
static
int
sock_get_poll_events
(
struct
fd
*
fd
)
{
struct
sock
*
sock
=
get_fd_user
(
fd
);
...
...
@@ -629,8 +639,7 @@ static struct sock *accept_socket( obj_handle_t handle )
int
acceptfd
;
struct
sockaddr
saddr
;
sock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
handle
,
GENERIC_READ
|
GENERIC_WRITE
|
SYNCHRONIZE
,
&
sock_ops
);
sock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
handle
,
FILE_READ_DATA
,
&
sock_ops
);
if
(
!
sock
)
return
NULL
;
...
...
@@ -801,9 +810,8 @@ DECL_HANDLER(set_socket_event)
struct
event
*
old_event
;
int
pollev
;
if
(
!
(
sock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
req
->
handle
,
GENERIC_READ
|
GENERIC_WRITE
|
SYNCHRONIZE
,
&
sock_ops
)))
return
;
if
(
!
(
sock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
req
->
handle
,
FILE_WRITE_ATTRIBUTES
,
&
sock_ops
)))
return
;
old_event
=
sock
->
event
;
sock
->
mask
=
req
->
mask
;
sock
->
event
=
NULL
;
...
...
@@ -835,7 +843,7 @@ DECL_HANDLER(get_socket_event)
{
struct
sock
*
sock
;
sock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
req
->
handle
,
GENERIC_READ
|
GENERIC_WRITE
|
SYNCHRONIZE
,
&
sock_ops
);
sock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
req
->
handle
,
FILE_READ_ATTRIBUTES
,
&
sock_ops
);
if
(
!
sock
)
{
reply
->
mask
=
0
;
...
...
@@ -874,7 +882,7 @@ DECL_HANDLER(enable_socket_event)
int
pollev
;
if
(
!
(
sock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
req
->
handle
,
GENERIC_READ
|
GENERIC_WRITE
|
SYNCHRONIZE
,
&
sock_ops
)))
FILE_WRITE_ATTRIBUTES
,
&
sock_ops
)))
return
;
sock
->
pmask
&=
~
req
->
mask
;
/* is this safe? */
...
...
@@ -895,15 +903,13 @@ DECL_HANDLER(set_socket_deferred)
{
struct
sock
*
sock
,
*
acceptsock
;
sock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
req
->
handle
,
GENERIC_READ
|
GENERIC_WRITE
|
SYNCHRONIZE
,
&
sock_ops
);
sock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
req
->
handle
,
FILE_WRITE_ATTRIBUTES
,
&
sock_ops
);
if
(
!
sock
)
{
set_error
(
WSAENOTSOCK
);
return
;
}
acceptsock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
req
->
deferred
,
GENERIC_READ
|
GENERIC_WRITE
|
SYNCHRONIZE
,
&
sock_ops
);
acceptsock
=
(
struct
sock
*
)
get_handle_obj
(
current
->
process
,
req
->
deferred
,
0
,
&
sock_ops
);
if
(
!
acceptsock
)
{
release_object
(
sock
);
...
...
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