Module: wine Branch: master Commit: 097685aa9ea06440b69ef0a1555771b08cb97ce4 URL: https://source.winehq.org/git/wine.git/?a=commit;h=097685aa9ea06440b69ef0a15...
Author: Zebediah Figura zfigura@codeweavers.com Date: Sun Sep 12 16:07:52 2021 -0500
ntoskrnl: Report separately whether an IRP was marked pending.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/ntoskrnl.c | 5 +++++ dlls/ntoskrnl.exe/tests/ntoskrnl.c | 3 +-- include/wine/server_protocol.h | 4 +++- server/device.c | 2 +- server/protocol.def | 1 + server/request.h | 7 ++++--- server/trace.c | 1 + 7 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 42976f4905e..1bd5d6fb351 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -949,11 +949,16 @@ NTSTATUS CDECL wine_ntoskrnl_main_loop( HANDLE stop_event ) out_buff = NULL; /* do not transfer back input buffer */
req->prev = wine_server_obj_handle( context.irp_data->handle ); + req->pending = irp->PendingReturned; req->iosb_status = irp->IoStatus.u.Status; req->result = irp->IoStatus.Information; if (!NT_ERROR(irp->IoStatus.u.Status) && out_buff) wine_server_add_data( req, out_buff, irp->IoStatus.Information ); } + else + { + req->pending = 1; + } } else { diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index 3798c3d59c1..49498a5e0e8 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -882,8 +882,7 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params) } else { - todo_wine_if (params->ret_status != STATUS_PENDING) - ok(!ret, "got %#x\n", ret); + ok(!ret, "got %#x\n", ret); } if (!ret) { diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 4a12e6533f6..e22da223894 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -4801,9 +4801,11 @@ struct get_next_device_request_request obj_handle_t prev; unsigned int status; client_ptr_t user_ptr; + int pending; unsigned int iosb_status; data_size_t result; /* VARARG(data,bytes); */ + char __pad_44[4]; }; struct get_next_device_request_reply { @@ -6255,7 +6257,7 @@ union generic_reply
/* ### protocol_version begin ### */
-#define SERVER_PROTOCOL_VERSION 728 +#define SERVER_PROTOCOL_VERSION 729
/* ### protocol_version end ### */
diff --git a/server/device.c b/server/device.c index df1a71a5a4d..5abe1e3bb00 100644 --- a/server/device.c +++ b/server/device.c @@ -954,7 +954,7 @@ DECL_HANDLER(get_next_device_request)
if (irp->async) { - if (req->status == STATUS_PENDING) + if (req->pending) set_async_pending( irp->async ); async_set_initial_status( irp->async, req->status );
diff --git a/server/protocol.def b/server/protocol.def index 608c481db27..02c1f269be7 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3368,6 +3368,7 @@ struct handle_info obj_handle_t prev; /* handle to the previous irp */ unsigned int status; /* status of the previous irp */ client_ptr_t user_ptr; /* user pointer of the previous irp */ + int pending; /* was the previous irp marked pending? */ unsigned int iosb_status; /* IOSB status of the previous irp */ data_size_t result; /* IOSB result of the previous irp */ VARARG(data,bytes); /* output data of the previous irp */ diff --git a/server/request.h b/server/request.h index c2e8e30d1e1..f3567cd967f 100644 --- a/server/request.h +++ b/server/request.h @@ -2053,9 +2053,10 @@ C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, manager) == 12 ); C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, prev) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, status) == 20 ); C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, user_ptr) == 24 ); -C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, iosb_status) == 32 ); -C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, result) == 36 ); -C_ASSERT( sizeof(struct get_next_device_request_request) == 40 ); +C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, pending) == 32 ); +C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, iosb_status) == 36 ); +C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, result) == 40 ); +C_ASSERT( sizeof(struct get_next_device_request_request) == 48 ); C_ASSERT( FIELD_OFFSET(struct get_next_device_request_reply, params) == 8 ); C_ASSERT( FIELD_OFFSET(struct get_next_device_request_reply, next) == 40 ); C_ASSERT( FIELD_OFFSET(struct get_next_device_request_reply, client_tid) == 44 ); diff --git a/server/trace.c b/server/trace.c index fa943d217bb..da8c74cea2b 100644 --- a/server/trace.c +++ b/server/trace.c @@ -4177,6 +4177,7 @@ static void dump_get_next_device_request_request( const struct get_next_device_r fprintf( stderr, ", prev=%04x", req->prev ); fprintf( stderr, ", status=%08x", req->status ); dump_uint64( ", user_ptr=", &req->user_ptr ); + fprintf( stderr, ", pending=%d", req->pending ); fprintf( stderr, ", iosb_status=%08x", req->iosb_status ); fprintf( stderr, ", result=%u", req->result ); dump_varargs_bytes( ", data=", cur_size );