Skip to content

Commit 74bb9d5

Browse files
committed
[APPHELP_APITEST] Add tests for Data tags
1 parent d74a3fe commit 74bb9d5

File tree

2 files changed

+234
-2
lines changed

2 files changed

+234
-2
lines changed

modules/rostests/apitests/apphelp/db.cpp

Lines changed: 226 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
#define TAG_LAYER (0xB | TAG_TYPE_LIST)
8989
#define TAG_APPHELP (0xD | TAG_TYPE_LIST)
9090
#define TAG_LINK (0xE | TAG_TYPE_LIST)
91+
#define TAG_DATA (0xF | TAG_TYPE_LIST)
9192
#define TAG_STRINGTABLE (0x801 | TAG_TYPE_LIST)
9293

9394
#define TAG_STRINGTABLE_ITEM (0x801 | TAG_TYPE_STRING)
@@ -139,7 +140,7 @@ static TAGID (WINAPI *pSdbBeginWriteListTag)(PDB, TAG);
139140
static BOOL (WINAPI *pSdbEndWriteListTag)(PDB, TAGID);
140141
static TAGID (WINAPI *pSdbFindFirstTag)(PDB, TAGID, TAG);
141142
static TAGID (WINAPI *pSdbFindNextTag)(PDB, TAGID, TAGID);
142-
static TAGID (WINAPI *pSdbFindFirstNamedTag)(PDB, TAGID, TAGID, TAGID, LPCWSTR);
143+
static TAGID (WINAPI *pSdbFindFirstNamedTag)(PDB pdb, TAGID root, TAGID find, TAGID nametag, LPCWSTR find_name);
143144
static WORD (WINAPI *pSdbReadWORDTag)(PDB, TAGID, WORD);
144145
static DWORD (WINAPI *pSdbReadDWORDTag)(PDB, TAGID, DWORD);
145146
static QWORD (WINAPI *pSdbReadQWORDTag)(PDB, TAGID, QWORD);
@@ -159,7 +160,9 @@ static BOOL (WINAPI *pSdbTagRefToTagID)(HSDB hSDB, TAGREF trWhich, PDB *ppdb, TA
159160
static BOOL (WINAPI *pSdbTagIDToTagRef)(HSDB hSDB, PDB pdb, TAGID tiWhich, TAGREF *ptrWhich);
160161
static TAGREF (WINAPI *pSdbGetLayerTagRef)(HSDB hsdb, LPCWSTR layerName);
161162
static LONGLONG (WINAPI* pSdbMakeIndexKeyFromString)(LPCWSTR);
162-
163+
static DWORD (WINAPI* pSdbQueryData)(HSDB hsdb, TAGREF trWhich, LPCWSTR lpszDataName, LPDWORD lpdwDataType, LPVOID lpBuffer, LPDWORD lpcbBufferSize);
164+
static DWORD (WINAPI* pSdbQueryDataEx)(HSDB hsdb, TAGREF trWhich, LPCWSTR lpszDataName, LPDWORD lpdwDataType, LPVOID lpBuffer, LPDWORD lpcbBufferSize, TAGREF *ptrData);
165+
static DWORD (WINAPI* pSdbQueryDataExTagID)(PDB pdb, TAGID tiExe, LPCWSTR lpszDataName, LPDWORD lpdwDataType, LPVOID lpBuffer, LPDWORD lpcbBufferSize, TAGID *ptiData);
163166

164167
DEFINE_GUID(GUID_DATABASE_TEST, 0xe39b0eb0, 0x55db, 0x450b, 0x9b, 0xd4, 0xd2, 0x0c, 0x94, 0x84, 0x26, 0x0f);
165168
DEFINE_GUID(GUID_MAIN_DATABASE, 0x11111111, 0x1111, 0x1111, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11);
@@ -1597,6 +1600,223 @@ static void test_TagRef(void)
15971600
}
15981601

15991602

1603+
static void test_DataTags(HSDB hsdb)
1604+
{
1605+
PDB pdb = NULL;
1606+
TAGID db = TAGID_NULL, layer, exe;
1607+
TAGREF trData;
1608+
BYTE Buffer[1024];
1609+
DWORD dwBufferSize, dwDataType, dwRet;
1610+
TAGID tiData;
1611+
1612+
BOOL ret = pSdbTagRefToTagID(hsdb, TAGID_ROOT, &pdb, NULL);
1613+
1614+
ok(ret != FALSE, "Expected ret to be TRUE, was: %d\n", ret);
1615+
ok(pdb != NULL, "Expected pdb to be valid\n");
1616+
1617+
if (pdb == NULL)
1618+
{
1619+
skip("Cannot run tests without pdb\n");
1620+
return;
1621+
}
1622+
1623+
db = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
1624+
ok(db != NULL, "Expected db to be valid\n");
1625+
if (db == TAGID_NULL)
1626+
{
1627+
skip("Cannot run tests without db\n");
1628+
return;
1629+
}
1630+
1631+
layer = pSdbFindFirstNamedTag(pdb, db, TAG_LAYER, TAG_NAME, L"DATA_LAYER");
1632+
ok(layer != NULL, "Expected layer to be valid\n");
1633+
if (layer == TAGID_NULL)
1634+
{
1635+
skip("Cannot run tests without layer\n");
1636+
return;
1637+
}
1638+
1639+
memset(Buffer, 0xaa, sizeof(Buffer));
1640+
dwBufferSize = sizeof(Buffer);
1641+
dwDataType = 0x12345;
1642+
tiData = 0x111111;
1643+
dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &tiData);
1644+
ok_hex(dwRet, ERROR_SUCCESS);
1645+
ok_hex(dwDataType, REG_DWORD);
1646+
ok_hex(dwBufferSize, sizeof(DWORD));
1647+
ok_hex(*(DWORD*)Buffer, 3333);
1648+
ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got NULL\n");
1649+
ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
1650+
1651+
memset(Buffer, 0xaa, sizeof(Buffer));
1652+
dwBufferSize = sizeof(Buffer);
1653+
dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer, &dwBufferSize, NULL);
1654+
ok_hex(dwRet, ERROR_SUCCESS);
1655+
ok_hex(dwBufferSize, sizeof(DWORD));
1656+
ok_hex(*(DWORD*)Buffer, 3333);
1657+
1658+
/* This succeeds on 2k3.. */
1659+
memset(Buffer, 0xaa, sizeof(Buffer));
1660+
dwBufferSize = sizeof(Buffer);
1661+
dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer, NULL, NULL);
1662+
ok_hex(dwRet, ERROR_INSUFFICIENT_BUFFER);
1663+
ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1664+
1665+
memset(Buffer, 0xaa, sizeof(Buffer));
1666+
dwBufferSize = 1;
1667+
dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer, &dwBufferSize, NULL);
1668+
ok_hex(dwRet, ERROR_INSUFFICIENT_BUFFER);
1669+
ok_hex(dwBufferSize, sizeof(DWORD));
1670+
ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1671+
1672+
memset(Buffer, 0xaa, sizeof(Buffer));
1673+
dwBufferSize = sizeof(Buffer);
1674+
dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, NULL, &dwBufferSize, NULL);
1675+
ok_hex(dwRet, ERROR_INSUFFICIENT_BUFFER);
1676+
ok_hex(dwBufferSize, sizeof(DWORD));
1677+
ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1678+
1679+
memset(Buffer, 0xaa, sizeof(Buffer));
1680+
dwBufferSize = sizeof(Buffer);
1681+
dwRet = pSdbQueryDataExTagID(pdb, TAGID_NULL, L"TESTDATA1", NULL, Buffer, &dwBufferSize, NULL);
1682+
ok_hex(dwRet, ERROR_NOT_FOUND);
1683+
ok_hex(dwBufferSize, sizeof(Buffer));
1684+
ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1685+
1686+
memset(Buffer, 0xaa, sizeof(Buffer));
1687+
dwBufferSize = sizeof(Buffer);
1688+
dwDataType = 0x12345;
1689+
tiData = 0x111111;
1690+
dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA2", &dwDataType, Buffer, &dwBufferSize, &tiData);
1691+
ok_hex(dwRet, ERROR_SUCCESS);
1692+
ok_hex(dwDataType, REG_QWORD);
1693+
ok_hex(dwBufferSize, sizeof(QWORD));
1694+
ok(*(QWORD*)Buffer == 4294967295ull, "unexpected value 0x%I64x, expected 4294967295\n", *(QWORD*)Buffer);
1695+
ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got NULL\n");
1696+
ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
1697+
1698+
/* Not case sensitive */
1699+
memset(Buffer, 0xaa, sizeof(Buffer));
1700+
dwBufferSize = sizeof(Buffer);
1701+
dwDataType = 0x12345;
1702+
tiData = 0x111111;
1703+
dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA3", &dwDataType, Buffer, &dwBufferSize, &tiData);
1704+
ok_hex(dwRet, ERROR_SUCCESS);
1705+
ok_hex(dwDataType, REG_SZ);
1706+
ok_hex(dwBufferSize, (int)((wcslen(L"Test string")+1) * sizeof(WCHAR)));
1707+
Buffer[_countof(Buffer)-1] = L'\0';
1708+
ok_wstr(((WCHAR*)Buffer), L"Test string");
1709+
ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got NULL\n");
1710+
ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
1711+
1712+
/* Show that SdbQueryDataEx behaves the same */
1713+
memset(Buffer, 0xaa, sizeof(Buffer));
1714+
dwBufferSize = sizeof(Buffer);
1715+
dwDataType = 0x12345;
1716+
trData = 0x111111;
1717+
dwRet = pSdbQueryDataEx(hsdb, layer, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &trData);
1718+
ok_hex(dwRet, ERROR_SUCCESS);
1719+
ok_hex(dwDataType, REG_DWORD);
1720+
ok_hex(dwBufferSize, sizeof(DWORD));
1721+
ok_hex(*(DWORD*)Buffer, 3333);
1722+
ok(trData != NULL && trData != 0x111111, "Expected trData, got NULL\n");
1723+
1724+
/* And SdbQueryData as well */
1725+
memset(Buffer, 0xaa, sizeof(Buffer));
1726+
dwBufferSize = sizeof(Buffer);
1727+
dwDataType = 0x12345;
1728+
dwRet = pSdbQueryData(hsdb, layer, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize);
1729+
ok_hex(dwRet, ERROR_SUCCESS);
1730+
ok_hex(dwDataType, REG_DWORD);
1731+
ok_hex(dwBufferSize, sizeof(DWORD));
1732+
ok_hex(*(DWORD*)Buffer, 3333);
1733+
1734+
exe = pSdbFindFirstNamedTag(pdb, db, TAG_EXE, TAG_NAME, L"test_match0.exe");
1735+
ok(exe != NULL, "Expected exe to be valid\n");
1736+
if (exe == TAGID_NULL)
1737+
{
1738+
skip("Cannot run tests without exe\n");
1739+
return;
1740+
}
1741+
1742+
memset(Buffer, 0xaa, sizeof(Buffer));
1743+
dwBufferSize = sizeof(Buffer);
1744+
dwDataType = 0x12345;
1745+
tiData = 0x111111;
1746+
dwRet = pSdbQueryDataExTagID(pdb, exe, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &tiData);
1747+
ok_hex(dwRet, ERROR_NOT_FOUND);
1748+
ok_hex(dwDataType, 0x12345);
1749+
ok_hex(dwBufferSize, sizeof(Buffer));
1750+
ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1751+
ok(tiData == 0x111111, "Expected 0x111111, got 0x%x\n", tiData);
1752+
1753+
/* Show that SdbQueryDataEx behaves the same */
1754+
memset(Buffer, 0xaa, sizeof(Buffer));
1755+
dwBufferSize = sizeof(Buffer);
1756+
dwDataType = 0x12345;
1757+
trData = 0x111111;
1758+
dwRet = pSdbQueryDataEx(hsdb, exe, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize, &trData);
1759+
ok_hex(dwRet, ERROR_NOT_FOUND);
1760+
ok_hex(dwDataType, 0x12345);
1761+
ok_hex(dwBufferSize, sizeof(Buffer));
1762+
ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1763+
ok(trData == 0x111111, "Expected 0x111111, got 0x%x\n", trData);
1764+
1765+
/* And SdbQueryData as well */
1766+
memset(Buffer, 0xaa, sizeof(Buffer));
1767+
dwBufferSize = sizeof(Buffer);
1768+
dwDataType = 0x12345;
1769+
dwRet = pSdbQueryData(hsdb, exe, L"TESTDATA1", &dwDataType, Buffer, &dwBufferSize);
1770+
ok_hex(dwRet, ERROR_NOT_FOUND);
1771+
ok_hex(dwDataType, 0x12345);
1772+
ok_hex(dwBufferSize, sizeof(Buffer));
1773+
ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
1774+
}
1775+
1776+
1777+
static void test_Data(void)
1778+
{
1779+
WCHAR workdir[MAX_PATH], dbpath[MAX_PATH];
1780+
BOOL ret;
1781+
HSDB hsdb;
1782+
1783+
ret = GetTempPathW(_countof(workdir), workdir);
1784+
ok(ret, "GetTempPathW error: %d\n", GetLastError());
1785+
lstrcatW(workdir, L"apphelp_test");
1786+
1787+
ret = CreateDirectoryW(workdir, NULL);
1788+
ok(ret, "CreateDirectoryW error: %d\n", GetLastError());
1789+
1790+
/* SdbInitDatabase needs an nt-path */
1791+
swprintf(dbpath, L"\\??\\%s\\test.sdb", workdir);
1792+
1793+
if (extract_resource(dbpath + 4, MAKEINTRESOURCEW(101)))
1794+
{
1795+
hsdb = pSdbInitDatabase(HID_DATABASE_FULLPATH, dbpath);
1796+
1797+
ok(hsdb != NULL, "Expected a valid database handle\n");
1798+
1799+
if (!hsdb)
1800+
{
1801+
skip("SdbInitDatabase not implemented?\n");
1802+
}
1803+
else
1804+
{
1805+
test_DataTags(hsdb);
1806+
pSdbReleaseDatabase(hsdb);
1807+
}
1808+
}
1809+
else
1810+
{
1811+
ok(0, "Unable to extract database\n");
1812+
}
1813+
1814+
DeleteFileW(dbpath + 4);
1815+
1816+
ret = RemoveDirectoryW(workdir);
1817+
ok(ret, "RemoveDirectoryW error: %d\n", GetLastError());
1818+
}
1819+
16001820

16011821
static void expect_indexA_imp(const char* text, LONGLONG expected)
16021822
{
@@ -1774,6 +1994,9 @@ START_TEST(db)
17741994
*(void**)&pSdbTagRefToTagID = (void *)GetProcAddress(hdll, "SdbTagRefToTagID");
17751995
*(void**)&pSdbTagIDToTagRef = (void *)GetProcAddress(hdll, "SdbTagIDToTagRef");
17761996
*(void**)&pSdbMakeIndexKeyFromString = (void *)GetProcAddress(hdll, "SdbMakeIndexKeyFromString");
1997+
*(void**)&pSdbQueryData = (void *)GetProcAddress(hdll, "SdbQueryData");
1998+
*(void**)&pSdbQueryDataEx = (void *)GetProcAddress(hdll, "SdbQueryDataEx");
1999+
*(void**)&pSdbQueryDataExTagID = (void *)GetProcAddress(hdll, "SdbQueryDataExTagID");
17772000
*(void**)&pSdbGetLayerTagRef = (void *)GetProcAddress(hdll, "SdbGetLayerTagRef");
17782001

17792002
test_Sdb();
@@ -1795,6 +2018,7 @@ START_TEST(db)
17952018
break;
17962019
}
17972020
test_TagRef();
2021+
test_Data();
17982022
skip("test_SecondaryDB()\n");
17992023
test_IndexKeyFromString();
18002024
}

modules/rostests/apitests/apphelp/testdb.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@
66
<LIBRARY>
77
</LIBRARY>
88

9+
<LAYER NAME="DATA_LAYER">
10+
<DATA NAME="TESTDATA1" DATA_DWORD="3333" />
11+
<DATA NAME="TESTDATA2">
12+
<DATA_QWORD>0x123456789</DATA_QWORD>
13+
</DATA>
14+
<DATA NAME="TeSTDaTa3" DATA_STRING="Test string" />
15+
<!--<DATA NAME="TESTDATA4" DATA_BITS="90 90 90 90" />-->
16+
</LAYER>
917
<!-- Verify that we are able to match this -->
1018
<EXE>
1119
<NAME>test_match0.exe</NAME>

0 commit comments

Comments
 (0)