编辑:
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%以上的计算机上运行)
答案 0 :(得分:1)
我现在无法对此进行测试,因此以下内容有点推测: - (
很难确定导致你所看到的是什么 - AFAIK你需要检查以下可能性:
Windows服务
服务在哪个用户/上下文中运行?
由于Windows Vista MS已应用多项更改来改善安全性,例如从Windows服务访问网络共享时更改了行为!
位数
ERROR_PARTIAL_COPY
可能会发生。当您的应用程序的位数与您正在检查的文件的位数不同时。
.NET文件(EXE / DLL)
如果您检查的文件恰好是.NET文件,GetBinaryType()
会表现得很奇怪。
病毒扫描程序等
任何病毒扫描程序等都可以通过GetBinaryType()
以奇怪的方式干扰。
rootkit感染和类似的 这可以给出一些奇怪的结果,因为没有rootkit是完美的......
虚拟机
如果Windows服务托管在虚拟机中,我有几个奇怪的网络访问经验。
您可以检查的另一点是,从“普通应用程序”运行此代码时行为是否相同 - 这可以为您提供“Windows服务/网络共享”是否与其有关的线索。
同时检查是否可以打开相应的文件(只读,没有锁定)以及GetFileType()
在这种情况下返回的内容。