【问题标题】:CreateFile fails on opening lsass.exeCreateFile 在打开 lsass.exe 时失败
【发布时间】:2013-09-01 08:22:10
【问题描述】:

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

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

在我打开 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”权限运行。

【问题讨论】:

  • c_str() 闻起来像 C++。
  • 嗯,以编程方式检索到的路径。所以,是的 - 路径被转义了。

标签: c windows winapi windows-8 createfile


【解决方案1】:

您可能与File System Redirector 发生冲突。尝试在 c:\windows\system32 中打开文件的 32 位进程被重定向到 c:\windows\syswow64。这是一个 appcompat 功能,它让 32 位程序有机会在 64 位操作系统上生存。 Lsass.exe 确实很特别,在 64 位机器上没有该 EXE 的 32 位版本。

可能的解决方法是:

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

【讨论】:

  • 非常感谢,帮了大忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多