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

View file

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

View file

@ -1,48 +1,36 @@
#pragma once
#define TAG_GDEV 'gdev'
extern PGRAPHICS_DEVICE gpPrimaryGraphicsDevice;
extern PGRAPHICS_DEVICE gpVgaGraphicsDevice;
VOID
APIENTRY
EngFileWrite(
IN PFILE_OBJECT pFileObject,
IN PVOID lpBuffer,
IN SIZE_T nLength,
IN PSIZE_T lpBytesWritten);
_In_ PFILE_OBJECT pFileObject,
_In_reads_(nLength) PVOID lpBuffer,
_In_ SIZE_T nLength,
_Out_ PSIZE_T lpBytesWritten);
PGRAPHICS_DEVICE
NTAPI
EngpFindGraphicsDevice(
PUNICODE_STRING pustrDevice,
DWORD iDevNum,
DWORD dwFlags);
_In_opt_ PUNICODE_STRING pustrDevice,
_In_ ULONG iDevNum,
_In_ DWORD dwFlags);
PGRAPHICS_DEVICE
NTAPI
EngpRegisterGraphicsDevice(
PUNICODE_STRING pustrDeviceName,
PUNICODE_STRING pustrDiplayDrivers,
PUNICODE_STRING pustrDescription,
PDEVMODEW pdmDefault);
_In_ PUNICODE_STRING pustrDeviceName,
_In_ PUNICODE_STRING pustrDiplayDrivers,
_In_ PUNICODE_STRING pustrDescription,
_In_ PDEVMODEW pdmDefault);
INIT_FUNCTION
NTSTATUS
NTAPI
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) >> 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
NTAPI
EngAcquireSemaphoreShared(
IN HSEMAPHORE hsem);
_Inout_ HSEMAPHORE hsem);
BOOL
APIENTRY
@ -24,17 +29,27 @@ IntEngMaskBlt(
_In_ BRUSHOBJ *pbo,
_In_ POINTL *pptlBrushOrg);
VOID FASTCALL
VOID
FASTCALL
IntEngWindowChanged(
_In_ PWND Window,
_In_ FLONG flChanged);
VOID FASTCALL IntGdiAcquireSemaphore ( HSEMAPHORE hsem );
VOID FASTCALL IntGdiReleaseSemaphore ( HSEMAPHORE hsem );
ULONGLONG APIENTRY EngGetTickCount(VOID);
VOID DecompressBitmap(SIZEL Size, BYTE *CompressedBits, BYTE *UncompressedBits, LONG Delta, ULONG iFormat);
ULONGLONG
APIENTRY
EngGetTickCount(
VOID);
HANDLE
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,
_Out_ PSIZEL psizl);
BOOL
NTAPI
PDEVOBJ_bSwitchMode(
PPDEVOBJ ppdev,
PDEVMODEW pdm);
PDEVMODEW
NTAPI
PDEVOBJ_pdmMatchDevMode(
PPDEVOBJ ppdev,
PDEVMODEW pdm);
#endif /* !__WIN32K_PDEVOBJ_H */

View file

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

View file

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