From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/d3dkmt.c | 13 ++++++++----- dlls/wow64win/gdi.c | 2 +- server/d3dkmt.c | 14 +++++++++----- server/protocol.def | 1 + 4 files changed, 19 insertions(+), 11 deletions(-)
diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 09313c7674d..38bfc5e31a3 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -163,14 +163,14 @@ static NTSTATUS d3dkmt_object_alloc( UINT size, enum d3dkmt_type type, void **ob return STATUS_SUCCESS; }
-/* create a global D3DKMT object, either with a global handle or later shareable */ -static NTSTATUS d3dkmt_object_create( struct d3dkmt_object *obj, BOOL shared ) +static NTSTATUS d3dkmt_object_create( struct d3dkmt_object *obj, BOOL shared, const void *runtime, UINT runtime_size ) { NTSTATUS status;
SERVER_START_REQ( d3dkmt_object_create ) { req->type = obj->type; + if (runtime_size) wine_server_add_data( req, runtime, runtime_size ); if (!(status = wine_server_call( req ))) { obj->handle = wine_server_ptr_handle( reply->handle ); @@ -795,7 +795,8 @@ NTSTATUS WINAPI NtGdiDdDDICreateAllocation2( D3DKMT_CREATEALLOCATION *params ) if ((status = d3dkmt_object_alloc( sizeof(*allocation), D3DKMT_ALLOCATION, (void **)&allocation ))) goto failed;
if (!params->Flags.CreateShared) status = alloc_object_handle( &resource->obj ); - else status = d3dkmt_object_create( &resource->obj, params->Flags.NtSecuritySharing ); + else status = d3dkmt_object_create( &resource->obj, params->Flags.NtSecuritySharing, + params->pPrivateRuntimeData, params->PrivateRuntimeDataSize ); if (status) goto failed;
params->hGlobalShare = resource->obj.shared ? 0 : resource->obj.global; @@ -955,7 +956,9 @@ NTSTATUS WINAPI NtGdiDdDDICreateKeyedMutex2( D3DKMT_CREATEKEYEDMUTEX2 *params ) if (!params) return STATUS_INVALID_PARAMETER;
if ((status = d3dkmt_object_alloc( sizeof(*mutex), D3DKMT_MUTEX, (void **)&mutex ))) return status; - if ((status = d3dkmt_object_create( mutex, params->Flags.NtSecuritySharing ))) goto failed; + if ((status = d3dkmt_object_create( mutex, params->Flags.NtSecuritySharing, + params->pPrivateRuntimeData, params->PrivateRuntimeDataSize ))) + goto failed;
params->hSharedHandle = mutex->shared ? 0 : mutex->global; params->hKeyedMutex = mutex->local; @@ -1050,7 +1053,7 @@ NTSTATUS WINAPI NtGdiDdDDICreateSynchronizationObject2( D3DKMT_CREATESYNCHRONIZA
if ((status = d3dkmt_object_alloc( sizeof(*sync), D3DKMT_SYNC, (void **)&sync ))) return status; if (!params->Info.Flags.Shared) status = alloc_object_handle( sync ); - else status = d3dkmt_object_create( sync, params->Info.Flags.NtSecuritySharing ); + else status = d3dkmt_object_create( sync, params->Info.Flags.NtSecuritySharing, NULL, 0 ); if (status) goto failed;
if (params->Info.Flags.Shared) params->Info.SharedHandle = sync->shared ? 0 : sync->global; diff --git a/dlls/wow64win/gdi.c b/dlls/wow64win/gdi.c index bf5705f52a6..40dbd811e01 100644 --- a/dlls/wow64win/gdi.c +++ b/dlls/wow64win/gdi.c @@ -606,7 +606,7 @@ NTSTATUS WINAPI wow64_NtGdiDdDDICreateAllocation2( UINT *args ) standard.Flags = standard32->Flags;
desc.pStandardAllocation = &standard; - desc.PrivateDriverDataSize = sizeof(standard); + desc.PrivateDriverDataSize = desc32->PrivateDriverDataSize; } desc.NumAllocations = desc32->NumAllocations; allocs32 = UlongToPtr( desc32->pAllocationInfo2 ); diff --git a/server/d3dkmt.c b/server/d3dkmt.c index 0249afca1a1..fb50ffb59c0 100644 --- a/server/d3dkmt.c +++ b/server/d3dkmt.c @@ -42,6 +42,8 @@ struct d3dkmt_object struct object obj; /* object header */ enum d3dkmt_type type; /* object type */ d3dkmt_handle_t global; /* object global handle */ + char *runtime; /* client runtime data */ + mem_size_t runtime_size; /* size of client runtime data */ };
static void d3dkmt_object_dump( struct object *obj, int verbose ); @@ -144,17 +146,19 @@ static void d3dkmt_object_destroy( struct object *obj ) assert( obj->ops == &d3dkmt_object_ops );
if (object->global) free_object_handle( object ); + free( object->runtime ); }
-static struct d3dkmt_object *d3dkmt_object_create( enum d3dkmt_type type ) +static struct d3dkmt_object *d3dkmt_object_create( enum d3dkmt_type type, mem_size_t runtime_size, const void *runtime ) { struct d3dkmt_object *object;
if (!(object = alloc_object( &d3dkmt_object_ops ))) return NULL; - object->type = type; - object->global = 0; + object->type = type; + object->global = 0; + object->runtime_size = runtime_size;
- if (!alloc_object_handle( object )) + if (!(object->runtime = memdup( runtime, runtime_size )) || !alloc_object_handle( object )) { release_object( object ); set_error( STATUS_NO_MEMORY ); @@ -169,7 +173,7 @@ DECL_HANDLER(d3dkmt_object_create) { struct d3dkmt_object *object;
- if (!(object = d3dkmt_object_create( req->type ))) return; + if (!(object = d3dkmt_object_create( req->type, get_req_data_size(), get_req_data() ))) return; reply->handle = alloc_handle( current->process, object, STANDARD_RIGHTS_ALL, OBJ_INHERIT ); reply->global = object->global; release_object( object ); diff --git a/server/protocol.def b/server/protocol.def index e22b34ee3d2..6d5980cc43f 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -4154,6 +4154,7 @@ enum inproc_sync_type /* Create a global d3dkmt object */ @REQ(d3dkmt_object_create) unsigned int type; /* d3dkmt object type */ + VARARG(runtime,bytes); /* client runtime data */ @REPLY d3dkmt_handle_t global; /* global d3dkmt handle */ obj_handle_t handle; /* process-private handle */