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)
如果您正在检查的文件恰好是.NET文件,则其行为可能会异常GetBinaryType()
- 病毒扫描程序等
任何病毒扫描程序等都可能以奇怪的方式干扰GetBinaryType()
- rootkit感染和类似感染
这会产生一些奇怪的结果,因为没有一个rootkit是完美的 - 虚拟机
如果Windows服务托管在虚拟机中,我在网络访问方面有过几次奇怪的经历
还要检查是否可以打开相应的文件(只读,无锁)以及在这种情况下返回的内容。它是什么版本的Windows,操作系统是32位还是64位?64位,它是XP还是7位?直到星期一才能确认。仅供参考-我在两台机器(Win7 x64和XP x86)上针对每个exe运行了代码没有错误\u部分\u复制错误。我尝试将其编译为32位和64位。这使我怀疑作为一项服务与此有关。@CareyGregory,感谢您的努力。我的另一个想法是,它正在网络上读取,但我无法复制。@CareyGregory,有原因地更新了问题。很抱歉I’我浪费了你的时间。再次感谢。+1感谢你的建议。我会花一段时间来完成这些建议,但会让你知道,无论成功与否。@hmjd欢迎:-)你的测试有结果吗?目前没有。如果其中任何一个最终被证明是答案,我将重新启动赏金(如果可以的话),并确保信用到期。:)干杯。@hmjd无论是上面提到的还是完全不同的东西-我希望你能找到,祝你好运:-)如果我找到了,我会告诉你的。在我发回这里之前,你可能会听到我的欢呼声。。。