在Windows核心文件上调用fopen会返回NULL指针

时间:2013-02-20 21:42:35

标签: c windows fopen

我试图通过他们的绝对路径打开几个不同的文件(在其他地方,以编程方式确定),所以我可以得到他们的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(库的内部),一个unsigned char缓冲区和缓冲区的长度。我需要用fopen读取文件,将文件放入内存进行散列。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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