U
    cc                     @   s   d Z ddlZddlZddlZddlZddlmZ ddlm	Z	 zddl
ZW n ek
rd   ddlZY nX ddlmZ dZdZd	Zd
d Zdd Ze d dkrejZnejZG dd dejZdd ZG dd deZdS )zP
Functions for communicating with Pageant, the basic windows ssh agent program.
    N)	zero_byte)b   )_winapil   P  i    J   c                   C   s   t jjddS )Ns   Pageant)ctypeswindlluser32ZFindWindowA r
   r
   8/tmp/pip-unpacked-wheel-rglolp_m/paramiko/win_pageant.py_get_pageant_window_object.   s    r   c                   C   s
   t t S )z
    Check to see if there is a "Pageant" agent we can talk to.

    This checks both if we have the required libraries (win32all or ctypes)
    and if there is a Pageant currently running.
    )boolr   r
   r
   r
   r   can_talk_to_agent2   s    r   64bitc                   @   s,   e Zd ZdZdefdejjfdejfgZ	dS )COPYDATASTRUCTzy
    ctypes implementation of
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms649010%28v=vs.85%29.aspx
    Znum_data	data_sizeZdata_locN)
__name__
__module____qualname____doc__	ULONG_PTRr   ZwintypesZDWORDc_void_p_fields_r
   r
   r
   r   r   B   s
   
r   c              
   C   s   t  }|sdS dt  }t|tt }| ||  tdt	|t
 }| \}}tt||}tjj|tt|t|}|dkr|d |d}	td|	d }
|	||
 W  5 Q R  S W 5 Q R  dS Q R X dS )za
    Communication with the Pageant process is done through a shared
    memory-mapped file.
    NzPageantRequest%08xr   r      z>I)r   thread	get_identr   Z	MemoryMap_AGENT_MAX_MSGLENZ get_security_attributes_for_userwritearrayr   r   buffer_infor   _AGENT_COPYDATA_IDr   r   r	   ZSendMessageAwin32con_WM_COPYDATAsizeofbyrefseekreadstructunpack)msgZhwndZmap_nameZpymapZchar_bufferZchar_buffer_addressZchar_buffer_sizeZcdsresponseZdatalenZretlenr
   r
   r   _query_pageantO   s<      
     

r*   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )PageantConnectiona  
    Mock "connection" to an agent which roughly approximates the behavior of
    a unix local-domain socket (as used by Agent).  Requests are sent to the
    pageant daemon via special Windows magick, and responses are buffered back
    for subsequent reads.
    c                 C   s
   d | _ d S N	_responseselfr
   r
   r   __init__}   s    zPageantConnection.__init__c                 C   s   t || _d S r,   )r*   r.   )r0   datar
   r
   r   send   s    zPageantConnection.sendc                 C   s@   | j d krdS | j d | }| j |d  | _ | j dkr<d | _ |S )N r-   )r0   nretr
   r
   r   recv   s    

zPageantConnection.recvc                 C   s   d S r,   r
   r/   r
   r
   r   close   s    zPageantConnection.closeN)r   r   r   r   r1   r3   r7   r8   r
   r
   r
   r   r+   u   s
   	r+   )r   r   Zctypes.wintypesr   platformr&   Zparamiko.commonr   Zparamiko.py3compatr   _threadr   ImportErrorr4   r   r    r   r!   r   r   architecturec_uint64r   c_uint32	Structurer   r*   objectr+   r
   r
   r
   r   <module>   s,   
&