Moved code. Finding out when changing ownership, it will require the deallocation and allocation of old and new dcattr.

svn path=/trunk/; revision=28850
This commit is contained in:
James Tabor 2007-09-04 15:59:21 +00:00
parent a83bfb4c33
commit 128482c59c
2 changed files with 131 additions and 108 deletions

View file

@ -144,8 +144,9 @@ HDC FASTCALL RetrieveDisplayHDC(VOID);
HDC FASTCALL DC_AllocDC(PUNICODE_STRING Driver);
VOID FASTCALL DC_InitDC(HDC DCToInit);
HDC FASTCALL DC_FindOpenDC(PUNICODE_STRING Driver);
VOID FASTCALL DC_FreeDC(HDC DCToFree);
VOID FASTCALL DC_FreeDcAttr(HDC);
VOID FASTCALL DC_FreeDC(HDC);
VOID FASTCALL DC_AllocateDcAttr(HDC, PEPROCESS);
VOID FASTCALL DC_FreeDcAttr(HDC, PEPROCESS);
BOOL INTERNAL_CALL DC_Cleanup(PVOID ObjectBody);
HDC FASTCALL DC_GetNextDC (PDC pDC);
VOID FASTCALL DC_SetNextDC (PDC pDC, HDC hNextDC);

View file

@ -1952,6 +1952,7 @@ NtGdiSaveDC(HDC hDC)
if (!PATH_AssignGdiPath (&dcs->w.path, &dc->w.path))
{
NtGdiDeleteObjectApp (hdcs);
return 0;
}
#endif
@ -2367,41 +2368,11 @@ DC_AllocDC(PUNICODE_STRING Driver)
}
return NULL;
}
//#if 0
PVOID NewMem = NULL;
ULONG MemSize = sizeof(DC_ATTR); //PAGE_SIZE it will allocate that size
NTSTATUS Status = ZwAllocateVirtualMemory(NtCurrentProcess(),
&NewMem,
0,
&MemSize,
MEM_COMMIT|MEM_RESERVE,
PAGE_READWRITE);
KeEnterCriticalRegion();
{
INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hDC);
PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index];
if (NT_SUCCESS(Status))
{
RtlZeroMemory(NewMem, MemSize);
Entry->UserData = NewMem;
DPRINT("DC_ATTR allocated! 0x%x\n",NewMem);
}
else
{
DPRINT("DC_ATTR not allocated!\n");
}
}
KeLeaveCriticalRegion();
//#endif
DC_AllocateDcAttr(hDC, NULL);
NewDC = DC_LockDc(hDC);
/* FIXME - Handle NewDC == NULL! */
//#if 0
if(NewMem)
{
NewDC->pDc_Attr = NewMem; // Store pointer
}
//#endif
if (Driver != NULL)
{
RtlCopyMemory(&NewDC->DriverName, Driver, sizeof(UNICODE_STRING));
@ -2481,8 +2452,57 @@ DC_InitDC(HDC DCHandle)
VOID
FASTCALL
DC_FreeDcAttr(HDC DCToFree)
DC_AllocateDcAttr(HDC hDC, PEPROCESS Owner)
{
//#if 0
PVOID NewMem = NULL;
HANDLE Pid = NtCurrentProcess();
ULONG MemSize = sizeof(DC_ATTR); //PAGE_SIZE it will allocate that size
if(Owner) Pid = PsGetProcessId(Owner);
NTSTATUS Status = ZwAllocateVirtualMemory(Pid,
&NewMem,
0,
&MemSize,
MEM_COMMIT|MEM_RESERVE,
PAGE_READWRITE);
KeEnterCriticalRegion();
{
INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)hDC);
PGDI_TABLE_ENTRY Entry = &GdiHandleTable->Entries[Index];
if (NT_SUCCESS(Status))
{
RtlZeroMemory(NewMem, MemSize);
Entry->UserData = NewMem;
DPRINT("DC_ATTR allocated! 0x%x\n",NewMem);
}
else
{
DPRINT("DC_ATTR not allocated!\n");
}
}
KeLeaveCriticalRegion();
PDC pDC = DC_LockDc(hDC);
if(NewMem)
{
pDC->pDc_Attr = NewMem; // Store pointer
}
DC_UnlockDc(pDC);
//#endif
}
VOID
FASTCALL
DC_FreeDcAttr(HDC DCToFree, PEPROCESS Owner)
{
HANDLE Pid = NtCurrentProcess();
PDC pDC = DC_LockDc(DCToFree);
if (pDC->pDc_Attr == &pDC->Dc_Attr) return; // Internal DC object!
pDC->pDc_Attr = NULL;
DC_UnlockDc(pDC);
if(Owner) Pid = PsGetProcessId(Owner);
KeEnterCriticalRegion();
{
INT Index = GDI_HANDLE_GET_INDEX((HGDIOBJ)DCToFree);
@ -2490,7 +2510,7 @@ DC_FreeDcAttr(HDC DCToFree)
if(Entry->UserData)
{
ULONG MemSize = sizeof(DC_ATTR); //PAGE_SIZE;
NTSTATUS Status = ZwFreeVirtualMemory(NtCurrentProcess(),
NTSTATUS Status = ZwFreeVirtualMemory(Pid,
&Entry->UserData,
&MemSize,
MEM_DECOMMIT);
@ -2508,7 +2528,7 @@ VOID FASTCALL
DC_FreeDC(HDC DCToFree)
{
//#if 0
DC_FreeDcAttr(DCToFree);
DC_FreeDcAttr(DCToFree, NULL);
//#endif
if (!GDIOBJ_FreeObj(GdiHandleTable, DCToFree, GDI_OBJECT_TYPE_DC))
{
@ -2587,6 +2607,7 @@ DC_SetOwnership(HDC hDC, PEPROCESS Owner)
{
PDC DC;
// DC_FreeDcAttr(hDC, NULL);
GDIOBJ_SetOwnership(GdiHandleTable, hDC, Owner);
DC = DC_LockDc(hDC);
if (NULL != DC)
@ -2605,6 +2626,7 @@ DC_SetOwnership(HDC hDC, PEPROCESS Owner)
}
DC_UnlockDc(DC);
}
// DC_AllocateDcAttr(hDC, Owner);
}
BOOL FASTCALL