void ExportDirectory(const Volume& volume, const Partition& partition, const FileInfo& directory, bool recursive, const std::string& filesystem_path, const std::string& export_folder, const std::function<bool(const std::string& path)>& update_progress) { File::CreateFullPath(export_folder + '/'); for (const FileInfo& file_info : directory) { const std::string name = file_info.GetName() + (file_info.IsDirectory() ? "/" : ""); const std::string path = filesystem_path + name; const std::string export_path = export_folder + '/' + name; if (update_progress(path)) return; DEBUG_LOG(DISCIO, "%s", export_path.c_str()); if (!file_info.IsDirectory()) { if (File::Exists(export_path)) NOTICE_LOG(DISCIO, "%s already exists", export_path.c_str()); else if (!ExportFile(volume, partition, &file_info, export_path)) ERROR_LOG(DISCIO, "Could not export %s", export_path.c_str()); } else if (recursive) { ExportDirectory(volume, partition, file_info, recursive, path, export_path, update_progress); } } }
void CR_Module::DumpExportSymbols() { PIMAGE_EXPORT_DIRECTORY pDir = ExportDirectory(); if (pDir == NULL) return; //DWORD dwNumberOfNames = pDir->NumberOfNames; //DWORD dwAddressOfFunctions = pDir->AddressOfFunctions; //DWORD dwAddressOfNames = pDir->AddressOfNames; //DWORD dwAddressOfOrdinals = pDir->AddressOfNameOrdinals; //LPDWORD pEAT = (LPDWORD)GetData(dwAddressOfFunctions); //LPDWORD pENPT = (LPDWORD)GetData(dwAddressOfNames); //LPWORD pOT = (LPWORD)GetData(dwAddressOfOrdinals); printf("\n### EXPORTS ###\n"); printf(" Characteristics: 0x%08lX\n", pDir->Characteristics); printf(" TimeDateStamp: 0x%08lX (%s)\n", pDir->TimeDateStamp, CrGetTimeStampString(pDir->TimeDateStamp)); printf(" Version: %u.%u\n", pDir->MajorVersion, pDir->MinorVersion); printf(" Name: 0x%08lX (%s)\n", pDir->Name, reinterpret_cast<char *>(GetData(pDir->Name))); printf(" Base: 0x%08lX (%lu)\n", pDir->Base, pDir->Base); printf(" NumberOfFunctions: 0x%08lX (%lu)\n", pDir->NumberOfFunctions, pDir->NumberOfFunctions); printf(" NumberOfNames: 0x%08lX (%lu)\n", pDir->NumberOfNames, pDir->NumberOfNames); printf(" AddressOfFunctions: 0x%08lX\n", pDir->AddressOfFunctions); printf(" AddressOfNames: 0x%08lX\n", pDir->AddressOfNames); printf(" AddressOfNameOrdinals: 0x%08lX\n", pDir->AddressOfNameOrdinals); printf(" \n"); printf(" %-50s %-5s ; %-8s %-8s\n", "FUNCTION NAME", "ORDI.", "RVA", "VA"); for (DWORD i = 0; i < ExportSymbols().size(); ++i) { CR_ExportSymbol& symbol = ExportSymbols()[i]; if (symbol.dwRVA) { if (Is64Bit()) { CR_Addr64 va = VA64FromRVA(symbol.dwRVA); if (symbol.pszName) printf(" %-50s @%-4lu ; %08lX %08lX%08lX\n", symbol.pszName, symbol.dwOrdinal, symbol.dwRVA, HILONG(va), LOLONG(va)); else printf(" %-50s @%-4lu ; %08lX %08lX%08lX\n", "(No Name)", symbol.dwOrdinal, symbol.dwRVA, HILONG(va), LOLONG(va)); } else if (Is32Bit()) { CR_Addr32 va = VA32FromRVA(symbol.dwRVA); if (symbol.pszName) printf(" %-50s @%-4lu ; %08lX %08lX\n", symbol.pszName, symbol.dwOrdinal, symbol.dwRVA, va); else printf(" %-50s @%-4lu ; %08lX %08lX\n", "(No Name)", symbol.dwOrdinal, symbol.dwRVA, va); } } else { if (symbol.pszName) printf(" %-50s @%-4lu ; (forwarded to %s)\n", "(No Name)", symbol.dwOrdinal, symbol.pszForwarded); else printf(" %-50s @%-4lu ; (forwarded to %s)\n", "(No Name)", symbol.dwOrdinal, symbol.pszForwarded); } } printf("\n\n"); }