mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-03 04:13:31 +00:00
Implement GdiFixUpHandle, fix handle masking and entry indexing.
svn path=/trunk/; revision=26439
This commit is contained in:
@@ -114,6 +114,10 @@ GdiGetHandleUserData(
|
||||
PLDC
|
||||
GdiGetLDC(HDC hDC);
|
||||
|
||||
HGDIOBJ
|
||||
STDCALL
|
||||
GdiFixUpHandle(HGDIOBJ hGO);
|
||||
|
||||
BOOL
|
||||
WINAPI
|
||||
CalculateColorTableSize(
|
||||
|
||||
@@ -32,6 +32,20 @@ PGDI_TABLE_ENTRY GdiHandleTable = NULL;
|
||||
HANDLE CurrentProcessId = NULL;
|
||||
DWORD GDI_BatchLimit = 1;
|
||||
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
HGDIOBJ
|
||||
STDCALL
|
||||
GdiFixUpHandle(HGDIOBJ hGdiObj)
|
||||
{
|
||||
if (((ULONG_PTR)(hGdiObj)) & GDI_HANDLE_UPPER_MASK ) return hGdiObj;
|
||||
PGDI_TABLE_ENTRY Entry = GdiHandleTable + GDI_HANDLE_TO_ENTRY(hGdiObj);
|
||||
return hGdiObj = (HGDIOBJ)(((LONG_PTR)(hGdiObj)) |
|
||||
(Entry->Type << 16)); // Rebuild handle for Object
|
||||
}
|
||||
|
||||
/*
|
||||
* @implemented
|
||||
*/
|
||||
@@ -44,7 +58,7 @@ GdiQueryTable(VOID)
|
||||
|
||||
BOOL GdiIsHandleValid(HGDIOBJ hGdiObj)
|
||||
{
|
||||
PGDI_TABLE_ENTRY Entry = GdiHandleTable + GDI_HANDLE_GET_INDEX(hGdiObj);
|
||||
PGDI_TABLE_ENTRY Entry = GdiHandleTable + GDI_HANDLE_TO_ENTRY(hGdiObj);
|
||||
if(Entry->KernelData != NULL && (Entry->Type & GDI_HANDLE_TYPE_MASK) == (LONG)GDI_HANDLE_GET_TYPE(hGdiObj))
|
||||
{
|
||||
HANDLE pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1);
|
||||
@@ -58,7 +72,7 @@ BOOL GdiIsHandleValid(HGDIOBJ hGdiObj)
|
||||
|
||||
BOOL GdiGetHandleUserData(HGDIOBJ hGdiObj, PVOID *UserData)
|
||||
{
|
||||
PGDI_TABLE_ENTRY Entry = GdiHandleTable + GDI_HANDLE_GET_INDEX(hGdiObj);
|
||||
PGDI_TABLE_ENTRY Entry = GdiHandleTable + GDI_HANDLE_TO_ENTRY(hGdiObj);
|
||||
if(Entry->KernelData != NULL && (Entry->Type & GDI_HANDLE_TYPE_MASK) == (LONG)GDI_HANDLE_GET_TYPE(hGdiObj))
|
||||
{
|
||||
HANDLE pid = (HANDLE)((ULONG_PTR)Entry->ProcessId & ~0x1);
|
||||
@@ -103,3 +117,5 @@ GdiGetBatchLimit()
|
||||
{
|
||||
return GDI_BatchLimit;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#define GDI_HANDLE_TYPE_MASK 0x007f0000
|
||||
#define GDI_HANDLE_STOCK_MASK 0x00800000
|
||||
#define GDI_HANDLE_REUSE_MASK 0xff000000
|
||||
#define GDI_HANDLE_UPPER_MASK (GDI_HANDLE_TYPE_MASK|GDI_HANDLE_STOCK_MASK|GDI_HANDLE_REUSE_MASK)
|
||||
#define GDI_HANDLE_REUSECNT_SHIFT 24
|
||||
|
||||
/*! \defgroup GDI object types
|
||||
@@ -106,6 +107,11 @@ typedef struct _GDI_TABLE_ENTRY
|
||||
PVOID UserData; /* Points to the user mode structure, usually NULL though */
|
||||
} GDI_TABLE_ENTRY, *PGDI_TABLE_ENTRY;
|
||||
|
||||
|
||||
#define GDI_HANDLE_TO_ENTRY(h) \
|
||||
((((ULONG_PTR)(h)) & GDI_HANDLE_INDEX_MASK) * sizeof(GDI_TABLE_ENTRY))
|
||||
|
||||
|
||||
typedef struct _RGNATTR
|
||||
{
|
||||
ULONG AttrFlags;
|
||||
|
||||
Reference in New Issue
Block a user