INT
Test_NtGdiCreateBitmap_Params(PTESTINFO pti)
{
	HBITMAP hBmp;
	BITMAP bitmap;
	BYTE BitmapData[10] = {0x11, 0x22, 0x33};

	/* Test simple params */
	SetLastError(ERROR_SUCCESS);
	TEST((hBmp = NtGdiCreateBitmap(1, 1, 1, 1, NULL)) != NULL);
	TEST(GetLastError() == ERROR_SUCCESS);
	DeleteObject(hBmp);

	/* Test all zero */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(0, 0, 0, 0, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test cx == 0 */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(0, 1, 1, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test negative cx */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(-10, 1, 1, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test cy == 0 */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(1, 0, 1, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test negative cy */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(1, -2, 1, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test negative cy and valid bits */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(1, -2, 1, 1, BitmapData) == NULL);
	TEST(GetLastError() == ERROR_SUCCESS);

	/* Test negative cy and invalid bits */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(1, -2, 1, 1, (BYTE*)0x80001234) == NULL);
	TEST(GetLastError() == ERROR_SUCCESS);

	/* Test huge size */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(100000, 100000, 1, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_NOT_ENOUGH_MEMORY);

	/* Test huge size and valid bits */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(1000, 1000, 1, 1, BitmapData) == NULL);
	TEST(GetLastError() == ERROR_SUCCESS);

	/* Test huge size and invalid bits */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(100000, 100000, 1, 1, (BYTE*)0x80001234) == NULL);
	TEST(GetLastError() == ERROR_SUCCESS);

	/* Test cPlanes == 0 */
	SetLastError(ERROR_SUCCESS);
	TEST((hBmp = NtGdiCreateBitmap(1, 1, 0, 1, NULL)) != NULL);
	TEST(GetLastError() == ERROR_SUCCESS);
	ASSERT(GetObject(hBmp, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
	TEST(bitmap.bmType == 0);
	TEST(bitmap.bmWidth == 1);
	TEST(bitmap.bmHeight == 1);
	TEST(bitmap.bmWidthBytes == 2);
	TEST(bitmap.bmPlanes == 1);
	TEST(bitmap.bmBitsPixel == 1);
	DeleteObject(hBmp);

	/* Test big cPlanes */
	SetLastError(ERROR_SUCCESS);
	TEST((hBmp = NtGdiCreateBitmap(1, 1, 32, 1, NULL)) != NULL);
	TEST(GetLastError() == ERROR_SUCCESS);
	DeleteObject(hBmp);

	TEST(NtGdiCreateBitmap(1, 1, 33, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test cBPP == 0 */
	SetLastError(ERROR_SUCCESS);
	TEST((hBmp = NtGdiCreateBitmap(1, 1, 1, 0, NULL)) != NULL);
	TEST(GetLastError() == ERROR_SUCCESS);
	ASSERT(GetObject(hBmp, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
	TEST(bitmap.bmType == 0);
	TEST(bitmap.bmWidth == 1);
	TEST(bitmap.bmHeight == 1);
	TEST(bitmap.bmWidthBytes == 2);
	TEST(bitmap.bmPlanes == 1);
	TEST(bitmap.bmBitsPixel == 1);
	DeleteObject(hBmp);

	/* Test negative cBPP */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(1, 1, 1, -1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test bad cBPP */
	SetLastError(ERROR_SUCCESS);
	TEST((hBmp = NtGdiCreateBitmap(1, 1, 1, 3, NULL)) != NULL);
	ASSERT(GetObject(hBmp, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
	TEST(bitmap.bmBitsPixel == 4);
	DeleteObject(hBmp);

	TEST((hBmp = NtGdiCreateBitmap(1, 1, 1, 6, NULL)) != NULL);
	ASSERT(GetObject(hBmp, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
	TEST(bitmap.bmBitsPixel == 8);
	DeleteObject(hBmp);

	TEST((hBmp = NtGdiCreateBitmap(1, 1, 1, 15, NULL)) != NULL);
	ASSERT(GetObject(hBmp, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
	TEST(bitmap.bmBitsPixel == 16);
	DeleteObject(hBmp);

	TEST((hBmp = NtGdiCreateBitmap(1, 1, 1, 17, NULL)) != NULL);
	ASSERT(GetObject(hBmp, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
	TEST(bitmap.bmBitsPixel == 24);
	DeleteObject(hBmp);

	TEST((hBmp = NtGdiCreateBitmap(1, 1, 3, 7, NULL)) != NULL);
	ASSERT(GetObject(hBmp, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
	TEST(bitmap.bmBitsPixel == 24);
	DeleteObject(hBmp);

	TEST((hBmp = NtGdiCreateBitmap(1, 1, 1, 25, NULL)) != NULL);
	ASSERT(GetObject(hBmp, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
	TEST(bitmap.bmBitsPixel == 32);
	DeleteObject(hBmp);

	TEST(GetLastError() == ERROR_SUCCESS);

	TEST(NtGdiCreateBitmap(1, 1, 1, 33, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test bad pointer */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(1, 1, 1, 1, (BYTE*)0x80001234) == NULL);
	TEST(GetLastError() == ERROR_SUCCESS);

	/* Test pointer alignment */
	SetLastError(ERROR_SUCCESS);
	TEST((hBmp = NtGdiCreateBitmap(1, 1, 1, 1, &BitmapData[1])) != NULL);
	TEST(GetLastError() == ERROR_SUCCESS);
	DeleteObject(hBmp);

	/* Test normal params */
	SetLastError(ERROR_SUCCESS);
	TEST((hBmp = NtGdiCreateBitmap(5, 7, 2, 4, NULL)) != NULL);
	TEST(GetLastError() == ERROR_SUCCESS);
	ASSERT(GetObject(hBmp, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
	TEST(bitmap.bmType == 0);
	TEST(bitmap.bmWidth == 5);
	TEST(bitmap.bmHeight == 7);
	TEST(bitmap.bmWidthBytes == 6);
	TEST(bitmap.bmPlanes == 1);
	TEST(bitmap.bmBitsPixel == 8);
	DeleteObject(hBmp);


	/* Test height 0 params */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(1, 0, 1, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test height -1 params */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(1, -1, 1, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test witdth 0 params */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(0, 1, 1, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);

	/* Test witdth -1 params */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(-1, 0, 1, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);


    /* Test witdth -1 params */
	SetLastError(ERROR_SUCCESS);
	TEST(NtGdiCreateBitmap(0, 0, 1, 1, NULL) == NULL);
	TEST(GetLastError() == ERROR_INVALID_PARAMETER);


	return APISTATUS_NORMAL;
}

INT
Test_NtGdiCreateBitmap(PTESTINFO pti)
{
	INT ret;

	ret = Test_NtGdiCreateBitmap_Params(pti);
	if (ret != APISTATUS_NORMAL)
		return ret;

//	ret = Test_NtGdiCreateBitmap_Pixel(pti);
//	if (ret != APISTATUS_NORMAL)
//		return ret;

	return APISTATUS_NORMAL;

}