INT
Test_GetDIBits(PTESTINFO pti)
{
	HDC hDCScreen;
	HBITMAP hBitmap;
	BITMAPINFO bi;
	INT ScreenBpp;

	hDCScreen = GetDC(NULL);
	if (hDCScreen == NULL)
	{
		return FALSE;
	}

	hBitmap = CreateCompatibleBitmap(hDCScreen, 16, 16);
	RTEST(hBitmap != NULL);

	/* misc */
	SetLastError(ERROR_SUCCESS);
	RTEST(GetDIBits(0, 0, 0, 0, NULL, NULL, 0) == 0);
	RTEST(GetLastError() == ERROR_INVALID_PARAMETER);

	SetLastError(ERROR_SUCCESS);
	RTEST(GetDIBits((HDC)2345, 0, 0, 0, NULL, NULL, 0) == 0);
	RTEST(GetLastError() == ERROR_INVALID_PARAMETER);

	SetLastError(ERROR_SUCCESS);
	RTEST(GetDIBits((HDC)2345, hBitmap, 0, 0, NULL, NULL, 0) == 0);
	RTEST(GetLastError() == ERROR_INVALID_PARAMETER);

	SetLastError(ERROR_SUCCESS);
	RTEST(GetDIBits((HDC)2345, hBitmap, 0, 15, NULL, &bi, 0) == 0);
	RTEST(GetLastError() == ERROR_INVALID_PARAMETER);



	/* null hdc */
	SetLastError(ERROR_SUCCESS);
	ZeroMemory(&bi, sizeof(BITMAPINFO));
	bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	RTEST(GetDIBits(NULL, hBitmap, 0, 15, NULL, &bi, DIB_RGB_COLORS) == 0);
	RTEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* null bitmap */
	SetLastError(ERROR_SUCCESS);
	ZeroMemory(&bi, sizeof(BITMAPINFO));
	bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	RTEST(GetDIBits(hDCScreen, NULL, 0, 15, NULL, &bi, DIB_RGB_COLORS) == 0);
	RTEST(GetLastError() == ERROR_SUCCESS);

	/* 0 scan lines */
	SetLastError(ERROR_SUCCESS);
	ZeroMemory(&bi, sizeof(BITMAPINFO));
	bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	RTEST(GetDIBits(hDCScreen, hBitmap, 0, 0, NULL, &bi, DIB_RGB_COLORS) > 0);
	RTEST(GetLastError() == ERROR_SUCCESS);

	/* null bitmap info - crashes XP*/
	//SetLastError(ERROR_SUCCESS);
	//RTEST(GetDIBits(hDCScreen, NULL, 0, 15, NULL, NULL, DIB_RGB_COLORS) == 0);
	//RTEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* bad bmi colours (uUsage) */
	SetLastError(ERROR_SUCCESS);
	ZeroMemory(&bi, sizeof(BITMAPINFO));
	bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	RTEST(GetDIBits(hDCScreen, hBitmap, 0, 15, NULL, &bi, 100) == 0);
	RTEST(GetLastError() == ERROR_SUCCESS);
	RTEST(bi.bmiHeader.biWidth == 0);
	RTEST(bi.bmiHeader.biHeight == 0);
	RTEST(bi.bmiHeader.biBitCount == 0);
	RTEST(bi.bmiHeader.biSizeImage == 0);

	/* basic call */
	SetLastError(ERROR_SUCCESS);
	ZeroMemory(&bi, sizeof(BITMAPINFO));
	bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	RTEST(GetDIBits(hDCScreen, hBitmap, 0, 15, NULL, &bi, DIB_RGB_COLORS) > 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));

	DeleteObject(hBitmap);
	ReleaseDC(NULL, hDCScreen);
	return APISTATUS_NORMAL;
}
