From: Jacek Caban jacek@codeweavers.com
--- dlls/win32u/gdiobj.c | 10 -- dlls/win32u/syscall.c | 10 ++ dlls/win32u/win32u.spec | 20 ++-- dlls/win32u/win32u_private.h | 10 -- dlls/win32u/wrappers.c | 60 ------------ dlls/wow64win/gdi.c | 183 ++++++++++++++++++++++++++++++++++- dlls/wow64win/syscall.h | 10 ++ 7 files changed, 212 insertions(+), 91 deletions(-)
diff --git a/dlls/win32u/gdiobj.c b/dlls/win32u/gdiobj.c index 93c20f5cac0..d882f0dd009 100644 --- a/dlls/win32u/gdiobj.c +++ b/dlls/win32u/gdiobj.c @@ -1033,16 +1033,6 @@ static struct unix_funcs unix_funcs = NtGdiCreateCompatibleDC, NtGdiCreateDIBitmapInternal, NtGdiCreateMetafileDC, - NtGdiDdDDICheckVidPnExclusiveOwnership, - NtGdiDdDDICloseAdapter, - NtGdiDdDDICreateDCFromMemory, - NtGdiDdDDIDestroyDCFromMemory, - NtGdiDdDDIDestroyDevice, - NtGdiDdDDIEscape, - NtGdiDdDDIOpenAdapterFromDeviceName, - NtGdiDdDDIOpenAdapterFromLuid, - NtGdiDdDDIQueryVideoMemoryInfo, - NtGdiDdDDISetVidPnSourceOwner, NtGdiDeleteObjectApp, NtGdiDoPalette, NtGdiEnumFonts, diff --git a/dlls/win32u/syscall.c b/dlls/win32u/syscall.c index 56298cd7697..7a5f116b69e 100644 --- a/dlls/win32u/syscall.c +++ b/dlls/win32u/syscall.c @@ -62,10 +62,20 @@ static void * const syscalls[] = NtGdiCreateRectRgn, NtGdiCreateRoundRectRgn, NtGdiCreateSolidBrush, + NtGdiDdDDICheckVidPnExclusiveOwnership, + NtGdiDdDDICloseAdapter, + NtGdiDdDDICreateDCFromMemory, NtGdiDdDDICreateDevice, + NtGdiDdDDIDestroyDCFromMemory, + NtGdiDdDDIDestroyDevice, + NtGdiDdDDIEscape, + NtGdiDdDDIOpenAdapterFromDeviceName, NtGdiDdDDIOpenAdapterFromHdc, + NtGdiDdDDIOpenAdapterFromLuid, NtGdiDdDDIQueryStatistics, + NtGdiDdDDIQueryVideoMemoryInfo, NtGdiDdDDISetQueuedLimit, + NtGdiDdDDISetVidPnSourceOwner, NtGdiDeleteClientObj, NtGdiDescribePixelFormat, NtGdiDrawStream, diff --git a/dlls/win32u/win32u.spec b/dlls/win32u/win32u.spec index 53066822bd6..9d1e445bfb1 100644 --- a/dlls/win32u/win32u.spec +++ b/dlls/win32u/win32u.spec @@ -186,14 +186,14 @@ @ stub NtGdiDdDDICheckMultiPlaneOverlaySupport3 @ stub NtGdiDdDDICheckOcclusion @ stub NtGdiDdDDICheckSharedResourceAccess -@ stdcall NtGdiDdDDICheckVidPnExclusiveOwnership(ptr) -@ stdcall NtGdiDdDDICloseAdapter(ptr) +@ stdcall -syscall NtGdiDdDDICheckVidPnExclusiveOwnership(ptr) +@ stdcall -syscall NtGdiDdDDICloseAdapter(ptr) @ stub NtGdiDdDDIConfigureSharedResource @ stub NtGdiDdDDICreateAllocation @ stub NtGdiDdDDICreateBundleObject @ stub NtGdiDdDDICreateContext @ stub NtGdiDdDDICreateContextVirtual -@ stdcall NtGdiDdDDICreateDCFromMemory(ptr) +@ stdcall -syscall NtGdiDdDDICreateDCFromMemory(ptr) @ stdcall -syscall NtGdiDdDDICreateDevice(ptr) @ stub NtGdiDdDDICreateHwContext @ stub NtGdiDdDDICreateHwQueue @@ -209,8 +209,8 @@ @ stub NtGdiDdDDIDestroyAllocation @ stub NtGdiDdDDIDestroyAllocation2 @ stub NtGdiDdDDIDestroyContext -@ stdcall NtGdiDdDDIDestroyDCFromMemory(ptr) -@ stdcall NtGdiDdDDIDestroyDevice(ptr) +@ stdcall -syscall NtGdiDdDDIDestroyDCFromMemory(ptr) +@ stdcall -syscall NtGdiDdDDIDestroyDevice(ptr) @ stub NtGdiDdDDIDestroyHwContext @ stub NtGdiDdDDIDestroyHwQueue @ stub NtGdiDdDDIDestroyKeyedMutex @@ -224,7 +224,7 @@ @ stub NtGdiDdDDIDispMgrTargetOperation @ stub NtGdiDdDDIEnumAdapters @ stub NtGdiDdDDIEnumAdapters2 -@ stdcall NtGdiDdDDIEscape(ptr) +@ stdcall -syscall NtGdiDdDDIEscape(ptr) @ stub NtGdiDdDDIEvict @ stub NtGdiDdDDIExtractBundleObject @ stub NtGdiDdDDIFlipOverlay @@ -268,9 +268,9 @@ @ stub NtGdiDdDDINetDispStartMiracastDisplayDevice @ stub NtGdiDdDDINetDispStopMiracastDisplayDevice @ stub NtGdiDdDDIOfferAllocations -@ stdcall NtGdiDdDDIOpenAdapterFromDeviceName(ptr) +@ stdcall -syscall NtGdiDdDDIOpenAdapterFromDeviceName(ptr) @ stdcall -syscall NtGdiDdDDIOpenAdapterFromHdc(ptr) -@ stdcall NtGdiDdDDIOpenAdapterFromLuid(ptr) +@ stdcall -syscall NtGdiDdDDIOpenAdapterFromLuid(ptr) @ stub NtGdiDdDDIOpenBundleObjectNtHandleFromName @ stub NtGdiDdDDIOpenKeyedMutex @ stub NtGdiDdDDIOpenKeyedMutex2 @@ -307,7 +307,7 @@ @ stub NtGdiDdDDIQueryResourceInfoFromNtHandle @ stdcall -syscall NtGdiDdDDIQueryStatistics(ptr) @ stub NtGdiDdDDIQueryVidPnExclusiveOwnership -@ stdcall NtGdiDdDDIQueryVideoMemoryInfo(ptr) +@ stdcall -syscall NtGdiDdDDIQueryVideoMemoryInfo(ptr) @ stub NtGdiDdDDIReclaimAllocations @ stub NtGdiDdDDIReclaimAllocations2 @ stub NtGdiDdDDIReleaseKeyedMutex @@ -335,7 +335,7 @@ @ stub NtGdiDdDDISetStereoEnabled @ stub NtGdiDdDDISetSyncRefreshCountWaitTarget @ stub NtGdiDdDDISetVidPnSourceHwProtection -@ stdcall NtGdiDdDDISetVidPnSourceOwner(ptr) +@ stdcall -syscall NtGdiDdDDISetVidPnSourceOwner(ptr) @ stub NtGdiDdDDISetYieldPercentage @ stub NtGdiDdDDIShareObjects @ stub NtGdiDdDDISharedPrimaryLockNotification diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index 926bacb7db5..d5415092232 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -41,16 +41,6 @@ struct unix_funcs UINT coloruse, UINT max_info, UINT max_bits, ULONG flags, HANDLE xform ); HDC (WINAPI *pNtGdiCreateMetafileDC)( HDC hdc ); - NTSTATUS (WINAPI *pNtGdiDdDDICheckVidPnExclusiveOwnership)( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ); - NTSTATUS (WINAPI *pNtGdiDdDDICloseAdapter)( const D3DKMT_CLOSEADAPTER *desc ); - NTSTATUS (WINAPI *pNtGdiDdDDICreateDCFromMemory)( D3DKMT_CREATEDCFROMMEMORY *desc ); - NTSTATUS (WINAPI *pNtGdiDdDDIDestroyDCFromMemory)( const D3DKMT_DESTROYDCFROMMEMORY *desc ); - NTSTATUS (WINAPI *pNtGdiDdDDIDestroyDevice)( const D3DKMT_DESTROYDEVICE *desc ); - NTSTATUS (WINAPI *pNtGdiDdDDIEscape)( const D3DKMT_ESCAPE *desc ); - NTSTATUS (WINAPI *pNtGdiDdDDIOpenAdapterFromDeviceName)( D3DKMT_OPENADAPTERFROMDEVICENAME *desc ); - NTSTATUS (WINAPI *pNtGdiDdDDIOpenAdapterFromLuid)( D3DKMT_OPENADAPTERFROMLUID *desc ); - NTSTATUS (WINAPI *pNtGdiDdDDIQueryVideoMemoryInfo)( D3DKMT_QUERYVIDEOMEMORYINFO *desc ); - NTSTATUS (WINAPI *pNtGdiDdDDISetVidPnSourceOwner)( const D3DKMT_SETVIDPNSOURCEOWNER *desc ); BOOL (WINAPI *pNtGdiDeleteObjectApp)( HGDIOBJ obj ); LONG (WINAPI *pNtGdiDoPalette)( HGDIOBJ handle, WORD start, WORD count, void *entries, DWORD func, BOOL inbound ); diff --git a/dlls/win32u/wrappers.c b/dlls/win32u/wrappers.c index 4f51dbd2206..7f2dae040cf 100644 --- a/dlls/win32u/wrappers.c +++ b/dlls/win32u/wrappers.c @@ -375,66 +375,6 @@ BOOL WINAPI NtGdiUpdateColors( HDC hdc ) return unix_funcs->pNtGdiUpdateColors( hdc ); }
-NTSTATUS WINAPI NtGdiDdDDICheckVidPnExclusiveOwnership( const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc ) -{ - if (!unix_funcs) return STATUS_NOT_SUPPORTED; - return unix_funcs->pNtGdiDdDDICheckVidPnExclusiveOwnership( desc ); -} - -NTSTATUS WINAPI NtGdiDdDDICloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) -{ - if (!unix_funcs) return STATUS_NOT_SUPPORTED; - return unix_funcs->pNtGdiDdDDICloseAdapter( desc ); -} - -NTSTATUS WINAPI NtGdiDdDDICreateDCFromMemory( D3DKMT_CREATEDCFROMMEMORY *desc ) -{ - if (!unix_funcs) return STATUS_NOT_SUPPORTED; - return unix_funcs->pNtGdiDdDDICreateDCFromMemory( desc ); -} - -NTSTATUS WINAPI NtGdiDdDDIDestroyDCFromMemory( const D3DKMT_DESTROYDCFROMMEMORY *desc ) -{ - if (!unix_funcs) return STATUS_NOT_SUPPORTED; - return unix_funcs->pNtGdiDdDDIDestroyDCFromMemory( desc ); -} - -NTSTATUS WINAPI NtGdiDdDDIDestroyDevice( const D3DKMT_DESTROYDEVICE *desc ) -{ - if (!unix_funcs) return STATUS_NOT_SUPPORTED; - return unix_funcs->pNtGdiDdDDIDestroyDevice( desc ); -} - -NTSTATUS WINAPI NtGdiDdDDIEscape( const D3DKMT_ESCAPE *desc ) -{ - if (!unix_funcs) return STATUS_NOT_SUPPORTED; - return unix_funcs->pNtGdiDdDDIEscape( desc ); -} - -NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromDeviceName( D3DKMT_OPENADAPTERFROMDEVICENAME *desc ) -{ - if (!unix_funcs) return STATUS_NOT_SUPPORTED; - return unix_funcs->pNtGdiDdDDIOpenAdapterFromDeviceName( desc ); -} - -NTSTATUS WINAPI NtGdiDdDDIOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc ) -{ - if (!unix_funcs) return STATUS_NOT_SUPPORTED; - return unix_funcs->pNtGdiDdDDIOpenAdapterFromLuid( desc ); -} - -NTSTATUS WINAPI NtGdiDdDDIQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ) -{ - if (!unix_funcs) return STATUS_NOT_SUPPORTED; - return unix_funcs->pNtGdiDdDDIQueryVideoMemoryInfo( desc ); -} - -NTSTATUS WINAPI NtGdiDdDDISetVidPnSourceOwner( const D3DKMT_SETVIDPNSOURCEOWNER *desc ) -{ - if (!unix_funcs) return STATUS_NOT_SUPPORTED; - return unix_funcs->pNtGdiDdDDISetVidPnSourceOwner( desc ); -} - BOOL WINAPI NtUserDrawCaptionTemp( HWND hwnd, HDC hdc, const RECT *rect, HFONT font, HICON icon, const WCHAR *str, UINT flags ) { diff --git a/dlls/wow64win/gdi.c b/dlls/wow64win/gdi.c index 0edb41fc444..36737b23e61 100644 --- a/dlls/wow64win/gdi.c +++ b/dlls/wow64win/gdi.c @@ -333,6 +333,55 @@ NTSTATUS WINAPI wow64_NtGdiCreateSolidBrush( UINT *args ) return HandleToUlong( NtGdiCreateSolidBrush( color, brush )); }
+NTSTATUS WINAPI wow64_NtGdiDdDDICheckVidPnExclusiveOwnership( UINT *args ) +{ + const D3DKMT_CHECKVIDPNEXCLUSIVEOWNERSHIP *desc = get_ptr( &args ); + + return NtGdiDdDDICheckVidPnExclusiveOwnership( desc ); +} + +NTSTATUS WINAPI wow64_NtGdiDdDDICloseAdapter( UINT *args ) +{ + const D3DKMT_CLOSEADAPTER *desc = get_ptr( &args ); + + return NtGdiDdDDICloseAdapter( desc ); +} + +NTSTATUS WINAPI wow64_NtGdiDdDDICreateDCFromMemory( UINT *args ) +{ + struct _D3DKMT_CREATEDCFROMMEMORY + { + ULONG pMemory; + D3DDDIFORMAT Format; + UINT Width; + UINT Height; + UINT Pitch; + ULONG hDeviceDc; + ULONG pColorTable; + ULONG hDc; + ULONG hBitmap; + } *desc32 = get_ptr( &args ); + + D3DKMT_CREATEDCFROMMEMORY desc; + NTSTATUS status; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.pMemory = UlongToPtr( desc32->pMemory ); + desc.Format = desc32->Format; + desc.Width = desc32->Width; + desc.Height = desc32->Height; + desc.Pitch = desc32->Pitch; + desc.hDeviceDc = UlongToHandle( desc32->hDeviceDc ); + desc.pColorTable = UlongToPtr( desc32->pColorTable ); + + if (!(status = NtGdiDdDDICreateDCFromMemory( &desc ))) + { + desc32->hDc = HandleToUlong( desc.hDc ); + desc32->hBitmap = HandleToUlong( desc.hBitmap ); + } + return status; +} + NTSTATUS WINAPI wow64_NtGdiDdDDICreateDevice( UINT *args ) { struct @@ -365,6 +414,77 @@ NTSTATUS WINAPI wow64_NtGdiDdDDICreateDevice( UINT *args ) return status; }
+NTSTATUS WINAPI wow64_NtGdiDdDDIDestroyDCFromMemory( UINT *args ) +{ + const struct + { + ULONG hDc; + ULONG hBitmap; + } *desc32 = get_ptr( &args ); + D3DKMT_DESTROYDCFROMMEMORY desc; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hDc = UlongToHandle( desc32->hDc ); + desc.hBitmap = UlongToHandle( desc32->hBitmap ); + + return NtGdiDdDDIDestroyDCFromMemory( &desc ); +} + +NTSTATUS WINAPI wow64_NtGdiDdDDIDestroyDevice( UINT *args ) +{ + const D3DKMT_DESTROYDEVICE *desc = get_ptr( &args ); + + return NtGdiDdDDIDestroyDevice( desc ); +} + +NTSTATUS WINAPI wow64_NtGdiDdDDIEscape( UINT *args ) +{ + const struct + { + D3DKMT_HANDLE hAdapter; + D3DKMT_HANDLE hDevice; + D3DKMT_ESCAPETYPE Type; + D3DDDI_ESCAPEFLAGS Flags; + ULONG pPrivateDriverData; + UINT PrivateDriverDataSize; + D3DKMT_HANDLE hContext; + } *desc32 = get_ptr( &args ); + D3DKMT_ESCAPE desc; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hAdapter = desc32->hAdapter; + desc.hDevice = desc32->hDevice; + desc.Type = desc32->Type; + desc.Flags = desc32->Flags; + desc.pPrivateDriverData = UlongToPtr( desc32->pPrivateDriverData ); + desc.PrivateDriverDataSize = desc32->PrivateDriverDataSize; + desc.hContext = desc32->hContext; + + return NtGdiDdDDIEscape( &desc ); +} + +NTSTATUS WINAPI wow64_NtGdiDdDDIOpenAdapterFromDeviceName( UINT *args ) +{ + struct _D3DKMT_OPENADAPTERFROMDEVICENAME + { + ULONG pDeviceName; + D3DKMT_HANDLE hAdapter; + LUID AdapterLuid; + } *desc32 = get_ptr( &args ); + D3DKMT_OPENADAPTERFROMDEVICENAME desc; + NTSTATUS status; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.pDeviceName = UlongToPtr( desc32->pDeviceName ); + + if (!(status = NtGdiDdDDIOpenAdapterFromDeviceName( &desc ))) + { + desc32->hAdapter = desc.hAdapter; + desc32->AdapterLuid = desc.AdapterLuid; + } + return status; +} + NTSTATUS WINAPI wow64_NtGdiDdDDIOpenAdapterFromHdc( UINT *args ) { struct @@ -375,9 +495,11 @@ NTSTATUS WINAPI wow64_NtGdiDdDDIOpenAdapterFromHdc( UINT *args ) D3DDDI_VIDEO_PRESENT_SOURCE_ID VidPnSourceId; } *desc32 = get_ptr( &args );
- D3DKMT_OPENADAPTERFROMHDC desc = { UlongToHandle( desc32->hDc ) }; + D3DKMT_OPENADAPTERFROMHDC desc; NTSTATUS status;
+ if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hDc = UlongToHandle( desc32->hDc ); if (!(status = NtGdiDdDDIOpenAdapterFromHdc( &desc ))) { desc32->hAdapter = desc.hAdapter; @@ -387,6 +509,13 @@ NTSTATUS WINAPI wow64_NtGdiDdDDIOpenAdapterFromHdc( UINT *args ) return status; }
+NTSTATUS WINAPI wow64_NtGdiDdDDIOpenAdapterFromLuid( UINT *args ) +{ + D3DKMT_OPENADAPTERFROMLUID *desc = get_ptr( &args ); + + return NtGdiDdDDIOpenAdapterFromLuid( desc ); +} + NTSTATUS WINAPI wow64_NtGdiDdDDIQueryStatistics( UINT *args ) { D3DKMT_QUERYSTATISTICS *stats = get_ptr( &args ); @@ -394,6 +523,38 @@ NTSTATUS WINAPI wow64_NtGdiDdDDIQueryStatistics( UINT *args ) return NtGdiDdDDIQueryStatistics( stats ); }
+NTSTATUS WINAPI wow64_NtGdiDdDDIQueryVideoMemoryInfo( UINT *args ) +{ + struct _D3DKMT_QUERYVIDEOMEMORYINFO + { + ULONG hProcess; + D3DKMT_HANDLE hAdapter; + D3DKMT_MEMORY_SEGMENT_GROUP MemorySegmentGroup; + UINT64 Budget; + UINT64 CurrentUsage; + UINT64 CurrentReservation; + UINT64 AvailableForReservation; + UINT PhysicalAdapterIndex; + } *desc32 = get_ptr( &args ); + D3DKMT_QUERYVIDEOMEMORYINFO desc; + NTSTATUS status; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hProcess = LongToHandle( desc32->hProcess ); + desc.hAdapter = desc32->hAdapter; + desc.MemorySegmentGroup = desc32->MemorySegmentGroup; + desc.PhysicalAdapterIndex = desc32->PhysicalAdapterIndex; + + if (!(status = NtGdiDdDDIQueryVideoMemoryInfo( &desc ))) + { + desc32->Budget = desc.Budget; + desc32->CurrentUsage = desc.CurrentUsage; + desc32->CurrentReservation = desc.CurrentReservation; + desc32->AvailableForReservation = desc.AvailableForReservation; + } + return status; +} + NTSTATUS WINAPI wow64_NtGdiDdDDISetQueuedLimit( UINT *args ) { D3DKMT_SETQUEUEDLIMIT *desc = get_ptr( &args ); @@ -401,6 +562,26 @@ NTSTATUS WINAPI wow64_NtGdiDdDDISetQueuedLimit( UINT *args ) return NtGdiDdDDISetQueuedLimit( desc ); }
+NTSTATUS WINAPI wow64_NtGdiDdDDISetVidPnSourceOwner( UINT *args ) +{ + const struct + { + D3DKMT_HANDLE hDevice; + ULONG pType; + ULONG pVidPnSourceId; + UINT VidPnSourceCount; + } *desc32 = get_ptr( &args ); + D3DKMT_SETVIDPNSOURCEOWNER desc; + + if (!desc32) return STATUS_INVALID_PARAMETER; + desc.hDevice = desc32->hDevice; + desc.pType = UlongToPtr( desc32->pType ); + desc.pVidPnSourceId = UlongToPtr( desc32->pVidPnSourceId ); + desc.VidPnSourceCount = desc32->VidPnSourceCount; + + return NtGdiDdDDISetVidPnSourceOwner( &desc ); +} + NTSTATUS WINAPI wow64_NtGdiDeleteClientObj( UINT *args ) { HGDIOBJ obj = get_handle( &args ); diff --git a/dlls/wow64win/syscall.h b/dlls/wow64win/syscall.h index dfbe2129556..ea9e5043b1a 100644 --- a/dlls/wow64win/syscall.h +++ b/dlls/wow64win/syscall.h @@ -48,10 +48,20 @@ SYSCALL_ENTRY( NtGdiCreateRectRgn ) \ SYSCALL_ENTRY( NtGdiCreateRoundRectRgn ) \ SYSCALL_ENTRY( NtGdiCreateSolidBrush ) \ + SYSCALL_ENTRY( NtGdiDdDDICheckVidPnExclusiveOwnership ) \ + SYSCALL_ENTRY( NtGdiDdDDICloseAdapter ) \ + SYSCALL_ENTRY( NtGdiDdDDICreateDCFromMemory ) \ SYSCALL_ENTRY( NtGdiDdDDICreateDevice ) \ + SYSCALL_ENTRY( NtGdiDdDDIDestroyDCFromMemory ) \ + SYSCALL_ENTRY( NtGdiDdDDIDestroyDevice ) \ + SYSCALL_ENTRY( NtGdiDdDDIEscape ) \ + SYSCALL_ENTRY( NtGdiDdDDIOpenAdapterFromDeviceName ) \ SYSCALL_ENTRY( NtGdiDdDDIOpenAdapterFromHdc ) \ + SYSCALL_ENTRY( NtGdiDdDDIOpenAdapterFromLuid ) \ SYSCALL_ENTRY( NtGdiDdDDIQueryStatistics ) \ + SYSCALL_ENTRY( NtGdiDdDDIQueryVideoMemoryInfo ) \ SYSCALL_ENTRY( NtGdiDdDDISetQueuedLimit ) \ + SYSCALL_ENTRY( NtGdiDdDDISetVidPnSourceOwner ) \ SYSCALL_ENTRY( NtGdiDeleteClientObj ) \ SYSCALL_ENTRY( NtGdiDescribePixelFormat ) \ SYSCALL_ENTRY( NtGdiDrawStream ) \