Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-cw
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-cw
Commits
39afcaac
Commit
39afcaac
authored
Sep 20, 2018
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
server: Create the initial thread as a separate request.
Signed-off-by:
Alexandre Julliard
<
julliard@winehq.org
>
parent
0fd450af
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
110 additions
and
52 deletions
+110
-52
security.c
dlls/advapi32/tests/security.c
+0
-1
process.c
dlls/kernel32/process.c
+90
-8
server_protocol.h
include/wine/server_protocol.h
+6
-10
process.c
server/process.c
+1
-8
protocol.def
server/protocol.def
+3
-7
request.h
server/request.h
+7
-11
trace.c
server/trace.c
+3
-7
No files found.
dlls/advapi32/tests/security.c
View file @
39afcaac
...
...
@@ -3096,7 +3096,6 @@ static void test_process_security_child(void)
CloseHandle
(
handle
);
handle
=
OpenThread
(
THREAD_SET_THREAD_TOKEN
,
FALSE
,
GetCurrentThreadId
()
);
todo_wine
ok
(
handle
==
NULL
,
"OpenThread(THREAD_SET_THREAD_TOKEN) should have failed
\n
"
);
}
...
...
dlls/kernel32/process.c
View file @
39afcaac
...
...
@@ -1949,6 +1949,68 @@ static pid_t exec_loader( LPCWSTR cmd_line, unsigned int flags, int socketfd,
return
pid
;
}
/* creates a struct security_descriptor and contained information in one contiguous piece of memory */
static
NTSTATUS
alloc_object_attributes
(
const
SECURITY_ATTRIBUTES
*
attr
,
struct
object_attributes
**
ret
,
data_size_t
*
ret_len
)
{
unsigned
int
len
=
sizeof
(
**
ret
);
PSID
owner
=
NULL
,
group
=
NULL
;
ACL
*
dacl
,
*
sacl
;
BOOLEAN
dacl_present
,
sacl_present
,
defaulted
;
PSECURITY_DESCRIPTOR
sd
=
NULL
;
NTSTATUS
status
;
*
ret
=
NULL
;
*
ret_len
=
0
;
if
(
attr
)
sd
=
attr
->
lpSecurityDescriptor
;
if
(
sd
)
{
len
+=
sizeof
(
struct
security_descriptor
);
if
((
status
=
RtlGetOwnerSecurityDescriptor
(
sd
,
&
owner
,
&
defaulted
)))
return
status
;
if
((
status
=
RtlGetGroupSecurityDescriptor
(
sd
,
&
group
,
&
defaulted
)))
return
status
;
if
((
status
=
RtlGetSaclSecurityDescriptor
(
sd
,
&
sacl_present
,
&
sacl
,
&
defaulted
)))
return
status
;
if
((
status
=
RtlGetDaclSecurityDescriptor
(
sd
,
&
dacl_present
,
&
dacl
,
&
defaulted
)))
return
status
;
if
(
owner
)
len
+=
RtlLengthSid
(
owner
);
if
(
group
)
len
+=
RtlLengthSid
(
group
);
if
(
sacl_present
&&
sacl
)
len
+=
sacl
->
AclSize
;
if
(
dacl_present
&&
dacl
)
len
+=
dacl
->
AclSize
;
}
len
=
(
len
+
3
)
&
~
3
;
/* DWORD-align the entire structure */
*
ret
=
HeapAlloc
(
GetProcessHeap
(),
HEAP_ZERO_MEMORY
,
len
);
if
(
!*
ret
)
return
STATUS_NO_MEMORY
;
(
*
ret
)
->
attributes
=
(
attr
&&
attr
->
bInheritHandle
)
?
OBJ_INHERIT
:
0
;
if
(
sd
)
{
struct
security_descriptor
*
descr
=
(
struct
security_descriptor
*
)(
*
ret
+
1
);
unsigned
char
*
ptr
=
(
unsigned
char
*
)(
descr
+
1
);
descr
->
control
=
((
SECURITY_DESCRIPTOR
*
)
sd
)
->
Control
&
~
SE_SELF_RELATIVE
;
if
(
owner
)
descr
->
owner_len
=
RtlLengthSid
(
owner
);
if
(
group
)
descr
->
group_len
=
RtlLengthSid
(
group
);
if
(
sacl_present
&&
sacl
)
descr
->
sacl_len
=
sacl
->
AclSize
;
if
(
dacl_present
&&
dacl
)
descr
->
dacl_len
=
dacl
->
AclSize
;
memcpy
(
ptr
,
owner
,
descr
->
owner_len
);
ptr
+=
descr
->
owner_len
;
memcpy
(
ptr
,
group
,
descr
->
group_len
);
ptr
+=
descr
->
group_len
;
memcpy
(
ptr
,
sacl
,
descr
->
sacl_len
);
ptr
+=
descr
->
sacl_len
;
memcpy
(
ptr
,
dacl
,
descr
->
dacl_len
);
(
*
ret
)
->
sd_len
=
(
sizeof
(
*
descr
)
+
descr
->
owner_len
+
descr
->
group_len
+
descr
->
sacl_len
+
descr
->
dacl_len
+
sizeof
(
WCHAR
)
-
1
)
&
~
(
sizeof
(
WCHAR
)
-
1
);
}
*
ret_len
=
len
;
return
STATUS_SUCCESS
;
}
/***********************************************************************
* create_process
*
...
...
@@ -1964,7 +2026,9 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW
static
const
char
*
cpu_names
[]
=
{
"x86"
,
"x86_64"
,
"PowerPC"
,
"ARM"
,
"ARM64"
};
NTSTATUS
status
;
BOOL
success
=
FALSE
;
HANDLE
process_info
;
HANDLE
process_info
,
process_handle
=
0
;
struct
object_attributes
*
objattr
;
data_size_t
attr_len
;
WCHAR
*
env_end
;
char
*
winedebug
=
NULL
;
startup_info_t
*
startup_info
;
...
...
@@ -2062,10 +2126,8 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW
req
->
create_flags
=
flags
;
req
->
socket_fd
=
socketfd
[
1
];
req
->
exe_file
=
wine_server_obj_handle
(
hFile
);
req
->
process_access
=
PROCESS_ALL_ACCESS
;
req
->
process_attr
=
(
psa
&&
(
psa
->
nLength
>=
sizeof
(
*
psa
))
&&
psa
->
bInheritHandle
)
?
OBJ_INHERIT
:
0
;
req
->
thread_access
=
THREAD_ALL_ACCESS
;
req
->
thread_attr
=
(
tsa
&&
(
tsa
->
nLength
>=
sizeof
(
*
tsa
))
&&
tsa
->
bInheritHandle
)
?
OBJ_INHERIT
:
0
;
req
->
access
=
PROCESS_ALL_ACCESS
;
req
->
attributes
=
(
psa
&&
psa
->
nLength
>=
sizeof
(
*
psa
)
&&
psa
->
bInheritHandle
)
?
OBJ_INHERIT
:
0
;
req
->
cpu
=
cpu
;
req
->
info_size
=
startup_info_size
;
...
...
@@ -2074,14 +2136,33 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW
if
(
!
(
status
=
wine_server_call
(
req
)))
{
info
->
dwProcessId
=
(
DWORD
)
reply
->
pid
;
info
->
dwThreadId
=
(
DWORD
)
reply
->
tid
;
info
->
hProcess
=
wine_server_ptr_handle
(
reply
->
phandle
);
info
->
hThread
=
wine_server_ptr_handle
(
reply
->
thandle
);
process_handle
=
wine_server_ptr_handle
(
reply
->
handle
);
}
process_info
=
wine_server_ptr_handle
(
reply
->
info
);
}
SERVER_END_REQ
;
if
(
!
status
)
{
alloc_object_attributes
(
tsa
,
&
objattr
,
&
attr_len
);
SERVER_START_REQ
(
new_thread
)
{
req
->
process
=
wine_server_obj_handle
(
process_handle
);
req
->
access
=
THREAD_ALL_ACCESS
;
req
->
suspend
=
!!
(
flags
&
CREATE_SUSPENDED
);
req
->
request_fd
=
-
1
;
wine_server_add_data
(
req
,
objattr
,
attr_len
);
if
(
!
(
status
=
wine_server_call
(
req
)))
{
info
->
hProcess
=
process_handle
;
info
->
hThread
=
wine_server_ptr_handle
(
reply
->
handle
);
info
->
dwThreadId
=
reply
->
tid
;
}
}
SERVER_END_REQ
;
HeapFree
(
GetProcessHeap
(),
0
,
objattr
);
}
RtlReleasePebLock
();
if
(
status
)
{
...
...
@@ -2096,6 +2177,7 @@ static BOOL create_process( HANDLE hFile, LPCWSTR filename, LPWSTR cmd_line, LPW
break
;
}
close
(
socketfd
[
0
]
);
CloseHandle
(
process_handle
);
HeapFree
(
GetProcessHeap
(),
0
,
startup_info
);
HeapFree
(
GetProcessHeap
(),
0
,
winedebug
);
SetLastError
(
RtlNtStatusToDosError
(
status
));
...
...
include/wine/server_protocol.h
View file @
39afcaac
...
...
@@ -726,25 +726,21 @@ struct new_process_request
unsigned
int
create_flags
;
int
socket_fd
;
obj_handle_t
exe_file
;
unsigned
int
process_access
;
unsigned
int
process_attr
;
unsigned
int
thread_access
;
unsigned
int
thread_attr
;
unsigned
int
access
;
unsigned
int
attributes
;
cpu_type_t
cpu
;
data_size_t
info_size
;
/* VARARG(info,startup_info,info_size); */
/* VARARG(env,unicode_str); */
char
__pad_
52
[
4
];
char
__pad_
44
[
4
];
};
struct
new_process_reply
{
struct
reply_header
__header
;
obj_handle_t
info
;
process_id_t
pid
;
obj_handle_t
phandle
;
thread_id_t
tid
;
obj_handle_t
thandle
;
char
__pad_28
[
4
];
obj_handle_t
handle
;
char
__pad_20
[
4
];
};
...
...
@@ -6536,6 +6532,6 @@ union generic_reply
struct
terminate_job_reply
terminate_job_reply
;
};
#define SERVER_PROTOCOL_VERSION 56
2
#define SERVER_PROTOCOL_VERSION 56
3
#endif
/* __WINE_WINE_SERVER_PROTOCOL_H */
server/process.c
View file @
39afcaac
...
...
@@ -1061,7 +1061,6 @@ struct process_snapshot *process_snap( int *count )
DECL_HANDLER
(
new_process
)
{
struct
startup_info
*
info
;
struct
thread
*
thread
;
struct
process
*
process
=
NULL
;
struct
process
*
parent
=
current
->
process
;
int
socket_fd
=
thread_get_inflight_fd
(
current
,
req
->
socket_fd
);
...
...
@@ -1166,7 +1165,6 @@ DECL_HANDLER(new_process)
}
if
(
!
(
process
=
create_process
(
socket_fd
,
current
,
req
->
inherit_all
)))
goto
done
;
if
(
!
(
thread
=
create_thread
(
-
1
,
process
,
NULL
)))
goto
done
;
process
->
startup_info
=
(
struct
startup_info
*
)
grab_object
(
info
);
...
...
@@ -1180,9 +1178,6 @@ DECL_HANDLER(new_process)
/* connect to the window station */
connect_process_winstation
(
process
,
current
);
/* thread will be actually suspended in init_done */
if
(
req
->
create_flags
&
CREATE_SUSPENDED
)
thread
->
suspend
++
;
/* set the process console */
if
(
!
(
req
->
create_flags
&
(
DETACHED_PROCESS
|
CREATE_NEW_CONSOLE
)))
{
...
...
@@ -1224,9 +1219,7 @@ DECL_HANDLER(new_process)
info
->
process
=
(
struct
process
*
)
grab_object
(
process
);
reply
->
info
=
alloc_handle
(
current
->
process
,
info
,
SYNCHRONIZE
,
0
);
reply
->
pid
=
get_process_id
(
process
);
reply
->
tid
=
get_thread_id
(
thread
);
reply
->
phandle
=
alloc_handle
(
parent
,
process
,
req
->
process_access
,
req
->
process_attr
);
reply
->
thandle
=
alloc_handle
(
parent
,
thread
,
req
->
thread_access
,
req
->
thread_attr
);
reply
->
handle
=
alloc_handle
(
parent
,
process
,
req
->
access
,
req
->
attributes
);
done
:
if
(
process
)
release_object
(
process
);
...
...
server/protocol.def
View file @
39afcaac
...
...
@@ -740,10 +740,8 @@ struct rawinput_device
unsigned int create_flags; /* creation flags */
int socket_fd; /* file descriptor for process socket */
obj_handle_t exe_file; /* file handle for main exe */
unsigned int process_access; /* access rights for process object */
unsigned int process_attr; /* attributes for process object */
unsigned int thread_access; /* access rights for thread object */
unsigned int thread_attr; /* attributes for thread object */
unsigned int access; /* access rights for process object */
unsigned int attributes; /* attributes for process object */
cpu_type_t cpu; /* CPU that the new process will use */
data_size_t info_size; /* size of startup info */
VARARG(info,startup_info,info_size); /* startup information */
...
...
@@ -751,9 +749,7 @@ struct rawinput_device
@REPLY
obj_handle_t info; /* new process info handle */
process_id_t pid; /* process id */
obj_handle_t phandle; /* process handle (in the current process) */
thread_id_t tid; /* thread id */
obj_handle_t thandle; /* thread handle (in the current process) */
obj_handle_t handle; /* process handle (in the current process) */
@END
...
...
server/request.h
View file @
39afcaac
...
...
@@ -734,19 +734,15 @@ C_ASSERT( FIELD_OFFSET(struct new_process_request, inherit_all) == 12 );
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
create_flags
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
socket_fd
)
==
20
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
exe_file
)
==
24
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
process_access
)
==
28
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
process_attr
)
==
32
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
thread_access
)
==
36
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
thread_attr
)
==
40
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
cpu
)
==
44
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
info_size
)
==
48
);
C_ASSERT
(
sizeof
(
struct
new_process_request
)
==
56
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
access
)
==
28
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
attributes
)
==
32
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
cpu
)
==
36
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_request
,
info_size
)
==
40
);
C_ASSERT
(
sizeof
(
struct
new_process_request
)
==
48
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_reply
,
info
)
==
8
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_reply
,
pid
)
==
12
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_reply
,
phandle
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_reply
,
tid
)
==
20
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_reply
,
thandle
)
==
24
);
C_ASSERT
(
sizeof
(
struct
new_process_reply
)
==
32
);
C_ASSERT
(
FIELD_OFFSET
(
struct
new_process_reply
,
handle
)
==
16
);
C_ASSERT
(
sizeof
(
struct
new_process_reply
)
==
24
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_new_process_info_request
,
info
)
==
12
);
C_ASSERT
(
sizeof
(
struct
get_new_process_info_request
)
==
16
);
C_ASSERT
(
FIELD_OFFSET
(
struct
get_new_process_info_reply
,
success
)
==
8
);
...
...
server/trace.c
View file @
39afcaac
...
...
@@ -1229,10 +1229,8 @@ static void dump_new_process_request( const struct new_process_request *req )
fprintf
(
stderr
,
", create_flags=%08x"
,
req
->
create_flags
);
fprintf
(
stderr
,
", socket_fd=%d"
,
req
->
socket_fd
);
fprintf
(
stderr
,
", exe_file=%04x"
,
req
->
exe_file
);
fprintf
(
stderr
,
", process_access=%08x"
,
req
->
process_access
);
fprintf
(
stderr
,
", process_attr=%08x"
,
req
->
process_attr
);
fprintf
(
stderr
,
", thread_access=%08x"
,
req
->
thread_access
);
fprintf
(
stderr
,
", thread_attr=%08x"
,
req
->
thread_attr
);
fprintf
(
stderr
,
", access=%08x"
,
req
->
access
);
fprintf
(
stderr
,
", attributes=%08x"
,
req
->
attributes
);
dump_cpu_type
(
", cpu="
,
&
req
->
cpu
);
fprintf
(
stderr
,
", info_size=%u"
,
req
->
info_size
);
dump_varargs_startup_info
(
", info="
,
min
(
cur_size
,
req
->
info_size
)
);
...
...
@@ -1243,9 +1241,7 @@ static void dump_new_process_reply( const struct new_process_reply *req )
{
fprintf
(
stderr
,
" info=%04x"
,
req
->
info
);
fprintf
(
stderr
,
", pid=%04x"
,
req
->
pid
);
fprintf
(
stderr
,
", phandle=%04x"
,
req
->
phandle
);
fprintf
(
stderr
,
", tid=%04x"
,
req
->
tid
);
fprintf
(
stderr
,
", thandle=%04x"
,
req
->
thandle
);
fprintf
(
stderr
,
", handle=%04x"
,
req
->
handle
);
}
static
void
dump_get_new_process_info_request
(
const
struct
get_new_process_info_request
*
req
)
...
...
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