【发布时间】:2013-02-20 21:42:34
【问题描述】:
我试图通过它们的绝对路径(在其他地方以编程方式确定)打开几个不同的文件,这样我就可以获得它们的 SHA1 哈希*,其中一些是核心 Windows 文件。当我尝试按如下方式打开文件时,fopen() 在某些(但不是全部)文件上返回 NULL(通常文件名是通过 QueryFullProcessImageName 获取的,但我对其进行了硬编码以防万一):
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(库内部)、一个无符号字符缓冲区和缓冲区的长度。我需要使用 fopen 读取文件以将文件放入内存进行哈希处理。
【问题讨论】:
-
想看看 GetLastError() 怎么说。您可以使用 GetLastError() 和 FormatMessage() (或手动查找)吗?
-
在 64 位操作系统上将其更改为 sysnative 而不是 system32。或者构建一个 64 位程序,以便文件重定向不字节。 Fwiw,对可能由 Windows Update 更新的文件计算哈希可能是不明智的。
-
RonBurk GetLastError 也报告 2,(根据 MSDN)是 ERROR_FILE_NOT_FOUND - 即同样的问题。 HansPassant - 我的程序需要在 32 位和 64 位主机上运行。所以我不能只制作 64 位版本。将其更改为 sysnative 是什么意思?
-
你被文件系统重定向器发现了。谷歌一下。