mirror of
https://github.com/reactos/reactos.git
synced 2025-02-23 08:55:19 +00:00
- 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:
parent
2895b48a31
commit
8c84226668
4 changed files with 112 additions and 0 deletions
93
rostests/apitests/w32knapi/ntgdi/NtGdiDeleteObjectApp.c
Normal file
93
rostests/apitests/w32knapi/ntgdi/NtGdiDeleteObjectApp.c
Normal 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;
|
||||
}
|
|
@ -13,6 +13,7 @@
|
|||
#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"
|
||||
|
@ -72,6 +73,7 @@ TESTENTRY TestList[] =
|
|||
{ 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 },
|
||||
|
|
|
@ -13,6 +13,22 @@ MyGdiQueryTable()
|
|||
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
|
||||
IntSyscall(FARPROC proc, UINT cParams, PVOID pFirstParam)
|
||||
{
|
||||
|
|
|
@ -37,6 +37,7 @@ extern HINSTANCE g_hInstance;
|
|||
extern HMODULE g_hModule;
|
||||
extern PGDI_TABLE_ENTRY GdiHandleTable;
|
||||
|
||||
BOOL IsHandleValid(HGDIOBJ hobj);
|
||||
DWORD Syscall(LPWSTR lpszFunction, int cParams, void* pParams);
|
||||
BOOL InitOsVersion();
|
||||
extern UINT g_OsIdx;
|
||||
|
|
Loading…
Reference in a new issue