Set svn:eol-style "native" for all apitest stuff
[reactos.git] / rostests / apitests / gdi32api / tests / GetObject.c
index bcfedcf..1ba23e8 100644 (file)
-static INT\r
-Test_General(PTESTINFO pti)\r
-{\r
-       struct\r
-       {\r
-               LOGBRUSH logbrush;\r
-               BYTE additional[5];\r
-       } TestStruct;\r
-       PLOGBRUSH plogbrush;\r
-       HBRUSH hBrush;\r
-\r
-       /* Test null pointer and invalid handles */\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA(0, 0, NULL) == 0);\r
-       TEST(GetObjectA((HANDLE)-1, 0, NULL) == 0);\r
-       TEST(GetObjectA((HANDLE)0x00380000, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_SUCCESS);\r
-\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-\r
-       /* Test need of alignment */\r
-       hBrush = GetStockObject(WHITE_BRUSH);\r
-       plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush);\r
-       TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH));\r
-       plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 2);\r
-       TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH));\r
-       plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 1);\r
-       TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == 0);\r
-\r
-    return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Bitmap(PTESTINFO pti)\r
-{\r
-       HBITMAP hBitmap;\r
-       BITMAP bitmap;\r
-       DIBSECTION dibsection;\r
-       BYTE bData[100] = {0};\r
-       BYTE Buffer[100] = {48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0};\r
-\r
-       FillMemory(&bitmap, sizeof(BITMAP), 0x77);\r
-       hBitmap = CreateBitmap(10,10,1,8,bData);\r
-       if (!hBitmap) return FALSE;\r
-\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP));\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP));\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, sizeof(BITMAP), NULL) == sizeof(BITMAP));\r
-       TEST(GetObjectA(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));\r
-       TEST(GetObjectA(hBitmap, 0, NULL) == sizeof(BITMAP));\r
-       TEST(GetObjectA((HANDLE)((UINT)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP));\r
-       TEST(GetObjectA(hBitmap, 5, NULL) == sizeof(BITMAP));\r
-       TEST(GetObjectA(hBitmap, -5, NULL) == sizeof(BITMAP));\r
-       TEST(GetObjectA(hBitmap, 0, Buffer) == 0);\r
-       TEST(GetObjectA(hBitmap, 5, Buffer) == 0);\r
-       TEST(GetObjectA(hBitmap, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));\r
-       TEST(GetObjectA(hBitmap, sizeof(BITMAP)+2, &bitmap) == sizeof(BITMAP));\r
-       TEST(GetObjectA(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(BITMAP));\r
-       TEST(GetObjectA(hBitmap, -5, &bitmap) == sizeof(BITMAP));\r
-       TEST(GetLastError() == ERROR_SUCCESS);\r
-\r
-       // todo: test invalid handle + buffer\r
-\r
-       DeleteObject(hBitmap);\r
-       return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Dibsection(PTESTINFO pti)\r
-{\r
-       BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 10, 1, 8, BI_RGB, 0, 10, 10, 0,0}};\r
-       HBITMAP hBitmap;\r
-       DIBSECTION dibsection;\r
-       PVOID pData;\r
-\r
-       FillMemory(&dibsection, sizeof(DIBSECTION), 0x77);\r
-       HDC hDC = GetDC(0);\r
-       hBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, &pData, NULL, 0);\r
-       if(!hBitmap) return FALSE;\r
-\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObject(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));\r
-       TEST(GetObject(hBitmap, 0, NULL) == sizeof(BITMAP));\r
-       TEST(GetObject(hBitmap, 5, NULL) == sizeof(BITMAP));\r
-       TEST(GetObject(hBitmap, -5, NULL) == sizeof(BITMAP));\r
-       TEST(GetObject(hBitmap, 0, &dibsection) == 0);\r
-       TEST(GetObject(hBitmap, 5, &dibsection) == 0);\r
-       TEST(GetObject(hBitmap, sizeof(BITMAP), &dibsection) == sizeof(BITMAP));\r
-       TEST(GetObject(hBitmap, sizeof(BITMAP)+2, &dibsection) == sizeof(BITMAP));\r
-       TEST(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(DIBSECTION));\r
-       TEST(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection) == sizeof(DIBSECTION));\r
-       TEST(GetObject(hBitmap, -5, &dibsection) == sizeof(DIBSECTION));\r
-       TEST(GetLastError() == ERROR_SUCCESS);\r
-       DeleteObject(hBitmap);\r
-       ReleaseDC(0, hDC);\r
-\r
-       return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Palette(PTESTINFO pti)\r
-{\r
-       LOGPALETTE logpal;\r
-       HPALETTE hPalette;\r
-       WORD wPalette;\r
-\r
-       FillMemory(&wPalette, sizeof(WORD), 0x77);\r
-       logpal.palVersion = 0x0300;\r
-       logpal.palNumEntries = 1;\r
-       logpal.palPalEntry[0].peRed = 0;\r
-       logpal.palPalEntry[0].peGreen = 0;\r
-       logpal.palPalEntry[0].peBlue = 0;\r
-       logpal.palPalEntry[0].peFlags = PC_EXPLICIT;\r
-       hPalette = CreatePalette(&logpal);\r
-       if (!hPalette) return FALSE;\r
-\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD));\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD));\r
-       TEST(GetObject(hPalette, sizeof(WORD), NULL) == sizeof(WORD));\r
-       TEST(GetObject(hPalette, 0, NULL) == sizeof(WORD));\r
-       TEST(GetObject(hPalette, 5, NULL) == sizeof(WORD));\r
-       TEST(GetObject(hPalette, -5, NULL) == sizeof(WORD));\r
-       TEST(GetObject(hPalette, sizeof(WORD), &wPalette) == sizeof(WORD));\r
-       TEST(GetObject(hPalette, sizeof(WORD)+2, &wPalette) == sizeof(WORD));\r
-       TEST(GetObject(hPalette, 0, &wPalette) == 0);\r
-       TEST(GetObject(hPalette, 1, &wPalette) == 0);\r
-       TEST(GetObject(hPalette, -1, &wPalette) == sizeof(WORD));\r
-       TEST(GetLastError() == ERROR_SUCCESS);\r
-       DeleteObject(hPalette);\r
-       return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Brush(PTESTINFO pti)\r
-{\r
-       LOGBRUSH logbrush;\r
-       HBRUSH hBrush;\r
-\r
-       FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);\r
-       hBrush = CreateSolidBrush(RGB(1,2,3));\r
-       if (!hBrush) return FALSE;\r
-\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH));\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH));\r
-       TEST(GetObject(hBrush, sizeof(WORD), NULL) == sizeof(LOGBRUSH));\r
-       TEST(GetObject(hBrush, 0, NULL) == sizeof(LOGBRUSH));\r
-       RTEST(GetObject(hBrush, 5, NULL) == sizeof(LOGBRUSH));\r
-       RTEST(GetObject(hBrush, -5, NULL) == sizeof(LOGBRUSH));\r
-\r
-       RTEST(GetObject(hBrush, 0, &logbrush) == 0);\r
-       RTEST(logbrush.lbStyle == 0x77777777);\r
-       RTEST(GetObject(hBrush, 5, &logbrush) == sizeof(LOGBRUSH));\r
-       RTEST(logbrush.lbStyle == 0);\r
-       RTEST(logbrush.lbColor == 0x77777701);\r
-\r
-       RTEST(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush) == sizeof(LOGBRUSH));\r
-       RTEST(GetObject(hBrush, sizeof(LOGBRUSH)+2, &logbrush) == sizeof(LOGBRUSH));\r
-       RTEST(GetObject(hBrush, -1, &logbrush) == sizeof(LOGBRUSH));\r
-       // TODO: test all members\r
-\r
-       RTEST(GetLastError() == ERROR_SUCCESS);\r
-       DeleteObject(hBrush);\r
-       return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Pen(PTESTINFO pti)\r
-{\r
-       LOGPEN logpen;\r
-       HPEN hPen;\r
-\r
-       FillMemory(&logpen, sizeof(LOGPEN), 0x77);\r
-       hPen = CreatePen(PS_SOLID, 3, RGB(4,5,6));\r
-       if (!hPen) return FALSE;\r
-       SetLastError(ERROR_SUCCESS);\r
-       RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN));\r
-       RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN));\r
-       RTEST(GetObject(hPen, sizeof(BITMAP), NULL) == sizeof(LOGPEN));\r
-       RTEST(GetObject(hPen, 0, NULL) == sizeof(LOGPEN));\r
-       RTEST(GetObject(hPen, 5, NULL) == sizeof(LOGPEN));\r
-       RTEST(GetObject(hPen, -5, NULL) == sizeof(LOGPEN));\r
-       RTEST(GetObject(hPen, sizeof(LOGPEN), &logpen) == sizeof(LOGPEN));\r
-       RTEST(GetObject(hPen, sizeof(LOGPEN)-1, &logpen) == 0);\r
-       RTEST(GetObject(hPen, sizeof(LOGPEN)+2, &logpen) == sizeof(LOGPEN));\r
-       RTEST(GetObject(hPen, 0, &logpen) == 0);\r
-       RTEST(GetObject(hPen, -5, &logpen) == sizeof(LOGPEN));\r
-       RTEST(GetLastError() == ERROR_SUCCESS);\r
-\r
-       /* test if the fields are filled correctly */\r
-       RTEST(logpen.lopnStyle == PS_SOLID);\r
-\r
-\r
-       DeleteObject(hPen);\r
-       return TRUE;\r
-}\r
-\r
-static INT\r
-Test_ExtPen(PTESTINFO pti)\r
-{\r
-       HPEN hPen;\r
-       EXTLOGPEN extlogpen;\r
-       LOGBRUSH logbrush;\r
-       DWORD dwStyles[17] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};\r
-       struct\r
-       {\r
-               EXTLOGPEN extlogpen;\r
-               DWORD dwStyles[50];\r
-       } elpUserStyle;\r
-\r
-       SetLastError(ERROR_SUCCESS);\r
-       RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);\r
-       RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_PARAMETER);\r
-\r
-       FillMemory(&extlogpen, sizeof(EXTLOGPEN), 0x77);\r
-       logbrush.lbStyle = BS_SOLID;\r
-       logbrush.lbColor = RGB(1,2,3);\r
-       logbrush.lbHatch = 22;\r
-       hPen = ExtCreatePen(PS_GEOMETRIC | PS_DASH, 5, &logbrush, 0, NULL);\r
-\r
-       RTEST(GDI_HANDLE_GET_TYPE(hPen) == GDI_OBJECT_TYPE_EXTPEN);\r
-       RTEST(GetObject((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);\r
-       RTEST(GetObject(hPen, sizeof(EXTLOGPEN), NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
-       RTEST(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
-       RTEST(GetObject((HANDLE)GDI_HANDLE_GET_INDEX(hPen), 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
-       RTEST(GetObject(hPen, 5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
-       RTEST(GetObject(hPen, -5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
-       RTEST(GetObject(hPen, 0, &extlogpen) == 0);\r
-       RTEST(GetObject(hPen, 4, &extlogpen) == 0);\r
-\r
-       /* Nothing should be filled */\r
-       RTEST(extlogpen.elpPenStyle == 0x77777777);\r
-       RTEST(extlogpen.elpWidth == 0x77777777);\r
-\r
-       RTEST(GetObject(hPen, sizeof(EXTLOGPEN), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
-       RTEST(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
-       RTEST(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD)-1, &extlogpen) == 0);\r
-       RTEST(GetObject(hPen, sizeof(EXTLOGPEN)+2, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
-       RTEST(GetObject(hPen, -5, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));\r
-\r
-       /* test if the fields are filled correctly */\r
-       RTEST(extlogpen.elpPenStyle == (PS_GEOMETRIC | PS_DASH));\r
-       RTEST(extlogpen.elpWidth == 5);\r
-       RTEST(extlogpen.elpBrushStyle == 0);\r
-       RTEST(extlogpen.elpColor == RGB(1,2,3));\r
-       RTEST(extlogpen.elpHatch == 22);\r
-       RTEST(extlogpen.elpNumEntries == 0);\r
-       DeleteObject(hPen);\r
-\r
-       /* A maximum of 16 Styles is allowed */\r
-       hPen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 5, &logbrush, 16, (CONST DWORD*)&dwStyles);\r
-       RTEST(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD));\r
-       RTEST(GetObject(hPen, sizeof(EXTLOGPEN) + 15*sizeof(DWORD), &elpUserStyle) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD));\r
-       RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[0] == 0);\r
-       RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[1] == 1);\r
-       RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[15] == 15);\r
-       DeleteObject(hPen);\r
-\r
-       return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Font(PTESTINFO pti)\r
-{\r
-       HFONT hFont;\r
-       LOGFONTA logfonta;\r
-       LOGFONTW logfontw;\r
-       EXTLOGFONTA extlogfonta;\r
-       EXTLOGFONTW extlogfontw;\r
-       ENUMLOGFONTEXA enumlogfontexa;\r
-       ENUMLOGFONTEXW enumlogfontexw;\r
-       ENUMLOGFONTEXDVA enumlogfontexdva;\r
-       ENUMLOGFONTEXDVW enumlogfontexdvw;\r
-       ENUMLOGFONTA enumlogfonta;\r
-       ENUMLOGFONTW enumlogfontw;\r
-       BYTE bData[270];\r
-\r
-       FillMemory(&logfonta, sizeof(LOGFONTA), 0x77);\r
-       hFont = CreateFontA(8, 8, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,\r
-               ANSI_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,\r
-               ANTIALIASED_QUALITY, DEFAULT_PITCH, "testfont");\r
-       TEST(hFont);\r
-\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTA));\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTW));\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA)); // 60\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTA), NULL) == sizeof(LOGFONTA)); // 156\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXA), NULL) == sizeof(LOGFONTA)); // 188\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTA), NULL) == sizeof(LOGFONTA)); // 192\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA), NULL) == sizeof(LOGFONTA)); // 260\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA)+1, NULL) == sizeof(LOGFONTA)); // 260\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW)); // 92\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTW), NULL) == sizeof(LOGFONTW)); // 284\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTW), NULL) == sizeof(LOGFONTW)); // 320\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXW), NULL) == sizeof(LOGFONTW)); // 348\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW), NULL) == sizeof(LOGFONTW)); // 420\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW)+1, NULL) == sizeof(LOGFONTW)); // 356!\r
-\r
-       TEST(GetObjectA(hFont, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA));\r
-       TEST(GetObjectA(hFont, 0, NULL) == sizeof(LOGFONTA));\r
-       TEST(GetObjectA(hFont, 5, NULL) == sizeof(LOGFONTA));\r
-       TEST(GetObjectA(hFont, -5, NULL) == sizeof(LOGFONTA));\r
-       TEST(GetObjectA(hFont, 0, &logfonta) == 0);\r
-       TEST(logfonta.lfHeight == 0x77777777);\r
-\r
-       TEST(GetObjectA(hFont, 5, &logfonta) == 5);\r
-       TEST(logfonta.lfHeight == 8);\r
-       TEST(logfonta.lfWidth == 0x77777708);\r
-\r
-       TEST(GetObjectA(hFont, sizeof(LOGFONTA), &logfonta) == sizeof(LOGFONTA)); // 60\r
-       TEST(GetObjectA(hFont, sizeof(LOGFONTW), &logfontw) == sizeof(LOGFONTA)); // 92\r
-       TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA), &extlogfonta) == sizeof(EXTLOGFONTA)); // 192\r
-       TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA)+1, &extlogfonta) == sizeof(EXTLOGFONTA)+1); // 192\r
-       TEST(GetObjectA(hFont, sizeof(EXTLOGFONTW), &extlogfontw) == sizeof(ENUMLOGFONTEXDVA)); // 320\r
-\r
-       TEST(GetObjectA(hFont, 261, &bData) == 260); // no\r
-\r
-       /* LOGFONT / GetObjectW */\r
-       FillMemory(&logfontw, sizeof(LOGFONTW), 0x77);\r
-\r
-       TEST(GetObjectW(hFont, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW));\r
-       TEST(GetObjectW(hFont, 0, NULL) == sizeof(LOGFONTW));\r
-       TEST(GetObjectW(hFont, 5, NULL) == sizeof(LOGFONTW));\r
-       TEST(GetObjectW(hFont, -5, NULL) == sizeof(LOGFONTW));\r
-       TEST(GetObjectW(hFont, 0, &logfontw) == 0);\r
-       TEST(logfontw.lfHeight == 0x77777777);\r
-\r
-       TEST(GetObjectW(hFont, 5, &logfontw) == 5);\r
-       TEST(logfontw.lfHeight == 8);\r
-       TEST(logfontw.lfWidth == 0x77777708);\r
-\r
-       TEST(GetObjectA(hFont, sizeof(LOGFONTA), &logfonta) == sizeof(LOGFONTA)); // 60\r
-       TEST(logfonta.lfHeight == 8);\r
-       TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTA), &enumlogfonta) == sizeof(ENUMLOGFONTA)); // 156\r
-       TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXA), &enumlogfontexa) == sizeof(ENUMLOGFONTEXA)); // 188\r
-       TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA), &extlogfonta) == sizeof(EXTLOGFONTA)); // 192\r
-       TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA), &enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA)); // 260\r
-       TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA)+1, &enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA)); // 260\r
-\r
-       TEST(GetObjectW(hFont, sizeof(LOGFONTW), &logfontw) == sizeof(LOGFONTW)); // 92\r
-       TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTW), &enumlogfontw) == sizeof(ENUMLOGFONTW)); // 284\r
-       TEST(GetObjectW(hFont, sizeof(EXTLOGFONTW), &extlogfontw) == sizeof(EXTLOGFONTW)); // 320\r
-       TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW), &enumlogfontexw) == sizeof(ENUMLOGFONTEXW)); // 348\r
-       TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW), &enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD)); // 420\r
-       TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW)+1, &enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD)); // 356!\r
-\r
-       TEST(GetObjectW(hFont, 356, &bData) == 356);\r
-       TEST(GetLastError() == ERROR_SUCCESS);\r
-\r
-       DeleteObject(hFont);\r
-\r
-       return TRUE;\r
-}\r
-\r
-static INT\r
-Test_Colorspace(PTESTINFO pti)\r
-{\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 60);// FIXME: what structure?\r
-       TEST(GetLastError() == ERROR_INSUFFICIENT_BUFFER);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INSUFFICIENT_BUFFER);\r
-\r
-       return TRUE;\r
-}\r
-\r
-static INT\r
-Test_MetaDC(PTESTINFO pti)\r
-{\r
-       /* Windows does not SetLastError() on a metadc, but it doesn't seem to do anything with it */\r
-       HDC hMetaDC;\r
-       BYTE buffer[100];\r
-\r
-       hMetaDC = CreateMetaFile(NULL);\r
-       if(!hMetaDC) return FALSE;\r
-       if(((UINT)hMetaDC & GDI_HANDLE_TYPE_MASK) != GDI_OBJECT_TYPE_METADC) return FALSE;\r
-\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 0, NULL) == 0);\r
-       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 100, &buffer) == 0);\r
-       TEST(GetObjectA(hMetaDC, 0, NULL) == 0);\r
-       TEST(GetObjectA(hMetaDC, 100, &buffer) == 0);\r
-       TEST(GetLastError() == ERROR_SUCCESS);\r
-       return TRUE;\r
-}\r
-\r
-INT\r
-Test_GetObject(PTESTINFO pti)\r
-{\r
-\r
-    HRGN hRgn;\r
-       hRgn = CreateRectRgn(0,0,5,5);\r
-       SetLastError(ERROR_SUCCESS);\r
-       TEST(GetObjectW(hRgn, 0, NULL) == 0);\r
-       TEST(GetLastError() == ERROR_INVALID_HANDLE);\r
-       DeleteObject(hRgn);\r
-\r
-       Test_Font(pti);\r
-       Test_Colorspace(pti);\r
-       Test_General(pti);\r
-       Test_Bitmap(pti);\r
-       Test_Dibsection(pti);\r
-       Test_Palette(pti);\r
-       Test_Brush(pti);\r
-       Test_Pen(pti);\r
-       Test_ExtPen(pti); // not implemented yet in ROS\r
-       Test_MetaDC(pti);\r
-\r
-       return APISTATUS_NORMAL;\r
-}\r
+static INT
+Test_General(PTESTINFO pti)
+{
+       struct
+       {
+               LOGBRUSH logbrush;
+               BYTE additional[5];
+       } TestStruct;
+       PLOGBRUSH plogbrush;
+       HBRUSH hBrush;
+
+       /* Test null pointer and invalid handles */
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA(0, 0, NULL) == 0);
+       TEST(GetObjectA((HANDLE)-1, 0, NULL) == 0);
+       TEST(GetObjectA((HANDLE)0x00380000, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_SUCCESS);
+
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_DC, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_REGION, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EMF, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_METAFILE, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_ENHMETAFILE, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+
+       /* Test need of alignment */
+       hBrush = GetStockObject(WHITE_BRUSH);
+       plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush);
+       TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH));
+       plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 2);
+       TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == sizeof(LOGBRUSH));
+       plogbrush = (PVOID)((ULONG_PTR)&TestStruct.logbrush + 1);
+       TEST(GetObject(hBrush, sizeof(LOGBRUSH), plogbrush) == 0);
+
+    return TRUE;
+}
+
+static INT
+Test_Bitmap(PTESTINFO pti)
+{
+       HBITMAP hBitmap;
+       BITMAP bitmap;
+       DIBSECTION dibsection;
+       BYTE bData[100] = {0};
+       BYTE Buffer[100] = {48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0};
+
+       FillMemory(&bitmap, sizeof(BITMAP), 0x77);
+       hBitmap = CreateBitmap(10,10,1,8,bData);
+       if (!hBitmap) return FALSE;
+
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP));
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BITMAP, 0, NULL) == sizeof(BITMAP));
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BITMAP, sizeof(BITMAP), NULL) == sizeof(BITMAP));
+       TEST(GetObjectA(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));
+       TEST(GetObjectA(hBitmap, 0, NULL) == sizeof(BITMAP));
+       TEST(GetObjectA((HANDLE)((UINT)hBitmap & 0x0000ffff), 0, NULL) == sizeof(BITMAP));
+       TEST(GetObjectA(hBitmap, 5, NULL) == sizeof(BITMAP));
+       TEST(GetObjectA(hBitmap, -5, NULL) == sizeof(BITMAP));
+       TEST(GetObjectA(hBitmap, 0, Buffer) == 0);
+       TEST(GetObjectA(hBitmap, 5, Buffer) == 0);
+       TEST(GetObjectA(hBitmap, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
+       TEST(GetObjectA(hBitmap, sizeof(BITMAP)+2, &bitmap) == sizeof(BITMAP));
+       TEST(GetObjectA(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(BITMAP));
+       TEST(GetObjectA(hBitmap, -5, &bitmap) == sizeof(BITMAP));
+       TEST(GetLastError() == ERROR_SUCCESS);
+
+       // todo: test invalid handle + buffer
+
+       DeleteObject(hBitmap);
+       return TRUE;
+}
+
+static INT
+Test_Dibsection(PTESTINFO pti)
+{
+       BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 10, 1, 8, BI_RGB, 0, 10, 10, 0,0}};
+       HBITMAP hBitmap;
+       DIBSECTION dibsection;
+       PVOID pData;
+
+       FillMemory(&dibsection, sizeof(DIBSECTION), 0x77);
+       HDC hDC = GetDC(0);
+       hBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, &pData, NULL, 0);
+       if(!hBitmap) return FALSE;
+
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObject(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));
+       TEST(GetObject(hBitmap, 0, NULL) == sizeof(BITMAP));
+       TEST(GetObject(hBitmap, 5, NULL) == sizeof(BITMAP));
+       TEST(GetObject(hBitmap, -5, NULL) == sizeof(BITMAP));
+       TEST(GetObject(hBitmap, 0, &dibsection) == 0);
+       TEST(GetObject(hBitmap, 5, &dibsection) == 0);
+       TEST(GetObject(hBitmap, sizeof(BITMAP), &dibsection) == sizeof(BITMAP));
+       TEST(GetObject(hBitmap, sizeof(BITMAP)+2, &dibsection) == sizeof(BITMAP));
+       TEST(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(DIBSECTION));
+       TEST(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection) == sizeof(DIBSECTION));
+       TEST(GetObject(hBitmap, -5, &dibsection) == sizeof(DIBSECTION));
+       TEST(GetLastError() == ERROR_SUCCESS);
+       DeleteObject(hBitmap);
+       ReleaseDC(0, hDC);
+
+       return TRUE;
+}
+
+static INT
+Test_Palette(PTESTINFO pti)
+{
+       LOGPALETTE logpal;
+       HPALETTE hPalette;
+       WORD wPalette;
+
+       FillMemory(&wPalette, sizeof(WORD), 0x77);
+       logpal.palVersion = 0x0300;
+       logpal.palNumEntries = 1;
+       logpal.palPalEntry[0].peRed = 0;
+       logpal.palPalEntry[0].peGreen = 0;
+       logpal.palPalEntry[0].peBlue = 0;
+       logpal.palPalEntry[0].peFlags = PC_EXPLICIT;
+       hPalette = CreatePalette(&logpal);
+       if (!hPalette) return FALSE;
+
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD));
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PALETTE, 0, NULL) == sizeof(WORD));
+       TEST(GetObject(hPalette, sizeof(WORD), NULL) == sizeof(WORD));
+       TEST(GetObject(hPalette, 0, NULL) == sizeof(WORD));
+       TEST(GetObject(hPalette, 5, NULL) == sizeof(WORD));
+       TEST(GetObject(hPalette, -5, NULL) == sizeof(WORD));
+       TEST(GetObject(hPalette, sizeof(WORD), &wPalette) == sizeof(WORD));
+       TEST(GetObject(hPalette, sizeof(WORD)+2, &wPalette) == sizeof(WORD));
+       TEST(GetObject(hPalette, 0, &wPalette) == 0);
+       TEST(GetObject(hPalette, 1, &wPalette) == 0);
+       TEST(GetObject(hPalette, -1, &wPalette) == sizeof(WORD));
+       TEST(GetLastError() == ERROR_SUCCESS);
+       DeleteObject(hPalette);
+       return TRUE;
+}
+
+static INT
+Test_Brush(PTESTINFO pti)
+{
+       LOGBRUSH logbrush;
+       HBRUSH hBrush;
+
+       FillMemory(&logbrush, sizeof(LOGBRUSH), 0x77);
+       hBrush = CreateSolidBrush(RGB(1,2,3));
+       if (!hBrush) return FALSE;
+
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH));
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_BRUSH, 0, NULL) == sizeof(LOGBRUSH));
+       TEST(GetObject(hBrush, sizeof(WORD), NULL) == sizeof(LOGBRUSH));
+       TEST(GetObject(hBrush, 0, NULL) == sizeof(LOGBRUSH));
+       RTEST(GetObject(hBrush, 5, NULL) == sizeof(LOGBRUSH));
+       RTEST(GetObject(hBrush, -5, NULL) == sizeof(LOGBRUSH));
+
+       RTEST(GetObject(hBrush, 0, &logbrush) == 0);
+       RTEST(logbrush.lbStyle == 0x77777777);
+       RTEST(GetObject(hBrush, 5, &logbrush) == sizeof(LOGBRUSH));
+       RTEST(logbrush.lbStyle == 0);
+       RTEST(logbrush.lbColor == 0x77777701);
+
+       RTEST(GetObject(hBrush, sizeof(LOGBRUSH), &logbrush) == sizeof(LOGBRUSH));
+       RTEST(GetObject(hBrush, sizeof(LOGBRUSH)+2, &logbrush) == sizeof(LOGBRUSH));
+       RTEST(GetObject(hBrush, -1, &logbrush) == sizeof(LOGBRUSH));
+       // TODO: test all members
+
+       RTEST(GetLastError() == ERROR_SUCCESS);
+       DeleteObject(hBrush);
+       return TRUE;
+}
+
+static INT
+Test_Pen(PTESTINFO pti)
+{
+       LOGPEN logpen;
+       HPEN hPen;
+
+       FillMemory(&logpen, sizeof(LOGPEN), 0x77);
+       hPen = CreatePen(PS_SOLID, 3, RGB(4,5,6));
+       if (!hPen) return FALSE;
+       SetLastError(ERROR_SUCCESS);
+       RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN));
+       RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_PEN, 0, NULL) == sizeof(LOGPEN));
+       RTEST(GetObject(hPen, sizeof(BITMAP), NULL) == sizeof(LOGPEN));
+       RTEST(GetObject(hPen, 0, NULL) == sizeof(LOGPEN));
+       RTEST(GetObject(hPen, 5, NULL) == sizeof(LOGPEN));
+       RTEST(GetObject(hPen, -5, NULL) == sizeof(LOGPEN));
+       RTEST(GetObject(hPen, sizeof(LOGPEN), &logpen) == sizeof(LOGPEN));
+       RTEST(GetObject(hPen, sizeof(LOGPEN)-1, &logpen) == 0);
+       RTEST(GetObject(hPen, sizeof(LOGPEN)+2, &logpen) == sizeof(LOGPEN));
+       RTEST(GetObject(hPen, 0, &logpen) == 0);
+       RTEST(GetObject(hPen, -5, &logpen) == sizeof(LOGPEN));
+       RTEST(GetLastError() == ERROR_SUCCESS);
+
+       /* test if the fields are filled correctly */
+       RTEST(logpen.lopnStyle == PS_SOLID);
+
+
+       DeleteObject(hPen);
+       return TRUE;
+}
+
+static INT
+Test_ExtPen(PTESTINFO pti)
+{
+       HPEN hPen;
+       EXTLOGPEN extlogpen;
+       LOGBRUSH logbrush;
+       DWORD dwStyles[17] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
+       struct
+       {
+               EXTLOGPEN extlogpen;
+               DWORD dwStyles[50];
+       } elpUserStyle;
+
+       SetLastError(ERROR_SUCCESS);
+       RTEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);
+       RTEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_PARAMETER);
+
+       FillMemory(&extlogpen, sizeof(EXTLOGPEN), 0x77);
+       logbrush.lbStyle = BS_SOLID;
+       logbrush.lbColor = RGB(1,2,3);
+       logbrush.lbHatch = 22;
+       hPen = ExtCreatePen(PS_GEOMETRIC | PS_DASH, 5, &logbrush, 0, NULL);
+
+       RTEST(GDI_HANDLE_GET_TYPE(hPen) == GDI_OBJECT_TYPE_EXTPEN);
+       RTEST(GetObject((HANDLE)GDI_OBJECT_TYPE_EXTPEN, 0, NULL) == 0);
+       RTEST(GetObject(hPen, sizeof(EXTLOGPEN), NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+       RTEST(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+       RTEST(GetObject((HANDLE)GDI_HANDLE_GET_INDEX(hPen), 0, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+       RTEST(GetObject(hPen, 5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+       RTEST(GetObject(hPen, -5, NULL) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+       RTEST(GetObject(hPen, 0, &extlogpen) == 0);
+       RTEST(GetObject(hPen, 4, &extlogpen) == 0);
+
+       /* Nothing should be filled */
+       RTEST(extlogpen.elpPenStyle == 0x77777777);
+       RTEST(extlogpen.elpWidth == 0x77777777);
+
+       RTEST(GetObject(hPen, sizeof(EXTLOGPEN), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+       RTEST(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD), &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+       RTEST(GetObject(hPen, sizeof(EXTLOGPEN)-sizeof(DWORD)-1, &extlogpen) == 0);
+       RTEST(GetObject(hPen, sizeof(EXTLOGPEN)+2, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+       RTEST(GetObject(hPen, -5, &extlogpen) == sizeof(EXTLOGPEN)-sizeof(DWORD));
+
+       /* test if the fields are filled correctly */
+       RTEST(extlogpen.elpPenStyle == (PS_GEOMETRIC | PS_DASH));
+       RTEST(extlogpen.elpWidth == 5);
+       RTEST(extlogpen.elpBrushStyle == 0);
+       RTEST(extlogpen.elpColor == RGB(1,2,3));
+       RTEST(extlogpen.elpHatch == 22);
+       RTEST(extlogpen.elpNumEntries == 0);
+       DeleteObject(hPen);
+
+       /* A maximum of 16 Styles is allowed */
+       hPen = ExtCreatePen(PS_GEOMETRIC | PS_USERSTYLE, 5, &logbrush, 16, (CONST DWORD*)&dwStyles);
+       RTEST(GetObject(hPen, 0, NULL) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD));
+       RTEST(GetObject(hPen, sizeof(EXTLOGPEN) + 15*sizeof(DWORD), &elpUserStyle) == sizeof(EXTLOGPEN) + 15*sizeof(DWORD));
+       RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[0] == 0);
+       RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[1] == 1);
+       RTEST(((EXTLOGPEN*)&elpUserStyle)->elpStyleEntry[15] == 15);
+       DeleteObject(hPen);
+
+       return TRUE;
+}
+
+static INT
+Test_Font(PTESTINFO pti)
+{
+       HFONT hFont;
+       LOGFONTA logfonta;
+       LOGFONTW logfontw;
+       EXTLOGFONTA extlogfonta;
+       EXTLOGFONTW extlogfontw;
+       ENUMLOGFONTEXA enumlogfontexa;
+       ENUMLOGFONTEXW enumlogfontexw;
+       ENUMLOGFONTEXDVA enumlogfontexdva;
+       ENUMLOGFONTEXDVW enumlogfontexdvw;
+       ENUMLOGFONTA enumlogfonta;
+       ENUMLOGFONTW enumlogfontw;
+       BYTE bData[270];
+
+       FillMemory(&logfonta, sizeof(LOGFONTA), 0x77);
+       hFont = CreateFontA(8, 8, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE,
+               ANSI_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS,
+               ANTIALIASED_QUALITY, DEFAULT_PITCH, "testfont");
+       TEST(hFont);
+
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTA));
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, 0, NULL) == sizeof(LOGFONTW));
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA)); // 60
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTA), NULL) == sizeof(LOGFONTA)); // 156
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXA), NULL) == sizeof(LOGFONTA)); // 188
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTA), NULL) == sizeof(LOGFONTA)); // 192
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA), NULL) == sizeof(LOGFONTA)); // 260
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVA)+1, NULL) == sizeof(LOGFONTA)); // 260
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW)); // 92
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTW), NULL) == sizeof(LOGFONTW)); // 284
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(EXTLOGFONTW), NULL) == sizeof(LOGFONTW)); // 320
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXW), NULL) == sizeof(LOGFONTW)); // 348
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW), NULL) == sizeof(LOGFONTW)); // 420
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_FONT, sizeof(ENUMLOGFONTEXDVW)+1, NULL) == sizeof(LOGFONTW)); // 356!
+
+       TEST(GetObjectA(hFont, sizeof(LOGFONTA), NULL) == sizeof(LOGFONTA));
+       TEST(GetObjectA(hFont, 0, NULL) == sizeof(LOGFONTA));
+       TEST(GetObjectA(hFont, 5, NULL) == sizeof(LOGFONTA));
+       TEST(GetObjectA(hFont, -5, NULL) == sizeof(LOGFONTA));
+       TEST(GetObjectA(hFont, 0, &logfonta) == 0);
+       TEST(logfonta.lfHeight == 0x77777777);
+
+       TEST(GetObjectA(hFont, 5, &logfonta) == 5);
+       TEST(logfonta.lfHeight == 8);
+       TEST(logfonta.lfWidth == 0x77777708);
+
+       TEST(GetObjectA(hFont, sizeof(LOGFONTA), &logfonta) == sizeof(LOGFONTA)); // 60
+       TEST(GetObjectA(hFont, sizeof(LOGFONTW), &logfontw) == sizeof(LOGFONTA)); // 92
+       TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA), &extlogfonta) == sizeof(EXTLOGFONTA)); // 192
+       TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA)+1, &extlogfonta) == sizeof(EXTLOGFONTA)+1); // 192
+       TEST(GetObjectA(hFont, sizeof(EXTLOGFONTW), &extlogfontw) == sizeof(ENUMLOGFONTEXDVA)); // 320
+
+       TEST(GetObjectA(hFont, 261, &bData) == 260); // no
+
+       /* LOGFONT / GetObjectW */
+       FillMemory(&logfontw, sizeof(LOGFONTW), 0x77);
+
+       TEST(GetObjectW(hFont, sizeof(LOGFONTW), NULL) == sizeof(LOGFONTW));
+       TEST(GetObjectW(hFont, 0, NULL) == sizeof(LOGFONTW));
+       TEST(GetObjectW(hFont, 5, NULL) == sizeof(LOGFONTW));
+       TEST(GetObjectW(hFont, -5, NULL) == sizeof(LOGFONTW));
+       TEST(GetObjectW(hFont, 0, &logfontw) == 0);
+       TEST(logfontw.lfHeight == 0x77777777);
+
+       TEST(GetObjectW(hFont, 5, &logfontw) == 5);
+       TEST(logfontw.lfHeight == 8);
+       TEST(logfontw.lfWidth == 0x77777708);
+
+       TEST(GetObjectA(hFont, sizeof(LOGFONTA), &logfonta) == sizeof(LOGFONTA)); // 60
+       TEST(logfonta.lfHeight == 8);
+       TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTA), &enumlogfonta) == sizeof(ENUMLOGFONTA)); // 156
+       TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXA), &enumlogfontexa) == sizeof(ENUMLOGFONTEXA)); // 188
+       TEST(GetObjectA(hFont, sizeof(EXTLOGFONTA), &extlogfonta) == sizeof(EXTLOGFONTA)); // 192
+       TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA), &enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA)); // 260
+       TEST(GetObjectA(hFont, sizeof(ENUMLOGFONTEXDVA)+1, &enumlogfontexdva) == sizeof(ENUMLOGFONTEXDVA)); // 260
+
+       TEST(GetObjectW(hFont, sizeof(LOGFONTW), &logfontw) == sizeof(LOGFONTW)); // 92
+       TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTW), &enumlogfontw) == sizeof(ENUMLOGFONTW)); // 284
+       TEST(GetObjectW(hFont, sizeof(EXTLOGFONTW), &extlogfontw) == sizeof(EXTLOGFONTW)); // 320
+       TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXW), &enumlogfontexw) == sizeof(ENUMLOGFONTEXW)); // 348
+       TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW), &enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD)); // 420
+       TEST(GetObjectW(hFont, sizeof(ENUMLOGFONTEXDVW)+1, &enumlogfontexdvw) == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD)); // 356!
+
+       TEST(GetObjectW(hFont, 356, &bData) == 356);
+       TEST(GetLastError() == ERROR_SUCCESS);
+
+       DeleteObject(hFont);
+
+       return TRUE;
+}
+
+static INT
+Test_Colorspace(PTESTINFO pti)
+{
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 60);// FIXME: what structure?
+       TEST(GetLastError() == ERROR_INSUFFICIENT_BUFFER);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectW((HANDLE)GDI_OBJECT_TYPE_COLORSPACE, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INSUFFICIENT_BUFFER);
+
+       return TRUE;
+}
+
+static INT
+Test_MetaDC(PTESTINFO pti)
+{
+       /* Windows does not SetLastError() on a metadc, but it doesn't seem to do anything with it */
+       HDC hMetaDC;
+       BYTE buffer[100];
+
+       hMetaDC = CreateMetaFile(NULL);
+       if(!hMetaDC) return FALSE;
+       if(((UINT)hMetaDC & GDI_HANDLE_TYPE_MASK) != GDI_OBJECT_TYPE_METADC) return FALSE;
+
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 0, NULL) == 0);
+       TEST(GetObjectA((HANDLE)GDI_OBJECT_TYPE_METADC, 100, &buffer) == 0);
+       TEST(GetObjectA(hMetaDC, 0, NULL) == 0);
+       TEST(GetObjectA(hMetaDC, 100, &buffer) == 0);
+       TEST(GetLastError() == ERROR_SUCCESS);
+       return TRUE;
+}
+
+INT
+Test_GetObject(PTESTINFO pti)
+{
+
+    HRGN hRgn;
+       hRgn = CreateRectRgn(0,0,5,5);
+       SetLastError(ERROR_SUCCESS);
+       TEST(GetObjectW(hRgn, 0, NULL) == 0);
+       TEST(GetLastError() == ERROR_INVALID_HANDLE);
+       DeleteObject(hRgn);
+
+       Test_Font(pti);
+       Test_Colorspace(pti);
+       Test_General(pti);
+       Test_Bitmap(pti);
+       Test_Dibsection(pti);
+       Test_Palette(pti);
+       Test_Brush(pti);
+       Test_Pen(pti);
+       Test_ExtPen(pti); // not implemented yet in ROS
+       Test_MetaDC(pti);
+
+       return APISTATUS_NORMAL;
+}