https://git.reactos.org/?p=reactos.git;a=commitdiff;h=74bb9d5dc077eda9bb0c9…
commit 74bb9d5dc077eda9bb0c99858dcdb98beab38c91
Author: Mark Jansen <mark.jansen(a)reactos.org>
AuthorDate: Tue Apr 10 22:40:27 2018 +0200
Commit: Mark Jansen <mark.jansen(a)reactos.org>
CommitDate: Thu Apr 12 18:49:25 2018 +0200
[APPHELP_APITEST] Add tests for Data tags
---
modules/rostests/apitests/apphelp/db.cpp | 228 ++++++++++++++++++++++++++-
modules/rostests/apitests/apphelp/testdb.xml | 8 +
2 files changed, 234 insertions(+), 2 deletions(-)
diff --git a/modules/rostests/apitests/apphelp/db.cpp
b/modules/rostests/apitests/apphelp/db.cpp
index 3d6480a6f1..1ea13f1660 100644
--- a/modules/rostests/apitests/apphelp/db.cpp
+++ b/modules/rostests/apitests/apphelp/db.cpp
@@ -88,6 +88,7 @@
#define TAG_LAYER (0xB | TAG_TYPE_LIST)
#define TAG_APPHELP (0xD | TAG_TYPE_LIST)
#define TAG_LINK (0xE | TAG_TYPE_LIST)
+#define TAG_DATA (0xF | TAG_TYPE_LIST)
#define TAG_STRINGTABLE (0x801 | TAG_TYPE_LIST)
#define TAG_STRINGTABLE_ITEM (0x801 | TAG_TYPE_STRING)
@@ -139,7 +140,7 @@ static TAGID (WINAPI *pSdbBeginWriteListTag)(PDB, TAG);
static BOOL (WINAPI *pSdbEndWriteListTag)(PDB, TAGID);
static TAGID (WINAPI *pSdbFindFirstTag)(PDB, TAGID, TAG);
static TAGID (WINAPI *pSdbFindNextTag)(PDB, TAGID, TAGID);
-static TAGID (WINAPI *pSdbFindFirstNamedTag)(PDB, TAGID, TAGID, TAGID, LPCWSTR);
+static TAGID (WINAPI *pSdbFindFirstNamedTag)(PDB pdb, TAGID root, TAGID find, TAGID
nametag, LPCWSTR find_name);
static WORD (WINAPI *pSdbReadWORDTag)(PDB, TAGID, WORD);
static DWORD (WINAPI *pSdbReadDWORDTag)(PDB, TAGID, DWORD);
static QWORD (WINAPI *pSdbReadQWORDTag)(PDB, TAGID, QWORD);
@@ -159,7 +160,9 @@ static BOOL (WINAPI *pSdbTagRefToTagID)(HSDB hSDB, TAGREF trWhich, PDB
*ppdb, TA
static BOOL (WINAPI *pSdbTagIDToTagRef)(HSDB hSDB, PDB pdb, TAGID tiWhich, TAGREF
*ptrWhich);
static TAGREF (WINAPI *pSdbGetLayerTagRef)(HSDB hsdb, LPCWSTR layerName);
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);
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);
@@ -1597,6 +1600,223 @@ static void test_TagRef(void)
}
+static void test_DataTags(HSDB hsdb)
+{
+ PDB pdb = NULL;
+ TAGID db = TAGID_NULL, layer, exe;
+ TAGREF trData;
+ BYTE Buffer[1024];
+ DWORD dwBufferSize, dwDataType, dwRet;
+ TAGID tiData;
+
+ BOOL ret = pSdbTagRefToTagID(hsdb, TAGID_ROOT, &pdb, NULL);
+
+ ok(ret != FALSE, "Expected ret to be TRUE, was: %d\n", ret);
+ ok(pdb != NULL, "Expected pdb to be valid\n");
+
+ if (pdb == NULL)
+ {
+ skip("Cannot run tests without pdb\n");
+ return;
+ }
+
+ db = pSdbFindFirstTag(pdb, TAGID_ROOT, TAG_DATABASE);
+ ok(db != NULL, "Expected db to be valid\n");
+ if (db == TAGID_NULL)
+ {
+ skip("Cannot run tests without db\n");
+ return;
+ }
+
+ layer = pSdbFindFirstNamedTag(pdb, db, TAG_LAYER, TAG_NAME,
L"DATA_LAYER");
+ ok(layer != NULL, "Expected layer to be valid\n");
+ if (layer == TAGID_NULL)
+ {
+ skip("Cannot run tests without layer\n");
+ return;
+ }
+
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwDataType = 0x12345;
+ tiData = 0x111111;
+ dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", &dwDataType,
Buffer, &dwBufferSize, &tiData);
+ ok_hex(dwRet, ERROR_SUCCESS);
+ ok_hex(dwDataType, REG_DWORD);
+ ok_hex(dwBufferSize, sizeof(DWORD));
+ ok_hex(*(DWORD*)Buffer, 3333);
+ ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got
NULL\n");
+ ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
+
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer,
&dwBufferSize, NULL);
+ ok_hex(dwRet, ERROR_SUCCESS);
+ ok_hex(dwBufferSize, sizeof(DWORD));
+ ok_hex(*(DWORD*)Buffer, 3333);
+
+ /* This succeeds on 2k3.. */
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer, NULL,
NULL);
+ ok_hex(dwRet, ERROR_INSUFFICIENT_BUFFER);
+ ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
+
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = 1;
+ dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, Buffer,
&dwBufferSize, NULL);
+ ok_hex(dwRet, ERROR_INSUFFICIENT_BUFFER);
+ ok_hex(dwBufferSize, sizeof(DWORD));
+ ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
+
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA1", NULL, NULL,
&dwBufferSize, NULL);
+ ok_hex(dwRet, ERROR_INSUFFICIENT_BUFFER);
+ ok_hex(dwBufferSize, sizeof(DWORD));
+ ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
+
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwRet = pSdbQueryDataExTagID(pdb, TAGID_NULL, L"TESTDATA1", NULL, Buffer,
&dwBufferSize, NULL);
+ ok_hex(dwRet, ERROR_NOT_FOUND);
+ ok_hex(dwBufferSize, sizeof(Buffer));
+ ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
+
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwDataType = 0x12345;
+ tiData = 0x111111;
+ dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA2", &dwDataType,
Buffer, &dwBufferSize, &tiData);
+ ok_hex(dwRet, ERROR_SUCCESS);
+ ok_hex(dwDataType, REG_QWORD);
+ ok_hex(dwBufferSize, sizeof(QWORD));
+ ok(*(QWORD*)Buffer == 4294967295ull, "unexpected value 0x%I64x, expected
4294967295\n", *(QWORD*)Buffer);
+ ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got
NULL\n");
+ ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
+
+ /* Not case sensitive */
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwDataType = 0x12345;
+ tiData = 0x111111;
+ dwRet = pSdbQueryDataExTagID(pdb, layer, L"TESTDATA3", &dwDataType,
Buffer, &dwBufferSize, &tiData);
+ ok_hex(dwRet, ERROR_SUCCESS);
+ ok_hex(dwDataType, REG_SZ);
+ ok_hex(dwBufferSize, (int)((wcslen(L"Test string")+1) * sizeof(WCHAR)));
+ Buffer[_countof(Buffer)-1] = L'\0';
+ ok_wstr(((WCHAR*)Buffer), L"Test string");
+ ok(tiData != NULL && tiData != 0x111111, "Expected tiData, got
NULL\n");
+ ok_hex(pSdbGetTagFromTagID(pdb, tiData), TAG_DATA);
+
+ /* Show that SdbQueryDataEx behaves the same */
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwDataType = 0x12345;
+ trData = 0x111111;
+ dwRet = pSdbQueryDataEx(hsdb, layer, L"TESTDATA1", &dwDataType, Buffer,
&dwBufferSize, &trData);
+ ok_hex(dwRet, ERROR_SUCCESS);
+ ok_hex(dwDataType, REG_DWORD);
+ ok_hex(dwBufferSize, sizeof(DWORD));
+ ok_hex(*(DWORD*)Buffer, 3333);
+ ok(trData != NULL && trData != 0x111111, "Expected trData, got
NULL\n");
+
+ /* And SdbQueryData as well */
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwDataType = 0x12345;
+ dwRet = pSdbQueryData(hsdb, layer, L"TESTDATA1", &dwDataType, Buffer,
&dwBufferSize);
+ ok_hex(dwRet, ERROR_SUCCESS);
+ ok_hex(dwDataType, REG_DWORD);
+ ok_hex(dwBufferSize, sizeof(DWORD));
+ ok_hex(*(DWORD*)Buffer, 3333);
+
+ exe = pSdbFindFirstNamedTag(pdb, db, TAG_EXE, TAG_NAME,
L"test_match0.exe");
+ ok(exe != NULL, "Expected exe to be valid\n");
+ if (exe == TAGID_NULL)
+ {
+ skip("Cannot run tests without exe\n");
+ return;
+ }
+
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwDataType = 0x12345;
+ tiData = 0x111111;
+ dwRet = pSdbQueryDataExTagID(pdb, exe, L"TESTDATA1", &dwDataType,
Buffer, &dwBufferSize, &tiData);
+ ok_hex(dwRet, ERROR_NOT_FOUND);
+ ok_hex(dwDataType, 0x12345);
+ ok_hex(dwBufferSize, sizeof(Buffer));
+ ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
+ ok(tiData == 0x111111, "Expected 0x111111, got 0x%x\n", tiData);
+
+ /* Show that SdbQueryDataEx behaves the same */
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwDataType = 0x12345;
+ trData = 0x111111;
+ dwRet = pSdbQueryDataEx(hsdb, exe, L"TESTDATA1", &dwDataType, Buffer,
&dwBufferSize, &trData);
+ ok_hex(dwRet, ERROR_NOT_FOUND);
+ ok_hex(dwDataType, 0x12345);
+ ok_hex(dwBufferSize, sizeof(Buffer));
+ ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
+ ok(trData == 0x111111, "Expected 0x111111, got 0x%x\n", trData);
+
+ /* And SdbQueryData as well */
+ memset(Buffer, 0xaa, sizeof(Buffer));
+ dwBufferSize = sizeof(Buffer);
+ dwDataType = 0x12345;
+ dwRet = pSdbQueryData(hsdb, exe, L"TESTDATA1", &dwDataType, Buffer,
&dwBufferSize);
+ ok_hex(dwRet, ERROR_NOT_FOUND);
+ ok_hex(dwDataType, 0x12345);
+ ok_hex(dwBufferSize, sizeof(Buffer));
+ ok_hex(*(DWORD*)Buffer, (int)0xaaaaaaaa);
+}
+
+
+static void test_Data(void)
+{
+ WCHAR workdir[MAX_PATH], dbpath[MAX_PATH];
+ BOOL ret;
+ HSDB hsdb;
+
+ ret = GetTempPathW(_countof(workdir), workdir);
+ ok(ret, "GetTempPathW error: %d\n", GetLastError());
+ lstrcatW(workdir, L"apphelp_test");
+
+ ret = CreateDirectoryW(workdir, NULL);
+ ok(ret, "CreateDirectoryW error: %d\n", GetLastError());
+
+ /* SdbInitDatabase needs an nt-path */
+ swprintf(dbpath, L"\\??\\%s\\test.sdb", workdir);
+
+ if (extract_resource(dbpath + 4, MAKEINTRESOURCEW(101)))
+ {
+ hsdb = pSdbInitDatabase(HID_DATABASE_FULLPATH, dbpath);
+
+ ok(hsdb != NULL, "Expected a valid database handle\n");
+
+ if (!hsdb)
+ {
+ skip("SdbInitDatabase not implemented?\n");
+ }
+ else
+ {
+ test_DataTags(hsdb);
+ pSdbReleaseDatabase(hsdb);
+ }
+ }
+ else
+ {
+ ok(0, "Unable to extract database\n");
+ }
+
+ DeleteFileW(dbpath + 4);
+
+ ret = RemoveDirectoryW(workdir);
+ ok(ret, "RemoveDirectoryW error: %d\n", GetLastError());
+}
+
static void expect_indexA_imp(const char* text, LONGLONG expected)
{
@@ -1774,6 +1994,9 @@ START_TEST(db)
*(void**)&pSdbTagRefToTagID = (void *)GetProcAddress(hdll,
"SdbTagRefToTagID");
*(void**)&pSdbTagIDToTagRef = (void *)GetProcAddress(hdll,
"SdbTagIDToTagRef");
*(void**)&pSdbMakeIndexKeyFromString = (void *)GetProcAddress(hdll,
"SdbMakeIndexKeyFromString");
+ *(void**)&pSdbQueryData = (void *)GetProcAddress(hdll,
"SdbQueryData");
+ *(void**)&pSdbQueryDataEx = (void *)GetProcAddress(hdll,
"SdbQueryDataEx");
+ *(void**)&pSdbQueryDataExTagID = (void *)GetProcAddress(hdll,
"SdbQueryDataExTagID");
*(void**)&pSdbGetLayerTagRef = (void *)GetProcAddress(hdll,
"SdbGetLayerTagRef");
test_Sdb();
@@ -1795,6 +2018,7 @@ START_TEST(db)
break;
}
test_TagRef();
+ test_Data();
skip("test_SecondaryDB()\n");
test_IndexKeyFromString();
}
diff --git a/modules/rostests/apitests/apphelp/testdb.xml
b/modules/rostests/apitests/apphelp/testdb.xml
index 5c6a4459d4..80563df3cc 100644
--- a/modules/rostests/apitests/apphelp/testdb.xml
+++ b/modules/rostests/apitests/apphelp/testdb.xml
@@ -6,6 +6,14 @@
<LIBRARY>
</LIBRARY>
+ <LAYER NAME="DATA_LAYER">
+ <DATA NAME="TESTDATA1" DATA_DWORD="3333" />
+ <DATA NAME="TESTDATA2">
+ <DATA_QWORD>0x123456789</DATA_QWORD>
+ </DATA>
+ <DATA NAME="TeSTDaTa3" DATA_STRING="Test string"
/>
+ <!--<DATA NAME="TESTDATA4" DATA_BITS="90 90 90 90"
/>-->
+ </LAYER>
<!-- Verify that we are able to match this -->
<EXE>
<NAME>test_match0.exe</NAME>