通过Ruby / DL调用OpenProcessToken时出现段错误

克里斯·亨特

请参阅下面的更新

我一直在尝试解决Ruby库跨UAC上下文与另一个程序进行通信的能力,并且需要创建一个具有与当前用户相同的安全属性的共享文件映射。我正在使用Ruby / dl,并试图使其在Ruby 1.9.3上运行,这是导致我遇到问题的原因。

调用advapi31中OpenProcessToken函数会导致分段错误。您将在下面找到一个最小的示例,该示例导致了我的计算机上的分段错误。我收到的错误文本在此处,这也是错误文本打印到命令行后出现的错误框的屏幕截图:

Ruby问题对话框

require 'dl'
require 'dl/import'
require 'dl/types'

module Win
  extend DL::Importer

  dlload 'kernel32', 'advapi32'

  include DL::Win32Types

  # args: none
  # http://msdn.microsoft.com/en-us/library/windows/desktop/ms683179(v=vs.85).aspx
  extern 'HANDLE GetCurrentProcess()'

  # args: hProcessHandle, dwDesiredAccess, (out) phNewTokenHandle
  # http://msdn.microsoft.com/en-us/library/windows/desktop/aa379295(v=vs.85).aspx
  extern 'BOOL OpenProcessToken(HANDLE, DWORD, PHANDLE)'

  # args: hObject
  # http://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx
  extern 'BOOL CloseHandle(HANDLE)'

  # args: none
  # http://msdn.microsoft.com/en-us/library/windows/desktop/ms679360(v=vs.85).aspx
  extern 'DWORD GetLastError()'

  def self.open_process_token
    token_handle = DL::CPtr.malloc(DL::SIZEOF_VOIDP, DL::RUBY_FREE)
    raise_error_if_zero(OpenProcessToken(Win.GetCurrentProcess, 0x8, token_handle.ref))
    raise_error_if_zero(CloseHandle(token_handle))
  end

  def self.raise_error_if_zero(result)
    if result == 0
      raise "Windows error: #{Win.GetLastError}"
    end
  end
end

Win.open_process_token

更新

将Ruby更新为1.9.3p545(使用RubyInstaller)使我可以运行上面提供的示例,但是仍然存在问题。我在此处创建了一个包含以下文件的Gist ,这些文件在以1.9.3p545运行时会产生分段错误(尽管这次没有解释器变得没有响应并不会产生上述对话框)。机器以及另一台安装了相同版本Ruby且结果相同的机器。由于我之前没有提到它,因此我正在运行64位Windows 7 Pro,对于在其上测试过的另一台计算机也是如此。

我注意到一些可能暗示着更深层问题的事情,不一定与OpenProcessToken有关。以下任一情况都可以单独防止出现段错误:

  • 从runner.rb复制第3行到mwe.rb的底部,然后直接运行mwe.rb。
  • 注释掉mwe.rb的第5行或注释掉errors.rb的一些较大子集(例如,注释掉第37至99行不会导致段错误)。
  • 注释掉Runner.rb的第3行,实际上仅需要其他文件并退出。
  • 从Pageant :: Win内注释掉以下内容的组合不会导致段错误:
    • 致电 extern
    • 致电 struct
    • 常数
    • 类方法

在最后一种情况下,不必注释掉特定类别的所有项目。例如,如果我注释掉TOKEN_USER,则可以避免出现段错误SECURITY_ATTRIBUTES我也可以通过注释掉TOKEN_USERextern关联语句来防止段错误IsValidSecurityDescriptor我尝试了其他几种导致相同行为的组合。

任何帮助,将不胜感激。

克里斯·亨特

此错误不是由于ruby,而是由于您的代码。

您在open_process_token方法中对DL :: CPtr类型的变量使用了不合适的方法ref。

方法open_process_token

def self.open_process_token
  token_handle = DL::CPtr.malloc(DL::SIZEOF_VOIDP, DL::RUBY_FREE)
  OpenProcessToken(Win.GetCurrentProcess, 0x8, token_handle.ref)
end

应该

def self.open_process_token
  ptoken_handle = DL::CPtr.malloc(DL::SIZEOF_VOIDP, DL::RUBY_FREE)
  OpenProcessToken(Win.GetCurrentProcess, 0x8, ptoken_handle)
  token_handle = ptoken_handle.ptr.to_i
end

(感谢Heesob Park次发行。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Ruby通过gem安装json时出现错误

来自分类Dev

通过函数调用在2d数组中分配给struct时出现段错误

来自分类Dev

通过点调用的Ruby函数

来自分类Dev

使用Ruby FFI调用Rust库时出现分段错误

来自分类Dev

在ruby上调用c函数时出现分段错误

来自分类Dev

通过Ajax调用Sitecore ItemWebApi时出现404错误

来自分类Dev

通过AJAX调用BigCommerce API时出现401错误

来自分类Dev

通过AJAX调用BigCommerce API时出现401错误

来自分类Dev

尝试通过 AJAX 调用 PHP 函数时出现 500 错误

来自分类Dev

在Ruby中通过SSL进行API调用

来自分类Dev

通过Ruby安装Cocoapods会导致错误

来自分类Dev

通过Ruby rest_client使用Slack的传入Webhook时出现500错误

来自分类Dev

尝试通过ubuntu WSL终端在轨道上安装ruby时出现多个错误

来自分类Dev

通过RVM将Ruby安装到Mac OSX Lion时出现错误

来自分类Dev

通过atoi调用获取段错误

来自分类Dev

通过多线程将值分配给稀疏矩阵时出现段错误

来自分类Dev

调用子类方法时出现段错误

来自分类Dev

在Sketchup Ruby中调用dll库时出现Ruby Sketchup错误

来自分类Dev

通过Ruby方法编辑文件后,出现了奇怪的字符

来自分类Dev

通过用户输入调用ruby的动态方法不起作用

来自分类Dev

我可以通过ruby REST API调用创建方法吗?

来自分类Dev

通过rbenv在优胜美地上安装Ruby 2.3.0时出错

来自分类Dev

通过rbenv在优胜美地上安装Ruby 2.3.0时出错

来自分类Dev

通过节点客户端调用Google API时出现“套接字挂断”错误

来自分类Dev

通过Spawn从NodeJS调用python脚本时出现分段错误(内核已转储)

来自分类Dev

通过HTTP调用RESTFUL Web API时出现500服务器错误

来自分类Dev

通过Groovy脚本调用`git diff-tree`时出现“致命的错误对象”?

来自分类Dev

通过CallableStatement调用存储过程时出现“参数不是OUT参数”错误

来自分类Dev

OkHttp 4.x尝试通过调用请求访问URL时出现错误

Related 相关文章

  1. 1

    使用Ruby通过gem安装json时出现错误

  2. 2

    通过函数调用在2d数组中分配给struct时出现段错误

  3. 3

    通过点调用的Ruby函数

  4. 4

    使用Ruby FFI调用Rust库时出现分段错误

  5. 5

    在ruby上调用c函数时出现分段错误

  6. 6

    通过Ajax调用Sitecore ItemWebApi时出现404错误

  7. 7

    通过AJAX调用BigCommerce API时出现401错误

  8. 8

    通过AJAX调用BigCommerce API时出现401错误

  9. 9

    尝试通过 AJAX 调用 PHP 函数时出现 500 错误

  10. 10

    在Ruby中通过SSL进行API调用

  11. 11

    通过Ruby安装Cocoapods会导致错误

  12. 12

    通过Ruby rest_client使用Slack的传入Webhook时出现500错误

  13. 13

    尝试通过ubuntu WSL终端在轨道上安装ruby时出现多个错误

  14. 14

    通过RVM将Ruby安装到Mac OSX Lion时出现错误

  15. 15

    通过atoi调用获取段错误

  16. 16

    通过多线程将值分配给稀疏矩阵时出现段错误

  17. 17

    调用子类方法时出现段错误

  18. 18

    在Sketchup Ruby中调用dll库时出现Ruby Sketchup错误

  19. 19

    通过Ruby方法编辑文件后,出现了奇怪的字符

  20. 20

    通过用户输入调用ruby的动态方法不起作用

  21. 21

    我可以通过ruby REST API调用创建方法吗?

  22. 22

    通过rbenv在优胜美地上安装Ruby 2.3.0时出错

  23. 23

    通过rbenv在优胜美地上安装Ruby 2.3.0时出错

  24. 24

    通过节点客户端调用Google API时出现“套接字挂断”错误

  25. 25

    通过Spawn从NodeJS调用python脚本时出现分段错误(内核已转储)

  26. 26

    通过HTTP调用RESTFUL Web API时出现500服务器错误

  27. 27

    通过Groovy脚本调用`git diff-tree`时出现“致命的错误对象”?

  28. 28

    通过CallableStatement调用存储过程时出现“参数不是OUT参数”错误

  29. 29

    OkHttp 4.x尝试通过调用请求访问URL时出现错误

热门标签

归档