CreateFile 打开 lsass.exe 失败

标签 c windows winapi windows-8 createfile

我正在开发一个程序,该程序收集有关系统上运行的进程的一些统计信息。

我有一个代码,它检索一些常规信息,例如可执行文件版本、发布者等。

在我打开 lsass.exe 之前,代码对我来说工作正常。 当我尝试打开文件进行读取时,CreateFile 失败并出现错误 ERROR_FILE_NOT_FOUND。

这是代码:

auto FileHandle 
    = CreateFile(file_to_process.c_str(), // C:\Windows\System32\lsass.exe
                 GENERIC_READ, 
                 FILE_SHARE_DELETE|FILE_SHARE_READ|FILE_SHARE_WRITE, 
                 NULL, 
                 OPEN_EXISTING, 
                 FILE_ATTRIBUTE_NORMAL, 
                 NULL);

if ( INVALID_HANDLE_VALUE == FileHandle )
{
    int err_v = GetLastError(); // ERROR_FILE_NOT_FOUND
}

此代码是系统服务的一部分,以“SYSTEM”权限运行。

最佳答案

您可能与 File System Redirector 发生冲突。 。尝试打开 c:\windows\system32 中的文件的 32 位进程将被重定向到 c:\windows\syswow64。这是一项应用程序兼容性功能,为 32 位程序提供了在 64 位操作系统上生存的机会。 Lsass.exe 确实很特殊,64 位计算机上没有该 EXE 的 32 位版本。

可能的解决方法是:

  • 将程序构建为 x64,这样您就可以作为 64 位进程运行并且不会被重定向
  • 改为打开 c:\windows\sysnative\lsass.exe
  • 使用 Wow64DisableWow64FsRedirection() 禁用重定向器。虽然这是一个显而易见的解决方案,但请注意它很危险,因为您的程序可能会无意中加载 64 位 DLL 和炸弹,这就是需要重定向器的原因。

关于CreateFile 打开 lsass.exe 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18556579/

相关文章:

python - 从脚本驱动 Windows GUI 程序

c - fprintf 产生不同的输出

c - 我想要位置,但我得到数组的 ncols 和 nrows

c - for 循环中的空语句 VS 无限 while

python - 如何在Windows中获取物理驱动器

c++ - 确定窗口捕捉距离

c++ - 如何将 std::string 环境 block 传递给 CreateProcess?

c - GWL_WNDPROC未声明

windows - 对 Win32 API 调用在汇编中的工作方式感到困惑

c - 整数类型是如何隐式转换的?