Zebediah Figura : ntoskrnl: Report separately whether an IRP was marked pending.
Alexandre Julliard
julliard at winehq.org
Mon Sep 13 16:12:33 CDT 2021
Module: wine
Branch: master
Commit: 097685aa9ea06440b69ef0a1555771b08cb97ce4
URL: https://source.winehq.org/git/wine.git/?a=commit;h=097685aa9ea06440b69ef0a1555771b08cb97ce4
Author: Zebediah Figura <zfigura at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 );
More information about the wine-cvs
mailing list