- Add a bunch of tests for NtGdiDeleteObjectApp

- Add Is handle valid function to check whether a handle is still valid.

svn path=/trunk/; revision=40199
This commit is contained in:
Timo Kreuzer 2009-03-24 01:25:03 +00:00
parent 2895b48a31
commit 8c84226668
4 changed files with 112 additions and 0 deletions

View file

@ -0,0 +1,93 @@
INT
Test_NtGdiDeleteObjectApp(PTESTINFO pti)
{
HDC hdc;
HBITMAP hbmp;
HBRUSH hbrush;
BOOL ret;
/* Try to delete 0 */
SetLastError(0);
ret = NtGdiDeleteObjectApp(0);
TEST(ret == 0);
TEST(GetLastError() == 0);
/* Delete a DC */
SetLastError(0);
hdc = CreateCompatibleDC(NULL);
ASSERT(hdc);
TEST(IsHandleValid(hdc) == 1);
ret = NtGdiDeleteObjectApp(hdc);
TEST(ret == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hdc) == 0);
/* Delete a brush */
SetLastError(0);
hbrush = CreateSolidBrush(0x123456);
ASSERT(hbrush);
TEST(IsHandleValid(hbrush) == 1);
ret = NtGdiDeleteObjectApp(hbrush);
TEST(ret == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hbrush) == 0);
/* Try to delete a stock brush */
SetLastError(0);
hbrush = GetStockObject(BLACK_BRUSH);
ASSERT(hbrush);
TEST(IsHandleValid(hbrush) == 1);
ret = NtGdiDeleteObjectApp(hbrush);
TEST(ret == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hbrush) == 1);
/* Delete a bitmap */
SetLastError(0);
hbmp = CreateBitmap(10, 10, 1, 1, NULL);
ASSERT(hbmp);
TEST(IsHandleValid(hbmp) == 1);
ret = NtGdiDeleteObjectApp(hbmp);
TEST(ret == 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(hbrush);
TEST(IsHandleValid(hbrush) == 1);
TEST(NtGdiSelectBrush(hdc, hbrush));
ret = NtGdiDeleteObjectApp(hbrush);
TEST(ret == 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(hbmp);
TEST(IsHandleValid(hbmp) == 1);
TEST(NtGdiSelectBitmap(hdc, hbmp));
ret = NtGdiDeleteObjectApp(hbmp);
TEST(ret == 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);
ret = NtGdiDeleteObjectApp(hbmp);
TEST(ret == 1);
TEST(GetLastError() == 0);
TEST(IsHandleValid(hbmp) == 0);
return APISTATUS_NORMAL;
}

View file

@ -13,6 +13,7 @@
#include "ntgdi/NtGdiCreateCompatibleBitmap.c" #include "ntgdi/NtGdiCreateCompatibleBitmap.c"
#include "ntgdi/NtGdiCreateCompatibleDC.c" #include "ntgdi/NtGdiCreateCompatibleDC.c"
#include "ntgdi/NtGdiCreateDIBSection.c" #include "ntgdi/NtGdiCreateDIBSection.c"
#include "ntgdi/NtGdiDeleteObjectApp.c"
#include "ntgdi/NtGdiDoPalette.c" #include "ntgdi/NtGdiDoPalette.c"
#include "ntgdi/NtGdiEngCreatePalette.c" #include "ntgdi/NtGdiEngCreatePalette.c"
//#include "ntgdi/NtGdiEnumFontChunk.c" //#include "ntgdi/NtGdiEnumFontChunk.c"
@ -72,6 +73,7 @@ TESTENTRY TestList[] =
{ L"NtGdiCreateCompatibleBitmap", Test_NtGdiCreateCompatibleBitmap }, { L"NtGdiCreateCompatibleBitmap", Test_NtGdiCreateCompatibleBitmap },
{ L"NtGdiCreateCompatibleDC", Test_NtGdiCreateCompatibleDC }, { L"NtGdiCreateCompatibleDC", Test_NtGdiCreateCompatibleDC },
{ L"NtGdiCreateDIBSection", Test_NtGdiCreateDIBSection }, { L"NtGdiCreateDIBSection", Test_NtGdiCreateDIBSection },
{ L"NtGdiDeleteObjectApp", Test_NtGdiDeleteObjectApp },
{ L"NtGdiDoPalette", Test_NtGdiDoPalette }, { L"NtGdiDoPalette", Test_NtGdiDoPalette },
{ L"NtGdiEngCreatePalette", Test_NtGdiEngCreatePalette }, { L"NtGdiEngCreatePalette", Test_NtGdiEngCreatePalette },
// { L"NtGdiEnumFontChunk", Test_NtGdiEnumFontChunk }, // { L"NtGdiEnumFontChunk", Test_NtGdiEnumFontChunk },

View file

@ -13,6 +13,22 @@ MyGdiQueryTable()
return pPeb->GdiSharedHandleTable; return pPeb->GdiSharedHandleTable;
} }
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;
}
static DWORD WINAPI static DWORD WINAPI
IntSyscall(FARPROC proc, UINT cParams, PVOID pFirstParam) IntSyscall(FARPROC proc, UINT cParams, PVOID pFirstParam)
{ {

View file

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