Fix processid mask, update gdi handle entry, shift mask and VM memory alloc.
[reactos.git] / reactos / subsystems / win32 / win32k / objects / dcutil.c
1
2 #include <w32k.h>
3
4 #define NDEBUG
5 #include <debug.h>
6
7 static
8 VOID
9 CopytoUserDcAttr(PDC dc, PDC_ATTR Dc_Attr, FLONG Dirty)
10 {
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;
15
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;
21
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;
26
27 Dc_Attr->ulBrushClr = dc->Dc_Attr.ulBrushClr;
28 Dc_Attr->crBrushClr = dc->Dc_Attr.crBrushClr;
29
30 Dc_Attr->ulPenClr = dc->Dc_Attr.ulPenClr;
31 Dc_Attr->crPenClr = dc->Dc_Attr.crPenClr;
32
33 Dc_Attr->ptlBrushOrigin.x = dc->Dc_Attr.ptlBrushOrigin.x;
34 Dc_Attr->ptlBrushOrigin.y = dc->Dc_Attr.ptlBrushOrigin.y;
35
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;
42
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;
53
54 Dc_Attr->ulDirty_ = 0; // Force to Zero!
55 }
56
57 static
58 VOID
59 CopyFromUserDcAttr(PDC dc, PDC_ATTR Dc_Attr, FLONG Dirty)
60 {
61 if ( (Dirty & DIRTY_FILL) || (Dc_Attr->ulDirty_ & DIRTY_FILL))
62 {
63 dc->Dc_Attr.ulBrushClr = Dc_Attr->ulBrushClr;
64 dc->Dc_Attr.crBrushClr = Dc_Attr->crBrushClr;
65 Dc_Attr->ulDirty_ &= ~DIRTY_FILL;
66 }
67 if ( Dirty & DIRTY_LINE || (Dc_Attr->ulDirty_ & DIRTY_LINE))
68 {
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;
74 }
75 if ( Dirty & DIRTY_TEXT || (Dc_Attr->ulDirty_ & DIRTY_TEXT))
76 {
77 dc->Dc_Attr.crForegroundClr = Dc_Attr->crForegroundClr;
78 dc->Dc_Attr.ulForegroundClr = Dc_Attr->ulForegroundClr;
79 Dc_Attr->ulDirty_ &= ~DIRTY_TEXT;
80 }
81 }
82
83 static
84 BOOL
85 ReadWriteVMDcAttr(PDC dc, FLONG Dirty, BOOL Write)
86 {
87 BOOL Ret = FALSE;
88 KeEnterCriticalRegion();
89 {
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);
93 DC_ATTR lDc_AttrData;
94
95 if(Entry->UserData)
96 {
97 NTSTATUS Status = ZwReadVirtualMemory ( ProcessId,
98 &(Entry->UserData),
99 &lDc_AttrData,
100 sizeof(DC_ATTR),
101 NULL );
102 if (Write)
103 {
104 if (NT_SUCCESS(Status)) CopytoUserDcAttr(dc, &lDc_AttrData, Dirty);
105 Ret = TRUE;
106 }
107 else
108 {
109 if (NT_SUCCESS(Status)) CopyFromUserDcAttr(dc, &lDc_AttrData, Dirty);
110 Ret = TRUE;
111 }
112 if (Write)
113 Status = ZwWriteVirtualMemory ( ProcessId,
114 &(Entry->UserData),
115 &lDc_AttrData,
116 sizeof(DC_ATTR),
117 NULL );
118 if(!NT_SUCCESS(Status))
119 {
120 SetLastNtError(Status);
121 Ret = FALSE;
122 }
123 }
124 }
125 KeLeaveCriticalRegion();
126 return Ret;
127 }
128
129
130 BOOL
131 FASTCALL
132 DCU_UpdateUserXForms(PDC pDC, ULONG uMask)
133 {
134 #if 0
135 PDC_ATTR DC_Attr = pDC->pDc_Attr;
136
137 if (!uMask) return FALSE;
138
139 if (!DC_Attr) return FALSE;
140 else
141 {
142 NTSTATUS Status = STATUS_SUCCESS;
143 KeEnterCriticalRegion();
144 _SEH_TRY
145 {
146 ProbeForWrite(DC_Attr,
147 sizeof(DC_ATTR),
148 1);
149 if (uMask & WORLD_XFORM_CHANGED)
150 XForm2MatrixS( &DC_Attr->mxWorldToDevice, &pDC->w.xformWorld2Vport);
151
152 if (uMask & DEVICE_TO_WORLD_INVALID)
153 XForm2MatrixS( &DC_Attr->mxDevicetoWorld, &pDC->w.xformVport2World);
154
155 if (uMask & WORLD_TO_PAGE_IDENTITY)
156 XForm2MatrixS( &DC_Attr->mxWorldToPage, &pDC->w.xformWorld2Wnd);
157 }
158 _SEH_HANDLE
159 {
160 Status = _SEH_GetExceptionCode();
161 }
162 _SEH_END;
163 KeLeaveCriticalRegion();
164 if(!NT_SUCCESS(Status))
165 {
166 SetLastNtError(Status);
167 return FALSE;
168 }
169 }
170 #endif
171 return TRUE;
172 }
173
174 BOOL
175 FASTCALL
176 DCU_SyncDcAttrtoUser(PDC dc, FLONG Dirty)
177 {
178 BOOL TryHarder = FALSE;
179 PDC_ATTR Dc_Attr = dc->pDc_Attr;
180 if (!Dirty) return FALSE;
181 if (!Dc_Attr) return FALSE;
182 else
183 {
184 NTSTATUS Status = STATUS_SUCCESS;
185 KeEnterCriticalRegion();
186 _SEH_TRY
187 {
188 ProbeForWrite(Dc_Attr,
189 sizeof(DC_ATTR),
190 1);
191 CopytoUserDcAttr( dc, Dc_Attr, Dirty);
192 }
193 _SEH_HANDLE
194 {
195 Status = _SEH_GetExceptionCode();
196 }
197 _SEH_END;
198 KeLeaveCriticalRegion();
199 if(!NT_SUCCESS(Status)) TryHarder = TRUE;
200 if (TryHarder) return ReadWriteVMDcAttr( dc, Dirty, TRUE);
201 }
202 return TRUE;
203 }
204
205 BOOL
206 FASTCALL
207 DCU_SynchDcAttrtoUser(HDC hDC, FLONG Dirty)
208 {
209 PDC pDC = DC_LockDc ( hDC );
210 BOOL Ret = DCU_SyncDcAttrtoUser(pDC, Dirty);
211 DC_UnlockDc( pDC );
212 return Ret;
213 }
214
215 BOOL
216 FASTCALL
217 DCU_SyncDcAttrtoW32k(PDC dc, FLONG Dirty)
218 {
219 BOOL TryHarder = FALSE;
220 PDC_ATTR Dc_Attr = dc->pDc_Attr;
221 if (!Dirty) return FALSE;
222 if (!Dc_Attr) return FALSE;
223 else
224 {
225 NTSTATUS Status = STATUS_SUCCESS;
226 KeEnterCriticalRegion();
227 _SEH_TRY
228 {
229 ProbeForRead(Dc_Attr,
230 sizeof(DC_ATTR),
231 1);
232 CopyFromUserDcAttr( dc, Dc_Attr, Dirty);
233 }
234 _SEH_HANDLE
235 {
236 Status = _SEH_GetExceptionCode();
237 }
238 _SEH_END;
239 KeLeaveCriticalRegion();
240 if(!NT_SUCCESS(Status)) TryHarder = TRUE;
241 if (TryHarder) return ReadWriteVMDcAttr( dc, Dirty, FALSE);
242 }
243 return TRUE;
244 }
245
246 BOOL
247 FASTCALL
248 DCU_SynchDcAttrtoW32k(HDC hDC, FLONG Dirty)
249 {
250 PDC pDC = DC_LockDc ( hDC );
251 BOOL Ret = DCU_SyncDcAttrtoW32k(pDC, Dirty);
252 DC_UnlockDc( pDC );
253 return Ret;
254 }
255
256
257
258 VOID
259 APIENTRY
260 NtGdiFlush(VOID)
261 {
262 UNIMPLEMENTED;
263 }
264
265 NTSTATUS
266 APIENTRY
267 NtGdiFlushUserBatch(VOID)
268 {
269 NTSTATUS Status = STATUS_SUCCESS;
270 // UNIMPLEMENTED;
271 return Status;
272 }
273