1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         Test for GetObject
5  * PROGRAMMERS:     Timo Kreuzer
6  */
7 
8 #include "precomp.h"
9 
10 #include <pseh/pseh2.h>
11 
12 #define INVALID_POINTER ((PVOID)(ULONG_PTR)0xdeadbeefdeadbeefULL)
13 
14 void
15 Test_General(void)
16 {
17     struct
18     {
19         LOGBRUSH logbrush;
20         BYTE additional[600];
21     } TestStruct;
22     PLOGBRUSH plogbrush;
23     HBRUSH hBrush;
24     HPEN hpen;
25     INT ret;
26 
27     /* Test null pointer and invalid handles */
28     SetLastError(ERROR_SUCCESS);
29     ok(GetObjectA(0, 0, NULL) == 0, "\n");
30     ok(GetObjectA((HANDLE)-1, 0, NULL) == 0, "\n");
31 
32     /* Test invalid habdles of different types */
33     ok(GetObjectA((HANDLE)0x00380000, 0, NULL) == 0, "\n");
34     ok(GetLastError() == ERROR_SUCCESS, "\n");
35     ok(GetObjectA((HANDLE)0x00380000, 10, &TestStruct) == 0, "\n");
36     ok(GetLastError() == ERROR_SUCCESS, "\n");
37     SetLastError(ERROR_SUCCESS);
38     ok(GetObjectA((HANDLE)0x00010000, 0, NULL) == 0, "\n");
39     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
40     SetLastError(ERROR_SUCCESS);
41     ok(GetObjectA((HANDLE)0x00020000, 0, NULL) == 0, "\n");
42     ok(GetLastError() == ERROR_SUCCESS, "\n");
43     SetLastError(ERROR_SUCCESS);
44     ok(GetObjectA((HANDLE)0x00030000, 0, NULL) == 0, "\n");
45     ok(GetLastError() == ERROR_SUCCESS, "\n");
46     SetLastError(ERROR_SUCCESS);
47     ok(GetObjectA((HANDLE)0x00040000, 0, NULL) == 0, "\n");
48     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
49     SetLastError(ERROR_SUCCESS);
50     ok(GetObjectA((HANDLE)0x00060000, 0, NULL) == 0, "\n");
51     ok(GetLastError() == ERROR_SUCCESS, "\n");
52     SetLastError(ERROR_SUCCESS);
53     ok(GetObjectA((HANDLE)0x00070000, 0, NULL) == 0, "\n");
54     ok(GetLastError() == ERROR_SUCCESS, "\n");
55     SetLastError(ERROR_SUCCESS);
56     ok(GetObjectA((HANDLE)0x000B0000, 0, NULL) == 0, "\n");
57     ok(GetLastError() == ERROR_SUCCESS, "\n");
58     SetLastError(ERROR_SUCCESS);
59     ok(GetObjectA((HANDLE)0x000C0000, 0, NULL) == 0, "\n");
60     ok(GetLastError() == ERROR_SUCCESS, "\n");
61     SetLastError(ERROR_SUCCESS);
62     ok(GetObjectA((HANDLE)0x000D0000, 0, NULL) == 0, "\n");
63     ok(GetLastError() == ERROR_SUCCESS, "\n");
64     SetLastError(ERROR_SUCCESS);
65     ok(GetObjectA((HANDLE)0x000E0000, 0, NULL) == 0, "\n");
66     ok(GetLastError() == ERROR_SUCCESS, "\n");
67     SetLastError(ERROR_SUCCESS);
68     ok(GetObjectA((HANDLE)0x000F0000, 0, NULL) == 0, "\n");
69     ok(GetLastError() == ERROR_SUCCESS, "\n");
70     SetLastError(ERROR_SUCCESS);
71     ok(GetObjectA((HANDLE)0x00110000, 0, NULL) == 0, "\n");
72     ok(GetLastError() == ERROR_SUCCESS, "\n");
73     SetLastError(ERROR_SUCCESS);
74     ok(GetObjectA((HANDLE)0x00120000, 0, NULL) == 0, "\n");
75     ok(GetLastError() == ERROR_SUCCESS, "\n");
76     SetLastError(ERROR_SUCCESS);
77     ok(GetObjectA((HANDLE)0x00130000, 0, NULL) == 0, "\n");
78     ok(GetLastError() == ERROR_SUCCESS, "\n");
79     SetLastError(ERROR_SUCCESS);
80     ok(GetObjectA((HANDLE)0x00140000, 0, NULL) == 0, "\n");
81     ok(GetLastError() == ERROR_SUCCESS, "\n");
82     SetLastError(ERROR_SUCCESS);
83     ok(GetObjectA((HANDLE)0x00150000, 0, NULL) == 0, "\n");
84     ok(GetLastError() == ERROR_SUCCESS, "\n");
85     SetLastError(ERROR_SUCCESS);
86     ok(GetObjectA((HANDLE)0x00160000, 0, NULL) == 0, "\n");
87     ok(GetLastError() == ERROR_SUCCESS, "\n");
88     SetLastError(ERROR_SUCCESS);
89     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0, "\n");
90     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
91     SetLastError(ERROR_SUCCESS);
92     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0, "\n");
93     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
94     SetLastError(ERROR_SUCCESS);
95     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0, "\n");
96     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
97     SetLastError(ERROR_SUCCESS);
98     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0, "\n");
99     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
100     SetLastError(ERROR_SUCCESS);
101     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0, "\n");
102     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
103     SetLastError(ERROR_SUCCESS);
104     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0, "\n");
105     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
106     SetLastError(ERROR_SUCCESS);
107     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0, "\n");
108     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
109     SetLastError(ERROR_SUCCESS);
110     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0, "\n");
111     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
112     SetLastError(ERROR_SUCCESS);
113     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0, "\n");
114     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
115     SetLastError(ERROR_SUCCESS);
116     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0, "\n");
117     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
118 
119     /* Test need of alignment */
120     SetLastError(ERROR_SUCCESS);
121     hBrush = GetStockObject(WHITE_BRUSH);
122     plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush);
123     ok(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH), "\n");
124     plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 2);
125     ok(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH), "\n");
126     plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 1);
127     //ok(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == 0, "\n"); // fails on win7
128 
129     /* Test invalid buffer */
130     SetLastError(0xbadbad00);
131     ok(GetObjectA(GetStockObject(WHITE_BRUSH), sizeof(LOGBRUSH), INVALID_POINTER) == 0, "\n");
132     ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
133     SetLastError(0xbadbad00);
134     ok(GetObjectW(GetStockObject(BLACK_PEN), sizeof(LOGPEN), INVALID_POINTER) == 0, "\n");
135     ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
136     SetLastError(0xbadbad00);
137     ok(GetObjectW(GetStockObject(21), sizeof(BITMAP), INVALID_POINTER) == 0, "\n");
138     ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
139     SetLastError(0xbadbad00);
140     ok(GetObjectW(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), INVALID_POINTER) == 0, "\n");
141     ok(GetLastError() == 0xbadbad00, "wrong error: %ld\n", GetLastError());
142     SetLastError(ERROR_SUCCESS);
143     _SEH2_TRY
144     {
145         ret = GetObjectA(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), INVALID_POINTER);
146     }
147     _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
148     {
149         ret = -1;
150     }
151     _SEH2_END
152     ok(ret == -1, "should have got an exception\n");
153 
154     ok(GetObjectW(GetStockObject(SYSTEM_FONT), 0x50000000, &TestStruct) == 356, "\n");
155     ok(GetObjectW(GetStockObject(WHITE_BRUSH), 0x50000000, &TestStruct) == sizeof(LOGBRUSH), "\n");
156 
157 
158     /* Test buffer size of 0 */
159     SetLastError(0xbadbad00);
160     hBrush = CreateSolidBrush(123);
161     ok(hBrush != NULL, "Failed to create brush\n");
162     ok_long(GetObjectA(hBrush, 0, &TestStruct), 0);
163     ok_err(0xbadbad00);
164     DeleteObject(hBrush);
165     SetLastError(0xbadbad00);
166     hpen = CreatePen(PS_SOLID, 1, 123);
167     ok(hpen != NULL, "Failed to create pen\n");
168     ok_long(GetObjectA(hpen, 0, &TestStruct), 0);
169     ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
170     SetLastError(0xbadbad00);
171     TestStruct.logbrush.lbStyle = BS_SOLID;
172     TestStruct.logbrush.lbColor = RGB(1,2,3);
173     TestStruct.logbrush.lbHatch = 0;
174     hpen = ExtCreatePen(PS_GEOMETRIC | PS_SOLID, 1, &TestStruct.logbrush, 0, NULL);
175     ok(hpen != NULL, "Failed to create pen\n");
176     ok_long(GetObjectA(hpen, 0, &TestStruct), 0);
177     ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
178     SetLastError(0xbadbad00);
179     ok(GetObjectW(GetStockObject(SYSTEM_FONT), 0, &TestStruct) == 0, "\n");
180     ok_err(0xbadbad00);
181     SetLastError(0xbadbad00);
182     ok(GetObjectW(GetStockObject(21), 0, &TestStruct) == 0, "\n");
183     ok_err(0xbadbad00);
184 
185 }
186 
187 void
188 Test_Bitmap(void)
189 {
190     HBITMAP hBitmap;
191     BITMAP bitmap;
192     DIBSECTION dibsection;
193     BYTE bData[100] = {0};
194     BYTE Buffer[100] = {48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0};
195 
196     FillMemory(&bitmap, sizeof(BITMAP), 0x77);
197     hBitmap = CreateBitmap(10,10,1,8,bData);
198     ok(hBitmap != 0, "CreateBitmap failed, skipping tests.\n");
199     if (!hBitmap) return;
200 
201     SetLastError(ERROR_SUCCESS);
202     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP), "\n");
203     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP), "\n");
204     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, sizeof(BITMAP), NULL) == sizeof(BITMAP), "\n");
205     ok(GetLastError() == ERROR_SUCCESS, "\n");
206     ok(GetObjectA(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP), "\n");
207     ok(GetObjectA(hBitmap, 0, NULL) == sizeof(BITMAP), "\n");
208     ok(GetObjectA((HANDLE)((UINT_PTR)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP), "\n");
209     ok(GetObjectW((HANDLE)((UINT_PTR)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP), "\n");
210     ok(GetLastError() == ERROR_SUCCESS, "\n");
211     ok(GetObjectA(hBitmap, 5, NULL) == sizeof(BITMAP), "\n");
212     ok(GetObjectA(hBitmap, -5, NULL) == sizeof(BITMAP), "\n");
213     ok(GetObjectA(hBitmap, 0, Buffer) == 0, "\n");
214     ok(GetObjectA(hBitmap, 5, Buffer) == 0, "\n");
215     ok(GetLastError() == ERROR_SUCCESS, "\n");
216     ok(GetObjectA(hBitmap, sizeof(BITMAP), &bitmap) == sizeof(BITMAP), "\n");
217     ok(GetObjectA(hBitmap, sizeof(BITMAP)+2, &bitmap) == sizeof(BITMAP), "\n");
218     ok(GetObjectA(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(BITMAP), "\n");
219     ok(GetObjectA(hBitmap, -5, &bitmap) == sizeof(BITMAP), "\n");
220     ok(GetLastError() == ERROR_SUCCESS, "\n");
221     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, sizeof(BITMAP), &bitmap) == 0, "\n");
222     ok(GetLastError() == ERROR_SUCCESS, "expected ERROR_SUCCESS, got %ld\n", GetLastError());
223 
224     // todo: test invalid handle + buffer
225 
226     DeleteObject(hBitmap);
227 }
228 
229 void
230 Test_Dibsection(void)
231 {
232     BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 9, 1, 16, BI_RGB, 0, 10, 10, 0,0}};
233     HBITMAP hBitmap;
234     BITMAP bitmap;
235     DIBSECTION dibsection;
236     PVOID pData;
237     HDC hDC;
238 
239     FillMemory(&dibsection, sizeof(DIBSECTION), 0x77);
240     hDC = GetDC(0);
241     hBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, &pData, NULL, 0);
242     ok(hBitmap != 0, "CreateDIBSection failed with %ld, skipping tests.\n", GetLastError());
243     if (!hBitmap) return;
244 
245     ok(GetObjectA((HANDLE)((UINT_PTR)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP), "\n");
246     ok(GetObjectW((HANDLE)((UINT_PTR)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP), "\n");
247 
248     SetLastError(ERROR_SUCCESS);
249     ok_long(GetObject(hBitmap, sizeof(DIBSECTION), NULL), sizeof(BITMAP));
250     ok_long(GetObject(hBitmap, 0, NULL), sizeof(BITMAP));
251     ok_long(GetObject(hBitmap, 5, NULL), sizeof(BITMAP));
252     ok_long(GetObject(hBitmap, -5, NULL), sizeof(BITMAP));
253     ok_long(GetObject(hBitmap, 0, &dibsection), 0);
254     ok_long(GetObject(hBitmap, 5, &dibsection), 0);
255     ok_long(GetObject(hBitmap, sizeof(BITMAP), &bitmap), sizeof(BITMAP));
256     ok_long(GetObject(hBitmap, sizeof(BITMAP)+2, &bitmap), sizeof(BITMAP));
257     ok_long(bitmap.bmType, 0);
258     ok_long(bitmap.bmWidth, 10);
259     ok_long(bitmap.bmHeight, 9);
260     ok_long(bitmap.bmWidthBytes, 20);
261     ok_long(bitmap.bmPlanes, 1);
262     ok_long(bitmap.bmBitsPixel, 16);
263     ok(bitmap.bmBits == pData, "\n");
264     ok_long(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection), sizeof(DIBSECTION));
265     ok_long(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection), sizeof(DIBSECTION));
266     ok_long(GetObject(hBitmap, -5, &dibsection), sizeof(DIBSECTION));
267     ok_err(ERROR_SUCCESS);
268     DeleteObject(hBitmap);
269     ReleaseDC(0, hDC);
270 }
271 
272 void
273 Test_Palette(void)
274 {
275     LOGPALETTE logpal;
276     HPALETTE hPalette;
277     WORD wPalette;
278 
279     FillMemory(&wPalette, sizeof(WORD), 0x77);
280     logpal.palVersion = 0x0300;
281     logpal.palNumEntries = 1;
282     logpal.palPalEntry[0].peRed = 0;
283     logpal.palPalEntry[0].peGreen = 0;
284     logpal.palPalEntry[0].peBlue = 0;
285     logpal.palPalEntry[0].peFlags = PC_EXPLICIT;
286     hPalette = CreatePalette(&logpal);
287     ok(hPalette != 0, "CreatePalette failed, skipping tests.\n");
288     if (!hPalette) return;
289 
290     ok(GetObjectA((HANDLE)((UINT_PTR)hPalette & 0x0000ffff), 0, NULL) == sizeof(WORD), "\n");
291     ok(GetObjectW((HANDLE)((UINT_PTR)hPalette & 0x0000ffff), 0, NULL) == sizeof(WORD), "\n");
292 
293     SetLastError(ERROR_SUCCESS);
294     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD), "\n");
295     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD), "\n");
296     ok(GetObject(hPalette, sizeof(WORD), NULL) == sizeof(WORD), "\n");
297     ok(GetObject(hPalette, 0, NULL) == sizeof(WORD), "\n");
298     ok(GetObject(hPalette, 5, NULL) == sizeof(WORD), "\n");
299     ok(GetObject(hPalette, -5, NULL) == sizeof(WORD), "\n");
300     ok(GetObject(hPalette, sizeof(WORD), &wPalette) == sizeof(WORD), "\n");
301     ok(GetObject(hPalette, sizeof(WORD)+2, &wPalette) == sizeof(WORD), "\n");
302     ok(GetObject(hPalette, 0, &wPalette) == 0, "\n");
303     ok(GetObject(hPalette, 1, &wPalette) == 0, "\n");
304     ok(GetObject(hPalette, -1, &wPalette) == sizeof(WORD), "\n");
305     ok(GetLastError() == ERROR_SUCCESS, "\n");
306     DeleteObject(hPalette);
307     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PALETTE, sizeof(WORD), &wPalette) == 0, "\n");
308     ok(GetLastError() == ERROR_SUCCESS, "\n");
309 
310 }
311 
312 void
313 Test_Brush(void)
314 {
315     LOGBRUSH logbrush;
316     HBRUSH hBrush;
317 
318     FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);
319     hBrush = CreateSolidBrush(RGB(1,2,3));
320     ok(hBrush != 0, "CreateSolidBrush failed, skipping tests.\n");
321     if (!hBrush) return;
322 
323     SetLastError(ERROR_SUCCESS);
324     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH), "\n");
325     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH), "\n");
326     ok(GetObject(hBrush, sizeof(WORD), NULL) == sizeof(LOGBRUSH), "\n");
327     ok(GetObject(hBrush, 0, NULL) == sizeof(LOGBRUSH), "\n");
328     ok(GetObject(hBrush, 5, NULL) == sizeof(LOGBRUSH), "\n");
329     ok(GetObject(hBrush, -5, NULL) == sizeof(LOGBRUSH), "\n");
330 
331     //ok(GetObject(hBrush, 0, &logbrush) == 0, "\n"); fails on win7
332     ok(logbrush.lbStyle == 0x77777777, "\n");
333     ok(GetObject(hBrush, 5, &logbrush) == sizeof(LOGBRUSH), "\n");
334     ok(logbrush.lbStyle == 0, "\n");
335     ok(logbrush.lbColor == 0x77777701, "\n");
336 
337     ok(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush) == sizeof(LOGBRUSH), "\n");
338     ok(GetObject(hBrush, sizeof(LOGBRUSH) - 1, &logbrush) == sizeof(LOGBRUSH), "\n");
339     ok(GetObject(hBrush, 1, &logbrush) == sizeof(LOGBRUSH), "\n");
340     ok(GetObject(hBrush, sizeof(LOGBRUSH)+2, &logbrush) == sizeof(LOGBRUSH), "\n");
341     ok(GetObject(hBrush, -1, &logbrush) == sizeof(LOGBRUSH), "\n");
342     // TODO: test all members
343 
344     ok(GetLastError() == ERROR_SUCCESS, "\n");
345     DeleteObject(hBrush);
346 
347     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BRUSH, sizeof(LOGBRUSH), &logbrush) == 0, "\n");
348     ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
349 
350     /* Test handle fixup */
351     hBrush = (HBRUSH)((ULONG_PTR)GetStockObject(WHITE_BRUSH) & 0xFFFF);
352     ok(GetObjectW(hBrush, sizeof(LOGBRUSH), &logbrush) == sizeof(LOGBRUSH),
353        "GetObject(0x%p, ...) failed.\n", hBrush);
354 
355 #ifdef _WIN64
356     /* Test upper 32 bits */
357     hBrush = (HBRUSH)((ULONG64)GetStockObject(WHITE_BRUSH) | 0xFFFFFFFF00000000ULL);
358     ok(GetObjectW(hBrush, sizeof(LOGBRUSH), &logbrush) == sizeof(LOGBRUSH),
359        "GetObject(0x%p, ...) failed.\n", hBrush);
360     hBrush = (HBRUSH)((ULONG64)GetStockObject(WHITE_BRUSH) | 0x537F9F2F00000000ULL);
361     ok(GetObjectW(hBrush, sizeof(LOGBRUSH), &logbrush) == sizeof(LOGBRUSH),
362        "GetObject(0x%p, ...) failed.\n", hBrush);
363 #endif
364 }
365 
366 void
367 Test_DIBBrush(void)
368 {
369     struct
370     {
371         BITMAPINFOHEADER bmiHeader;
372         WORD wColors[4];
373         BYTE jBuffer[16];
374     } PackedDIB =
375     {
376         {sizeof(BITMAPINFOHEADER), 4, 4, 1, 8, BI_RGB, 0, 1, 1, 4, 0},
377         {1, 7, 3, 1},
378         {0,1,2,3,  1,2,3,0,  2,3,0,1,  3,0,1,2},
379     };
380     LOGBRUSH logbrush;
381     HBRUSH hBrush;
382 
383     /* Create a DIB brush */
384     hBrush = CreateDIBPatternBrushPt(&PackedDIB, DIB_PAL_COLORS);
385     ok(hBrush != 0, "CreateSolidBrush failed, skipping tests.\n");
386     if (!hBrush) return;
387 
388     FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);
389     SetLastError(ERROR_SUCCESS);
390 
391     ok_long(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush), sizeof(LOGBRUSH));
392     ok_long(logbrush.lbStyle, BS_DIBPATTERN);
393     ok_long(logbrush.lbColor, 0);
394     ok_long(logbrush.lbHatch, (ULONG_PTR)&PackedDIB);
395 
396     ok_err(ERROR_SUCCESS);
397     DeleteObject(hBrush);
398 
399 
400     /* Create a DIB brush with undocumented iUsage 2 */
401     hBrush = CreateDIBPatternBrushPt(&PackedDIB, 2);
402     ok(hBrush != 0, "CreateSolidBrush failed, skipping tests.\n");
403     if (!hBrush) return;
404 
405     FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);
406     SetLastError(ERROR_SUCCESS);
407 
408     ok_long(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush), sizeof(LOGBRUSH));
409     ok_long(logbrush.lbStyle, BS_DIBPATTERN);
410     ok_long(logbrush.lbColor, 0);
411     ok_long(logbrush.lbHatch, (ULONG_PTR)&PackedDIB);
412 
413     ok_err(ERROR_SUCCESS);
414     DeleteObject(hBrush);
415 
416 }
417 
418 void
419 Test_Pen(void)
420 {
421     LOGPEN logpen;
422     HPEN hPen;
423 
424     FillMemory(&logpen, sizeof(LOGPEN), 0x77);
425     hPen = CreatePen(PS_SOLID, 3, RGB(4,5,6));
426     ok(hPen != 0, "CreatePen failed, skipping tests.\n");
427     if (!hPen) return;
428     SetLastError(ERROR_SUCCESS);
429     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN), "\n");
430     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN), "\n");
431     ok(GetObject(hPen, sizeof(BITMAP), NULL) == sizeof(LOGPEN), "\n");
432     ok(GetObject(hPen, 0, NULL) == sizeof(LOGPEN), "\n");
433     ok(GetObject(hPen, 5, NULL) == sizeof(LOGPEN), "\n");
434     ok(GetObject(hPen, -5, NULL) == sizeof(LOGPEN), "\n");
435     ok(GetObject(hPen, sizeof(LOGPEN), &logpen) == sizeof(LOGPEN), "\n");
436     ok(GetObject(hPen, sizeof(LOGPEN)-1, &logpen) == 0, "\n");
437     ok(GetObject(hPen, sizeof(LOGPEN)+2, &logpen) == sizeof(LOGPEN), "\n");
438     ok(GetObject(hPen, 0, &logpen) == 0, "\n");
439     ok(GetObject(hPen, -5, &logpen) == sizeof(LOGPEN), "\n");
440     //ok(GetLastError() == ERROR_SUCCESS, "\n"); fails on win7
441 
442     /* test if the fields are filled correctly */
443     ok(logpen.lopnStyle == PS_SOLID, "\n");
444 
445     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PEN, sizeof(LOGPEN), &logpen) == 0, "\n");
446     ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
447 
448     DeleteObject(hPen);
449 }
450 
451 void
452 Test_ExtPen(void)
453 {
454     HPEN hPen;
455     EXTLOGPEN extlogpen;
456     LOGBRUSH logbrush;
457     DWORD dwStyles[17] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
458     struct
459     {
460         EXTLOGPEN extlogpen;
461         DWORD dwStyles[50];
462     } elpUserStyle;
463     int i;
464 
465     SetLastError(ERROR_SUCCESS);
466     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0, "\n");
467     ok(GetLastError() == ERROR_INVALID_PARAMETER, "\n");
468     SetLastError(ERROR_SUCCESS);
469     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0, "\n");
470     ok(GetLastError() == ERROR_INVALID_PARAMETER, "\n");
471 
472     FillMemory(&extlogpen, sizeof(EXTLOGPEN), 0x77);
473     logbrush.lbStyle = BS_SOLID;
474     logbrush.lbColor = RGB(1,2,3);
475     logbrush.lbHatch = 22;
476     hPen = ExtCreatePen(PS_GEOMETRIC | PS_DASH, 5, &logbrush, 0, NULL);
477 
478     SetLastError(ERROR_SUCCESS);
479     ok(GDI_HANDLE_GET_TYPE(hPen) == GDI_OBJECT_TYPE_EXTPEN, "\n");
480     ok(GetObject(hPen, sizeof(EXTLOGPEN), NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD), "\n");
481     ok(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD), "\n");
482     ok(GetObject((HANDLE)GDI_HANDLE_GET_INDEX(hPen), 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD), "\n");
483     ok(GetObject(hPen, 5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD), "\n");
484     ok(GetObject(hPen, -5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD), "\n");
485     ok(GetLastError() == ERROR_SUCCESS, "\n");
486     ok(GetObject((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0, "\n");
487     ok(GetLastError() ==  ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError());
488     SetLastError(0xbadbad00);
489     ok(GetObject(hPen, 0, &extlogpen) == 0, "\n");
490     ok((GetLastError() == 0xbadbad00) || (GetLastError() == ERROR_NOACCESS), "wrong error: %ld\n", GetLastError());
491     SetLastError(ERROR_SUCCESS);
492     ok(GetObject(hPen, 4, &extlogpen) == 0, "\n");
493     ok(GetLastError() == ERROR_SUCCESS, "got %ld\n", GetLastError());
494     SetLastError(ERROR_SUCCESS);
495     ok(GetObject((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, &extlogpen) == 0, "\n");
496     ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError());
497     SetLastError(ERROR_SUCCESS);
498     ok(GetObject((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 4, &extlogpen) == 0, "\n");
499     ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %ld\n", GetLastError());
500     SetLastError(ERROR_SUCCESS);
501     ok(GetObject(hPen,  sizeof(EXTLOGPEN) - 5, &extlogpen) == 0, "\n");
502     ok(GetLastError() == ERROR_SUCCESS, "got %ld\n", GetLastError());
503 
504     /* Nothing should be filled */
505     ok(extlogpen.elpPenStyle == 0x77777777, "\n");
506     ok(extlogpen.elpWidth == 0x77777777, "\n");
507 
508     ok(GetObject(hPen, sizeof(EXTLOGPEN), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD), "\n");
509     ok(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD), "\n");
510     ok(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD)-1, &extlogpen) == 0, "\n");
511     ok(GetObject(hPen, sizeof(EXTLOGPEN)+2, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD), "\n");
512     ok(GetObject(hPen, -5, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD), "\n");
513 
514     /* test if the fields are filled correctly */
515     ok(extlogpen.elpPenStyle == (PS_GEOMETRIC | PS_DASH), "\n");
516     ok(extlogpen.elpWidth == 5, "\n");
517     ok(extlogpen.elpBrushStyle == 0, "\n");
518     ok(extlogpen.elpColor == RGB(1,2,3), "\n");
519     ok(extlogpen.elpHatch == 22, "\n");
520     ok(extlogpen.elpNumEntries == 0, "\n");
521     DeleteObject(hPen);
522 
523     /* A maximum of 16 Styles is allowed */
524     hPen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 5, &logbrush, 16, (CONST DWORD*)&dwStyles);
525     ok(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD), "\n");
526     ok(GetObject(hPen, sizeof(EXTLOGPEN) + 15*sizeof(DWORD), &elpUserStyle) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD), "\n");
527     for (i = 0; i <= 15; i++)
528         ok(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[i] == i, "%d\n", i);
529     DeleteObject(hPen);
530 }
531 
532 void
533 Test_Font(void)
534 {
535     HFONT hFont;
536     union
537     {
538         LOGFONTA logfonta;
539         LOGFONTW logfontw;
540         EXTLOGFONTA extlogfonta;
541         EXTLOGFONTW extlogfontw;
542         ENUMLOGFONTEXA enumlogfontexa;
543         ENUMLOGFONTEXW enumlogfontexw;
544         ENUMLOGFONTEXDVA enumlogfontexdva;
545         ENUMLOGFONTEXDVW enumlogfontexdvw;
546         ENUMLOGFONTA enumlogfonta;
547         ENUMLOGFONTW enumlogfontw;
548         BYTE bData[270];
549     } u;
550     int ret;
551 
552     FillMemory(&u, sizeof(u), 0x77);
553     hFont = CreateFontA(8, 8, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
554         ANSI_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
555         ANTIALIASED_QUALITY, DEFAULT_PITCH, "testfont");
556     ok(hFont != 0, "\n");
557 
558     SetLastError(ERROR_SUCCESS);
559     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTA), "\n");
560     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTW), "\n");
561     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA), "\n"); // 60
562     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTA), NULL) == sizeof(LOGFONTA), "\n"); // 156
563     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXA), NULL) == sizeof(LOGFONTA), "\n"); // 188
564     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTA), NULL) == sizeof(LOGFONTA), "\n"); // 192
565     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA), NULL) == sizeof(LOGFONTA), "\n"); // 260
566     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA)+1, NULL) == sizeof(LOGFONTA), "\n"); // 260
567     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW), "\n"); // 92
568     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTW), NULL) == sizeof(LOGFONTW), "\n"); // 284
569     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTW), NULL) == sizeof(LOGFONTW), "\n"); // 320
570     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXW), NULL) == sizeof(LOGFONTW), "\n"); // 348
571     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW), NULL) == sizeof(LOGFONTW), "\n"); // 420
572     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW)+1, NULL) == sizeof(LOGFONTW), "\n"); // 356!
573     ok(GetLastError() == ERROR_SUCCESS, "got %ld\n", GetLastError());
574 
575     ok(GetObjectA(hFont, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA), "\n");
576     ok(GetObjectA(hFont, 0, NULL) == sizeof(LOGFONTA), "\n");
577     ok(GetObjectA(hFont, 5, NULL) == sizeof(LOGFONTA), "\n");
578     ok(GetObjectA(hFont, -5, NULL) == sizeof(LOGFONTA), "\n");
579     ok(GetObjectA(hFont, 0, &u.logfonta) == 0, "\n");
580     ok(u.logfonta.lfHeight == 0x77777777, "\n");
581 
582     ok(GetObjectA(hFont, 5, &u.logfonta) == 5, "\n");
583     ok(u.logfonta.lfHeight == 8, "\n");
584     ok(u.logfonta.lfWidth == 0x77777708, "\n");
585 
586     ok(GetObjectA(hFont, 0, &u.logfonta) == 0, "\n");
587     ok(GetObjectA(hFont, -1, &u.logfonta) == sizeof(ENUMLOGFONTEXDVA), "\n");
588     ok(GetObjectA(hFont, 1, &u.logfonta) == 1, "\n"); // 1 -> 1
589     ok(GetObjectA(hFont, sizeof(LOGFONTA) - 1, &u.logfonta) == sizeof(LOGFONTA) - 1, "\n"); // 59 -> 59
590     ok(GetObjectA(hFont, sizeof(LOGFONTA), &u.logfonta) == sizeof(LOGFONTA), "\n"); // 60 -> 60
591     ok(GetObjectA(hFont, sizeof(LOGFONTA) + 1, &u.logfonta) == sizeof(LOGFONTA) + 1, "\n"); // 61 -> 61
592     ok(GetObjectA(hFont, sizeof(LOGFONTW) - 1, &u.logfontw) == sizeof(LOGFONTW) - 1, "\n"); // 91 -> 91
593     ok(GetObjectA(hFont, sizeof(LOGFONTW), &u.logfontw) == sizeof(LOGFONTA), "\n"); // 92 -> 60
594     ok(GetObjectA(hFont, sizeof(LOGFONTW) + 1, &u.logfontw) == sizeof(LOGFONTW) + 1, "\n"); // 93 -> 93
595     ok(GetObjectA(hFont, sizeof(EXTLOGFONTA), &u.extlogfonta) == sizeof(EXTLOGFONTA), "\n"); // 192 -> 192
596     ok(GetObjectA(hFont, sizeof(EXTLOGFONTA)+1, &u.extlogfonta) == sizeof(EXTLOGFONTA)+1, "\n"); // 192+1 -> 192+1
597     ok(GetObjectA(hFont, sizeof(EXTLOGFONTA)+16*4, &u.extlogfonta) == sizeof(EXTLOGFONTA)+16*4, "\n"); // 192+1 -> 192+1
598     ok(GetObjectA(hFont, sizeof(EXTLOGFONTW), &u.extlogfontw) == sizeof(ENUMLOGFONTEXDVA), "\n"); // 320 -> 260
599     ok(GetObjectA(hFont, 261, &u.bData) == 260, "\n"); // no
600 
601     ok(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA) - 1, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXDVA) - 1, "\n"); // 419
602     ok(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA), &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXDVA), "\n"); // 420
603     ok(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA)+1, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXDVA), "\n"); // 356!
604 
605     /* LOGFONT / GetObjectW */
606     FillMemory(&u.logfontw, sizeof(LOGFONTW), 0x77);
607 
608     ok(GetObjectW(hFont, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW), "1\n");
609     ok(GetObjectW(hFont, 0, NULL) == sizeof(LOGFONTW), "\n");
610     ok(GetObjectW(hFont, 5, NULL) == sizeof(LOGFONTW), "\n");
611     ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXA), NULL) == sizeof(LOGFONTW), "\n");
612     ok(GetObjectW(hFont, -5, NULL) == sizeof(LOGFONTW), "\n");
613     ok(GetObjectW(hFont, 0, &u.logfontw) == 0, "\n");
614     ok(u.logfontw.lfHeight == 0x77777777, "\n");
615 
616     ok(GetObjectW(hFont, 5, &u.logfontw) == 5, "\n");
617     ok(u.logfontw.lfHeight == 8, "\n");
618     ok(u.logfontw.lfWidth == 0x77777708, "\n");
619 
620     ok(GetObjectA(hFont, sizeof(LOGFONTA), &u.logfonta) == sizeof(LOGFONTA), "\n"); // 60
621     ok(u.logfonta.lfHeight == 8, "\n");
622     ok(GetObjectA(hFont, sizeof(ENUMLOGFONTA), &u.enumlogfonta) == sizeof(ENUMLOGFONTA), "\n"); // 156
623     ok(GetObjectA(hFont, sizeof(ENUMLOGFONTEXA), &u.enumlogfontexa) == sizeof(ENUMLOGFONTEXA), "\n"); // 188
624     ok(GetObjectA(hFont, sizeof(EXTLOGFONTA), &u.extlogfonta) == sizeof(EXTLOGFONTA), "\n"); // 192
625     ok(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA), &u.enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA), "\n"); // 260
626     ok(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA)+1, &u.enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA), "\n"); // 260
627 
628     ok(GetObjectW(hFont, sizeof(LOGFONTW), &u.logfontw) == sizeof(LOGFONTW), "\n"); // 92
629     ok(GetObjectW(hFont, sizeof(LOGFONTW) + 1, &u.logfontw) == sizeof(LOGFONTW) + 1, "\n"); // 92
630     ok(GetObjectW(hFont, sizeof(LOGFONTW) - 1, &u.logfontw) == sizeof(LOGFONTW) - 1, "\n"); // 92
631     ok(GetObjectW(hFont, sizeof(ENUMLOGFONTW), &u.enumlogfontw) == sizeof(ENUMLOGFONTW), "\n"); // 284
632     ok(GetObjectW(hFont, sizeof(EXTLOGFONTW), &u.extlogfontw) == sizeof(EXTLOGFONTW), "\n"); // 320
633     ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW), &u.enumlogfontexw) == sizeof(ENUMLOGFONTEXW), "\n"); // 348
634     ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW) + 1, &u.enumlogfontexw) == sizeof(ENUMLOGFONTEXW) + 1, "\n"); // 348
635     ok(GetObjectW(hFont, 355, &u.enumlogfontexdvw) == 355, "\n"); // 419
636 
637     ok(GetObjectW(hFont, 356, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 419
638     ret = sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD);
639     ret = GetObjectW(hFont, 357, &u.enumlogfontexdvw);
640     ok(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n");
641     ok(GetObjectW(hFont, 357, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 419
642     ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW) - 1, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 419
643     ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW), &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 420
644     ok(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW)+1, &u.enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD), "\n"); // 356!
645     ok(GetLastError() == ERROR_SUCCESS, "got %ld\n", GetLastError());
646 
647     DeleteObject(hFont);
648 }
649 
650 void
651 Test_Colorspace(void)
652 {
653     UCHAR buffer[1000];
654 
655     SetLastError(ERROR_SUCCESS);
656     GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL);
657     //ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 60, "\n");// FIXME: what structure? fails on win7
658     ok_err(ERROR_INSUFFICIENT_BUFFER);
659     SetLastError(ERROR_SUCCESS);
660     ok(GetObjectW((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 0, "\n");
661     ok_err(ERROR_INSUFFICIENT_BUFFER);
662     SetLastError(ERROR_SUCCESS);
663     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 327, buffer) == 0, "\n");
664     ok_err(ERROR_INSUFFICIENT_BUFFER);
665     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 328, buffer) == 0, "\n");
666     ok_err(ERROR_INVALID_PARAMETER);
667 
668     //ok_long(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 328, NULL), 0); // FIXME: fails on WHS
669     //ok_err(ERROR_INSUFFICIENT_BUFFER);
670 }
671 
672 void
673 Test_MetaDC(void)
674 {
675     /* Windows does not SetLastError() on a metadc, but it doesn't seem to do anything with it */
676     HDC hMetaDC;
677     BYTE buffer[1000];
678 
679     hMetaDC = CreateMetaFile(NULL);
680     ok(hMetaDC != 0, "CreateMetaFile failed, skipping tests.\n");
681     if(!hMetaDC) return;
682 
683     ok(((UINT_PTR)hMetaDC & GDI_HANDLE_TYPE_MASK) == GDI_OBJECT_TYPE_METADC, "\n");
684 
685     SetLastError(ERROR_SUCCESS);
686     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 0, NULL) == 0, "\n");
687     ok(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 100, &buffer) == 0, "\n");
688     ok(GetObjectA(hMetaDC, 0, NULL) == 0, "\n");
689     ok(GetObjectA(hMetaDC, 1000, &buffer) == 0, "\n");
690     ok(GetLastError() == ERROR_SUCCESS, "got %ld\n", GetLastError());
691 }
692 
693 void
694 Test_Region(void)
695 {
696     HRGN hRgn;
697     hRgn = CreateRectRgn(0,0,5,5);
698     SetLastError(ERROR_SUCCESS);
699     ok(GetObjectW(hRgn, 0, NULL) == 0, "\n");
700     ok(GetLastError() == ERROR_INVALID_HANDLE, "\n");
701     DeleteObject(hRgn);
702 }
703 
704 START_TEST(GetObject)
705 {
706 
707     Test_Font();
708     Test_Colorspace();
709     Test_General();
710     Test_Bitmap();
711     Test_Dibsection();
712     Test_Palette();
713     Test_Brush();
714     Test_DIBBrush();
715     Test_Pen();
716     Test_ExtPen(); // not implemented yet in ROS
717     Test_MetaDC();
718     Test_Region();
719 }
720 
721