diff --git a/rostests/apitests/w32knapi/ntgdi/NtGdiDeleteObjectApp.c b/rostests/apitests/w32knapi/ntgdi/NtGdiDeleteObjectApp.c new file mode 100644 index 00000000000..6c2c2d2fa3e --- /dev/null +++ b/rostests/apitests/w32knapi/ntgdi/NtGdiDeleteObjectApp.c @@ -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; +} diff --git a/rostests/apitests/w32knapi/testlist.c b/rostests/apitests/w32knapi/testlist.c index 567062e171e..359afc49c8a 100644 --- a/rostests/apitests/w32knapi/testlist.c +++ b/rostests/apitests/w32knapi/testlist.c @@ -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 }, diff --git a/rostests/apitests/w32knapi/w32knapi.c b/rostests/apitests/w32knapi/w32knapi.c index 90c3dfd9b5e..ec065810f89 100644 --- a/rostests/apitests/w32knapi/w32knapi.c +++ b/rostests/apitests/w32knapi/w32knapi.c @@ -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) { diff --git a/rostests/apitests/w32knapi/w32knapi.h b/rostests/apitests/w32knapi/w32knapi.h index 4463015e162..b6d0178c502 100644 --- a/rostests/apitests/w32knapi/w32knapi.h +++ b/rostests/apitests/w32knapi/w32knapi.h @@ -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;