Module: wine Branch: master Commit: 1b48335762e902738dc55eeaeddc89737798d5a0 URL: https://source.winehq.org/git/wine.git/?a=commit;h=1b48335762e902738dc55eeae...
Author: Erich E. Hoover erich.e.hoover@gmail.com Date: Fri Jun 12 14:53:43 2020 -0600
ntdll: Allow NtQueryVolumeInformationFile to make async volume information queries.
Signed-off-by: Erich E. Hoover erich.e.hoover@gmail.com Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/unix/file.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c index e147fb47391..00ca2005f92 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -6257,16 +6257,33 @@ NTSTATUS WINAPI NtQueryVolumeInformationFile( HANDLE handle, IO_STATUS_BLOCK *io io->u.Status = server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL ); if (io->u.Status == STATUS_BAD_DEVICE_TYPE) { + struct async_irp *async; + HANDLE wait_handle; + NTSTATUS status; + + if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), irp_completion, handle ))) + return STATUS_NO_MEMORY; + async->buffer = buffer; + async->size = length; + SERVER_START_REQ( get_volume_info ) { + req->async = server_async( handle, &async->io, NULL, NULL, NULL, io ); req->handle = wine_server_obj_handle( handle ); req->info_class = info_class; wine_server_set_reply( req, buffer, length ); - io->u.Status = wine_server_call( req ); - if (!io->u.Status) io->Information = wine_server_reply_size( reply ); + status = wine_server_call( req ); + if (status != STATUS_PENDING) + { + io->u.Status = status; + io->Information = wine_server_reply_size( reply ); + } + wait_handle = wine_server_ptr_handle( reply->wait ); } SERVER_END_REQ; - return io->u.Status; + if (status != STATUS_PENDING) free( async ); + if (wait_handle) status = wait_async( wait_handle, FALSE, io ); + return status; } else if (io->u.Status) return io->u.Status;