module Net::SSH::Authentication::Pageant::Win
The definition of the Windows methods and data structures used in communicating with the pageant process.
Constants
- COPYDATASTRUCT
The COPYDATASTRUCT is used to send WM_COPYDATA messages
- FILE_MAP_WRITE
- INVALID_HANDLE_VALUE
From winbase.h, winnt.h
- NULL
- PAGE_READWRITE
- REVISION
The initial revision level assigned to the security descriptor.
- SECURITY_ATTRIBUTES
Contains the security descriptor, this gets passed to the function that constructs the shared memory map.
- SECURITY_DESCRIPTOR
The security descriptor holds security information.
- SIZEOF_DWORD
- SMTO_NORMAL
- TOKEN_QUERY
Constants needed for security attribute retrieval. Specifies the access mask corresponding to the desired access rights.
- TOKEN_USER
Structs for security attribute functions. Holds the retrieved user access token.
- TOKEN_USER_INFORMATION_CLASS
The value of TOKEN_USER from the TOKEN_INFORMATION_CLASS enum.
- WM_COPYDATA
Public Class Methods
get_cstr(str)
click to toggle source
Get a null-terminated string given a string.
# File lib/net/ssh/authentication/pageant.rb, line 278 def self.get_cstr(str) return str + "\000" end
get_current_user()
click to toggle source
# File lib/net/ssh/authentication/pageant.rb, line 227 def self.get_current_user token_handle = open_process_token(Win.GetCurrentProcess, Win::TOKEN_QUERY) token_user = get_token_information(token_handle, Win::TOKEN_USER_INFORMATION_CLASS) return token_user end
get_ptr(data)
click to toggle source
# File lib/net/ssh/authentication/pageant.rb, line 185 def self.get_ptr(data) return data.to_ptr end
get_security_attributes_for_user()
click to toggle source
# File lib/net/ssh/authentication/pageant.rb, line 206 def self.get_security_attributes_for_user user = get_current_user psd_information = malloc_ptr(Win::SECURITY_DESCRIPTOR.size) raise_error_if_zero( Win.InitializeSecurityDescriptor(psd_information, Win::REVISION)) raise_error_if_zero( Win.SetSecurityDescriptorOwner(psd_information, user.SID, 0)) raise_error_if_zero( Win.IsValidSecurityDescriptor(psd_information)) sa = Win::SECURITY_ATTRIBUTES.new(malloc_ptr(Win::SECURITY_ATTRIBUTES.size)) sa.nLength = Win::SECURITY_ATTRIBUTES.size sa.lpSecurityDescriptor = psd_information.to_i sa.bInheritHandle = 1 return sa end
get_token_information(token_handle, token_information_class)
click to toggle source
# File lib/net/ssh/authentication/pageant.rb, line 246 def self.get_token_information(token_handle, token_information_class) # Hold the size of the information to be returned preturn_length = malloc_ptr(Win::SIZEOF_DWORD) # Going to throw an INSUFFICIENT_BUFFER_ERROR, but that is ok # here. This is retrieving the size of the information to be # returned. Win.GetTokenInformation(token_handle, token_information_class, Win::NULL, 0, preturn_length) ptoken_information = malloc_ptr(preturn_length.ptr.to_i) # This call is going to write the requested information to # the memory location referenced by token_information. raise_error_if_zero( Win.GetTokenInformation(token_handle, token_information_class, ptoken_information, ptoken_information.size, preturn_length)) return TOKEN_USER.new(ptoken_information) end
malloc_ptr(size)
click to toggle source
# File lib/net/ssh/authentication/pageant.rb, line 181 def self.malloc_ptr(size) return DL.malloc(size) end
open_process_token(process_handle, desired_access)
click to toggle source
# File lib/net/ssh/authentication/pageant.rb, line 235 def self.open_process_token(process_handle, desired_access) ptoken_handle = malloc_ptr(Win::SIZEOF_DWORD) raise_error_if_zero( Win.OpenProcessToken(process_handle, desired_access, ptoken_handle)) token_handle = ptoken_handle.ptr.to_i return token_handle end
raise_error_if_zero(result)
click to toggle source
# File lib/net/ssh/authentication/pageant.rb, line 271 def self.raise_error_if_zero(result) if result == 0 raise "Windows error: #{Win.GetLastError}" end end
set_ptr_data(ptr, data)
click to toggle source
# File lib/net/ssh/authentication/pageant.rb, line 189 def self.set_ptr_data(ptr, data) ptr[0] = data end