[APPHELP][APPHELP_APITEST] Implement SdbGetDatabaseInformation

CORE-11301
This commit is contained in:
Mark Jansen 2019-02-11 22:44:30 +01:00
parent 5c05a29d3d
commit 28a091ac12
No known key found for this signature in database
GPG key ID: B39240EE84BEAE8B
5 changed files with 210 additions and 15 deletions

View file

@ -4,7 +4,7 @@
* PURPOSE: Tests for shim-database api's
* COPYRIGHT: Copyright 2012 Detlef Riekenberg
* Copyright 2013 Mislav Blažević
* Copyright 2015-2018 Mark Jansen (mark.jansen@reactos.org)
* Copyright 2015-2019 Mark Jansen (mark.jansen@reactos.org)
*/
#include <ntstatus.h>
@ -120,6 +120,16 @@
#define TAG_DATABASE_ID (0x7 | TAG_TYPE_BINARY)
typedef struct _DB_INFORMATION
{
DWORD dwSomething;
DWORD dwMajor;
DWORD dwMinor;
LPCWSTR Description;
GUID Id;
/* Win10+ has an extra field here */
} DB_INFORMATION, *PDB_INFORMATION;
static HMODULE hdll;
static LPCWSTR (WINAPI *pSdbTagToString)(TAG);
@ -163,6 +173,8 @@ static LONGLONG (WINAPI* pSdbMakeIndexKeyFromString)(LPCWSTR);
static DWORD (WINAPI* pSdbQueryData)(HSDB hsdb, TAGREF trWhich, LPCWSTR lpszDataName, LPDWORD lpdwDataType, LPVOID lpBuffer, LPDWORD lpcbBufferSize);
static DWORD (WINAPI* pSdbQueryDataEx)(HSDB hsdb, TAGREF trWhich, LPCWSTR lpszDataName, LPDWORD lpdwDataType, LPVOID lpBuffer, LPDWORD lpcbBufferSize, TAGREF *ptrData);
static DWORD (WINAPI* pSdbQueryDataExTagID)(PDB pdb, TAGID tiExe, LPCWSTR lpszDataName, LPDWORD lpdwDataType, LPVOID lpBuffer, LPDWORD lpcbBufferSize, TAGID *ptiData);
static BOOL (WINAPI* pSdbGetDatabaseInformation)(PDB pdb, PDB_INFORMATION information);
static VOID (WINAPI* pSdbFreeDatabaseInformation)(PDB_INFORMATION information);
DEFINE_GUID(GUID_DATABASE_TEST, 0xe39b0eb0, 0x55db, 0x450b, 0x9b, 0xd4, 0xd2, 0x0c, 0x94, 0x84, 0x26, 0x0f);
DEFINE_GUID(GUID_MAIN_DATABASE, 0x11111111, 0x1111, 0x1111, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11);
@ -174,6 +186,51 @@ static void Write(HANDLE file, LPCVOID buffer, DWORD size)
WriteFile(file, buffer, size, &dwWritten, NULL);
}
static void test_GetDatabaseInformationEmpty(PDB pdb)
{
PDB_INFORMATION pInfo;
BOOL fResult;
if (!pSdbGetDatabaseInformation || !pSdbFreeDatabaseInformation)
{
skip("GetDatabaseInformation or SdbFreeDatabaseInformation not found\n");
return;
}
pInfo = (PDB_INFORMATION)malloc(sizeof(*pInfo) * 4);
memset(pInfo, 0xDE, sizeof(*pInfo) * 2);
fResult = pSdbGetDatabaseInformation(pdb, pInfo);
ok(fResult, "SdbGetDatabaseInformation failed\n");
if (fResult)
{
ok_int(pInfo->dwSomething, 0);
ok(IsEqualGUID(GUID_NULL, pInfo->Id), "expected guid to be empty(%s)\n", wine_dbgstr_guid(&pInfo->Id));
ok(pInfo->Description == NULL, "Expected pInfo->Description to be NULL, was %s\n", wine_dbgstr_w(pInfo->Description));
/* Struct is slightly bigger on some Win10, and the DB version nr is different on all */
if (g_WinVersion >= WINVER_WIN10)
{
ok(pInfo->dwMajor == 3, "Expected pInfo->dwMajor to be 3, was: %d\n", pInfo->dwMajor);
ok(pInfo->dwMinor == 0, "Expected pInfo->dwMinor to be 0, was: %d\n", pInfo->dwMinor);
ok(pInfo[1].dwSomething == 0 || pInfo[1].dwSomething == 0xdededede, "Something amiss: 0x%x\n", pInfo[1].dwSomething);
ok(pInfo[1].dwMajor == 0xdededede, "Cookie2 corrupt: 0x%x\n", pInfo[1].dwMajor);
}
else
{
ok(pInfo->dwMajor == 2, "Expected pInfo->dwMajor to be 2, was: %d\n", pInfo->dwMajor);
ok(pInfo->dwMinor == 1, "Expected pInfo->dwMinor to be 1, was: %d\n", pInfo->dwMinor);
ok(pInfo[1].dwSomething == 0xdededede, "Cookie1 corrupt: 0x%x\n", pInfo[1].dwSomething);
ok(pInfo[1].dwMajor == 0xdededede, "Cookie2 corrupt: 0x%x\n", pInfo[1].dwMajor);
}
}
free(pInfo);
}
static void test_Sdb(void)
{
static const WCHAR temp[] = L"temp";
@ -289,6 +346,8 @@ static void test_Sdb(void)
word = pSdbReadWORDTag(pdb, tagid, 0);
ok(word == 0xACE, "unexpected value 0x%x, expected 0x%x\n", word, 0xACE);
test_GetDatabaseInformationEmpty(pdb);
pSdbCloseDatabase(pdb);
}
DeleteFileW(path1);
@ -966,6 +1025,63 @@ static void check_db_apphelp(PDB pdb, TAGID root)
ok(num == 2, "Expected to find 2 layer tags, found: %d\n", num);
}
static void test_GetDatabaseInformation(PDB pdb)
{
PDB_INFORMATION pInfo;
BOOL fResult;
if (!pSdbGetDatabaseInformation || !pSdbFreeDatabaseInformation)
{
skip("GetDatabaseInformation or SdbFreeDatabaseInformation not found\n");
return;
}
_SEH2_TRY
{
pSdbFreeDatabaseInformation(NULL);
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
ok(0, "SdbFreeDatabaseInformation did not handle a NULL pointer very gracefully.\n");
}
_SEH2_END;
pInfo = (PDB_INFORMATION)malloc(sizeof(*pInfo) * 4);
memset(pInfo, 0xDE, sizeof(*pInfo) * 2);
fResult = pSdbGetDatabaseInformation(pdb, pInfo);
ok(fResult, "SdbGetDatabaseInformation failed\n");
if (fResult)
{
ok_int(pInfo->dwSomething, 1);
ok(IsEqualGUID(GUID_DATABASE_TEST, pInfo->Id), "expected guids to be equal(%s:%s)\n",
wine_dbgstr_guid(&GUID_DATABASE_TEST), wine_dbgstr_guid(&pInfo->Id));
ok(wcscmp(pInfo->Description, L"apphelp_test1") == 0,
"Expected pInfo->Description to be 'apphelp_test1', was %s\n", wine_dbgstr_w(pInfo->Description));
/* Struct is slightly bigger on some Win10, and the DB version nr is different on all */
if (g_WinVersion >= WINVER_WIN10)
{
ok(pInfo->dwMajor == 3, "Expected pInfo->dwMajor to be 3, was: %d\n", pInfo->dwMajor);
ok(pInfo->dwMinor == 0, "Expected pInfo->dwMinor to be 0, was: %d\n", pInfo->dwMinor);
ok(pInfo[1].dwSomething == 4 || pInfo[1].dwSomething == 0xdededede, "Something amiss: 0x%x\n", pInfo[1].dwSomething);
ok(pInfo[1].dwMajor == 0xdededede, "Cookie2 corrupt: 0x%x\n", pInfo[1].dwMajor);
}
else
{
ok(pInfo->dwMajor == 2, "Expected pInfo->dwMajor to be 2, was: %d\n", pInfo->dwMajor);
ok(pInfo->dwMinor == 1, "Expected pInfo->dwMinor to be 1, was: %d\n", pInfo->dwMinor);
ok(pInfo[1].dwSomething == 0xdededede, "Cookie1 corrupt: 0x%x\n", pInfo[1].dwSomething);
ok(pInfo[1].dwMajor == 0xdededede, "Cookie2 corrupt: 0x%x\n", pInfo[1].dwMajor);
}
}
free(pInfo);
}
static void test_CheckDatabaseManually(void)
{
static const WCHAR path[] = {'t','e','s','t','_','d','b','.','s','d','b',0};
@ -1040,6 +1156,7 @@ static void test_CheckDatabaseManually(void)
check_db_exes(pdb, root);
check_db_apphelp(pdb, root);
}
test_GetDatabaseInformation(pdb);
pSdbCloseDatabase(pdb);
DeleteFileA("test_db.sdb");
@ -1998,6 +2115,8 @@ START_TEST(db)
*(void**)&pSdbQueryDataEx = (void *)GetProcAddress(hdll, "SdbQueryDataEx");
*(void**)&pSdbQueryDataExTagID = (void *)GetProcAddress(hdll, "SdbQueryDataExTagID");
*(void**)&pSdbGetLayerTagRef = (void *)GetProcAddress(hdll, "SdbGetLayerTagRef");
*(void**)&pSdbGetDatabaseInformation = (void *)GetProcAddress(hdll, "SdbGetDatabaseInformation");
*(void**)&pSdbFreeDatabaseInformation = (void *)GetProcAddress(hdll, "SdbFreeDatabaseInformation");
test_Sdb();
test_write_ex();