Winapi GetBinaryType()失败,最后一个错误为error\u PARTIAL\u COPY

Winapi GetBinaryType()失败,最后一个错误为error\u PARTIAL\u COPY,winapi,Winapi,编辑: 错误\u PARTIAL\u COPY错误不是由调用GetBinaryType()引起的,而是由先前调用EnumProcessModules()引起的,该调用试图获取进程传递到GetBinaryType()的可执行文件的完整路径,但失败。发生了异常链接,我错过了该链接,该链接将异常的错误消息设置为原始帖子中的相同错误消息,但保留了操作系统错误代码error\u PARTIAL\u COPY 此函数是从32位Windows服务中调用的。我搜索了internet和stackoverflow

编辑:

错误\u PARTIAL\u COPY
错误不是由调用
GetBinaryType()
引起的,而是由先前调用
EnumProcessModules()
引起的,该调用试图获取进程传递到
GetBinaryType()
的可执行文件的完整路径,但失败。发生了异常链接,我错过了该链接,该链接将异常的错误消息设置为原始帖子中的相同错误消息,但保留了操作系统错误代码
error\u PARTIAL\u COPY


此函数是从32位Windows服务中调用的。我搜索了internet和stackoverflow,没有发现其他实例出现
GetBinaryType()
失败和
GetLastError()
返回
ERROR\u PARTIAL\u COPY

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

我考虑的一种可能性是,
ERROR\u PARTIAL\u COPY
是由以前的WINAPI调用设置的,并且
GetBinaryType()
没有
SetLastError()
正确。我试图通过以下方式再现这一点:

  • 使用不存在的文件路径执行它
  • 使用不可执行文件的路径执行它
  • 使用拒绝访问的文件路径执行它
没有成功(在每次尝试之前,我调用了
SetLastError(ERROR\u PARTIAL\u 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%以上的机器上工作)

我现在无法测试这种情况,因此以下内容有点推测性:-(

很难确定是什么导致了你所看到的——好吧,你需要检查以下可能性:

  • Windows服务
    服务在哪个用户/上下文中运行?
    因为Windows Vista MS已经应用了一些更改来提高安全性,这些更改改变了行为,例如从Windows服务访问网络共享时的行为

  • 咬合度
    ERROR\u PARTIAL\u COPY
    可能发生,尤其是当应用程序的位与正在检查的文件的位不同时

  • .NET文件(EXE/DLL)
    GetBinaryType()
    如果您正在检查的文件恰好是.NET文件,则其行为可能会异常

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

  • rootkit感染和类似感染
    这会产生一些奇怪的结果,因为没有一个rootkit是完美的

  • 虚拟机
    如果Windows服务托管在虚拟机中,我在网络访问方面有过几次奇怪的经历

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


还要检查是否可以打开相应的文件(只读,无锁)以及在这种情况下返回的内容。

它是什么版本的Windows,操作系统是32位还是64位?64位,它是XP还是7位?直到星期一才能确认。仅供参考-我在两台机器(Win7 x64和XP x86)上针对每个exe运行了代码没有错误\u部分\u复制错误。我尝试将其编译为32位和64位。这使我怀疑作为一项服务与此有关。@CareyGregory,感谢您的努力。我的另一个想法是,它正在网络上读取,但我无法复制。@CareyGregory,有原因地更新了问题。很抱歉I’我浪费了你的时间。再次感谢。+1感谢你的建议。我会花一段时间来完成这些建议,但会让你知道,无论成功与否。@hmjd欢迎:-)你的测试有结果吗?目前没有。如果其中任何一个最终被证明是答案,我将重新启动赏金(如果可以的话),并确保信用到期。:)干杯。@hmjd无论是上面提到的还是完全不同的东西-我希望你能找到,祝你好运:-)如果我找到了,我会告诉你的。在我发回这里之前,你可能会听到我的欢呼声。。。