[英]reading an application's manifest file?
有沒有一種簡單的方法來讀取應用程序已經嵌入的清單文件?
我在考慮替代數據 stream?
Windows 清單文件是 Win32 資源。 換句話說,它們嵌入在 EXE 或 DLL 的末尾。 您可以使用 LoadLibraryEx、FindResource、LoadResource 和 LockResource 來加載嵌入的資源。
這是一個簡單的例子,它提取自己的清單......
BOOL CALLBACK EnumResourceNameCallback(HMODULE hModule, LPCTSTR lpType,
LPWSTR lpName, LONG_PTR lParam)
{
HRSRC hResInfo = FindResource(hModule, lpName, lpType);
DWORD cbResource = SizeofResource(hModule, hResInfo);
HGLOBAL hResData = LoadResource(hModule, hResInfo);
const BYTE *pResource = (const BYTE *)LockResource(hResData);
TCHAR filename[MAX_PATH];
if (IS_INTRESOURCE(lpName))
_stprintf_s(filename, _T("#%d.manifest"), lpName);
else
_stprintf_s(filename, _T("%s.manifest"), lpName);
FILE *f = _tfopen(filename, _T("wb"));
fwrite(pResource, cbResource, 1, f);
fclose(f);
UnlockResource(hResData);
FreeResource(hResData);
return TRUE; // Keep going
}
int _tmain(int argc, _TCHAR* argv[])
{
const TCHAR *pszFileName = argv[0];
HMODULE hModule = LoadLibraryEx(pszFileName, NULL, LOAD_LIBRARY_AS_DATAFILE);
EnumResourceNames(hModule, RT_MANIFEST, EnumResourceNameCallback, NULL);
FreeLibrary(hModule);
return 0;
}
或者,您可以使用 Windows SDK 中的 MT.EXE:
>mt -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest
您可以使用命令行清單工具mt.exe
提取/替換/合並/驗證清單,該工具是 Windows SDK 的一部分:
C:\Program Files\Microsoft SDKs\Windows\v6.1>mt /?
Microsoft (R) Manifest Tool version 5.2.3790.2075
...
> To extract manifest out of a dll:
mt.exe -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest
不同地點:
在記事本中打開文件。 事情是純文本的。
有可用的清單查看器工具在這里-我不知道,如果作者將提供源代碼。
Resource Tuner 如果支持 x64 代碼會很好,但截至今天,它仍然僅適用於 32 位應用程序。 Resource Hacker(最新的公開測試版)確實支持 x86 和 x64,可以從這里獲得: http : //angusj.com/resourcehacker/
在已編譯的應用程序中查看/編輯清單的最簡單方法是使用 Resource Tuner: http : //www.restuner.com/tour-manifest.htm
在某些情況下,它比 MS 的 mt.exe 更強大,並且它是一個可視化工具。
從 Roger 的代碼開始,這是我使用的代碼。 它假設 Manifest 位於 id #1。 我猜這是 .exe 的默認設置。 請參閱 Wedge 的評論,如果您正在使用 DLL,您可能還需要檢查 id #2。
HMODULE module = ::LoadLibraryEx(pathname, NULL, LOAD_LIBRARY_AS_DATAFILE);
if (module == NULL)
return false;
HRSRC resInfo = ::FindResource(module, MAKEINTRESOURCE(1), RT_MANIFEST); // resource id #1 should be the manifest
if (resInfo) {
HGLOBAL resData = ::LoadResource(module, resInfo);
DWORD resSize = ::SizeofResource(module, resInfo);
if (resData && resSize) {
const char *res = (const char *)::LockResource(resData); // the manifest
if (res) {
// got the manifest
}
::UnlockResource(resData);
}
::FreeResource(resData);
}
::FreeLibrary(module);
通過從項目中刪除開發人員許可證 ( *_TemporaryKey.pfx
) 或更改 .pfx 的名稱來解決此問題。
附帶提醒:請記住,清單也可以是與應用程序同名的獨立文件(以“.manifest”為擴展名)。
因此,如果您想查看運行時真正使用了哪個清單,則必須考慮到這一點。
Sysinterals "sigcheck -m" 轉儲 exe 的清單。 (您可以從 live.sysinternals.com 獲取)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.