88
88
#define TAG_LAYER (0xB | TAG_TYPE_LIST)
89
89
#define TAG_APPHELP (0xD | TAG_TYPE_LIST)
90
90
#define TAG_LINK (0xE | TAG_TYPE_LIST)
91
+ #define TAG_DATA (0xF | TAG_TYPE_LIST)
91
92
#define TAG_STRINGTABLE (0x801 | TAG_TYPE_LIST)
92
93
93
94
#define TAG_STRINGTABLE_ITEM (0x801 | TAG_TYPE_STRING)
@@ -139,7 +140,7 @@ static TAGID (WINAPI *pSdbBeginWriteListTag)(PDB, TAG);
139
140
static BOOL (WINAPI *pSdbEndWriteListTag)(PDB, TAGID);
140
141
static TAGID (WINAPI *pSdbFindFirstTag)(PDB, TAGID, TAG);
141
142
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 );
143
144
static WORD (WINAPI *pSdbReadWORDTag)(PDB, TAGID, WORD);
144
145
static DWORD (WINAPI *pSdbReadDWORDTag)(PDB, TAGID, DWORD);
145
146
static QWORD (WINAPI *pSdbReadQWORDTag)(PDB, TAGID, QWORD);
@@ -159,7 +160,9 @@ static BOOL (WINAPI *pSdbTagRefToTagID)(HSDB hSDB, TAGREF trWhich, PDB *ppdb, TA
159
160
static BOOL (WINAPI *pSdbTagIDToTagRef)(HSDB hSDB, PDB pdb, TAGID tiWhich, TAGREF *ptrWhich);
160
161
static TAGREF (WINAPI *pSdbGetLayerTagRef)(HSDB hsdb, LPCWSTR layerName);
161
162
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);
163
166
164
167
DEFINE_GUID (GUID_DATABASE_TEST, 0xe39b0eb0 , 0x55db , 0x450b , 0x9b , 0xd4 , 0xd2 , 0x0c , 0x94 , 0x84 , 0x26 , 0x0f );
165
168
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)
1597
1600
}
1598
1601
1599
1602
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
+
1600
1820
1601
1821
static void expect_indexA_imp (const char * text, LONGLONG expected)
1602
1822
{
@@ -1774,6 +1994,9 @@ START_TEST(db)
1774
1994
*(void **)&pSdbTagRefToTagID = (void *)GetProcAddress (hdll, " SdbTagRefToTagID" );
1775
1995
*(void **)&pSdbTagIDToTagRef = (void *)GetProcAddress (hdll, " SdbTagIDToTagRef" );
1776
1996
*(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" );
1777
2000
*(void **)&pSdbGetLayerTagRef = (void *)GetProcAddress (hdll, " SdbGetLayerTagRef" );
1778
2001
1779
2002
test_Sdb ();
@@ -1795,6 +2018,7 @@ START_TEST(db)
1795
2018
break ;
1796
2019
}
1797
2020
test_TagRef ();
2021
+ test_Data ();
1798
2022
skip (" test_SecondaryDB()\n " );
1799
2023
test_IndexKeyFromString ();
1800
2024
}
0 commit comments