9 CopytoUserDcAttr(PDC dc
, PDC_ATTR Dc_Attr
, FLONG Dirty
)
11 Dc_Attr
->hpen
= dc
->Dc_Attr
.hpen
;
12 Dc_Attr
->hbrush
= dc
->Dc_Attr
.hbrush
;
13 Dc_Attr
->hColorSpace
= dc
->Dc_Attr
.hColorSpace
;
14 Dc_Attr
->hlfntNew
= dc
->Dc_Attr
.hlfntNew
;
16 Dc_Attr
->jROP2
= dc
->Dc_Attr
.jROP2
;
17 Dc_Attr
->jFillMode
= dc
->Dc_Attr
.jFillMode
;
18 Dc_Attr
->jStretchBltMode
= dc
->Dc_Attr
.jStretchBltMode
;
19 Dc_Attr
->lRelAbs
= dc
->Dc_Attr
.lRelAbs
;
20 Dc_Attr
->jBkMode
= dc
->Dc_Attr
.jBkMode
;
22 Dc_Attr
->crBackgroundClr
= dc
->Dc_Attr
.crBackgroundClr
;
23 Dc_Attr
->ulBackgroundClr
= dc
->Dc_Attr
.ulBackgroundClr
;
24 Dc_Attr
->crForegroundClr
= dc
->Dc_Attr
.crForegroundClr
;
25 Dc_Attr
->ulForegroundClr
= dc
->Dc_Attr
.ulForegroundClr
;
27 Dc_Attr
->ulBrushClr
= dc
->Dc_Attr
.ulBrushClr
;
28 Dc_Attr
->crBrushClr
= dc
->Dc_Attr
.crBrushClr
;
30 Dc_Attr
->ulPenClr
= dc
->Dc_Attr
.ulPenClr
;
31 Dc_Attr
->crPenClr
= dc
->Dc_Attr
.crPenClr
;
33 Dc_Attr
->ptlBrushOrigin
.x
= dc
->Dc_Attr
.ptlBrushOrigin
.x
;
34 Dc_Attr
->ptlBrushOrigin
.y
= dc
->Dc_Attr
.ptlBrushOrigin
.y
;
36 Dc_Attr
->lTextAlign
= dc
->Dc_Attr
.lTextAlign
;
37 Dc_Attr
->lTextExtra
= dc
->Dc_Attr
.lTextExtra
;
38 Dc_Attr
->cBreak
= dc
->Dc_Attr
.cBreak
;
39 Dc_Attr
->lBreakExtra
= dc
->Dc_Attr
.lBreakExtra
;
40 Dc_Attr
->iMapMode
= dc
->Dc_Attr
.iMapMode
;
41 Dc_Attr
->iGraphicsMode
= dc
->Dc_Attr
.iGraphicsMode
;
43 Dc_Attr
->ptlCurrent
.x
= dc
->Dc_Attr
.ptlCurrent
.x
;
44 Dc_Attr
->ptlCurrent
.y
= dc
->Dc_Attr
.ptlCurrent
.y
;
45 Dc_Attr
->ptlWindowOrg
.x
= dc
->Dc_Attr
.ptlWindowOrg
.x
;
46 Dc_Attr
->ptlWindowOrg
.y
= dc
->Dc_Attr
.ptlWindowOrg
.y
;
47 Dc_Attr
->szlWindowExt
.cx
= dc
->Dc_Attr
.szlWindowExt
.cx
;
48 Dc_Attr
->szlWindowExt
.cy
= dc
->Dc_Attr
.szlWindowExt
.cy
;
49 Dc_Attr
->ptlViewportOrg
.x
= dc
->Dc_Attr
.ptlViewportOrg
.x
;
50 Dc_Attr
->ptlViewportOrg
.y
= dc
->Dc_Attr
.ptlViewportOrg
.y
;
51 Dc_Attr
->szlViewportExt
.cx
= dc
->Dc_Attr
.szlViewportExt
.cx
;
52 Dc_Attr
->szlViewportExt
.cy
= dc
->Dc_Attr
.szlViewportExt
.cy
;
54 Dc_Attr
->ulDirty_
= 0; // Force to Zero!
59 CopyFromUserDcAttr(PDC dc
, PDC_ATTR Dc_Attr
, FLONG Dirty
)
61 if ( (Dirty
& DIRTY_FILL
) || (Dc_Attr
->ulDirty_
& DIRTY_FILL
))
63 dc
->Dc_Attr
.ulBrushClr
= Dc_Attr
->ulBrushClr
;
64 dc
->Dc_Attr
.crBrushClr
= Dc_Attr
->crBrushClr
;
65 Dc_Attr
->ulDirty_
&= ~DIRTY_FILL
;
67 if ( Dirty
& DIRTY_LINE
|| (Dc_Attr
->ulDirty_
& DIRTY_LINE
))
69 dc
->Dc_Attr
.crBackgroundClr
= Dc_Attr
->crBackgroundClr
;
70 dc
->Dc_Attr
.ulBackgroundClr
= Dc_Attr
->ulBackgroundClr
;
71 dc
->Dc_Attr
.ulPenClr
= Dc_Attr
->ulPenClr
;
72 dc
->Dc_Attr
.crPenClr
= Dc_Attr
->crPenClr
;
73 Dc_Attr
->ulDirty_
&= ~DIRTY_LINE
;
75 if ( Dirty
& DIRTY_TEXT
|| (Dc_Attr
->ulDirty_
& DIRTY_TEXT
))
77 dc
->Dc_Attr
.crForegroundClr
= Dc_Attr
->crForegroundClr
;
78 dc
->Dc_Attr
.ulForegroundClr
= Dc_Attr
->ulForegroundClr
;
79 Dc_Attr
->ulDirty_
&= ~DIRTY_TEXT
;
85 ReadWriteVMDcAttr(PDC dc
, FLONG Dirty
, BOOL Write
)
88 KeEnterCriticalRegion();
90 INT Index
= GDI_HANDLE_GET_INDEX((HGDIOBJ
)dc
->hSelf
);
91 PGDI_TABLE_ENTRY Entry
= &GdiHandleTable
->Entries
[Index
];
92 HANDLE ProcessId
= (HANDLE
)(((ULONG_PTR
)(Entry
->ProcessId
)) & ~1);
97 NTSTATUS Status
= ZwReadVirtualMemory ( ProcessId
,
104 if (NT_SUCCESS(Status
)) CopytoUserDcAttr(dc
, &lDc_AttrData
, Dirty
);
109 if (NT_SUCCESS(Status
)) CopyFromUserDcAttr(dc
, &lDc_AttrData
, Dirty
);
113 Status
= ZwWriteVirtualMemory ( ProcessId
,
118 if(!NT_SUCCESS(Status
))
120 SetLastNtError(Status
);
125 KeLeaveCriticalRegion();
132 DCU_UpdateUserXForms(PDC pDC
, ULONG uMask
)
135 PDC_ATTR DC_Attr
= pDC
->pDc_Attr
;
137 if (!uMask
) return FALSE
;
139 if (!DC_Attr
) return FALSE
;
142 NTSTATUS Status
= STATUS_SUCCESS
;
143 KeEnterCriticalRegion();
146 ProbeForWrite(DC_Attr
,
149 if (uMask
& WORLD_XFORM_CHANGED
)
150 XForm2MatrixS( &DC_Attr
->mxWorldToDevice
, &pDC
->w
.xformWorld2Vport
);
152 if (uMask
& DEVICE_TO_WORLD_INVALID
)
153 XForm2MatrixS( &DC_Attr
->mxDevicetoWorld
, &pDC
->w
.xformVport2World
);
155 if (uMask
& WORLD_TO_PAGE_IDENTITY
)
156 XForm2MatrixS( &DC_Attr
->mxWorldToPage
, &pDC
->w
.xformWorld2Wnd
);
160 Status
= _SEH_GetExceptionCode();
163 KeLeaveCriticalRegion();
164 if(!NT_SUCCESS(Status
))
166 SetLastNtError(Status
);
176 DCU_SyncDcAttrtoUser(PDC dc
, FLONG Dirty
)
178 BOOL TryHarder
= FALSE
;
179 PDC_ATTR Dc_Attr
= dc
->pDc_Attr
;
180 if (!Dirty
) return FALSE
;
181 if (!Dc_Attr
) return FALSE
;
184 NTSTATUS Status
= STATUS_SUCCESS
;
185 KeEnterCriticalRegion();
188 ProbeForWrite(Dc_Attr
,
191 CopytoUserDcAttr( dc
, Dc_Attr
, Dirty
);
195 Status
= _SEH_GetExceptionCode();
198 KeLeaveCriticalRegion();
199 if(!NT_SUCCESS(Status
)) TryHarder
= TRUE
;
200 if (TryHarder
) return ReadWriteVMDcAttr( dc
, Dirty
, TRUE
);
207 DCU_SynchDcAttrtoUser(HDC hDC
, FLONG Dirty
)
209 PDC pDC
= DC_LockDc ( hDC
);
210 BOOL Ret
= DCU_SyncDcAttrtoUser(pDC
, Dirty
);
217 DCU_SyncDcAttrtoW32k(PDC dc
, FLONG Dirty
)
219 BOOL TryHarder
= FALSE
;
220 PDC_ATTR Dc_Attr
= dc
->pDc_Attr
;
221 if (!Dirty
) return FALSE
;
222 if (!Dc_Attr
) return FALSE
;
225 NTSTATUS Status
= STATUS_SUCCESS
;
226 KeEnterCriticalRegion();
229 ProbeForRead(Dc_Attr
,
232 CopyFromUserDcAttr( dc
, Dc_Attr
, Dirty
);
236 Status
= _SEH_GetExceptionCode();
239 KeLeaveCriticalRegion();
240 if(!NT_SUCCESS(Status
)) TryHarder
= TRUE
;
241 if (TryHarder
) return ReadWriteVMDcAttr( dc
, Dirty
, FALSE
);
248 DCU_SynchDcAttrtoW32k(HDC hDC
, FLONG Dirty
)
250 PDC pDC
= DC_LockDc ( hDC
);
251 BOOL Ret
= DCU_SyncDcAttrtoW32k(pDC
, Dirty
);
267 NtGdiFlushUserBatch(VOID
)
269 NTSTATUS Status
= STATUS_SUCCESS
;