B
    '\                 @   sh  d dl mZmZmZmZ d dlmZ d dlmZ ddl	m
Z
mZmZ eeZer"d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZmZm Z m!Z!m"Z"m#Z# eeZ$ee Z%dZ&d	Z'ej(j)Z)ee fe)_*e e)_+ej(j,Z,efe,_*ee,_+G d
d deZ-ee-Z.ej/j0Z1e.fe1_*ee1_+G dd deZ2G dd deZ3dd Z4dd Z5dd Z6dddZ7dS )    )absolute_importdivisionprint_functionunicode_literals)IntEnum)	getLogger   )ensure_binaryon_winstring_types)POINTER	StructureWinErrorbyrefc_ulongc_char_pc_intc_ulonglongc_void_p	c_wchar_ppointersizeofwindll)HANDLEBOOLDWORDHWND	HINSTANCEHKEY@   c               @   sv   e Zd ZdZdefdefdefdefdefdefdefd	efd
e	fde
fdefdefdefdefdefgZdd ZdS )ShellExecuteInfoz
https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-shellexecuteexa
https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/ns-shellapi-_shellexecuteinfoa
        cbSizefMaskhwndlpVerblpFilelpParameterslpDirectorynShowZhInstAppZlpIDListZlpClassZ	hKeyClassZdwHotKeyZhIconhProcessc             K   sL   t |  t| | _x2| D ]&\}}t|tr8t|}t| || qW d S )N)	r   __init__r   r"   items
isinstancer   r	   setattr)selfkwargsZ
field_nameZfield_value r1   6lib/python3.7/site-packages/conda/common/os/windows.pyr+   6   s    


zShellExecuteInfo.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   Z_fields_r+   r1   r1   r1   r2   r!      s"   
r!   c               @   s<   e Zd ZdZdZdZdZdZdZdZ	dZ
dZd	Zd
ZdZdS )SWr         	      
   r               N)r3   r4   r5   HIDEZMAXIMIZEZMINIMIZEZRESTOREZSHOWZSHOWDEFAULTZSHOWMAXIMIZEDZSHOWMINIMIZEDZSHOWMINNOACTIVEZSHOWNAZSHOWNOACTIVATEZ
SHOWNORMALr1   r1   r1   r2   r7   D   s   r7   c               @   s@   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )ERRORr   r   r8      r;                      r>      N)r3   r4   r5   ZZEROZFILE_NOT_FOUNDZPATH_NOT_FOUNDZ
BAD_FORMATZACCESS_DENIEDZASSOC_INCOMPLETEZDDE_BUSYZDDE_FAILZDDE_TIMEOUTZDLL_NOT_FOUNDZNO_ASSOCZOOMZSHAREr1   r1   r1   r2   rB   S   s   rB   c          
   C   sd   d }t d}y$tjt| d d t| |j}W n. tk
r^ } zt	d| W d d }~X Y nX |S )Nr   z%r)
r   r   kernel32ZGetDiskFreeSpaceExWr   r   value	Exceptionloginfo)Zdir_nameresultZ
free_byteser1   r1   r2   get_free_space_on_windowsc   s    

rR   c           
   C   sJ   d} yt j dk} W n. tk
rD } ztd| W d d }~X Y nX | S )NFr   z%r)r   Zshell32ZIsUserAnAdminrM   rN   rO   )rP   rQ   r1   r1   r2   is_admin_on_windowss   s    rS   c          
   C   sJ   yt | t t|  W n. tk
rD } ztd| W dd}~X Y nX dS )zBWaits until spawned process finishes and closes the handle for it.z%rN)WaitForSingleObjectINFINITECloseHandlerM   rN   rO   )Zprocess_handlerQ   r1   r1   r2   _wait_and_close_handle~   s
    
rW   Tc       	   
   C   s   | d }d t| dkr$| dd nd}d}d}y.ttdd||dtjd}tt|}|j}W n6 t	k
r } zd}|}t
d	| W dd}~X Y nX |st }n|rt|j ||fS )
a  
    Run command line argument list (`args`) with elevated privileges.

    If `wait` is True, the process will block until completion.

    NOTES:
        - no stdin / stdout / stderr pipe support
        - does not automatically quote arguments (i.e. for paths that may contain spaces)
    See:
    - http://stackoverflow.com/a/19719292/1170370 on 20160407 MCS.
    - msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx
    - https://github.com/ContinuumIO/menuinst/blob/master/menuinst/windows/win_elevate.py
    - https://github.com/saltstack/salt-windows-install/blob/master/deps/salt/python/App/Lib/site-packages/win32/Demos/pipes/runproc.py  # NOQA
    - https://github.com/twonds/twisted/blob/master/twisted/internet/_dumbwin32proc.py
    - https://stackoverflow.com/a/19982092/2127762
    - https://www.codeproject.com/Articles/19165/Vista-UAC-The-Definitive-Guide
    - https://github.com/JustAMan/pyWinClobber/blob/master/win32elevate.py
    r    r@   Nr1   Zrunas)r#   r$   r%   r&   r'   r(   r)   Fz%r)joinlenr!   SEE_MASK_NOCLOSEPROCESSr7   rA   ShellExecuteExr   r*   rM   rN   rO   r   rW   )	argswaitZarg0Z	param_strZhprocessZ
error_codeZexecute_infoZ
successfulrQ   r1   r1   r2   run_as_admin   s0    "


r_   N)T)8Z
__future__r   r   r   r   enumr   Zloggingr   compatr	   r
   r   r3   rN   Zctypesr   r   r   r   r   r   r   r   r   r   r   r   r   Zctypes.wintypesr   r   r   r   r   r   ZPHANDLEZPDWORDr[   rU   rK   rT   ZargtypesZrestyperV   r!   ZPShellExecuteInfoZShell32ZShellExecuteExAr\   r7   rB   rR   rS   rW   r_   r1   r1   r1   r2   <module>   s8   < 
 	