2

我正在尝试通过它们的绝对路径(在其他地方以编程方式确定)打开几个不同的文件,这样我就可以获得它们的 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 读取文件以将文件放入内存中进行散列。

4

2 回答 2

3

因为您的程序是一个 32 位进程,所以当您尝试打开时,c:\windows\system32您实际上会得到c:\windows\syswow64其中不包含所有相同文件的文件。

您可以使用IsWow64Process来确定您是否在 64 位系统上运行。如果是,则可以在路径中替换system32sysnative打开实际文件,除非您需要支持 Windows 2003 或 Windows XP。根据您的情况,您可能需要处理 Windows 文件夹不c:\windows存在的可能性和/或存在其他名为system32.

总的来说,拥有单独的 32 位和 64 位版本的应用程序会更加健壮,或者可能只是出现问题的特定部分。如果您不能让用户安装适当的版本,安装程序可以决定安装哪个,或者您可以始终安装两者并让 32 位版本在 64 上运行时自动启动 64 位版本位系统。

于 2013-02-21T01:33:00.337 回答
0

拥有管理权限并不总是足够的,因为如果您要打开的文件正在使用中并且正在使用它的程序已锁定它,那么您将无法打开和读取该文件。

于 2013-02-20T22:00:54.917 回答