From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 2 ++ server/d3dkmt.c | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 07f135671b2..1113eca9f8e 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -246,6 +246,8 @@ static NTSTATUS d3dkmt_object_open( struct d3dkmt_object *obj, D3DKMT_HANDLE glo *runtime_size = reply->runtime_size; } SERVER_END_REQ; + + if (status == STATUS_PENDING) status = wine_server_handle_to_fd( obj->handle, GENERIC_ALL, &obj->fd, NULL ); if (!status) status = alloc_object_handle( obj );
if (status) WARN( "Failed to open global object %#x/%p, status %#x\n", global, handle, status ); diff --git a/server/d3dkmt.c b/server/d3dkmt.c index d8899346c70..62c7d7dc380 100644 --- a/server/d3dkmt.c +++ b/server/d3dkmt.c @@ -47,6 +47,7 @@ struct d3dkmt_object };
static void d3dkmt_object_dump( struct object *obj, int verbose ); +static struct fd *d3dkmt_object_get_fd( struct object *obj ); static void d3dkmt_object_destroy( struct object *obj );
static const struct object_ops d3dkmt_object_ops = @@ -59,7 +60,7 @@ static const struct object_ops d3dkmt_object_ops = NULL, /* signaled */ NULL, /* satisfied */ no_signal, /* signal */ - no_get_fd, /* get_fd */ + d3dkmt_object_get_fd, /* get_fd */ default_get_sync, /* get_sync */ default_map_access, /* map_access */ default_get_sd, /* get_sd */ @@ -329,6 +330,14 @@ static void d3dkmt_object_dump( struct object *obj, int verbose ) fprintf( stderr, "type=%#x global=%#x\n", object->type, object->global ); }
+static struct fd *d3dkmt_object_get_fd( struct object *obj ) +{ + struct d3dkmt_object *object = (struct d3dkmt_object *)obj; + assert( obj->ops == &d3dkmt_object_ops ); + + return object->fd ? (struct fd *)grab_object( object->fd ) : NULL; +} + static void d3dkmt_object_destroy( struct object *obj ) { struct d3dkmt_object *object = (struct d3dkmt_object *)obj; @@ -488,6 +497,7 @@ DECL_HANDLER(d3dkmt_object_open) reply->global = object->global; reply->runtime_size = object->runtime_size; if (runtime_size) set_reply_data( object->runtime, object->runtime_size ); + if (object->fd) set_error( STATUS_PENDING ); }
release_object( object );