我試圖通過它們的絕對路徑(在別處確定,以編程方式)打開幾個不同的文件,所以我可以得到它們的SHA1哈希*,其中一些是核心Windows文件。 fopen()函數是在一些返回NULL(但不是全部)的文件,當我試圖打開它們如下(通常文件名是通過QueryFullProcessImageName得到,但我硬編碼以防萬一):在Windows核心文件上調用fopen返回NULL指針
char * filename = "c:\\windows\\system32\\spoolsv.exe";
FILE * currFileRead = fopen(filename, "rb");
if (currFileRead == NULL)
{
printf("Failed to open %s, error %s\n", filename, strerror(errno));
}
else
{
//hashing code
}
報告的錯誤是2:「沒有這樣的文件或目錄」,但顯然他們在那裏。它也只是失敗的一些進程,如spoolsv.exe或winlogon.exe,而svchost.exe和wininint.exe似乎打開很好。
我的程序具有管理權限,我無法弄清楚爲什麼某些進程會失敗,而其他進程卻無故打開?
*我正在使用來自LibTomCrypt(http://libtom.org/?page=features)的方法,該方法是具有許可許可的開源代碼。對sha1_process的調用需要一個hash_state(庫內部),一個unsigned char緩衝區以及緩衝區的長度。我需要用fopen讀取文件以將文件存入內存進行散列。
想看看GetLastError()說什麼。你可以使用GetLastError()和FormatMessage()(或手動查找)嗎? – 2013-02-20 21:58:17
在64位操作系統上將其更改爲sysnative而不是system32。或者建立一個64位的程序,這樣文件重定向不會成爲字節。 Fwiw在計算可能由Windows Update更新的文件上的哈希值可能不明智。 – 2013-02-20 22:05:17
RonBurk GetLastError也報告2,它(每個MSDN)是ERROR_FILE_NOT_FOUND - 即同樣的問題。 HansPassant - 我的程序需要在32位和64位主機上運行。所以我不能只製作一個64位版本。你是什麼意思將它改爲系統性的? – user2093082 2013-02-20 22:10:29