GetBinaryType()失败,最后一个错误为ERROR_PARTIAL_COPY

时间:2012-01-30 10:27:41

标签: winapi

编辑:

ERROR_PARTIAL_COPY错误不是由对GetBinaryType()的调用引起的,而是由先前调用EnumProcessModules()引起的,该调用试图获取可执行文件的完整路径以使进程通过至GetBinaryType(),失败了。我错过了异常链接,并将异常的错误消息设置为原始帖子中的相同错误消息,但保留了操作系统错误代码ERROR_PARTIAL_COPY


从32位Windows服务中调用此函数。我搜索了互联网和stackoverflow,没有找到GetBinaryType()失败且GetLastError()返回ERROR_PARTIAL_COPY的其他实例:

  

只完成了ReadProcessMemory或WriteProcessMemory请求的一部分。

我考虑的一种可能性是ERROR_PARTIAL_COPY是由早期的WINAPI调用设置的,GetBinaryType()没有正确SetLastError()。我试图通过以下方式重现这个:

  • 使用不存在的文件路径执行它
  • 使用非可执行文件的路径执行它
  • 使用拒绝访问的文件路径执行它

没有成功(我在每次尝试之前调用了SetLastError(ERROR_PARTIAL_COPY);):每次尝试都产生了预期的结果。

代码段是:

std::string full_exe_path =
        a_impl->exe_installation_dir + "\\" + a_impl->exe_name;

DWORD bin_type;
if (FALSE == GetBinaryType(full_exe_path.c_str(), &bin_type))
{
    throw Base_exception(
        __LINE__,
        __FILE__,
        "Failed to get binary type for " + a_impl->exe_name);
        // Optional argument here that defaults to GetLastError()
}

有没有人知道或有任何建议?

注意:这是在我无法访问的计算机上发生的(并且在运行Windows服务的99%以上的计算机上运行)

1 个答案:

答案 0 :(得分:1)

我现在无法对此进行测试,因此以下内容有点推测: - (

很难确定导致你所看到的是什么 - AFAIK你需要检查以下可能性:

  • Windows服务
    服务在哪个用户/上下文中运行? 由于Windows Vista MS已应用多项更改来改善安全性,例如从Windows服务访问网络共享时更改了行为!

  • 位数
    ERROR_PARTIAL_COPY可能会发生。当您的应用程序的位数与您正在检查的文件的位数不同时。

  • .NET文件(EXE / DLL)
    如果您检查的文件恰好是.NET文件,GetBinaryType()会表现得很奇怪。

  • 病毒扫描程序等 任何病毒扫描程序等都可以通过GetBinaryType()以奇怪的方式干扰。

  • rootkit感染和类似的 这可以给出一些奇怪的结果,因为没有rootkit是完美的......

  • 虚拟机
    如果Windows服务托管在虚拟机中,我有几个奇怪的网络访问经验。

您可以检查的另一点是,从“普通应用程序”运行此代码时行为是否相同 - 这可以为您提供“Windows服务/网络共享”是否与其有关的线索。

同时检查是否可以打开相应的文件(只读,没有锁定)以及GetFileType()在这种情况下返回的内容。