- Annotate eng/device.c and semaphor.c.
- Get rid of IntGdiAcquire/ReleaseSemaphore
- Move some prototypes where they belong

svn path=/trunk/; revision=66647
This commit is contained in:
Timo Kreuzer 2015-03-10 00:13:04 +00:00
parent d33bc192ba
commit b673073aa1
7 changed files with 153 additions and 113 deletions

View file

@ -1581,10 +1581,13 @@ PATHOBJ*
APIENTRY APIENTRY
EngCreatePath(VOID); EngCreatePath(VOID);
__drv_allocatesMem(Mem)
_Post_writable_byte_size_(sizeof(ERESOURCE))
ENGAPI ENGAPI
HSEMAPHORE HSEMAPHORE
APIENTRY APIENTRY
EngCreateSemaphore(VOID); EngCreateSemaphore(
VOID);
/* EngCreateWnd.fl constants */ /* EngCreateWnd.fl constants */
#define WO_RGN_CLIENT_DELTA 0x00000001 #define WO_RGN_CLIENT_DELTA 0x00000001
@ -1667,13 +1670,14 @@ ENGAPI
VOID VOID
APIENTRY APIENTRY
EngDeleteSafeSemaphore( EngDeleteSafeSemaphore(
_Inout_ ENGSAFESEMAPHORE *pssem); _Inout_ _Post_invalid_ ENGSAFESEMAPHORE *pssem);
_Requires_lock_not_held_(*hsem)
ENGAPI ENGAPI
VOID VOID
APIENTRY APIENTRY
EngDeleteSemaphore( EngDeleteSemaphore(
_In_ _Post_ptr_invalid_ HSEMAPHORE hsem); _Inout_ __drv_freesMem(Mem) HSEMAPHORE hsem);
ENGAPI ENGAPI
BOOL BOOL
@ -2302,11 +2306,14 @@ APIENTRY
EngReadStateEvent( EngReadStateEvent(
_In_ PEVENT pEvent); _In_ PEVENT pEvent);
_Requires_lock_held_(*hsem)
_Releases_lock_(*hsem)
_Releases_lock_(_Global_critical_region_)
ENGAPI ENGAPI
VOID VOID
APIENTRY APIENTRY
EngReleaseSemaphore( EngReleaseSemaphore(
_In_ HSEMAPHORE hsem); _Inout_ HSEMAPHORE hsem);
#if defined(_M_AMD64) && (NTDDI_VERSION >= NTDDI_VISTA) #if defined(_M_AMD64) && (NTDDI_VERSION >= NTDDI_VISTA)
@ -3303,11 +3310,14 @@ EngRenderHint(
_In_ SIZE_T Length, _In_ SIZE_T Length,
_In_reads_bytes_opt_(Length) PVOID Data); _In_reads_bytes_opt_(Length) PVOID Data);
_Requires_lock_not_held_(*hsem)
_Acquires_exclusive_lock_(*hsem)
_Acquires_lock_(_Global_critical_region_)
ENGAPI ENGAPI
VOID VOID
APIENTRY APIENTRY
EngAcquireSemaphoreShared( EngAcquireSemaphore(
_In_ HSEMAPHORE hsem); _Inout_ HSEMAPHORE hsem);
ENGAPI ENGAPI
BOOL BOOL
@ -3315,11 +3325,14 @@ APIENTRY
EngAcquireSemaphoreNoWait( EngAcquireSemaphoreNoWait(
_In_ HSEMAPHORE hsem); _In_ HSEMAPHORE hsem);
_Acquires_lock_(_Global_critical_region_)
_Requires_lock_not_held_(*hsem)
_Acquires_shared_lock_(*hsem)
ENGAPI ENGAPI
BOOL VOID
APIENTRY NTAPI
EngAcquireSemaphoreSharedNoWait( EngAcquireSemaphoreShared(
_In_ HSEMAPHORE hsem); _Inout_ HSEMAPHORE hsem);
ENGAPI ENGAPI
BOOL BOOL

View file

@ -21,7 +21,7 @@ static ULONG giDevNum = 1;
INIT_FUNCTION INIT_FUNCTION
NTSTATUS NTSTATUS
NTAPI NTAPI
InitDeviceImpl() InitDeviceImpl(VOID)
{ {
ghsemGraphicsDeviceList = EngCreateSemaphore(); ghsemGraphicsDeviceList = EngCreateSemaphore();
if (!ghsemGraphicsDeviceList) if (!ghsemGraphicsDeviceList)
@ -34,10 +34,10 @@ InitDeviceImpl()
PGRAPHICS_DEVICE PGRAPHICS_DEVICE
NTAPI NTAPI
EngpRegisterGraphicsDevice( EngpRegisterGraphicsDevice(
PUNICODE_STRING pustrDeviceName, _In_ PUNICODE_STRING pustrDeviceName,
PUNICODE_STRING pustrDiplayDrivers, _In_ PUNICODE_STRING pustrDiplayDrivers,
PUNICODE_STRING pustrDescription, _In_ PUNICODE_STRING pustrDescription,
PDEVMODEW pdmDefault) _In_ PDEVMODEW pdmDefault)
{ {
PGRAPHICS_DEVICE pGraphicsDevice; PGRAPHICS_DEVICE pGraphicsDevice;
PDEVICE_OBJECT pDeviceObject; PDEVICE_OBJECT pDeviceObject;
@ -259,9 +259,9 @@ EngpRegisterGraphicsDevice(
PGRAPHICS_DEVICE PGRAPHICS_DEVICE
NTAPI NTAPI
EngpFindGraphicsDevice( EngpFindGraphicsDevice(
PUNICODE_STRING pustrDevice, _In_opt_ PUNICODE_STRING pustrDevice,
ULONG iDevNum, _In_ ULONG iDevNum,
DWORD dwFlags) _In_ DWORD dwFlags)
{ {
UNICODE_STRING ustrCurrent; UNICODE_STRING ustrCurrent;
PGRAPHICS_DEVICE pGraphicsDevice; PGRAPHICS_DEVICE pGraphicsDevice;
@ -305,12 +305,12 @@ EngpFindGraphicsDevice(
static static
NTSTATUS NTSTATUS
EngpFileIoRequest( EngpFileIoRequest(
PFILE_OBJECT pFileObject, _In_ PFILE_OBJECT pFileObject,
ULONG ulMajorFunction, _In_ ULONG ulMajorFunction,
LPVOID lpBuffer, _In_reads_(nBufferSize) PVOID lpBuffer,
SIZE_T nBufferSize, _In_ SIZE_T nBufferSize,
ULONGLONG ullStartOffset, _In_ ULONGLONG ullStartOffset,
OUT PULONG_PTR lpInformation) _Out_ PULONG_PTR lpInformation)
{ {
PDEVICE_OBJECT pDeviceObject; PDEVICE_OBJECT pDeviceObject;
KEVENT Event; KEVENT Event;
@ -363,29 +363,36 @@ EngpFileIoRequest(
VOID VOID
APIENTRY APIENTRY
EngFileWrite( EngFileWrite(
IN PFILE_OBJECT pFileObject, _In_ PFILE_OBJECT pFileObject,
IN PVOID lpBuffer, _In_reads_(nLength) PVOID lpBuffer,
IN SIZE_T nLength, _In_ SIZE_T nLength,
IN PSIZE_T lpBytesWritten) _Out_ PSIZE_T lpBytesWritten)
{ {
EngpFileIoRequest(pFileObject, NTSTATUS status;
IRP_MJ_WRITE,
lpBuffer, status = EngpFileIoRequest(pFileObject,
nLength, IRP_MJ_WRITE,
0, lpBuffer,
lpBytesWritten); nLength,
0,
lpBytesWritten);
if (!NT_SUCCESS(status))
{
*lpBytesWritten = 0;
}
} }
_Success_(return>=0)
NTSTATUS NTSTATUS
APIENTRY APIENTRY
EngFileIoControl( EngFileIoControl(
IN PFILE_OBJECT pFileObject, _In_ PFILE_OBJECT pFileObject,
IN DWORD dwIoControlCode, _In_ DWORD dwIoControlCode,
IN PVOID lpInBuffer, _In_reads_(nInBufferSize) PVOID lpInBuffer,
IN SIZE_T nInBufferSize, _In_ SIZE_T nInBufferSize,
OUT PVOID lpOutBuffer, _Out_writes_(nOutBufferSize) PVOID lpOutBuffer,
IN SIZE_T nOutBufferSize, _In_ SIZE_T nOutBufferSize,
OUT PULONG_PTR lpInformation) _Out_ PULONG_PTR lpInformation)
{ {
PDEVICE_OBJECT pDeviceObject; PDEVICE_OBJECT pDeviceObject;
KEVENT Event; KEVENT Event;

View file

@ -1,48 +1,36 @@
#pragma once
#define TAG_GDEV 'gdev' #define TAG_GDEV 'gdev'
extern PGRAPHICS_DEVICE gpPrimaryGraphicsDevice;
extern PGRAPHICS_DEVICE gpVgaGraphicsDevice;
VOID VOID
APIENTRY APIENTRY
EngFileWrite( EngFileWrite(
IN PFILE_OBJECT pFileObject, _In_ PFILE_OBJECT pFileObject,
IN PVOID lpBuffer, _In_reads_(nLength) PVOID lpBuffer,
IN SIZE_T nLength, _In_ SIZE_T nLength,
IN PSIZE_T lpBytesWritten); _Out_ PSIZE_T lpBytesWritten);
PGRAPHICS_DEVICE PGRAPHICS_DEVICE
NTAPI NTAPI
EngpFindGraphicsDevice( EngpFindGraphicsDevice(
PUNICODE_STRING pustrDevice, _In_opt_ PUNICODE_STRING pustrDevice,
DWORD iDevNum, _In_ ULONG iDevNum,
DWORD dwFlags); _In_ DWORD dwFlags);
PGRAPHICS_DEVICE PGRAPHICS_DEVICE
NTAPI NTAPI
EngpRegisterGraphicsDevice( EngpRegisterGraphicsDevice(
PUNICODE_STRING pustrDeviceName, _In_ PUNICODE_STRING pustrDeviceName,
PUNICODE_STRING pustrDiplayDrivers, _In_ PUNICODE_STRING pustrDiplayDrivers,
PUNICODE_STRING pustrDescription, _In_ PUNICODE_STRING pustrDescription,
PDEVMODEW pdmDefault); _In_ PDEVMODEW pdmDefault);
INIT_FUNCTION INIT_FUNCTION
NTSTATUS NTSTATUS
NTAPI NTAPI
InitDeviceImpl(VOID); InitDeviceImpl(VOID);
//#define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl(TAG('R', 'o', 's', 'D'), (PVOID)Frames, Count, NULL, 0, NULL, KernelMode)
NTSYSAPI ULONG APIENTRY RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags);
BOOL
NTAPI
PDEVOBJ_bSwitchMode(
PPDEVOBJ ppdev,
PDEVMODEW pdm);
PDEVMODEW
NTAPI
PDEVOBJ_pdmMatchDevMode(
PPDEVOBJ ppdev,
PDEVMODEW pdm);
extern PGRAPHICS_DEVICE gpPrimaryGraphicsDevice;
extern PGRAPHICS_DEVICE gpVgaGraphicsDevice;

View file

@ -6,10 +6,15 @@ extern const BYTE gajRop2ToRop3[16];
(((ULONG)gajRop2ToRop3[((mix) - 1) & 0xF]) | \ (((ULONG)gajRop2ToRop3[((mix) - 1) & 0xF]) | \
((ULONG)gajRop2ToRop3[(((mix) >> 8) - 1) & 0xF] << 8)) ((ULONG)gajRop2ToRop3[(((mix) >> 8) - 1) & 0xF] << 8))
/* Copied from winddi.h, where it is only for vista+ */
_Acquires_lock_(_Global_critical_region_)
_Requires_lock_not_held_(*hsem)
_Acquires_shared_lock_(*hsem)
ENGAPI
VOID VOID
NTAPI NTAPI
EngAcquireSemaphoreShared( EngAcquireSemaphoreShared(
IN HSEMAPHORE hsem); _Inout_ HSEMAPHORE hsem);
BOOL BOOL
APIENTRY APIENTRY
@ -24,17 +29,27 @@ IntEngMaskBlt(
_In_ BRUSHOBJ *pbo, _In_ BRUSHOBJ *pbo,
_In_ POINTL *pptlBrushOrg); _In_ POINTL *pptlBrushOrg);
VOID FASTCALL VOID
FASTCALL
IntEngWindowChanged( IntEngWindowChanged(
_In_ PWND Window, _In_ PWND Window,
_In_ FLONG flChanged); _In_ FLONG flChanged);
VOID FASTCALL IntGdiAcquireSemaphore ( HSEMAPHORE hsem ); ULONGLONG
VOID FASTCALL IntGdiReleaseSemaphore ( HSEMAPHORE hsem ); APIENTRY
ULONGLONG APIENTRY EngGetTickCount(VOID); EngGetTickCount(
VOID);
VOID DecompressBitmap(SIZEL Size, BYTE *CompressedBits, BYTE *UncompressedBits, LONG Delta, ULONG iFormat);
HANDLE HANDLE
APIENTRY APIENTRY
EngSecureMemForRead(PVOID Address, ULONG Length); EngSecureMemForRead(
PVOID Address,
ULONG Length);
VOID
DecompressBitmap(
SIZEL Size,
BYTE *CompressedBits,
BYTE *UncompressedBits,
LONG Delta,
ULONG iFormat);

View file

@ -189,4 +189,16 @@ PDEVOBJ_sizl(
_In_ PPDEVOBJ ppdev, _In_ PPDEVOBJ ppdev,
_Out_ PSIZEL psizl); _Out_ PSIZEL psizl);
BOOL
NTAPI
PDEVOBJ_bSwitchMode(
PPDEVOBJ ppdev,
PDEVMODEW pdm);
PDEVMODEW
NTAPI
PDEVOBJ_pdmMatchDevMode(
PPDEVOBJ ppdev,
PDEVMODEW pdm);
#endif /* !__WIN32K_PDEVOBJ_H */ #endif /* !__WIN32K_PDEVOBJ_H */

View file

@ -6,12 +6,17 @@
/* /*
* @implemented * @implemented
*/ */
__drv_allocatesMem(Mem)
_Post_writable_byte_size_(sizeof(ERESOURCE))
HSEMAPHORE HSEMAPHORE
APIENTRY APIENTRY
EngCreateSemaphore(VOID) EngCreateSemaphore(
VOID)
{ {
// www.osr.com/ddk/graphics/gdifncs_95lz.htm // www.osr.com/ddk/graphics/gdifncs_95lz.htm
PERESOURCE psem = ExAllocatePoolWithTag(NonPagedPool, sizeof(ERESOURCE), GDITAG_SEMAPHORE); PERESOURCE psem = ExAllocatePoolWithTag(NonPagedPool,
sizeof(ERESOURCE),
GDITAG_SEMAPHORE);
if (!psem) if (!psem)
return NULL; return NULL;
@ -24,57 +29,51 @@ EngCreateSemaphore(VOID)
return (HSEMAPHORE)psem; return (HSEMAPHORE)psem;
} }
VOID
FASTCALL
IntGdiAcquireSemaphore(HSEMAPHORE hsem)
{
KeEnterCriticalRegion();
ExAcquireResourceExclusiveLite ((PERESOURCE)hsem, TRUE);
}
/* /*
* @implemented * @implemented
*/ */
_Requires_lock_not_held_(*hsem)
_Acquires_exclusive_lock_(*hsem)
_Acquires_lock_(_Global_critical_region_)
VOID VOID
APIENTRY APIENTRY
EngAcquireSemaphore(IN HSEMAPHORE hsem) EngAcquireSemaphore(
_Inout_ HSEMAPHORE hsem)
{ {
// www.osr.com/ddk/graphics/gdifncs_14br.htm // www.osr.com/ddk/graphics/gdifncs_14br.htm
PTHREADINFO W32Thread; PTHREADINFO W32Thread;
ASSERT(hsem); ASSERT(hsem);
IntGdiAcquireSemaphore(hsem); ExEnterCriticalRegionAndAcquireResourceExclusive((PERESOURCE)hsem);
W32Thread = PsGetThreadWin32Thread(PsGetCurrentThread()); W32Thread = PsGetThreadWin32Thread(PsGetCurrentThread());
if (W32Thread) W32Thread->dwEngAcquireCount++; if (W32Thread) W32Thread->dwEngAcquireCount++;
} }
VOID
FASTCALL
IntGdiReleaseSemaphore ( HSEMAPHORE hsem )
{
ExReleaseResourceLite((PERESOURCE)hsem);
KeLeaveCriticalRegion();
}
/* /*
* @implemented * @implemented
*/ */
_Requires_lock_held_(*hsem)
_Releases_lock_(*hsem)
_Releases_lock_(_Global_critical_region_)
VOID VOID
APIENTRY APIENTRY
EngReleaseSemaphore ( IN HSEMAPHORE hsem ) EngReleaseSemaphore(
_Inout_ HSEMAPHORE hsem)
{ {
// www.osr.com/ddk/graphics/gdifncs_5u3r.htm // www.osr.com/ddk/graphics/gdifncs_5u3r.htm
PTHREADINFO W32Thread; PTHREADINFO W32Thread;
ASSERT(hsem); ASSERT(hsem);
W32Thread = PsGetThreadWin32Thread(PsGetCurrentThread()); W32Thread = PsGetThreadWin32Thread(PsGetCurrentThread());
if (W32Thread) --W32Thread->dwEngAcquireCount; if (W32Thread) --W32Thread->dwEngAcquireCount;
IntGdiReleaseSemaphore(hsem); ExReleaseResourceAndLeaveCriticalRegion((PERESOURCE)hsem);
} }
_Acquires_lock_(_Global_critical_region_)
_Requires_lock_not_held_(*hsem)
_Acquires_shared_lock_(*hsem)
VOID VOID
NTAPI NTAPI
EngAcquireSemaphoreShared( EngAcquireSemaphoreShared(
IN HSEMAPHORE hsem) _Inout_ HSEMAPHORE hsem)
{ {
PTHREADINFO pti; PTHREADINFO pti;
@ -87,9 +86,11 @@ EngAcquireSemaphoreShared(
/* /*
* @implemented * @implemented
*/ */
_Requires_lock_not_held_(*hsem)
VOID VOID
APIENTRY APIENTRY
EngDeleteSemaphore ( IN HSEMAPHORE hsem ) EngDeleteSemaphore(
_Inout_ __drv_freesMem(Mem) HSEMAPHORE hsem)
{ {
// www.osr.com/ddk/graphics/gdifncs_13c7.htm // www.osr.com/ddk/graphics/gdifncs_13c7.htm
ASSERT(hsem); ASSERT(hsem);
@ -103,7 +104,8 @@ EngDeleteSemaphore ( IN HSEMAPHORE hsem )
*/ */
BOOL BOOL
APIENTRY APIENTRY
EngIsSemaphoreOwned ( IN HSEMAPHORE hsem ) EngIsSemaphoreOwned(
_In_ HSEMAPHORE hsem)
{ {
// www.osr.com/ddk/graphics/gdifncs_6wmf.htm // www.osr.com/ddk/graphics/gdifncs_6wmf.htm
ASSERT(hsem); ASSERT(hsem);
@ -115,7 +117,8 @@ EngIsSemaphoreOwned ( IN HSEMAPHORE hsem )
*/ */
BOOL BOOL
APIENTRY APIENTRY
EngIsSemaphoreOwnedByCurrentThread ( IN HSEMAPHORE hsem ) EngIsSemaphoreOwnedByCurrentThread(
_In_ HSEMAPHORE hsem)
{ {
// www.osr.com/ddk/graphics/gdifncs_9yxz.htm // www.osr.com/ddk/graphics/gdifncs_9yxz.htm
ASSERT(hsem); ASSERT(hsem);
@ -125,9 +128,10 @@ EngIsSemaphoreOwnedByCurrentThread ( IN HSEMAPHORE hsem )
/* /*
* @implemented * @implemented
*/ */
BOOL APIENTRY BOOL
APIENTRY
EngInitializeSafeSemaphore( EngInitializeSafeSemaphore(
OUT ENGSAFESEMAPHORE *Semaphore) _Out_ ENGSAFESEMAPHORE *Semaphore)
{ {
HSEMAPHORE hSem; HSEMAPHORE hSem;
@ -158,15 +162,16 @@ EngInitializeSafeSemaphore(
/* /*
* @implemented * @implemented
*/ */
VOID APIENTRY VOID
APIENTRY
EngDeleteSafeSemaphore( EngDeleteSafeSemaphore(
IN OUT ENGSAFESEMAPHORE *Semaphore) _Inout_ _Post_invalid_ ENGSAFESEMAPHORE *pssem)
{ {
if (InterlockedDecrement(&Semaphore->lCount) == 0) if (InterlockedDecrement(&pssem->lCount) == 0)
{ {
/* FIXME: Not thread-safe! Use result of InterlockedCompareExchangePointer! */ /* FIXME: Not thread-safe! Use result of InterlockedCompareExchangePointer! */
EngDeleteSemaphore(Semaphore->hsem); EngDeleteSemaphore(pssem->hsem);
(void)InterlockedExchangePointer((volatile PVOID *)&Semaphore->hsem, NULL); (void)InterlockedExchangePointer((volatile PVOID *)&pssem->hsem, NULL);
} }
} }

View file

@ -180,7 +180,7 @@ DxEngLockShareSem()
{ {
DPRINT1("ReactX Calling : DxEngLockShareSem\n"); DPRINT1("ReactX Calling : DxEngLockShareSem\n");
if(!ghsemShareDevLock) ghsemShareDevLock = EngCreateSemaphore(); // Hax, should be in dllmain.c if(!ghsemShareDevLock) ghsemShareDevLock = EngCreateSemaphore(); // Hax, should be in dllmain.c
IntGdiAcquireSemaphore(ghsemShareDevLock); EngAcquireSemaphore(ghsemShareDevLock);
return TRUE; return TRUE;
} }
@ -202,7 +202,7 @@ APIENTRY
DxEngUnlockShareSem() DxEngUnlockShareSem()
{ {
DPRINT1("ReactX Calling : DxEngUnlockShareSem\n"); DPRINT1("ReactX Calling : DxEngUnlockShareSem\n");
IntGdiReleaseSemaphore(ghsemShareDevLock); EngReleaseSemaphore(ghsemShareDevLock);
return TRUE; return TRUE;
} }