sync rostests to r44455

svn path=/branches/ros-amd64-bringup/; revision=44456
This commit is contained in:
Samuel Serapion 2009-12-07 18:40:32 +00:00
commit e2226bdaec
815 changed files with 186789 additions and 19325 deletions

View file

@ -1,13 +1,12 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
675 Mass Ave, Cambridge, MA 02139, USA
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
@ -16,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@ -56,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
@ -111,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@ -169,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@ -226,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@ -256,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
@ -278,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
Appendix: How to Apply These Terms to Your New Programs
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
@ -292,7 +291,7 @@ convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 19yy <name of author>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -304,16 +303,16 @@ the "copyright" line and a pointer to where the full notice is found.
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) 19yy name of author
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

View file

@ -80,6 +80,36 @@ WriteRow(HANDLE hFile, LPDWORD lpdwBytesWritten, LPWSTR pszFunction, PTESTINFO p
return TRUE;
}
static CHAR
GetDisplayChar(CHAR c)
{
if (c < 32) return '.';
return c;
}
VOID
DumpMem(PVOID pData, ULONG cbSize, ULONG nWidth)
{
ULONG cLines = (cbSize + nWidth - 1) / nWidth;
ULONG cbLastLine = cbSize % nWidth;
INT i,j;
for (i = 0; i <= cLines; i++)
{
printf("%08lx: ", i*nWidth);
for (j = 0; j < (i == cLines? cbLastLine : nWidth); j++)
{
printf("%02x ", ((BYTE*)pData)[i*nWidth + j]);
}
printf(" ");
for (j = 0; j < (i == cLines? cbLastLine : nWidth); j++)
{
printf("%c", GetDisplayChar(((CHAR*)pData)[i*nWidth + j]));
}
printf("\n");
}
}
int
TestMain(LPWSTR pszName, LPWSTR pszModule)
{

View file

@ -40,7 +40,7 @@ typedef struct tagTEST
if (x)\
{\
(pti->passed)++;\
printf("non-rtest succeeded in %s:%d (%s)\n", __FILE__, __LINE__, #x);\
printf("%s:%d: non-rtest succeeded (%s)\n", __FILE__, __LINE__, #x);\
} else {\
(pti->failed)++;\
} \
@ -52,7 +52,30 @@ typedef struct tagTEST
(pti->passed)++;\
} else {\
(pti->failed)++;\
printf("test failed in %s:%d (%s)\n", __FILE__, __LINE__, #x);\
printf("%s:%d: test failed (%s)\n", __FILE__, __LINE__, #x);\
} \
}
#define TESTX(x, format, ...) \
if (pti->bRegress) \
{ \
if (x)\
{\
(pti->passed)++;\
printf("%s:%d: non-rtest succeeded (%s)\n", __FILE__, __LINE__, #x);\
} else {\
(pti->failed)++;\
} \
} \
else \
{ \
if (x)\
{\
(pti->passed)++;\
} else {\
(pti->failed)++;\
printf("%s:%d: test failed (%s) ", __FILE__, __LINE__, #x);\
printf(format, __VA_ARGS__); \
} \
}
@ -91,5 +114,6 @@ int TestMain(LPWSTR pszExe, LPWSTR pszModule);
extern TESTENTRY TestList[];
INT NumTests(void);
BOOL IsFunctionPresent(LPWSTR lpszFunction);
VOID DumpMem(PVOID pData, ULONG cbSize, ULONG nWidth);
#endif /* _APITEST_H */

View file

@ -1,9 +1,6 @@
<module name="dciman32api" type="win32cui">
<include base="dciman32api">.</include>
<define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0501</define>
<library>apitest</library>
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<library>shell32</library>

View file

@ -3,8 +3,6 @@
<group xmlns:xi="http://www.w3.org/2001/XInclude">
<module name="apitest" type="staticlibrary">
<include base="apitest">.</include>
<define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0501</define>
<file>apitest.c</file>
</module>

View file

@ -38,15 +38,6 @@ typedef PGDI_TABLE_ENTRY (CALLBACK * GDIQUERYPROC) (void);
/** Not really an object type. Forces GDI_FreeObj to be silent. */
#define GDI_OBJECT_TYPE_SILENT 0x80000000
/* Number Representation */
typedef LONG FIX;
HDC WINAPI GdiConvertBitmap(HDC hdc);
HBRUSH WINAPI GdiConvertBrush(HBRUSH hbr);
HDC WINAPI GdiConvertDC(HDC hdc);

View file

@ -1,9 +1,6 @@
<module name="gdi32api" type="win32cui">
<include base="gdi32api">.</include>
<define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0501</define>
<library>apitest</library>
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<library>shell32</library>

View file

@ -6,8 +6,10 @@
/* include the tests */
#include "tests/AddFontResource.c"
#include "tests/AddFontResourceEx.c"
#include "tests/BeginPath.c"
#include "tests/CreateBitmapIndirect.c"
#include "tests/CreateCompatibleDC.c"
#include "tests/CreateFontIndirect.c"
#include "tests/CreateFont.c"
#include "tests/CreatePen.c"
#include "tests/CreateRectRgn.c"
@ -33,27 +35,24 @@
#include "tests/GetDIBits.c"
#include "tests/GetObject.c"
#include "tests/GetStockObject.c"
#include "tests/GetTextFace.c"
#include "tests/SelectObject.c"
#include "tests/SetDCPenColor.c"
#include "tests/SetMapMode.c"
#include "tests/SetSysColors.c"
#include "tests/SetWindowExtEx.c"
#include "tests/SetWorldTransform.c"
/* The List of tests */
TESTENTRY TestList[] =
{
{ L"AddFontResourceA", Test_AddFontResourceA },
{ L"AddFontResourceEx", Test_AddFontResourceEx },
{ L"BeginPath", Test_BeginPath },
{ L"CreateBitmapIndirect", Test_CreateBitmapIndirect },
{ L"CreateCompatibleDC", Test_CreateCompatibleDC },
{ L"CreateFontIndirect", Test_CreateFontIndirect },
{ L"CreateFont", Test_CreateFont },
{ L"CreatePen", Test_CreatePen },
{ L"EngCreateSemaphore", Test_EngCreateSemaphore },
@ -79,9 +78,12 @@ TESTENTRY TestList[] =
{ L"GetDIBits", Test_GetDIBits },
{ L"GetObject", Test_GetObject },
{ L"GetStockObject", Test_GetStockObject },
{ L"GetTextFace", Test_GetTextFace },
{ L"SelectObject", Test_SelectObject },
{ L"SetDCPenColor", Test_SetDCPenColor },
{ L"SetMapMode", Test_SetMapMode },
{ L"SetSysColors", Test_SetSysColors },
{ L"SetWindowExtEx", Test_SetWindowExtEx },
{ L"SetWorldTransform", Test_SetWorldTransform },
};

View file

@ -0,0 +1,24 @@
INT
Test_BeginPath(PTESTINFO pti)
{
HDC hDC;
BOOL ret;
SetLastError(0);
ret = BeginPath(0);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
hDC = CreateCompatibleDC(NULL);
SetLastError(0);
ret = BeginPath(hDC);
TEST(ret == 1);
TEST(GetLastError() == 0);
DeleteDC(hDC);
return APISTATUS_NORMAL;
}

View file

@ -39,6 +39,12 @@ Test_CreateCompatibleDC(PTESTINFO pti)
RTEST(hDC2 == NULL);
if (hDC2 != NULL) DeleteDC(hDC2);
/* Check map mode */
hDC = CreateCompatibleDC(hDCScreen);
SetMapMode(hDC, MM_ISOTROPIC);
hDC2 = CreateCompatibleDC(hDC);
TEST(GetMapMode(hDC2) == MM_TEXT);
// cleanup
DeleteDC(hDC);

View file

@ -0,0 +1,180 @@
INT
Test_CreateFontIndirectA(PTESTINFO pti)
{
LOGFONTA logfont;
HFONT hFont;
ULONG ret;
ENUMLOGFONTEXDVW elfedv2;
logfont.lfHeight = 12;
logfont.lfWidth = 0;
logfont.lfEscapement = 0;
logfont.lfOrientation = 0;
logfont.lfWeight = FW_NORMAL;
logfont.lfItalic = 0;
logfont.lfUnderline = 0;
logfont.lfStrikeOut = 0;
logfont.lfCharSet = DEFAULT_CHARSET;
logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logfont.lfQuality = PROOF_QUALITY;
logfont.lfPitchAndFamily = DEFAULT_PITCH;
memset(logfont.lfFaceName, 'A', LF_FACESIZE);
hFont = CreateFontIndirectA(&logfont);
TEST(hFont != 0);
memset(&elfedv2, 0, sizeof(elfedv2));
ret = GetObjectW(hFont, sizeof(elfedv2), &elfedv2);
TEST(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD));
TEST(elfedv2.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == 0);
TEST(elfedv2.elfEnumLogfontEx.elfFullName[0] == 0);
return APISTATUS_NORMAL;
}
INT
Test_CreateFontIndirectW(PTESTINFO pti)
{
LOGFONTW logfont;
HFONT hFont;
ULONG ret;
ENUMLOGFONTEXDVW elfedv2;
logfont.lfHeight = 12;
logfont.lfWidth = 0;
logfont.lfEscapement = 0;
logfont.lfOrientation = 0;
logfont.lfWeight = FW_NORMAL;
logfont.lfItalic = 0;
logfont.lfUnderline = 0;
logfont.lfStrikeOut = 0;
logfont.lfCharSet = DEFAULT_CHARSET;
logfont.lfOutPrecision = OUT_DEFAULT_PRECIS;
logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
logfont.lfQuality = PROOF_QUALITY;
logfont.lfPitchAndFamily = DEFAULT_PITCH;
memset(logfont.lfFaceName, 'A', LF_FACESIZE * 2);
hFont = CreateFontIndirectW(&logfont);
TEST(hFont != 0);
memset(&elfedv2, 0, sizeof(elfedv2));
ret = GetObjectW(hFont, sizeof(elfedv2), &elfedv2);
TEST(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD));
TEST(elfedv2.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == ((WCHAR)'A' << 8) + 'A');
TEST(elfedv2.elfEnumLogfontEx.elfFullName[0] == 0);
/* Theres a bunch of data in elfFullName ... */
return APISTATUS_NORMAL;
}
INT
Test_CreateFontIndirectExA(PTESTINFO pti)
{
ENUMLOGFONTEXDVA elfedva, elfedva2;
ENUMLOGFONTEXDVW elfedvw;
ENUMLOGFONTEXA *penumlfa;
LOGFONTA *plogfonta;
HFONT hFont;
ULONG ret;
memset(&elfedva, 0, sizeof(elfedva));
penumlfa = &elfedva.elfEnumLogfontEx;
plogfonta = &elfedva.elfEnumLogfontEx.elfLogFont;
plogfonta->lfHeight = 12;
plogfonta->lfWidth = 0;
plogfonta->lfEscapement = 0;
plogfonta->lfOrientation = 0;
plogfonta->lfWeight = FW_NORMAL;
plogfonta->lfItalic = 0;
plogfonta->lfUnderline = 0;
plogfonta->lfStrikeOut = 0;
plogfonta->lfCharSet = DEFAULT_CHARSET;
plogfonta->lfOutPrecision = OUT_DEFAULT_PRECIS;
plogfonta->lfClipPrecision = CLIP_DEFAULT_PRECIS;
plogfonta->lfQuality = PROOF_QUALITY;
plogfonta->lfPitchAndFamily = DEFAULT_PITCH;
memset(plogfonta->lfFaceName, 'A', LF_FACESIZE * sizeof(WCHAR));
memset(penumlfa->elfFullName, 'B', LF_FULLFACESIZE * sizeof(WCHAR));
hFont = CreateFontIndirectExA(&elfedva);
TEST(hFont != 0);
ret = GetObjectW(hFont, sizeof(elfedvw), &elfedvw);
TEST(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD));
TEST(elfedvw.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == 0);
TEST(elfedvw.elfEnumLogfontEx.elfFullName[LF_FULLFACESIZE-1] == 0);
memset(&elfedva2, 0, sizeof(elfedva2));
ret = GetObjectA(hFont, sizeof(elfedva2), &elfedva2);
TEST(ret == sizeof(ENUMLOGFONTEXDVA));
TEST(elfedva2.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == 0);
TEST(elfedva2.elfEnumLogfontEx.elfFullName[LF_FULLFACESIZE-1] == 0);
return APISTATUS_NORMAL;
}
INT
Test_CreateFontIndirectExW(PTESTINFO pti)
{
ENUMLOGFONTEXDVW elfedv, elfedv2;
ENUMLOGFONTEXDVA elfedva;
ENUMLOGFONTEXW *penumlfw;
LOGFONTW *plogfontw;
HFONT hFont;
ULONG ret;
memset(&elfedv, 0, sizeof(elfedv));
penumlfw = &elfedv.elfEnumLogfontEx;
plogfontw = &elfedv.elfEnumLogfontEx.elfLogFont;
plogfontw->lfHeight = 12;
plogfontw->lfWidth = 0;
plogfontw->lfEscapement = 0;
plogfontw->lfOrientation = 0;
plogfontw->lfWeight = FW_NORMAL;
plogfontw->lfItalic = 0;
plogfontw->lfUnderline = 0;
plogfontw->lfStrikeOut = 0;
plogfontw->lfCharSet = DEFAULT_CHARSET;
plogfontw->lfOutPrecision = OUT_DEFAULT_PRECIS;
plogfontw->lfClipPrecision = CLIP_DEFAULT_PRECIS;
plogfontw->lfQuality = PROOF_QUALITY;
plogfontw->lfPitchAndFamily = DEFAULT_PITCH;
memset(plogfontw->lfFaceName, 'A', LF_FACESIZE * sizeof(WCHAR));
memset(penumlfw->elfFullName, 'B', LF_FULLFACESIZE * sizeof(WCHAR));
hFont = CreateFontIndirectExW(&elfedv);
TEST(hFont != 0);
memset(&elfedv2, 0, sizeof(elfedv2));
ret = GetObjectW(hFont, sizeof(elfedv2), &elfedv2);
TEST(ret == sizeof(ENUMLOGFONTEXW) + 2*sizeof(DWORD));
TEST(elfedv2.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == ((WCHAR)'A' << 8) + 'A');
TEST(elfedv2.elfEnumLogfontEx.elfFullName[LF_FULLFACESIZE-1] == ((WCHAR)'B' << 8) + 'B');
memset(&elfedva, 0, sizeof(elfedva));
ret = GetObjectA(hFont, sizeof(elfedva), &elfedva);
TEST(ret == sizeof(ENUMLOGFONTEXDVA));
TEST(elfedva.elfEnumLogfontEx.elfLogFont.lfFaceName[LF_FACESIZE-1] == '?');
TEST(elfedva.elfEnumLogfontEx.elfFullName[LF_FULLFACESIZE-1] == 0);
return APISTATUS_NORMAL;
}
INT
Test_CreateFontIndirect(PTESTINFO pti)
{
Test_CreateFontIndirectA(pti);
Test_CreateFontIndirectW(pti);
Test_CreateFontIndirectExA(pti);
Test_CreateFontIndirectExW(pti);
return APISTATUS_NORMAL;
}

View file

@ -1,4 +1,4 @@
LONG STDCALL GdiGetCharDimensions(HDC, LPTEXTMETRICW, LONG *);
LONG WINAPI GdiGetCharDimensions(HDC, LPTEXTMETRICW, LONG *);
INT
Test_GdiGetCharDimensions(PTESTINFO pti)

View file

@ -4,6 +4,7 @@ Test_GetCurrentObject(PTESTINFO pti)
{
HWND hWnd;
HDC hDC;
HBITMAP hBmp;
/* Create a window */
hWnd = CreateWindowW(L"BUTTON", L"TestWindow", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
@ -70,7 +71,6 @@ Test_GetCurrentObject(PTESTINFO pti)
/* Default bitmap */
SetLastError(ERROR_SUCCESS);
HBITMAP hBmp;
hBmp = GetCurrentObject(hDC, OBJ_BITMAP);
RTEST(GDI_HANDLE_GET_TYPE(hBmp) == GDI_OBJECT_TYPE_BITMAP);
RTEST(GetLastError() == ERROR_SUCCESS);

View file

@ -98,15 +98,17 @@ Test_Bitmap(PTESTINFO pti)
static INT
Test_Dibsection(PTESTINFO pti)
{
BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 10, 1, 8, BI_RGB, 0, 10, 10, 0,0}};
BITMAPINFO bmi = {{sizeof(BITMAPINFOHEADER), 10, 9, 1, 8, BI_RGB, 0, 10, 10, 0,0}};
HBITMAP hBitmap;
BITMAP bitmap;
DIBSECTION dibsection;
PVOID pData;
HDC hDC;
FillMemory(&dibsection, sizeof(DIBSECTION), 0x77);
HDC hDC = GetDC(0);
hDC = GetDC(0);
hBitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, &pData, NULL, 0);
if(!hBitmap) return FALSE;
ASSERT(hBitmap);
SetLastError(ERROR_SUCCESS);
RTEST(GetObject(hBitmap, sizeof(DIBSECTION), NULL) == sizeof(BITMAP));
@ -115,8 +117,15 @@ Test_Dibsection(PTESTINFO pti)
RTEST(GetObject(hBitmap, -5, NULL) == sizeof(BITMAP));
RTEST(GetObject(hBitmap, 0, &dibsection) == 0);
RTEST(GetObject(hBitmap, 5, &dibsection) == 0);
RTEST(GetObject(hBitmap, sizeof(BITMAP), &dibsection) == sizeof(BITMAP));
RTEST(GetObject(hBitmap, sizeof(BITMAP)+2, &dibsection) == sizeof(BITMAP));
RTEST(GetObject(hBitmap, sizeof(BITMAP), &bitmap) == sizeof(BITMAP));
RTEST(GetObject(hBitmap, sizeof(BITMAP)+2, &bitmap) == sizeof(BITMAP));
TEST(bitmap.bmType == 0);
TEST(bitmap.bmWidth == 10);
TEST(bitmap.bmHeight == 9);
TEST(bitmap.bmWidthBytes == 12);
TEST(bitmap.bmPlanes == 1);
TEST(bitmap.bmBitsPixel == 8);
TEST(bitmap.bmBits == pData);
RTEST(GetObject(hBitmap, sizeof(DIBSECTION), &dibsection) == sizeof(DIBSECTION));
RTEST(GetObject(hBitmap, sizeof(DIBSECTION)+2, &dibsection) == sizeof(DIBSECTION));
RTEST(GetObject(hBitmap, -5, &dibsection) == sizeof(DIBSECTION));

View file

@ -0,0 +1,68 @@
INT
Test_GetTextFace(PTESTINFO pti)
{
HDC hDC;
INT ret;
INT ret2;
WCHAR Buffer[20];
hDC = CreateCompatibleDC(NULL);
ASSERT(hDC);
/* Whether asking for the string size (NULL buffer) ignores the size argument */
SetLastError(0xE000BEEF);
ret = GetTextFaceW(hDC, 0, NULL);
TEST(ret != 0);
TEST(GetLastError() == 0xE000BEEF);
ret2 = ret;
SetLastError(0xE000BEEF);
ret = GetTextFaceW(hDC, -1, NULL);
TEST(ret != 0);
TEST(ret == ret2);
TEST(GetLastError() == 0xE000BEEF);
ret2 = ret;
SetLastError(0xE000BEEF);
ret = GetTextFaceW(hDC, 10000, NULL);
TEST(ret != 0);
TEST(ret == ret2);
TEST(GetLastError() == 0xE000BEEF);
ret2 = ret;
/* Whether the buffer is correctly filled */
SetLastError(0xE000BEEF);
ret = GetTextFaceW(hDC, 20, Buffer);
TEST(ret != 0);
TEST(ret <= 20);
TEST(Buffer[ret - 1] == 0);
TEST(GetLastError() == 0xE000BEEF);
SetLastError(0xE000BEEF);
ret = GetTextFaceW(hDC, 1, Buffer);
TEST(ret == 1);
TEST(Buffer[ret - 1] == 0);
TEST(GetLastError() == 0xE000BEEF);
SetLastError(0xE000BEEF);
ret = GetTextFaceW(hDC, 2, Buffer);
TEST(ret == 2);
TEST(Buffer[ret - 1] == 0);
TEST(GetLastError() == 0xE000BEEF);
/* Whether invalid buffer sizes are correctly ignored */
SetLastError(0xE000BEEF);
ret = GetTextFaceW(hDC, 0, Buffer);
TEST(ret == 0);
TEST(GetLastError() == 0xE000BEEF);
SetLastError(0xE000BEEF);
ret = GetTextFaceW(hDC, -1, Buffer);
TEST(ret == 0);
TEST(GetLastError() == 0xE000BEEF);
DeleteDC(hDC);
return APISTATUS_NORMAL;
}

View file

@ -2,6 +2,7 @@ INT
Test_SetDCPenColor(PTESTINFO pti)
{
HDC hScreenDC, hDC;
HBITMAP hbmp;
// Test an incorrect DC
SetLastError(ERROR_SUCCESS);
@ -33,6 +34,16 @@ Test_SetDCPenColor(PTESTINFO pti)
SetDCPenColor(hDC, CLR_INVALID);
RTEST(SetDCPenColor(hDC, RGB(0,0,0)) == CLR_INVALID);
hbmp = CreateBitmap(10, 10, 1, 32, NULL);
ASSERT(hbmp);
SelectObject(hDC, hbmp);
SelectObject(hDC, GetStockObject(DC_PEN));
SetDCPenColor(hDC, 0x123456);
MoveToEx(hDC, 0, 0, NULL);
LineTo(hDC, 10, 0);
TEST(GetPixel(hDC, 5, 0) == 0x123456);
// Delete the DC
DeleteDC(hDC);

View file

@ -0,0 +1,181 @@
INT
Test_SetMapMode(PTESTINFO pti)
{
HDC hDC;
SIZE WindowExt, ViewportExt;
ULONG ulMapMode;
hDC = CreateCompatibleDC(NULL);
ASSERT(hDC);
GetWindowExtEx(hDC, &WindowExt);
GetViewportExtEx(hDC, &ViewportExt);
ulMapMode = SetMapMode(hDC, MM_ISOTROPIC);
TEST(ulMapMode == MM_TEXT);
TEST(WindowExt.cx == 1);
TEST(WindowExt.cy == 1);
TEST(ViewportExt.cx == 1);
TEST(ViewportExt.cy == 1);
SetLastError(0);
ulMapMode = SetMapMode(hDC, 0);
TEST(GetLastError() == 0);
TEST(ulMapMode == 0);
/* Go through all valid values */
ulMapMode = SetMapMode(hDC, 1);
TEST(ulMapMode == MM_ISOTROPIC);
ulMapMode = SetMapMode(hDC, 2);
TEST(ulMapMode == 1);
ulMapMode = SetMapMode(hDC, 3);
TEST(ulMapMode == 2);
ulMapMode = SetMapMode(hDC, 4);
TEST(ulMapMode == 3);
ulMapMode = SetMapMode(hDC, 5);
TEST(ulMapMode == 4);
ulMapMode = SetMapMode(hDC, 6);
TEST(ulMapMode == 5);
ulMapMode = SetMapMode(hDC, 7);
TEST(ulMapMode == 6);
ulMapMode = SetMapMode(hDC, 8);
TEST(ulMapMode == 7);
/* Test invalid value */
ulMapMode = SetMapMode(hDC, 9);
TEST(ulMapMode == 0);
ulMapMode = SetMapMode(hDC, 10);
TEST(ulMapMode == 0);
TEST(GetLastError() == 0);
/* Test NULL DC */
ulMapMode = SetMapMode((HDC)0, 2);
TEST(ulMapMode == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
/* Test NULL DC and invalid mode */
ulMapMode = SetMapMode((HDC)0, 10);
TEST(ulMapMode == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
/* Test invalid DC */
ulMapMode = SetMapMode((HDC)0x12345, 2);
TEST(ulMapMode == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
/* Test invalid DC and invalid mode */
ulMapMode = SetMapMode((HDC)0x12345, 10);
TEST(ulMapMode == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
DeleteDC(hDC);
/* Test a deleted DC */
ulMapMode = SetMapMode(hDC, 2);
TEST(ulMapMode == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
/* Test MM_TEXT */
hDC = CreateCompatibleDC(NULL);
SetMapMode(hDC, MM_TEXT);
GetWindowExtEx(hDC, &WindowExt);
GetViewportExtEx(hDC, &ViewportExt);
TEST(WindowExt.cx == 1);
TEST(WindowExt.cy == 1);
TEST(ViewportExt.cx == 1);
TEST(ViewportExt.cy == 1);
DeleteDC(hDC);
/* Test MM_ISOTROPIC */
hDC = CreateCompatibleDC(NULL);
SetMapMode(hDC, MM_ISOTROPIC);
GetWindowExtEx(hDC, &WindowExt);
GetViewportExtEx(hDC, &ViewportExt);
TEST(WindowExt.cx == 3600);
TEST(WindowExt.cy == 2700);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
DeleteDC(hDC);
/* Test MM_ANISOTROPIC */
hDC = CreateCompatibleDC(NULL);
SetMapMode(hDC, MM_ANISOTROPIC);
GetWindowExtEx(hDC, &WindowExt);
GetViewportExtEx(hDC, &ViewportExt);
TEST(WindowExt.cx == 1);
TEST(WindowExt.cy == 1);
TEST(ViewportExt.cx == 1);
TEST(ViewportExt.cy == 1);
/* set MM_ISOTROPIC first, the values will be kept */
SetMapMode(hDC, MM_ISOTROPIC);
SetMapMode(hDC, MM_ANISOTROPIC);
GetWindowExtEx(hDC, &WindowExt);
GetViewportExtEx(hDC, &ViewportExt);
TEST(WindowExt.cx == 3600);
TEST(WindowExt.cy == 2700);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
DeleteDC(hDC);
/* Test MM_LOMETRIC */
hDC = CreateCompatibleDC(NULL);
SetMapMode(hDC, MM_LOMETRIC);
GetWindowExtEx(hDC, &WindowExt);
GetViewportExtEx(hDC, &ViewportExt);
TEST(WindowExt.cx == 3600);
TEST(WindowExt.cy == 2700);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
DeleteDC(hDC);
/* Test MM_HIMETRIC */
hDC = CreateCompatibleDC(NULL);
SetMapMode(hDC, MM_HIMETRIC);
GetWindowExtEx(hDC, &WindowExt);
GetViewportExtEx(hDC, &ViewportExt);
TEST(WindowExt.cx == 36000);
TEST(WindowExt.cy == 27000);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
DeleteDC(hDC);
/* Test MM_LOENGLISH */
hDC = CreateCompatibleDC(NULL);
SetMapMode(hDC, MM_LOENGLISH);
GetWindowExtEx(hDC, &WindowExt);
GetViewportExtEx(hDC, &ViewportExt);
TEST(WindowExt.cx == 1417);
TEST(WindowExt.cy == 1063);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
DeleteDC(hDC);
/* Test MM_HIENGLISH */
hDC = CreateCompatibleDC(NULL);
SetMapMode(hDC, MM_HIENGLISH);
GetWindowExtEx(hDC, &WindowExt);
GetViewportExtEx(hDC, &ViewportExt);
TEST(WindowExt.cx == 14173);
TEST(WindowExt.cy == 10630);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
DeleteDC(hDC);
/* Test MM_TWIPS */
hDC = CreateCompatibleDC(NULL);
SetMapMode(hDC, MM_TWIPS);
GetWindowExtEx(hDC, &WindowExt);
GetViewportExtEx(hDC, &ViewportExt);
TEST(WindowExt.cx == 20409);
TEST(WindowExt.cy == 15307);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
DeleteDC(hDC);
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,275 @@
INT
Test_SetWindowExtEx(PTESTINFO pti)
{
HDC hDC;
BOOL ret;
SIZE WindowExt, ViewportExt;
PGDI_TABLE_ENTRY pEntry;
DC_ATTR* pDC_Attr;
hDC = CreateCompatibleDC(0);
ASSERT(hDC);
SetLastError(0);
ret = SetWindowExtEx(0, 0, 0, NULL);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
TEST(ret == 0);
SetLastError(0);
ret = SetWindowExtEx((HDC)0x1234, 0, 0, NULL);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
TEST(ret == 0);
SetLastError(0);
ret = SetWindowExtEx(hDC, 0, 0, NULL);
TEST(GetLastError() == 0);
TEST(ret == 1);
WindowExt.cx = 1234;
WindowExt.cy = 6789;
SetLastError(0);
ret = SetWindowExtEx(0, 0, 0, &WindowExt);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
TEST(ret == 0);
TEST(WindowExt.cx == 1234);
TEST(WindowExt.cy == 6789);
DeleteDC(hDC);
/* Test with a deleted DC */
SetLastError(0);
ret = SetWindowExtEx(hDC, 0, 0, NULL);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
TEST(ret == 0);
hDC = CreateCompatibleDC(0);
ASSERT(hDC);
pEntry = GdiHandleTable + GDI_HANDLE_GET_INDEX(hDC);
ASSERT(pEntry);
pDC_Attr = pEntry->UserData;
ASSERT(pDC_Attr);
/* Test setting it without changing the map mode (MM_TEXT) */
ret = SetWindowExtEx(hDC, 10, 20, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 1);
TEST(WindowExt.cy == 1);
/* Values should not be changed */
WindowExt.cx = WindowExt.cy = 0;
ret = SetWindowExtEx(hDC, 40, 30, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 1);
TEST(WindowExt.cy == 1);
/* Check the viewport */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == 1);
TEST(ViewportExt.cy == 1);
/* Test setting in isotropic mode with 0 extents */
SetMapMode(hDC, MM_ISOTROPIC);
WindowExt.cx = WindowExt.cy = 0;
ret = SetWindowExtEx(hDC, 0, 0, &WindowExt);
TEST(ret == 0);
TEST(WindowExt.cx == 3600);
TEST(WindowExt.cy == 2700);
ret = SetWindowExtEx(hDC, 100, 0, &WindowExt);
TEST(ret == 0);
ret = SetWindowExtEx(hDC, 0, 100, &WindowExt);
TEST(ret == 0);
/* Test setting in isotropic mode */
ret = SetWindowExtEx(hDC, 21224, 35114, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 3600);
TEST(WindowExt.cy == 2700);
/* Values should be changed */
ret = SetWindowExtEx(hDC,
4 * GetDeviceCaps(GetDC(0), HORZRES),
-4 * GetDeviceCaps(GetDC(0), VERTRES),
&WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 21224);
TEST(WindowExt.cy == 35114);
/* Check the viewport, should be the same */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
/* again isotropic mode with 1:1 res */
ret = SetWindowExtEx(hDC, 123, 123, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 4 * GetDeviceCaps(GetDC(0), HORZRES));
TEST(WindowExt.cy == -4 * GetDeviceCaps(GetDC(0), VERTRES));
/* Test flXform */
TEST(pDC_Attr->flXform & PAGE_EXTENTS_CHANGED);
/* Check the viewport from the dcattr, without going through gdi */
TEST(pDC_Attr->szlViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(pDC_Attr->szlViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
/* Check the viewport with gdi, should not be the same */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), VERTRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
/* Test flXform */
TEST(pDC_Attr->flXform & PAGE_EXTENTS_CHANGED);
/* again isotropic mode with 3:1 res */
ret = SetWindowExtEx(hDC, 300, 100, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 123);
TEST(WindowExt.cy == 123);
/* Check the viewport now, should not be the same */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), VERTRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES) / 3);
/* again isotropic mode with 1:3 res */
SetViewportExtEx(hDC, 6000, 3000, 0);
ret = SetWindowExtEx(hDC, 200, 600, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 300);
TEST(WindowExt.cy == 100);
/* Check the viewport now, should not be the same */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == 1000);
TEST(ViewportExt.cy == 3000);
/* Test setting in anisotropic mode */
SetMapMode(hDC, MM_ANISOTROPIC);
ret = SetWindowExtEx(hDC, 80, 60, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 200);
TEST(WindowExt.cy == 600);
/* Values should be changed */
ret = SetWindowExtEx(hDC, 500, 500, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 80);
TEST(WindowExt.cy == 60);
/* Check the viewport */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == 1000);
TEST(ViewportExt.cy == 3000);
/* Test setting in low metric mode */
SetMapMode(hDC, MM_LOMETRIC);
ret = SetWindowExtEx(hDC, 120, 90, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 3600);
TEST(WindowExt.cy == 2700);
/* Values should not be changed */
WindowExt.cx = WindowExt.cy = 0;
ret = SetWindowExtEx(hDC, 900, 700, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 3600);
TEST(WindowExt.cy == 2700);
/* Check the viewport */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
/* Test setting in high metric mode */
SetMapMode(hDC, MM_HIMETRIC);
ret = SetWindowExtEx(hDC, 120, 90, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 36000);
TEST(WindowExt.cy == 27000);
/* Values should not be changed */
WindowExt.cx = WindowExt.cy = 0;
ret = SetWindowExtEx(hDC, 500, 300, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 36000);
TEST(WindowExt.cy == 27000);
/* Check the viewport */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
/* Test setting in low english mode */
SetMapMode(hDC, MM_LOENGLISH);
ret = SetWindowExtEx(hDC, 320, 290, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 1417);
TEST(WindowExt.cy == 1063);
/* Values should not be changed */
WindowExt.cx = WindowExt.cy = 0;
ret = SetWindowExtEx(hDC, 560, 140, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 1417);
TEST(WindowExt.cy == 1063);
/* Check the viewport */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
/* Test setting in high english mode */
SetMapMode(hDC, MM_HIENGLISH);
ret = SetWindowExtEx(hDC, 320, 290, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 14173);
TEST(WindowExt.cy == 10630);
/* Values should not be changed */
WindowExt.cx = WindowExt.cy = 0;
ret = SetWindowExtEx(hDC, 1560, 1140, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 14173);
TEST(WindowExt.cy == 10630);
/* Check the viewport */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
/* Test setting in twips mode */
SetMapMode(hDC, MM_TWIPS);
ret = SetWindowExtEx(hDC, 3320, 3290, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 20409);
TEST(WindowExt.cy == 15307);
/* Values should not be changed */
WindowExt.cx = WindowExt.cy = 0;
ret = SetWindowExtEx(hDC, 4560, 4140, &WindowExt);
TEST(ret == 1);
TEST(WindowExt.cx == 20409);
TEST(WindowExt.cy == 15307);
/* Check the viewport */
GetViewportExtEx(hDC, &ViewportExt);
TEST(ViewportExt.cx == GetDeviceCaps(GetDC(0), HORZRES));
TEST(ViewportExt.cy == -GetDeviceCaps(GetDC(0), VERTRES));
/* test manually modifying the dcattr, should go to tests for GetViewportExtEx */
SetMapMode(hDC, MM_ISOTROPIC);
ret = SetWindowExtEx(hDC, 420, 4140, &WindowExt);
pDC_Attr->szlWindowExt.cx = 0;
GetViewportExtEx(hDC, &ViewportExt);
TEST(pDC_Attr->szlWindowExt.cx == 0);
TEST(ViewportExt.cx == 0);
DeleteDC(hDC);
return APISTATUS_NORMAL;
}

View file

@ -6,6 +6,7 @@
#include "user32api.h"
/* include the tests */
#include "tests/GetSystemMetrics.c"
#include "tests/InitializeLpkHooks.c"
#include "tests/ScrollDC.c"
#include "tests/ScrollWindowEx.c"
@ -14,6 +15,7 @@
/* The List of tests */
TESTENTRY TestList[] =
{
{ L"GetSystemMetrics", Test_GetSystemMetrics },
{ L"InitializeLpkHooks", Test_InitializeLpkHooks },
{ L"ScrollDC", Test_ScrollDC },
{ L"ScrollWindowEx", Test_ScrollWindowEx },

View file

@ -0,0 +1,396 @@
INT
Test_GetSystemMetrics(PTESTINFO pti)
{
INT ret;
HDC hDC;
BOOL BoolVal;
UINT UintVal;
RECT rect;
SetLastError(0);
hDC = GetDC(0);
ret = GetSystemMetrics(0);
TEST(ret > 0);
ret = GetSystemMetrics(64);
TEST(ret == 0);
ret = GetSystemMetrics(65);
TEST(ret == 0);
ret = GetSystemMetrics(66);
TEST(ret == 0);
ret = GetSystemMetrics(SM_CXSCREEN);
TEST(ret == GetDeviceCaps(hDC, HORZRES));
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYSCREEN);
TEST(ret == GetDeviceCaps(hDC, VERTRES));
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXVSCROLL);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYHSCROLL);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYCAPTION);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXBORDER);
SystemParametersInfoW(SPI_GETFOCUSBORDERWIDTH, 0, &UintVal, 0);
TEST(ret == UintVal);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYBORDER);
SystemParametersInfoW(SPI_GETFOCUSBORDERHEIGHT, 0, &UintVal, 0);
TEST(ret == UintVal);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXDLGFRAME);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYDLGFRAME);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYVTHUMB);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXHTHUMB);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXICON);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYICON);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXCURSOR);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYCURSOR);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYMENU);
// TEST(ret == 0);
TEST(GetLastError() == 0);
SystemParametersInfoW(SPI_GETWORKAREA, 0, &rect, 0);
ret = GetSystemMetrics(SM_CXFULLSCREEN);
TEST(ret == rect.right);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYFULLSCREEN);
TEST(ret == rect.bottom - rect.top - GetSystemMetrics(SM_CYCAPTION));
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYKANJIWINDOW);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_MOUSEPRESENT);
TEST(ret == 1);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYVSCROLL);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXHSCROLL);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_DEBUG);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_SWAPBUTTON);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_RESERVED1);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_RESERVED2);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_RESERVED3);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_RESERVED4);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXMIN);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYMIN);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXSIZE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYSIZE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXFRAME);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYFRAME);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXMINTRACK);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYMINTRACK);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXDOUBLECLK);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYDOUBLECLK);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXICONSPACING);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYICONSPACING);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_MENUDROPALIGNMENT);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_PENWINDOWS);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_DBCSENABLED);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CMOUSEBUTTONS);
// TEST(ret == 0);
TEST(GetLastError() == 0);
#if(WINVER >= 0x0400)
ret = GetSystemMetrics(SM_SECURE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXEDGE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYEDGE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXMINSPACING);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYMINSPACING);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXSMICON);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYSMICON);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYSMCAPTION);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXSMSIZE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYSMSIZE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXMENUSIZE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYMENUSIZE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_ARRANGE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXMINIMIZED);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYMINIMIZED);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXMAXTRACK);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYMAXTRACK);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXMAXIMIZED);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYMAXIMIZED);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_NETWORK);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CLEANBOOT);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXDRAG);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYDRAG);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_SHOWSOUNDS);
SystemParametersInfoW(SPI_GETSHOWSOUNDS, 0, &BoolVal, 0);
TEST(ret == BoolVal);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXMENUCHECK);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYMENUCHECK);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_SLOWMACHINE);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_MIDEASTENABLED);
// TEST(ret == 0);
TEST(GetLastError() == 0);
#endif
#if (WINVER >= 0x0500) || (_WIN32_WINNT >= 0x0400)
ret = GetSystemMetrics(SM_MOUSEWHEELPRESENT);
// TEST(ret == 0);
TEST(GetLastError() == 0);
#endif
#if(WINVER >= 0x0500)
ret = GetSystemMetrics(SM_XVIRTUALSCREEN);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_YVIRTUALSCREEN);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXVIRTUALSCREEN);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYVIRTUALSCREEN);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CMONITORS);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_SAMEDISPLAYFORMAT);
// TEST(ret == 0);
TEST(GetLastError() == 0);
#endif
#if(_WIN32_WINNT >= 0x0500)
ret = GetSystemMetrics(SM_IMMENABLED);
TEST(ret == 0);
TEST(GetLastError() == 0);
#endif
#if(_WIN32_WINNT >= 0x0501)
ret = GetSystemMetrics(SM_CXFOCUSBORDER);
SystemParametersInfoW(SPI_GETFOCUSBORDERWIDTH, 0, &UintVal, 0);
TEST(ret == UintVal);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CYFOCUSBORDER);
SystemParametersInfoW(SPI_GETFOCUSBORDERHEIGHT, 0, &UintVal, 0);
TEST(ret == UintVal);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_TABLETPC);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_MEDIACENTER);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_STARTER);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_SERVERR2);
// TEST(ret == 0);
TEST(GetLastError() == 0);
#endif
#if(_WIN32_WINNT >= 0x0600)
ret = GetSystemMetrics(SM_MOUSEHORIZONTALWHEELPRESENT);
// TEST(ret == 0);
TEST(GetLastError() == 0);
ret = GetSystemMetrics(SM_CXPADDEDBORDER);
// TEST(ret == 0);
TEST(GetLastError() == 0);
#endif
return APISTATUS_NORMAL;
}

View file

@ -27,7 +27,7 @@ int Count_myLpkTabbedTextOut = 0;
int Count_myLpkPSMTextOut = 0;
int Count_myLpkDrawTextEx = 0;
DWORD STDCALL myLpkTabbedTextOut (LPVOID x1,LPVOID x2,LPVOID x3, LPVOID x4, LPVOID x5, LPVOID x6, LPVOID x7, LPVOID x8,
DWORD WINAPI myLpkTabbedTextOut (LPVOID x1,LPVOID x2,LPVOID x3, LPVOID x4, LPVOID x5, LPVOID x6, LPVOID x7, LPVOID x8,
LPVOID x9, LPVOID x10, LPVOID x11, LPVOID x12)
{
Count_myLpkTabbedTextOut++;
@ -55,7 +55,7 @@ typedef struct _USER32_INTERN_INITALIZEHOOKS
PLPK_LPEDITCONTROL_LIST fpListLpkEditControl;
} USER32_INTERN_INITALIZEHOOKS, *PUSER32_INTERN_INITALIZEHOOKS;
VOID STDCALL InitializeLpkHooks (PUSER32_INTERN_INITALIZEHOOKS);
VOID WINAPI InitializeLpkHooks (PUSER32_INTERN_INITALIZEHOOKS);
INT
Test_InitializeLpkHooks(PTESTINFO pti)

View file

@ -1,9 +1,6 @@
<module name="user32api" type="win32cui">
<include base="user32api">.</include>
<define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0501</define>
<library>apitest</library>
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<library>shell32</library>

View file

@ -1,7 +1,5 @@
<module name="w32kdll_2k3sp2" type="win32dll" entrypoint="0" installname="w32kdll_2k3sp2.dll">
<importlibrary definition="w32kdll_2k3sp2.def" />
<define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0502</define>
<file>w32kdll_2k3sp2.S</file>
<file>main.c</file>
</module>

View file

@ -1,7 +1,5 @@
<module name="w32kdll_2ksp4" type="win32dll" entrypoint="0" installname="w32kdll_2ksp4.dll">
<importlibrary definition="w32kdll_2ksp4.def" />
<define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0502</define>
<file>w32kdll_2ksp4.S</file>
<file>main.c</file>
</module>

View file

@ -241,7 +241,7 @@ NtGdiMonoBitmap@4
NtGdiMoveTo@16
NtGdiOffsetClipRgn@12
NtGdiOffsetRgn@12
NtGdiOpenDCW@28
NtGdiOpenDCW@32
NtGdiPatBlt@24
NtGdiPolyPatBlt@20
NtGdiPathToRegion@4
@ -497,7 +497,7 @@ NtUserRealInternalGetMessage@24
NtUserRealWaitMessageEx@8
NtUserRedrawWindow@16
NtUserRegisterClassExWOW@28
NtUserRegisterUserApiHook@8
NtUserRegisterUserApiHook@16
NtUserRegisterHotKey@16
NtUserRegisterRawInputDevices@12
NtUserRegisterTasklist@4
@ -587,7 +587,7 @@ NtUserUnregisterUserApiHook@0
NtUserUnregisterHotKey@8
NtUserUpdateInputContext@12
NtUserUpdateInstance@12
NtUserUpdateLayeredWindow@36
NtUserUpdateLayeredWindow@40
NtUserGetLayeredWindowAttributes@16
NtUserSetLayeredWindowAttributes@16
NtUserUpdatePerUserSystemParameters@8

View file

@ -1,7 +1,5 @@
<module name="w32kdll" type="win32dll" entrypoint="0" installname="w32kdll.dll">
<importlibrary definition="w32kdll_ros.def" />
<define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0502</define>
<library>win32ksys</library>
<file>main.c</file>
</module>

View file

@ -1,7 +1,5 @@
<module name="w32kdll_vista" type="win32dll" entrypoint="0" installname="w32kdll_vista.dll">
<importlibrary definition="w32kdll_vista.def" />
<define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0502</define>
<file>w32kdll_vista.S</file>
<file>main.c</file>
</module>

View file

@ -1,7 +1,5 @@
<module name="w32kdll_xpsp2" type="win32dll" entrypoint="0" installname="w32kdll_xpsp2.dll">
<importlibrary definition="w32kdll_xpsp2.def" />
<define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0502</define>
<file>w32kdll_xpsp2.S</file>
<file>main.c</file>
</module>

View file

@ -0,0 +1,49 @@
INT
Test_NtGdiCombineRgn(PTESTINFO pti)
{
HRGN hRgnDest, hRgn1, hRgn2;
// test what params are accepted for what operations
// 0? invalid? are params maybe ignored in some cases?
// LastError
/* Preparation */
hRgnDest = CreateRectRgn(0,0,1,1);
hRgn1 = CreateRectRgn(1,1,4,4);
hRgn2 = CreateRectRgn(2,2,6,3);
/* RGN_AND = 1, RGN_OR = 2, RGN_XOR = 3, RGN_DIFF = 4, RGN_COPY = 5 */
TEST(NtGdiCombineRgn(hRgnDest, hRgn1, hRgn2, 0) == ERROR);
TEST(NtGdiCombineRgn(hRgnDest, hRgn1, hRgn2, 6) == ERROR);
SetLastError(ERROR_SUCCESS);
TEST(NtGdiCombineRgn(hRgnDest, 0, 0, RGN_AND) == ERROR);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
SetLastError(ERROR_SUCCESS);
TEST(NtGdiCombineRgn(hRgnDest, hRgn1, 0, RGN_AND) == ERROR);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
SetLastError(ERROR_SUCCESS);
TEST(NtGdiCombineRgn(hRgnDest, 0, hRgn1, RGN_AND) == ERROR);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
SetLastError(ERROR_SUCCESS);
TEST(NtGdiCombineRgn(0, hRgn1, hRgn2, RGN_AND) == ERROR);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
/* Create intersection */
TEST(NtGdiCombineRgn(hRgnDest, hRgn1, hRgn2, RGN_AND) == SIMPLEREGION);
SetRectRgn(hRgn1, 2, 2, 4, 3);
TEST(NtGdiCombineRgn(hRgnDest, hRgnDest, hRgn1, RGN_XOR) == NULLREGION);
/* Create intersection with itself */
SetRectRgn(hRgnDest, 2, 2, 4, 3);
TEST(NtGdiCombineRgn(hRgnDest, hRgnDest, hRgnDest, RGN_AND) == SIMPLEREGION);
SetRectRgn(hRgn1, 2, 2, 4, 3);
TEST(NtGdiCombineRgn(hRgnDest, hRgnDest, hRgn1, RGN_XOR) == NULLREGION);
/* What if 2 regions are the same */
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,27 @@
INT
Test_NtGdiCreateCompatibleDC(PTESTINFO pti)
{
HDC hDC;
HGDIOBJ hObj;
/* Test if aa NULL DC is accepted */
hDC = NtGdiCreateCompatibleDC(NULL);
TEST(hDC != NULL);
/* We select a nwe palette. Note: SelectObject doesn't work with palettes! */
hObj = SelectPalette(hDC, GetStockObject(DEFAULT_PALETTE), 0);
/* The old palette should be GetStockObject(DEFAULT_PALETTE) */
TEST(hObj == GetStockObject(DEFAULT_PALETTE));
/* The default bitmap should be GetStockObject(21) */
hObj = SelectObject(hDC, GetStockObject(21));
TEST(hObj == GetStockObject(21));
/* The default pen should be GetStockObject(BLACK_PEN) */
hObj = SelectObject(hDC, GetStockObject(WHITE_PEN));
TEST(hObj == GetStockObject(BLACK_PEN));
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,475 @@
/*
HBITMAP
APIENTRY
NtGdiCreateDIBSection(
IN HDC hDC,
IN OPTIONAL HANDLE hSection,
IN DWORD dwOffset,
IN LPBITMAPINFO pbmi,
IN DWORD iUsage,
IN UINT cjHeader,
IN FLONG fl,
IN ULONG_PTR dwColorSpace,
OUT PVOID *ppvBits)
*/
ULONG
GetBitmapSize(BITMAPINFOHEADER *pbih)
{
ULONG WidthBits, WidthBytes;
WidthBits = pbih->biWidth * pbih->biBitCount * pbih->biPlanes;
WidthBytes = ((WidthBits + 31) & ~ 31) >> 3;
return pbih->biHeight * WidthBytes;
}
INT
Test_NtGdiCreateDIBSection(PTESTINFO pti)
{
HBITMAP hbmp;
HDC hDC;
ULONG cjHeader;
PVOID pvBits = NULL;
ULONG cEntries;
DIBSECTION dibsection;
struct
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[100];
} bmi;
PBITMAPINFO pbmi = (PBITMAPINFO)&bmi;
PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)&bmi.bmiHeader;
PBITMAPV4HEADER pbV4h = (PBITMAPV4HEADER)&bmi.bmiHeader;
PBITMAPV5HEADER pbV5h = (PBITMAPV5HEADER)&bmi.bmiHeader;
HANDLE hSection;
NTSTATUS Status;
LARGE_INTEGER MaximumSize;
hDC = GetDC(0);
pbih->biSize = sizeof(BITMAPINFOHEADER);
pbih->biWidth = 2;
pbih->biHeight = 2;
pbih->biPlanes = 1;
pbih->biBitCount = 1;
pbih->biCompression = BI_RGB;
pbih->biSizeImage = 0;
pbih->biXPelsPerMeter = 100;
pbih->biYPelsPerMeter = 100;
pbih->biClrUsed = 2;
pbih->biClrImportant = 2;
cEntries = 0;
/** iUsage = 0 (DIB_RGB_COLORS) ***********************************************/
cjHeader = bmi.bmiHeader.biSize + cEntries * 4 + 8;
/* Test something simple */
SetLastError(0);
pvBits = 0;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits != NULL);
TEST(hbmp != 0);
// TEST(GetLastError() == 0);
TEST(GetObject(hbmp, sizeof(DIBSECTION), &dibsection) == sizeof(DIBSECTION));
TEST(dibsection.dsBitfields[0] == 0);
TEST(dibsection.dsBitfields[1] == 0);
TEST(dibsection.dsBitfields[2] == 0);
TEST(dibsection.dshSection == 0);
TEST(dibsection.dsOffset == 0);
if (hbmp) DeleteObject(hbmp);
/* Test a 0 HDC */
SetLastError(0);
pvBits = 0;
hbmp = NtGdiCreateDIBSection(0, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits != NULL);
TEST(hbmp != 0);
TEST(GetLastError() == ERROR_NOT_ENOUGH_MEMORY);
if (hbmp) DeleteObject(hbmp);
/* Test a wrong HDC */
SetLastError(0);
pvBits = 0;
hbmp = NtGdiCreateDIBSection((HDC)0xdeadbeef, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits != 0);
TEST(hbmp != 0);
TEST(GetLastError() == 8);
if (hbmp) DeleteObject(hbmp);
/* Test pbmi = NULL */
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, NULL, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/* Test invalid pbmi */
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, (PVOID)0x80001234, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
if (hbmp) DeleteObject(hbmp);
/* Test invalid pbmi */
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, (PVOID)1, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
if (hbmp) DeleteObject(hbmp);
/* Test ppvBits = NULL */
SetLastError(0);
hbmp = NtGdiCreateDIBSection(0, NULL, 0, pbmi, 0, cjHeader, 0, 0, NULL);
TEST(hbmp == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
if (hbmp) DeleteObject(hbmp);
/* Test ppvBits = NULL and pbmi == 0*/
SetLastError(0);
hbmp = NtGdiCreateDIBSection(0, NULL, 0, NULL, 0, cjHeader, 0, 0, NULL);
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/* Test ppvBits = NULL and wrong cjHeader */
SetLastError(0);
hbmp = NtGdiCreateDIBSection(0, NULL, 0, pbmi, 0, cjHeader+4, 0, 0, NULL);
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/* Test ppvBits = NULL and cjHeader = 0 */
SetLastError(0);
hbmp = NtGdiCreateDIBSection(0, NULL, 0, pbmi, 0, 0, 0, 0, NULL);
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/* Test wrong cjHeader */
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader+4, 0, 0, &pvBits);
pvBits = (PVOID)-1;
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/* Test different bitcount */
pbih->biBitCount = 4;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(hbmp != 0);
if (hbmp) DeleteObject(hbmp);
pbih->biBitCount = 8;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(hbmp != 0);
if (hbmp) DeleteObject(hbmp);
cjHeader = pbih->biSize;
pbih->biBitCount = 16;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(hbmp != 0);
if (hbmp) DeleteObject(hbmp);
pbih->biBitCount = 24;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(hbmp != 0);
if (hbmp) DeleteObject(hbmp);
pbih->biBitCount = 32;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(hbmp != 0);
if (hbmp) DeleteObject(hbmp);
/* Test BI_BITFIELDS */
cEntries = 3;
cjHeader = pbih->biSize + cEntries * sizeof(DWORD);
pbih->biBitCount = 16;
pbih->biCompression = BI_BITFIELDS;
((DWORD*)pbmi->bmiColors)[0] = 0x0007;
((DWORD*)pbmi->bmiColors)[1] = 0x0038;
((DWORD*)pbmi->bmiColors)[2] = 0x01C0;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(hbmp != 0);
TEST(GetObject(hbmp, sizeof(DIBSECTION), &dibsection) == sizeof(DIBSECTION));
TEST(dibsection.dsBm.bmType == 0);
TEST(dibsection.dsBm.bmWidth == 2);
TEST(dibsection.dsBm.bmHeight == 2);
TEST(dibsection.dsBm.bmWidthBytes == 4);
TEST(dibsection.dsBm.bmPlanes == 1);
TEST(dibsection.dsBm.bmBitsPixel == 16);
TEST(dibsection.dsBm.bmBits == pvBits);
TEST(dibsection.dsBmih.biSize == sizeof(BITMAPINFOHEADER));
TEST(dibsection.dsBmih.biWidth == 2);
TEST(dibsection.dsBmih.biHeight == 2);
TEST(dibsection.dsBmih.biPlanes == 1);
TEST(dibsection.dsBmih.biBitCount == 16);
TEST(dibsection.dsBmih.biCompression == BI_BITFIELDS);
TEST(dibsection.dsBmih.biSizeImage == 8);
TEST(dibsection.dsBmih.biXPelsPerMeter == 0);
TEST(dibsection.dsBmih.biYPelsPerMeter == 0);
TEST(dibsection.dsBmih.biClrUsed == 0);
TEST(dibsection.dsBmih.biClrImportant == 0);
TEST(dibsection.dsBitfields[0] == 0x0007);
TEST(dibsection.dsBitfields[1] == 0x0038);
TEST(dibsection.dsBitfields[2] == 0x01C0);
TEST(dibsection.dshSection == 0);
TEST(dibsection.dsOffset == 0);
printf("dib with bitfileds: %p\n", hbmp);
//system("PAUSE");
if (hbmp) DeleteObject(hbmp);
/* Test BI_BITFIELDS */
SetLastError(0);
pvBits = 0;
pbih->biSize = sizeof(BITMAPINFOHEADER);
pbih->biWidth = 2;
pbih->biHeight = 2;
pbih->biPlanes = 1;
pbih->biBitCount = 4;
pbih->biCompression = BI_RGB;
pbih->biSizeImage = 0;
pbih->biXPelsPerMeter = 100;
pbih->biYPelsPerMeter = 100;
pbih->biClrUsed = 0;
pbih->biClrImportant = 0;
((DWORD*)pbmi->bmiColors)[0] = 0xF800;
((DWORD*)pbmi->bmiColors)[1] = 0x00ff00;
((DWORD*)pbmi->bmiColors)[2] = 0x0000ff;
cEntries = 0;
cjHeader = bmi.bmiHeader.biSize + cEntries * 4 + 20;
/** iUsage = 1 (DIB_PAL_COLORS) ***********************************************/
pbmi->bmiHeader.biClrUsed = 2;
pbmi->bmiHeader.biClrImportant = 2;
cEntries = 2;
cjHeader = bmi.bmiHeader.biSize + cEntries * 4 + 8;
/* Test iUsage = 1 */
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 1, cjHeader, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/** iUsage = 2 (???) **********************************************************/
/* Test iUsage = 2 */
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 2, cjHeader, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/** wrong iUsage **************************************************************/
cEntries = 0;
cjHeader = bmi.bmiHeader.biSize + cEntries * 4 + 8;
/* Test iUsage = 3 */
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 3, cjHeader, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
if (hbmp) DeleteObject(hbmp);
/* Test iUsage = 3 */
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 3, cjHeader+4, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/* Test wrong iUsage */
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, -55, cjHeader, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
if (hbmp) DeleteObject(hbmp);
/* Test wrong iUsage and wrong cjHeader */
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, -55, cjHeader+4, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/* increased header size */
pbih->biSize = sizeof(BITMAPINFOHEADER) + 4;
cjHeader = pbih->biSize + cEntries * 4 + 8;
SetLastError(0);
pvBits = 0;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits != NULL);
TEST(hbmp != 0);
TEST(GetLastError() == 8);
if (hbmp) DeleteObject(hbmp);
/* increased header size */
pbih->biSize = sizeof(BITMAPINFOHEADER) + 2;
cjHeader = pbih->biSize + cEntries * 4 + 8;
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/* decreased header size */
pbih->biSize = sizeof(BITMAPINFOHEADER) - 4;
cjHeader = pbih->biSize + cEntries * 4 + 8;
SetLastError(0);
pvBits = (PVOID)-1;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits == (PVOID)-1);
TEST(hbmp == 0);
TEST(GetLastError() == 0);
if (hbmp) DeleteObject(hbmp);
/** BITMAPV4HEADER ************************************************************/
pbV4h->bV4Size = sizeof(BITMAPV4HEADER);
pbV4h->bV4Width = 2;
pbV4h->bV4Height = 3;
pbV4h->bV4Planes = 1;
pbV4h->bV4BitCount = 1;
pbV4h->bV4V4Compression = BI_RGB;
pbV4h->bV4SizeImage = 0;
pbV4h->bV4XPelsPerMeter = 100;
pbV4h->bV4YPelsPerMeter = 100;
pbV4h->bV4ClrUsed = 0;
pbV4h->bV4ClrImportant = 0;
pbV4h->bV4RedMask = 0;
pbV4h->bV4GreenMask = 0;
pbV4h->bV4BlueMask = 0;
pbV4h->bV4AlphaMask = 0;
pbV4h->bV4CSType = 0;
memset(&pbV4h->bV4Endpoints, sizeof(CIEXYZTRIPLE), 0);
pbV4h->bV4GammaRed = 0;
pbV4h->bV4GammaGreen = 0;
pbV4h->bV4GammaBlue = 0;
cEntries = 0;
cjHeader = bmi.bmiHeader.biSize + cEntries * 4 + 8;
/* Test something simple */
SetLastError(0);
pvBits = 0;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits != NULL);
TEST(hbmp != 0);
TEST(GetLastError() == 8);
if (hbmp) DeleteObject(hbmp);
/** BITMAPV5HEADER ************************************************************/
pbV5h->bV5Size = sizeof(BITMAPV5HEADER);
pbV5h->bV5Width = 2;
pbV5h->bV5Height = 3;
pbV5h->bV5Planes = 1;
pbV5h->bV5BitCount = 1;
pbV5h->bV5Compression = BI_RGB;
pbV5h->bV5SizeImage = 0;
pbV5h->bV5XPelsPerMeter = 100;
pbV5h->bV5YPelsPerMeter = 100;
pbV5h->bV5ClrUsed = 2;
pbV5h->bV5ClrImportant = 2;
pbV5h->bV5RedMask = 0;
pbV5h->bV5GreenMask = 0;
pbV5h->bV5BlueMask = 0;
pbV5h->bV5AlphaMask = 0;
pbV5h->bV5CSType = 0;
memset(&pbV5h->bV5Endpoints, sizeof(CIEXYZTRIPLE), 0);
pbV5h->bV5GammaRed = 0;
pbV5h->bV5GammaGreen = 0;
pbV5h->bV5GammaBlue = 0;
pbV5h->bV5Intent = 0;
pbV5h->bV5ProfileData = 0;
pbV5h->bV5ProfileSize = 0;
pbV5h->bV5Reserved = 0;
cEntries = 0;
cjHeader = pbV5h->bV5Size + cEntries * 4 + 8;
/* Test something simple */
SetLastError(0);
pvBits = 0;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits != NULL);
TEST(hbmp != 0);
TEST(GetLastError() == 8);
if (hbmp) DeleteObject(hbmp);
/* increased header size */
pbV5h->bV5Size = sizeof(BITMAPV5HEADER) + 64;
cjHeader = pbV5h->bV5Size + cEntries * 4 + 8;
SetLastError(0);
pvBits = 0;
hbmp = NtGdiCreateDIBSection(hDC, NULL, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits != NULL);
TEST(hbmp != 0);
TEST(GetLastError() == 8);
if (hbmp) DeleteObject(hbmp);
/* Test section */
MaximumSize.QuadPart = 4096;
Status = ZwCreateSection(&hSection,
SECTION_ALL_ACCESS,
NULL,
&MaximumSize,
PAGE_READWRITE,
SEC_COMMIT,
NULL);
ASSERT(NT_SUCCESS(Status));
SetLastError(0);
pvBits = 0;
hbmp = NtGdiCreateDIBSection(hDC, hSection, 0, pbmi, 0, cjHeader, 0, 0, &pvBits);
TEST(pvBits != NULL);
TEST(hbmp != 0);
// TEST(GetLastError() == 0);
printf("hbmp = %p, pvBits = %p, hSection = %p\n", hbmp, pvBits, hSection);
//system("PAUSE");
if (hbmp) DeleteObject(hbmp);
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,93 @@
INT
Test_NtGdiDeleteObjectApp(PTESTINFO pti)
{
HDC hdc;
HBITMAP hbmp;
HBRUSH hbrush;
/* Try to delete 0 */
SetLastError(0);
TEST(NtGdiDeleteObjectApp(0) == 0);
TEST(GetLastError() == 0);
/* Try to delete something with a stockbit */
SetLastError(0);
TEST(NtGdiDeleteObjectApp((PVOID)(GDI_HANDLE_STOCK_MASK | 0x1234)) == 1);
TEST(GetLastError() == 0);
/* Delete a DC */
SetLastError(0);
hdc = CreateCompatibleDC(NULL);
ASSERT(IsHandleValid(hdc) == 1);
TEST(NtGdiDeleteObjectApp(hdc) == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hdc) == 0);
/* Delete a brush */
SetLastError(0);
hbrush = CreateSolidBrush(0x123456);
ASSERT(IsHandleValid(hbrush) == 1);
TEST(NtGdiDeleteObjectApp(hbrush) == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hbrush) == 0);
/* Try to delete a stock brush */
SetLastError(0);
hbrush = GetStockObject(BLACK_BRUSH);
ASSERT(IsHandleValid(hbrush) == 1);
TEST(NtGdiDeleteObjectApp(hbrush) == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hbrush) == 1);
/* Delete a bitmap */
SetLastError(0);
hbmp = CreateBitmap(10, 10, 1, 1, NULL);
ASSERT(IsHandleValid(hbmp) == 1);
TEST(NtGdiDeleteObjectApp(hbmp) == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hbmp) == 0);
/* Create a DC for further use */
hdc = CreateCompatibleDC(NULL);
ASSERT(hdc);
/* Try to delete a brush that is selected into a DC */
SetLastError(0);
hbrush = CreateSolidBrush(0x123456);
ASSERT(IsHandleValid(hbrush) == 1);
TEST(NtGdiSelectBrush(hdc, hbrush));
TEST(NtGdiDeleteObjectApp(hbrush) == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hbrush) == 1);
/* Try to delete a bitmap that is selected into a DC */
SetLastError(0);
hbmp = CreateBitmap(10, 10, 1, 1, NULL);
ASSERT(IsHandleValid(hbmp) == 1);
TEST(NtGdiSelectBitmap(hdc, hbmp));
TEST(NtGdiDeleteObjectApp(hbmp) == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hbmp) == 1);
/* Bitmap get's deleted as soon as we dereference it */
NtGdiSelectBitmap(hdc, GetStockObject(DEFAULT_BITMAP));
TEST(IsHandleValid(hbmp) == 0);
TEST(NtGdiDeleteObjectApp(hbmp) == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hbmp) == 0);
/* Try to delete a brush that is selected into a DC */
SetLastError(0);
hbrush = CreateSolidBrush(123);
ASSERT(IsHandleValid(hbrush) == 1);
TEST(NtGdiSelectBrush(hdc, hbrush));
TEST(NtGdiDeleteObjectApp(hbrush) == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hbrush) == 1);
return APISTATUS_NORMAL;
}

View file

@ -102,7 +102,8 @@ Test_NtGdiDoPalette_GdiPalAnimate(PTESTINFO pti)
INT
Test_NtGdiDoPalette_GdiPalSetEntries(PTESTINFO pti)
{
HPALETTE hPal;
HDC hDC;
HPALETTE hPal, hOldPal;
PALETTEENTRY palEntries[5] = {
{0,0,0,0},
{0xff,0xff,0xff,0},
@ -156,6 +157,13 @@ Test_NtGdiDoPalette_GdiPalSetEntries(PTESTINFO pti)
/* Test that the buffer was not changed */
/* Test with palette selected into dc */
hDC = CreateCompatibleDC(NULL);
hOldPal = SelectPalette(hDC, hPal, 0);
RTEST(NtGdiDoPalette(hPal, 0, 4, palEntries, GdiPalSetEntries, TRUE) == 4);
SelectPalette(hDC, hOldPal, 0);
/* Test pEntries = NULL */
RTEST(NtGdiDoPalette(hPal, 0, 1, NULL, GdiPalGetEntries, TRUE) == 0);
@ -198,6 +206,69 @@ Test_NtGdiDoPalette_GetBIBColorTable(PTESTINFO pti)
INT
Test_NtGdiDoPalette_SetDIBColorTable(PTESTINFO pti)
{
HDC hdc;
HBITMAP hbmp;
BYTE *pjBits;
struct
{
BITMAPINFOHEADER bmiHeader;
ULONG bmiColors[10];
} bmi;
hdc = CreateCompatibleDC(0);
ASSERT(hdc);
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 10;
bmi.bmiHeader.biHeight = 10;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 8;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 1;
bmi.bmiHeader.biYPelsPerMeter = 1;
bmi.bmiHeader.biClrUsed = 9;
bmi.bmiHeader.biClrImportant = 9;
bmi.bmiColors[0] = 0x000000;
bmi.bmiColors[1] = 0x202020;
bmi.bmiColors[2] = 0x404040;
bmi.bmiColors[3] = 0x606060;
bmi.bmiColors[4] = 0x808080;
bmi.bmiColors[5] = 0xA0A0A0;
bmi.bmiColors[6] = 0xC0C0C0;
bmi.bmiColors[7] = 0xE0E0E0;
bmi.bmiColors[8] = 0xffffff;
hbmp = CreateDIBSection(hdc, (BITMAPINFO*)&bmi, DIB_PAL_COLORS, (PVOID*)&pjBits, NULL, 0);
ASSERT(hbmp);
ASSERT(pjBits);
SelectObject(hdc, hbmp);
pjBits[0] = 8;
pjBits[1] = 1;
pjBits[2] = 2;
pjBits[3] = 3;
bmi.bmiColors[8] = 0x000000;
bmi.bmiColors[7] = 0x202020;
bmi.bmiColors[6] = 0x404040;
bmi.bmiColors[5] = 0x606060;
bmi.bmiColors[4] = 0x808080;
bmi.bmiColors[3] = 0xA0A0A0;
bmi.bmiColors[2] = 0xC0C0C0;
bmi.bmiColors[1] = 0xE0E0E0;
bmi.bmiColors[0] = 0xffffff;
TEST(NtGdiDoPalette(hdc, 0, 9, &bmi.bmiColors, GdiPalSetColorTable, FALSE) == 9);
SetDCPenColor(hdc, 0xE0E0E0);
SetDCBrushColor(hdc, 0x202020);
Rectangle(hdc, 0, 0, 10, 10);
DeleteDC(hdc);
DeleteObject(hbmp);
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,53 @@
/*
BOOL
APIENTRY
NtGdiExtTextOutW(
IN HDC hDC,
IN INT XStart,
IN INT YStart,
IN UINT fuOptions,
IN OPTIONAL LPRECT UnsafeRect,
IN LPWSTR UnsafeString,
IN INT Count,
IN OPTIONAL LPINT UnsafeDx,
IN DWORD dwCodePage)
*/
INT
Test_NtGdiExtTextOutW(PTESTINFO pti)
{
HWND hWnd;
HDC hDC;
RECT rect;
LPWSTR lpstr;
BOOL ret;
ULONG len;
INT Dx[10] = {10, -5, 10, 5, 10, -10, 10, 5, 10, 5};
/* Create a window */
hWnd = CreateWindowW(L"BUTTON", L"TestWindow", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,
NULL, NULL, g_hInstance, 0);
hDC = GetDC(hWnd);
lpstr = L"Hallo";
len = wcslen(lpstr);
ret = NtGdiExtTextOutW(hDC, 0, 0, 0, &rect, lpstr, len, Dx, 0);
TEST(ret == 1);
ret = NtGdiExtTextOutW(hDC, 0, 0, ETO_PDY, &rect, lpstr, len, Dx, 0);
TEST(ret == 1);
/* Test invalid lpDx */
ret = NtGdiExtTextOutW(hDC, 0, 0, 0, 0, lpstr, len, (INT*)((ULONG_PTR)-1), 0);
TEST(ret == 0);
/* Test alignment requirement for lpDx */
ret = NtGdiExtTextOutW(hDC, 0, 0, 0, 0, lpstr, len, (INT*)((ULONG_PTR)Dx + 1), 0);
TEST(ret == 1);
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,35 @@
INT
Test_NtGdiFlushUserBatch(PTESTINFO pti)
{
PVOID pRet;
PTEB pTeb;
pTeb = NtCurrentTeb();
ASSERT(pTeb);
pRet = (PVOID)NtGdiFlushUserBatch();
TEST(pRet != 0);
TEST(pRet == &pTeb->RealClientId);
TEST(pTeb->GdiBatchCount == 0);
TEST(pTeb->GdiTebBatch.Offset == 0);
TEST(pTeb->GdiTebBatch.HDC == 0);
/* Set up some bullshit */
pTeb->InDbgPrint = 1;
pTeb->GdiBatchCount = 12;
pTeb->GdiTebBatch.Offset = 21;
pTeb->GdiTebBatch.HDC = (HDC)123;
pRet = (PVOID)NtGdiFlushUserBatch();
TEST(pRet == &pTeb->RealClientId);
TEST(pTeb->InDbgPrint == 0);
TEST(pTeb->GdiBatchCount == 12);
TEST(pTeb->GdiTebBatch.Offset == 0);
TEST(pTeb->GdiTebBatch.HDC == 0);
return APISTATUS_NORMAL;
}

View file

@ -2,18 +2,12 @@
INT
Test_NtGdiGetFontResourceInfoInternalW(PTESTINFO pti)
{
WCHAR szFullFileName[MAX_PATH+1];
BOOL bRet;
DWORD dwBufSize;
LOGFONTW logfont;
UNICODE_STRING NtFileName;
GetCurrentDirectoryW(MAX_PATH, szFullFileName);
wcscat(szFullFileName, L"\\test.otf");
ASSERT(AddFontResourceW(szFullFileName) != 0);
ASSERT(RtlDosPathNameToNtPathName_U(szFullFileName,
ASSERT(RtlDosPathNameToNtPathName_U(L".\\test.otf",
&NtFileName,
NULL,
NULL));
@ -36,7 +30,7 @@ Test_NtGdiGetFontResourceInfoInternalW(PTESTINFO pti)
printf("lfWidth = %ld\n", logfont.lfWidth);
printf("lfFaceName = %ls\n", logfont.lfFaceName);
RemoveFontResourceW(szFullFileName);
// RemoveFontResourceW(szFullFileName);
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,208 @@
static
INT
Test_Params(PTESTINFO pti)
{
ULONG_PTR ret;
ULONG Count1[4] = {3, 2, 4, 3};
ULONG Count2[2] = {0, 3};
ULONG Count3[2] = {0, 0};
ULONG Count4[2] = {1, 3};
ULONG Count5[2] = {0x80000001, 0x80000001};
POINT Points[6] = {{0,0}, {1,1}, {3,-3}, {-2,2}, {4,2}, {2,4}};
HDC hDC;
SetLastError(0);
ret = NtGdiPolyPolyDraw(NULL, NULL, NULL, 0, 0);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(NULL, NULL, NULL, 0, 1);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(NULL, NULL, NULL, 0, 2);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(NULL, NULL, NULL, 0, 3);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(NULL, NULL, NULL, 0, 4);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(NULL, NULL, NULL, 0, 5);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(NULL, NULL, NULL, 0, 6);
TEST(ret == 0);
TEST(GetLastError() == 0);
////////////////////////////////////////////////////////////////////////////////
/* Test with an invalid DC */
SetLastError(0);
ret = NtGdiPolyPolyDraw(0, Points, Count1, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
hDC = (HDC)0x12345;
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 0);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 2);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 3);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 4);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 5);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 6);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw((HDC)1, Points, Count1, 1, 6);
TEST((ret & GDI_HANDLE_BASETYPE_MASK) == GDI_OBJECT_TYPE_REGION);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw((HDC)0, Points, Count1, 1, 6);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 0, 1);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count2, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, NULL, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, (PVOID)0x81000000, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, NULL, Count1, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, (PVOID)0x81000000, Count1, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == 0);
////////////////////////////////////////////////////////////////////////////////
/* Test with a valid DC */
hDC = CreateCompatibleDC(NULL);
ASSERT(hDC);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 0);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 1);
TEST(ret == 1);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 2);
TEST(ret == 1);
TEST(GetLastError() == 0);
#if 0
SetLastError(0);
// better don't do this on win xp!!! (random crashes)
// ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 3);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
SetLastError(0);
// better don't do this on win xp!!! (random crashes)
// ret = NtGdiPolyPolyDraw(hDC, Points, Count1, 2, 4);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
#endif
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count2, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count3, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == 0);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count4, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
SetLastError(0);
ret = NtGdiPolyPolyDraw(hDC, Points, Count5, 2, 1);
TEST(ret == 0);
TEST(GetLastError() == 87);
return APISTATUS_NORMAL;
}
INT
Test_NtGdiPolyPolyDraw(PTESTINFO pti)
{
Test_Params(pti);
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,192 @@
static HBRUSH hbrush;
static HBITMAP hbitmap;
static HPEN hpen;
static HFONT hfont;
static HRGN hrgn, hrgn2;
static
void
SetSpecialDCState(HDC hdc)
{
/* Select spcial Objects */
SelectObject(hdc, hbrush);
SelectObject(hdc, hpen);
SelectObject(hdc, hbitmap);
SelectObject(hdc, hfont);
SelectObject(hdc, hrgn);
/* Colors */
SetDCBrushColor(hdc, RGB(12,34,56));
SetDCPenColor(hdc, RGB(23,34,45));
/* Coordinates */
SetMapMode(hdc, MM_ANISOTROPIC);
SetGraphicsMode(hdc, GM_ADVANCED);
SetWindowOrgEx(hdc, 12, 34, NULL);
SetViewportOrgEx(hdc, 56, 78, NULL);
SetWindowExtEx(hdc, 123, 456, NULL);
SetViewportExtEx(hdc, 234, 567, NULL);
}
static
void
SetSpecialDCState2(HDC hdc)
{
/* Select spcial Objects */
SelectObject(hdc, GetStockObject(DC_BRUSH));
SelectObject(hdc, GetStockObject(DC_PEN));
SelectObject(hdc, GetStockObject(DEFAULT_BITMAP));
SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT));
SelectObject(hdc, hrgn2);
/* Colors */
SetDCBrushColor(hdc, RGB(65,43,21));
SetDCPenColor(hdc, RGB(54,43,32));
/* Coordinates */
SetMapMode(hdc, MM_ISOTROPIC);
SetGraphicsMode(hdc, GM_COMPATIBLE);
SetWindowOrgEx(hdc, 43, 21, NULL);
SetViewportOrgEx(hdc, 87, 65, NULL);
SetWindowExtEx(hdc, 654, 321, NULL);
SetViewportExtEx(hdc, 765, 432, NULL);
}
static
void
Test_IsSpecialState(PTESTINFO pti, HDC hdc, BOOL bMemDC)
{
POINT pt;
SIZE sz;
/* Test Objects */
TEST(SelectObject(hdc, GetStockObject(DC_BRUSH)) == hbrush);
TEST(SelectObject(hdc, GetStockObject(DC_PEN)) == hpen);
TEST(SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT)) == hfont);
if (bMemDC)
{
TEST(SelectObject(hdc, GetStockObject(DEFAULT_BITMAP)) == hbitmap);
TEST(SelectObject(hdc, hrgn2) == (PVOID)1);
}
else
{
TEST(SelectObject(hdc, GetStockObject(DEFAULT_BITMAP)) == 0);
TEST(SelectObject(hdc, hrgn2) == (PVOID)2);
}
/* Test colors */
TEST(GetDCBrushColor(hdc) == RGB(12,34,56));
TEST(GetDCPenColor(hdc) == RGB(23,34,45));
/* Test coordinates */
TEST(GetMapMode(hdc) == MM_ANISOTROPIC);
TEST(GetGraphicsMode(hdc) == GM_ADVANCED);
GetWindowOrgEx(hdc, &pt);
TEST(pt.x == 12);
TEST(pt.y == 34);
GetViewportOrgEx(hdc, &pt);
TEST(pt.x == 56);
TEST(pt.y == 78);
GetWindowExtEx(hdc, &sz);
TESTX(sz.cx == 123, "sz.cx == %ld\n", sz.cx);
TESTX(sz.cy == 456, "sz.cy == %ld\n", sz.cy);
GetViewportExtEx(hdc, &sz);
TEST(sz.cx == 234);
TEST(sz.cy == 567);
}
static
void
Test_SaveRestore(PTESTINFO pti, HDC hdc, BOOL bMemDC)
{
SetSpecialDCState(hdc);
NtGdiSaveDC(hdc);
SetSpecialDCState2(hdc);
SetLastError(0);
TEST(NtGdiRestoreDC(hdc, 2) == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
SetLastError(0);
TEST(NtGdiRestoreDC(hdc, 0) == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
SetLastError(0);
TEST(NtGdiRestoreDC(hdc, -2) == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
SetLastError(0);
TEST(NtGdiRestoreDC(hdc, 1) == 1);
TEST(GetLastError() == 0);
Test_IsSpecialState(pti, hdc, bMemDC);
}
INT
Test_NtGdiRestoreDC(PTESTINFO pti)
{
HDC hdc;
hdc = CreateCompatibleDC(0);
ASSERT(IsHandleValid(hdc));
SetLastError(0);
TEST(NtGdiRestoreDC(0, -10) == 0);
TEST(GetLastError() == ERROR_INVALID_HANDLE);
SetLastError(0);
TEST(NtGdiRestoreDC(hdc, 0) == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
SetLastError(0);
TEST(NtGdiRestoreDC(hdc, 1) == 0);
TEST(GetLastError() == ERROR_INVALID_PARAMETER);
/* Initialize objects */
hbrush = CreateSolidBrush(12345);
ASSERT(IsHandleValid(hbrush));
hpen = CreatePen(PS_SOLID, 4, RGB(10,12,32));
ASSERT(IsHandleValid(hpen));
hbitmap = CreateBitmap(10, 10, 1, 1, NULL);
ASSERT(IsHandleValid(hbitmap));
hfont = CreateFont(10, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, "Arial");
ASSERT(IsHandleValid(hfont));
hrgn = CreateRectRgn(12, 14, 14, 17);
ASSERT(IsHandleValid(hrgn));
hrgn2 = CreateRectRgn(1, 1, 2, 2);
ASSERT(IsHandleValid(hrgn2));
/* Test mem dc */
Test_SaveRestore(pti, hdc, TRUE);
DeleteDC(hdc);
/* Test screen DC */
hdc = GetDC(0);
ASSERT(IsHandleValid(hdc));
Test_SaveRestore(pti, hdc, FALSE);
ReleaseDC(0, hdc);
/* Test info dc */
hdc = CreateICW(L"DISPLAY", NULL, NULL, NULL);
ASSERT(IsHandleValid(hdc));
Test_SaveRestore(pti, hdc, FALSE);
DeleteDC(hdc);
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,45 @@
INT
Test_NtGdiSaveDC(PTESTINFO pti)
{
HDC hdc;
HWND hwnd;
/* Test 0 hdc */
TEST(NtGdiSaveDC(0) == 0);
/* Test info dc */
hdc = CreateICW(L"DISPLAY",NULL,NULL,NULL);
TEST(hdc);
TEST(NtGdiSaveDC(hdc) == 1);
TEST(NtGdiSaveDC(hdc) == 2);
DeleteDC(hdc);
/* Test display dc */
hdc = GetDC(0);
TEST(hdc);
TEST(NtGdiSaveDC(hdc) == 1);
TEST(NtGdiSaveDC(hdc) == 2);
ReleaseDC(0, hdc);
/* Test a mem DC */
hdc = CreateCompatibleDC(0);
TEST(hdc);
TEST(NtGdiSaveDC(hdc) == 1);
TEST(NtGdiSaveDC(hdc) == 2);
DeleteDC(hdc);
/* Create a window */
hwnd = CreateWindowW(L"BUTTON", L"TestWindow", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
10, 10, 100, 100,
NULL, NULL, g_hInstance, 0);
hdc = GetDC(hwnd);
TEST(hdc);
TEST(NtGdiSaveDC(hdc) == 1);
NtGdiRestoreDC(hdc, 1);
ReleaseDC(hwnd, hdc);
DestroyWindow(hwnd);
return APISTATUS_NORMAL;
}

View file

@ -1,13 +1,65 @@
INT
Test_SelectDIBSection(PTESTINFO pti)
{
HDC hdc;
HBITMAP hbmp;
struct
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[100];
} bmi;
PBITMAPINFO pbmi = (PBITMAPINFO)&bmi;
PVOID pvBits;
hdc = CreateCompatibleDC(0);
ASSERT(hdc);
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 2;
bmi.bmiHeader.biHeight = 2;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 1;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = 0;
bmi.bmiHeader.biXPelsPerMeter = 100;
bmi.bmiHeader.biYPelsPerMeter = 100;
bmi.bmiHeader.biClrUsed = 2;
bmi.bmiHeader.biClrImportant = 2;
hbmp = CreateDIBSection(hdc, pbmi, DIB_PAL_COLORS, &pvBits, NULL, 0);
ASSERT(hbmp);
TEST(NtGdiSelectBitmap(hdc, hbmp) != 0);
return 0;
}
INT
Test_NtGdiSelectBitmap(PTESTINFO pti)
{
HDC hDC;
HBITMAP hBmp, hOldBmp;
HPALETTE hOldPalette, hPalette;
LOGPALETTE logpal = {0x300, 1, {{12,13,14,15}}};
hBmp = CreateBitmap(2,2,1,1,NULL);
ASSERT(hBmp);
/* We cannot select a bitmap into a display DC */
hDC = GetDC(NULL);
ASSERT(hDC);
hOldBmp = NtGdiSelectBitmap(hDC, hBmp);
TEST(hOldBmp == NULL);
hDC = CreateCompatibleDC(GetDC(NULL));
ASSERT(hDC);
hBmp = CreateBitmap(2,2,1,1,NULL);
/* Check the palette before we mess it up*/
hPalette = CreatePalette(&logpal);
hOldPalette = SelectPalette(hDC, hPalette, 0);
TEST(hOldPalette == GetStockObject(DEFAULT_PALETTE));
/* Test NULL DC */
SetLastError(ERROR_SUCCESS);
@ -27,23 +79,35 @@ Test_NtGdiSelectBitmap(PTESTINFO pti)
TEST(hOldBmp == NULL);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test NULL bitmap */
/* Test bitmap with only index */
SetLastError(ERROR_SUCCESS);
hOldBmp = NtGdiSelectBitmap(hDC, (HBITMAP)((ULONG_PTR)hBmp & 0x0000ffff));
TEST(hOldBmp == NULL);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test invalid bitmap */
/* Test valid bitmap */
SetLastError(ERROR_SUCCESS);
hOldBmp = NtGdiSelectBitmap(hDC, hBmp);
TEST(hOldBmp != NULL);
/* The default bitmap should be GetStockObject(21) */
TEST(hOldBmp == GetStockObject(21));
/* Check the palette */
hOldPalette = SelectPalette(hDC, hOldPalette, 0);
TEST(hOldPalette == hPalette);
DeleteObject(hPalette);
/* Select the old one again and check */
hOldBmp = NtGdiSelectBitmap(hDC, hOldBmp);
TEST(hOldBmp == hBmp);
TEST(GetLastError() == ERROR_SUCCESS);
/* cleanup */
DeleteObject(hBmp);
DeleteDC(hDC);
Test_SelectDIBSection(pti);
return APISTATUS_NORMAL;
}

View file

@ -3,6 +3,7 @@ Test_NtGdiSelectBrush(PTESTINFO pti)
{
HDC hDC;
HBRUSH hBrush, hOldBrush;
DC_ATTR *pdcattr;
hDC = CreateDCW(L"DISPLAY", NULL, NULL, NULL);
@ -39,6 +40,25 @@ Test_NtGdiSelectBrush(PTESTINFO pti)
TEST(hOldBrush == hBrush);
TEST(GetLastError() == ERROR_SUCCESS);
/* Begin with a white brush */
NtGdiSelectBrush(hDC, GetStockObject(WHITE_BRUSH));
/* Select a brush in user mode */
SelectObject(hDC, GetStockObject(BLACK_BRUSH));
/* See what we get returned */
hOldBrush = NtGdiSelectBrush(hDC, GetStockObject(WHITE_BRUSH));
TEST(hOldBrush == GetStockObject(BLACK_BRUSH));
/* Begin with a white brush */
NtGdiSelectBrush(hDC, GetStockObject(WHITE_BRUSH));
pdcattr = GetHandleUserData(hDC);
/* Change the brush in user mode, without setting flags */
pdcattr->hbrush = (HBRUSH)12345;
hOldBrush = NtGdiSelectBrush(hDC, GetStockObject(BLACK_BRUSH));
TEST(hOldBrush == (HBRUSH)12345);
DeleteDC(hDC);

View file

@ -3,8 +3,10 @@ Test_NtGdiSelectPen(PTESTINFO pti)
{
HDC hDC;
HPEN hPen, hOldPen;
LOGBRUSH logbrush;
hDC = CreateDCW(L"DISPLAY", NULL, NULL, NULL);
hDC = GetDC(NULL);
ASSERT(hDC);
hPen = GetStockObject(WHITE_PEN);
@ -26,19 +28,42 @@ Test_NtGdiSelectPen(PTESTINFO pti)
TEST(hOldPen == NULL);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test NULL pen */
/* Test invalid pen */
SetLastError(ERROR_SUCCESS);
hOldPen = NtGdiSelectPen(hDC, (HPEN)((ULONG_PTR)hPen & 0x0000ffff));
TEST(hOldPen == NULL);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test valid pen */
SelectObject(hDC, GetStockObject(BLACK_PEN));
SetLastError(ERROR_SUCCESS);
hOldPen = NtGdiSelectPen(hDC, hPen);
TEST(hOldPen == GetStockObject(BLACK_PEN));
hOldPen = NtGdiSelectPen(hDC, hOldPen);
TEST(hOldPen == hPen);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test extpen */
SetLastError(ERROR_SUCCESS);
logbrush.lbStyle = BS_SOLID;
logbrush.lbColor = RGB(0x12,0x34,0x56);
hPen = ExtCreatePen(PS_COSMETIC|PS_ALTERNATE, 1, &logbrush, 0, NULL);
ASSERT(hPen);
hOldPen = NtGdiSelectPen(hDC, hPen);
TEST(hOldPen != NULL);
hOldPen = NtGdiSelectPen(hDC, hOldPen);
TEST(hOldPen == hPen);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test deleting pen */
SetLastError(ERROR_SUCCESS);
hOldPen = NtGdiSelectPen(hDC, hPen);
TEST(DeleteObject(hPen) == 1);
hOldPen = NtGdiSelectPen(hDC, hOldPen);
TEST(hOldPen == hPen);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test that fallback pen is BLACK_PEN */
DeleteDC(hDC);

View file

@ -1,8 +1,25 @@
void
ReadBits(HDC hDC, PDWORD OutBits)
{
int x,y;
for (y = 0; y < 8; y++)
{
DWORD Row = 0;
for (x = 0; x < 8; x++)
Row |= (0x80 & GetPixel(hDC, 2 + x, 3 + y)) >> x;
OutBits[y] = Row;
}
}
INT
Test_NtGdiSetDIBitsToDeviceInternal(PTESTINFO pti)
{
static const DWORD InBits[8] = { 0x81, 0x7E, 0x5A, 0x7E, 0x7E, 0x42, 0x7E, 0x81 };
DWORD OutBits[8];
XFORM xform;
HWND hWnd = CreateWindowW(L"Static", NULL, WS_VISIBLE,
100, 100, 200, 200,
@ -35,6 +52,27 @@ Test_NtGdiSetDIBitsToDeviceInternal(PTESTINFO pti)
(PVOID)InBits, (BITMAPINFO *)&bmi, DIB_RGB_COLORS,
sizeof(InBits), sizeof(bmi), TRUE, NULL));
/* Now get the data from the screen, and see if it matches */
ReadBits(hDC, OutBits);
TEST(memcmp(InBits, OutBits, sizeof(InBits)) == 0);
/* Change transformation */
GetWorldTransform(hDC, &xform);
xform.eM11 = 2;
xform.eM22 = 2;
xform.eDx = 10;
SetWorldTransform(hDC, &xform);
TEST(NtGdiSetDIBitsToDeviceInternal(hDC, 2, 3, 8, 8, 0, 0, 0, 8,
(PVOID)InBits, (BITMAPINFO *)&bmi, DIB_RGB_COLORS,
sizeof(InBits), sizeof(bmi), TRUE, NULL));
xform.eM11 = 1;
xform.eM22 = 1;
xform.eDx = 0;
SetWorldTransform(hDC, &xform);
/* Now get the data from the screen, and see if it matches */
for (y = 0; y < 8; y++)
{
@ -43,8 +81,10 @@ Test_NtGdiSetDIBitsToDeviceInternal(PTESTINFO pti)
Row |= (0x80 & GetPixel(hDC, 2 + x, 3 + y)) >> x;
OutBits[y] = Row;
}
TEST(memcmp(InBits, OutBits, sizeof(InBits)) == 0);
ReleaseDC(hWnd, hDC);
DestroyWindow(hWnd);

View file

@ -39,6 +39,7 @@ Test_OneParamRoutine_MapDesktopObject(PTESTINFO pti) /* 0x30 */
hMenu = CreateMenu();
pObject = NtUserCallOneParam((DWORD)hMenu, _ONEPARAM_ROUTINE_MAPDEKTOPOBJECT);
DestroyMenu(hMenu);
TEST(pObject > 0);
TEST(pObject < 0x80000000);

View file

@ -1,5 +1,5 @@
/* First the call stub */
DWORD STDCALL
DWORD WINAPI
NtUserCountClipboardFormats(VOID)
{
DWORD p;

View file

@ -0,0 +1,52 @@
ULONG gMonitorCount = 0;
HDC ghdcMonitor = 0;
RECT grcMonitor = {0};
BOOL
NTAPI
NtUserEnumDisplayMonitors1(
HDC hDC,
LPCRECT lprcClip,
MONITORENUMPROC lpfnEnum,
LPARAM dwData)
{
return (INT)Syscall(L"NtUserEnumDisplayMonitors", 4, &hDC);
}
BOOL CALLBACK
MonitorEnumProc(
HMONITOR hMonitor,
HDC hdcMonitor,
LPRECT lprcMonitor,
LPARAM dwData)
{
gMonitorCount++;
if (gMonitorCount == 1)
{
ghdcMonitor = hdcMonitor;
grcMonitor = *lprcMonitor;
}
return TRUE;
}
INT
Test_NtUserEnumDisplayMonitors(PTESTINFO pti)
{
BOOL ret;
// WILL crash!
// TEST(NtUserEnumDisplayMonitors1(NULL, NULL, NULL, 0) == 0);
ret = NtUserEnumDisplayMonitors1(0, NULL, MonitorEnumProc, 0);
TEST(ret == TRUE);
TEST(gMonitorCount > 0);
TEST(ghdcMonitor == 0);
TEST(grcMonitor.left == 0);
TEST(grcMonitor.right > 0);
TEST(grcMonitor.top == 0);
TEST(grcMonitor.bottom > 0);
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,58 @@
BOOL
NTAPI
NtUserGetClassInfo2(
HINSTANCE hInstance,
PUNICODE_STRING ClassName,
LPWNDCLASSEXW wcex,
LPWSTR *ppwstr,
BOOL Ansi)
{
return (BOOL)Syscall(L"NtUserGetClassInfo", 5, &hInstance);
}
INT
Test_NtUserGetClassInfo(PTESTINFO pti)
{
WNDCLASSEXW wclex, wclex2 = {0};
UNICODE_STRING us;
PWSTR pwstr;
us.Length = 8;
us.MaximumLength = 8;
us.Buffer = L"test";
wclex.cbSize = sizeof(WNDCLASSEXW);
wclex.style = 0;
wclex.lpfnWndProc = NULL;
wclex.cbClsExtra = 2;
wclex.cbWndExtra = 4;
wclex.hInstance = g_hInstance;
wclex.hIcon = NULL;
wclex.hCursor = NULL;
wclex.hbrBackground = CreateSolidBrush(RGB(4,7,5));
wclex.lpszMenuName = L"MyMenu";
wclex.lpszClassName = us.Buffer;
wclex.hIconSm = NULL;
ASSERT(RegisterClassExW(&wclex) != 0);
TEST(GetClassInfoExW(g_hInstance, us.Buffer, &wclex) != 0);
wclex2.cbSize = sizeof(WNDCLASSEXW);
TEST(NtUserGetClassInfo2(g_hInstance, &us, &wclex2, &pwstr, 0) != 0);
TEST(pwstr == wclex.lpszMenuName);
TEST(wclex2.cbSize == wclex.cbSize);
TEST(wclex2.style == wclex.style);
TEST(wclex2.lpfnWndProc == wclex.lpfnWndProc);
TEST(wclex2.cbClsExtra == wclex.cbClsExtra);
TEST(wclex2.cbWndExtra == wclex.cbWndExtra);
TEST(wclex2.hInstance == wclex.hInstance);
TEST(wclex2.hIcon == wclex.hIcon);
TEST(wclex2.hCursor == wclex.hCursor);
TEST(wclex2.hbrBackground == wclex.hbrBackground);
TEST(wclex2.lpszMenuName == 0);
TEST(wclex2.lpszClassName == 0);
TEST(wclex2.hIconSm == wclex.hIconSm);
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,24 @@
INT
Test_NtUserProcessConnect(PTESTINFO pti)
{
HANDLE hProcess;
NTSTATUS Status;
USERCONNECT UserConnect = {0};
hProcess = GetCurrentProcess();
UserConnect.ulVersion = MAKELONG(0, 5);
Status = NtUserProcessConnect(hProcess, (USERCONNECT*)&UserConnect, sizeof(USERCONNECT));
TEST(NT_SUCCESS(Status));
printf("UserConnect.ulVersion = 0x%lx\n", UserConnect.ulVersion);
printf("UserConnect.ulCurrentVersion = 0x%lx\n", UserConnect.ulCurrentVersion);
printf("UserConnect.dwDispatchCount = 0x%lx\n", UserConnect.dwDispatchCount);
printf("UserConnect.siClient.psi = 0x%p\n", UserConnect.siClient.psi);
printf("UserConnect.siClient.aheList = 0x%p\n", UserConnect.siClient.aheList);
printf("UserConnect.siClient.pDispInfo = 0x%p\n", UserConnect.siClient.pDispInfo);
printf("UserConnect.siClient.ulSharedDelta = 0x%lx\n", UserConnect.siClient.ulSharedDelta);
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,148 @@
FORCEINLINE
PALETTEENTRY
PALENTRY(BYTE r, BYTE g, BYTE b)
{
PALETTEENTRY ret;
ret.peRed = r;
ret.peGreen = g;
ret.peBlue = b;
ret.peFlags = 0;
return ret;
}
INT
Test_NtUserSelectPalette(PTESTINFO pti)
{
HPALETTE hPal, hOldPal;
HWND hWnd;
HDC hDC, hCompDC;
struct
{
LOGPALETTE logpal;
PALETTEENTRY entry[20];
} pal;
ZeroMemory(&pal, sizeof(pal));
pal.logpal.palVersion = 0x300;
pal.logpal.palNumEntries = 6;
pal.entry[0] = PALENTRY(0,0,0);
pal.entry[1] = PALENTRY(255,255,255);
pal.entry[2] = PALENTRY(128,128,128);
pal.entry[3] = PALENTRY(128,0,0);
pal.entry[4] = PALENTRY(0,128,0);
pal.entry[5] = PALENTRY(0,0,128);
hPal = CreatePalette(&pal.logpal);
ASSERT(hPal);
TEST(DeletePalette(hPal) == 1);
hPal = CreatePalette(&pal.logpal);
ASSERT(hPal);
/* Create a window */
hWnd = CreateWindowW(L"BUTTON", L"TestWindow", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,
NULL, NULL, g_hInstance, 0);
hDC = GetDC(hWnd);
ASSERT(hDC);
hCompDC = CreateCompatibleDC(hDC);
ASSERT(hCompDC);
/* Test NULL DC */
SetLastError(ERROR_SUCCESS);
hOldPal = NtUserSelectPalette(NULL, hPal, 0);
TEST(hOldPal == 0);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test invalid DC */
SetLastError(ERROR_SUCCESS);
hOldPal = NtUserSelectPalette((HDC)-1, hPal, 0);
TEST(hOldPal == 0);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test NULL palette */
SetLastError(ERROR_SUCCESS);
hOldPal = NtUserSelectPalette(hDC, NULL, 0);
TEST(hOldPal == 0);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test invalid palette */
SetLastError(ERROR_SUCCESS);
hOldPal = NtUserSelectPalette(hDC, (HPALETTE)-1, 0);
TEST(hOldPal == 0);
TEST(GetLastError() == ERROR_SUCCESS);
/* Test valid palette */
hOldPal = NtUserSelectPalette(hDC, hPal, 0);
TEST(hOldPal != 0);
TEST(hOldPal == GetStockObject(DEFAULT_PALETTE));
/* We cannot Delete the palette */
TEST(DeletePalette(hPal) == 0);
/* We can still select the Palette into a compatible DC */
hOldPal = NtUserSelectPalette(hCompDC, hPal, 0);
TEST(hOldPal != 0);
#if 0
RealizePalette(hDC);
GetClientRect(hWnd, &rect);
FillRect(hDC, &rect, GetSysColorBrush(COLOR_BTNSHADOW));
TEST(GetNearestColor(hDC, RGB(0,0,0)) == RGB(0,0,0));
TEST(GetNearestColor(hDC, RGB(0,0,1)) == RGB(0,0,1));
ReleaseDC(hWnd, hDC);
DestroyWindow(hWnd);
RECT rect;
HBITMAP hBmp;
BITMAPINFOHEADER bmih = {sizeof(BITMAPINFOHEADER), // biSize
3, // biWidth
3, // biHeight
1, // biPlanes
8, // biBitCount
BI_RGB, // biCompression
0, // biSizeImage
92, // biXPelsPerMeter
92, // biYPelsPerMeter
6, // biClrUsed
6}; // biClrImportant
BYTE bits[3][3] = {{0,1,2},{3,4,5},{6,1,2}};
struct
{
BITMAPINFOHEADER bmih;
RGBQUAD colors[6];
} bmi = {{sizeof(BITMAPINFOHEADER),3,3,1,8,BI_RGB,0,92,92,6,6},
{{0,0,0,0},{255,255,255,0},{255,0,0,0},
{0,255,0,0},{0,0,255,0},{128,128,128,0}}};
hBmp = CreateDIBitmap(hCompDC, &bmih, CBM_INIT, &bits, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
ASSERT(hBmp);
SetLastError(0);
TEST(NtGdiSelectBitmap(hCompDC, hBmp));
hOldPal = NtUserSelectPalette(hCompDC, hPal, 0);
TEST(hOldPal != NULL);
RealizePalette(hCompDC);
TEST(GetNearestColor(hCompDC, RGB(0,0,0)) == RGB(0,0,0));
TEST(GetNearestColor(hCompDC, RGB(0,0,1)) == RGB(0,0,0));
TEST(GetNearestColor(hCompDC, RGB(100,0,0)) == RGB(0,0,0));
TEST(GetNearestColor(hCompDC, RGB(250,250,250)) == RGB(255,255,255));
TEST(GetNearestColor(hCompDC, RGB(120,100,110)) == RGB(128,128,128));
printf("nearest = 0x%x\n", GetNearestColor(hCompDC, RGB(120,100,110)));
#endif
return APISTATUS_NORMAL;
}

View file

@ -0,0 +1,15 @@
INT
Test_NtUserSetTimer(PTESTINFO pti)
{
// check valid argument
// check for replacement / new timers
// check when expiries are handled (msgs and calls)
return APISTATUS_NORMAL;
}

View file

@ -139,7 +139,7 @@ Test_NtUserToUnicodeEx(PTESTINFO pti)
TEST(NtUserToUnicodeEx(52, 5, KeyState, Buffer, 10, 0, hkl) == 1);
TEST(Buffer[0] == '$');
TEST(NtUserToUnicodeEx(53, 6, KeyState, Buffer, 10, 0, hkl) == 1);
TEST(Buffer[0] == '\%');
TEST(Buffer[0] == '%');
TEST(NtUserToUnicodeEx(54, 7, KeyState, Buffer, 10, 0, hkl) == 1);
TEST(Buffer[0] == '^');
TEST(NtUserToUnicodeEx(55, 8, KeyState, Buffer, 10, 0, hkl) == 1);

View file

@ -0,0 +1,22 @@
DWORD WINAPI
UpdatePerUserSystemParameters(DWORD dw1, DWORD dw2);
INT
Test_NtUserUpdatePerUserSystemParameters(PTESTINFO pti)
{
BOOL bScrRd;
TEST(NtUserUpdatePerUserSystemParameters(0, 0) == 0);
TEST(NtUserUpdatePerUserSystemParameters(0, 1) == 0);
TEST(NtUserUpdatePerUserSystemParameters(1, 0) == 0);
TEST(NtUserUpdatePerUserSystemParameters(1, 1) == 0);
TEST(NtUserUpdatePerUserSystemParameters(0, 2) == 0);
TEST(NtUserUpdatePerUserSystemParameters(0, -1) == 0);
// NtUserSystemParametersInfo(SPI_SETSCREENREADER, 1, 0, 0);
NtUserSystemParametersInfo(SPI_GETSCREENREADER, 0, &bScrRd, 0);
printf("bScrRd = %d\n", bScrRd);
return APISTATUS_NORMAL;
}

View file

@ -8,15 +8,25 @@
#include "ntgdi/NtGdiArcInternal.c"
#include "ntgdi/NtGdiBitBlt.c"
#include "ntgdi/NtGdiCombineRgn.c"
#include "ntgdi/NtGdiCreateBitmap.c"
#include "ntgdi/NtGdiCreateCompatibleBitmap.c"
#include "ntgdi/NtGdiCreateCompatibleDC.c"
#include "ntgdi/NtGdiCreateDIBSection.c"
#include "ntgdi/NtGdiDeleteObjectApp.c"
#include "ntgdi/NtGdiDoPalette.c"
#include "ntgdi/NtGdiEngCreatePalette.c"
//#include "ntgdi/NtGdiEnumFontChunk.c"
#include "ntgdi/NtGdiEnumFontOpen.c"
//#include "ntgdi/NtGdiExtCreatePen.c"
#include "ntgdi/NtGdiExtTextOutW.c"
#include "ntgdi/NtGdiFlushUserBatch.c"
#include "ntgdi/NtGdiGetBitmapBits.c"
#include "ntgdi/NtGdiGetFontResourceInfoInternalW.c"
#include "ntgdi/NtGdiGetRandomRgn.c"
#include "ntgdi/NtGdiPolyPolyDraw.c"
#include "ntgdi/NtGdiRestoreDC.c"
#include "ntgdi/NtGdiSaveDC.c"
#include "ntgdi/NtGdiSelectBitmap.c"
#include "ntgdi/NtGdiSelectBrush.c"
#include "ntgdi/NtGdiSelectFont.c"
@ -36,13 +46,19 @@
#include "ntuser/NtUserCallOneParam.c"
#include "ntuser/NtUserCountClipboardFormats.c"
//#include "ntuser/NtUserCreateWindowEx.c"
#include "ntuser/NtUserEnumDisplayMonitors.c"
#include "ntuser/NtUserEnumDisplaySettings.c"
#include "ntuser/NtUserFindExistingCursorIcon.c"
#include "ntuser/NtUserGetClassInfo.c"
#include "ntuser/NtUserGetTitleBarInfo.c"
#include "ntuser/NtUserProcessConnect.c"
#include "ntuser/NtUserRedrawWindow.c"
#include "ntuser/NtUserScrollDC.c"
#include "ntuser/NtUserSelectPalette.c"
#include "ntuser/NtUserSetTimer.c"
#include "ntuser/NtUserSystemParametersInfo.c"
#include "ntuser/NtUserToUnicodeEx.c"
#include "ntuser/NtUserGetTitleBarInfo.c"
#include "ntuser/NtUserUpdatePerUserSystemParameters.c"
/* The List of tests */
TESTENTRY TestList[] =
@ -55,15 +71,25 @@ TESTENTRY TestList[] =
/* ntgdi */
{ L"NtGdiArcInternal", Test_NtGdiArcInternal },
{ L"NtGdiBitBlt", Test_NtGdiBitBlt },
{ L"NtGdiCombineRgn", Test_NtGdiCombineRgn },
{ L"NtGdiCreateBitmap", Test_NtGdiCreateBitmap },
{ L"NtGdiCreateCompatibleBitmap", Test_NtGdiCreateCompatibleBitmap },
{ L"NtGdiCreateCompatibleDC", Test_NtGdiCreateCompatibleDC },
{ L"NtGdiCreateDIBSection", Test_NtGdiCreateDIBSection },
{ L"NtGdiDeleteObjectApp", Test_NtGdiDeleteObjectApp },
{ L"NtGdiDoPalette", Test_NtGdiDoPalette },
{ L"NtGdiEngCreatePalette", Test_NtGdiEngCreatePalette },
// { L"NtGdiEnumFontChunk", Test_NtGdiEnumFontChunk },
{ L"NtGdiEnumFontOpen", Test_NtGdiEnumFontOpen },
// { L"NtGdiExtCreatePen", Test_NtGdiExtCreatePen },
{ L"NtGdiExtTextOutW", Test_NtGdiExtTextOutW },
{ L"NtGdiFlushUserBatch", Test_NtGdiFlushUserBatch },
{ L"NtGdiGetBitmapBits", Test_NtGdiGetBitmapBits },
{ L"NtGdiGetFontResourceInfoInternalW", Test_NtGdiGetFontResourceInfoInternalW },
{ L"NtGdiGetRandomRgn", Test_NtGdiGetRandomRgn },
{ L"NtGdiPolyPolyDraw", Test_NtGdiPolyPolyDraw },
{ L"NtGdiRestoreDC", Test_NtGdiRestoreDC },
{ L"NtGdiSaveDC", Test_NtGdiSaveDC },
{ L"NtGdiSetBitmapBits", Test_NtGdiSetBitmapBits },
{ L"NtGdiSetDIBitsToDeviceInternal", Test_NtGdiSetDIBitsToDeviceInternal },
{ L"NtGdiSelectBitmap", Test_NtGdiSelectBitmap },
@ -84,13 +110,19 @@ TESTENTRY TestList[] =
{ L"NtUserCallOneParam", Test_NtUserCallOneParam },
{ L"NtUserCountClipboardFormats", Test_NtUserCountClipboardFormats },
// { L"NtUserCreateWindowEx", Test_NtUserCreateWindowEx },
{ L"NtUserEnumDisplayMonitors", Test_NtUserEnumDisplayMonitors },
{ L"NtUserEnumDisplaySettings", TEST_NtUserEnumDisplaySettings },
{ L"NtUserFindExistingCursorIcon", Test_NtUserFindExistingCursoricon },
{ L"NtUserGetClassInfo", Test_NtUserGetClassInfo },
{ L"NtUserGetTitleBarInfo", Test_NtUserGetTitleBarInfo },
{ L"NtUserProcessConnect", Test_NtUserProcessConnect },
{ L"NtUserRedrawWindow", Test_NtUserRedrawWindow },
{ L"NtUserScrollDC", Test_NtUserScrollDC },
{ L"NtUserSelectPalette", Test_NtUserSelectPalette },
{ L"NtUserSetTimer", Test_NtUserSetTimer },
{ L"NtUserSystemParametersInfo", Test_NtUserSystemParametersInfo },
{ L"NtUserToUnicodeEx", Test_NtUserToUnicodeEx },
{ L"NtUserGetTitleBarInfo", Test_NtUserGetTitleBarInfo }
{ L"NtUserUpdatePerUserSystemParameters", Test_NtUserUpdatePerUserSystemParameters },
};
/* The function that gives us the number of tests */

View file

@ -13,11 +13,45 @@ MyGdiQueryTable()
return pPeb->GdiSharedHandleTable;
}
static DWORD STDCALL
BOOL
IsHandleValid(HGDIOBJ hobj)
{
USHORT Index = (ULONG_PTR)hobj;
PGDI_TABLE_ENTRY pentry = &GdiHandleTable[Index];
if (pentry->KernelData == NULL ||
pentry->KernelData < (PVOID)0x80000000 ||
(USHORT)pentry->FullUnique != (USHORT)((ULONG_PTR)hobj >> 16))
{
return FALSE;
}
return TRUE;
}
PVOID
GetHandleUserData(HGDIOBJ hobj)
{
USHORT Index = (ULONG_PTR)hobj;
PGDI_TABLE_ENTRY pentry = &GdiHandleTable[Index];
if (pentry->KernelData == NULL ||
pentry->KernelData < (PVOID)0x80000000 ||
(USHORT)pentry->FullUnique != (USHORT)((ULONG_PTR)hobj >> 16))
{
return NULL;
}
return pentry->UserData;
}
static DWORD WINAPI
IntSyscall(FARPROC proc, UINT cParams, PVOID pFirstParam)
{
DWORD ret;
DWORD retval;
#ifdef __GNUC__
asm volatile
(
"pushfl;" // Save flags
@ -29,21 +63,37 @@ IntSyscall(FARPROC proc, UINT cParams, PVOID pFirstParam)
"rep movsd;" // Copy params to the stack
"call *%%edx;" // Call function
"popfl;" // Restore flags
: "=a" (ret)
: "=a" (retval)
: "S" (pFirstParam), "c" (cParams), "d"(proc)
: "%edi"
);
#else
__asm
{
pushf
mov eax, cParams
shl eax, 2
sub esp, eax
mov edi, esp
cld
rep movsd
call proc
mov retval, eax
popf
};
#endif
return ret;
return retval;
}
DWORD
Syscall(LPWSTR pszFunction, int cParams, void* pParams)
{
char szFunctionName[MAX_PATH];
FARPROC proc;
sprintf(szFunctionName, "%ls", pszFunction);
FARPROC proc = (FARPROC)GetProcAddress(g_hModule, szFunctionName);
proc = (FARPROC)GetProcAddress(g_hModule, szFunctionName);
if (!proc)
{
printf("Couldn't find proc: %s\n", szFunctionName);

View file

@ -37,6 +37,8 @@ extern HINSTANCE g_hInstance;
extern HMODULE g_hModule;
extern PGDI_TABLE_ENTRY GdiHandleTable;
BOOL IsHandleValid(HGDIOBJ hobj);
PVOID GetHandleUserData(HGDIOBJ hobj);
DWORD Syscall(LPWSTR lpszFunction, int cParams, void* pParams);
BOOL InitOsVersion();
extern UINT g_OsIdx;

View file

@ -1,17 +1,14 @@
<module name="w32knapi" type="win32cui">
<include base="w32knapi">.</include>
<define name="__USE_W32API" />
<define name="_WIN32_WINNT">0x0501</define>
<define name="WINVER">0x501</define>
<library>apitest</library>
<library>ntdll</library>
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<library>shell32</library>
<library>advapi32</library>
<library>w32kdll</library>
<library>dbghelp</library>
<compilerflag compilerset="gcc">-fms-extensions</compilerflag>
<file>w32knapi.c</file>
<file>osver.c</file>
<file>testlist.c</file>

View file

@ -1,7 +1,5 @@
<module name="ws2_32_apitests" type="win32cui" unicode="yes">
<define name="_WIN32_WINNT">0x0501</define>
<library>apitest</library>
<library>kernel32</library>
<library>user32</library>
<library>shell32</library>
<library>ws2_32</library>

View file

@ -1,9 +1,5 @@
<module name="alphablend" type="win32gui" installbase="bin" installname="alphablend.exe">
<define name="_WIN32_IE">0x0501</define>
<define name="_WIN32_WINNT">0x0501</define>
<define name="__USE_W32API" />
<include base="alphablend">.</include>
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<file>alphablend.c</file>

View file

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

View file

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

View file

@ -1,9 +1,5 @@
<module name="bitblt" type="win32gui" installbase="bin" installname="bitblt.exe">
<define name="_WIN32_IE">0x0501</define>
<define name="_WIN32_WINNT">0x0501</define>
<define name="__USE_W32API" />
<include base="bitblt">.</include>
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<file>bitblt.c</file>

View file

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

View file

@ -0,0 +1,221 @@
/*
* Shows the 15 well known BitBlt raster operations
* using src, dest, pattern, a background brush and color.
*
* Created by Gregor Schneider <grschneider AT gmail DOT com>, November 2008
*/
#include <windows.h>
#include <tchar.h>
HINSTANCE hInst;
TCHAR szWindowClass[] = _T("testclass");
static LRESULT CALLBACK
WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hBmpTest;
switch (message)
{
case WM_CREATE:
{
hBmpTest = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(100), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc, hdcMem;
BITMAP bitmap;
HBRUSH brush, brush2;
INT l;
hdc = BeginPaint(hWnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
GetObject(hBmpTest, sizeof(BITMAP), &bitmap);
/* fill destination with brush */
brush = CreateHatchBrush(HS_DIAGCROSS, RGB(255,0,0));
SelectObject(hdc, brush);
PatBlt(hdc, 30, 0, 4*bitmap.bmWidth*2, 4*bitmap.bmHeight, PATCOPY);
/* hatched brushes */
l = 66;
brush = CreateHatchBrush(HS_DIAGCROSS, RGB(255,0,0));
SelectObject(hdc, brush);
PatBlt(hdc, 0, 0, 30, l, PATCOPY);
DeleteObject(brush);
brush = CreateHatchBrush(HS_CROSS, RGB(255,0,0));
SelectObject(hdc, brush);
PatBlt(hdc, 0, 1*l, 30, l, PATCOPY);
DeleteObject(brush);
brush = CreateHatchBrush(HS_FDIAGONAL, RGB(255,0,0));
SelectObject(hdc, brush);
PatBlt(hdc, 0, 2*l, 30, l, PATCOPY);
DeleteObject(brush);
brush = CreateHatchBrush(HS_BDIAGONAL, RGB(255,0,0));
SelectObject(hdc, brush);
PatBlt(hdc, 0, 3*l, 30, l, PATCOPY);
DeleteObject(brush);
brush = CreateHatchBrush(HS_VERTICAL, RGB(255,0,0));
SelectObject(hdc, brush);
PatBlt(hdc, 0, 4*l, 30, l, PATCOPY);
DeleteObject(brush);
brush = CreateHatchBrush(HS_HORIZONTAL, RGB(255,0,0));
SelectObject(hdc, brush);
PatBlt(hdc, 0, 5*l, 30, l, PATCOPY);
DeleteObject(brush);
/* set up a second brush */
brush2 = CreateHatchBrush(HS_VERTICAL, RGB(127,127,127));
/* first select brush, then set bk color */
SelectObject(hdc, brush2);
SetBkColor(hdc, RGB(0, 255, 0));
/* 15 blt op's with bitblt */
SelectObject(hdcMem, hBmpTest);
/* offset coordinates */
SetWindowOrgEx(hdc, -10, -10, NULL);
BitBlt(hdc, 30, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
BitBlt(hdc, 130, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, DSTINVERT);
BitBlt(hdc, 230, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, MERGECOPY);
BitBlt(hdc, 330, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, MERGEPAINT);
BitBlt(hdc, 30, 100, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, NOTSRCCOPY);
BitBlt(hdc, 130, 100, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, NOTSRCERASE);
BitBlt(hdc, 230, 100, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, PATCOPY);
BitBlt(hdc, 330, 100, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, PATINVERT);
BitBlt(hdc, 30, 200, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, PATPAINT);
BitBlt(hdc, 130, 200, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCAND);
BitBlt(hdc, 230, 200, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCERASE);
BitBlt(hdc, 330, 200, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCINVERT);
BitBlt(hdc, 30, 300, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, BLACKNESS);
BitBlt(hdc, 130, 300, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCPAINT);
BitBlt(hdc, 230, 300, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, WHITENESS);
/* 15 blt op's with stretchblt */
StretchBlt(hdc, 30+400, 0, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
StretchBlt(hdc, 130+400, 0, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, DSTINVERT);
StretchBlt(hdc, 230+400, 0, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, MERGECOPY);
StretchBlt(hdc, 330+400, 0, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, MERGEPAINT);
StretchBlt(hdc, 30+400, 100, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, NOTSRCCOPY);
StretchBlt(hdc, 130+400, 100, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, NOTSRCERASE);
StretchBlt(hdc, 230+400, 100, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, PATCOPY);
StretchBlt(hdc, 330+400, 100, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, PATINVERT);
StretchBlt(hdc, 30+400, 200, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, PATPAINT);
StretchBlt(hdc, 130+400, 200, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCAND);
StretchBlt(hdc, 230+400, 200, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCERASE);
StretchBlt(hdc, 330+400, 200, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCINVERT);
StretchBlt(hdc, 30+400, 300, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, BLACKNESS);
StretchBlt(hdc, 130+400, 300, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCPAINT);
StretchBlt(hdc, 230+400, 300, bitmap.bmWidth/2, bitmap.bmHeight/2, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, WHITENESS);
DeleteObject(brush);
DeleteObject(brush2);
DeleteDC(hdcMem);
EndPaint(hWnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
static ATOM
MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
static BOOL
InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance;
hWnd = CreateWindowEx(0,
szWindowClass,
_T("BitBlt raster operation test"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
840,
440,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
int WINAPI
_tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}

View file

@ -0,0 +1,6 @@
<module name="bltrop" type="win32gui" installbase="bin" installname="bltrop.exe">
<include base="bltrop">.</include>
<library>gdi32</library>
<library>user32</library>
<file>bltrop.c</file>
<file>bltrop.rc</file>

View file

@ -0,0 +1 @@
100 BITMAP "mars.bmp"

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View file

@ -1,8 +1,4 @@
<module name="dibtest" type="win32gui" installbase="bin" installname="dibtest.exe">
<define name="_WIN32_IE">0x0501</define>
<define name="_WIN32_WINNT">0x0501</define>
<define name="__USE_W32API" />
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<file>dibtest.c</file>

View file

@ -0,0 +1,31 @@
<?xml version="1.0"?>
<!DOCTYPE group SYSTEM "../../../tools/rbuild/project.dtd">
<group xmlns:xi="http://www.w3.org/2001/XInclude">
<directory name="alphablend">
<xi:include href="alphablend/alphablend.rbuild" />
</directory>
<directory name="bitblt">
<xi:include href="bitblt/bitblt.rbuild" />
</directory>
<directory name="bltrop">
<xi:include href="bltrop/bltrop.rbuild" />
</directory>
<directory name="dibtest">
<xi:include href="dibtest/dibtest.rbuild" />
</directory>
<directory name="icontest">
<xi:include href="icontest/icontest.rbuild" />
</directory>
<directory name="palbitblt">
<xi:include href="palbitblt/palbitblt.rbuild" />
</directory>
<directory name="patblt">
<xi:include href="patblt/patblt.rbuild" />
</directory>
<directory name="stretchblt">
<xi:include href="stretchblt/stretchblt.rbuild" />
</directory>
<directory name="vbltest">
<xi:include href="vbltest/vbltest.rbuild" />
</directory>
</group>

View file

Before

Width:  |  Height:  |  Size: 766 B

After

Width:  |  Height:  |  Size: 766 B

View file

@ -9,7 +9,7 @@ const char titleDrwIco[] = "DrawIcon Output";
const char titleMask[] = "Mask(AND image)";
const char titleXor[] = "XOR(color image)";
const char file[] = "Icon from file:";
const char res[] = "Icon from Resorce:";
const char res[] = "Icon from Resource:";
const char cursor[] = "Current Cursor:";
const char cursormask[] = "Cursor Mask Bitmap";
const char cursorcolor[] = "Cursor Color Bitmap";

View file

@ -1,9 +1,5 @@
<module name="icontest" type="win32gui" installbase="bin" installname="icontest.exe">
<define name="_WIN32_IE">0x0501</define>
<define name="_WIN32_WINNT">0x0501</define>
<define name="__USE_W32API" />
<include base="icontest">.</include>
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<library>ntdll</library>

View file

@ -77,7 +77,7 @@ void UpdatePalette(HBITMAP hBM){
DoBlt(hBM);
}
void InitBitmap(HANDLE *hBM){
void InitBitmap(HBITMAP *hBM){
HPALETTE PalHan;
HWND ActiveWindow;
HDC hDC;

View file

@ -0,0 +1,5 @@
<module name="palbitblt" type="win32gui" installbase="bin" installname="palbitblt.exe" stdlib="host">
<library>user32</library>
<library>gdi32</library>
<file>pal.c</file>
</module>

View file

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 104 KiB

View file

@ -1,8 +1,4 @@
<module name="patblt" type="win32gui" installbase="bin" installname="patblt.exe" allowwarnings="true" stdlib="host">
<define name="_WIN32_IE">0x0501</define>
<define name="_WIN32_WINNT">0x0501</define>
<define name="__USE_W32API" />
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<file>patblt.cpp</file>

View file

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

View file

@ -1,8 +1,4 @@
<module name="stretchblt" type="win32gui" installbase="bin" installname="stretchblt.exe" stdlib="host">
<define name="_WIN32_IE">0x0501</define>
<define name="_WIN32_WINNT">0x0501</define>
<define name="__USE_W32API" />
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<file>stretchblt.cpp</file>

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -0,0 +1,219 @@
/*
* Tests various blit and blend operations with different src
* bit depths and scaling where possbile.
*
* Created by Gregor Schneider <grschneider AT gmail DOT com>, November 2008
*/
#include <windows.h>
#include <tchar.h>
BOOL WINAPI GdiAlphaBlend(
HDC hdcDst, int xDst, int yDst, int wDst, int hDst,
HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc,
BLENDFUNCTION blendFunction);
BOOL WINAPI GdiTransparentBlt(
HDC hdcDst, int xDst, int yDst, int wDst, int hDst,
HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc,
UINT crTransparent);
#define CURRENT_BMPS 4
#define CURRENT_ICONS 1
#define SCALE 1.5
#define OFFSET 5
HINSTANCE hInst;
TCHAR szWindowClass[] = _T("testclass");
static LRESULT CALLBACK
WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBITMAP hbmList[CURRENT_BMPS];
static HICON hicList[CURRENT_ICONS];
switch (message)
{
case WM_CREATE:
{
hbmList[0] = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(100), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
hbmList[1] = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(400), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
hbmList[2] = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(800), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
hbmList[3] = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(2400), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
hicList[0] = (HICON)LoadIcon(hInst, MAKEINTRESOURCE(3200));
break;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc, hdcMem;
BITMAP bitmap;
BLENDFUNCTION bfunc;
int x = 0, y = 0, i;
hdc = BeginPaint(hWnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
bfunc.AlphaFormat = AC_SRC_ALPHA;
bfunc.BlendFlags = 0;
bfunc.BlendOp = AC_SRC_OVER;
bfunc.SourceConstantAlpha = 128;
/* bitmaps */
for(i = 0; i < CURRENT_BMPS; i++)
{
y = 0;
SelectObject(hdcMem, hbmList[i]);
GetObject(hbmList[i], sizeof(BITMAP), &bitmap);
/* bit blt */
BitBlt(hdc, x, y, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);
y += bitmap.bmHeight + OFFSET;
/* stretch blt, org size */
StretchBlt(hdc, x, y, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
y += bitmap.bmHeight + OFFSET;
/* stretch blt, scaled */
StretchBlt(hdc, x, y, bitmap.bmWidth*SCALE, bitmap.bmHeight*SCALE, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
y += bitmap.bmHeight*SCALE + OFFSET;
/* transparent blt, transparency: grey */
GdiTransparentBlt(hdc, x, y, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, 128*256*256+128*256+128);
y += bitmap.bmHeight + OFFSET;
/* transparent blt, transparency: grey, scaled */
GdiTransparentBlt(hdc, x, y, bitmap.bmWidth*SCALE, bitmap.bmHeight*SCALE, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, 128*256*256+128*256+128);
y += bitmap.bmHeight*SCALE + OFFSET;
/* alpha blend, org size */
GdiAlphaBlend(hdc, x, y, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, bfunc);
y += bitmap.bmHeight + OFFSET;
/* alpha blend, scaled */
GdiAlphaBlend(hdc, x, y, bitmap.bmWidth*SCALE, bitmap.bmHeight*SCALE, hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, bfunc);
y += bitmap.bmHeight*SCALE + OFFSET;
x += bitmap.bmWidth*SCALE + OFFSET;
}
/* icons */
for(i = 0; i < CURRENT_ICONS; i++)
{
y = 0;
/* pure icon */
DrawIcon(hdc, x, y, hicList[i]);
y += bitmap.bmHeight + OFFSET;
/* normal icon using Ex */
DrawIconEx(hdc, x, y, hicList[i], 0, 0, 0, NULL, DI_NORMAL);
y += bitmap.bmHeight + OFFSET;
/* normal icon using Ex with bigger size */
DrawIconEx(hdc, x, y, hicList[i], bitmap.bmWidth, bitmap.bmHeight, 0, NULL, DI_NORMAL);
y += bitmap.bmHeight + OFFSET;
/* only icon using Ex */
DrawIconEx(hdc, x, y, hicList[i], 0, 0, 0, NULL, DI_IMAGE);
y += bitmap.bmHeight + OFFSET;
/* mask using Ex */
DrawIconEx(hdc, x, y, hicList[i], 0, 0, 0, NULL, DI_MASK);
y += bitmap.bmHeight + OFFSET;
x += bitmap.bmWidth*SCALE + OFFSET;
}
DeleteDC(hdcMem);
EndPaint(hWnd, &ps);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
static ATOM
MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
static BOOL
InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance;
hWnd = CreateWindowEx(0,
szWindowClass,
_T("Various blit and blend operations"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
640,
640,
NULL,
NULL,
hInstance,
NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
int WINAPI
_tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if (!InitInstance(hInstance, nCmdShow))
{
return FALSE;
}
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}

View file

@ -0,0 +1,6 @@
<module name="vbltest" type="win32gui" installbase="bin" installname="vbltest.exe">
<include base="vbltest">.</include>
<library>user32</library>
<library>gdi32</library>
<file>vbltest.c</file>
<file>vbltest.rc</file>

View file

@ -0,0 +1,6 @@
100 BITMAP "test_inv01.bmp"
400 BITMAP "test_inv04.bmp"
800 BITMAP "test_inv08.bmp"
2400 BITMAP "test_inv24.bmp"
3200 ICON "test_inv32.ico"

View file

@ -4,11 +4,17 @@
<directory name="drivers">
<xi:include href="drivers/directory.rbuild" />
</directory>
<directory name="dibtests">
<xi:include href="dibtests/directory.rbuild" />
</directory>
<directory name="dxtest">
<xi:include href="dxtest/directory.rbuild" />
</directory>
<directory name="regtests_by_casper">
<xi:include href="regtests_by_casper/directory.rbuild" />
<directory name="regtests">
<xi:include href="regtests/directory.rbuild" />
</directory>
<directory name="rosautotest">
<xi:include href="rosautotest/rosautotest.rbuild" />
</directory>
<directory name="tests">
<xi:include href="tests/directory.rbuild" />

View file

@ -1,6 +1,5 @@
<module name="csqtest" type="kernelmodedriver" installbase="system32/drivers" installname="csqtest.sys">
<bootstrap base="$(CDOUTPUT)" />
<define name="__USE_W32API" />
<include base="ReactOS">include/reactos/drivers</include>
<library>ntoskrnl</library>
<library>hal</library>

View file

@ -7,6 +7,9 @@
<directory name="kmtest">
<xi:include href="kmtest/kmtest.rbuild" />
</directory>
<directory name="kmtest">
<xi:include href="kmtest/kmtestassist.rbuild" />
</directory>
<directory name="memtest">
<xi:include href="memtest/memtest.rbuild" />
</directory>

View file

@ -31,8 +31,8 @@
/* PRIVATE FUNCTIONS **********************************************************/
NTSTATUS NTAPI
(*IoGetDeviceInterfaces_Func)(
NTSTATUS
(NTAPI *IoGetDeviceInterfaces_Func)(
IN CONST GUID *InterfaceClassGuid,
IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
IN ULONG Flags,

View file

@ -0,0 +1,266 @@
/*
* Driver Regression Tests
*
* Copyright 2009 Michael Martin <martinmnet@hotmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; see the file COPYING.LIB.
* If not, write to the Free Software Foundation,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* INCLUDES *******************************************************************/
#include "kmtest.h"
#include <ddk/ntddk.h>
#include <ddk/ntifs.h>
#include "ntddser.h"
#include "ntndk.h"
VOID LowerDeviceKernelAPITest(PDEVICE_OBJECT DeviceObject, BOOLEAN UnLoading)
{
PDEVICE_OBJECT RetObject;
RetObject = IoGetLowerDeviceObject(DeviceObject);
if (UnLoading)
{
ok(RetObject == 0,
"Expected no Lower DeviceObject, got %p", RetObject);
}
else
{
ok(RetObject == AttachDeviceObject,
"Expected an Attached DeviceObject %p, got %p", AttachDeviceObject, RetObject);
}
if (RetObject)
{
ObDereferenceObject(RetObject);
}
RetObject = IoGetDeviceAttachmentBaseRef(DeviceObject);
ok(RetObject == DeviceObject,
"Expected an Attached DeviceObject %p, got %p", DeviceObject, RetObject);
if (RetObject)
{
ObDereferenceObject(RetObject);
}
}
VOID DeviceCreatedTest(PDEVICE_OBJECT DeviceObject, BOOLEAN ExclusiveAccess)
{
PEXTENDED_DEVOBJ_EXTENSION extdev;
/*Check the device object members */
ok(DeviceObject->Type==3, "Expected Type = 3, got %x", DeviceObject->Type);
ok(DeviceObject->Size = 0xb8, "Expected Size = 0xba, got %x", DeviceObject->Size);
ok(DeviceObject->ReferenceCount == 0, "Expected ReferenceCount = 0, got %lu",
DeviceObject->ReferenceCount);
ok(DeviceObject->DriverObject == ThisDriverObject,
"Expected DriverObject member to match this DriverObject %p, got %p",
ThisDriverObject, DeviceObject->DriverObject);
ok(DeviceObject->NextDevice == NULL, "Expected NextDevice to be NULL, got %p", DeviceObject->NextDevice);
ok(DeviceObject->AttachedDevice == NULL, "Expected AttachDevice to be NULL, got %p", DeviceObject->AttachedDevice);
ok(DeviceObject->Characteristics == 0, "Expected Characteristics to be 0");
if (ExclusiveAccess)
{
ok((DeviceObject->Flags == (DO_DEVICE_HAS_NAME | DO_DEVICE_INITIALIZING | DO_EXCLUSIVE)),
"Expected Flags DO_DEVICE_HAS_NAME | DO_DEVICE_INITIALIZING | DO_EXCLUSIVE, got %lu", DeviceObject->Flags);
}
else
{
ok((DeviceObject->Flags == (DO_DEVICE_HAS_NAME | DO_DEVICE_INITIALIZING)),
"Expected Flags DO_DEVICE_HAS_NAME | DO_DEVICE_INITIALIZING, got %lu", DeviceObject->Flags);
}
ok(DeviceObject->DeviceType == FILE_DEVICE_UNKNOWN,
"Expected DeviceType to match creation parameter FILE_DEVICE_UNKNWOWN, got %lu",
DeviceObject->DeviceType);
ok(DeviceObject->ActiveThreadCount == 0, "Expected ActiveThreadCount = 0, got %lu\n", DeviceObject->ActiveThreadCount);
/*Check the extended extension */
extdev = (PEXTENDED_DEVOBJ_EXTENSION)DeviceObject->DeviceObjectExtension;
ok(extdev->ExtensionFlags == 0, "Expected Extended ExtensionFlags to be 0, got %lu", extdev->ExtensionFlags);
ok (extdev->Type == 13, "Expected Type of 13, got %d", extdev->Type);
ok (extdev->Size == 0, "Expected Size of 0, got %d", extdev->Size);
ok (extdev->DeviceObject == DeviceObject, "Expected DeviceOject to match newly created device %p, got %p",
DeviceObject, extdev->DeviceObject);
ok(extdev->AttachedTo == NULL, "Expected AttachTo to be NULL, got %p", extdev->AttachedTo);
ok(extdev->StartIoCount == 0, "Expected StartIoCount = 0, got %lu", extdev->StartIoCount);
ok(extdev->StartIoKey == 0, "Expected StartIoKey = 0, got %lu", extdev->StartIoKey);
ok(extdev->StartIoFlags == 0, "Expected StartIoFlags = 0, got %lu", extdev->StartIoFlags);
}
VOID DeviceDeletionTest(PDEVICE_OBJECT DeviceObject, BOOLEAN Lower)
{
PEXTENDED_DEVOBJ_EXTENSION extdev;
/*Check the device object members */
ok(DeviceObject->Type==3, "Expected Type = 3, got %d", DeviceObject->Type);
ok(DeviceObject->Size = 0xb8, "Expected Size = 0xba, got %d", DeviceObject->Size);
ok(DeviceObject->ReferenceCount == 0, "Expected ReferenceCount = 0, got %lu",
DeviceObject->ReferenceCount);
if (!Lower)
{
ok(DeviceObject->DriverObject == ThisDriverObject,
"Expected DriverObject member to match this DriverObject %p, got %p",
ThisDriverObject, DeviceObject->DriverObject);
}
ok(DeviceObject->NextDevice == NULL, "Expected NextDevice to be NULL, got %p", DeviceObject->NextDevice);
if (Lower)
{
ok(DeviceObject->AttachedDevice == MainDeviceObject,
"Expected AttachDevice to be %p, got %p", MainDeviceObject, DeviceObject->AttachedDevice);
}
else
{
ok(DeviceObject->AttachedDevice == NULL, "Expected AttachDevice to be NULL, got %p", DeviceObject->AttachedDevice);
}
ok(DeviceObject->Flags ==FILE_VIRTUAL_VOLUME,
"Expected Flags FILE_VIRTUAL_VOLUME, got %lu", DeviceObject->Flags);
ok(DeviceObject->DeviceType == FILE_DEVICE_UNKNOWN,
"Expected DeviceType to match creation parameter FILE_DEVICE_UNKNWOWN, got %lu",
DeviceObject->DeviceType);
ok(DeviceObject->ActiveThreadCount == 0, "Expected ActiveThreadCount = 0, got %lu\n", DeviceObject->ActiveThreadCount);
/*Check the extended extension */
extdev = (PEXTENDED_DEVOBJ_EXTENSION)DeviceObject->DeviceObjectExtension;
ok(extdev->ExtensionFlags == DOE_UNLOAD_PENDING,
"Expected Extended ExtensionFlags to be DOE_UNLOAD_PENDING, got %lu", extdev->ExtensionFlags);
ok (extdev->Type == 13, "Expected Type of 13, got %d", extdev->Type);
ok (extdev->Size == 0, "Expected Size of 0, got %d", extdev->Size);
ok (extdev->DeviceObject == DeviceObject, "Expected DeviceOject to match newly created device %p, got %p",
DeviceObject, extdev->DeviceObject);
if (Lower)
{
/* Skip this for now */
//ok(extdev->AttachedTo == MainDeviceObject, "Expected AttachTo to %p, got %p", MainDeviceObject, extdev->AttachedTo);
}
else
{
ok(extdev->AttachedTo == NULL, "Expected AttachTo to be NULL, got %p", extdev->AttachedTo);
}
ok(extdev->StartIoCount == 0, "Expected StartIoCount = 0, got %lu", extdev->StartIoCount);
ok(extdev->StartIoKey == 0, "Expected StartIoKey = 0, got %lu", extdev->StartIoKey);
ok(extdev->StartIoFlags == 0, "Expected StartIoFlags = 0, got %lu", extdev->StartIoFlags);
}
VOID DeviceCreateDeleteTest(PDRIVER_OBJECT DriverObject)
{
NTSTATUS Status;
UNICODE_STRING DeviceString;
UNICODE_STRING DosDeviceString;
PDEVICE_OBJECT DeviceObject;
/* Create using wrong directory */
RtlInitUnicodeString(&DeviceString, L"\\Device1\\Kmtest");
Status = IoCreateDevice(DriverObject,
0,
&DeviceString,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&DeviceObject);
ok(Status == STATUS_OBJECT_PATH_NOT_FOUND, "Expected STATUS_OBJECT_PATH_NOT_FOUND, got 0x%lX", Status);
/* Create using correct params with exlusice access */
RtlInitUnicodeString(&DeviceString, L"\\Device\\Kmtest");
Status = IoCreateDevice(DriverObject,
0,
&DeviceString,
FILE_DEVICE_UNKNOWN,
0,
TRUE,
&DeviceObject);
ok(Status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got 0x%lX", Status);
DeviceCreatedTest(DeviceObject, TRUE);
/* Delete the device */
if (NT_SUCCESS(Status))
{
IoDeleteDevice(DeviceObject);
ok(DriverObject->DeviceObject == 0, "Expected DriverObject->DeviceObject to be NULL, got %p",
DriverObject->DeviceObject);
}
/* Create using correct params with exlusice access */
Status = IoCreateDevice(DriverObject,
0,
&DeviceString,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&DeviceObject);
ok(Status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got 0x%lX", Status);
DeviceCreatedTest(DeviceObject, FALSE);
/* Delete the device */
if (NT_SUCCESS(Status))
{
IoDeleteDevice(DeviceObject);
ok(DriverObject->DeviceObject == 0, "Expected DriverObject->DeviceObject to be NULL, got %p",
DriverObject->DeviceObject);
}
/* Recreate device */
Status = IoCreateDevice(DriverObject,
0,
&DeviceString,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&DeviceObject);
ok(Status == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got 0x%lX", Status);
RtlInitUnicodeString(&DosDeviceString, L"\\DosDevices\\kmtest");
Status = IoCreateSymbolicLink(&DosDeviceString, &DeviceString);
if (!NT_SUCCESS(Status))
{
/* Delete device object if not successful */
IoDeleteDevice(DeviceObject);
return;
}
MainDeviceObject = DeviceObject;
return;
}
BOOLEAN AttachDeviceTest(PDEVICE_OBJECT DeviceObject, PWCHAR NewDriverRegPath)
{
NTSTATUS Status;
UNICODE_STRING LowerDeviceName;
RtlInitUnicodeString(&LowerDeviceName, NewDriverRegPath);
Status = IoAttachDevice(DeviceObject, &LowerDeviceName, &AttachDeviceObject);
/* TODO: Add more tests */
return TRUE;
}
BOOLEAN DetachDeviceTest(PDEVICE_OBJECT AttachedDevice)
{
IoDetachDevice(AttachedDevice);
/* TODO: Add more tests */
return TRUE;
}

Some files were not shown because too many files have changed in this diff Show more