From: Rémi Bernon rbernon@codeweavers.com
--- dlls/gdi32/gdi32.spec | 4 ++ dlls/win32u/d3dkmt.c | 55 +++++++++++++++++++++++++ dlls/win32u/win32syscalls.h | 20 ++++------ dlls/win32u/win32u.spec | 8 ++-- dlls/wow64win/gdi.c | 80 +++++++++++++++++++++++++++++++++++++ include/ddk/d3dkmthk.h | 38 ++++++++++++++++++ include/ntgdi.h | 4 ++ 7 files changed, 193 insertions(+), 16 deletions(-)
diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec index fef4d66effe..c42172f142f 100644 --- a/dlls/gdi32/gdi32.spec +++ b/dlls/gdi32/gdi32.spec @@ -99,6 +99,8 @@ # @ stub CreateScaledCompatibleBitmap # @ stub CreateSessionMappedDIBSection @ stdcall CreateSolidBrush(long) +@ stdcall D3DKMTAcquireKeyedMutex(ptr) win32u.NtGdiDdDDIAcquireKeyedMutex +@ stdcall D3DKMTAcquireKeyedMutex2(ptr) win32u.NtGdiDdDDIAcquireKeyedMutex2 @ stdcall D3DKMTCheckOcclusion(ptr) win32u.NtGdiDdDDICheckOcclusion @ stdcall D3DKMTCheckVidPnExclusiveOwnership(ptr) win32u.NtGdiDdDDICheckVidPnExclusiveOwnership @ stdcall D3DKMTCloseAdapter(ptr) win32u.NtGdiDdDDICloseAdapter @@ -139,6 +141,8 @@ @ stdcall D3DKMTQueryResourceInfoFromNtHandle(ptr) win32u.NtGdiDdDDIQueryResourceInfoFromNtHandle @ stdcall D3DKMTQueryStatistics(ptr) win32u.NtGdiDdDDIQueryStatistics @ stdcall D3DKMTQueryVideoMemoryInfo(ptr) win32u.NtGdiDdDDIQueryVideoMemoryInfo +@ stdcall D3DKMTReleaseKeyedMutex(ptr) win32u.NtGdiDdDDIReleaseKeyedMutex +@ stdcall D3DKMTReleaseKeyedMutex2(ptr) win32u.NtGdiDdDDIReleaseKeyedMutex2 @ stdcall D3DKMTSetQueuedLimit(ptr) win32u.NtGdiDdDDISetQueuedLimit @ stdcall D3DKMTSetVidPnSourceOwner(ptr) win32u.NtGdiDdDDISetVidPnSourceOwner @ stdcall D3DKMTShareObjects(long ptr ptr long ptr) win32u.NtGdiDdDDIShareObjects diff --git a/dlls/win32u/d3dkmt.c b/dlls/win32u/d3dkmt.c index 23640cb39be..3040cce030b 100644 --- a/dlls/win32u/d3dkmt.c +++ b/dlls/win32u/d3dkmt.c @@ -1489,6 +1489,61 @@ failed: return status; }
+/****************************************************************************** + * NtGdiDdDDIAcquireKeyedMutex2 (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIAcquireKeyedMutex2( D3DKMT_ACQUIREKEYEDMUTEX2 *params ) +{ + FIXME( "params %p stub!\n", params ); + return STATUS_NOT_IMPLEMENTED; +} + +/****************************************************************************** + * NtGdiDdDDIAcquireKeyedMutex (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIAcquireKeyedMutex( D3DKMT_ACQUIREKEYEDMUTEX *params ) +{ + D3DKMT_ACQUIREKEYEDMUTEX2 params2 = {0}; + NTSTATUS status; + + TRACE( "params %p\n", params ); + + if (!params) return STATUS_INVALID_PARAMETER; + params2.hKeyedMutex = params->hKeyedMutex; + params2.pTimeout = params->pTimeout; + params2.Key = params->Key; + params2.FenceValue = params->FenceValue; + status = NtGdiDdDDIAcquireKeyedMutex2( ¶ms2 ); + params->FenceValue = params2.FenceValue; + + return status; +} + +/****************************************************************************** + * NtGdiDdDDIReleaseKeyedMutex2 (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIReleaseKeyedMutex2( D3DKMT_RELEASEKEYEDMUTEX2 *params ) +{ + FIXME( "params %p stub!\n", params ); + return STATUS_NOT_IMPLEMENTED; +} + +/****************************************************************************** + * NtGdiDdDDIReleaseKeyedMutex (win32u.@) + */ +NTSTATUS WINAPI NtGdiDdDDIReleaseKeyedMutex( D3DKMT_RELEASEKEYEDMUTEX *params ) +{ + D3DKMT_RELEASEKEYEDMUTEX2 params2 = {0}; + + TRACE( "params %p\n", params ); + + if (!params) return STATUS_INVALID_PARAMETER; + params2.hKeyedMutex = params->hKeyedMutex; + params2.Key = params->Key; + params2.FenceValue = params->FenceValue; + return NtGdiDdDDIReleaseKeyedMutex2( ¶ms2 ); +} +
/****************************************************************************** * NtGdiDdDDICreateSynchronizationObject2 (win32u.@) diff --git a/dlls/win32u/win32syscalls.h b/dlls/win32u/win32syscalls.h index f37eae3551b..a11a487cb72 100644 --- a/dlls/win32u/win32syscalls.h +++ b/dlls/win32u/win32syscalls.h @@ -201,8 +201,8 @@ SYSCALL_ENTRY( 0x10c5, NtGdiDDCCISetVCPFeature, 0 ) \ SYSCALL_ENTRY( 0x10c6, NtGdiDdCreateFullscreenSprite, 0 ) \ SYSCALL_ENTRY( 0x10c7, NtGdiDdDDIAbandonSwapChain, 0 ) \ - SYSCALL_ENTRY( 0x10c8, NtGdiDdDDIAcquireKeyedMutex, 0 ) \ - SYSCALL_ENTRY( 0x10c9, NtGdiDdDDIAcquireKeyedMutex2, 0 ) \ + SYSCALL_ENTRY( 0x10c8, NtGdiDdDDIAcquireKeyedMutex, 4 ) \ + SYSCALL_ENTRY( 0x10c9, NtGdiDdDDIAcquireKeyedMutex2, 4 ) \ SYSCALL_ENTRY( 0x10ca, NtGdiDdDDIAcquireSwapChain, 0 ) \ SYSCALL_ENTRY( 0x10cb, NtGdiDdDDIAddSurfaceToSwapChain, 0 ) \ SYSCALL_ENTRY( 0x10cc, NtGdiDdDDIAdjustFullscreenGamma, 0 ) \ @@ -343,8 +343,8 @@ SYSCALL_ENTRY( 0x1153, NtGdiDdDDIQueryVideoMemoryInfo, 4 ) \ SYSCALL_ENTRY( 0x1154, NtGdiDdDDIReclaimAllocations, 0 ) \ SYSCALL_ENTRY( 0x1155, NtGdiDdDDIReclaimAllocations2, 0 ) \ - SYSCALL_ENTRY( 0x1156, NtGdiDdDDIReleaseKeyedMutex, 0 ) \ - SYSCALL_ENTRY( 0x1157, NtGdiDdDDIReleaseKeyedMutex2, 0 ) \ + SYSCALL_ENTRY( 0x1156, NtGdiDdDDIReleaseKeyedMutex, 4 ) \ + SYSCALL_ENTRY( 0x1157, NtGdiDdDDIReleaseKeyedMutex2, 4 ) \ SYSCALL_ENTRY( 0x1158, NtGdiDdDDIReleaseProcessVidPnSourceOwners, 0 ) \ SYSCALL_ENTRY( 0x1159, NtGdiDdDDIReleaseSwapChain, 0 ) \ SYSCALL_ENTRY( 0x115a, NtGdiDdDDIRemoveSurfaceFromSwapChain, 0 ) \ @@ -1743,8 +1743,8 @@ SYSCALL_ENTRY( 0x10c5, NtGdiDDCCISetVCPFeature, 0 ) \ SYSCALL_ENTRY( 0x10c6, NtGdiDdCreateFullscreenSprite, 0 ) \ SYSCALL_ENTRY( 0x10c7, NtGdiDdDDIAbandonSwapChain, 0 ) \ - SYSCALL_ENTRY( 0x10c8, NtGdiDdDDIAcquireKeyedMutex, 0 ) \ - SYSCALL_ENTRY( 0x10c9, NtGdiDdDDIAcquireKeyedMutex2, 0 ) \ + SYSCALL_ENTRY( 0x10c8, NtGdiDdDDIAcquireKeyedMutex, 8 ) \ + SYSCALL_ENTRY( 0x10c9, NtGdiDdDDIAcquireKeyedMutex2, 8 ) \ SYSCALL_ENTRY( 0x10ca, NtGdiDdDDIAcquireSwapChain, 0 ) \ SYSCALL_ENTRY( 0x10cb, NtGdiDdDDIAddSurfaceToSwapChain, 0 ) \ SYSCALL_ENTRY( 0x10cc, NtGdiDdDDIAdjustFullscreenGamma, 0 ) \ @@ -1885,8 +1885,8 @@ SYSCALL_ENTRY( 0x1153, NtGdiDdDDIQueryVideoMemoryInfo, 8 ) \ SYSCALL_ENTRY( 0x1154, NtGdiDdDDIReclaimAllocations, 0 ) \ SYSCALL_ENTRY( 0x1155, NtGdiDdDDIReclaimAllocations2, 0 ) \ - SYSCALL_ENTRY( 0x1156, NtGdiDdDDIReleaseKeyedMutex, 0 ) \ - SYSCALL_ENTRY( 0x1157, NtGdiDdDDIReleaseKeyedMutex2, 0 ) \ + SYSCALL_ENTRY( 0x1156, NtGdiDdDDIReleaseKeyedMutex, 8 ) \ + SYSCALL_ENTRY( 0x1157, NtGdiDdDDIReleaseKeyedMutex2, 8 ) \ SYSCALL_ENTRY( 0x1158, NtGdiDdDDIReleaseProcessVidPnSourceOwners, 0 ) \ SYSCALL_ENTRY( 0x1159, NtGdiDdDDIReleaseSwapChain, 0 ) \ SYSCALL_ENTRY( 0x115a, NtGdiDdDDIRemoveSurfaceFromSwapChain, 0 ) \ @@ -3257,8 +3257,6 @@ SYSCALL_STUB( NtGdiDDCCISetVCPFeature ) \ SYSCALL_STUB( NtGdiDdCreateFullscreenSprite ) \ SYSCALL_STUB( NtGdiDdDDIAbandonSwapChain ) \ - SYSCALL_STUB( NtGdiDdDDIAcquireKeyedMutex ) \ - SYSCALL_STUB( NtGdiDdDDIAcquireKeyedMutex2 ) \ SYSCALL_STUB( NtGdiDdDDIAcquireSwapChain ) \ SYSCALL_STUB( NtGdiDdDDIAddSurfaceToSwapChain ) \ SYSCALL_STUB( NtGdiDdDDIAdjustFullscreenGamma ) \ @@ -3360,8 +3358,6 @@ SYSCALL_STUB( NtGdiDdDDIQueryVidPnExclusiveOwnership ) \ SYSCALL_STUB( NtGdiDdDDIReclaimAllocations ) \ SYSCALL_STUB( NtGdiDdDDIReclaimAllocations2 ) \ - SYSCALL_STUB( NtGdiDdDDIReleaseKeyedMutex ) \ - SYSCALL_STUB( NtGdiDdDDIReleaseKeyedMutex2 ) \ SYSCALL_STUB( NtGdiDdDDIReleaseProcessVidPnSourceOwners ) \ SYSCALL_STUB( NtGdiDdDDIReleaseSwapChain ) \ SYSCALL_STUB( NtGdiDdDDIRemoveSurfaceFromSwapChain ) \ diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 84654596515..61e87675357 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -199,8 +199,8 @@ @ stub -syscall NtGdiDDCCISetVCPFeature @ stub -syscall NtGdiDdCreateFullscreenSprite @ stub -syscall NtGdiDdDDIAbandonSwapChain -@ stub -syscall NtGdiDdDDIAcquireKeyedMutex -@ stub -syscall NtGdiDdDDIAcquireKeyedMutex2 +@ stdcall -syscall NtGdiDdDDIAcquireKeyedMutex(ptr) +@ stdcall -syscall NtGdiDdDDIAcquireKeyedMutex2(ptr) @ stub -syscall NtGdiDdDDIAcquireSwapChain @ stub -syscall NtGdiDdDDIAddSurfaceToSwapChain @ stub -syscall NtGdiDdDDIAdjustFullscreenGamma @@ -341,8 +341,8 @@ @ stdcall -syscall NtGdiDdDDIQueryVideoMemoryInfo(ptr) @ stub -syscall NtGdiDdDDIReclaimAllocations @ stub -syscall NtGdiDdDDIReclaimAllocations2 -@ stub -syscall NtGdiDdDDIReleaseKeyedMutex -@ stub -syscall NtGdiDdDDIReleaseKeyedMutex2 +@ stdcall -syscall NtGdiDdDDIReleaseKeyedMutex(ptr) +@ stdcall -syscall NtGdiDdDDIReleaseKeyedMutex2(ptr) @ stub -syscall NtGdiDdDDIReleaseProcessVidPnSourceOwners @ stub -syscall NtGdiDdDDIReleaseSwapChain @ stub -syscall NtGdiDdDDIRemoveSurfaceFromSwapChain diff --git a/dlls/wow64win/gdi.c b/dlls/wow64win/gdi.c index a03dd4e4990..9ba1c3b93de 100644 --- a/dlls/wow64win/gdi.c +++ b/dlls/wow64win/gdi.c @@ -399,6 +399,56 @@ NTSTATUS WINAPI wow64_NtGdiCreateSolidBrush( UINT *args ) return HandleToUlong( NtGdiCreateSolidBrush( color, brush )); }
+NTSTATUS WINAPI wow64_NtGdiDdDDIAcquireKeyedMutex( UINT *args ) +{ + struct + { + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + ULONG pTimeout; + UINT64 FenceValue; + } *desc32 = get_ptr( &args ); + D3DKMT_ACQUIREKEYEDMUTEX desc; + NTSTATUS status; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hKeyedMutex = desc32->hKeyedMutex; + desc.Key = desc32->Key; + desc.pTimeout = UlongToHandle( desc32->pTimeout ); + desc.FenceValue = desc32->FenceValue; + status = NtGdiDdDDIAcquireKeyedMutex( &desc ); + desc32->FenceValue = desc.FenceValue; + + return status; +} + +NTSTATUS WINAPI wow64_NtGdiDdDDIAcquireKeyedMutex2( UINT *args ) +{ + struct + { + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + ULONG pTimeout; + UINT64 FenceValue; + ULONG pPrivateRuntimeData; + UINT PrivateRuntimeDataSize; + } *desc32 = get_ptr( &args ); + D3DKMT_ACQUIREKEYEDMUTEX2 desc; + NTSTATUS status; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hKeyedMutex = desc32->hKeyedMutex; + desc.Key = desc32->Key; + desc.pTimeout = UlongToHandle( desc32->pTimeout ); + desc.FenceValue = desc32->FenceValue; + desc.pPrivateRuntimeData = UlongToHandle( desc32->pPrivateRuntimeData ); + desc.PrivateRuntimeDataSize = desc32->PrivateRuntimeDataSize; + status = NtGdiDdDDIAcquireKeyedMutex2( &desc ); + desc32->FenceValue = desc.FenceValue; + + return status; +} + NTSTATUS WINAPI wow64_NtGdiDdDDICheckOcclusion( UINT *args ) { struct @@ -1430,6 +1480,36 @@ NTSTATUS WINAPI wow64_NtGdiDdDDIQueryVideoMemoryInfo( UINT *args ) return status; }
+NTSTATUS WINAPI wow64_NtGdiDdDDIReleaseKeyedMutex( UINT *args ) +{ + D3DKMT_RELEASEKEYEDMUTEX *desc = get_ptr( &args ); + return NtGdiDdDDIReleaseKeyedMutex( desc ); +} + +NTSTATUS WINAPI wow64_NtGdiDdDDIReleaseKeyedMutex2( UINT *args ) +{ + struct + { + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + UINT64 FenceValue; + ULONG pPrivateRuntimeData; + UINT PrivateRuntimeDataSize; + } *desc32 = get_ptr( &args ); + D3DKMT_RELEASEKEYEDMUTEX2 desc; + NTSTATUS status; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hKeyedMutex = desc32->hKeyedMutex; + desc.Key = desc32->Key; + desc.FenceValue = desc32->FenceValue; + desc.pPrivateRuntimeData = UlongToHandle( desc32->pPrivateRuntimeData ); + desc.PrivateRuntimeDataSize = desc32->PrivateRuntimeDataSize; + status = NtGdiDdDDIReleaseKeyedMutex2( &desc ); + + return status; +} + NTSTATUS WINAPI wow64_NtGdiDdDDISetQueuedLimit( UINT *args ) { D3DKMT_SETQUEUEDLIMIT *desc = get_ptr( &args ); diff --git a/include/ddk/d3dkmthk.h b/include/ddk/d3dkmthk.h index 2650ff723aa..b072b16f1fc 100644 --- a/include/ddk/d3dkmthk.h +++ b/include/ddk/d3dkmthk.h @@ -878,6 +878,40 @@ typedef struct _D3DKMT_OPENKEYEDMUTEXFROMNTHANDLE UINT PrivateRuntimeDataSize; } D3DKMT_OPENKEYEDMUTEXFROMNTHANDLE;
+typedef struct _D3DKMT_ACQUIREKEYEDMUTEX +{ + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + LARGE_INTEGER *pTimeout; + UINT64 FenceValue; +} D3DKMT_ACQUIREKEYEDMUTEX; + +typedef struct _D3DKMT_RELEASEKEYEDMUTEX +{ + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + UINT64 FenceValue; +} D3DKMT_RELEASEKEYEDMUTEX; + +typedef struct _D3DKMT_ACQUIREKEYEDMUTEX2 +{ + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + LARGE_INTEGER *pTimeout; + UINT64 FenceValue; + VOID *pPrivateRuntimeData; + UINT PrivateRuntimeDataSize; +} D3DKMT_ACQUIREKEYEDMUTEX2; + +typedef struct _D3DKMT_RELEASEKEYEDMUTEX2 +{ + D3DKMT_HANDLE hKeyedMutex; + UINT64 Key; + UINT64 FenceValue; + VOID *pPrivateRuntimeData; + UINT PrivateRuntimeDataSize; +} D3DKMT_RELEASEKEYEDMUTEX2; + typedef struct _D3DKMT_OPENNTHANDLEFROMNAME { DWORD dwDesiredAccess; @@ -1295,6 +1329,8 @@ extern "C" { #endif /* __cplusplus */
+NTSTATUS WINAPI D3DKMTAcquireKeyedMutex( D3DKMT_ACQUIREKEYEDMUTEX *params ); +NTSTATUS WINAPI D3DKMTAcquireKeyedMutex2( D3DKMT_ACQUIREKEYEDMUTEX2 *params ); NTSTATUS WINAPI D3DKMTCheckOcclusion( const D3DKMT_CHECKOCCLUSION *desc ); NTSTATUS WINAPI D3DKMTCheckVidPnExclusiveOwnership(const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc); NTSTATUS WINAPI D3DKMTCloseAdapter(const D3DKMT_CLOSEADAPTER *desc); @@ -1334,6 +1370,8 @@ NTSTATUS WINAPI D3DKMTQueryResourceInfo( D3DKMT_QUERYRESOURCEINFO *params ); NTSTATUS WINAPI D3DKMTQueryResourceInfoFromNtHandle( D3DKMT_QUERYRESOURCEINFOFROMNTHANDLE *params ); NTSTATUS WINAPI D3DKMTQueryStatistics(D3DKMT_QUERYSTATISTICS *stats); NTSTATUS WINAPI D3DKMTQueryVideoMemoryInfo(D3DKMT_QUERYVIDEOMEMORYINFO *desc); +NTSTATUS WINAPI D3DKMTReleaseKeyedMutex( D3DKMT_RELEASEKEYEDMUTEX *params ); +NTSTATUS WINAPI D3DKMTReleaseKeyedMutex2( D3DKMT_RELEASEKEYEDMUTEX2 *params ); NTSTATUS WINAPI D3DKMTSetQueuedLimit(D3DKMT_SETQUEUEDLIMIT *desc); NTSTATUS WINAPI D3DKMTSetVidPnSourceOwner(const D3DKMT_SETVIDPNSOURCEOWNER *desc); NTSTATUS WINAPI D3DKMTShareObjects( UINT count, const D3DKMT_HANDLE *handles, OBJECT_ATTRIBUTES *attr, UINT access, HANDLE *handle ); diff --git a/include/ntgdi.h b/include/ntgdi.h index f073cf5ac61..d8fbfc6c8fd 100644 --- a/include/ntgdi.h +++ b/include/ntgdi.h @@ -514,6 +514,8 @@ W32KAPI BOOL WINAPI NtGdiUnrealizeObject( HGDIOBJ obj ); W32KAPI BOOL WINAPI NtGdiUpdateColors( HDC hdc ); W32KAPI BOOL WINAPI NtGdiWidenPath( HDC hdc );
+W32KAPI NTSTATUS WINAPI NtGdiDdDDIAcquireKeyedMutex( D3DKMT_ACQUIREKEYEDMUTEX *params ); +W32KAPI NTSTATUS WINAPI NtGdiDdDDIAcquireKeyedMutex2( D3DKMT_ACQUIREKEYEDMUTEX2 *params ); W32KAPI NTSTATUS WINAPI NtGdiDdDDICheckOcclusion( const D3DKMT_CHECKOCCLUSION *desc ); W32KAPI NTSTATUS WINAPI NtGdiDdDDICheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ); W32KAPI NTSTATUS WINAPI NtGdiDdDDICloseAdapter( const D3DKMT_CLOSEADAPTER *desc ); @@ -553,6 +555,8 @@ W32KAPI NTSTATUS WINAPI NtGdiDdDDIQueryResourceInfo( D3DKMT_QUERYRESOURCEINFO *p W32KAPI NTSTATUS WINAPI NtGdiDdDDIQueryResourceInfoFromNtHandle( D3DKMT_QUERYRESOURCEINFOFROMNTHANDLE *params ); W32KAPI NTSTATUS WINAPI NtGdiDdDDIQueryStatistics( D3DKMT_QUERYSTATISTICS *stats ); W32KAPI NTSTATUS WINAPI NtGdiDdDDIQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ); +W32KAPI NTSTATUS WINAPI NtGdiDdDDIReleaseKeyedMutex( D3DKMT_RELEASEKEYEDMUTEX *params ); +W32KAPI NTSTATUS WINAPI NtGdiDdDDIReleaseKeyedMutex2( D3DKMT_RELEASEKEYEDMUTEX2 *params ); W32KAPI NTSTATUS WINAPI NtGdiDdDDISetQueuedLimit( D3DKMT_SETQUEUEDLIMIT *desc ); W32KAPI NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ); W32KAPI NTSTATUS WINAPI NtGdiDdDDIShareObjects( UINT count, const D3DKMT_HANDLE *handles, OBJECT_ATTRIBUTES *attr, UINT access, HANDLE *handle );