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