- use own version of GdiQueryTable() instead of relying on gdi32.dll

- more tests for NtGdiGetDIBitsInternal

svn path=/trunk/; revision=31226
This commit is contained in:
Timo Kreuzer 2007-12-15 04:35:16 +00:00
parent 5f55fe95c7
commit 07eb7f5d69
3 changed files with 80 additions and 19 deletions

View file

@ -26,8 +26,15 @@ INT
Test_NtGdiGetDIBitsInternal(PTESTINFO pti)
{
HBITMAP hBitmap;
BITMAPINFO bi;
struct
{
BITMAPINFO bi;
RGBQUAD Colors[20];
} bmp;
// BITMAPINFO bi;
INT ScreenBpp;
BITMAPCOREINFO bic;
DWORD data[20*16];
HDC hDCScreen = GetDC(NULL);
ASSERT(hDCScreen != NULL);
@ -48,21 +55,74 @@ Test_NtGdiGetDIBitsInternal(PTESTINFO pti)
RTEST(GetLastError() == ERROR_SUCCESS);
SetLastError(ERROR_SUCCESS);
RTEST(NtGdiGetDIBitsInternal((HDC)2345, hBitmap, 0, 15, NULL, &bi, 0, 0, 0) == 0);
RTEST(NtGdiGetDIBitsInternal(hDCScreen, hBitmap, 0, 0, NULL, NULL, 0, 0, 0) == 0);
RTEST(GetLastError() == ERROR_SUCCESS);
SetLastError(ERROR_SUCCESS);
ZeroMemory(&bi, sizeof(BITMAPINFO));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
RTEST(NtGdiGetDIBitsInternal(hDCScreen, hBitmap, 0, 15, NULL, &bi, DIB_RGB_COLORS,
DIB_BitmapMaxBitsSize(&bi, 15), 0) > 0);
RTEST(NtGdiGetDIBitsInternal(hDCScreen, hBitmap, 0, 15, NULL, NULL, 0, 0, 0) == 0);
RTEST(GetLastError() == ERROR_SUCCESS);
ZeroMemory(&bmp, sizeof(bmp));
bmp.bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
FillMemory(&bmp.Colors, sizeof(bmp.Colors), 0x44);
SetLastError(ERROR_SUCCESS);
RTEST(NtGdiGetDIBitsInternal((HDC)0, hBitmap, 0, 15, NULL, &bmp.bi, 0, 0, 0) > 0);
RTEST(GetLastError() == ERROR_SUCCESS);
TEST(bmp.Colors[0].rgbRed == 0x44);
ZeroMemory(&bmp, sizeof(bmp));
bmp.bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
FillMemory(&bmp.Colors, sizeof(bmp.Colors), 0x44);
SetLastError(ERROR_SUCCESS);
RTEST(NtGdiGetDIBitsInternal((HDC)2345, hBitmap, 0, 15, NULL, &bmp.bi, 0, 0, 0) > 0);
RTEST(GetLastError() == ERROR_SUCCESS);
TEST(bmp.Colors[0].rgbRed == 0x44);
ZeroMemory(&bmp, sizeof(bmp));
bmp.bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
FillMemory(&bmp.Colors, sizeof(bmp.Colors), 0x44);
SetLastError(ERROR_SUCCESS);
RTEST(NtGdiGetDIBitsInternal(hDCScreen, hBitmap, 0, 15, NULL, &bmp.bi, DIB_RGB_COLORS,
DIB_BitmapMaxBitsSize(&bmp.bi, 15), 0) > 0);
RTEST(GetLastError() == ERROR_SUCCESS);
ScreenBpp = GetDeviceCaps(hDCScreen, BITSPIXEL);
RTEST(bi.bmiHeader.biWidth == 16);
RTEST(bi.bmiHeader.biHeight == 16);
RTEST(bi.bmiHeader.biBitCount == ScreenBpp);
RTEST(bi.bmiHeader.biSizeImage == (16 * 16) * (ScreenBpp / 8));
RTEST(bmp.bi.bmiHeader.biWidth == 16);
RTEST(bmp.bi.bmiHeader.biHeight == 16);
RTEST(bmp.bi.bmiHeader.biBitCount == ScreenBpp);
RTEST(bmp.bi.bmiHeader.biSizeImage == (16 * 16) * (ScreenBpp / 8));
TEST(bmp.Colors[0].rgbRed == 0x44);
/* Test with pointer */
// ZeroMemory(&bmp.bi, sizeof(BITMAPINFO));
bmp.bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
// FillMemory(&bmp.Colors, sizeof(bmp.Colors), 0x11223344);
SetLastError(ERROR_SUCCESS);
TEST(NtGdiGetDIBitsInternal(hDCScreen, hBitmap, 0, 15, (void*)data, &bmp.bi, DIB_RGB_COLORS,
DIB_BitmapMaxBitsSize(&bmp.bi, 15), 0) > 0);
RTEST(GetLastError() == ERROR_SUCCESS);
RTEST(bmp.bi.bmiHeader.biWidth == 16);
RTEST(bmp.bi.bmiHeader.biHeight == 16);
RTEST(bmp.bi.bmiHeader.biBitCount == ScreenBpp);
RTEST(bmp.bi.bmiHeader.biSizeImage == (16 * 16) * (ScreenBpp / 8));
TEST(bmp.Colors[0].rgbRed != 0x44);
/* Test a BITMAPCOREINFO structure */
SetLastError(ERROR_SUCCESS);
ZeroMemory(&bic, sizeof(BITMAPCOREINFO));
bic.bmciHeader.bcSize = sizeof(BITMAPCOREHEADER);
TEST(NtGdiGetDIBitsInternal(hDCScreen, hBitmap, 0, 15, NULL, (PBITMAPINFO)&bic, DIB_RGB_COLORS,
DIB_BitmapMaxBitsSize((PBITMAPINFO)&bic, 15), 0) > 0);
RTEST(GetLastError() == ERROR_SUCCESS);
ReleaseDC(NULL, hDCScreen);
DeleteObject(hBitmap);

View file

@ -4,6 +4,15 @@ HINSTANCE g_hInstance;
HMODULE g_hModule = NULL;
PGDI_TABLE_ENTRY GdiHandleTable;
static
PGDI_TABLE_ENTRY
MyGdiQueryTable()
{
PTEB pTeb = NtCurrentTeb();
PPEB pPeb = pTeb->ProcessEnvironmentBlock;
return pPeb->GdiSharedHandleTable;
}
static DWORD STDCALL
IntSyscall(FARPROC proc, UINT cParams, PVOID pFirstParam)
{
@ -59,7 +68,6 @@ WinMain(HINSTANCE hInstance,
int nCmdShow)
{
g_hInstance = hInstance;
GDIQUERYPROC GdiQueryTable;
printf("Win32k native API test\n");
@ -73,12 +81,7 @@ WinMain(HINSTANCE hInstance,
return -1;
}
GdiQueryTable = (GDIQUERYPROC)GetProcAddress(GetModuleHandleW(L"GDI32.DLL"), "GdiQueryTable");
if(!GdiQueryTable)
{
return -1;
}
GdiHandleTable = GdiQueryTable();
GdiHandleTable = MyGdiQueryTable();
if(!GdiHandleTable)
{
return -1;

View file

@ -32,8 +32,6 @@ typedef struct
INT nParams;
} SYCALL_ENTRY, *PSYSCALL_ENTRY;
typedef PGDI_TABLE_ENTRY (CALLBACK * GDIQUERYPROC) (void);
extern HINSTANCE g_hInstance;
extern HMODULE g_hModule;
extern PGDI_TABLE_ENTRY GdiHandleTable;