CreateFile在打开lsass.exe时失败

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

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

代码工作正常,直到我打开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:\ windows \ system32中打开文件的32位进程被重定向到c:\ windows \ syswow64。 这是一个appcompat功能,使32位程序有机会在64位操作系统上生存。 Lsass.exe确实很特别,在64位机器上没有可用的EXE的32位版本。

可能的解决方法是:

  • 建立你的程序到64位,所以你会运行一个64位的进程,不要重定向
  • 改为打开c:\ windows \ sysnative \ lsass.exe
  • 使用Wow64DisableWow64FsRedirection()来禁用重定向器。 虽然一个明显的解决方案,请注意,这是危险的,因为你的程序可能会无意中加载一个64位的DLL和炸弹,这是需要重定向器的原因。