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
9c2370bd
Commit
9c2370bd
authored
Aug 30, 2000
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added exception handling wrapper to a number of server requests.
Changed a few requests to use the new vararg mechanism.
parent
2951862b
Show whitespace changes
Inline
Side-by-side
Showing
41 changed files
with
1372 additions
and
579 deletions
+1372
-579
toolhelp.c
dlls/kernel/toolhelp.c
+38
-11
exception.c
dlls/ntdll/exception.c
+9
-3
nt.c
dlls/ntdll/nt.c
+25
-7
om.c
dlls/ntdll/om.c
+8
-2
sync.c
dlls/ntdll/sync.c
+101
-74
change.c
files/change.c
+9
-3
file.c
files/file.c
+79
-24
ntddk.h
include/ntddk.h
+3
-5
server.h
include/server.h
+23
-19
module.c
loader/module.c
+5
-3
module.c
loader/ne/module.c
+8
-4
pe_image.c
loader/pe_image.c
+6
-1
atom.c
memory/atom.c
+109
-23
selector.c
memory/selector.c
+15
-5
virtual.c
memory/virtual.c
+68
-16
registry.c
misc/registry.c
+10
-3
debugger.c
scheduler/debugger.c
+83
-48
event.c
scheduler/event.c
+73
-18
handle.c
scheduler/handle.c
+36
-24
mutex.c
scheduler/mutex.c
+73
-18
pipe.c
scheduler/pipe.c
+10
-3
process.c
scheduler/process.c
+86
-37
semaphore.c
scheduler/semaphore.c
+73
-34
synchro.c
scheduler/synchro.c
+31
-19
thread.c
scheduler/thread.c
+101
-43
timer.c
scheduler/timer.c
+82
-20
atom.c
server/atom.c
+34
-17
debugger.c
server/debugger.c
+6
-4
event.c
server/event.c
+4
-4
mapping.c
server/mapping.c
+4
-4
mutex.c
server/mutex.c
+3
-4
object.c
server/object.c
+6
-5
request.h
server/request.h
+12
-0
semaphore.c
server/semaphore.c
+4
-4
thread.c
server/thread.c
+21
-10
timer.c
server/timer.c
+3
-4
trace.c
server/trace.c
+55
-35
make_requests
tools/make_requests
+10
-1
console.c
win32/console.c
+15
-8
device.c
win32/device.c
+8
-4
queue.c
windows/queue.c
+23
-8
No files found.
dlls/kernel/toolhelp.c
View file @
9c2370bd
...
@@ -184,7 +184,7 @@ FARPROC16 tmp;
...
@@ -184,7 +184,7 @@ FARPROC16 tmp;
*/
*/
HANDLE
WINAPI
CreateToolhelp32Snapshot
(
DWORD
flags
,
DWORD
process
)
HANDLE
WINAPI
CreateToolhelp32Snapshot
(
DWORD
flags
,
DWORD
process
)
{
{
struct
create_snapshot_request
*
req
=
get_req_buffer
()
;
HANDLE
ret
;
TRACE
(
"%lx,%lx
\n
"
,
flags
,
process
);
TRACE
(
"%lx,%lx
\n
"
,
flags
,
process
);
if
(
!
(
flags
&
(
TH32CS_SNAPPROCESS
|
TH32CS_SNAPTHREAD
|
TH32CS_SNAPMODULE
)))
if
(
!
(
flags
&
(
TH32CS_SNAPPROCESS
|
TH32CS_SNAPTHREAD
|
TH32CS_SNAPMODULE
)))
...
@@ -195,11 +195,17 @@ HANDLE WINAPI CreateToolhelp32Snapshot( DWORD flags, DWORD process )
...
@@ -195,11 +195,17 @@ HANDLE WINAPI CreateToolhelp32Snapshot( DWORD flags, DWORD process )
}
}
/* Now do the snapshot */
/* Now do the snapshot */
SERVER_START_REQ
{
struct
create_snapshot_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
flags
=
flags
&
~
TH32CS_INHERIT
;
req
->
flags
=
flags
&
~
TH32CS_INHERIT
;
req
->
inherit
=
(
flags
&
TH32CS_INHERIT
)
!=
0
;
req
->
inherit
=
(
flags
&
TH32CS_INHERIT
)
!=
0
;
req
->
pid
=
(
void
*
)
process
;
req
->
pid
=
(
void
*
)
process
;
server_call
(
REQ_CREATE_SNAPSHOT
);
server_call
(
REQ_CREATE_SNAPSHOT
);
return
req
->
handle
;
ret
=
req
->
handle
;
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -210,7 +216,7 @@ HANDLE WINAPI CreateToolhelp32Snapshot( DWORD flags, DWORD process )
...
@@ -210,7 +216,7 @@ HANDLE WINAPI CreateToolhelp32Snapshot( DWORD flags, DWORD process )
*/
*/
static
BOOL
TOOLHELP_Thread32Next
(
HANDLE
handle
,
LPTHREADENTRY32
lpte
,
BOOL
first
)
static
BOOL
TOOLHELP_Thread32Next
(
HANDLE
handle
,
LPTHREADENTRY32
lpte
,
BOOL
first
)
{
{
struct
next_thread_request
*
req
=
get_req_buffer
()
;
BOOL
ret
;
if
(
lpte
->
dwSize
<
sizeof
(
THREADENTRY32
))
if
(
lpte
->
dwSize
<
sizeof
(
THREADENTRY32
))
{
{
...
@@ -218,16 +224,23 @@ static BOOL TOOLHELP_Thread32Next( HANDLE handle, LPTHREADENTRY32 lpte, BOOL fir
...
@@ -218,16 +224,23 @@ static BOOL TOOLHELP_Thread32Next( HANDLE handle, LPTHREADENTRY32 lpte, BOOL fir
ERR
(
"Result buffer too small (req: %d, was: %ld)
\n
"
,
sizeof
(
THREADENTRY32
),
lpte
->
dwSize
);
ERR
(
"Result buffer too small (req: %d, was: %ld)
\n
"
,
sizeof
(
THREADENTRY32
),
lpte
->
dwSize
);
return
FALSE
;
return
FALSE
;
}
}
SERVER_START_REQ
{
struct
next_thread_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
req
->
reset
=
first
;
req
->
reset
=
first
;
if
(
server_call
(
REQ_NEXT_THREAD
))
return
FALSE
;
if
((
ret
=
!
server_call
(
REQ_NEXT_THREAD
)))
{
lpte
->
cntUsage
=
req
->
count
;
lpte
->
cntUsage
=
req
->
count
;
lpte
->
th32ThreadID
=
(
DWORD
)
req
->
tid
;
lpte
->
th32ThreadID
=
(
DWORD
)
req
->
tid
;
lpte
->
th32OwnerProcessID
=
(
DWORD
)
req
->
pid
;
lpte
->
th32OwnerProcessID
=
(
DWORD
)
req
->
pid
;
lpte
->
tbBasePri
=
req
->
base_pri
;
lpte
->
tbBasePri
=
req
->
base_pri
;
lpte
->
tbDeltaPri
=
req
->
delta_pri
;
lpte
->
tbDeltaPri
=
req
->
delta_pri
;
lpte
->
dwFlags
=
0
;
/* SDK: "reserved; do not use" */
lpte
->
dwFlags
=
0
;
/* SDK: "reserved; do not use" */
return
TRUE
;
}
}
SERVER_END_REQ
;
return
ret
;
}
}
/***********************************************************************
/***********************************************************************
...
@@ -257,7 +270,7 @@ BOOL WINAPI Thread32Next(HANDLE hSnapshot, LPTHREADENTRY32 lpte)
...
@@ -257,7 +270,7 @@ BOOL WINAPI Thread32Next(HANDLE hSnapshot, LPTHREADENTRY32 lpte)
*/
*/
static
BOOL
TOOLHELP_Process32Next
(
HANDLE
handle
,
LPPROCESSENTRY32
lppe
,
BOOL
first
)
static
BOOL
TOOLHELP_Process32Next
(
HANDLE
handle
,
LPPROCESSENTRY32
lppe
,
BOOL
first
)
{
{
struct
next_process_request
*
req
=
get_req_buffer
()
;
BOOL
ret
;
if
(
lppe
->
dwSize
<
sizeof
(
PROCESSENTRY32
))
if
(
lppe
->
dwSize
<
sizeof
(
PROCESSENTRY32
))
{
{
...
@@ -265,9 +278,13 @@ static BOOL TOOLHELP_Process32Next( HANDLE handle, LPPROCESSENTRY32 lppe, BOOL f
...
@@ -265,9 +278,13 @@ static BOOL TOOLHELP_Process32Next( HANDLE handle, LPPROCESSENTRY32 lppe, BOOL f
ERR
(
"Result buffer too small (req: %d, was: %ld)
\n
"
,
sizeof
(
PROCESSENTRY32
),
lppe
->
dwSize
);
ERR
(
"Result buffer too small (req: %d, was: %ld)
\n
"
,
sizeof
(
PROCESSENTRY32
),
lppe
->
dwSize
);
return
FALSE
;
return
FALSE
;
}
}
SERVER_START_REQ
{
struct
next_process_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
req
->
reset
=
first
;
req
->
reset
=
first
;
if
(
server_call
(
REQ_NEXT_PROCESS
))
return
FALSE
;
if
((
ret
=
!
server_call
(
REQ_NEXT_PROCESS
)))
{
lppe
->
cntUsage
=
req
->
count
;
lppe
->
cntUsage
=
req
->
count
;
lppe
->
th32ProcessID
=
(
DWORD
)
req
->
pid
;
lppe
->
th32ProcessID
=
(
DWORD
)
req
->
pid
;
lppe
->
th32DefaultHeapID
=
0
;
/* FIXME */
lppe
->
th32DefaultHeapID
=
0
;
/* FIXME */
...
@@ -277,7 +294,10 @@ static BOOL TOOLHELP_Process32Next( HANDLE handle, LPPROCESSENTRY32 lppe, BOOL f
...
@@ -277,7 +294,10 @@ static BOOL TOOLHELP_Process32Next( HANDLE handle, LPPROCESSENTRY32 lppe, BOOL f
lppe
->
pcPriClassBase
=
req
->
priority
;
lppe
->
pcPriClassBase
=
req
->
priority
;
lppe
->
dwFlags
=
-
1
;
/* FIXME */
lppe
->
dwFlags
=
-
1
;
/* FIXME */
lppe
->
szExeFile
[
0
]
=
0
;
/* FIXME */
lppe
->
szExeFile
[
0
]
=
0
;
/* FIXME */
return
TRUE
;
}
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -309,7 +329,7 @@ BOOL WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe)
...
@@ -309,7 +329,7 @@ BOOL WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe)
*/
*/
static
BOOL
TOOLHELP_Module32Next
(
HANDLE
handle
,
LPMODULEENTRY32
lpme
,
BOOL
first
)
static
BOOL
TOOLHELP_Module32Next
(
HANDLE
handle
,
LPMODULEENTRY32
lpme
,
BOOL
first
)
{
{
struct
next_module_request
*
req
=
get_req_buffer
()
;
BOOL
ret
;
if
(
lpme
->
dwSize
<
sizeof
(
MODULEENTRY32
))
if
(
lpme
->
dwSize
<
sizeof
(
MODULEENTRY32
))
{
{
...
@@ -317,9 +337,13 @@ static BOOL TOOLHELP_Module32Next( HANDLE handle, LPMODULEENTRY32 lpme, BOOL fir
...
@@ -317,9 +337,13 @@ static BOOL TOOLHELP_Module32Next( HANDLE handle, LPMODULEENTRY32 lpme, BOOL fir
ERR
(
"Result buffer too small (req: %d, was: %ld)
\n
"
,
sizeof
(
MODULEENTRY32
),
lpme
->
dwSize
);
ERR
(
"Result buffer too small (req: %d, was: %ld)
\n
"
,
sizeof
(
MODULEENTRY32
),
lpme
->
dwSize
);
return
FALSE
;
return
FALSE
;
}
}
SERVER_START_REQ
{
struct
next_module_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
req
->
reset
=
first
;
req
->
reset
=
first
;
if
(
server_call
(
REQ_NEXT_MODULE
))
return
FALSE
;
if
((
ret
=
!
server_call
(
REQ_NEXT_MODULE
)))
{
lpme
->
th32ModuleID
=
0
;
/* toolhelp internal id, never used */
lpme
->
th32ModuleID
=
0
;
/* toolhelp internal id, never used */
lpme
->
th32ProcessID
=
(
DWORD
)
req
->
pid
;
lpme
->
th32ProcessID
=
(
DWORD
)
req
->
pid
;
lpme
->
GlblcntUsage
=
0
;
/* FIXME */
lpme
->
GlblcntUsage
=
0
;
/* FIXME */
...
@@ -329,7 +353,10 @@ static BOOL TOOLHELP_Module32Next( HANDLE handle, LPMODULEENTRY32 lpme, BOOL fir
...
@@ -329,7 +353,10 @@ static BOOL TOOLHELP_Module32Next( HANDLE handle, LPMODULEENTRY32 lpme, BOOL fir
lpme
->
hModule
=
(
DWORD
)
req
->
base
;
lpme
->
hModule
=
(
DWORD
)
req
->
base
;
lpme
->
szModule
[
0
]
=
0
;
/* FIXME */
lpme
->
szModule
[
0
]
=
0
;
/* FIXME */
lpme
->
szExePath
[
0
]
=
0
;
/* FIXME */
lpme
->
szExePath
[
0
]
=
0
;
/* FIXME */
return
TRUE
;
}
}
SERVER_END_REQ
;
return
ret
;
}
}
/***********************************************************************
/***********************************************************************
...
...
dlls/ntdll/exception.c
View file @
9c2370bd
...
@@ -86,18 +86,24 @@ static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_FRAME *frame,
...
@@ -86,18 +86,24 @@ static DWORD EXC_CallHandler( EXCEPTION_RECORD *record, EXCEPTION_FRAME *frame,
/**********************************************************************
/**********************************************************************
*
EXC_SendE
vent
*
send_debug_e
vent
*
*
* Send an EXCEPTION_DEBUG_EVENT event to the debugger.
* Send an EXCEPTION_DEBUG_EVENT event to the debugger.
*/
*/
static
inline
int
send_debug_event
(
EXCEPTION_RECORD
*
rec
,
int
first_chance
,
CONTEXT
*
context
)
static
inline
int
send_debug_event
(
EXCEPTION_RECORD
*
rec
,
int
first_chance
,
CONTEXT
*
context
)
{
{
struct
exception_event_request
*
req
=
get_req_buffer
();
int
ret
;
SERVER_START_REQ
{
struct
exception_event_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
record
=
*
rec
;
req
->
record
=
*
rec
;
req
->
first
=
first_chance
;
req
->
first
=
first_chance
;
req
->
context
=
*
context
;
req
->
context
=
*
context
;
if
(
!
server_call_noerr
(
REQ_EXCEPTION_EVENT
))
*
context
=
req
->
context
;
if
(
!
server_call_noerr
(
REQ_EXCEPTION_EVENT
))
*
context
=
req
->
context
;
return
req
->
status
;
ret
=
req
->
status
;
}
SERVER_END_REQ
;
return
ret
;
}
}
...
...
dlls/ntdll/nt.c
View file @
9c2370bd
...
@@ -75,10 +75,17 @@ NTSTATUS WINAPI NtQueryTimerResolution(DWORD x1,DWORD x2,DWORD x3)
...
@@ -75,10 +75,17 @@ NTSTATUS WINAPI NtQueryTimerResolution(DWORD x1,DWORD x2,DWORD x3)
NTSTATUS
WINAPI
NtTerminateProcess
(
HANDLE
handle
,
LONG
exit_code
)
NTSTATUS
WINAPI
NtTerminateProcess
(
HANDLE
handle
,
LONG
exit_code
)
{
{
NTSTATUS
ret
;
NTSTATUS
ret
;
struct
terminate_process_request
*
req
=
get_req_buffer
();
BOOL
self
;
SERVER_START_REQ
{
struct
terminate_process_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
req
->
exit_code
=
exit_code
;
req
->
exit_code
=
exit_code
;
if
(
!
(
ret
=
server_call_noerr
(
REQ_TERMINATE_PROCESS
))
&&
req
->
self
)
exit
(
exit_code
);
ret
=
server_call_noerr
(
REQ_TERMINATE_PROCESS
);
self
=
!
ret
&&
req
->
self
;
}
SERVER_END_REQ
;
if
(
self
)
exit
(
exit_code
);
return
ret
;
return
ret
;
}
}
...
@@ -134,24 +141,35 @@ NTSTATUS WINAPI NtResumeThread(
...
@@ -134,24 +141,35 @@ NTSTATUS WINAPI NtResumeThread(
return
0
;
return
0
;
}
}
/******************************************************************************
/******************************************************************************
* NtTerminateThread [NTDLL]
* NtTerminateThread [NTDLL]
*/
*/
NTSTATUS
WINAPI
NtTerminateThread
(
IN
HANDLE
handle
,
NTSTATUS
WINAPI
NtTerminateThread
(
HANDLE
handle
,
LONG
exit_code
)
IN
NTSTATUS
exit_code
)
{
{
NTSTATUS
ret
;
NTSTATUS
ret
;
struct
terminate_thread_request
*
req
=
get_req_buffer
();
BOOL
self
,
last
;
SERVER_START_REQ
{
struct
terminate_thread_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
req
->
exit_code
=
exit_code
;
req
->
exit_code
=
exit_code
;
if
(
!
(
ret
=
server_call_noerr
(
REQ_TERMINATE_THREAD
))
&&
req
->
self
)
ret
=
server_call_noerr
(
REQ_TERMINATE_THREAD
);
self
=
!
ret
&&
req
->
self
;
last
=
req
->
last
;
}
SERVER_END_REQ
;
if
(
self
)
{
{
if
(
req
->
last
)
exit
(
exit_code
);
if
(
last
)
exit
(
exit_code
);
else
SYSDEPS_ExitThread
(
exit_code
);
else
SYSDEPS_ExitThread
(
exit_code
);
}
}
return
ret
;
return
ret
;
}
}
/******************************************************************************
/******************************************************************************
* NtQueryInformationThread [NTDLL.]
* NtQueryInformationThread [NTDLL.]
*
*
...
...
dlls/ntdll/om.c
View file @
9c2370bd
...
@@ -215,9 +215,15 @@ NTSTATUS WINAPI NtDuplicateObject(
...
@@ -215,9 +215,15 @@ NTSTATUS WINAPI NtDuplicateObject(
*/
*/
NTSTATUS
WINAPI
NtClose
(
HANDLE
Handle
)
NTSTATUS
WINAPI
NtClose
(
HANDLE
Handle
)
{
{
struct
close_handle_request
*
req
=
get_req_buffer
();
NTSTATUS
ret
;
SERVER_START_REQ
{
struct
close_handle_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
Handle
;
req
->
handle
=
Handle
;
return
server_call_noerr
(
REQ_CLOSE_HANDLE
);
ret
=
server_call_noerr
(
REQ_CLOSE_HANDLE
);
}
SERVER_END_REQ
;
return
ret
;
}
}
/******************************************************************************
/******************************************************************************
...
...
dlls/ntdll/sync.c
View file @
9c2370bd
...
@@ -16,17 +16,6 @@
...
@@ -16,17 +16,6 @@
DEFAULT_DEBUG_CHANNEL
(
ntdll
);
DEFAULT_DEBUG_CHANNEL
(
ntdll
);
/* copy a key name into the request buffer */
static
inline
NTSTATUS
copy_nameU
(
LPWSTR
Dest
,
const
OBJECT_ATTRIBUTES
*
attr
)
{
if
(
attr
&&
attr
->
ObjectName
&&
attr
->
ObjectName
->
Buffer
)
{
if
((
attr
->
ObjectName
->
Length
)
>
MAX_PATH
)
return
STATUS_BUFFER_OVERFLOW
;
strcpyW
(
Dest
,
attr
->
ObjectName
->
Buffer
);
}
else
Dest
[
0
]
=
0
;
return
STATUS_SUCCESS
;
}
/*
/*
* Semaphores
* Semaphores
...
@@ -35,44 +24,56 @@ static inline NTSTATUS copy_nameU( LPWSTR Dest, const OBJECT_ATTRIBUTES *attr )
...
@@ -35,44 +24,56 @@ static inline NTSTATUS copy_nameU( LPWSTR Dest, const OBJECT_ATTRIBUTES *attr )
/******************************************************************************
/******************************************************************************
* NtCreateSemaphore
* NtCreateSemaphore
*/
*/
NTSTATUS
WINAPI
NtCreateSemaphore
(
NTSTATUS
WINAPI
NtCreateSemaphore
(
OUT
PHANDLE
SemaphoreHandle
,
OUT
PHANDLE
SemaphoreHandle
,
IN
ACCESS_MASK
access
,
IN
ACCESS_MASK
DesiredAccess
,
IN
const
OBJECT_ATTRIBUTES
*
attr
OPTIONAL
,
IN
POBJECT_ATTRIBUTES
ObjectAttributes
OPTIONAL
,
IN
ULONG
InitialCount
,
IN
ULONG
InitialCount
,
IN
ULONG
MaximumCount
)
IN
ULONG
MaximumCount
)
{
{
struct
create_semaphore_request
*
req
=
get_req_buffer
()
;
DWORD
len
=
attr
&&
attr
->
ObjectName
?
attr
->
ObjectName
->
Length
:
0
;
NTSTATUS
ret
;
NTSTATUS
ret
;
if
((
MaximumCount
<=
0
)
||
(
InitialCount
<
0
)
||
(
InitialCount
>
MaximumCount
))
if
((
MaximumCount
<=
0
)
||
(
InitialCount
<
0
)
||
(
InitialCount
>
MaximumCount
))
return
STATUS_INVALID_PARAMETER
;
return
STATUS_INVALID_PARAMETER
;
*
SemaphoreHandle
=
0
;
*
SemaphoreHandle
=
0
;
SERVER_START_REQ
{
struct
create_semaphore_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
);
req
->
initial
=
InitialCount
;
req
->
initial
=
InitialCount
;
req
->
max
=
MaximumCount
;
req
->
max
=
MaximumCount
;
req
->
inherit
=
ObjectAttributes
&&
(
ObjectAttributes
->
Attributes
&
OBJ_INHERIT
);
req
->
inherit
=
attr
&&
(
attr
->
Attributes
&
OBJ_INHERIT
);
if
(
!
(
ret
=
copy_nameU
(
req
->
name
,
ObjectAttributes
))
&&
if
(
len
)
memcpy
(
server_data_ptr
(
req
),
attr
->
ObjectName
->
Buffer
,
len
);
!
(
ret
=
server_call_noerr
(
REQ_CREATE_SEMAPHORE
)))
*
SemaphoreHandle
=
req
->
handle
;
if
(
!
(
ret
=
server_call_noerr
(
REQ_CREATE_SEMAPHORE
)))
*
SemaphoreHandle
=
req
->
handle
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
/******************************************************************************
/******************************************************************************
* NtOpenSemaphore
* NtOpenSemaphore
*/
*/
NTSTATUS
WINAPI
NtOpenSemaphore
(
NTSTATUS
WINAPI
NtOpenSemaphore
(
OUT
PHANDLE
SemaphoreHandle
,
OUT
PHANDLE
SemaphoreHandle
,
IN
ACCESS_MASK
access
,
IN
ACCESS_MASK
DesiredAcces
,
IN
const
OBJECT_ATTRIBUTES
*
attr
)
IN
POBJECT_ATTRIBUTES
ObjectAttributes
)
{
{
struct
open_semaphore_request
*
req
=
get_req_buffer
()
;
DWORD
len
=
attr
&&
attr
->
ObjectName
?
attr
->
ObjectName
->
Length
:
0
;
NTSTATUS
ret
;
NTSTATUS
ret
;
*
SemaphoreHandle
=
0
;
*
SemaphoreHandle
=
0
;
req
->
access
=
DesiredAcces
;
req
->
inherit
=
ObjectAttributes
&&
(
ObjectAttributes
->
Attributes
&
OBJ_INHERIT
);
SERVER_START_REQ
if
(
!
(
ret
=
copy_nameU
(
req
->
name
,
ObjectAttributes
))
&&
{
!
(
ret
=
server_call_noerr
(
REQ_OPEN_SEMAPHORE
)))
*
SemaphoreHandle
=
req
->
handle
;
struct
open_semaphore_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
);
req
->
access
=
access
;
req
->
inherit
=
attr
&&
(
attr
->
Attributes
&
OBJ_INHERIT
);
if
(
len
)
memcpy
(
server_data_ptr
(
req
),
attr
->
ObjectName
->
Buffer
,
len
);
if
(
!
(
ret
=
server_call_noerr
(
REQ_OPEN_SEMAPHORE
)))
*
SemaphoreHandle
=
req
->
handle
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -90,25 +91,24 @@ NTSTATUS WINAPI NtQuerySemaphore(
...
@@ -90,25 +91,24 @@ NTSTATUS WINAPI NtQuerySemaphore(
SemaphoreHandle
,
SemaphoreInformationClass
,
SemaphoreInformation
,
Length
,
ReturnLength
);
SemaphoreHandle
,
SemaphoreInformationClass
,
SemaphoreInformation
,
Length
,
ReturnLength
);
return
STATUS_SUCCESS
;
return
STATUS_SUCCESS
;
}
}
/******************************************************************************
/******************************************************************************
* NtReleaseSemaphore
* NtReleaseSemaphore
*/
*/
NTSTATUS
WINAPI
NtReleaseSemaphore
(
NTSTATUS
WINAPI
NtReleaseSemaphore
(
HANDLE
handle
,
ULONG
count
,
PULONG
previous
)
IN
HANDLE
SemaphoreHandle
,
IN
ULONG
ReleaseCount
,
IN
PULONG
PreviousCount
)
{
{
struct
release_semaphore_request
*
req
=
get_req_buffer
();
NTSTATUS
ret
;
NTSTATUS
ret
;
SERVER_START_REQ
if
(
ReleaseCount
<
0
)
return
STATUS_INVALID_PARAMETER
;
{
struct
release_semaphore_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
SemaphoreH
andle
;
req
->
handle
=
h
andle
;
req
->
count
=
ReleaseC
ount
;
req
->
count
=
c
ount
;
if
(
!
(
ret
=
server_call_noerr
(
REQ_RELEASE_SEMAPHORE
)))
if
(
!
(
ret
=
server_call_noerr
(
REQ_RELEASE_SEMAPHORE
)))
{
{
if
(
PreviousCount
)
*
PreviousCount
=
req
->
prev_count
;
if
(
previous
)
*
previous
=
req
->
prev_count
;
}
}
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -122,19 +122,25 @@ NTSTATUS WINAPI NtReleaseSemaphore(
...
@@ -122,19 +122,25 @@ NTSTATUS WINAPI NtReleaseSemaphore(
NTSTATUS
WINAPI
NtCreateEvent
(
NTSTATUS
WINAPI
NtCreateEvent
(
OUT
PHANDLE
EventHandle
,
OUT
PHANDLE
EventHandle
,
IN
ACCESS_MASK
DesiredAccess
,
IN
ACCESS_MASK
DesiredAccess
,
IN
POBJECT_ATTRIBUTES
ObjectAttributes
,
IN
const
OBJECT_ATTRIBUTES
*
attr
,
IN
BOOLEAN
ManualReset
,
IN
BOOLEAN
ManualReset
,
IN
BOOLEAN
InitialState
)
IN
BOOLEAN
InitialState
)
{
{
struct
create_event_request
*
req
=
get_req_buffer
()
;
DWORD
len
=
attr
&&
attr
->
ObjectName
?
attr
->
ObjectName
->
Length
:
0
;
NTSTATUS
ret
;
NTSTATUS
ret
;
*
EventHandle
=
0
;
*
EventHandle
=
0
;
SERVER_START_REQ
{
struct
create_event_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
);
req
->
manual_reset
=
ManualReset
;
req
->
manual_reset
=
ManualReset
;
req
->
initial_state
=
InitialState
;
req
->
initial_state
=
InitialState
;
req
->
inherit
=
ObjectAttributes
&&
(
ObjectAttributes
->
Attributes
&
OBJ_INHERIT
);
req
->
inherit
=
attr
&&
(
attr
->
Attributes
&
OBJ_INHERIT
);
if
(
!
(
ret
=
copy_nameU
(
req
->
name
,
ObjectAttributes
))
&&
if
(
len
)
memcpy
(
server_data_ptr
(
req
),
attr
->
ObjectName
->
Buffer
,
len
);
!
(
ret
=
server_call_noerr
(
REQ_CREATE_EVENT
)))
*
EventHandle
=
req
->
handle
;
if
(
!
(
ret
=
server_call_noerr
(
REQ_CREATE_EVENT
)))
*
EventHandle
=
req
->
handle
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -144,16 +150,23 @@ NTSTATUS WINAPI NtCreateEvent(
...
@@ -144,16 +150,23 @@ NTSTATUS WINAPI NtCreateEvent(
NTSTATUS
WINAPI
NtOpenEvent
(
NTSTATUS
WINAPI
NtOpenEvent
(
OUT
PHANDLE
EventHandle
,
OUT
PHANDLE
EventHandle
,
IN
ACCESS_MASK
DesiredAccess
,
IN
ACCESS_MASK
DesiredAccess
,
IN
POBJECT_ATTRIBUTES
ObjectAttributes
)
IN
const
OBJECT_ATTRIBUTES
*
attr
)
{
{
struct
open_event_request
*
req
=
get_req_buffer
()
;
DWORD
len
=
attr
&&
attr
->
ObjectName
?
attr
->
ObjectName
->
Length
:
0
;
NTSTATUS
ret
;
NTSTATUS
ret
;
*
EventHandle
=
0
;
*
EventHandle
=
0
;
SERVER_START_REQ
{
struct
open_event_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
);
req
->
access
=
DesiredAccess
;
req
->
access
=
DesiredAccess
;
req
->
inherit
=
ObjectAttributes
&&
(
ObjectAttributes
->
Attributes
&
OBJ_INHERIT
);
req
->
inherit
=
attr
&&
(
attr
->
Attributes
&
OBJ_INHERIT
);
if
(
!
(
ret
=
copy_nameU
(
req
->
name
,
ObjectAttributes
))
&&
if
(
len
)
memcpy
(
server_data_ptr
(
req
),
attr
->
ObjectName
->
Buffer
,
len
);
!
(
ret
=
server_call_noerr
(
REQ_OPEN_EVENT
)))
*
EventHandle
=
req
->
handle
;
if
(
!
(
ret
=
server_call_noerr
(
REQ_OPEN_EVENT
)))
*
EventHandle
=
req
->
handle
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -161,29 +174,40 @@ NTSTATUS WINAPI NtOpenEvent(
...
@@ -161,29 +174,40 @@ NTSTATUS WINAPI NtOpenEvent(
/******************************************************************************
/******************************************************************************
* NtSetEvent
* NtSetEvent
*/
*/
NTSTATUS
WINAPI
NtSetEvent
(
NTSTATUS
WINAPI
NtSetEvent
(
HANDLE
handle
,
PULONG
NumberOfThreadsReleased
)
IN
HANDLE
EventHandle
,
PULONG
NumberOfThreadsReleased
)
{
{
struct
event_op_request
*
req
=
get_req_buffer
();
NTSTATUS
ret
;
FIXME
(
"(0x%08x,%p)
\n
"
,
EventHandle
,
NumberOfThreadsReleased
);
FIXME
(
"(0x%08x,%p)
\n
"
,
handle
,
NumberOfThreadsReleased
);
req
->
handle
=
EventHandle
;
SERVER_START_REQ
{
struct
event_op_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
op
=
SET_EVENT
;
req
->
op
=
SET_EVENT
;
return
server_call_noerr
(
REQ_EVENT_OP
);
ret
=
server_call_noerr
(
REQ_EVENT_OP
);
}
SERVER_END_REQ
;
return
ret
;
}
}
/******************************************************************************
/******************************************************************************
* NtResetEvent
* NtResetEvent
*/
*/
NTSTATUS
WINAPI
NtResetEvent
(
NTSTATUS
WINAPI
NtResetEvent
(
HANDLE
handle
,
PULONG
NumberOfThreadsReleased
)
IN
HANDLE
EventHandle
,
PULONG
NumberOfThreadsReleased
)
{
{
struct
event_op_request
*
req
=
get_req_buffer
();
NTSTATUS
ret
;
FIXME
(
"(0x%08x,%p)
\n
"
,
EventHandle
,
NumberOfThreadsReleased
);
req
->
handle
=
EventHandle
;
/* resetting an event can't release any thread... */
if
(
NumberOfThreadsReleased
)
*
NumberOfThreadsReleased
=
0
;
SERVER_START_REQ
{
struct
event_op_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
op
=
RESET_EVENT
;
req
->
op
=
RESET_EVENT
;
return
server_call_noerr
(
REQ_EVENT_OP
);
ret
=
server_call_noerr
(
REQ_EVENT_OP
);
}
SERVER_END_REQ
;
return
ret
;
}
}
/******************************************************************************
/******************************************************************************
...
@@ -192,10 +216,9 @@ NTSTATUS WINAPI NtResetEvent(
...
@@ -192,10 +216,9 @@ NTSTATUS WINAPI NtResetEvent(
* FIXME
* FIXME
* same as NtResetEvent ???
* same as NtResetEvent ???
*/
*/
NTSTATUS
WINAPI
NtClearEvent
(
NTSTATUS
WINAPI
NtClearEvent
(
HANDLE
handle
)
IN
HANDLE
EventHandle
)
{
{
return
NtResetEvent
(
EventH
andle
,
NULL
);
return
NtResetEvent
(
h
andle
,
NULL
);
}
}
/******************************************************************************
/******************************************************************************
...
@@ -204,15 +227,19 @@ NTSTATUS WINAPI NtClearEvent (
...
@@ -204,15 +227,19 @@ NTSTATUS WINAPI NtClearEvent (
* FIXME
* FIXME
* PulseCount
* PulseCount
*/
*/
NTSTATUS
WINAPI
NtPulseEvent
(
NTSTATUS
WINAPI
NtPulseEvent
(
HANDLE
handle
,
PULONG
PulseCount
)
IN
HANDLE
EventHandle
,
IN
PULONG
PulseCount
)
{
{
struct
event_op_request
*
req
=
get_req_buffer
();
NTSTATUS
ret
;
FIXME
(
"(0x%08x,%p)
\n
"
,
EventHandle
,
PulseCount
);
FIXME
(
"(0x%08x,%p)
\n
"
,
handle
,
PulseCount
);
req
->
handle
=
EventHandle
;
SERVER_START_REQ
{
struct
event_op_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
op
=
PULSE_EVENT
;
req
->
op
=
PULSE_EVENT
;
return
server_call_noerr
(
REQ_EVENT_OP
);
ret
=
server_call_noerr
(
REQ_EVENT_OP
);
}
SERVER_END_REQ
;
return
ret
;
}
}
/******************************************************************************
/******************************************************************************
...
...
files/change.c
View file @
9c2370bd
...
@@ -28,13 +28,19 @@ DEFAULT_DEBUG_CHANNEL(file);
...
@@ -28,13 +28,19 @@ DEFAULT_DEBUG_CHANNEL(file);
HANDLE
WINAPI
FindFirstChangeNotificationA
(
LPCSTR
lpPathName
,
BOOL
bWatchSubtree
,
HANDLE
WINAPI
FindFirstChangeNotificationA
(
LPCSTR
lpPathName
,
BOOL
bWatchSubtree
,
DWORD
dwNotifyFilter
)
DWORD
dwNotifyFilter
)
{
{
struct
create_change_notification_request
*
req
=
get_req_buffer
()
;
HANDLE
ret
=
-
1
;
FIXME
(
"this is not supported yet (non-trivial).
\n
"
);
FIXME
(
"this is not supported yet (non-trivial).
\n
"
);
SERVER_START_REQ
{
struct
create_change_notification_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
subtree
=
bWatchSubtree
;
req
->
subtree
=
bWatchSubtree
;
req
->
filter
=
dwNotifyFilter
;
req
->
filter
=
dwNotifyFilter
;
server_call
(
REQ_CREATE_CHANGE_NOTIFICATION
);
if
(
!
server_call
(
REQ_CREATE_CHANGE_NOTIFICATION
))
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
return
ret
;
}
}
/****************************************************************************
/****************************************************************************
...
...
files/file.c
View file @
9c2370bd
...
@@ -368,14 +368,20 @@ HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
...
@@ -368,14 +368,20 @@ HANDLE FILE_CreateFile( LPCSTR filename, DWORD access, DWORD sharing,
*/
*/
HFILE
FILE_CreateDevice
(
int
client_id
,
DWORD
access
,
LPSECURITY_ATTRIBUTES
sa
)
HFILE
FILE_CreateDevice
(
int
client_id
,
DWORD
access
,
LPSECURITY_ATTRIBUTES
sa
)
{
{
struct
create_device_request
*
req
=
get_req_buffer
();
HFILE
ret
;
SERVER_START_REQ
{
struct
create_device_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
id
=
client_id
;
req
->
id
=
client_id
;
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_DEVICE
);
server_call
(
REQ_CREATE_DEVICE
);
return
req
->
handle
;
ret
=
req
->
handle
;
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -566,11 +572,15 @@ BOOL FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info )
...
@@ -566,11 +572,15 @@ BOOL FILE_Stat( LPCSTR unixName, BY_HANDLE_FILE_INFORMATION *info )
DWORD
WINAPI
GetFileInformationByHandle
(
HANDLE
hFile
,
DWORD
WINAPI
GetFileInformationByHandle
(
HANDLE
hFile
,
BY_HANDLE_FILE_INFORMATION
*
info
)
BY_HANDLE_FILE_INFORMATION
*
info
)
{
{
struct
get_file_info_request
*
req
=
get_req_buffer
();
DWORD
ret
;
if
(
!
info
)
return
0
;
if
(
!
info
)
return
0
;
SERVER_START_REQ
{
struct
get_file_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hFile
;
req
->
handle
=
hFile
;
if
(
server_call
(
REQ_GET_FILE_INFO
))
return
0
;
if
((
ret
=
!
server_call
(
REQ_GET_FILE_INFO
)))
{
RtlSecondsSince1970ToTime
(
req
->
write_time
,
&
info
->
ftCreationTime
);
RtlSecondsSince1970ToTime
(
req
->
write_time
,
&
info
->
ftCreationTime
);
RtlSecondsSince1970ToTime
(
req
->
write_time
,
&
info
->
ftLastWriteTime
);
RtlSecondsSince1970ToTime
(
req
->
write_time
,
&
info
->
ftLastWriteTime
);
RtlSecondsSince1970ToTime
(
req
->
access_time
,
&
info
->
ftLastAccessTime
);
RtlSecondsSince1970ToTime
(
req
->
access_time
,
&
info
->
ftLastAccessTime
);
...
@@ -581,7 +591,10 @@ DWORD WINAPI GetFileInformationByHandle( HANDLE hFile,
...
@@ -581,7 +591,10 @@ DWORD WINAPI GetFileInformationByHandle( HANDLE hFile,
info
->
nNumberOfLinks
=
req
->
links
;
info
->
nNumberOfLinks
=
req
->
links
;
info
->
nFileIndexHigh
=
req
->
index_high
;
info
->
nFileIndexHigh
=
req
->
index_high
;
info
->
nFileIndexLow
=
req
->
index_low
;
info
->
nFileIndexLow
=
req
->
index_low
;
return
1
;
}
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -1271,7 +1284,7 @@ HFILE WINAPI _lcreat( LPCSTR path, INT attr )
...
@@ -1271,7 +1284,7 @@ HFILE WINAPI _lcreat( LPCSTR path, INT attr )
DWORD
WINAPI
SetFilePointer
(
HANDLE
hFile
,
LONG
distance
,
LONG
*
highword
,
DWORD
WINAPI
SetFilePointer
(
HANDLE
hFile
,
LONG
distance
,
LONG
*
highword
,
DWORD
method
)
DWORD
method
)
{
{
struct
set_file_pointer_request
*
req
=
get_req_buffer
()
;
DWORD
ret
=
0xffffffff
;
if
(
highword
&&
if
(
highword
&&
((
distance
>=
0
&&
*
highword
!=
0
)
||
(
distance
<
0
&&
*
highword
!=
-
1
)))
((
distance
>=
0
&&
*
highword
!=
0
)
||
(
distance
<
0
&&
*
highword
!=
-
1
)))
...
@@ -1280,20 +1293,28 @@ DWORD WINAPI SetFilePointer( HANDLE hFile, LONG distance, LONG *highword,
...
@@ -1280,20 +1293,28 @@ DWORD WINAPI SetFilePointer( HANDLE hFile, LONG distance, LONG *highword,
"SetFilePointer(%08x,%08lx,%08lx,%08lx)
\n
"
,
"SetFilePointer(%08x,%08lx,%08lx,%08lx)
\n
"
,
hFile
,
distance
,
*
highword
,
method
);
hFile
,
distance
,
*
highword
,
method
);
SetLastError
(
ERROR_INVALID_PARAMETER
);
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
0xffffffff
;
return
ret
;
}
}
TRACE
(
"handle %d offset %ld origin %ld
\n
"
,
TRACE
(
"handle %d offset %ld origin %ld
\n
"
,
hFile
,
distance
,
method
);
hFile
,
distance
,
method
);
SERVER_START_REQ
{
struct
set_file_pointer_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hFile
;
req
->
handle
=
hFile
;
req
->
low
=
distance
;
req
->
low
=
distance
;
req
->
high
=
highword
?
*
highword
:
(
distance
>=
0
)
?
0
:
-
1
;
req
->
high
=
highword
?
*
highword
:
(
distance
>=
0
)
?
0
:
-
1
;
/* FIXME: assumes 1:1 mapping between Windows and Unix seek constants */
/* FIXME: assumes 1:1 mapping between Windows and Unix seek constants */
req
->
whence
=
method
;
req
->
whence
=
method
;
SetLastError
(
0
);
SetLastError
(
0
);
if
(
server_call
(
REQ_SET_FILE_POINTER
))
return
0xffffffff
;
if
(
!
server_call
(
REQ_SET_FILE_POINTER
))
{
ret
=
req
->
new_low
;
if
(
highword
)
*
highword
=
req
->
new_high
;
if
(
highword
)
*
highword
=
req
->
new_high
;
return
req
->
new_low
;
}
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -1480,9 +1501,15 @@ UINT WINAPI SetHandleCount( UINT count )
...
@@ -1480,9 +1501,15 @@ UINT WINAPI SetHandleCount( UINT count )
*/
*/
BOOL
WINAPI
FlushFileBuffers
(
HANDLE
hFile
)
BOOL
WINAPI
FlushFileBuffers
(
HANDLE
hFile
)
{
{
struct
flush_file_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
flush_file_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hFile
;
req
->
handle
=
hFile
;
return
!
server_call
(
REQ_FLUSH_FILE
);
ret
=
!
server_call
(
REQ_FLUSH_FILE
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -1491,9 +1518,15 @@ BOOL WINAPI FlushFileBuffers( HANDLE hFile )
...
@@ -1491,9 +1518,15 @@ BOOL WINAPI FlushFileBuffers( HANDLE hFile )
*/
*/
BOOL
WINAPI
SetEndOfFile
(
HANDLE
hFile
)
BOOL
WINAPI
SetEndOfFile
(
HANDLE
hFile
)
{
{
struct
truncate_file_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
truncate_file_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hFile
;
req
->
handle
=
hFile
;
return
!
server_call
(
REQ_TRUNCATE_FILE
);
ret
=
!
server_call
(
REQ_TRUNCATE_FILE
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -1645,10 +1678,15 @@ int FILE_munmap( LPVOID start, DWORD size_high, DWORD size_low )
...
@@ -1645,10 +1678,15 @@ int FILE_munmap( LPVOID start, DWORD size_high, DWORD size_low )
*/
*/
DWORD
WINAPI
GetFileType
(
HANDLE
hFile
)
DWORD
WINAPI
GetFileType
(
HANDLE
hFile
)
{
{
struct
get_file_info_request
*
req
=
get_req_buffer
();
DWORD
ret
=
FILE_TYPE_UNKNOWN
;
SERVER_START_REQ
{
struct
get_file_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hFile
;
req
->
handle
=
hFile
;
if
(
server_call
(
REQ_GET_FILE_INFO
))
return
FILE_TYPE_UNKNOWN
;
if
(
!
server_call
(
REQ_GET_FILE_INFO
))
ret
=
req
->
type
;
return
req
->
type
;
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -1931,8 +1969,10 @@ BOOL WINAPI SetFileTime( HANDLE hFile,
...
@@ -1931,8 +1969,10 @@ BOOL WINAPI SetFileTime( HANDLE hFile,
const
FILETIME
*
lpLastAccessTime
,
const
FILETIME
*
lpLastAccessTime
,
const
FILETIME
*
lpLastWriteTime
)
const
FILETIME
*
lpLastWriteTime
)
{
{
struct
set_file_time_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
set_file_time_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hFile
;
req
->
handle
=
hFile
;
if
(
lpLastAccessTime
)
if
(
lpLastAccessTime
)
req
->
access_time
=
DOSFS_FileTimeToUnixTime
(
lpLastAccessTime
,
NULL
);
req
->
access_time
=
DOSFS_FileTimeToUnixTime
(
lpLastAccessTime
,
NULL
);
...
@@ -1942,7 +1982,10 @@ BOOL WINAPI SetFileTime( HANDLE hFile,
...
@@ -1942,7 +1982,10 @@ BOOL WINAPI SetFileTime( HANDLE hFile,
req
->
write_time
=
DOSFS_FileTimeToUnixTime
(
lpLastWriteTime
,
NULL
);
req
->
write_time
=
DOSFS_FileTimeToUnixTime
(
lpLastWriteTime
,
NULL
);
else
else
req
->
write_time
=
0
;
/* FIXME */
req
->
write_time
=
0
;
/* FIXME */
return
!
server_call
(
REQ_SET_FILE_TIME
);
ret
=
!
server_call
(
REQ_SET_FILE_TIME
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -1952,14 +1995,20 @@ BOOL WINAPI SetFileTime( HANDLE hFile,
...
@@ -1952,14 +1995,20 @@ BOOL WINAPI SetFileTime( HANDLE hFile,
BOOL
WINAPI
LockFile
(
HANDLE
hFile
,
DWORD
dwFileOffsetLow
,
DWORD
dwFileOffsetHigh
,
BOOL
WINAPI
LockFile
(
HANDLE
hFile
,
DWORD
dwFileOffsetLow
,
DWORD
dwFileOffsetHigh
,
DWORD
nNumberOfBytesToLockLow
,
DWORD
nNumberOfBytesToLockHigh
)
DWORD
nNumberOfBytesToLockLow
,
DWORD
nNumberOfBytesToLockHigh
)
{
{
struct
lock_file_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
lock_file_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hFile
;
req
->
handle
=
hFile
;
req
->
offset_low
=
dwFileOffsetLow
;
req
->
offset_low
=
dwFileOffsetLow
;
req
->
offset_high
=
dwFileOffsetHigh
;
req
->
offset_high
=
dwFileOffsetHigh
;
req
->
count_low
=
nNumberOfBytesToLockLow
;
req
->
count_low
=
nNumberOfBytesToLockLow
;
req
->
count_high
=
nNumberOfBytesToLockHigh
;
req
->
count_high
=
nNumberOfBytesToLockHigh
;
return
!
server_call
(
REQ_LOCK_FILE
);
ret
=
!
server_call
(
REQ_LOCK_FILE
);
}
SERVER_END_REQ
;
return
ret
;
}
}
/**************************************************************************
/**************************************************************************
...
@@ -1999,14 +2048,20 @@ BOOL WINAPI LockFileEx( HANDLE hFile, DWORD flags, DWORD reserved,
...
@@ -1999,14 +2048,20 @@ BOOL WINAPI LockFileEx( HANDLE hFile, DWORD flags, DWORD reserved,
BOOL
WINAPI
UnlockFile
(
HANDLE
hFile
,
DWORD
dwFileOffsetLow
,
DWORD
dwFileOffsetHigh
,
BOOL
WINAPI
UnlockFile
(
HANDLE
hFile
,
DWORD
dwFileOffsetLow
,
DWORD
dwFileOffsetHigh
,
DWORD
nNumberOfBytesToUnlockLow
,
DWORD
nNumberOfBytesToUnlockHigh
)
DWORD
nNumberOfBytesToUnlockLow
,
DWORD
nNumberOfBytesToUnlockHigh
)
{
{
struct
unlock_file_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
unlock_file_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hFile
;
req
->
handle
=
hFile
;
req
->
offset_low
=
dwFileOffsetLow
;
req
->
offset_low
=
dwFileOffsetLow
;
req
->
offset_high
=
dwFileOffsetHigh
;
req
->
offset_high
=
dwFileOffsetHigh
;
req
->
count_low
=
nNumberOfBytesToUnlockLow
;
req
->
count_low
=
nNumberOfBytesToUnlockLow
;
req
->
count_high
=
nNumberOfBytesToUnlockHigh
;
req
->
count_high
=
nNumberOfBytesToUnlockHigh
;
return
!
server_call
(
REQ_UNLOCK_FILE
);
ret
=
!
server_call
(
REQ_UNLOCK_FILE
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
...
include/ntddk.h
View file @
9c2370bd
...
@@ -910,12 +910,10 @@ NTSTATUS WINAPI NtClose(
...
@@ -910,12 +910,10 @@ NTSTATUS WINAPI NtClose(
HANDLE
Handle
);
HANDLE
Handle
);
NTSTATUS
WINAPI
NtTerminateProcess
(
HANDLE
handle
,
LONG
exit_code
);
NTSTATUS
WINAPI
NtTerminateProcess
(
HANDLE
handle
,
LONG
exit_code
);
NTSTATUS
WINAPI
NtTerminateThread
(
HANDLE
handle
,
LONG
exit_code
);
NTSTATUS
WINAPI
NtCreateSemaphore
(
OUT
PHANDLE
SemaphoreHandle
,
NTSTATUS
WINAPI
NtCreateEvent
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
,
BOOLEAN
,
BOOLEAN
);
IN
ACCESS_MASK
DesiredAccess
,
NTSTATUS
WINAPI
NtCreateSemaphore
(
PHANDLE
,
ACCESS_MASK
,
const
OBJECT_ATTRIBUTES
*
,
ULONG
,
ULONG
);
IN
POBJECT_ATTRIBUTES
ObjectAttributes
OPTIONAL
,
IN
ULONG
InitialCount
,
IN
ULONG
MaximumCount
);
NTSTATUS
WINAPI
NtReleaseSemaphore
(
IN
HANDLE
SemaphoreHandle
,
NTSTATUS
WINAPI
NtReleaseSemaphore
(
IN
HANDLE
SemaphoreHandle
,
IN
ULONG
ReleaseCount
,
IN
ULONG
ReleaseCount
,
IN
PULONG
PreviousCount
);
IN
PULONG
PreviousCount
);
...
...
include/server.h
View file @
9c2370bd
...
@@ -350,8 +350,7 @@ struct get_apc_request
...
@@ -350,8 +350,7 @@ struct get_apc_request
REQUEST_HEADER
;
/* request header */
REQUEST_HEADER
;
/* request header */
OUT
void
*
func
;
/* function to call */
OUT
void
*
func
;
/* function to call */
OUT
int
type
;
/* function type */
OUT
int
type
;
/* function type */
OUT
int
nb_args
;
/* number of arguments */
OUT
VARARG
(
args
,
ptrs
);
/* function arguments */
OUT
void
*
args
[
1
];
/* function arguments */
};
};
enum
apc_type
{
APC_NONE
,
APC_USER
,
APC_TIMER
};
enum
apc_type
{
APC_NONE
,
APC_USER
,
APC_TIMER
};
...
@@ -415,11 +414,10 @@ struct open_process_request
...
@@ -415,11 +414,10 @@ struct open_process_request
struct
select_request
struct
select_request
{
{
REQUEST_HEADER
;
/* request header */
REQUEST_HEADER
;
/* request header */
IN
int
count
;
/* handles count */
IN
int
flags
;
/* wait flags (see below) */
IN
int
flags
;
/* wait flags (see below) */
IN
int
timeout
;
/* timeout in ms */
IN
int
timeout
;
/* timeout in ms */
OUT
int
signaled
;
/* signaled handle */
OUT
int
signaled
;
/* signaled handle */
IN
int
handles
[
1
];
/* handles to select on */
IN
VARARG
(
handles
,
ints
);
/* handles to select on */
};
};
#define SELECT_ALL 1
#define SELECT_ALL 1
#define SELECT_ALERTABLE 2
#define SELECT_ALERTABLE 2
...
@@ -434,7 +432,7 @@ struct create_event_request
...
@@ -434,7 +432,7 @@ struct create_event_request
IN
int
initial_state
;
/* initial state of the event */
IN
int
initial_state
;
/* initial state of the event */
IN
int
inherit
;
/* inherit flag */
IN
int
inherit
;
/* inherit flag */
OUT
int
handle
;
/* handle to the event */
OUT
int
handle
;
/* handle to the event */
IN
WCHAR
name
[
1
];
/* even
t name */
IN
VARARG
(
name
,
unicode_str
);
/* objec
t name */
};
};
/* Event operation */
/* Event operation */
...
@@ -454,7 +452,7 @@ struct open_event_request
...
@@ -454,7 +452,7 @@ struct open_event_request
IN
unsigned
int
access
;
/* wanted access rights */
IN
unsigned
int
access
;
/* wanted access rights */
IN
int
inherit
;
/* inherit flag */
IN
int
inherit
;
/* inherit flag */
OUT
int
handle
;
/* handle to the event */
OUT
int
handle
;
/* handle to the event */
IN
WCHAR
name
[
1
];
/* object name */
IN
VARARG
(
name
,
unicode_str
);
/* object name */
};
};
...
@@ -465,7 +463,7 @@ struct create_mutex_request
...
@@ -465,7 +463,7 @@ struct create_mutex_request
IN
int
owned
;
/* initially owned? */
IN
int
owned
;
/* initially owned? */
IN
int
inherit
;
/* inherit flag */
IN
int
inherit
;
/* inherit flag */
OUT
int
handle
;
/* handle to the mutex */
OUT
int
handle
;
/* handle to the mutex */
IN
WCHAR
name
[
1
];
/* mutex
name */
IN
VARARG
(
name
,
unicode_str
);
/* object
name */
};
};
...
@@ -484,7 +482,7 @@ struct open_mutex_request
...
@@ -484,7 +482,7 @@ struct open_mutex_request
IN
unsigned
int
access
;
/* wanted access rights */
IN
unsigned
int
access
;
/* wanted access rights */
IN
int
inherit
;
/* inherit flag */
IN
int
inherit
;
/* inherit flag */
OUT
int
handle
;
/* handle to the mutex */
OUT
int
handle
;
/* handle to the mutex */
IN
WCHAR
name
[
1
];
/* object name */
IN
VARARG
(
name
,
unicode_str
);
/* object name */
};
};
...
@@ -496,7 +494,7 @@ struct create_semaphore_request
...
@@ -496,7 +494,7 @@ struct create_semaphore_request
IN
unsigned
int
max
;
/* maximum count */
IN
unsigned
int
max
;
/* maximum count */
IN
int
inherit
;
/* inherit flag */
IN
int
inherit
;
/* inherit flag */
OUT
int
handle
;
/* handle to the semaphore */
OUT
int
handle
;
/* handle to the semaphore */
IN
WCHAR
name
[
1
];
/* semaphore
name */
IN
VARARG
(
name
,
unicode_str
);
/* object
name */
};
};
...
@@ -517,7 +515,7 @@ struct open_semaphore_request
...
@@ -517,7 +515,7 @@ struct open_semaphore_request
IN
unsigned
int
access
;
/* wanted access rights */
IN
unsigned
int
access
;
/* wanted access rights */
IN
int
inherit
;
/* inherit flag */
IN
int
inherit
;
/* inherit flag */
OUT
int
handle
;
/* handle to the semaphore */
OUT
int
handle
;
/* handle to the semaphore */
IN
WCHAR
name
[
1
];
/* object name */
IN
VARARG
(
name
,
unicode_str
);
/* object name */
};
};
...
@@ -835,7 +833,7 @@ struct create_mapping_request
...
@@ -835,7 +833,7 @@ struct create_mapping_request
IN
int
inherit
;
/* inherit flag */
IN
int
inherit
;
/* inherit flag */
IN
int
file_handle
;
/* file handle */
IN
int
file_handle
;
/* file handle */
OUT
int
handle
;
/* handle to the mapping */
OUT
int
handle
;
/* handle to the mapping */
IN
WCHAR
name
[
1
];
/* object name */
IN
VARARG
(
name
,
unicode_str
);
/* object name */
};
};
/* protection flags */
/* protection flags */
#define VPROT_READ 0x01
#define VPROT_READ 0x01
...
@@ -855,7 +853,7 @@ struct open_mapping_request
...
@@ -855,7 +853,7 @@ struct open_mapping_request
IN
unsigned
int
access
;
/* wanted access rights */
IN
unsigned
int
access
;
/* wanted access rights */
IN
int
inherit
;
/* inherit flag */
IN
int
inherit
;
/* inherit flag */
OUT
int
handle
;
/* handle to the mapping */
OUT
int
handle
;
/* handle to the mapping */
IN
WCHAR
name
[
1
];
/* object name */
IN
VARARG
(
name
,
unicode_str
);
/* object name */
};
};
...
@@ -941,7 +939,7 @@ struct wait_debug_event_request
...
@@ -941,7 +939,7 @@ struct wait_debug_event_request
IN
int
timeout
;
/* timeout in ms */
IN
int
timeout
;
/* timeout in ms */
OUT
void
*
pid
;
/* process id */
OUT
void
*
pid
;
/* process id */
OUT
void
*
tid
;
/* thread id */
OUT
void
*
tid
;
/* thread id */
OUT
debug_event_t
event
;
/* debug event data */
OUT
VARARG
(
event
,
debug_event
);
/* debug event data */
};
};
...
@@ -1175,7 +1173,7 @@ struct create_timer_request
...
@@ -1175,7 +1173,7 @@ struct create_timer_request
IN
int
inherit
;
/* inherit flag */
IN
int
inherit
;
/* inherit flag */
IN
int
manual
;
/* manual reset */
IN
int
manual
;
/* manual reset */
OUT
int
handle
;
/* handle to the timer */
OUT
int
handle
;
/* handle to the timer */
IN
WCHAR
name
[
1
];
/* timer
name */
IN
VARARG
(
name
,
unicode_str
);
/* object
name */
};
};
...
@@ -1186,7 +1184,7 @@ struct open_timer_request
...
@@ -1186,7 +1184,7 @@ struct open_timer_request
IN
unsigned
int
access
;
/* wanted access rights */
IN
unsigned
int
access
;
/* wanted access rights */
IN
int
inherit
;
/* inherit flag */
IN
int
inherit
;
/* inherit flag */
OUT
int
handle
;
/* handle to the timer */
OUT
int
handle
;
/* handle to the timer */
IN
WCHAR
name
[
1
];
/* timer
name */
IN
VARARG
(
name
,
unicode_str
);
/* object
name */
};
};
/* Set a waitable timer */
/* Set a waitable timer */
...
@@ -1247,7 +1245,7 @@ struct add_atom_request
...
@@ -1247,7 +1245,7 @@ struct add_atom_request
REQUEST_HEADER
;
/* request header */
REQUEST_HEADER
;
/* request header */
IN
int
local
;
/* is atom in local process table? */
IN
int
local
;
/* is atom in local process table? */
OUT
int
atom
;
/* resulting atom */
OUT
int
atom
;
/* resulting atom */
IN
WCHAR
name
[
1
];
/* atom name */
IN
VARARG
(
name
,
unicode_str
);
/* atom name */
};
};
...
@@ -1266,7 +1264,7 @@ struct find_atom_request
...
@@ -1266,7 +1264,7 @@ struct find_atom_request
REQUEST_HEADER
;
/* request header */
REQUEST_HEADER
;
/* request header */
IN
int
local
;
/* is atom in local process table? */
IN
int
local
;
/* is atom in local process table? */
OUT
int
atom
;
/* atom handle */
OUT
int
atom
;
/* atom handle */
IN
WCHAR
name
[
1
];
/* atom name */
IN
VARARG
(
name
,
unicode_str
);
/* atom name */
};
};
...
@@ -1277,7 +1275,7 @@ struct get_atom_name_request
...
@@ -1277,7 +1275,7 @@ struct get_atom_name_request
IN
int
atom
;
/* atom handle */
IN
int
atom
;
/* atom handle */
IN
int
local
;
/* is atom in local process table? */
IN
int
local
;
/* is atom in local process table? */
OUT
int
count
;
/* atom lock count */
OUT
int
count
;
/* atom lock count */
OUT
WCHAR
name
[
1
];
/* atom name */
OUT
VARARG
(
name
,
unicode_str
);
/* atom name */
};
};
...
@@ -1542,7 +1540,7 @@ union generic_request
...
@@ -1542,7 +1540,7 @@ union generic_request
struct
wait_input_idle_request
wait_input_idle
;
struct
wait_input_idle_request
wait_input_idle
;
};
};
#define SERVER_PROTOCOL_VERSION 1
8
#define SERVER_PROTOCOL_VERSION 1
9
/* ### make_requests end ### */
/* ### make_requests end ### */
/* Everything above this line is generated automatically by tools/make_requests */
/* Everything above this line is generated automatically by tools/make_requests */
...
@@ -1621,6 +1619,12 @@ inline static void *server_data_ptr( void *req )
...
@@ -1621,6 +1619,12 @@ inline static void *server_data_ptr( void *req )
return
(
union
generic_request
*
)
req
+
1
;
return
(
union
generic_request
*
)
req
+
1
;
}
}
/* get the size of the variable part of the request */
inline
static
size_t
server_data_size
(
void
*
req
)
{
return
((
struct
request_header
*
)
req
)
->
var_size
;
}
/* exception support for server calls */
/* exception support for server calls */
...
...
loader/module.c
View file @
9c2370bd
...
@@ -1526,12 +1526,14 @@ BOOL MODULE_FreeLibrary( WINE_MODREF *wm )
...
@@ -1526,12 +1526,14 @@ BOOL MODULE_FreeLibrary( WINE_MODREF *wm )
/* Call process detach notifications */
/* Call process detach notifications */
if
(
PROCESS_Current
()
->
free_lib_count
<=
1
)
if
(
PROCESS_Current
()
->
free_lib_count
<=
1
)
{
{
struct
unload_dll_request
*
req
=
get_req_buffer
();
MODULE_DllProcessDetach
(
FALSE
,
NULL
);
MODULE_DllProcessDetach
(
FALSE
,
NULL
);
SERVER_START_REQ
{
struct
unload_dll_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
base
=
(
void
*
)
wm
->
module
;
req
->
base
=
(
void
*
)
wm
->
module
;
server_call_noerr
(
REQ_UNLOAD_DLL
);
server_call_noerr
(
REQ_UNLOAD_DLL
);
}
SERVER_END_REQ
;
MODULE_FlushModrefs
();
MODULE_FlushModrefs
();
}
}
...
...
loader/ne/module.c
View file @
9c2370bd
...
@@ -992,7 +992,6 @@ static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_
...
@@ -992,7 +992,6 @@ static HINSTANCE16 MODULE_LoadModule16( LPCSTR libname, BOOL implicit, BOOL lib_
*/
*/
HINSTANCE16
WINAPI
LoadModule16
(
LPCSTR
name
,
LPVOID
paramBlock
)
HINSTANCE16
WINAPI
LoadModule16
(
LPCSTR
name
,
LPVOID
paramBlock
)
{
{
struct
new_thread_request
*
req
=
get_req_buffer
();
TEB
*
teb
=
NULL
;
TEB
*
teb
=
NULL
;
BOOL
lib_only
=
!
paramBlock
||
(
paramBlock
==
(
LPVOID
)
-
1
);
BOOL
lib_only
=
!
paramBlock
||
(
paramBlock
==
(
LPVOID
)
-
1
);
LOADPARAMS16
*
params
;
LOADPARAMS16
*
params
;
...
@@ -1003,7 +1002,7 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
...
@@ -1003,7 +1002,7 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
TDB
*
pTask
;
TDB
*
pTask
;
LPSTR
cmdline
;
LPSTR
cmdline
;
WORD
cmdShow
;
WORD
cmdShow
;
HANDLE
hThread
;
HANDLE
hThread
=
-
1
;
int
socket
;
int
socket
;
/* Load module */
/* Load module */
...
@@ -1046,10 +1045,15 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
...
@@ -1046,10 +1045,15 @@ HINSTANCE16 WINAPI LoadModule16( LPCSTR name, LPVOID paramBlock )
/* Create the main thread */
/* Create the main thread */
SERVER_START_REQ
{
struct
new_thread_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
suspend
=
0
;
req
->
suspend
=
0
;
req
->
inherit
=
0
;
req
->
inherit
=
0
;
if
(
server_call_fd
(
REQ_NEW_THREAD
,
-
1
,
&
socket
))
return
0
;
if
(
!
server_call_fd
(
REQ_NEW_THREAD
,
-
1
,
&
socket
))
hThread
=
req
->
handle
;
hThread
=
req
->
handle
;
}
SERVER_END_REQ
;
if
(
hThread
==
-
1
)
return
0
;
if
(
!
(
teb
=
THREAD_Create
(
socket
,
0
,
FALSE
)))
goto
error
;
if
(
!
(
teb
=
THREAD_Create
(
socket
,
0
,
FALSE
)))
goto
error
;
teb
->
startup
=
NE_InitProcess
;
teb
->
startup
=
NE_InitProcess
;
...
...
loader/pe_image.c
View file @
9c2370bd
...
@@ -23,6 +23,7 @@
...
@@ -23,6 +23,7 @@
* NE_MODULE.module32.
* NE_MODULE.module32.
*/
*/
#include <sys/types.h>
#ifdef HAVE_SYS_MMAN_H
#ifdef HAVE_SYS_MMAN_H
#include <sys/mman.h>
#include <sys/mman.h>
#endif
#endif
...
@@ -682,7 +683,9 @@ WINE_MODREF *PE_CreateModule( HMODULE hModule, LPCSTR filename, DWORD flags,
...
@@ -682,7 +683,9 @@ WINE_MODREF *PE_CreateModule( HMODULE hModule, LPCSTR filename, DWORD flags,
if
(
nt
->
FileHeader
.
Characteristics
&
IMAGE_FILE_DLL
)
if
(
nt
->
FileHeader
.
Characteristics
&
IMAGE_FILE_DLL
)
{
{
struct
load_dll_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
load_dll_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hFile
;
req
->
handle
=
hFile
;
req
->
base
=
(
void
*
)
hModule
;
req
->
base
=
(
void
*
)
hModule
;
req
->
dbg_offset
=
nt
->
FileHeader
.
PointerToSymbolTable
;
req
->
dbg_offset
=
nt
->
FileHeader
.
PointerToSymbolTable
;
...
@@ -690,6 +693,8 @@ WINE_MODREF *PE_CreateModule( HMODULE hModule, LPCSTR filename, DWORD flags,
...
@@ -690,6 +693,8 @@ WINE_MODREF *PE_CreateModule( HMODULE hModule, LPCSTR filename, DWORD flags,
req
->
name
=
&
wm
->
filename
;
req
->
name
=
&
wm
->
filename
;
server_call_noerr
(
REQ_LOAD_DLL
);
server_call_noerr
(
REQ_LOAD_DLL
);
}
}
SERVER_END_REQ
;
}
return
wm
;
return
wm
;
}
}
...
...
memory/atom.c
View file @
9c2370bd
...
@@ -401,9 +401,15 @@ UINT16 WINAPI GetAtomName16( ATOM atom, LPSTR buffer, INT16 count )
...
@@ -401,9 +401,15 @@ UINT16 WINAPI GetAtomName16( ATOM atom, LPSTR buffer, INT16 count )
*/
*/
BOOL
WINAPI
InitAtomTable
(
DWORD
entries
)
BOOL
WINAPI
InitAtomTable
(
DWORD
entries
)
{
{
struct
init_atom_table_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
init_atom_table_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
entries
=
entries
;
req
->
entries
=
entries
;
return
!
server_call
(
REQ_INIT_ATOM_TABLE
);
ret
=
!
server_call
(
REQ_INIT_ATOM_TABLE
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -412,11 +418,21 @@ static ATOM ATOM_AddAtomA( LPCSTR str, BOOL local )
...
@@ -412,11 +418,21 @@ static ATOM ATOM_AddAtomA( LPCSTR str, BOOL local )
ATOM
atom
=
0
;
ATOM
atom
=
0
;
if
(
!
ATOM_IsIntAtomA
(
str
,
&
atom
))
if
(
!
ATOM_IsIntAtomA
(
str
,
&
atom
))
{
{
struct
add_atom_request
*
req
=
get_req_buffer
();
DWORD
len
=
MultiByteToWideChar
(
CP_ACP
,
0
,
str
,
strlen
(
str
),
NULL
,
0
);
server_strcpyAtoW
(
req
->
name
,
str
);
if
(
len
>
MAX_ATOM_LEN
)
{
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
0
;
}
SERVER_START_REQ
{
struct
add_atom_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
MultiByteToWideChar
(
CP_ACP
,
0
,
str
,
strlen
(
str
),
server_data_ptr
(
req
),
len
);
req
->
local
=
local
;
req
->
local
=
local
;
if
(
!
server_call
(
REQ_ADD_ATOM
))
atom
=
req
->
atom
+
MIN_STR_ATOM
;
if
(
!
server_call
(
REQ_ADD_ATOM
))
atom
=
req
->
atom
+
MIN_STR_ATOM
;
}
}
SERVER_END_REQ
;
}
TRACE
(
"(%s) %s -> %x
\n
"
,
local
?
"local"
:
"global"
,
debugres_a
(
str
),
atom
);
TRACE
(
"(%s) %s -> %x
\n
"
,
local
?
"local"
:
"global"
,
debugres_a
(
str
),
atom
);
return
atom
;
return
atom
;
}
}
...
@@ -458,11 +474,21 @@ static ATOM ATOM_AddAtomW( LPCWSTR str, BOOL local )
...
@@ -458,11 +474,21 @@ static ATOM ATOM_AddAtomW( LPCWSTR str, BOOL local )
ATOM
atom
=
0
;
ATOM
atom
=
0
;
if
(
!
ATOM_IsIntAtomW
(
str
,
&
atom
))
if
(
!
ATOM_IsIntAtomW
(
str
,
&
atom
))
{
{
struct
add_atom_request
*
req
=
get_req_buffer
();
DWORD
len
=
strlenW
(
str
);
server_strcpyW
(
req
->
name
,
str
);
if
(
len
>
MAX_ATOM_LEN
)
{
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
0
;
}
SERVER_START_REQ
{
struct
add_atom_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
memcpy
(
server_data_ptr
(
req
),
str
,
len
*
sizeof
(
WCHAR
)
);
req
->
local
=
local
;
req
->
local
=
local
;
if
(
!
server_call
(
REQ_ADD_ATOM
))
atom
=
req
->
atom
+
MIN_STR_ATOM
;
if
(
!
server_call
(
REQ_ADD_ATOM
))
atom
=
req
->
atom
+
MIN_STR_ATOM
;
}
}
SERVER_END_REQ
;
}
TRACE
(
"(%s) %s -> %x
\n
"
,
local
?
"local"
:
"global"
,
debugres_w
(
str
),
atom
);
TRACE
(
"(%s) %s -> %x
\n
"
,
local
?
"local"
:
"global"
,
debugres_w
(
str
),
atom
);
return
atom
;
return
atom
;
}
}
...
@@ -492,11 +518,15 @@ static ATOM ATOM_DeleteAtom( ATOM atom, BOOL local)
...
@@ -492,11 +518,15 @@ static ATOM ATOM_DeleteAtom( ATOM atom, BOOL local)
if
(
atom
<
MIN_STR_ATOM
)
atom
=
0
;
if
(
atom
<
MIN_STR_ATOM
)
atom
=
0
;
else
else
{
{
struct
delete_atom_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
delete_atom_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
atom
=
atom
-
MIN_STR_ATOM
;
req
->
atom
=
atom
-
MIN_STR_ATOM
;
req
->
local
=
local
;
req
->
local
=
local
;
if
(
!
server_call
(
REQ_DELETE_ATOM
))
atom
=
0
;
if
(
!
server_call
(
REQ_DELETE_ATOM
))
atom
=
0
;
}
}
SERVER_END_REQ
;
}
return
atom
;
return
atom
;
}
}
...
@@ -536,10 +566,20 @@ static ATOM ATOM_FindAtomA( LPCSTR str, BOOL local )
...
@@ -536,10 +566,20 @@ static ATOM ATOM_FindAtomA( LPCSTR str, BOOL local )
ATOM
atom
=
0
;
ATOM
atom
=
0
;
if
(
!
ATOM_IsIntAtomA
(
str
,
&
atom
))
if
(
!
ATOM_IsIntAtomA
(
str
,
&
atom
))
{
{
struct
find_atom_request
*
req
=
get_req_buffer
();
DWORD
len
=
MultiByteToWideChar
(
CP_ACP
,
0
,
str
,
strlen
(
str
),
NULL
,
0
);
server_strcpyAtoW
(
req
->
name
,
str
);
if
(
len
>
MAX_ATOM_LEN
)
{
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
0
;
}
SERVER_START_REQ
{
struct
find_atom_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
MultiByteToWideChar
(
CP_ACP
,
0
,
str
,
strlen
(
str
),
server_data_ptr
(
req
),
len
);
req
->
local
=
local
;
req
->
local
=
local
;
if
(
!
server_call
(
REQ_FIND_ATOM
))
atom
=
req
->
atom
+
MIN_STR_ATOM
;
if
(
!
server_call
(
REQ_ADD_ATOM
))
atom
=
req
->
atom
+
MIN_STR_ATOM
;
}
SERVER_END_REQ
;
}
}
TRACE
(
"(%s) %s -> %x
\n
"
,
local
?
"local"
:
"global"
,
debugres_a
(
str
),
atom
);
TRACE
(
"(%s) %s -> %x
\n
"
,
local
?
"local"
:
"global"
,
debugres_a
(
str
),
atom
);
return
atom
;
return
atom
;
...
@@ -581,11 +621,21 @@ static ATOM ATOM_FindAtomW( LPCWSTR str, BOOL local )
...
@@ -581,11 +621,21 @@ static ATOM ATOM_FindAtomW( LPCWSTR str, BOOL local )
ATOM
atom
=
0
;
ATOM
atom
=
0
;
if
(
!
ATOM_IsIntAtomW
(
str
,
&
atom
))
if
(
!
ATOM_IsIntAtomW
(
str
,
&
atom
))
{
{
struct
find_atom_request
*
req
=
get_req_buffer
();
DWORD
len
=
strlenW
(
str
);
server_strcpyW
(
req
->
name
,
str
);
if
(
len
>
MAX_ATOM_LEN
)
{
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
0
;
}
SERVER_START_REQ
{
struct
find_atom_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
memcpy
(
server_data_ptr
(
req
),
str
,
len
*
sizeof
(
WCHAR
)
);
req
->
local
=
local
;
req
->
local
=
local
;
if
(
!
server_call
(
REQ_FIND_ATOM
))
atom
=
req
->
atom
+
MIN_STR_ATOM
;
if
(
!
server_call
(
REQ_FIND_ATOM
))
atom
=
req
->
atom
+
MIN_STR_ATOM
;
}
}
SERVER_END_REQ
;
}
TRACE
(
"(%s) %s -> %x
\n
"
,
local
?
"local"
:
"global"
,
debugres_w
(
str
),
atom
);
TRACE
(
"(%s) %s -> %x
\n
"
,
local
?
"local"
:
"global"
,
debugres_w
(
str
),
atom
);
return
atom
;
return
atom
;
}
}
...
@@ -612,6 +662,12 @@ ATOM WINAPI FindAtomW( LPCWSTR str )
...
@@ -612,6 +662,12 @@ ATOM WINAPI FindAtomW( LPCWSTR str )
static
UINT
ATOM_GetAtomNameA
(
ATOM
atom
,
LPSTR
buffer
,
INT
count
,
BOOL
local
)
static
UINT
ATOM_GetAtomNameA
(
ATOM
atom
,
LPSTR
buffer
,
INT
count
,
BOOL
local
)
{
{
INT
len
;
INT
len
;
if
(
count
<=
0
)
{
SetLastError
(
ERROR_MORE_DATA
);
return
0
;
}
if
(
atom
<
MIN_STR_ATOM
)
if
(
atom
<
MIN_STR_ATOM
)
{
{
char
name
[
8
];
char
name
[
8
];
...
@@ -625,16 +681,28 @@ static UINT ATOM_GetAtomNameA( ATOM atom, LPSTR buffer, INT count, BOOL local )
...
@@ -625,16 +681,28 @@ static UINT ATOM_GetAtomNameA( ATOM atom, LPSTR buffer, INT count, BOOL local )
}
}
else
else
{
{
struct
get_atom_name_request
*
req
=
get_req_buffer
();
len
=
0
;
SERVER_START_REQ
{
struct
get_atom_name_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
MAX_ATOM_LEN
*
sizeof
(
WCHAR
)
);
req
->
atom
=
atom
-
MIN_STR_ATOM
;
req
->
atom
=
atom
-
MIN_STR_ATOM
;
req
->
local
=
local
;
req
->
local
=
local
;
if
(
server_call
(
REQ_GET_ATOM_NAME
))
return
0
;
if
(
!
server_call
(
REQ_GET_ATOM_NAME
))
lstrcpynWtoA
(
buffer
,
req
->
name
,
count
);
{
len
=
strlenW
(
req
->
name
);
len
=
WideCharToMultiByte
(
CP_ACP
,
0
,
server_data_ptr
(
req
),
server_data_size
(
req
),
buffer
,
count
-
1
,
NULL
,
NULL
);
if
(
!
len
)
len
=
count
;
/* overflow */
else
buffer
[
len
]
=
0
;
}
}
if
(
count
<=
len
)
}
SERVER_END_REQ
;
}
if
(
len
&&
count
<=
len
)
{
{
SetLastError
(
ERROR_MORE_DATA
);
SetLastError
(
ERROR_MORE_DATA
);
buffer
[
count
-
1
]
=
0
;
return
0
;
return
0
;
}
}
TRACE
(
"(%s) %x -> %s
\n
"
,
local
?
"local"
:
"global"
,
atom
,
debugstr_a
(
buffer
)
);
TRACE
(
"(%s) %x -> %s
\n
"
,
local
?
"local"
:
"global"
,
atom
,
debugstr_a
(
buffer
)
);
...
@@ -680,6 +748,12 @@ UINT WINAPI GetAtomNameA(
...
@@ -680,6 +748,12 @@ UINT WINAPI GetAtomNameA(
static
UINT
ATOM_GetAtomNameW
(
ATOM
atom
,
LPWSTR
buffer
,
INT
count
,
BOOL
local
)
static
UINT
ATOM_GetAtomNameW
(
ATOM
atom
,
LPWSTR
buffer
,
INT
count
,
BOOL
local
)
{
{
INT
len
;
INT
len
;
if
(
count
<=
0
)
{
SetLastError
(
ERROR_MORE_DATA
);
return
0
;
}
if
(
atom
<
MIN_STR_ATOM
)
if
(
atom
<
MIN_STR_ATOM
)
{
{
char
name
[
8
];
char
name
[
8
];
...
@@ -688,17 +762,29 @@ static UINT ATOM_GetAtomNameW( ATOM atom, LPWSTR buffer, INT count, BOOL local )
...
@@ -688,17 +762,29 @@ static UINT ATOM_GetAtomNameW( ATOM atom, LPWSTR buffer, INT count, BOOL local )
SetLastError
(
ERROR_INVALID_PARAMETER
);
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
0
;
return
0
;
}
}
len
=
sprintf
(
name
,
"#%d"
,
atom
);
sprintf
(
name
,
"#%d"
,
atom
);
lstrcpynAtoW
(
buffer
,
name
,
count
);
len
=
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
-
1
,
buffer
,
count
);
if
(
!
len
)
buffer
[
count
-
1
]
=
0
;
/* overflow */
}
}
else
else
{
{
struct
get_atom_name_request
*
req
=
get_req_buffer
();
len
=
0
;
SERVER_START_REQ
{
struct
get_atom_name_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
MAX_ATOM_LEN
*
sizeof
(
WCHAR
)
);
req
->
atom
=
atom
-
MIN_STR_ATOM
;
req
->
atom
=
atom
-
MIN_STR_ATOM
;
req
->
local
=
local
;
req
->
local
=
local
;
if
(
server_call
(
REQ_GET_ATOM_NAME
))
return
0
;
if
(
!
server_call
(
REQ_GET_ATOM_NAME
))
lstrcpynW
(
buffer
,
req
->
name
,
count
);
{
len
=
strlenW
(
req
->
name
);
len
=
server_data_size
(
req
)
/
sizeof
(
WCHAR
);
if
(
count
>
len
)
count
=
len
+
1
;
memcpy
(
buffer
,
server_data_ptr
(
req
),
(
count
-
1
)
*
sizeof
(
WCHAR
)
);
buffer
[
count
-
1
]
=
0
;
}
}
SERVER_END_REQ
;
if
(
!
len
)
return
0
;
}
}
if
(
count
<=
len
)
if
(
count
<=
len
)
{
{
...
...
memory/selector.c
View file @
9c2370bd
...
@@ -606,7 +606,7 @@ void WINAPI UnMapLS( SEGPTR sptr )
...
@@ -606,7 +606,7 @@ void WINAPI UnMapLS( SEGPTR sptr )
BOOL
WINAPI
GetThreadSelectorEntry
(
HANDLE
hthread
,
DWORD
sel
,
LPLDT_ENTRY
ldtent
)
BOOL
WINAPI
GetThreadSelectorEntry
(
HANDLE
hthread
,
DWORD
sel
,
LPLDT_ENTRY
ldtent
)
{
{
#ifdef __i386__
#ifdef __i386__
struct
get_selector_entry_request
*
req
=
get_req_buffer
()
;
BOOL
ret
;
if
(
!
(
sel
&
4
))
/* GDT selector */
if
(
!
(
sel
&
4
))
/* GDT selector */
{
{
...
@@ -639,15 +639,21 @@ BOOL WINAPI GetThreadSelectorEntry( HANDLE hthread, DWORD sel, LPLDT_ENTRY ldten
...
@@ -639,15 +639,21 @@ BOOL WINAPI GetThreadSelectorEntry( HANDLE hthread, DWORD sel, LPLDT_ENTRY ldten
return
FALSE
;
return
FALSE
;
}
}
SERVER_START_REQ
{
struct
get_selector_entry_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hthread
;
req
->
handle
=
hthread
;
req
->
entry
=
sel
>>
__AHSHIFT
;
req
->
entry
=
sel
>>
__AHSHIFT
;
if
(
server_call
(
REQ_GET_SELECTOR_ENTRY
))
return
FALSE
;
if
((
ret
=
!
server_call
(
REQ_GET_SELECTOR_ENTRY
)))
{
if
(
!
(
req
->
flags
&
LDT_FLAGS_ALLOCATED
))
if
(
!
(
req
->
flags
&
LDT_FLAGS_ALLOCATED
))
{
{
SetLastError
(
ERROR_MR_MID_NOT_FOUND
);
/* sic */
SetLastError
(
ERROR_MR_MID_NOT_FOUND
);
/* sic */
return
FALSE
;
ret
=
FALSE
;
}
}
else
{
if
(
req
->
flags
&
LDT_FLAGS_BIG
)
req
->
limit
>>=
12
;
if
(
req
->
flags
&
LDT_FLAGS_BIG
)
req
->
limit
>>=
12
;
ldtent
->
BaseLow
=
req
->
base
&
0x0000ffff
;
ldtent
->
BaseLow
=
req
->
base
&
0x0000ffff
;
ldtent
->
HighWord
.
Bits
.
BaseMid
=
(
req
->
base
&
0x00ff0000
)
>>
16
;
ldtent
->
HighWord
.
Bits
.
BaseMid
=
(
req
->
base
&
0x00ff0000
)
>>
16
;
...
@@ -661,7 +667,11 @@ BOOL WINAPI GetThreadSelectorEntry( HANDLE hthread, DWORD sel, LPLDT_ENTRY ldten
...
@@ -661,7 +667,11 @@ BOOL WINAPI GetThreadSelectorEntry( HANDLE hthread, DWORD sel, LPLDT_ENTRY ldten
ldtent
->
HighWord
.
Bits
.
Default_Big
=
(
req
->
flags
&
LDT_FLAGS_32BIT
)
!=
0
;
ldtent
->
HighWord
.
Bits
.
Default_Big
=
(
req
->
flags
&
LDT_FLAGS_32BIT
)
!=
0
;
ldtent
->
HighWord
.
Bits
.
Type
=
((
req
->
flags
&
LDT_FLAGS_TYPE
)
<<
2
)
|
0x10
;
ldtent
->
HighWord
.
Bits
.
Type
=
((
req
->
flags
&
LDT_FLAGS_TYPE
)
<<
2
)
|
0x10
;
if
(
!
(
req
->
flags
&
LDT_FLAGS_READONLY
))
ldtent
->
HighWord
.
Bits
.
Type
|=
0x2
;
if
(
!
(
req
->
flags
&
LDT_FLAGS_READONLY
))
ldtent
->
HighWord
.
Bits
.
Type
|=
0x2
;
return
TRUE
;
}
}
}
SERVER_END_REQ
;
return
ret
;
#else
#else
SetLastError
(
ERROR_CALL_NOT_IMPLEMENTED
);
SetLastError
(
ERROR_CALL_NOT_IMPLEMENTED
);
return
FALSE
;
return
FALSE
;
...
...
memory/virtual.c
View file @
9c2370bd
...
@@ -22,6 +22,7 @@
...
@@ -22,6 +22,7 @@
#endif
#endif
#include "winbase.h"
#include "winbase.h"
#include "wine/exception.h"
#include "wine/exception.h"
#include "wine/unicode.h"
#include "winerror.h"
#include "winerror.h"
#include "file.h"
#include "file.h"
#include "process.h"
#include "process.h"
...
@@ -1195,14 +1196,20 @@ HANDLE WINAPI CreateFileMappingA(
...
@@ -1195,14 +1196,20 @@ HANDLE WINAPI CreateFileMappingA(
DWORD
size_low
,
/* [in] Low-order 32 bits of object size */
DWORD
size_low
,
/* [in] Low-order 32 bits of object size */
LPCSTR
name
/* [in] Name of file-mapping object */
)
LPCSTR
name
/* [in] Name of file-mapping object */
)
{
{
struct
create_mapping_request
*
req
=
get_req_buffer
()
;
HANDLE
ret
;
BYTE
vprot
;
BYTE
vprot
;
DWORD
len
=
name
?
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
NULL
,
0
)
:
0
;
/* Check parameters */
/* Check parameters */
TRACE
(
"(%x,%p,%08lx,%08lx%08lx,%s)
\n
"
,
TRACE
(
"(%x,%p,%08lx,%08lx%08lx,%s)
\n
"
,
hFile
,
sa
,
protect
,
size_high
,
size_low
,
debugstr_a
(
name
)
);
hFile
,
sa
,
protect
,
size_high
,
size_low
,
debugstr_a
(
name
)
);
if
(
len
>
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
vprot
=
VIRTUAL_GetProt
(
protect
);
vprot
=
VIRTUAL_GetProt
(
protect
);
if
(
protect
&
SEC_RESERVE
)
if
(
protect
&
SEC_RESERVE
)
{
{
...
@@ -1218,16 +1225,23 @@ HANDLE WINAPI CreateFileMappingA(
...
@@ -1218,16 +1225,23 @@ HANDLE WINAPI CreateFileMappingA(
/* Create the server object */
/* Create the server object */
SERVER_START_REQ
{
struct
create_mapping_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
file_handle
=
hFile
;
req
->
file_handle
=
hFile
;
req
->
size_high
=
size_high
;
req
->
size_high
=
size_high
;
req
->
size_low
=
size_low
;
req
->
size_low
=
size_low
;
req
->
protect
=
vprot
;
req
->
protect
=
vprot
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
server_strcpyAtoW
(
req
->
name
,
name
);
if
(
len
)
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
server_data_ptr
(
req
),
len
);
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_MAPPING
);
server_call
(
REQ_CREATE_MAPPING
);
if
(
req
->
handle
==
-
1
)
return
0
;
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -1239,14 +1253,21 @@ HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES sa,
...
@@ -1239,14 +1253,21 @@ HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES sa,
DWORD
protect
,
DWORD
size_high
,
DWORD
protect
,
DWORD
size_high
,
DWORD
size_low
,
LPCWSTR
name
)
DWORD
size_low
,
LPCWSTR
name
)
{
{
struct
create_mapping_request
*
req
=
get_req_buffer
()
;
HANDLE
ret
;
BYTE
vprot
;
BYTE
vprot
;
DWORD
len
=
name
?
strlenW
(
name
)
:
0
;
/* Check parameters */
/* Check parameters */
TRACE
(
"(%x,%p,%08lx,%08lx%08lx,%s)
\n
"
,
TRACE
(
"(%x,%p,%08lx,%08lx%08lx,%s)
\n
"
,
hFile
,
sa
,
protect
,
size_high
,
size_low
,
debugstr_w
(
name
)
);
hFile
,
sa
,
protect
,
size_high
,
size_low
,
debugstr_w
(
name
)
);
if
(
len
>
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
vprot
=
VIRTUAL_GetProt
(
protect
);
vprot
=
VIRTUAL_GetProt
(
protect
);
if
(
protect
&
SEC_RESERVE
)
if
(
protect
&
SEC_RESERVE
)
{
{
...
@@ -1262,16 +1283,23 @@ HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES sa,
...
@@ -1262,16 +1283,23 @@ HANDLE WINAPI CreateFileMappingW( HFILE hFile, LPSECURITY_ATTRIBUTES sa,
/* Create the server object */
/* Create the server object */
SERVER_START_REQ
{
struct
create_mapping_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
file_handle
=
hFile
;
req
->
file_handle
=
hFile
;
req
->
size_high
=
size_high
;
req
->
size_high
=
size_high
;
req
->
size_low
=
size_low
;
req
->
size_low
=
size_low
;
req
->
protect
=
vprot
;
req
->
protect
=
vprot
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
server_strcpyW
(
req
->
name
,
name
);
memcpy
(
server_data_ptr
(
req
),
name
,
len
*
sizeof
(
WCHAR
)
);
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_MAPPING
);
server_call
(
REQ_CREATE_MAPPING
);
if
(
req
->
handle
==
-
1
)
return
0
;
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -1288,14 +1316,26 @@ HANDLE WINAPI OpenFileMappingA(
...
@@ -1288,14 +1316,26 @@ HANDLE WINAPI OpenFileMappingA(
BOOL
inherit
,
/* [in] Inherit flag */
BOOL
inherit
,
/* [in] Inherit flag */
LPCSTR
name
)
/* [in] Name of file-mapping object */
LPCSTR
name
)
/* [in] Name of file-mapping object */
{
{
struct
open_mapping_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
NULL
,
0
)
:
0
;
if
(
len
>
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
open_mapping_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
server_strcpyAtoW
(
req
->
name
,
name
);
if
(
len
)
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
server_data_ptr
(
req
),
len
);
server_call
(
REQ_OPEN_MAPPING
);
server_call
(
REQ_OPEN_MAPPING
);
if
(
req
->
handle
==
-
1
)
return
0
;
/* must return 0 on failure, not -1 */
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -1305,14 +1345,26 @@ HANDLE WINAPI OpenFileMappingA(
...
@@ -1305,14 +1345,26 @@ HANDLE WINAPI OpenFileMappingA(
*/
*/
HANDLE
WINAPI
OpenFileMappingW
(
DWORD
access
,
BOOL
inherit
,
LPCWSTR
name
)
HANDLE
WINAPI
OpenFileMappingW
(
DWORD
access
,
BOOL
inherit
,
LPCWSTR
name
)
{
{
struct
open_mapping_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
strlenW
(
name
)
:
0
;
if
(
len
>
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
open_mapping_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
server_strcpyW
(
req
->
name
,
name
);
memcpy
(
server_data_ptr
(
req
),
name
,
len
*
sizeof
(
WCHAR
)
);
server_call
(
REQ_OPEN_MAPPING
);
server_call
(
REQ_OPEN_MAPPING
);
if
(
req
->
handle
==
-
1
)
return
0
;
/* must return 0 on failure, not -1 */
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
...
misc/registry.c
View file @
9c2370bd
...
@@ -1323,16 +1323,19 @@ void _w31_loadreg(void) {
...
@@ -1323,16 +1323,19 @@ void _w31_loadreg(void) {
/* configure save files and start the periodic saving timer */
/* configure save files and start the periodic saving timer */
static
void
SHELL_InitRegistrySaving
(
HKEY
hkey_users_default
)
static
void
SHELL_InitRegistrySaving
(
HKEY
hkey_users_default
)
{
{
struct
set_registry_levels_request
*
req
=
get_req_buffer
();
int
all
=
PROFILE_GetWineIniBool
(
"registry"
,
"SaveOnlyUpdatedKeys"
,
1
);
int
all
=
PROFILE_GetWineIniBool
(
"registry"
,
"SaveOnlyUpdatedKeys"
,
1
);
int
period
=
PROFILE_GetWineIniInt
(
"registry"
,
"PeriodicSave"
,
0
);
int
period
=
PROFILE_GetWineIniInt
(
"registry"
,
"PeriodicSave"
,
0
);
/* set saving level (0 for saving everything, 1 for saving only modified keys) */
/* set saving level (0 for saving everything, 1 for saving only modified keys) */
SERVER_START_REQ
{
struct
set_registry_levels_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
current
=
1
;
req
->
current
=
1
;
req
->
saving
=
!
all
;
req
->
saving
=
!
all
;
req
->
period
=
period
*
1000
;
req
->
period
=
period
*
1000
;
server_call
(
REQ_SET_REGISTRY_LEVELS
);
server_call
(
REQ_SET_REGISTRY_LEVELS
);
}
SERVER_END_REQ
;
if
(
PROFILE_GetWineIniBool
(
"registry"
,
"WritetoHomeRegistries"
,
1
))
if
(
PROFILE_GetWineIniBool
(
"registry"
,
"WritetoHomeRegistries"
,
1
))
{
{
...
@@ -1377,12 +1380,16 @@ static void SHELL_InitRegistrySaving( HKEY hkey_users_default )
...
@@ -1377,12 +1380,16 @@ static void SHELL_InitRegistrySaving( HKEY hkey_users_default )
*/
*/
static
void
SetLoadLevel
(
int
level
)
static
void
SetLoadLevel
(
int
level
)
{
{
struct
set_registry_levels_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
set_registry_levels_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
current
=
level
;
req
->
current
=
level
;
req
->
saving
=
0
;
req
->
saving
=
0
;
req
->
period
=
0
;
req
->
period
=
0
;
server_call
(
REQ_SET_REGISTRY_LEVELS
);
server_call
(
REQ_SET_REGISTRY_LEVELS
);
}
SERVER_END_REQ
;
}
}
/**********************************************************************************
/**********************************************************************************
...
...
scheduler/debugger.c
View file @
9c2370bd
...
@@ -26,72 +26,83 @@ DEFAULT_DEBUG_CHANNEL(debugstr);
...
@@ -26,72 +26,83 @@ DEFAULT_DEBUG_CHANNEL(debugstr);
*/
*/
BOOL
WINAPI
WaitForDebugEvent
(
LPDEBUG_EVENT
event
,
DWORD
timeout
)
BOOL
WINAPI
WaitForDebugEvent
(
LPDEBUG_EVENT
event
,
DWORD
timeout
)
{
{
struct
wait_debug_event_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
debug_event_t
*
data
;
struct
wait_debug_event_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
sizeof
(
*
data
)
);
req
->
timeout
=
timeout
;
req
->
timeout
=
timeout
;
if
(
server_call
(
REQ_WAIT_DEBUG_EVENT
))
return
FALSE
;
if
(
!
(
ret
=
!
server_call
(
REQ_WAIT_DEBUG_EVENT
)))
goto
done
;
if
((
req
->
event
.
code
<
0
)
||
(
req
->
event
.
code
>
RIP_EVENT
))
server_protocol_error
(
"WaitForDebugEvent: bad code %d
\n
"
,
req
->
event
.
code
);
event
->
dwDebugEventCode
=
req
->
event
.
code
;
if
(
!
server_data_size
(
req
))
/* timeout */
{
SetLastError
(
ERROR_SEM_TIMEOUT
);
ret
=
FALSE
;
goto
done
;
}
data
=
server_data_ptr
(
req
);
event
->
dwDebugEventCode
=
data
->
code
;
event
->
dwProcessId
=
(
DWORD
)
req
->
pid
;
event
->
dwProcessId
=
(
DWORD
)
req
->
pid
;
event
->
dwThreadId
=
(
DWORD
)
req
->
tid
;
event
->
dwThreadId
=
(
DWORD
)
req
->
tid
;
switch
(
req
->
event
.
code
)
switch
(
data
->
code
)
{
{
case
0
:
/* timeout */
SetLastError
(
ERROR_SEM_TIMEOUT
);
return
FALSE
;
case
EXCEPTION_DEBUG_EVENT
:
case
EXCEPTION_DEBUG_EVENT
:
event
->
u
.
Exception
.
ExceptionRecord
=
req
->
event
.
info
.
exception
.
record
;
event
->
u
.
Exception
.
ExceptionRecord
=
data
->
info
.
exception
.
record
;
event
->
u
.
Exception
.
dwFirstChance
=
req
->
event
.
info
.
exception
.
first
;
event
->
u
.
Exception
.
dwFirstChance
=
data
->
info
.
exception
.
first
;
break
;
break
;
case
CREATE_THREAD_DEBUG_EVENT
:
case
CREATE_THREAD_DEBUG_EVENT
:
event
->
u
.
CreateThread
.
hThread
=
req
->
event
.
info
.
create_thread
.
handle
;
event
->
u
.
CreateThread
.
hThread
=
data
->
info
.
create_thread
.
handle
;
event
->
u
.
CreateThread
.
lpThreadLocalBase
=
req
->
event
.
info
.
create_thread
.
teb
;
event
->
u
.
CreateThread
.
lpThreadLocalBase
=
data
->
info
.
create_thread
.
teb
;
event
->
u
.
CreateThread
.
lpStartAddress
=
req
->
event
.
info
.
create_thread
.
start
;
event
->
u
.
CreateThread
.
lpStartAddress
=
data
->
info
.
create_thread
.
start
;
break
;
break
;
case
CREATE_PROCESS_DEBUG_EVENT
:
case
CREATE_PROCESS_DEBUG_EVENT
:
event
->
u
.
CreateProcessInfo
.
hFile
=
req
->
event
.
info
.
create_process
.
file
;
event
->
u
.
CreateProcessInfo
.
hFile
=
data
->
info
.
create_process
.
file
;
event
->
u
.
CreateProcessInfo
.
hProcess
=
req
->
event
.
info
.
create_process
.
process
;
event
->
u
.
CreateProcessInfo
.
hProcess
=
data
->
info
.
create_process
.
process
;
event
->
u
.
CreateProcessInfo
.
hThread
=
req
->
event
.
info
.
create_process
.
thread
;
event
->
u
.
CreateProcessInfo
.
hThread
=
data
->
info
.
create_process
.
thread
;
event
->
u
.
CreateProcessInfo
.
lpBaseOfImage
=
req
->
event
.
info
.
create_process
.
base
;
event
->
u
.
CreateProcessInfo
.
lpBaseOfImage
=
data
->
info
.
create_process
.
base
;
event
->
u
.
CreateProcessInfo
.
dwDebugInfoFileOffset
=
req
->
event
.
info
.
create_process
.
dbg_offset
;
event
->
u
.
CreateProcessInfo
.
dwDebugInfoFileOffset
=
data
->
info
.
create_process
.
dbg_offset
;
event
->
u
.
CreateProcessInfo
.
nDebugInfoSize
=
req
->
event
.
info
.
create_process
.
dbg_size
;
event
->
u
.
CreateProcessInfo
.
nDebugInfoSize
=
data
->
info
.
create_process
.
dbg_size
;
event
->
u
.
CreateProcessInfo
.
lpThreadLocalBase
=
req
->
event
.
info
.
create_process
.
teb
;
event
->
u
.
CreateProcessInfo
.
lpThreadLocalBase
=
data
->
info
.
create_process
.
teb
;
event
->
u
.
CreateProcessInfo
.
lpStartAddress
=
req
->
event
.
info
.
create_process
.
start
;
event
->
u
.
CreateProcessInfo
.
lpStartAddress
=
data
->
info
.
create_process
.
start
;
event
->
u
.
CreateProcessInfo
.
lpImageName
=
req
->
event
.
info
.
create_process
.
name
;
event
->
u
.
CreateProcessInfo
.
lpImageName
=
data
->
info
.
create_process
.
name
;
event
->
u
.
CreateProcessInfo
.
fUnicode
=
req
->
event
.
info
.
create_process
.
unicode
;
event
->
u
.
CreateProcessInfo
.
fUnicode
=
data
->
info
.
create_process
.
unicode
;
if
(
req
->
event
.
info
.
create_process
.
file
==
-
1
)
event
->
u
.
CreateProcessInfo
.
hFile
=
0
;
if
(
data
->
info
.
create_process
.
file
==
-
1
)
event
->
u
.
CreateProcessInfo
.
hFile
=
0
;
break
;
break
;
case
EXIT_THREAD_DEBUG_EVENT
:
case
EXIT_THREAD_DEBUG_EVENT
:
event
->
u
.
ExitThread
.
dwExitCode
=
req
->
event
.
info
.
exit
.
exit_code
;
event
->
u
.
ExitThread
.
dwExitCode
=
data
->
info
.
exit
.
exit_code
;
break
;
break
;
case
EXIT_PROCESS_DEBUG_EVENT
:
case
EXIT_PROCESS_DEBUG_EVENT
:
event
->
u
.
ExitProcess
.
dwExitCode
=
req
->
event
.
info
.
exit
.
exit_code
;
event
->
u
.
ExitProcess
.
dwExitCode
=
data
->
info
.
exit
.
exit_code
;
break
;
break
;
case
LOAD_DLL_DEBUG_EVENT
:
case
LOAD_DLL_DEBUG_EVENT
:
event
->
u
.
LoadDll
.
hFile
=
req
->
event
.
info
.
load_dll
.
handle
;
event
->
u
.
LoadDll
.
hFile
=
data
->
info
.
load_dll
.
handle
;
event
->
u
.
LoadDll
.
lpBaseOfDll
=
req
->
event
.
info
.
load_dll
.
base
;
event
->
u
.
LoadDll
.
lpBaseOfDll
=
data
->
info
.
load_dll
.
base
;
event
->
u
.
LoadDll
.
dwDebugInfoFileOffset
=
req
->
event
.
info
.
load_dll
.
dbg_offset
;
event
->
u
.
LoadDll
.
dwDebugInfoFileOffset
=
data
->
info
.
load_dll
.
dbg_offset
;
event
->
u
.
LoadDll
.
nDebugInfoSize
=
req
->
event
.
info
.
load_dll
.
dbg_size
;
event
->
u
.
LoadDll
.
nDebugInfoSize
=
data
->
info
.
load_dll
.
dbg_size
;
event
->
u
.
LoadDll
.
lpImageName
=
req
->
event
.
info
.
load_dll
.
name
;
event
->
u
.
LoadDll
.
lpImageName
=
data
->
info
.
load_dll
.
name
;
event
->
u
.
LoadDll
.
fUnicode
=
req
->
event
.
info
.
load_dll
.
unicode
;
event
->
u
.
LoadDll
.
fUnicode
=
data
->
info
.
load_dll
.
unicode
;
if
(
req
->
event
.
info
.
load_dll
.
handle
==
-
1
)
event
->
u
.
LoadDll
.
hFile
=
0
;
if
(
data
->
info
.
load_dll
.
handle
==
-
1
)
event
->
u
.
LoadDll
.
hFile
=
0
;
break
;
break
;
case
UNLOAD_DLL_DEBUG_EVENT
:
case
UNLOAD_DLL_DEBUG_EVENT
:
event
->
u
.
UnloadDll
.
lpBaseOfDll
=
req
->
event
.
info
.
unload_dll
.
base
;
event
->
u
.
UnloadDll
.
lpBaseOfDll
=
data
->
info
.
unload_dll
.
base
;
break
;
break
;
case
OUTPUT_DEBUG_STRING_EVENT
:
case
OUTPUT_DEBUG_STRING_EVENT
:
event
->
u
.
DebugString
.
lpDebugStringData
=
req
->
event
.
info
.
output_string
.
string
;
event
->
u
.
DebugString
.
lpDebugStringData
=
data
->
info
.
output_string
.
string
;
event
->
u
.
DebugString
.
fUnicode
=
req
->
event
.
info
.
output_string
.
unicode
;
event
->
u
.
DebugString
.
fUnicode
=
data
->
info
.
output_string
.
unicode
;
event
->
u
.
DebugString
.
nDebugStringLength
=
req
->
event
.
info
.
output_string
.
length
;
event
->
u
.
DebugString
.
nDebugStringLength
=
data
->
info
.
output_string
.
length
;
break
;
break
;
case
RIP_EVENT
:
case
RIP_EVENT
:
event
->
u
.
RipInfo
.
dwError
=
req
->
event
.
info
.
rip_info
.
error
;
event
->
u
.
RipInfo
.
dwError
=
data
->
info
.
rip_info
.
error
;
event
->
u
.
RipInfo
.
dwType
=
req
->
event
.
info
.
rip_info
.
type
;
event
->
u
.
RipInfo
.
dwType
=
data
->
info
.
rip_info
.
type
;
break
;
break
;
default:
server_protocol_error
(
"WaitForDebugEvent: bad code %d
\n
"
,
data
->
code
);
}
}
return
TRUE
;
done:
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -100,11 +111,17 @@ BOOL WINAPI WaitForDebugEvent( LPDEBUG_EVENT event, DWORD timeout )
...
@@ -100,11 +111,17 @@ BOOL WINAPI WaitForDebugEvent( LPDEBUG_EVENT event, DWORD timeout )
*/
*/
BOOL
WINAPI
ContinueDebugEvent
(
DWORD
pid
,
DWORD
tid
,
DWORD
status
)
BOOL
WINAPI
ContinueDebugEvent
(
DWORD
pid
,
DWORD
tid
,
DWORD
status
)
{
{
struct
continue_debug_event_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
continue_debug_event_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
pid
=
(
void
*
)
pid
;
req
->
pid
=
(
void
*
)
pid
;
req
->
tid
=
(
void
*
)
tid
;
req
->
tid
=
(
void
*
)
tid
;
req
->
status
=
status
;
req
->
status
=
status
;
return
!
server_call
(
REQ_CONTINUE_DEBUG_EVENT
);
ret
=
!
server_call
(
REQ_CONTINUE_DEBUG_EVENT
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -113,9 +130,15 @@ BOOL WINAPI ContinueDebugEvent( DWORD pid, DWORD tid, DWORD status )
...
@@ -113,9 +130,15 @@ BOOL WINAPI ContinueDebugEvent( DWORD pid, DWORD tid, DWORD status )
*/
*/
BOOL
WINAPI
DebugActiveProcess
(
DWORD
pid
)
BOOL
WINAPI
DebugActiveProcess
(
DWORD
pid
)
{
{
struct
debug_process_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
debug_process_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
pid
=
(
void
*
)
pid
;
req
->
pid
=
(
void
*
)
pid
;
return
!
server_call
(
REQ_DEBUG_PROCESS
);
ret
=
!
server_call
(
REQ_DEBUG_PROCESS
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -124,11 +147,15 @@ BOOL WINAPI DebugActiveProcess( DWORD pid )
...
@@ -124,11 +147,15 @@ BOOL WINAPI DebugActiveProcess( DWORD pid )
*/
*/
void
WINAPI
OutputDebugStringA
(
LPCSTR
str
)
void
WINAPI
OutputDebugStringA
(
LPCSTR
str
)
{
{
struct
output_debug_string_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
output_debug_string_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
string
=
(
void
*
)
str
;
req
->
string
=
(
void
*
)
str
;
req
->
unicode
=
0
;
req
->
unicode
=
0
;
req
->
length
=
strlen
(
str
)
+
1
;
req
->
length
=
strlen
(
str
)
+
1
;
server_call_noerr
(
REQ_OUTPUT_DEBUG_STRING
);
server_call_noerr
(
REQ_OUTPUT_DEBUG_STRING
);
}
SERVER_END_REQ
;
WARN
(
"%s
\n
"
,
str
);
WARN
(
"%s
\n
"
,
str
);
}
}
...
@@ -138,11 +165,15 @@ void WINAPI OutputDebugStringA( LPCSTR str )
...
@@ -138,11 +165,15 @@ void WINAPI OutputDebugStringA( LPCSTR str )
*/
*/
void
WINAPI
OutputDebugStringW
(
LPCWSTR
str
)
void
WINAPI
OutputDebugStringW
(
LPCWSTR
str
)
{
{
struct
output_debug_string_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
output_debug_string_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
string
=
(
void
*
)
str
;
req
->
string
=
(
void
*
)
str
;
req
->
unicode
=
1
;
req
->
unicode
=
1
;
req
->
length
=
(
lstrlenW
(
str
)
+
1
)
*
sizeof
(
WCHAR
);
req
->
length
=
(
lstrlenW
(
str
)
+
1
)
*
sizeof
(
WCHAR
);
server_call_noerr
(
REQ_OUTPUT_DEBUG_STRING
);
server_call_noerr
(
REQ_OUTPUT_DEBUG_STRING
);
}
SERVER_END_REQ
;
WARN
(
"%s
\n
"
,
debugstr_w
(
str
));
WARN
(
"%s
\n
"
,
debugstr_w
(
str
));
}
}
...
@@ -189,8 +220,12 @@ void WINAPI DebugBreak16( CONTEXT86 *context )
...
@@ -189,8 +220,12 @@ void WINAPI DebugBreak16( CONTEXT86 *context )
BOOL
WINAPI
IsDebuggerPresent
(
void
)
BOOL
WINAPI
IsDebuggerPresent
(
void
)
{
{
BOOL
ret
=
FALSE
;
BOOL
ret
=
FALSE
;
struct
get_process_info_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
get_process_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
GetCurrentProcess
();
req
->
handle
=
GetCurrentProcess
();
if
(
!
server_call
(
REQ_GET_PROCESS_INFO
))
ret
=
req
->
debugged
;
if
(
!
server_call
(
REQ_GET_PROCESS_INFO
))
ret
=
req
->
debugged
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
scheduler/event.c
View file @
9c2370bd
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
#include <assert.h>
#include <assert.h>
#include <string.h>
#include <string.h>
#include "winerror.h"
#include "winerror.h"
#include "wine/unicode.h"
#include "syslevel.h"
#include "syslevel.h"
#include "server.h"
#include "server.h"
...
@@ -17,16 +18,28 @@
...
@@ -17,16 +18,28 @@
HANDLE
WINAPI
CreateEventA
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
manual_reset
,
HANDLE
WINAPI
CreateEventA
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
manual_reset
,
BOOL
initial_state
,
LPCSTR
name
)
BOOL
initial_state
,
LPCSTR
name
)
{
{
struct
create_event_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
NULL
,
0
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
create_event_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
manual_reset
=
manual_reset
;
req
->
manual_reset
=
manual_reset
;
req
->
initial_state
=
initial_state
;
req
->
initial_state
=
initial_state
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
server_strcpyAtoW
(
req
->
name
,
name
);
if
(
len
)
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
server_data_ptr
(
req
),
len
);
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_EVENT
);
server_call
(
REQ_CREATE_EVENT
);
if
(
req
->
handle
==
-
1
)
return
0
;
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -36,16 +49,28 @@ HANDLE WINAPI CreateEventA( SECURITY_ATTRIBUTES *sa, BOOL manual_reset,
...
@@ -36,16 +49,28 @@ HANDLE WINAPI CreateEventA( SECURITY_ATTRIBUTES *sa, BOOL manual_reset,
HANDLE
WINAPI
CreateEventW
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
manual_reset
,
HANDLE
WINAPI
CreateEventW
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
manual_reset
,
BOOL
initial_state
,
LPCWSTR
name
)
BOOL
initial_state
,
LPCWSTR
name
)
{
{
struct
create_event_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
strlenW
(
name
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
create_event_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
manual_reset
=
manual_reset
;
req
->
manual_reset
=
manual_reset
;
req
->
initial_state
=
initial_state
;
req
->
initial_state
=
initial_state
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
server_strcpyW
(
req
->
name
,
name
);
memcpy
(
server_data_ptr
(
req
),
name
,
len
*
sizeof
(
WCHAR
)
);
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_EVENT
);
server_call
(
REQ_CREATE_EVENT
);
if
(
req
->
handle
==
-
1
)
return
0
;
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
/***********************************************************************
/***********************************************************************
...
@@ -62,14 +87,26 @@ HANDLE WINAPI WIN16_CreateEvent( BOOL manual_reset, BOOL initial_state )
...
@@ -62,14 +87,26 @@ HANDLE WINAPI WIN16_CreateEvent( BOOL manual_reset, BOOL initial_state )
*/
*/
HANDLE
WINAPI
OpenEventA
(
DWORD
access
,
BOOL
inherit
,
LPCSTR
name
)
HANDLE
WINAPI
OpenEventA
(
DWORD
access
,
BOOL
inherit
,
LPCSTR
name
)
{
{
struct
open_event_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
NULL
,
0
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
open_event_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
server_strcpyAtoW
(
req
->
name
,
name
);
if
(
len
)
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
server_data_ptr
(
req
),
len
);
server_call
(
REQ_OPEN_EVENT
);
server_call
(
REQ_OPEN_EVENT
);
if
(
req
->
handle
==
-
1
)
return
0
;
/* must return 0 on failure, not -1 */
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -78,14 +115,26 @@ HANDLE WINAPI OpenEventA( DWORD access, BOOL inherit, LPCSTR name )
...
@@ -78,14 +115,26 @@ HANDLE WINAPI OpenEventA( DWORD access, BOOL inherit, LPCSTR name )
*/
*/
HANDLE
WINAPI
OpenEventW
(
DWORD
access
,
BOOL
inherit
,
LPCWSTR
name
)
HANDLE
WINAPI
OpenEventW
(
DWORD
access
,
BOOL
inherit
,
LPCWSTR
name
)
{
{
struct
open_event_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
strlenW
(
name
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
open_event_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
server_strcpyW
(
req
->
name
,
name
);
memcpy
(
server_data_ptr
(
req
),
name
,
len
*
sizeof
(
WCHAR
)
);
server_call
(
REQ_OPEN_EVENT
);
server_call
(
REQ_OPEN_EVENT
);
if
(
req
->
handle
==
-
1
)
return
0
;
/* must return 0 on failure, not -1 */
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -96,10 +145,16 @@ HANDLE WINAPI OpenEventW( DWORD access, BOOL inherit, LPCWSTR name )
...
@@ -96,10 +145,16 @@ HANDLE WINAPI OpenEventW( DWORD access, BOOL inherit, LPCWSTR name )
*/
*/
static
BOOL
EVENT_Operation
(
HANDLE
handle
,
enum
event_op
op
)
static
BOOL
EVENT_Operation
(
HANDLE
handle
,
enum
event_op
op
)
{
{
struct
event_op_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
event_op_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
req
->
op
=
op
;
req
->
op
=
op
;
return
!
server_call
(
REQ_EVENT_OP
);
ret
=
!
server_call
(
REQ_EVENT_OP
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
...
scheduler/handle.c
View file @
9c2370bd
...
@@ -18,14 +18,17 @@ DEFAULT_DEBUG_CHANNEL(win32)
...
@@ -18,14 +18,17 @@ DEFAULT_DEBUG_CHANNEL(win32)
*/
*/
BOOL
WINAPI
CloseHandle
(
HANDLE
handle
)
BOOL
WINAPI
CloseHandle
(
HANDLE
handle
)
{
{
struct
close_handle_request
*
req
=
get_req_buffer
();
NTSTATUS
status
;
/* stdio handles need special treatment */
/* stdio handles need special treatment */
if
((
handle
==
STD_INPUT_HANDLE
)
||
if
((
handle
==
STD_INPUT_HANDLE
)
||
(
handle
==
STD_OUTPUT_HANDLE
)
||
(
handle
==
STD_OUTPUT_HANDLE
)
||
(
handle
==
STD_ERROR_HANDLE
))
(
handle
==
STD_ERROR_HANDLE
))
handle
=
GetStdHandle
(
handle
);
handle
=
GetStdHandle
(
handle
);
req
->
handle
=
handle
;
return
!
server_call
(
REQ_CLOSE_HANDLE
);
status
=
NtClose
(
handle
);
if
(
status
)
SetLastError
(
RtlNtStatusToDosError
(
status
)
);
return
!
status
;
}
}
...
@@ -34,11 +37,16 @@ BOOL WINAPI CloseHandle( HANDLE handle )
...
@@ -34,11 +37,16 @@ BOOL WINAPI CloseHandle( HANDLE handle )
*/
*/
BOOL
WINAPI
GetHandleInformation
(
HANDLE
handle
,
LPDWORD
flags
)
BOOL
WINAPI
GetHandleInformation
(
HANDLE
handle
,
LPDWORD
flags
)
{
{
struct
get_handle_info_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
get_handle_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
if
(
server_call
(
REQ_GET_HANDLE_INFO
))
return
FALSE
;
ret
=
!
server_call
(
REQ_GET_HANDLE_INFO
);
if
(
flags
)
*
flags
=
req
->
flags
;
if
(
ret
&&
flags
)
*
flags
=
req
->
flags
;
return
TRUE
;
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -47,11 +55,17 @@ BOOL WINAPI GetHandleInformation( HANDLE handle, LPDWORD flags )
...
@@ -47,11 +55,17 @@ BOOL WINAPI GetHandleInformation( HANDLE handle, LPDWORD flags )
*/
*/
BOOL
WINAPI
SetHandleInformation
(
HANDLE
handle
,
DWORD
mask
,
DWORD
flags
)
BOOL
WINAPI
SetHandleInformation
(
HANDLE
handle
,
DWORD
mask
,
DWORD
flags
)
{
{
struct
set_handle_info_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
set_handle_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
req
->
flags
=
flags
;
req
->
flags
=
flags
;
req
->
mask
=
mask
;
req
->
mask
=
mask
;
return
!
server_call
(
REQ_SET_HANDLE_INFO
);
ret
=
!
server_call
(
REQ_SET_HANDLE_INFO
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -62,7 +76,10 @@ BOOL WINAPI DuplicateHandle( HANDLE source_process, HANDLE source,
...
@@ -62,7 +76,10 @@ BOOL WINAPI DuplicateHandle( HANDLE source_process, HANDLE source,
HANDLE
dest_process
,
HANDLE
*
dest
,
HANDLE
dest_process
,
HANDLE
*
dest
,
DWORD
access
,
BOOL
inherit
,
DWORD
options
)
DWORD
access
,
BOOL
inherit
,
DWORD
options
)
{
{
struct
dup_handle_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
dup_handle_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
src_process
=
source_process
;
req
->
src_process
=
source_process
;
req
->
src_handle
=
source
;
req
->
src_handle
=
source
;
...
@@ -71,9 +88,11 @@ BOOL WINAPI DuplicateHandle( HANDLE source_process, HANDLE source,
...
@@ -71,9 +88,11 @@ BOOL WINAPI DuplicateHandle( HANDLE source_process, HANDLE source,
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
req
->
options
=
options
;
req
->
options
=
options
;
if
(
server_call
(
REQ_DUP_HANDLE
))
return
FALSE
;
ret
=
!
server_call
(
REQ_DUP_HANDLE
);
if
(
dest
)
*
dest
=
req
->
handle
;
if
(
ret
&&
dest
)
*
dest
=
req
->
handle
;
return
TRUE
;
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -82,17 +101,10 @@ BOOL WINAPI DuplicateHandle( HANDLE source_process, HANDLE source,
...
@@ -82,17 +101,10 @@ BOOL WINAPI DuplicateHandle( HANDLE source_process, HANDLE source,
*/
*/
HANDLE
WINAPI
ConvertToGlobalHandle
(
HANDLE
hSrc
)
HANDLE
WINAPI
ConvertToGlobalHandle
(
HANDLE
hSrc
)
{
{
struct
dup_handle_request
*
req
=
get_req_buffer
();
HANDLE
ret
=
-
1
;
DuplicateHandle
(
GetCurrentProcess
(),
hSrc
,
(
HANDLE
)
-
1
,
&
ret
,
0
,
FALSE
,
req
->
src_process
=
GetCurrentProcess
();
DUP_HANDLE_MAKE_GLOBAL
|
DUP_HANDLE_SAME_ACCESS
|
DUP_HANDLE_CLOSE_SOURCE
);
req
->
src_handle
=
hSrc
;
return
ret
;
req
->
dst_process
=
-
1
;
req
->
access
=
0
;
req
->
inherit
=
FALSE
;
req
->
options
=
DUP_HANDLE_MAKE_GLOBAL
|
DUP_HANDLE_SAME_ACCESS
|
DUP_HANDLE_CLOSE_SOURCE
;
server_call
(
REQ_DUP_HANDLE
);
return
req
->
handle
;
}
}
/***********************************************************************
/***********************************************************************
...
...
scheduler/mutex.c
View file @
9c2370bd
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
#include <assert.h>
#include <assert.h>
#include <string.h>
#include <string.h>
#include "winerror.h"
#include "winerror.h"
#include "wine/unicode.h"
#include "server.h"
#include "server.h"
...
@@ -15,15 +16,27 @@
...
@@ -15,15 +16,27 @@
*/
*/
HANDLE
WINAPI
CreateMutexA
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
owner
,
LPCSTR
name
)
HANDLE
WINAPI
CreateMutexA
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
owner
,
LPCSTR
name
)
{
{
struct
create_mutex_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
NULL
,
0
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
create_mutex_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
owned
=
owner
;
req
->
owned
=
owner
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
server_strcpyAtoW
(
req
->
name
,
name
);
if
(
len
)
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
server_data_ptr
(
req
),
len
);
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_MUTEX
);
server_call
(
REQ_CREATE_MUTEX
);
if
(
req
->
handle
==
-
1
)
return
0
;
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -32,15 +45,27 @@ HANDLE WINAPI CreateMutexA( SECURITY_ATTRIBUTES *sa, BOOL owner, LPCSTR name )
...
@@ -32,15 +45,27 @@ HANDLE WINAPI CreateMutexA( SECURITY_ATTRIBUTES *sa, BOOL owner, LPCSTR name )
*/
*/
HANDLE
WINAPI
CreateMutexW
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
owner
,
LPCWSTR
name
)
HANDLE
WINAPI
CreateMutexW
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
owner
,
LPCWSTR
name
)
{
{
struct
create_mutex_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
strlenW
(
name
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
create_mutex_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
owned
=
owner
;
req
->
owned
=
owner
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
server_strcpyW
(
req
->
name
,
name
);
memcpy
(
server_data_ptr
(
req
),
name
,
len
*
sizeof
(
WCHAR
)
);
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_MUTEX
);
server_call
(
REQ_CREATE_MUTEX
);
if
(
req
->
handle
==
-
1
)
return
0
;
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -49,14 +74,26 @@ HANDLE WINAPI CreateMutexW( SECURITY_ATTRIBUTES *sa, BOOL owner, LPCWSTR name )
...
@@ -49,14 +74,26 @@ HANDLE WINAPI CreateMutexW( SECURITY_ATTRIBUTES *sa, BOOL owner, LPCWSTR name )
*/
*/
HANDLE
WINAPI
OpenMutexA
(
DWORD
access
,
BOOL
inherit
,
LPCSTR
name
)
HANDLE
WINAPI
OpenMutexA
(
DWORD
access
,
BOOL
inherit
,
LPCSTR
name
)
{
{
struct
open_mutex_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
NULL
,
0
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
open_mutex_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
server_strcpyAtoW
(
req
->
name
,
name
);
if
(
len
)
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
server_data_ptr
(
req
),
len
);
server_call
(
REQ_OPEN_MUTEX
);
server_call
(
REQ_OPEN_MUTEX
);
if
(
req
->
handle
==
-
1
)
return
0
;
/* must return 0 on failure, not -1 */
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -65,14 +102,26 @@ HANDLE WINAPI OpenMutexA( DWORD access, BOOL inherit, LPCSTR name )
...
@@ -65,14 +102,26 @@ HANDLE WINAPI OpenMutexA( DWORD access, BOOL inherit, LPCSTR name )
*/
*/
HANDLE
WINAPI
OpenMutexW
(
DWORD
access
,
BOOL
inherit
,
LPCWSTR
name
)
HANDLE
WINAPI
OpenMutexW
(
DWORD
access
,
BOOL
inherit
,
LPCWSTR
name
)
{
{
struct
open_mutex_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
strlenW
(
name
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
open_mutex_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
server_strcpyW
(
req
->
name
,
name
);
memcpy
(
server_data_ptr
(
req
),
name
,
len
*
sizeof
(
WCHAR
)
);
server_call
(
REQ_OPEN_MUTEX
);
server_call
(
REQ_OPEN_MUTEX
);
if
(
req
->
handle
==
-
1
)
return
0
;
/* must return 0 on failure, not -1 */
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -81,7 +130,13 @@ HANDLE WINAPI OpenMutexW( DWORD access, BOOL inherit, LPCWSTR name )
...
@@ -81,7 +130,13 @@ HANDLE WINAPI OpenMutexW( DWORD access, BOOL inherit, LPCWSTR name )
*/
*/
BOOL
WINAPI
ReleaseMutex
(
HANDLE
handle
)
BOOL
WINAPI
ReleaseMutex
(
HANDLE
handle
)
{
{
struct
release_mutex_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
release_mutex_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
return
!
server_call
(
REQ_RELEASE_MUTEX
);
ret
=
!
server_call
(
REQ_RELEASE_MUTEX
);
}
SERVER_END_REQ
;
return
ret
;
}
}
scheduler/pipe.c
View file @
9c2370bd
...
@@ -16,11 +16,18 @@
...
@@ -16,11 +16,18 @@
BOOL
WINAPI
CreatePipe
(
PHANDLE
hReadPipe
,
PHANDLE
hWritePipe
,
BOOL
WINAPI
CreatePipe
(
PHANDLE
hReadPipe
,
PHANDLE
hWritePipe
,
LPSECURITY_ATTRIBUTES
sa
,
DWORD
size
)
LPSECURITY_ATTRIBUTES
sa
,
DWORD
size
)
{
{
struct
create_pipe_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
create_pipe_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
if
(
server_call
(
REQ_CREATE_PIPE
))
return
FALSE
;
if
((
ret
=
!
server_call
(
REQ_CREATE_PIPE
)))
{
*
hReadPipe
=
req
->
handle_read
;
*
hReadPipe
=
req
->
handle_read
;
*
hWritePipe
=
req
->
handle_write
;
*
hWritePipe
=
req
->
handle_write
;
return
TRUE
;
}
}
SERVER_END_REQ
;
return
ret
;
}
}
scheduler/process.c
View file @
9c2370bd
...
@@ -164,7 +164,7 @@ void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule )
...
@@ -164,7 +164,7 @@ void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule )
*/
*/
static
BOOL
process_init
(
char
*
argv
[]
)
static
BOOL
process_init
(
char
*
argv
[]
)
{
{
struct
init_process_request
*
req
;
BOOL
ret
;
/* store the program name */
/* store the program name */
argv0
=
argv
[
0
];
argv0
=
argv
[
0
];
...
@@ -183,11 +183,15 @@ static BOOL process_init( char *argv[] )
...
@@ -183,11 +183,15 @@ static BOOL process_init( char *argv[] )
if
(
CLIENT_InitThread
())
return
FALSE
;
if
(
CLIENT_InitThread
())
return
FALSE
;
/* Retrieve startup info from the server */
/* Retrieve startup info from the server */
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
init_process_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
ldt_copy
=
ldt_copy
;
req
->
ldt_copy
=
ldt_copy
;
req
->
ldt_flags
=
ldt_flags_copy
;
req
->
ldt_flags
=
ldt_flags_copy
;
req
->
ppid
=
getppid
();
req
->
ppid
=
getppid
();
if
(
server_call
(
REQ_INIT_PROCESS
))
return
FALSE
;
if
((
ret
=
!
server_call
(
REQ_INIT_PROCESS
)))
{
main_exe_file
=
req
->
exe_file
;
main_exe_file
=
req
->
exe_file
;
if
(
req
->
filename
[
0
])
main_exe_name
=
strdup
(
req
->
filename
);
if
(
req
->
filename
[
0
])
main_exe_name
=
strdup
(
req
->
filename
);
current_startupinfo
.
dwFlags
=
req
->
start_flags
;
current_startupinfo
.
dwFlags
=
req
->
start_flags
;
...
@@ -195,6 +199,10 @@ static BOOL process_init( char *argv[] )
...
@@ -195,6 +199,10 @@ static BOOL process_init( char *argv[] )
current_envdb
.
hStdin
=
current_startupinfo
.
hStdInput
=
req
->
hstdin
;
current_envdb
.
hStdin
=
current_startupinfo
.
hStdInput
=
req
->
hstdin
;
current_envdb
.
hStdout
=
current_startupinfo
.
hStdOutput
=
req
->
hstdout
;
current_envdb
.
hStdout
=
current_startupinfo
.
hStdOutput
=
req
->
hstdout
;
current_envdb
.
hStderr
=
current_startupinfo
.
hStdError
=
req
->
hstderr
;
current_envdb
.
hStderr
=
current_startupinfo
.
hStdError
=
req
->
hstderr
;
}
}
SERVER_END_REQ
;
if
(
!
ret
)
return
FALSE
;
/* Remember TEB selector of initial process for emergency use */
/* Remember TEB selector of initial process for emergency use */
SYSLEVEL_EmergencyTeb
=
NtCurrentTeb
()
->
teb_sel
;
SYSLEVEL_EmergencyTeb
=
NtCurrentTeb
()
->
teb_sel
;
...
@@ -298,7 +306,6 @@ static inline char *build_command_line( char **argv )
...
@@ -298,7 +306,6 @@ static inline char *build_command_line( char **argv )
*/
*/
static
void
start_process
(
void
)
static
void
start_process
(
void
)
{
{
struct
init_process_done_request
*
req
=
get_req_buffer
();
int
debugged
,
console_app
;
int
debugged
,
console_app
;
LPTHREAD_START_ROUTINE
entry
;
LPTHREAD_START_ROUTINE
entry
;
HMODULE
module
=
current_process
.
exe_modref
->
module
;
HMODULE
module
=
current_process
.
exe_modref
->
module
;
...
@@ -316,12 +323,17 @@ static void start_process(void)
...
@@ -316,12 +323,17 @@ static void start_process(void)
if
(
console_app
)
current_process
.
flags
|=
PDB32_CONSOLE_PROC
;
if
(
console_app
)
current_process
.
flags
|=
PDB32_CONSOLE_PROC
;
/* Signal the parent process to continue */
/* Signal the parent process to continue */
SERVER_START_REQ
{
struct
init_process_done_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
module
=
(
void
*
)
module
;
req
->
module
=
(
void
*
)
module
;
req
->
entry
=
entry
;
req
->
entry
=
entry
;
req
->
name
=
&
current_process
.
exe_modref
->
filename
;
req
->
name
=
&
current_process
.
exe_modref
->
filename
;
req
->
gui
=
!
console_app
;
req
->
gui
=
!
console_app
;
server_call
(
REQ_INIT_PROCESS_DONE
);
server_call
(
REQ_INIT_PROCESS_DONE
);
debugged
=
req
->
debugged
;
debugged
=
req
->
debugged
;
}
SERVER_END_REQ
;
/* Install signal handlers; this cannot be done before, since we cannot
/* Install signal handlers; this cannot be done before, since we cannot
* send exceptions to the debugger before the create process event that
* send exceptions to the debugger before the create process event that
...
@@ -705,13 +717,13 @@ BOOL PROCESS_Create( HFILE hFile, LPCSTR filename, LPSTR cmd_line, LPCSTR env,
...
@@ -705,13 +717,13 @@ BOOL PROCESS_Create( HFILE hFile, LPCSTR filename, LPSTR cmd_line, LPCSTR env,
BOOL
inherit
,
DWORD
flags
,
LPSTARTUPINFOA
startup
,
BOOL
inherit
,
DWORD
flags
,
LPSTARTUPINFOA
startup
,
LPPROCESS_INFORMATION
info
,
LPCSTR
lpCurrentDirectory
)
LPPROCESS_INFORMATION
info
,
LPCSTR
lpCurrentDirectory
)
{
{
BOOL
ret
;
int
pid
;
int
pid
;
const
char
*
unixfilename
=
NULL
;
const
char
*
unixfilename
=
NULL
;
const
char
*
unixdir
=
NULL
;
const
char
*
unixdir
=
NULL
;
DOS_FULL_NAME
full_name
;
DOS_FULL_NAME
full_name
;
HANDLE
load_done_evt
=
-
1
;
HANDLE
load_done_evt
=
-
1
;
struct
new_process_request
*
req
=
get_req_buffer
();
struct
new_process_request
*
req
=
get_req_buffer
();
struct
wait_process_request
*
wait_req
=
get_req_buffer
();
info
->
hThread
=
info
->
hProcess
=
INVALID_HANDLE_VALUE
;
info
->
hThread
=
info
->
hProcess
=
INVALID_HANDLE_VALUE
;
...
@@ -764,16 +776,24 @@ BOOL PROCESS_Create( HFILE hFile, LPCSTR filename, LPSTR cmd_line, LPCSTR env,
...
@@ -764,16 +776,24 @@ BOOL PROCESS_Create( HFILE hFile, LPCSTR filename, LPSTR cmd_line, LPCSTR env,
pid
=
fork_and_exec
(
unixfilename
,
cmd_line
,
env
?
env
:
GetEnvironmentStringsA
(),
unixdir
);
pid
=
fork_and_exec
(
unixfilename
,
cmd_line
,
env
?
env
:
GetEnvironmentStringsA
(),
unixdir
);
wait_req
->
cancel
=
(
pid
==
-
1
);
SERVER_START_REQ
wait_req
->
pinherit
=
(
psa
&&
(
psa
->
nLength
>=
sizeof
(
*
psa
))
&&
psa
->
bInheritHandle
);
{
wait_req
->
tinherit
=
(
tsa
&&
(
tsa
->
nLength
>=
sizeof
(
*
tsa
))
&&
tsa
->
bInheritHandle
);
struct
wait_process_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
wait_req
->
timeout
=
2000
;
req
->
cancel
=
(
pid
==
-
1
);
if
(
server_call
(
REQ_WAIT_PROCESS
)
||
(
pid
==
-
1
))
goto
error
;
req
->
pinherit
=
(
psa
&&
(
psa
->
nLength
>=
sizeof
(
*
psa
))
&&
psa
->
bInheritHandle
);
info
->
dwProcessId
=
(
DWORD
)
wait_req
->
pid
;
req
->
tinherit
=
(
tsa
&&
(
tsa
->
nLength
>=
sizeof
(
*
tsa
))
&&
tsa
->
bInheritHandle
);
info
->
dwThreadId
=
(
DWORD
)
wait_req
->
tid
;
req
->
timeout
=
2000
;
info
->
hProcess
=
wait_req
->
phandle
;
if
((
ret
=
!
server_call
(
REQ_WAIT_PROCESS
))
&&
(
pid
!=
-
1
))
info
->
hThread
=
wait_req
->
thandle
;
{
load_done_evt
=
wait_req
->
event
;
info
->
dwProcessId
=
(
DWORD
)
req
->
pid
;
info
->
dwThreadId
=
(
DWORD
)
req
->
tid
;
info
->
hProcess
=
req
->
phandle
;
info
->
hThread
=
req
->
thandle
;
load_done_evt
=
req
->
event
;
}
}
SERVER_END_REQ
;
if
(
!
ret
||
(
pid
==
-
1
))
goto
error
;
/* Wait until process is initialized (or initialization failed) */
/* Wait until process is initialized (or initialization failed) */
if
(
load_done_evt
!=
-
1
)
if
(
load_done_evt
!=
-
1
)
...
@@ -809,13 +829,16 @@ error:
...
@@ -809,13 +829,16 @@ error:
*/
*/
void
WINAPI
ExitProcess
(
DWORD
status
)
void
WINAPI
ExitProcess
(
DWORD
status
)
{
{
struct
terminate_process_request
*
req
=
get_req_buffer
();
MODULE_DllProcessDetach
(
TRUE
,
(
LPVOID
)
1
);
MODULE_DllProcessDetach
(
TRUE
,
(
LPVOID
)
1
);
SERVER_START_REQ
{
struct
terminate_process_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
/* send the exit code to the server */
/* send the exit code to the server */
req
->
handle
=
GetCurrentProcess
();
req
->
handle
=
GetCurrentProcess
();
req
->
exit_code
=
status
;
req
->
exit_code
=
status
;
server_call
(
REQ_TERMINATE_PROCESS
);
server_call
(
REQ_TERMINATE_PROCESS
);
}
SERVER_END_REQ
;
exit
(
status
);
exit
(
status
);
}
}
...
@@ -833,12 +856,9 @@ void WINAPI ExitProcess16( WORD status )
...
@@ -833,12 +856,9 @@ void WINAPI ExitProcess16( WORD status )
*/
*/
BOOL
WINAPI
TerminateProcess
(
HANDLE
handle
,
DWORD
exit_code
)
BOOL
WINAPI
TerminateProcess
(
HANDLE
handle
,
DWORD
exit_code
)
{
{
BOOL
ret
;
NTSTATUS
status
=
NtTerminateProcess
(
handle
,
exit_code
);
struct
terminate_process_request
*
req
=
get_req_buffer
();
if
(
status
)
SetLastError
(
RtlNtStatusToDosError
(
status
)
);
req
->
handle
=
handle
;
return
!
status
;
req
->
exit_code
=
exit_code
;
if
((
ret
=
!
server_call
(
REQ_TERMINATE_PROCESS
))
&&
req
->
self
)
exit
(
exit_code
);
return
ret
;
}
}
...
@@ -973,12 +993,16 @@ void WINAPI SetProcessDword( DWORD dwProcessID, INT offset, DWORD value )
...
@@ -973,12 +993,16 @@ void WINAPI SetProcessDword( DWORD dwProcessID, INT offset, DWORD value )
HANDLE
WINAPI
OpenProcess
(
DWORD
access
,
BOOL
inherit
,
DWORD
id
)
HANDLE
WINAPI
OpenProcess
(
DWORD
access
,
BOOL
inherit
,
DWORD
id
)
{
{
HANDLE
ret
=
0
;
HANDLE
ret
=
0
;
struct
open_process_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
open_process_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
pid
=
(
void
*
)
id
;
req
->
pid
=
(
void
*
)
id
;
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
if
(
!
server_call
(
REQ_OPEN_PROCESS
))
ret
=
req
->
handle
;
if
(
!
server_call
(
REQ_OPEN_PROCESS
))
ret
=
req
->
handle
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -988,9 +1012,13 @@ HANDLE WINAPI OpenProcess( DWORD access, BOOL inherit, DWORD id )
...
@@ -988,9 +1012,13 @@ HANDLE WINAPI OpenProcess( DWORD access, BOOL inherit, DWORD id )
DWORD
WINAPI
MapProcessHandle
(
HANDLE
handle
)
DWORD
WINAPI
MapProcessHandle
(
HANDLE
handle
)
{
{
DWORD
ret
=
0
;
DWORD
ret
=
0
;
struct
get_process_info_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
get_process_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
if
(
!
server_call
(
REQ_GET_PROCESS_INFO
))
ret
=
(
DWORD
)
req
->
pid
;
if
(
!
server_call
(
REQ_GET_PROCESS_INFO
))
ret
=
(
DWORD
)
req
->
pid
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -999,11 +1027,17 @@ DWORD WINAPI MapProcessHandle( HANDLE handle )
...
@@ -999,11 +1027,17 @@ DWORD WINAPI MapProcessHandle( HANDLE handle )
*/
*/
BOOL
WINAPI
SetPriorityClass
(
HANDLE
hprocess
,
DWORD
priorityclass
)
BOOL
WINAPI
SetPriorityClass
(
HANDLE
hprocess
,
DWORD
priorityclass
)
{
{
struct
set_process_info_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
set_process_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hprocess
;
req
->
handle
=
hprocess
;
req
->
priority
=
priorityclass
;
req
->
priority
=
priorityclass
;
req
->
mask
=
SET_PROCESS_INFO_PRIORITY
;
req
->
mask
=
SET_PROCESS_INFO_PRIORITY
;
return
!
server_call
(
REQ_SET_PROCESS_INFO
);
ret
=
!
server_call
(
REQ_SET_PROCESS_INFO
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -1013,9 +1047,13 @@ BOOL WINAPI SetPriorityClass( HANDLE hprocess, DWORD priorityclass )
...
@@ -1013,9 +1047,13 @@ BOOL WINAPI SetPriorityClass( HANDLE hprocess, DWORD priorityclass )
DWORD
WINAPI
GetPriorityClass
(
HANDLE
hprocess
)
DWORD
WINAPI
GetPriorityClass
(
HANDLE
hprocess
)
{
{
DWORD
ret
=
0
;
DWORD
ret
=
0
;
struct
get_process_info_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
get_process_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hprocess
;
req
->
handle
=
hprocess
;
if
(
!
server_call
(
REQ_GET_PROCESS_INFO
))
ret
=
req
->
priority
;
if
(
!
server_call
(
REQ_GET_PROCESS_INFO
))
ret
=
req
->
priority
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -1025,11 +1063,17 @@ DWORD WINAPI GetPriorityClass(HANDLE hprocess)
...
@@ -1025,11 +1063,17 @@ DWORD WINAPI GetPriorityClass(HANDLE hprocess)
*/
*/
BOOL
WINAPI
SetProcessAffinityMask
(
HANDLE
hProcess
,
DWORD
affmask
)
BOOL
WINAPI
SetProcessAffinityMask
(
HANDLE
hProcess
,
DWORD
affmask
)
{
{
struct
set_process_info_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
set_process_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hProcess
;
req
->
handle
=
hProcess
;
req
->
affinity
=
affmask
;
req
->
affinity
=
affmask
;
req
->
mask
=
SET_PROCESS_INFO_AFFINITY
;
req
->
mask
=
SET_PROCESS_INFO_AFFINITY
;
return
!
server_call
(
REQ_SET_PROCESS_INFO
);
ret
=
!
server_call
(
REQ_SET_PROCESS_INFO
);
}
SERVER_END_REQ
;
return
ret
;
}
}
/**********************************************************************
/**********************************************************************
...
@@ -1040,7 +1084,9 @@ BOOL WINAPI GetProcessAffinityMask( HANDLE hProcess,
...
@@ -1040,7 +1084,9 @@ BOOL WINAPI GetProcessAffinityMask( HANDLE hProcess,
LPDWORD
lpSystemAffinityMask
)
LPDWORD
lpSystemAffinityMask
)
{
{
BOOL
ret
=
FALSE
;
BOOL
ret
=
FALSE
;
struct
get_process_info_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
get_process_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hProcess
;
req
->
handle
=
hProcess
;
if
(
!
server_call
(
REQ_GET_PROCESS_INFO
))
if
(
!
server_call
(
REQ_GET_PROCESS_INFO
))
{
{
...
@@ -1048,6 +1094,8 @@ BOOL WINAPI GetProcessAffinityMask( HANDLE hProcess,
...
@@ -1048,6 +1094,8 @@ BOOL WINAPI GetProcessAffinityMask( HANDLE hProcess,
if
(
lpSystemAffinityMask
)
*
lpSystemAffinityMask
=
req
->
system_affinity
;
if
(
lpSystemAffinityMask
)
*
lpSystemAffinityMask
=
req
->
system_affinity
;
ret
=
TRUE
;
ret
=
TRUE
;
}
}
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -1299,14 +1347,15 @@ BOOL WINAPI GetExitCodeProcess(
...
@@ -1299,14 +1347,15 @@ BOOL WINAPI GetExitCodeProcess(
HANDLE
hProcess
,
/* [I] handle to the process */
HANDLE
hProcess
,
/* [I] handle to the process */
LPDWORD
lpExitCode
)
/* [O] address to receive termination status */
LPDWORD
lpExitCode
)
/* [O] address to receive termination status */
{
{
BOOL
ret
=
FALSE
;
BOOL
ret
;
struct
get_process_info_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
req
->
handle
=
hProcess
;
if
(
!
server_call
(
REQ_GET_PROCESS_INFO
))
{
{
if
(
lpExitCode
)
*
lpExitCode
=
req
->
exit_code
;
struct
get_process_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
ret
=
TRUE
;
req
->
handle
=
hProcess
;
ret
=
!
server_call
(
REQ_GET_PROCESS_INFO
);
if
(
ret
&&
lpExitCode
)
*
lpExitCode
=
req
->
exit_code
;
}
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
...
scheduler/semaphore.c
View file @
9c2370bd
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
#include <assert.h>
#include <assert.h>
#include <string.h>
#include <string.h>
#include "winerror.h"
#include "winerror.h"
#include "wine/unicode.h"
#include "server.h"
#include "server.h"
...
@@ -15,7 +16,8 @@
...
@@ -15,7 +16,8 @@
*/
*/
HANDLE
WINAPI
CreateSemaphoreA
(
SECURITY_ATTRIBUTES
*
sa
,
LONG
initial
,
LONG
max
,
LPCSTR
name
)
HANDLE
WINAPI
CreateSemaphoreA
(
SECURITY_ATTRIBUTES
*
sa
,
LONG
initial
,
LONG
max
,
LPCSTR
name
)
{
{
struct
create_semaphore_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
NULL
,
0
)
:
0
;
/* Check parameters */
/* Check parameters */
...
@@ -24,15 +26,28 @@ HANDLE WINAPI CreateSemaphoreA( SECURITY_ATTRIBUTES *sa, LONG initial, LONG max,
...
@@ -24,15 +26,28 @@ HANDLE WINAPI CreateSemaphoreA( SECURITY_ATTRIBUTES *sa, LONG initial, LONG max,
SetLastError
(
ERROR_INVALID_PARAMETER
);
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
0
;
return
0
;
}
}
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
create_semaphore_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
initial
=
(
unsigned
int
)
initial
;
req
->
initial
=
(
unsigned
int
)
initial
;
req
->
max
=
(
unsigned
int
)
max
;
req
->
max
=
(
unsigned
int
)
max
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
server_strcpyAtoW
(
req
->
name
,
name
);
if
(
len
)
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
server_data_ptr
(
req
),
len
);
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_SEMAPHORE
);
server_call
(
REQ_CREATE_SEMAPHORE
);
if
(
req
->
handle
==
-
1
)
return
0
;
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -42,7 +57,8 @@ HANDLE WINAPI CreateSemaphoreA( SECURITY_ATTRIBUTES *sa, LONG initial, LONG max,
...
@@ -42,7 +57,8 @@ HANDLE WINAPI CreateSemaphoreA( SECURITY_ATTRIBUTES *sa, LONG initial, LONG max,
HANDLE
WINAPI
CreateSemaphoreW
(
SECURITY_ATTRIBUTES
*
sa
,
LONG
initial
,
HANDLE
WINAPI
CreateSemaphoreW
(
SECURITY_ATTRIBUTES
*
sa
,
LONG
initial
,
LONG
max
,
LPCWSTR
name
)
LONG
max
,
LPCWSTR
name
)
{
{
struct
create_semaphore_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
strlenW
(
name
)
:
0
;
/* Check parameters */
/* Check parameters */
...
@@ -51,15 +67,28 @@ HANDLE WINAPI CreateSemaphoreW( SECURITY_ATTRIBUTES *sa, LONG initial,
...
@@ -51,15 +67,28 @@ HANDLE WINAPI CreateSemaphoreW( SECURITY_ATTRIBUTES *sa, LONG initial,
SetLastError
(
ERROR_INVALID_PARAMETER
);
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
0
;
return
0
;
}
}
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
create_semaphore_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
initial
=
(
unsigned
int
)
initial
;
req
->
initial
=
(
unsigned
int
)
initial
;
req
->
max
=
(
unsigned
int
)
max
;
req
->
max
=
(
unsigned
int
)
max
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
server_strcpyW
(
req
->
name
,
name
);
memcpy
(
server_data_ptr
(
req
),
name
,
len
*
sizeof
(
WCHAR
)
);
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_SEMAPHORE
);
server_call
(
REQ_CREATE_SEMAPHORE
);
if
(
req
->
handle
==
-
1
)
return
0
;
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -68,14 +97,26 @@ HANDLE WINAPI CreateSemaphoreW( SECURITY_ATTRIBUTES *sa, LONG initial,
...
@@ -68,14 +97,26 @@ HANDLE WINAPI CreateSemaphoreW( SECURITY_ATTRIBUTES *sa, LONG initial,
*/
*/
HANDLE
WINAPI
OpenSemaphoreA
(
DWORD
access
,
BOOL
inherit
,
LPCSTR
name
)
HANDLE
WINAPI
OpenSemaphoreA
(
DWORD
access
,
BOOL
inherit
,
LPCSTR
name
)
{
{
struct
open_semaphore_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
NULL
,
0
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
open_semaphore_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
server_strcpyAtoW
(
req
->
name
,
name
);
if
(
len
)
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
server_data_ptr
(
req
),
len
);
server_call
(
REQ_OPEN_SEMAPHORE
);
server_call
(
REQ_OPEN_SEMAPHORE
);
if
(
req
->
handle
==
-
1
)
return
0
;
/* must return 0 on failure, not -1 */
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -84,14 +125,25 @@ HANDLE WINAPI OpenSemaphoreA( DWORD access, BOOL inherit, LPCSTR name )
...
@@ -84,14 +125,25 @@ HANDLE WINAPI OpenSemaphoreA( DWORD access, BOOL inherit, LPCSTR name )
*/
*/
HANDLE
WINAPI
OpenSemaphoreW
(
DWORD
access
,
BOOL
inherit
,
LPCWSTR
name
)
HANDLE
WINAPI
OpenSemaphoreW
(
DWORD
access
,
BOOL
inherit
,
LPCWSTR
name
)
{
{
struct
open_semaphore_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
strlenW
(
name
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
open_semaphore_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
server_strcpyW
(
req
->
name
,
name
);
memcpy
(
server_data_ptr
(
req
),
name
,
len
*
sizeof
(
WCHAR
)
);
server_call
(
REQ_OPEN_SEMAPHORE
);
server_call
(
REQ_OPEN_SEMAPHORE
);
if
(
req
->
handle
==
-
1
)
return
0
;
/* must return 0 on failure, not -1 */
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -100,20 +152,7 @@ HANDLE WINAPI OpenSemaphoreW( DWORD access, BOOL inherit, LPCWSTR name )
...
@@ -100,20 +152,7 @@ HANDLE WINAPI OpenSemaphoreW( DWORD access, BOOL inherit, LPCWSTR name )
*/
*/
BOOL
WINAPI
ReleaseSemaphore
(
HANDLE
handle
,
LONG
count
,
LONG
*
previous
)
BOOL
WINAPI
ReleaseSemaphore
(
HANDLE
handle
,
LONG
count
,
LONG
*
previous
)
{
{
BOOL
ret
=
FALSE
;
NTSTATUS
status
=
NtReleaseSemaphore
(
handle
,
count
,
previous
);
struct
release_semaphore_request
*
req
=
get_req_buffer
();
if
(
status
)
SetLastError
(
RtlNtStatusToDosError
(
status
)
);
return
!
status
;
if
(
count
<
0
)
{
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
FALSE
;
}
req
->
handle
=
handle
;
req
->
count
=
(
unsigned
int
)
count
;
if
(
!
server_call
(
REQ_RELEASE_SEMAPHORE
))
{
if
(
previous
)
*
previous
=
req
->
prev_count
;
ret
=
TRUE
;
}
return
ret
;
}
}
scheduler/synchro.c
View file @
9c2370bd
...
@@ -23,33 +23,39 @@
...
@@ -23,33 +23,39 @@
*/
*/
static
void
call_apcs
(
void
)
static
void
call_apcs
(
void
)
{
{
FARPROC
proc
;
FARPROC
proc
=
NULL
;
struct
get_apc_request
*
req
=
get_req_buffer
();
FILETIME
ft
;
void
*
args
[
4
];
for
(;;)
for
(;;)
{
{
if
(
server_call
(
REQ_GET_APC
))
return
;
int
type
=
APC_NONE
;
switch
(
req
->
type
)
SERVER_START_REQ
{
struct
get_apc_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
sizeof
(
args
)
);
if
(
!
server_call
(
REQ_GET_APC
))
{
type
=
req
->
type
;
proc
=
req
->
func
;
memcpy
(
args
,
server_data_ptr
(
req
),
server_data_size
(
req
)
);
}
}
SERVER_END_REQ
;
switch
(
type
)
{
{
case
APC_NONE
:
case
APC_NONE
:
return
;
/* no more APCs */
return
;
/* no more APCs */
case
APC_USER
:
case
APC_USER
:
if
((
proc
=
req
->
func
))
proc
(
args
[
0
]
);
{
proc
(
req
->
args
[
0
]
);
}
break
;
break
;
case
APC_TIMER
:
case
APC_TIMER
:
if
((
proc
=
req
->
func
))
{
FILETIME
ft
;
/* convert sec/usec to NT time */
/* convert sec/usec to NT time */
DOSFS_UnixTimeToFileTime
(
(
time_t
)
req
->
args
[
0
],
&
ft
,
(
DWORD
)
req
->
args
[
1
]
*
10
);
DOSFS_UnixTimeToFileTime
(
(
time_t
)
args
[
0
],
&
ft
,
(
DWORD
)
args
[
1
]
*
10
);
proc
(
req
->
args
[
2
],
ft
.
dwLowDateTime
,
ft
.
dwHighDateTime
);
proc
(
args
[
2
],
ft
.
dwLowDateTime
,
ft
.
dwHighDateTime
);
}
break
;
break
;
default:
default:
server_protocol_error
(
"get_apc_request: bad type %d
\n
"
,
req
->
type
);
server_protocol_error
(
"get_apc_request: bad type %d
\n
"
,
type
);
break
;
break
;
}
}
}
}
...
@@ -110,7 +116,6 @@ DWORD WINAPI WaitForMultipleObjectsEx( DWORD count, const HANDLE *handles,
...
@@ -110,7 +116,6 @@ DWORD WINAPI WaitForMultipleObjectsEx( DWORD count, const HANDLE *handles,
BOOL
wait_all
,
DWORD
timeout
,
BOOL
wait_all
,
DWORD
timeout
,
BOOL
alertable
)
BOOL
alertable
)
{
{
struct
select_request
*
req
=
get_req_buffer
();
int
i
,
ret
;
int
i
,
ret
;
if
(
count
>
MAXIMUM_WAIT_OBJECTS
)
if
(
count
>
MAXIMUM_WAIT_OBJECTS
)
...
@@ -119,17 +124,24 @@ DWORD WINAPI WaitForMultipleObjectsEx( DWORD count, const HANDLE *handles,
...
@@ -119,17 +124,24 @@ DWORD WINAPI WaitForMultipleObjectsEx( DWORD count, const HANDLE *handles,
return
WAIT_FAILED
;
return
WAIT_FAILED
;
}
}
req
->
count
=
count
;
SERVER_START_REQ
{
struct
select_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
count
*
sizeof
(
int
)
);
int
*
data
=
server_data_ptr
(
req
);
req
->
flags
=
0
;
req
->
flags
=
0
;
req
->
timeout
=
timeout
;
req
->
timeout
=
timeout
;
for
(
i
=
0
;
i
<
count
;
i
++
)
req
->
handles
[
i
]
=
handles
[
i
];
for
(
i
=
0
;
i
<
count
;
i
++
)
data
[
i
]
=
handles
[
i
];
if
(
wait_all
)
req
->
flags
|=
SELECT_ALL
;
if
(
wait_all
)
req
->
flags
|=
SELECT_ALL
;
if
(
alertable
)
req
->
flags
|=
SELECT_ALERTABLE
;
if
(
alertable
)
req
->
flags
|=
SELECT_ALERTABLE
;
if
(
timeout
!=
INFINITE
)
req
->
flags
|=
SELECT_TIMEOUT
;
if
(
timeout
!=
INFINITE
)
req
->
flags
|=
SELECT_TIMEOUT
;
server_call
(
REQ_SELECT
);
server_call
(
REQ_SELECT
);
if
((
ret
=
req
->
signaled
)
==
STATUS_USER_APC
)
call_apcs
();
ret
=
req
->
signaled
;
}
SERVER_END_REQ
;
if
(
ret
==
STATUS_USER_APC
)
call_apcs
();
return
ret
;
return
ret
;
}
}
...
...
scheduler/thread.c
View file @
9c2370bd
...
@@ -50,13 +50,21 @@ BOOL THREAD_IsWin16( TEB *teb )
...
@@ -50,13 +50,21 @@ BOOL THREAD_IsWin16( TEB *teb )
*/
*/
TEB
*
THREAD_IdToTEB
(
DWORD
id
)
TEB
*
THREAD_IdToTEB
(
DWORD
id
)
{
{
struct
get_thread_info_request
*
req
=
get_req_buffer
()
;
TEB
*
ret
=
NULL
;
if
(
!
id
||
id
==
GetCurrentThreadId
())
return
NtCurrentTeb
();
if
(
!
id
||
id
==
GetCurrentThreadId
())
return
NtCurrentTeb
();
SERVER_START_REQ
{
struct
get_thread_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
-
1
;
req
->
handle
=
-
1
;
req
->
tid_in
=
(
void
*
)
id
;
req
->
tid_in
=
(
void
*
)
id
;
if
(
!
server_call_noerr
(
REQ_GET_THREAD_INFO
))
return
req
->
teb
;
if
(
!
server_call_noerr
(
REQ_GET_THREAD_INFO
))
ret
=
req
->
teb
;
}
SERVER_END_REQ
;
if
(
!
ret
)
{
/* Allow task handles to be used; convert to main thread */
/* Allow task handles to be used; convert to main thread */
if
(
IsTask16
(
id
)
)
if
(
IsTask16
(
id
)
)
{
{
...
@@ -64,7 +72,8 @@ TEB *THREAD_IdToTEB( DWORD id )
...
@@ -64,7 +72,8 @@ TEB *THREAD_IdToTEB( DWORD id )
if
(
pTask
)
return
pTask
->
teb
;
if
(
pTask
)
return
pTask
->
teb
;
}
}
SetLastError
(
ERROR_INVALID_PARAMETER
);
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
NULL
;
}
return
ret
;
}
}
...
@@ -272,16 +281,24 @@ HANDLE WINAPI CreateThread( SECURITY_ATTRIBUTES *sa, DWORD stack,
...
@@ -272,16 +281,24 @@ HANDLE WINAPI CreateThread( SECURITY_ATTRIBUTES *sa, DWORD stack,
LPTHREAD_START_ROUTINE
start
,
LPVOID
param
,
LPTHREAD_START_ROUTINE
start
,
LPVOID
param
,
DWORD
flags
,
LPDWORD
id
)
DWORD
flags
,
LPDWORD
id
)
{
{
struct
new_thread_request
*
req
=
get_req_buffer
();
int
socket
,
handle
=
-
1
;
int
socket
,
handle
=
-
1
;
TEB
*
teb
;
TEB
*
teb
;
void
*
tid
;
void
*
tid
=
0
;
SERVER_START_REQ
{
struct
new_thread_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
suspend
=
((
flags
&
CREATE_SUSPENDED
)
!=
0
);
req
->
suspend
=
((
flags
&
CREATE_SUSPENDED
)
!=
0
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
if
(
server_call_fd
(
REQ_NEW_THREAD
,
-
1
,
&
socket
))
return
0
;
if
(
!
server_call_fd
(
REQ_NEW_THREAD
,
-
1
,
&
socket
))
{
handle
=
req
->
handle
;
handle
=
req
->
handle
;
tid
=
req
->
tid
;
tid
=
req
->
tid
;
}
}
SERVER_END_REQ
;
if
(
handle
==
-
1
)
return
0
;
if
(
!
(
teb
=
THREAD_Create
(
socket
,
stack
,
TRUE
)))
if
(
!
(
teb
=
THREAD_Create
(
socket
,
stack
,
TRUE
)))
{
{
...
@@ -297,6 +314,7 @@ HANDLE WINAPI CreateThread( SECURITY_ATTRIBUTES *sa, DWORD stack,
...
@@ -297,6 +314,7 @@ HANDLE WINAPI CreateThread( SECURITY_ATTRIBUTES *sa, DWORD stack,
if
(
SYSDEPS_SpawnThread
(
teb
)
==
-
1
)
if
(
SYSDEPS_SpawnThread
(
teb
)
==
-
1
)
{
{
CloseHandle
(
handle
);
CloseHandle
(
handle
);
THREAD_FreeTEB
(
teb
);
return
0
;
return
0
;
}
}
return
handle
;
return
handle
;
...
@@ -335,13 +353,20 @@ HANDLE WINAPI CreateThread16( SECURITY_ATTRIBUTES *sa, DWORD stack,
...
@@ -335,13 +353,20 @@ HANDLE WINAPI CreateThread16( SECURITY_ATTRIBUTES *sa, DWORD stack,
*/
*/
void
WINAPI
ExitThread
(
DWORD
code
)
/* [in] Exit code for this thread */
void
WINAPI
ExitThread
(
DWORD
code
)
/* [in] Exit code for this thread */
{
{
struct
terminate_thread_request
*
req
=
get_req_buffer
();
BOOL
last
;
SERVER_START_REQ
{
struct
terminate_thread_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
/* send the exit code to the server */
/* send the exit code to the server */
req
->
handle
=
GetCurrentThread
();
req
->
handle
=
GetCurrentThread
();
req
->
exit_code
=
code
;
req
->
exit_code
=
code
;
server_call
(
REQ_TERMINATE_THREAD
);
server_call
(
REQ_TERMINATE_THREAD
);
if
(
req
->
last
)
last
=
req
->
last
;
}
SERVER_END_REQ
;
if
(
last
)
{
{
MODULE_DllProcessDetach
(
TRUE
,
(
LPVOID
)
1
);
MODULE_DllProcessDetach
(
TRUE
,
(
LPVOID
)
1
);
exit
(
code
);
exit
(
code
);
...
@@ -474,11 +499,17 @@ BOOL WINAPI TlsSetValue(
...
@@ -474,11 +499,17 @@ BOOL WINAPI TlsSetValue(
BOOL
WINAPI
SetThreadContext
(
HANDLE
handle
,
/* [in] Handle to thread with context */
BOOL
WINAPI
SetThreadContext
(
HANDLE
handle
,
/* [in] Handle to thread with context */
const
CONTEXT
*
context
)
/* [in] Address of context structure */
const
CONTEXT
*
context
)
/* [in] Address of context structure */
{
{
struct
set_thread_context_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
set_thread_context_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
req
->
flags
=
context
->
ContextFlags
;
req
->
flags
=
context
->
ContextFlags
;
memcpy
(
&
req
->
context
,
context
,
sizeof
(
*
context
)
);
memcpy
(
&
req
->
context
,
context
,
sizeof
(
*
context
)
);
return
!
server_call
(
REQ_SET_THREAD_CONTEXT
);
ret
=
!
server_call
(
REQ_SET_THREAD_CONTEXT
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -492,13 +523,18 @@ BOOL WINAPI SetThreadContext( HANDLE handle, /* [in] Handle to thread
...
@@ -492,13 +523,18 @@ BOOL WINAPI SetThreadContext( HANDLE handle, /* [in] Handle to thread
BOOL
WINAPI
GetThreadContext
(
HANDLE
handle
,
/* [in] Handle to thread with context */
BOOL
WINAPI
GetThreadContext
(
HANDLE
handle
,
/* [in] Handle to thread with context */
CONTEXT
*
context
)
/* [out] Address of context structure */
CONTEXT
*
context
)
/* [out] Address of context structure */
{
{
struct
get_thread_context_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
get_thread_context_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
req
->
flags
=
context
->
ContextFlags
;
req
->
flags
=
context
->
ContextFlags
;
memcpy
(
&
req
->
context
,
context
,
sizeof
(
*
context
)
);
memcpy
(
&
req
->
context
,
context
,
sizeof
(
*
context
)
);
if
(
server_call
(
REQ_GET_THREAD_CONTEXT
))
return
FALSE
;
if
((
ret
=
!
server_call
(
REQ_GET_THREAD_CONTEXT
)))
memcpy
(
context
,
&
req
->
context
,
sizeof
(
*
context
)
);
memcpy
(
context
,
&
req
->
context
,
sizeof
(
*
context
)
);
return
TRUE
;
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -513,10 +549,14 @@ INT WINAPI GetThreadPriority(
...
@@ -513,10 +549,14 @@ INT WINAPI GetThreadPriority(
HANDLE
hthread
)
/* [in] Handle to thread */
HANDLE
hthread
)
/* [in] Handle to thread */
{
{
INT
ret
=
THREAD_PRIORITY_ERROR_RETURN
;
INT
ret
=
THREAD_PRIORITY_ERROR_RETURN
;
struct
get_thread_info_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
get_thread_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hthread
;
req
->
handle
=
hthread
;
req
->
tid_in
=
0
;
req
->
tid_in
=
0
;
if
(
!
server_call
(
REQ_GET_THREAD_INFO
))
ret
=
req
->
priority
;
if
(
!
server_call
(
REQ_GET_THREAD_INFO
))
ret
=
req
->
priority
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -532,11 +572,17 @@ BOOL WINAPI SetThreadPriority(
...
@@ -532,11 +572,17 @@ BOOL WINAPI SetThreadPriority(
HANDLE
hthread
,
/* [in] Handle to thread */
HANDLE
hthread
,
/* [in] Handle to thread */
INT
priority
)
/* [in] Thread priority level */
INT
priority
)
/* [in] Thread priority level */
{
{
struct
set_thread_info_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
set_thread_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hthread
;
req
->
handle
=
hthread
;
req
->
priority
=
priority
;
req
->
priority
=
priority
;
req
->
mask
=
SET_THREAD_INFO_PRIORITY
;
req
->
mask
=
SET_THREAD_INFO_PRIORITY
;
return
!
server_call
(
REQ_SET_THREAD_INFO
);
ret
=
!
server_call
(
REQ_SET_THREAD_INFO
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -581,12 +627,18 @@ BOOL WINAPI SetThreadPriorityBoost(
...
@@ -581,12 +627,18 @@ BOOL WINAPI SetThreadPriorityBoost(
*/
*/
DWORD
WINAPI
SetThreadAffinityMask
(
HANDLE
hThread
,
DWORD
dwThreadAffinityMask
)
DWORD
WINAPI
SetThreadAffinityMask
(
HANDLE
hThread
,
DWORD
dwThreadAffinityMask
)
{
{
struct
set_thread_info_request
*
req
=
get_req_buffer
();
DWORD
ret
;
SERVER_START_REQ
{
struct
set_thread_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hThread
;
req
->
handle
=
hThread
;
req
->
affinity
=
dwThreadAffinityMask
;
req
->
affinity
=
dwThreadAffinityMask
;
req
->
mask
=
SET_THREAD_INFO_AFFINITY
;
req
->
mask
=
SET_THREAD_INFO_AFFINITY
;
if
(
server_call
(
REQ_SET_THREAD_INFO
))
return
0
;
ret
=
!
server_call
(
REQ_SET_THREAD_INFO
);
return
1
;
/* FIXME: should return previous value */
/* FIXME: should return previous value */
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -597,21 +649,12 @@ DWORD WINAPI SetThreadAffinityMask( HANDLE hThread, DWORD dwThreadAffinityMask )
...
@@ -597,21 +649,12 @@ DWORD WINAPI SetThreadAffinityMask( HANDLE hThread, DWORD dwThreadAffinityMask )
* Success: TRUE
* Success: TRUE
* Failure: FALSE
* Failure: FALSE
*/
*/
BOOL
WINAPI
TerminateThread
(
BOOL
WINAPI
TerminateThread
(
HANDLE
handle
,
/* [in] Handle to thread */
HANDLE
handle
,
/* [in] Handle to thread */
DWORD
exit_code
)
/* [in] Exit code for thread */
DWORD
exitcode
)
/* [in] Exit code for thread */
{
{
BOOL
ret
;
NTSTATUS
status
=
NtTerminateThread
(
handle
,
exit_code
);
struct
terminate_thread_request
*
req
=
get_req_buffer
();
if
(
status
)
SetLastError
(
RtlNtStatusToDosError
(
status
)
);
req
->
handle
=
handle
;
return
!
status
;
req
->
exit_code
=
exitcode
;
if
((
ret
=
!
server_call
(
REQ_TERMINATE_THREAD
))
&&
req
->
self
)
{
PROCESS_CallUserSignalProc
(
USIG_THREAD_EXIT
,
0
);
if
(
req
->
last
)
exit
(
exitcode
);
else
SYSDEPS_ExitThread
(
exitcode
);
}
return
ret
;
}
}
...
@@ -626,15 +669,16 @@ BOOL WINAPI GetExitCodeThread(
...
@@ -626,15 +669,16 @@ BOOL WINAPI GetExitCodeThread(
HANDLE
hthread
,
/* [in] Handle to thread */
HANDLE
hthread
,
/* [in] Handle to thread */
LPDWORD
exitcode
)
/* [out] Address to receive termination status */
LPDWORD
exitcode
)
/* [out] Address to receive termination status */
{
{
BOOL
ret
=
FALSE
;
BOOL
ret
;
struct
get_thread_info_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
get_thread_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hthread
;
req
->
handle
=
hthread
;
req
->
tid_in
=
0
;
req
->
tid_in
=
0
;
if
(
!
server_call
(
REQ_GET_THREAD_INFO
))
ret
=
!
server_call
(
REQ_GET_THREAD_INFO
);
{
if
(
ret
&&
exitcode
)
*
exitcode
=
req
->
exit_code
;
if
(
exitcode
)
*
exitcode
=
req
->
exit_code
;
ret
=
TRUE
;
}
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -654,9 +698,13 @@ DWORD WINAPI ResumeThread(
...
@@ -654,9 +698,13 @@ DWORD WINAPI ResumeThread(
HANDLE
hthread
)
/* [in] Identifies thread to restart */
HANDLE
hthread
)
/* [in] Identifies thread to restart */
{
{
DWORD
ret
=
0xffffffff
;
DWORD
ret
=
0xffffffff
;
struct
resume_thread_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
resume_thread_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hthread
;
req
->
handle
=
hthread
;
if
(
!
server_call
(
REQ_RESUME_THREAD
))
ret
=
req
->
count
;
if
(
!
server_call
(
REQ_RESUME_THREAD
))
ret
=
req
->
count
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -672,9 +720,13 @@ DWORD WINAPI SuspendThread(
...
@@ -672,9 +720,13 @@ DWORD WINAPI SuspendThread(
HANDLE
hthread
)
/* [in] Handle to the thread */
HANDLE
hthread
)
/* [in] Handle to the thread */
{
{
DWORD
ret
=
0xffffffff
;
DWORD
ret
=
0xffffffff
;
struct
suspend_thread_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
suspend_thread_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hthread
;
req
->
handle
=
hthread
;
if
(
!
server_call
(
REQ_SUSPEND_THREAD
))
ret
=
req
->
count
;
if
(
!
server_call
(
REQ_SUSPEND_THREAD
))
ret
=
req
->
count
;
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -684,11 +736,17 @@ DWORD WINAPI SuspendThread(
...
@@ -684,11 +736,17 @@ DWORD WINAPI SuspendThread(
*/
*/
DWORD
WINAPI
QueueUserAPC
(
PAPCFUNC
func
,
HANDLE
hthread
,
ULONG_PTR
data
)
DWORD
WINAPI
QueueUserAPC
(
PAPCFUNC
func
,
HANDLE
hthread
,
ULONG_PTR
data
)
{
{
struct
queue_apc_request
*
req
=
get_req_buffer
();
DWORD
ret
;
SERVER_START_REQ
{
struct
queue_apc_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hthread
;
req
->
handle
=
hthread
;
req
->
func
=
func
;
req
->
func
=
func
;
req
->
param
=
(
void
*
)
data
;
req
->
param
=
(
void
*
)
data
;
return
!
server_call
(
REQ_QUEUE_APC
);
ret
=
!
server_call
(
REQ_QUEUE_APC
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
...
scheduler/timer.c
View file @
9c2370bd
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
#include <assert.h>
#include <assert.h>
#include <string.h>
#include <string.h>
#include "winerror.h"
#include "winerror.h"
#include "wine/unicode.h"
#include "file.h"
/* for FILETIME routines */
#include "file.h"
/* for FILETIME routines */
#include "server.h"
#include "server.h"
...
@@ -16,15 +17,27 @@
...
@@ -16,15 +17,27 @@
*/
*/
HANDLE
WINAPI
CreateWaitableTimerA
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
manual
,
LPCSTR
name
)
HANDLE
WINAPI
CreateWaitableTimerA
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
manual
,
LPCSTR
name
)
{
{
struct
create_timer_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
NULL
,
0
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
create_timer_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
manual
=
manual
;
req
->
manual
=
manual
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
server_strcpyAtoW
(
req
->
name
,
name
);
if
(
len
)
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
server_data_ptr
(
req
),
len
);
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_TIMER
);
server_call
(
REQ_CREATE_TIMER
);
if
(
req
->
handle
==
-
1
)
return
0
;
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -33,15 +46,27 @@ HANDLE WINAPI CreateWaitableTimerA( SECURITY_ATTRIBUTES *sa, BOOL manual, LPCSTR
...
@@ -33,15 +46,27 @@ HANDLE WINAPI CreateWaitableTimerA( SECURITY_ATTRIBUTES *sa, BOOL manual, LPCSTR
*/
*/
HANDLE
WINAPI
CreateWaitableTimerW
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
manual
,
LPCWSTR
name
)
HANDLE
WINAPI
CreateWaitableTimerW
(
SECURITY_ATTRIBUTES
*
sa
,
BOOL
manual
,
LPCWSTR
name
)
{
{
struct
create_timer_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
strlenW
(
name
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
create_timer_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
manual
=
manual
;
req
->
manual
=
manual
;
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
req
->
inherit
=
(
sa
&&
(
sa
->
nLength
>=
sizeof
(
*
sa
))
&&
sa
->
bInheritHandle
);
server_strcpyW
(
req
->
name
,
name
);
memcpy
(
server_data_ptr
(
req
),
name
,
len
*
sizeof
(
WCHAR
)
);
SetLastError
(
0
);
SetLastError
(
0
);
server_call
(
REQ_CREATE_TIMER
);
server_call
(
REQ_CREATE_TIMER
);
if
(
req
->
handle
==
-
1
)
return
0
;
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -50,14 +75,26 @@ HANDLE WINAPI CreateWaitableTimerW( SECURITY_ATTRIBUTES *sa, BOOL manual, LPCWST
...
@@ -50,14 +75,26 @@ HANDLE WINAPI CreateWaitableTimerW( SECURITY_ATTRIBUTES *sa, BOOL manual, LPCWST
*/
*/
HANDLE
WINAPI
OpenWaitableTimerA
(
DWORD
access
,
BOOL
inherit
,
LPCSTR
name
)
HANDLE
WINAPI
OpenWaitableTimerA
(
DWORD
access
,
BOOL
inherit
,
LPCSTR
name
)
{
{
struct
open_timer_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
NULL
,
0
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
open_timer_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
server_strcpyAtoW
(
req
->
name
,
name
);
if
(
len
)
MultiByteToWideChar
(
CP_ACP
,
0
,
name
,
strlen
(
name
),
server_data_ptr
(
req
),
len
);
server_call
(
REQ_OPEN_TIMER
);
server_call
(
REQ_OPEN_TIMER
);
if
(
req
->
handle
==
-
1
)
return
0
;
/* must return 0 on failure, not -1 */
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -66,14 +103,26 @@ HANDLE WINAPI OpenWaitableTimerA( DWORD access, BOOL inherit, LPCSTR name )
...
@@ -66,14 +103,26 @@ HANDLE WINAPI OpenWaitableTimerA( DWORD access, BOOL inherit, LPCSTR name )
*/
*/
HANDLE
WINAPI
OpenWaitableTimerW
(
DWORD
access
,
BOOL
inherit
,
LPCWSTR
name
)
HANDLE
WINAPI
OpenWaitableTimerW
(
DWORD
access
,
BOOL
inherit
,
LPCWSTR
name
)
{
{
struct
open_timer_request
*
req
=
get_req_buffer
();
HANDLE
ret
;
DWORD
len
=
name
?
strlenW
(
name
)
:
0
;
if
(
len
>=
MAX_PATH
)
{
SetLastError
(
ERROR_FILENAME_EXCED_RANGE
);
return
0
;
}
SERVER_START_REQ
{
struct
open_timer_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
len
*
sizeof
(
WCHAR
)
);
req
->
access
=
access
;
req
->
access
=
access
;
req
->
inherit
=
inherit
;
req
->
inherit
=
inherit
;
server_strcpyW
(
req
->
name
,
name
);
memcpy
(
server_data_ptr
(
req
),
name
,
len
*
sizeof
(
WCHAR
)
);
server_call
(
REQ_OPEN_TIMER
);
server_call
(
REQ_OPEN_TIMER
);
if
(
req
->
handle
==
-
1
)
return
0
;
/* must return 0 on failure, not -1 */
ret
=
req
->
handle
;
return
req
->
handle
;
}
SERVER_END_REQ
;
if
(
ret
==
-
1
)
ret
=
0
;
/* must return 0 on failure, not -1 */
return
ret
;
}
}
...
@@ -83,9 +132,9 @@ HANDLE WINAPI OpenWaitableTimerW( DWORD access, BOOL inherit, LPCWSTR name )
...
@@ -83,9 +132,9 @@ HANDLE WINAPI OpenWaitableTimerW( DWORD access, BOOL inherit, LPCWSTR name )
BOOL
WINAPI
SetWaitableTimer
(
HANDLE
handle
,
const
LARGE_INTEGER
*
when
,
LONG
period
,
BOOL
WINAPI
SetWaitableTimer
(
HANDLE
handle
,
const
LARGE_INTEGER
*
when
,
LONG
period
,
PTIMERAPCROUTINE
callback
,
LPVOID
arg
,
BOOL
resume
)
PTIMERAPCROUTINE
callback
,
LPVOID
arg
,
BOOL
resume
)
{
{
BOOL
ret
;
FILETIME
ft
;
FILETIME
ft
;
DWORD
remainder
;
DWORD
remainder
;
struct
set_timer_request
*
req
=
get_req_buffer
();
if
(
when
->
s
.
HighPart
<
0
)
/* relative time */
if
(
when
->
s
.
HighPart
<
0
)
/* relative time */
{
{
...
@@ -102,6 +151,10 @@ BOOL WINAPI SetWaitableTimer( HANDLE handle, const LARGE_INTEGER *when, LONG per
...
@@ -102,6 +151,10 @@ BOOL WINAPI SetWaitableTimer( HANDLE handle, const LARGE_INTEGER *when, LONG per
ft
.
dwHighDateTime
=
when
->
s
.
HighPart
;
ft
.
dwHighDateTime
=
when
->
s
.
HighPart
;
}
}
SERVER_START_REQ
{
struct
set_timer_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
if
(
!
ft
.
dwLowDateTime
&&
!
ft
.
dwHighDateTime
)
if
(
!
ft
.
dwLowDateTime
&&
!
ft
.
dwHighDateTime
)
{
{
/* special case to start timeout on now+period without too many calculations */
/* special case to start timeout on now+period without too many calculations */
...
@@ -118,7 +171,10 @@ BOOL WINAPI SetWaitableTimer( HANDLE handle, const LARGE_INTEGER *when, LONG per
...
@@ -118,7 +171,10 @@ BOOL WINAPI SetWaitableTimer( HANDLE handle, const LARGE_INTEGER *when, LONG per
req
->
callback
=
callback
;
req
->
callback
=
callback
;
req
->
arg
=
arg
;
req
->
arg
=
arg
;
if
(
resume
)
SetLastError
(
ERROR_NOT_SUPPORTED
);
/* set error but can still succeed */
if
(
resume
)
SetLastError
(
ERROR_NOT_SUPPORTED
);
/* set error but can still succeed */
return
!
server_call
(
REQ_SET_TIMER
);
ret
=
!
server_call
(
REQ_SET_TIMER
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
@@ -127,7 +183,13 @@ BOOL WINAPI SetWaitableTimer( HANDLE handle, const LARGE_INTEGER *when, LONG per
...
@@ -127,7 +183,13 @@ BOOL WINAPI SetWaitableTimer( HANDLE handle, const LARGE_INTEGER *when, LONG per
*/
*/
BOOL
WINAPI
CancelWaitableTimer
(
HANDLE
handle
)
BOOL
WINAPI
CancelWaitableTimer
(
HANDLE
handle
)
{
{
struct
cancel_timer_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
cancel_timer_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
return
!
server_call
(
REQ_CANCEL_TIMER
);
ret
=
!
server_call
(
REQ_CANCEL_TIMER
);
}
SERVER_END_REQ
;
return
ret
;
}
}
server/atom.c
View file @
9c2370bd
...
@@ -65,13 +65,17 @@ static struct atom_table *global_table;
...
@@ -65,13 +65,17 @@ static struct atom_table *global_table;
/* copy an atom name to a temporary area */
/* copy an atom name to a temporary area */
static
const
WCHAR
*
copy_name
(
const
WCHAR
*
str
)
static
const
WCHAR
*
copy_name
(
const
WCHAR
*
str
,
size_t
len
)
{
{
static
WCHAR
buffer
[
MAX_ATOM_LEN
+
1
];
static
WCHAR
buffer
[
MAX_ATOM_LEN
+
1
];
WCHAR
*
p
=
buffer
;
while
(
p
<
buffer
+
sizeof
(
buffer
)
-
1
)
if
(
!
(
*
p
++
=
*
str
++
))
break
;
if
(
len
>
MAX_ATOM_LEN
*
sizeof
(
WCHAR
))
*
p
=
0
;
{
set_error
(
STATUS_INVALID_PARAMETER
);
return
NULL
;
}
memcpy
(
buffer
,
str
,
len
);
buffer
[
len
/
sizeof
(
WCHAR
)]
=
0
;
return
buffer
;
return
buffer
;
}
}
...
@@ -261,16 +265,24 @@ static int find_atom( struct atom_table *table, const WCHAR *str )
...
@@ -261,16 +265,24 @@ static int find_atom( struct atom_table *table, const WCHAR *str )
}
}
/* get an atom name and refcount*/
/* get an atom name and refcount*/
static
int
get_atom_name
(
struct
atom_table
*
table
,
int
atom
,
WCHAR
*
str
)
static
size_t
get_atom_name
(
struct
atom_table
*
table
,
int
atom
,
WCHAR
*
str
,
size_t
maxsize
,
int
*
count
)
{
{
int
count
=
-
1
;
int
len
=
0
;
struct
atom_entry
*
entry
=
get_atom_entry
(
table
,
atom
);
struct
atom_entry
*
entry
=
get_atom_entry
(
table
,
atom
);
*
count
=
-
1
;
if
(
entry
)
if
(
entry
)
{
{
strcpyW
(
str
,
entry
->
str
);
*
count
=
entry
->
count
;
count
=
entry
->
count
;
len
=
strlenW
(
entry
->
str
)
*
sizeof
(
WCHAR
);
if
(
len
<=
maxsize
)
memcpy
(
str
,
entry
->
str
,
len
);
else
{
set_error
(
STATUS_BUFFER_OVERFLOW
);
len
=
0
;
}
}
return
count
;
}
return
len
;
}
}
/* add a global atom */
/* add a global atom */
...
@@ -279,29 +291,34 @@ DECL_HANDLER(add_atom)
...
@@ -279,29 +291,34 @@ DECL_HANDLER(add_atom)
struct
atom_table
**
table_ptr
=
req
->
local
?
&
current
->
process
->
atom_table
:
&
global_table
;
struct
atom_table
**
table_ptr
=
req
->
local
?
&
current
->
process
->
atom_table
:
&
global_table
;
if
(
!*
table_ptr
)
*
table_ptr
=
create_table
(
0
);
if
(
!*
table_ptr
)
*
table_ptr
=
create_table
(
0
);
if
(
*
table_ptr
)
req
->
atom
=
add_atom
(
*
table_ptr
,
copy_name
(
req
->
name
)
);
if
(
*
table_ptr
)
{
const
WCHAR
*
name
=
copy_name
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
if
(
name
)
req
->
atom
=
add_atom
(
*
table_ptr
,
name
);
}
}
}
/* delete a global atom */
/* delete a global atom */
DECL_HANDLER
(
delete_atom
)
DECL_HANDLER
(
delete_atom
)
{
{
delete_atom
(
req
->
local
?
current
->
process
->
atom_table
:
global_table
,
delete_atom
(
req
->
local
?
current
->
process
->
atom_table
:
global_table
,
req
->
atom
);
req
->
atom
);
}
}
/* find a global atom */
/* find a global atom */
DECL_HANDLER
(
find_atom
)
DECL_HANDLER
(
find_atom
)
{
{
req
->
atom
=
find_atom
(
req
->
local
?
current
->
process
->
atom_table
:
global_table
,
const
WCHAR
*
name
=
copy_name
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
copy_name
(
req
->
name
)
);
if
(
name
)
req
->
atom
=
find_atom
(
req
->
local
?
current
->
process
->
atom_table
:
global_table
,
name
);
}
}
/* get global atom name */
/* get global atom name */
DECL_HANDLER
(
get_atom_name
)
DECL_HANDLER
(
get_atom_name
)
{
{
req
->
name
[
0
]
=
0
;
WCHAR
*
name
=
get_req_data
(
req
);
req
->
count
=
get_atom_name
(
req
->
local
?
current
->
process
->
atom_table
:
global_table
,
size_t
size
=
get_atom_name
(
req
->
local
?
current
->
process
->
atom_table
:
global_table
,
req
->
atom
,
req
->
name
);
req
->
atom
,
name
,
get_req_data_size
(
req
),
&
req
->
count
);
set_req_data_size
(
req
,
size
);
}
}
/* init the process atom table */
/* init the process atom table */
...
...
server/debugger.c
View file @
9c2370bd
...
@@ -254,6 +254,7 @@ static void build_wait_debug_reply( struct thread *thread, struct object *obj, i
...
@@ -254,6 +254,7 @@ static void build_wait_debug_reply( struct thread *thread, struct object *obj, i
{
{
struct
debug_ctx
*
debug_ctx
=
(
struct
debug_ctx
*
)
obj
;
struct
debug_ctx
*
debug_ctx
=
(
struct
debug_ctx
*
)
obj
;
struct
debug_event
*
event
=
find_event_to_send
(
debug_ctx
);
struct
debug_event
*
event
=
find_event_to_send
(
debug_ctx
);
size_t
size
=
get_req_data_size
(
req
);
/* the object that woke us has to be our debug context */
/* the object that woke us has to be our debug context */
assert
(
obj
->
ops
==
&
debug_ctx_ops
);
assert
(
obj
->
ops
==
&
debug_ctx_ops
);
...
@@ -261,14 +262,15 @@ static void build_wait_debug_reply( struct thread *thread, struct object *obj, i
...
@@ -261,14 +262,15 @@ static void build_wait_debug_reply( struct thread *thread, struct object *obj, i
event
->
state
=
EVENT_SENT
;
event
->
state
=
EVENT_SENT
;
event
->
sender
->
debug_event
=
event
;
event
->
sender
->
debug_event
=
event
;
req
->
event
.
code
=
event
->
data
.
code
;
req
->
pid
=
event
->
sender
->
process
;
req
->
pid
=
event
->
sender
->
process
;
req
->
tid
=
event
->
sender
;
req
->
tid
=
event
->
sender
;
memcpy
(
&
req
->
event
,
&
event
->
data
,
sizeof
(
req
->
event
)
);
if
(
size
>
sizeof
(
debug_event_t
))
size
=
sizeof
(
debug_event_t
);
memcpy
(
get_req_data
(
req
),
&
event
->
data
,
size
);
set_req_data_size
(
req
,
size
);
}
}
else
/* timeout or error */
else
/* timeout or error */
{
{
req
->
event
.
code
=
0
;
set_req_data_size
(
req
,
0
)
;
req
->
pid
=
0
;
req
->
pid
=
0
;
req
->
tid
=
0
;
req
->
tid
=
0
;
}
}
...
@@ -536,9 +538,9 @@ DECL_HANDLER(wait_debug_event)
...
@@ -536,9 +538,9 @@ DECL_HANDLER(wait_debug_event)
{
{
if
(
!
wait_for_debug_event
(
req
->
timeout
))
if
(
!
wait_for_debug_event
(
req
->
timeout
))
{
{
req
->
event
.
code
=
0
;
req
->
pid
=
NULL
;
req
->
pid
=
NULL
;
req
->
tid
=
NULL
;
req
->
tid
=
NULL
;
set_req_data_size
(
req
,
0
);
}
}
}
}
...
...
server/event.c
View file @
9c2370bd
...
@@ -114,11 +114,11 @@ static int event_satisfied( struct object *obj, struct thread *thread )
...
@@ -114,11 +114,11 @@ static int event_satisfied( struct object *obj, struct thread *thread )
/* create an event */
/* create an event */
DECL_HANDLER
(
create_event
)
DECL_HANDLER
(
create_event
)
{
{
size_t
len
=
get_req_strlenW
(
req
,
req
->
name
);
struct
event
*
event
;
struct
event
*
event
;
req
->
handle
=
-
1
;
req
->
handle
=
-
1
;
if
((
event
=
create_event
(
req
->
name
,
len
,
req
->
manual_reset
,
req
->
initial_state
)))
if
((
event
=
create_event
(
get_req_data
(
req
),
get_req_data_size
(
req
),
req
->
manual_reset
,
req
->
initial_state
)))
{
{
req
->
handle
=
alloc_handle
(
current
->
process
,
event
,
EVENT_ALL_ACCESS
,
req
->
inherit
);
req
->
handle
=
alloc_handle
(
current
->
process
,
event
,
EVENT_ALL_ACCESS
,
req
->
inherit
);
release_object
(
event
);
release_object
(
event
);
...
@@ -128,8 +128,8 @@ DECL_HANDLER(create_event)
...
@@ -128,8 +128,8 @@ DECL_HANDLER(create_event)
/* open a handle to an event */
/* open a handle to an event */
DECL_HANDLER
(
open_event
)
DECL_HANDLER
(
open_event
)
{
{
size_t
len
=
get_req_strlenW
(
req
,
req
->
name
);
req
->
handle
=
open_object
(
get_req_data
(
req
),
get_req_data_size
(
req
),
req
->
handle
=
open_object
(
req
->
name
,
len
,
&
event_ops
,
req
->
access
,
req
->
inherit
);
&
event_ops
,
req
->
access
,
req
->
inherit
);
}
}
/* do an event operation */
/* do an event operation */
...
...
server/mapping.c
View file @
9c2370bd
...
@@ -281,12 +281,12 @@ int get_page_size(void)
...
@@ -281,12 +281,12 @@ int get_page_size(void)
/* create a file mapping */
/* create a file mapping */
DECL_HANDLER
(
create_mapping
)
DECL_HANDLER
(
create_mapping
)
{
{
size_t
len
=
get_req_strlenW
(
req
,
req
->
name
);
struct
object
*
obj
;
struct
object
*
obj
;
req
->
handle
=
-
1
;
req
->
handle
=
-
1
;
if
((
obj
=
create_mapping
(
req
->
size_high
,
req
->
size_low
,
if
((
obj
=
create_mapping
(
req
->
size_high
,
req
->
size_low
,
req
->
protect
,
req
->
file_handle
,
req
->
name
,
len
)))
req
->
protect
,
req
->
file_handle
,
get_req_data
(
req
),
get_req_data_size
(
req
)
)))
{
{
int
access
=
FILE_MAP_ALL_ACCESS
;
int
access
=
FILE_MAP_ALL_ACCESS
;
if
(
!
(
req
->
protect
&
VPROT_WRITE
))
access
&=
~
FILE_MAP_WRITE
;
if
(
!
(
req
->
protect
&
VPROT_WRITE
))
access
&=
~
FILE_MAP_WRITE
;
...
@@ -298,8 +298,8 @@ DECL_HANDLER(create_mapping)
...
@@ -298,8 +298,8 @@ DECL_HANDLER(create_mapping)
/* open a handle to a mapping */
/* open a handle to a mapping */
DECL_HANDLER
(
open_mapping
)
DECL_HANDLER
(
open_mapping
)
{
{
size_t
len
=
get_req_strlenW
(
req
,
req
->
name
);
req
->
handle
=
open_object
(
get_req_data
(
req
),
get_req_data_size
(
req
),
req
->
handle
=
open_object
(
req
->
name
,
len
,
&
mapping_ops
,
req
->
access
,
req
->
inherit
);
&
mapping_ops
,
req
->
access
,
req
->
inherit
);
}
}
/* get a mapping information */
/* get a mapping information */
...
...
server/mutex.c
View file @
9c2370bd
...
@@ -139,11 +139,10 @@ static void mutex_destroy( struct object *obj )
...
@@ -139,11 +139,10 @@ static void mutex_destroy( struct object *obj )
/* create a mutex */
/* create a mutex */
DECL_HANDLER
(
create_mutex
)
DECL_HANDLER
(
create_mutex
)
{
{
size_t
len
=
get_req_strlenW
(
req
,
req
->
name
);
struct
mutex
*
mutex
;
struct
mutex
*
mutex
;
req
->
handle
=
-
1
;
req
->
handle
=
-
1
;
if
((
mutex
=
create_mutex
(
req
->
name
,
len
,
req
->
owned
)))
if
((
mutex
=
create_mutex
(
get_req_data
(
req
),
get_req_data_size
(
req
)
,
req
->
owned
)))
{
{
req
->
handle
=
alloc_handle
(
current
->
process
,
mutex
,
MUTEX_ALL_ACCESS
,
req
->
inherit
);
req
->
handle
=
alloc_handle
(
current
->
process
,
mutex
,
MUTEX_ALL_ACCESS
,
req
->
inherit
);
release_object
(
mutex
);
release_object
(
mutex
);
...
@@ -153,8 +152,8 @@ DECL_HANDLER(create_mutex)
...
@@ -153,8 +152,8 @@ DECL_HANDLER(create_mutex)
/* open a handle to a mutex */
/* open a handle to a mutex */
DECL_HANDLER
(
open_mutex
)
DECL_HANDLER
(
open_mutex
)
{
{
size_t
len
=
get_req_strlenW
(
req
,
req
->
name
);
req
->
handle
=
open_object
(
get_req_data
(
req
),
get_req_data_size
(
req
),
req
->
handle
=
open_object
(
req
->
name
,
len
,
&
mutex_ops
,
req
->
access
,
req
->
inherit
);
&
mutex_ops
,
req
->
access
,
req
->
inherit
);
}
}
/* release a mutex */
/* release a mutex */
...
...
server/object.c
View file @
9c2370bd
...
@@ -70,6 +70,7 @@ void *memdup( const void *data, size_t len )
...
@@ -70,6 +70,7 @@ void *memdup( const void *data, size_t len )
static
int
get_name_hash
(
const
WCHAR
*
name
,
size_t
len
)
static
int
get_name_hash
(
const
WCHAR
*
name
,
size_t
len
)
{
{
WCHAR
hash
=
0
;
WCHAR
hash
=
0
;
len
/=
sizeof
(
WCHAR
);
while
(
len
--
)
hash
^=
*
name
++
;
while
(
len
--
)
hash
^=
*
name
++
;
return
hash
%
NAME_HASH_SIZE
;
return
hash
%
NAME_HASH_SIZE
;
}
}
...
@@ -79,11 +80,10 @@ static struct object_name *alloc_name( const WCHAR *name, size_t len )
...
@@ -79,11 +80,10 @@ static struct object_name *alloc_name( const WCHAR *name, size_t len )
{
{
struct
object_name
*
ptr
;
struct
object_name
*
ptr
;
if
((
ptr
=
mem_alloc
(
sizeof
(
*
ptr
)
+
len
*
sizeof
(
ptr
->
name
[
0
]
)
)))
if
((
ptr
=
mem_alloc
(
sizeof
(
*
ptr
)
+
len
-
sizeof
(
ptr
->
name
)
)))
{
{
ptr
->
len
=
len
;
ptr
->
len
=
len
;
memcpy
(
ptr
->
name
,
name
,
len
*
sizeof
(
ptr
->
name
[
0
])
);
memcpy
(
ptr
->
name
,
name
,
len
);
ptr
->
name
[
len
]
=
0
;
}
}
return
ptr
;
return
ptr
;
}
}
...
@@ -186,7 +186,7 @@ void dump_object_name( struct object *obj )
...
@@ -186,7 +186,7 @@ void dump_object_name( struct object *obj )
else
else
{
{
fprintf
(
stderr
,
"name=L
\"
"
);
fprintf
(
stderr
,
"name=L
\"
"
);
dump_strW
(
obj
->
name
->
name
,
strlenW
(
obj
->
name
->
name
),
stderr
,
"
\"\"
"
);
dump_strW
(
obj
->
name
->
name
,
obj
->
name
->
len
/
sizeof
(
WCHAR
),
stderr
,
"
\"\"
"
);
fputc
(
'\"'
,
stderr
);
fputc
(
'\"'
,
stderr
);
}
}
}
}
...
@@ -228,11 +228,12 @@ void release_object( void *ptr )
...
@@ -228,11 +228,12 @@ void release_object( void *ptr )
struct
object
*
find_object
(
const
WCHAR
*
name
,
size_t
len
)
struct
object
*
find_object
(
const
WCHAR
*
name
,
size_t
len
)
{
{
struct
object_name
*
ptr
;
struct
object_name
*
ptr
;
if
(
!
name
||
!
len
)
return
NULL
;
if
(
!
name
||
!
len
)
return
NULL
;
for
(
ptr
=
names
[
get_name_hash
(
name
,
len
)
];
ptr
;
ptr
=
ptr
->
next
)
for
(
ptr
=
names
[
get_name_hash
(
name
,
len
)
];
ptr
;
ptr
=
ptr
->
next
)
{
{
if
(
ptr
->
len
!=
len
)
continue
;
if
(
ptr
->
len
!=
len
)
continue
;
if
(
!
memcmp
(
ptr
->
name
,
name
,
len
*
sizeof
(
WCHAR
)
))
return
grab_object
(
ptr
->
obj
);
if
(
!
memcmp
(
ptr
->
name
,
name
,
len
))
return
grab_object
(
ptr
->
obj
);
}
}
return
NULL
;
return
NULL
;
}
}
...
...
server/request.h
View file @
9c2370bd
...
@@ -54,6 +54,18 @@ inline static void *get_req_data( const void *req )
...
@@ -54,6 +54,18 @@ inline static void *get_req_data( const void *req )
return
((
union
generic_request
*
)
req
+
1
);
return
((
union
generic_request
*
)
req
+
1
);
}
}
/* get the request vararg size */
inline
static
size_t
get_req_data_size
(
const
void
*
req
)
{
return
((
struct
request_header
*
)
req
)
->
var_size
;
}
/* set the request vararg size */
inline
static
void
set_req_data_size
(
const
void
*
req
,
size_t
size
)
{
((
struct
request_header
*
)
req
)
->
var_size
=
size
;
}
#define REQUEST_END(req) ((char *)(req) + MAX_REQUEST_LENGTH - sizeof(struct server_buffer_info))
#define REQUEST_END(req) ((char *)(req) + MAX_REQUEST_LENGTH - sizeof(struct server_buffer_info))
...
...
server/semaphore.c
View file @
9c2370bd
...
@@ -122,11 +122,11 @@ static int semaphore_satisfied( struct object *obj, struct thread *thread )
...
@@ -122,11 +122,11 @@ static int semaphore_satisfied( struct object *obj, struct thread *thread )
/* create a semaphore */
/* create a semaphore */
DECL_HANDLER
(
create_semaphore
)
DECL_HANDLER
(
create_semaphore
)
{
{
size_t
len
=
get_req_strlenW
(
req
,
req
->
name
);
struct
semaphore
*
sem
;
struct
semaphore
*
sem
;
req
->
handle
=
-
1
;
req
->
handle
=
-
1
;
if
((
sem
=
create_semaphore
(
req
->
name
,
len
,
req
->
initial
,
req
->
max
)))
if
((
sem
=
create_semaphore
(
get_req_data
(
req
),
get_req_data_size
(
req
),
req
->
initial
,
req
->
max
)))
{
{
req
->
handle
=
alloc_handle
(
current
->
process
,
sem
,
SEMAPHORE_ALL_ACCESS
,
req
->
inherit
);
req
->
handle
=
alloc_handle
(
current
->
process
,
sem
,
SEMAPHORE_ALL_ACCESS
,
req
->
inherit
);
release_object
(
sem
);
release_object
(
sem
);
...
@@ -136,8 +136,8 @@ DECL_HANDLER(create_semaphore)
...
@@ -136,8 +136,8 @@ DECL_HANDLER(create_semaphore)
/* open a handle to a semaphore */
/* open a handle to a semaphore */
DECL_HANDLER
(
open_semaphore
)
DECL_HANDLER
(
open_semaphore
)
{
{
size_t
len
=
get_req_strlenW
(
req
,
req
->
name
);
req
->
handle
=
open_object
(
get_req_data
(
req
),
get_req_data_size
(
req
),
req
->
handle
=
open_object
(
req
->
name
,
len
,
&
semaphore_ops
,
req
->
access
,
req
->
inherit
);
&
semaphore_ops
,
req
->
access
,
req
->
inherit
);
}
}
/* release a semaphore */
/* release a semaphore */
...
...
server/thread.c
View file @
9c2370bd
...
@@ -787,7 +787,8 @@ DECL_HANDLER(resume_thread)
...
@@ -787,7 +787,8 @@ DECL_HANDLER(resume_thread)
/* select on a handle list */
/* select on a handle list */
DECL_HANDLER
(
select
)
DECL_HANDLER
(
select
)
{
{
if
(
!
select_on
(
req
->
count
,
req
->
handles
,
req
->
flags
,
req
->
timeout
))
int
count
=
get_req_data_size
(
req
)
/
sizeof
(
int
);
if
(
!
select_on
(
count
,
get_req_data
(
req
),
req
->
flags
,
req
->
timeout
))
req
->
signaled
=
-
1
;
req
->
signaled
=
-
1
;
}
}
...
@@ -806,21 +807,31 @@ DECL_HANDLER(queue_apc)
...
@@ -806,21 +807,31 @@ DECL_HANDLER(queue_apc)
DECL_HANDLER
(
get_apc
)
DECL_HANDLER
(
get_apc
)
{
{
struct
thread_apc
*
apc
;
struct
thread_apc
*
apc
;
size_t
size
;
if
((
apc
=
thread_dequeue_apc
(
current
))
)
for
(;;
)
{
{
req
->
func
=
apc
->
func
;
if
(
!
(
apc
=
thread_dequeue_apc
(
current
)))
req
->
type
=
apc
->
type
;
req
->
nb_args
=
apc
->
nb_args
;
memcpy
(
req
->
args
,
apc
->
args
,
apc
->
nb_args
*
sizeof
(
req
->
args
[
0
])
);
free
(
apc
);
}
else
{
{
/* no more APCs */
req
->
func
=
NULL
;
req
->
func
=
NULL
;
req
->
type
=
APC_NONE
;
req
->
type
=
APC_NONE
;
req
->
nb_args
=
0
;
set_req_data_size
(
req
,
0
);
return
;
}
}
/* Optimization: ignore APCs that have a NULL func; they are only used
* to wake up a thread, but since we got here the thread woke up already.
*/
if
(
apc
->
func
)
break
;
free
(
apc
);
}
size
=
apc
->
nb_args
*
sizeof
(
apc
->
args
[
0
]);
if
(
size
>
get_req_data_size
(
req
))
size
=
get_req_data_size
(
req
);
req
->
func
=
apc
->
func
;
req
->
type
=
apc
->
type
;
memcpy
(
get_req_data
(
req
),
apc
->
args
,
size
);
set_req_data_size
(
req
,
size
);
free
(
apc
);
}
}
/* fetch a selector entry for a thread */
/* fetch a selector entry for a thread */
...
...
server/timer.c
View file @
9c2370bd
...
@@ -173,11 +173,10 @@ static void timer_destroy( struct object *obj )
...
@@ -173,11 +173,10 @@ static void timer_destroy( struct object *obj )
/* create a timer */
/* create a timer */
DECL_HANDLER
(
create_timer
)
DECL_HANDLER
(
create_timer
)
{
{
size_t
len
=
get_req_strlenW
(
req
,
req
->
name
);
struct
timer
*
timer
;
struct
timer
*
timer
;
req
->
handle
=
-
1
;
req
->
handle
=
-
1
;
if
((
timer
=
create_timer
(
req
->
name
,
len
,
req
->
manual
)))
if
((
timer
=
create_timer
(
get_req_data
(
req
),
get_req_data_size
(
req
)
,
req
->
manual
)))
{
{
req
->
handle
=
alloc_handle
(
current
->
process
,
timer
,
TIMER_ALL_ACCESS
,
req
->
inherit
);
req
->
handle
=
alloc_handle
(
current
->
process
,
timer
,
TIMER_ALL_ACCESS
,
req
->
inherit
);
release_object
(
timer
);
release_object
(
timer
);
...
@@ -187,8 +186,8 @@ DECL_HANDLER(create_timer)
...
@@ -187,8 +186,8 @@ DECL_HANDLER(create_timer)
/* open a handle to a timer */
/* open a handle to a timer */
DECL_HANDLER
(
open_timer
)
DECL_HANDLER
(
open_timer
)
{
{
size_t
len
=
get_req_strlenW
(
req
,
req
->
name
);
req
->
handle
=
open_object
(
get_req_data
(
req
),
get_req_data_size
(
req
),
req
->
handle
=
open_object
(
req
->
name
,
len
,
&
timer_ops
,
req
->
access
,
req
->
inherit
);
&
timer_ops
,
req
->
access
,
req
->
inherit
);
}
}
/* set a waitable timer */
/* set a waitable timer */
...
...
server/trace.c
View file @
9c2370bd
...
@@ -100,13 +100,50 @@ static void dump_exc_record( const void *req, const EXCEPTION_RECORD *rec )
...
@@ -100,13 +100,50 @@ static void dump_exc_record( const void *req, const EXCEPTION_RECORD *rec )
fputc
(
'}'
,
stderr
);
fputc
(
'}'
,
stderr
);
}
}
static
void
dump_
debug_event_t
(
const
void
*
req
,
const
debug_event_t
*
event
)
static
void
dump_
varargs_ints
(
const
void
*
ptr
,
size_t
len
)
{
{
const
int
*
data
=
ptr
;
len
/=
sizeof
(
*
data
);
fputc
(
'{'
,
stderr
);
while
(
len
>
0
)
{
fprintf
(
stderr
,
"%d"
,
*
data
++
);
if
(
--
len
)
fputc
(
','
,
stderr
);
}
fputc
(
'}'
,
stderr
);
}
static
void
dump_varargs_ptrs
(
const
void
*
ptr
,
size_t
len
)
{
void
*
const
*
data
=
ptr
;
len
/=
sizeof
(
*
data
);
fputc
(
'{'
,
stderr
);
while
(
len
>
0
)
{
fprintf
(
stderr
,
"%p"
,
*
data
++
);
if
(
--
len
)
fputc
(
','
,
stderr
);
}
fputc
(
'}'
,
stderr
);
}
static
void
dump_varargs_unicode_str
(
const
void
*
ptr
,
size_t
len
)
{
fprintf
(
stderr
,
"L
\"
"
);
dump_strW
(
ptr
,
len
/
sizeof
(
WCHAR
),
stderr
,
"
\"\"
"
);
fputc
(
'\"'
,
stderr
);
}
static
void
dump_varargs_debug_event
(
const
void
*
ptr
,
size_t
len
)
{
const
debug_event_t
*
event
=
ptr
;
switch
(
event
->
code
)
switch
(
event
->
code
)
{
{
case
EXCEPTION_DEBUG_EVENT
:
case
EXCEPTION_DEBUG_EVENT
:
fprintf
(
stderr
,
"{exception,"
);
fprintf
(
stderr
,
"{exception,"
);
dump_exc_record
(
req
,
&
event
->
info
.
exception
.
record
);
dump_exc_record
(
ptr
,
&
event
->
info
.
exception
.
record
);
fprintf
(
stderr
,
",first=%d}"
,
event
->
info
.
exception
.
first
);
fprintf
(
stderr
,
",first=%d}"
,
event
->
info
.
exception
.
first
);
break
;
break
;
case
CREATE_THREAD_DEBUG_EVENT
:
case
CREATE_THREAD_DEBUG_EVENT
:
...
@@ -156,23 +193,8 @@ static void dump_debug_event_t( const void *req, const debug_event_t *event )
...
@@ -156,23 +193,8 @@ static void dump_debug_event_t( const void *req, const debug_event_t *event )
}
}
}
}
/* dumping for functions for requests that have a variable part */
/* dumping for functions for requests that have a variable part */
static
void
dump_varargs_select_request
(
const
struct
select_request
*
req
)
{
int
count
=
min
(
req
->
count
,
get_req_size
(
req
,
req
->
handles
,
sizeof
(
int
)
));
dump_ints
(
req
->
handles
,
count
);
}
static
void
dump_varargs_get_apc_reply
(
const
struct
get_apc_request
*
req
)
{
int
i
;
for
(
i
=
0
;
i
<
req
->
nb_args
;
i
++
)
fprintf
(
stderr
,
"%c%p"
,
i
?
','
:
'{'
,
req
->
args
[
i
]
);
fprintf
(
stderr
,
"}"
);
}
static
void
dump_varargs_get_socket_event_reply
(
const
struct
get_socket_event_request
*
req
)
static
void
dump_varargs_get_socket_event_reply
(
const
struct
get_socket_event_request
*
req
)
{
{
dump_ints
(
req
->
errors
,
FD_MAX_EVENTS
);
dump_ints
(
req
->
errors
,
FD_MAX_EVENTS
);
...
@@ -430,9 +452,8 @@ static void dump_get_apc_reply( const struct get_apc_request *req )
...
@@ -430,9 +452,8 @@ static void dump_get_apc_reply( const struct get_apc_request *req )
{
{
fprintf
(
stderr
,
" func=%p,"
,
req
->
func
);
fprintf
(
stderr
,
" func=%p,"
,
req
->
func
);
fprintf
(
stderr
,
" type=%d,"
,
req
->
type
);
fprintf
(
stderr
,
" type=%d,"
,
req
->
type
);
fprintf
(
stderr
,
" nb_args=%d,"
,
req
->
nb_args
);
fprintf
(
stderr
,
" args="
);
fprintf
(
stderr
,
" args="
);
dump_varargs_
get_apc_reply
(
req
);
dump_varargs_
ptrs
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_close_handle_request
(
const
struct
close_handle_request
*
req
)
static
void
dump_close_handle_request
(
const
struct
close_handle_request
*
req
)
...
@@ -486,11 +507,10 @@ static void dump_open_process_reply( const struct open_process_request *req )
...
@@ -486,11 +507,10 @@ static void dump_open_process_reply( const struct open_process_request *req )
static
void
dump_select_request
(
const
struct
select_request
*
req
)
static
void
dump_select_request
(
const
struct
select_request
*
req
)
{
{
fprintf
(
stderr
,
" count=%d,"
,
req
->
count
);
fprintf
(
stderr
,
" flags=%d,"
,
req
->
flags
);
fprintf
(
stderr
,
" flags=%d,"
,
req
->
flags
);
fprintf
(
stderr
,
" timeout=%d,"
,
req
->
timeout
);
fprintf
(
stderr
,
" timeout=%d,"
,
req
->
timeout
);
fprintf
(
stderr
,
" handles="
);
fprintf
(
stderr
,
" handles="
);
dump_varargs_
select_request
(
req
);
dump_varargs_
ints
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_select_reply
(
const
struct
select_request
*
req
)
static
void
dump_select_reply
(
const
struct
select_request
*
req
)
...
@@ -504,7 +524,7 @@ static void dump_create_event_request( const struct create_event_request *req )
...
@@ -504,7 +524,7 @@ static void dump_create_event_request( const struct create_event_request *req )
fprintf
(
stderr
,
" initial_state=%d,"
,
req
->
initial_state
);
fprintf
(
stderr
,
" initial_state=%d,"
,
req
->
initial_state
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_create_event_reply
(
const
struct
create_event_request
*
req
)
static
void
dump_create_event_reply
(
const
struct
create_event_request
*
req
)
...
@@ -523,7 +543,7 @@ static void dump_open_event_request( const struct open_event_request *req )
...
@@ -523,7 +543,7 @@ static void dump_open_event_request( const struct open_event_request *req )
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_open_event_reply
(
const
struct
open_event_request
*
req
)
static
void
dump_open_event_reply
(
const
struct
open_event_request
*
req
)
...
@@ -536,7 +556,7 @@ static void dump_create_mutex_request( const struct create_mutex_request *req )
...
@@ -536,7 +556,7 @@ static void dump_create_mutex_request( const struct create_mutex_request *req )
fprintf
(
stderr
,
" owned=%d,"
,
req
->
owned
);
fprintf
(
stderr
,
" owned=%d,"
,
req
->
owned
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_create_mutex_reply
(
const
struct
create_mutex_request
*
req
)
static
void
dump_create_mutex_reply
(
const
struct
create_mutex_request
*
req
)
...
@@ -554,7 +574,7 @@ static void dump_open_mutex_request( const struct open_mutex_request *req )
...
@@ -554,7 +574,7 @@ static void dump_open_mutex_request( const struct open_mutex_request *req )
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_open_mutex_reply
(
const
struct
open_mutex_request
*
req
)
static
void
dump_open_mutex_reply
(
const
struct
open_mutex_request
*
req
)
...
@@ -568,7 +588,7 @@ static void dump_create_semaphore_request( const struct create_semaphore_request
...
@@ -568,7 +588,7 @@ static void dump_create_semaphore_request( const struct create_semaphore_request
fprintf
(
stderr
,
" max=%08x,"
,
req
->
max
);
fprintf
(
stderr
,
" max=%08x,"
,
req
->
max
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_create_semaphore_reply
(
const
struct
create_semaphore_request
*
req
)
static
void
dump_create_semaphore_reply
(
const
struct
create_semaphore_request
*
req
)
...
@@ -592,7 +612,7 @@ static void dump_open_semaphore_request( const struct open_semaphore_request *re
...
@@ -592,7 +612,7 @@ static void dump_open_semaphore_request( const struct open_semaphore_request *re
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_open_semaphore_reply
(
const
struct
open_semaphore_request
*
req
)
static
void
dump_open_semaphore_reply
(
const
struct
open_semaphore_request
*
req
)
...
@@ -890,7 +910,7 @@ static void dump_create_mapping_request( const struct create_mapping_request *re
...
@@ -890,7 +910,7 @@ static void dump_create_mapping_request( const struct create_mapping_request *re
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" file_handle=%d,"
,
req
->
file_handle
);
fprintf
(
stderr
,
" file_handle=%d,"
,
req
->
file_handle
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_create_mapping_reply
(
const
struct
create_mapping_request
*
req
)
static
void
dump_create_mapping_reply
(
const
struct
create_mapping_request
*
req
)
...
@@ -903,7 +923,7 @@ static void dump_open_mapping_request( const struct open_mapping_request *req )
...
@@ -903,7 +923,7 @@ static void dump_open_mapping_request( const struct open_mapping_request *req )
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_open_mapping_reply
(
const
struct
open_mapping_request
*
req
)
static
void
dump_open_mapping_reply
(
const
struct
open_mapping_request
*
req
)
...
@@ -1002,7 +1022,7 @@ static void dump_wait_debug_event_reply( const struct wait_debug_event_request *
...
@@ -1002,7 +1022,7 @@ static void dump_wait_debug_event_reply( const struct wait_debug_event_request *
fprintf
(
stderr
,
" pid=%p,"
,
req
->
pid
);
fprintf
(
stderr
,
" pid=%p,"
,
req
->
pid
);
fprintf
(
stderr
,
" tid=%p,"
,
req
->
tid
);
fprintf
(
stderr
,
" tid=%p,"
,
req
->
tid
);
fprintf
(
stderr
,
" event="
);
fprintf
(
stderr
,
" event="
);
dump_
debug_event_t
(
req
,
&
req
->
event
);
dump_
varargs_debug_event
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_exception_event_request
(
const
struct
exception_event_request
*
req
)
static
void
dump_exception_event_request
(
const
struct
exception_event_request
*
req
)
...
@@ -1232,7 +1252,7 @@ static void dump_create_timer_request( const struct create_timer_request *req )
...
@@ -1232,7 +1252,7 @@ static void dump_create_timer_request( const struct create_timer_request *req )
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" manual=%d,"
,
req
->
manual
);
fprintf
(
stderr
,
" manual=%d,"
,
req
->
manual
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_create_timer_reply
(
const
struct
create_timer_request
*
req
)
static
void
dump_create_timer_reply
(
const
struct
create_timer_request
*
req
)
...
@@ -1245,7 +1265,7 @@ static void dump_open_timer_request( const struct open_timer_request *req )
...
@@ -1245,7 +1265,7 @@ static void dump_open_timer_request( const struct open_timer_request *req )
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" access=%08x,"
,
req
->
access
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" inherit=%d,"
,
req
->
inherit
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_open_timer_reply
(
const
struct
open_timer_request
*
req
)
static
void
dump_open_timer_reply
(
const
struct
open_timer_request
*
req
)
...
@@ -1305,7 +1325,7 @@ static void dump_add_atom_request( const struct add_atom_request *req )
...
@@ -1305,7 +1325,7 @@ static void dump_add_atom_request( const struct add_atom_request *req )
{
{
fprintf
(
stderr
,
" local=%d,"
,
req
->
local
);
fprintf
(
stderr
,
" local=%d,"
,
req
->
local
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_add_atom_reply
(
const
struct
add_atom_request
*
req
)
static
void
dump_add_atom_reply
(
const
struct
add_atom_request
*
req
)
...
@@ -1323,7 +1343,7 @@ static void dump_find_atom_request( const struct find_atom_request *req )
...
@@ -1323,7 +1343,7 @@ static void dump_find_atom_request( const struct find_atom_request *req )
{
{
fprintf
(
stderr
,
" local=%d,"
,
req
->
local
);
fprintf
(
stderr
,
" local=%d,"
,
req
->
local
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_find_atom_reply
(
const
struct
find_atom_request
*
req
)
static
void
dump_find_atom_reply
(
const
struct
find_atom_request
*
req
)
...
@@ -1341,7 +1361,7 @@ static void dump_get_atom_name_reply( const struct get_atom_name_request *req )
...
@@ -1341,7 +1361,7 @@ static void dump_get_atom_name_reply( const struct get_atom_name_request *req )
{
{
fprintf
(
stderr
,
" count=%d,"
,
req
->
count
);
fprintf
(
stderr
,
" count=%d,"
,
req
->
count
);
fprintf
(
stderr
,
" name="
);
fprintf
(
stderr
,
" name="
);
dump_
unicode_string
(
req
,
req
->
name
);
dump_
varargs_unicode_str
(
get_req_data
(
req
),
get_req_data_size
(
req
)
);
}
}
static
void
dump_init_atom_table_request
(
const
struct
init_atom_table_request
*
req
)
static
void
dump_init_atom_table_request
(
const
struct
init_atom_table_request
*
req
)
...
...
tools/make_requests
View file @
9c2370bd
...
@@ -121,7 +121,7 @@ sub DO_REQUEST
...
@@ -121,7 +121,7 @@ sub DO_REQUEST
{
{
$dir
=
$1
;
$dir
=
$1
;
$var
=
$2
;
$var
=
$2
;
$type
=
"&"
.
$3
;
$type
=
"&
dump_varargs_
"
.
$3
;
}
}
elsif
(
/^\s*(IN|OUT)\s*(\w+\**(\s+\w+\**)*)\s+(\w+)(\[[1]\])?;/
)
elsif
(
/^\s*(IN|OUT)\s*(\w+\**(\s+\w+\**)*)\s+(\w+)(\[[1]\])?;/
)
{
{
...
@@ -178,10 +178,19 @@ sub DO_DUMP_FUNC
...
@@ -178,10 +178,19 @@ sub DO_DUMP_FUNC
}
}
else
# must be some varargs format
else
# must be some varargs format
{
{
if
(
$type
=~
/^&(.*)/
)
{
my
$func
=
$1
;
push
@trace_lines
,
" fprintf( stderr, \" $var=\" );\n"
;
push
@trace_lines
,
" $func( get_req_data(req), get_req_data_size(req) );\n"
;
}
else
{
push
@trace_lines
,
" fprintf( stderr, \" $var=\" );\n"
;
push
@trace_lines
,
" fprintf( stderr, \" $var=\" );\n"
;
push
@trace_lines
,
" dump_varargs_${name}_${req}( req );\n"
;
push
@trace_lines
,
" dump_varargs_${name}_${req}( req );\n"
;
}
}
}
}
}
push
@trace_lines
,
"}\n\n"
;
push
@trace_lines
,
"}\n\n"
;
}
}
...
...
win32/console.c
View file @
9c2370bd
...
@@ -647,14 +647,15 @@ UINT WINAPI GetConsoleOutputCP(VOID)
...
@@ -647,14 +647,15 @@ UINT WINAPI GetConsoleOutputCP(VOID)
*/
*/
BOOL
WINAPI
GetConsoleMode
(
HANDLE
hcon
,
LPDWORD
mode
)
BOOL
WINAPI
GetConsoleMode
(
HANDLE
hcon
,
LPDWORD
mode
)
{
{
BOOL
ret
=
FALSE
;
BOOL
ret
;
struct
get_console_mode_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
req
->
handle
=
hcon
;
if
(
!
server_call
(
REQ_GET_CONSOLE_MODE
))
{
{
if
(
mode
)
*
mode
=
req
->
mode
;
struct
get_console_mode_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
ret
=
TRUE
;
req
->
handle
=
hcon
;
ret
=
!
server_call
(
REQ_GET_CONSOLE_MODE
);
if
(
ret
&&
mode
)
*
mode
=
req
->
mode
;
}
}
SERVER_END_REQ
;
return
ret
;
return
ret
;
}
}
...
@@ -672,10 +673,16 @@ BOOL WINAPI GetConsoleMode(HANDLE hcon,LPDWORD mode)
...
@@ -672,10 +673,16 @@ BOOL WINAPI GetConsoleMode(HANDLE hcon,LPDWORD mode)
*/
*/
BOOL
WINAPI
SetConsoleMode
(
HANDLE
hcon
,
DWORD
mode
)
BOOL
WINAPI
SetConsoleMode
(
HANDLE
hcon
,
DWORD
mode
)
{
{
struct
set_console_mode_request
*
req
=
get_req_buffer
();
BOOL
ret
;
SERVER_START_REQ
{
struct
set_console_mode_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hcon
;
req
->
handle
=
hcon
;
req
->
mode
=
mode
;
req
->
mode
=
mode
;
return
!
server_call
(
REQ_SET_CONSOLE_MODE
);
ret
=
!
server_call
(
REQ_SET_CONSOLE_MODE
);
}
SERVER_END_REQ
;
return
ret
;
}
}
...
...
win32/device.c
View file @
9c2370bd
...
@@ -330,18 +330,22 @@ HANDLE DEVICE_Open( LPCSTR filename, DWORD access,
...
@@ -330,18 +330,22 @@ HANDLE DEVICE_Open( LPCSTR filename, DWORD access,
static
const
struct
VxDInfo
*
DEVICE_GetInfo
(
HANDLE
handle
)
static
const
struct
VxDInfo
*
DEVICE_GetInfo
(
HANDLE
handle
)
{
{
struct
get_file_info_request
*
req
=
get_req_buffer
();
const
struct
VxDInfo
*
info
=
NULL
;
SERVER_START_REQ
{
struct
get_file_info_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
handle
;
req
->
handle
=
handle
;
if
(
!
server_call
(
REQ_GET_FILE_INFO
)
&&
if
(
!
server_call
(
REQ_GET_FILE_INFO
)
&&
(
req
->
type
==
FILE_TYPE_UNKNOWN
)
&&
(
req
->
type
==
FILE_TYPE_UNKNOWN
)
&&
(
req
->
attr
&
0x10000
))
(
req
->
attr
&
0x10000
))
{
{
const
struct
VxDInfo
*
info
;
for
(
info
=
VxDList
;
info
->
name
;
info
++
)
for
(
info
=
VxDList
;
info
->
name
;
info
++
)
if
(
info
->
id
==
LOWORD
(
req
->
attr
))
return
info
;
if
(
info
->
id
==
LOWORD
(
req
->
attr
))
break
;
}
}
}
return
NULL
;
SERVER_END_REQ
;
return
info
;
}
}
/****************************************************************************
/****************************************************************************
...
...
windows/queue.c
View file @
9c2370bd
...
@@ -441,9 +441,9 @@ void QUEUE_SetExitingQueue( HQUEUE16 hQueue )
...
@@ -441,9 +441,9 @@ void QUEUE_SetExitingQueue( HQUEUE16 hQueue )
static
HQUEUE16
QUEUE_CreateMsgQueue
(
BOOL16
bCreatePerQData
)
static
HQUEUE16
QUEUE_CreateMsgQueue
(
BOOL16
bCreatePerQData
)
{
{
HQUEUE16
hQueue
;
HQUEUE16
hQueue
;
HANDLE
handle
=
-
1
;
MESSAGEQUEUE
*
msgQueue
;
MESSAGEQUEUE
*
msgQueue
;
TDB
*
pTask
=
(
TDB
*
)
GlobalLock16
(
GetCurrentTask
()
);
TDB
*
pTask
=
(
TDB
*
)
GlobalLock16
(
GetCurrentTask
()
);
struct
get_msg_queue_request
*
req
=
get_req_buffer
();
TRACE_
(
msg
)(
"(): Creating message queue...
\n
"
);
TRACE_
(
msg
)(
"(): Creating message queue...
\n
"
);
...
@@ -455,13 +455,19 @@ static HQUEUE16 QUEUE_CreateMsgQueue( BOOL16 bCreatePerQData )
...
@@ -455,13 +455,19 @@ static HQUEUE16 QUEUE_CreateMsgQueue( BOOL16 bCreatePerQData )
if
(
!
msgQueue
)
if
(
!
msgQueue
)
return
0
;
return
0
;
if
(
server_call
(
REQ_GET_MSG_QUEUE
))
SERVER_START_REQ
{
struct
get_msg_queue_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
if
(
!
server_call
(
REQ_GET_MSG_QUEUE
))
handle
=
req
->
handle
;
}
SERVER_END_REQ
;
if
(
handle
==
-
1
)
{
{
ERR_
(
msg
)(
"Cannot get thread queue"
);
ERR_
(
msg
)(
"Cannot get thread queue"
);
GlobalFree16
(
hQueue
);
GlobalFree16
(
hQueue
);
return
0
;
return
0
;
}
}
msgQueue
->
server_queue
=
req
->
handle
;
msgQueue
->
server_queue
=
handle
;
msgQueue
->
server_queue
=
ConvertToGlobalHandle
(
msgQueue
->
server_queue
);
msgQueue
->
server_queue
=
ConvertToGlobalHandle
(
msgQueue
->
server_queue
);
msgQueue
->
self
=
hQueue
;
msgQueue
->
self
=
hQueue
;
...
@@ -639,11 +645,15 @@ void QUEUE_SetWakeBit( MESSAGEQUEUE *queue, WORD bit )
...
@@ -639,11 +645,15 @@ void QUEUE_SetWakeBit( MESSAGEQUEUE *queue, WORD bit )
}
}
else
else
{
{
struct
wake_queue_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
wake_queue_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
queue
->
server_queue
;
req
->
handle
=
queue
->
server_queue
;
req
->
bits
=
bit
;
req
->
bits
=
bit
;
server_call
(
REQ_WAKE_QUEUE
);
server_call
(
REQ_WAKE_QUEUE
);
}
}
SERVER_END_REQ
;
}
}
}
}
}
...
@@ -1500,13 +1510,18 @@ BOOL16 WINAPI GetInputState16(void)
...
@@ -1500,13 +1510,18 @@ BOOL16 WINAPI GetInputState16(void)
DWORD
WINAPI
WaitForInputIdle
(
HANDLE
hProcess
,
DWORD
dwTimeOut
)
DWORD
WINAPI
WaitForInputIdle
(
HANDLE
hProcess
,
DWORD
dwTimeOut
)
{
{
DWORD
cur_time
,
ret
;
DWORD
cur_time
,
ret
;
HANDLE
idle_event
;
HANDLE
idle_event
=
-
1
;
struct
wait_input_idle_request
*
req
=
get_req_buffer
();
SERVER_START_REQ
{
struct
wait_input_idle_request
*
req
=
server_alloc_req
(
sizeof
(
*
req
),
0
);
req
->
handle
=
hProcess
;
req
->
handle
=
hProcess
;
req
->
timeout
=
dwTimeOut
;
req
->
timeout
=
dwTimeOut
;
if
(
server_call
(
REQ_WAIT_INPUT_IDLE
))
return
0xffffffff
;
if
(
!
(
ret
=
server_call
(
REQ_WAIT_INPUT_IDLE
)))
idle_event
=
req
->
event
;
if
((
idle_event
=
req
->
event
)
==
-
1
)
return
0
;
/* no event to wait on */
}
SERVER_END_REQ
;
if
(
ret
)
return
0xffffffff
;
/* error */
if
(
idle_event
==
-
1
)
return
0
;
/* no event to wait on */
cur_time
=
GetTickCount
();
cur_time
=
GetTickCount
();
...
...
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