summaryrefslogtreecommitdiff
path: root/paramiko/win_pageant.py
diff options
context:
space:
mode:
authorJeremy T. Bouse <jbouse@debian.org>2013-05-25 00:04:32 -0400
committerJeremy T. Bouse <jbouse@debian.org>2013-05-25 00:04:32 -0400
commit1a716ed46d1d556d4ba6798608ab498320acd886 (patch)
treedbcb23de26387e312f7ea09085330eca90e15853 /paramiko/win_pageant.py
parenta88b8c8c0f591a3bfa8d7984343a27815184f495 (diff)
downloadpython-paramiko-1a716ed46d1d556d4ba6798608ab498320acd886.tar
python-paramiko-1a716ed46d1d556d4ba6798608ab498320acd886.tar.gz
Imported Upstream version 1.10.1upstream/1.10.1
Diffstat (limited to 'paramiko/win_pageant.py')
-rw-r--r--paramiko/win_pageant.py28
1 files changed, 19 insertions, 9 deletions
diff --git a/paramiko/win_pageant.py b/paramiko/win_pageant.py
index 787032b..d77d58f 100644
--- a/paramiko/win_pageant.py
+++ b/paramiko/win_pageant.py
@@ -26,6 +26,8 @@ import struct
import tempfile
import mmap
import array
+import platform
+import ctypes.wintypes
# if you're on windows, you should have one of these, i guess?
# ctypes is part of standard library since Python 2.5
@@ -42,7 +44,6 @@ except ImportError:
except ImportError:
pass
-
_AGENT_COPYDATA_ID = 0x804e50ba
_AGENT_MAX_MSGLEN = 8192
# Note: The WM_COPYDATA value is pulled from win32con, as a workaround
@@ -74,6 +75,17 @@ def can_talk_to_agent():
return True
return False
+ULONG_PTR = ctypes.c_uint64 if platform.architecture()[0] == '64bit' else ctypes.c_uint32
+class COPYDATASTRUCT(ctypes.Structure):
+ """
+ ctypes implementation of
+ http://msdn.microsoft.com/en-us/library/windows/desktop/ms649010%28v=vs.85%29.aspx
+ """
+ _fields_ = [
+ ('num_data', ULONG_PTR),
+ ('data_size', ctypes.wintypes.DWORD),
+ ('data_loc', ctypes.c_void_p),
+ ]
def _query_pageant(msg):
hwnd = _get_pageant_window_object()
@@ -96,19 +108,17 @@ def _query_pageant(msg):
char_buffer = array.array("c", map_filename + '\0')
char_buffer_address, char_buffer_size = char_buffer.buffer_info()
# Create a string to use for the SendMessage function call
- cds = struct.pack("LLP", _AGENT_COPYDATA_ID, char_buffer_size, char_buffer_address)
+ cds = COPYDATASTRUCT(_AGENT_COPYDATA_ID, char_buffer_size, char_buffer_address)
if _has_win32all:
# win32gui.SendMessage should also allow the same pattern as
# ctypes, but let's keep it like this for now...
- response = win32gui.SendMessage(hwnd, win32con_WM_COPYDATA, len(cds), cds)
+ response = win32gui.SendMessage(hwnd, win32con_WM_COPYDATA, ctypes.sizeof(cds), ctypes.addressof(cds))
elif _has_ctypes:
- _buf = array.array('B', cds)
- _addr, _size = _buf.buffer_info()
- response = ctypes.windll.user32.SendMessageA(hwnd, win32con_WM_COPYDATA, _size, _addr)
+ response = ctypes.windll.user32.SendMessageA(hwnd, win32con_WM_COPYDATA, ctypes.sizeof(cds), ctypes.byref(cds))
else:
response = 0
-
+
if response > 0:
datalen = pymap.read(4)
retlen = struct.unpack('>I', datalen)[0]
@@ -131,10 +141,10 @@ class PageantConnection (object):
def __init__(self):
self._response = None
-
+
def send(self, data):
self._response = _query_pageant(data)
-
+
def recv(self, n):
if self._response is None:
return ''