打开lsass.exe时CreateFile失败

时间:2013-09-01 08:22:11

标签: 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”权限运行。

1 个答案:

答案 0 :(得分:4)

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

可能的解决方法是:

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