Module: wine Branch: master Commit: 34128f1ae71a0a3860f5cc037f028147556559cc URL: https://gitlab.winehq.org/wine/wine/-/commit/34128f1ae71a0a3860f5cc037f02814...
Author: Eric Pouech epouech@codeweavers.com Date: Mon Jan 29 17:17:45 2024 +0100
dbghelp/tests: Test SymSrvGetFileIndexInfo() on .dbg files.
Signed-off-by: Eric Pouech epouech@codeweavers.com
---
dlls/dbghelp/tests/path.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+)
diff --git a/dlls/dbghelp/tests/path.c b/dlls/dbghelp/tests/path.c index 4092fb5b2ab..e1539bad966 100644 --- a/dlls/dbghelp/tests/path.c +++ b/dlls/dbghelp/tests/path.c @@ -671,6 +671,34 @@ static BOOL create_test_pdb_ds(const WCHAR* pdb_name, const GUID* guid, DWORD ag return TRUE; }
+static BOOL create_test_dbg(const WCHAR* dbg_name, WORD machine, DWORD timestamp, DWORD size) +{ + HANDLE hfile; + + /* minimalistic .dbg made of a header and a DEBUG_DIRECTORY without any data */ + const IMAGE_SEPARATE_DEBUG_HEADER header = {.Signature = 0x4944 /* DI */, + .Flags = 0, .Machine = machine, .Characteristics = 0x010E, .TimeDateStamp = timestamp, + .CheckSum = 0, .ImageBase = 0x00040000, .SizeOfImage = size, .NumberOfSections = 0, + .ExportedNamesSize = 0, .DebugDirectorySize = sizeof(IMAGE_DEBUG_DIRECTORY)}; + const IMAGE_DEBUG_DIRECTORY debug_dir = {.Characteristics = 0, .TimeDateStamp = timestamp + 1, + .MajorVersion = 0, .MinorVersion = 0, .Type = IMAGE_DEBUG_TYPE_CODEVIEW, + .SizeOfData = 0, .AddressOfRawData = 0, + .PointerToRawData = sizeof(header) + header.NumberOfSections * sizeof(IMAGE_SECTION_HEADER) + + header.DebugDirectorySize}; + + hfile = CreateFileW(dbg_name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, 0); + ok(hfile != INVALID_HANDLE_VALUE, "failed to create %ls err %lu\n", dbg_name, GetLastError()); + if (hfile == INVALID_HANDLE_VALUE) return FALSE; + + check_write_file(hfile, &header, sizeof(header)); + /* FIXME: 0 sections... as header.NumberOfSections */ + check_write_file(hfile, &debug_dir, sizeof(debug_dir)); + ok(SetFilePointer(hfile, 0, NULL, FILE_CURRENT) == debug_dir.PointerToRawData, "mismatch\n"); + + CloseHandle(hfile); + return TRUE; +} + /* ============================================== * the tests * ============================================== @@ -848,6 +876,58 @@ static void test_srvgetindexes_pdb(void) } }
+static void test_srvgetindexes_dbg(void) +{ + unsigned int i; + WCHAR filename[128]; + SYMSRV_INDEX_INFOW ssii; + BOOL ret; + + static struct + { + /* input parameters */ + WORD machine; + DWORD timestamp; + DWORD imagesize; + } + indexes[] = + { + {IMAGE_FILE_MACHINE_I386, 0x1234, 0x00560000}, + {IMAGE_FILE_MACHINE_AMD64, 0x1235, 0x00570000}, + }; + for (i = 0; i < ARRAY_SIZE(indexes); i++) + { + winetest_push_context("dbg#%02u", i); + + /* create dll */ + swprintf(filename, ARRAY_SIZE(filename), L"winetest%02u.dbg", i); + ret = create_test_dbg(filename, indexes[i].machine, indexes[i].timestamp, indexes[i].imagesize); + ok(ret, "Couldn't create dbg file %ls\n", filename); + + memset(&ssii, 0x45, sizeof(ssii)); + ssii.sizeofstruct = sizeof(ssii); + ret = SymSrvGetFileIndexInfoW(filename, &ssii, 0); + todo_wine + ok(ret, "SymSrvGetFileIndexInfo failed: %lu\n", GetLastError()); + + if (ret){ + ok(ssii.age == 0, "Mismatch in age: %lx\n", ssii.age); + ok(!memcmp(&ssii.guid, &null_guid, sizeof(GUID)), + "Mismatch in guid: guid=%s\n", wine_dbgstr_guid(&ssii.guid)); + + ok(ssii.sig == 0, "Mismatch in sig: %lx\n", ssii.sig); + ok(ssii.size == indexes[i].imagesize, "Mismatch in size: %lx\n", ssii.size); + ok(!ssii.stripped, "Mismatch in stripped: %x\n", ssii.stripped); + ok(ssii.timestamp == indexes[i].timestamp, "Mismatch in timestamp: %lx\n", ssii.timestamp); + ok(!wcscmp(ssii.file, filename), "Mismatch in file: %ls\n", ssii.file); + ok(!ssii.pdbfile[0], "Mismatch in pdbfile: %ls\n", ssii.pdbfile); + ok(!ssii.dbgfile[0], "Mismatch in dbgfile: %ls\n", ssii.dbgfile); + } + DeleteFileW(filename); + winetest_pop_context(); + } +} + START_TEST(path) { /* cleanup env variables that affect dbghelp's behavior */ @@ -856,4 +936,5 @@ START_TEST(path)
test_srvgetindexes_pe(); test_srvgetindexes_pdb(); + test_srvgetindexes_dbg(); }