|
|
获取程序图标组中第一个图标的ID
定位 RT_GROUP_ICON(类型ID=14)的资源目录,跳过无关资源类型。
简化偏移计算,利用PE文件的 IMAGE_DATA_DIRECTORY 直接定位资源节。
求翻译PECMD怎样写
- #include <windows.h>
- #include <stdio.h>
- DWORD GetFirstIconGroupID(LPCWSTR exePath) {
- HANDLE hFile = CreateFileW(exePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
- if (hFile == INVALID_HANDLE_VALUE) return 0;
- DWORD fileSize = GetFileSize(hFile, NULL);
- HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, fileSize, NULL);
- LPVOID pBase = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
- if (!pBase) { CloseHandle(hMap); CloseHandle(hFile); return 0; }
- PIMAGE_DOS_HEADER dos = (PIMAGE_DOS_HEADER)pBase;
- PIMAGE_NT_HEADERS nt = (PIMAGE_NT_HEADERS)((BYTE*)pBase + dos->e_lfanew);
- if (nt->Signature != IMAGE_NT_SIGNATURE) { UnmapViewOfFile(pBase); CloseHandle(hMap); CloseHandle(hFile); return 0; }
- // 定位资源目录
- auto& resDir = nt->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
- if (resDir.VirtualAddress == 0) { UnmapViewOfFile(pBase); CloseHandle(hMap); CloseHandle(hFile); return 0; }
- // 定位资源节(.rsrc)
- PIMAGE_SECTION_HEADER section = IMAGE_FIRST_SECTION(nt);
- for (int i = 0; i < nt->FileHeader.NumberOfSections; i++, section++) {
- if (resDir.VirtualAddress >= section->VirtualAddress &&
- resDir.VirtualAddress < section->VirtualAddress + section->Misc.VirtualSize) break;
- }
- // 计算资源目录在文件中的实际偏移
- DWORD resOffset = resDir.VirtualAddress - section->VirtualAddress + section->PointerToRawData;
- PIMAGE_RESOURCE_DIRECTORY rootDir = (PIMAGE_RESOURCE_DIRECTORY)((BYTE*)pBase + resOffset);
- // 遍历资源类型,找到 RT_GROUP_ICON(ID=14)
- PIMAGE_RESOURCE_DIRECTORY_ENTRY typeEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(rootDir + 1);
- for (DWORD i = 0; i < rootDir->NumberOfIdEntries; i++, typeEntry++) {
- if (typeEntry->Id == 14) { // RT_GROUP_ICON = 14
- // 获取第一个图标ID(进入ID目录的第一个条目)
- PIMAGE_RESOURCE_DIRECTORY iconDir = (PIMAGE_RESOURCE_DIRECTORY)((BYTE*)rootDir + typeEntry->OffsetToDirectory);
- PIMAGE_RESOURCE_DIRECTORY_ENTRY iconIdEntry = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(iconDir + 1);
- DWORD firstIconId = iconIdEntry->Id;
- UnmapViewOfFile(pBase);
- CloseHandle(hMap);
- CloseHandle(hFile);
- return firstIconId;
- }
- }
- UnmapViewOfFile(pBase);
- CloseHandle(hMap);
- CloseHandle(hFile);
- return 0;
- }
- // 调用示例:获取 Photoshop.exe 的第一个图标ID
- int main() {
- LPCWSTR exePath = L"D:\\软件\\Photoshop\\Photoshop.exe";
- DWORD iconId = GetFirstIconGroupID(exePath);
- printf("第一个图标ID: %u\n", iconId); // 输出:1000 或 1 等
- return 0;
- }
复制代码 |
|