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
0a241b0f
Commit
0a241b0f
authored
Mar 03, 2015
by
Alexandre Julliard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ntdll: Allow specifying the user APC argument in the system APC callback.
parent
8843bc14
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
45 additions
and
18 deletions
+45
-18
file.c
dlls/ntdll/file.c
+21
-5
server.c
dlls/ntdll/server.c
+4
-4
socket.c
dlls/ws2_32/socket.c
+19
-8
protocol.def
server/protocol.def
+1
-1
No files found.
dlls/ntdll/file.c
View file @
0a241b0f
...
...
@@ -448,7 +448,8 @@ NTSTATUS FILE_GetNtStatus(void)
/***********************************************************************
* FILE_AsyncReadService (INTERNAL)
*/
static
NTSTATUS
FILE_AsyncReadService
(
void
*
user
,
PIO_STATUS_BLOCK
iosb
,
NTSTATUS
status
,
void
**
apc
)
static
NTSTATUS
FILE_AsyncReadService
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
,
void
**
arg
)
{
struct
async_fileio_read
*
fileio
=
user
;
int
fd
,
needs_close
,
result
;
...
...
@@ -501,7 +502,10 @@ static NTSTATUS FILE_AsyncReadService(void *user, PIO_STATUS_BLOCK iosb, NTSTATU
iosb
->
u
.
Status
=
status
;
iosb
->
Information
=
fileio
->
already
;
if
(
fileio
->
io
.
apc
)
{
*
apc
=
fileio_apc
;
*
arg
=
&
fileio
->
io
;
}
else
release_fileio
(
&
fileio
->
io
);
}
...
...
@@ -956,7 +960,8 @@ NTSTATUS WINAPI NtReadFileScatter( HANDLE file, HANDLE event, PIO_APC_ROUTINE ap
/***********************************************************************
* FILE_AsyncWriteService (INTERNAL)
*/
static
NTSTATUS
FILE_AsyncWriteService
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
)
static
NTSTATUS
FILE_AsyncWriteService
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
,
void
**
arg
)
{
struct
async_fileio_write
*
fileio
=
user
;
int
result
,
fd
,
needs_close
;
...
...
@@ -999,7 +1004,10 @@ static NTSTATUS FILE_AsyncWriteService(void *user, IO_STATUS_BLOCK *iosb, NTSTAT
iosb
->
u
.
Status
=
status
;
iosb
->
Information
=
fileio
->
already
;
if
(
fileio
->
io
.
apc
)
{
*
apc
=
fileio_apc
;
*
arg
=
&
fileio
->
io
;
}
else
release_fileio
(
&
fileio
->
io
);
}
...
...
@@ -1370,9 +1378,10 @@ struct async_ioctl
};
/* callback for ioctl async I/O completion */
static
NTSTATUS
ioctl_completion
(
void
*
arg
,
IO_STATUS_BLOCK
*
io
,
NTSTATUS
status
,
void
**
apc
)
static
NTSTATUS
ioctl_completion
(
void
*
user
,
IO_STATUS_BLOCK
*
io
,
NTSTATUS
status
,
void
**
apc
,
void
**
arg
)
{
struct
async_ioctl
*
async
=
arg
;
struct
async_ioctl
*
async
=
user
;
if
(
status
==
STATUS_ALERTED
)
{
...
...
@@ -1390,7 +1399,10 @@ static NTSTATUS ioctl_completion( void *arg, IO_STATUS_BLOCK *io, NTSTATUS statu
{
io
->
u
.
Status
=
status
;
if
(
async
->
io
.
apc
)
{
*
apc
=
fileio_apc
;
*
arg
=
&
async
->
io
;
}
else
release_fileio
(
&
async
->
io
);
}
...
...
@@ -1709,7 +1721,8 @@ struct read_changes_fileio
char
data
[
1
];
};
static
NTSTATUS
read_changes_apc
(
void
*
user
,
PIO_STATUS_BLOCK
iosb
,
NTSTATUS
status
,
void
**
apc
)
static
NTSTATUS
read_changes_apc
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
,
void
**
arg
)
{
struct
read_changes_fileio
*
fileio
=
user
;
NTSTATUS
ret
;
...
...
@@ -1776,7 +1789,10 @@ static NTSTATUS read_changes_apc( void *user, PIO_STATUS_BLOCK iosb, NTSTATUS st
iosb
->
u
.
Status
=
ret
;
iosb
->
Information
=
size
;
if
(
fileio
->
io
.
apc
)
{
*
apc
=
fileio_apc
;
*
arg
=
&
fileio
->
io
;
}
else
release_fileio
(
&
fileio
->
io
);
return
ret
;
...
...
dlls/ntdll/server.c
View file @
0a241b0f
...
...
@@ -391,17 +391,17 @@ static BOOL invoke_apc( const apc_call_t *call, apc_result_t *result )
}
case
APC_ASYNC_IO
:
{
void
*
apc
=
NULL
;
void
*
apc
=
NULL
,
*
arg
=
NULL
;
IO_STATUS_BLOCK
*
iosb
=
wine_server_get_ptr
(
call
->
async_io
.
sb
);
NTSTATUS
(
*
func
)(
void
*
,
IO_STATUS_BLOCK
*
,
NTSTATUS
,
void
**
)
=
wine_server_get_ptr
(
call
->
async_io
.
func
);
NTSTATUS
(
*
func
)(
void
*
,
IO_STATUS_BLOCK
*
,
NTSTATUS
,
void
**
,
void
**
)
=
wine_server_get_ptr
(
call
->
async_io
.
func
);
result
->
type
=
call
->
type
;
result
->
async_io
.
status
=
func
(
wine_server_get_ptr
(
call
->
async_io
.
user
),
iosb
,
call
->
async_io
.
status
,
&
apc
);
iosb
,
call
->
async_io
.
status
,
&
apc
,
&
arg
);
if
(
result
->
async_io
.
status
!=
STATUS_PENDING
)
{
result
->
async_io
.
total
=
iosb
->
Information
;
result
->
async_io
.
apc
=
wine_server_client_ptr
(
apc
);
result
->
async_io
.
arg
=
call
->
async_io
.
user
;
result
->
async_io
.
arg
=
wine_server_client_ptr
(
arg
)
;
}
break
;
}
...
...
dlls/ws2_32/socket.c
View file @
0a241b0f
...
...
@@ -2013,7 +2013,8 @@ static int WS2_recv( int fd, struct ws2_async *wsa )
*
* Handler for overlapped recv() operations.
*/
static
NTSTATUS
WS2_async_recv
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
)
static
NTSTATUS
WS2_async_recv
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
,
void
**
arg
)
{
struct
ws2_async
*
wsa
=
user
;
int
result
=
0
,
fd
;
...
...
@@ -2051,7 +2052,10 @@ static NTSTATUS WS2_async_recv( void* user, IO_STATUS_BLOCK* iosb, NTSTATUS stat
iosb
->
u
.
Status
=
status
;
iosb
->
Information
=
result
;
if
(
wsa
->
completion_func
)
{
*
apc
=
ws2_async_apc
;
*
arg
=
wsa
;
}
else
release_async_io
(
&
wsa
->
io
);
}
...
...
@@ -2064,12 +2068,13 @@ static NTSTATUS WS2_async_recv( void* user, IO_STATUS_BLOCK* iosb, NTSTATUS stat
* This function is used to finish the read part of an accept request. It is
* needed to place the completion on the correct socket (listener).
*/
static
NTSTATUS
WS2_async_accept_recv
(
void
*
arg
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
)
static
NTSTATUS
WS2_async_accept_recv
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
,
void
**
arg
)
{
void
*
junk
;
struct
ws2_accept_async
*
wsa
=
arg
;
struct
ws2_accept_async
*
wsa
=
user
;
status
=
WS2_async_recv
(
wsa
->
read
,
iosb
,
status
,
&
junk
);
status
=
WS2_async_recv
(
wsa
->
read
,
iosb
,
status
,
&
junk
,
&
junk
);
if
(
status
==
STATUS_PENDING
)
return
status
;
...
...
@@ -2087,9 +2092,10 @@ static NTSTATUS WS2_async_accept_recv( void *arg, IO_STATUS_BLOCK *iosb, NTSTATU
*
* This is the function called to satisfy the AcceptEx callback
*/
static
NTSTATUS
WS2_async_accept
(
void
*
arg
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
)
static
NTSTATUS
WS2_async_accept
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
,
void
**
arg
)
{
struct
ws2_accept_async
*
wsa
=
arg
;
struct
ws2_accept_async
*
wsa
=
user
;
int
len
;
char
*
addr
;
...
...
@@ -2241,7 +2247,8 @@ static int WS2_send( int fd, struct ws2_async *wsa )
*
* Handler for overlapped send() operations.
*/
static
NTSTATUS
WS2_async_send
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
)
static
NTSTATUS
WS2_async_send
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
,
void
**
arg
)
{
struct
ws2_async
*
wsa
=
user
;
int
result
=
0
,
fd
;
...
...
@@ -2285,7 +2292,10 @@ static NTSTATUS WS2_async_send(void* user, IO_STATUS_BLOCK* iosb, NTSTATUS statu
{
iosb
->
u
.
Status
=
status
;
if
(
wsa
->
completion_func
)
{
*
apc
=
ws2_async_apc
;
*
arg
=
wsa
;
}
else
release_async_io
(
&
wsa
->
io
);
}
...
...
@@ -2297,7 +2307,8 @@ static NTSTATUS WS2_async_send(void* user, IO_STATUS_BLOCK* iosb, NTSTATUS statu
*
* Handler for shutdown() operations on overlapped sockets.
*/
static
NTSTATUS
WS2_async_shutdown
(
void
*
user
,
PIO_STATUS_BLOCK
iosb
,
NTSTATUS
status
,
void
**
apc
)
static
NTSTATUS
WS2_async_shutdown
(
void
*
user
,
IO_STATUS_BLOCK
*
iosb
,
NTSTATUS
status
,
void
**
apc
,
void
**
arg
)
{
struct
ws2_async_shutdown
*
wsa
=
user
;
int
fd
,
err
=
1
;
...
...
server/protocol.def
View file @
0a241b0f
...
...
@@ -480,7 +480,7 @@ typedef union
{
enum apc_type type; /* APC_ASYNC_IO */
unsigned int status; /* I/O status */
client_ptr_t func; /* unsigned int (*func)(void*, void*, unsigned int, void
**); */
client_ptr_t func; /* unsigned int (*func)(void*, void*, unsigned int, void
**, void
**); */
client_ptr_t user; /* user pointer */
client_ptr_t sb; /* status block */
} async_io;
...
...
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