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

标签 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(库内部)、无符号字符缓冲区和缓冲区的长度。我需要使用 fopen 读取文件以将文件放入内存进行哈希处理。

最佳答案

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

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

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

关于在 Windows 核心文件上调用 fopen 返回 NULL 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14990498/

相关文章:

arrays - 通过引用函数传递二维数组

c - Cuda GPU 中的错误共享 : does it exist/similar to CPUs?

java - Windows 上的 "lo"接口(interface)等效项是什么

c - 是否可以防止添加 BOM 以输出 UTF-8 文件? ( Visual Studio 2005)

php - php ubuntu Web 服务器上的 fopen 和 cURL

c++ - 是不是所有的c库都可以在c++中使用?

c - FFmpeg C API 文档/教程

python - 如何在Windows中播放.wav文件?

java - 如何从网络摄像头拍摄单张快照?

c - 这些字符串是否为 fopen() 正确连接?