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>
This commit is contained in:
Zebediah Figura 2021-09-12 16:07:52 -05:00 committed by Alexandre Julliard
parent 484b78bda0
commit 097685aa9e
7 changed files with 16 additions and 7 deletions

View File

@ -949,11 +949,16 @@ NTSTATUS CDECL wine_ntoskrnl_main_loop( HANDLE stop_event )
out_buff = NULL; /* do not transfer back input buffer */ out_buff = NULL; /* do not transfer back input buffer */
req->prev = wine_server_obj_handle( context.irp_data->handle ); req->prev = wine_server_obj_handle( context.irp_data->handle );
req->pending = irp->PendingReturned;
req->iosb_status = irp->IoStatus.u.Status; req->iosb_status = irp->IoStatus.u.Status;
req->result = irp->IoStatus.Information; req->result = irp->IoStatus.Information;
if (!NT_ERROR(irp->IoStatus.u.Status) && out_buff) if (!NT_ERROR(irp->IoStatus.u.Status) && out_buff)
wine_server_add_data( req, out_buff, irp->IoStatus.Information ); wine_server_add_data( req, out_buff, irp->IoStatus.Information );
} }
else
{
req->pending = 1;
}
} }
else else
{ {

View File

@ -882,8 +882,7 @@ static void do_return_status(ULONG ioctl, struct return_status_params *params)
} }
else else
{ {
todo_wine_if (params->ret_status != STATUS_PENDING) ok(!ret, "got %#x\n", ret);
ok(!ret, "got %#x\n", ret);
} }
if (!ret) if (!ret)
{ {

View File

@ -4801,9 +4801,11 @@ struct get_next_device_request_request
obj_handle_t prev; obj_handle_t prev;
unsigned int status; unsigned int status;
client_ptr_t user_ptr; client_ptr_t user_ptr;
int pending;
unsigned int iosb_status; unsigned int iosb_status;
data_size_t result; data_size_t result;
/* VARARG(data,bytes); */ /* VARARG(data,bytes); */
char __pad_44[4];
}; };
struct get_next_device_request_reply struct get_next_device_request_reply
{ {
@ -6255,7 +6257,7 @@ union generic_reply
/* ### protocol_version begin ### */ /* ### protocol_version begin ### */
#define SERVER_PROTOCOL_VERSION 728 #define SERVER_PROTOCOL_VERSION 729
/* ### protocol_version end ### */ /* ### protocol_version end ### */

View File

@ -954,7 +954,7 @@ DECL_HANDLER(get_next_device_request)
if (irp->async) if (irp->async)
{ {
if (req->status == STATUS_PENDING) if (req->pending)
set_async_pending( irp->async ); set_async_pending( irp->async );
async_set_initial_status( irp->async, req->status ); async_set_initial_status( irp->async, req->status );

View File

@ -3368,6 +3368,7 @@ struct handle_info
obj_handle_t prev; /* handle to the previous irp */ obj_handle_t prev; /* handle to the previous irp */
unsigned int status; /* status of the previous irp */ unsigned int status; /* status of the previous irp */
client_ptr_t user_ptr; /* user pointer 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 */ unsigned int iosb_status; /* IOSB status of the previous irp */
data_size_t result; /* IOSB result of the previous irp */ data_size_t result; /* IOSB result of the previous irp */
VARARG(data,bytes); /* output data of the previous irp */ VARARG(data,bytes); /* output data of the previous irp */

View File

@ -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, prev) == 16 );
C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, status) == 20 ); 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, 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, pending) == 32 );
C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, result) == 36 ); C_ASSERT( FIELD_OFFSET(struct get_next_device_request_request, iosb_status) == 36 );
C_ASSERT( sizeof(struct get_next_device_request_request) == 40 ); 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, params) == 8 );
C_ASSERT( FIELD_OFFSET(struct get_next_device_request_reply, next) == 40 ); 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 ); C_ASSERT( FIELD_OFFSET(struct get_next_device_request_reply, client_tid) == 44 );

View File

@ -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, ", prev=%04x", req->prev );
fprintf( stderr, ", status=%08x", req->status ); fprintf( stderr, ", status=%08x", req->status );
dump_uint64( ", user_ptr=", &req->user_ptr ); dump_uint64( ", user_ptr=", &req->user_ptr );
fprintf( stderr, ", pending=%d", req->pending );
fprintf( stderr, ", iosb_status=%08x", req->iosb_status ); fprintf( stderr, ", iosb_status=%08x", req->iosb_status );
fprintf( stderr, ", result=%u", req->result ); fprintf( stderr, ", result=%u", req->result );
dump_varargs_bytes( ", data=", cur_size ); dump_varargs_bytes( ", data=", cur_size );