mercurial/win32.py
author Ian Moody <moz-ian@perix.co.uk>
Thu, 10 Oct 2019 22:11:39 +0100
changeset 43264 a4da1c3b82ab
parent 43077 687b865b95ad
child 43503 313e3a279828
permissions -rw-r--r--
phabricator: update hgmatcher to cope with the new data format The new conduit format can't be matched by the existing matcher since it shifts all the data into an urlencoded string of JSON, the order of which isn't stable between runs. Instead detect JSON values of params and load them into python dicts, which python will then naturally deep-equal compare. Differential Revision: https://phab.mercurial-scm.org/D7055
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8226
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     1
# win32.py - utility functions that use win32 API
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     2
#
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     3
# Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     4
#
8b2cd04a6e97 put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents: 8225
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10219
diff changeset
     6
# GNU General Public License version 2 or any later version.
8227
0a9542703300 turn some comments back into module docstrings
Martin Geisler <mg@lazybytes.net>
parents: 8226
diff changeset
     7
25994
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
     8
from __future__ import absolute_import
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
     9
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    10
import ctypes
35549
94a127152e25 win32: allocate buffer of maximum length for GetVolumeInformation()
Yuya Nishihara <yuya@tcha.org>
parents: 35512
diff changeset
    11
import ctypes.wintypes as wintypes
25994
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    12
import errno
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    13
import msvcrt
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    14
import os
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    15
import random
d6beeb618700 win32: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
    16
import subprocess
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    17
30667
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
    18
from . import (
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
    19
    encoding,
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
    20
    pycompat,
5861bdbeb9a3 py3: use pycompat.getcwd instead of os.getcwd
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30637
diff changeset
    21
)
30637
344e68882cd3 py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30314
diff changeset
    22
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    23
_kernel32 = ctypes.windll.kernel32
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
    24
_advapi32 = ctypes.windll.advapi32
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
    25
_user32 = ctypes.windll.user32
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
    26
_crypt32 = ctypes.windll.crypt32
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    27
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    28
_BOOL = ctypes.c_long
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    29
_WORD = ctypes.c_ushort
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    30
_DWORD = ctypes.c_ulong
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
    31
_UINT = ctypes.c_uint
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
    32
_LONG = ctypes.c_long
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    33
_LPCSTR = _LPSTR = ctypes.c_char_p
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    34
_HANDLE = ctypes.c_void_p
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    35
_HWND = _HANDLE
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
    36
_PCCERT_CONTEXT = ctypes.c_void_p
35549
94a127152e25 win32: allocate buffer of maximum length for GetVolumeInformation()
Yuya Nishihara <yuya@tcha.org>
parents: 35512
diff changeset
    37
_MAX_PATH = wintypes.MAX_PATH
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    38
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
    39
_INVALID_HANDLE_VALUE = _HANDLE(-1).value
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    40
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    41
# GetLastError
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    42
_ERROR_SUCCESS = 0
21193
07f9825865de win32: add missing definition of _ERROR_NO_MORE_FILES caught by pyflakes
Yuya Nishihara <yuya@tcha.org>
parents: 20528
diff changeset
    43
_ERROR_NO_MORE_FILES = 18
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    44
_ERROR_INVALID_PARAMETER = 87
24652
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
    45
_ERROR_BROKEN_PIPE = 109
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    46
_ERROR_INSUFFICIENT_BUFFER = 122
38533
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
    47
_ERROR_NO_DATA = 232
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    48
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    49
# WPARAM is defined as UINT_PTR (unsigned type)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    50
# LPARAM is defined as LONG_PTR (signed type)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    51
if ctypes.sizeof(ctypes.c_long) == ctypes.sizeof(ctypes.c_void_p):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    52
    _WPARAM = ctypes.c_ulong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    53
    _LPARAM = ctypes.c_long
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    54
elif ctypes.sizeof(ctypes.c_longlong) == ctypes.sizeof(ctypes.c_void_p):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    55
    _WPARAM = ctypes.c_ulonglong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    56
    _LPARAM = ctypes.c_longlong
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    57
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    58
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    59
class _FILETIME(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    60
    _fields_ = [(r'dwLowDateTime', _DWORD), (r'dwHighDateTime', _DWORD)]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    61
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    62
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    63
class _BY_HANDLE_FILE_INFORMATION(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    64
    _fields_ = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    65
        (r'dwFileAttributes', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    66
        (r'ftCreationTime', _FILETIME),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    67
        (r'ftLastAccessTime', _FILETIME),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    68
        (r'ftLastWriteTime', _FILETIME),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    69
        (r'dwVolumeSerialNumber', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    70
        (r'nFileSizeHigh', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    71
        (r'nFileSizeLow', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    72
        (r'nNumberOfLinks', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    73
        (r'nFileIndexHigh', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    74
        (r'nFileIndexLow', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    75
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    76
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    77
18959
2f6418d8a4c9 check-code: catch trailing space in comments
Mads Kiilerich <madski@unity3d.com>
parents: 18175
diff changeset
    78
# CreateFile
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    79
_FILE_SHARE_READ = 0x00000001
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    80
_FILE_SHARE_WRITE = 0x00000002
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    81
_FILE_SHARE_DELETE = 0x00000004
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    82
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    83
_OPEN_EXISTING = 3
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    84
17006
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
    85
_FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
    86
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
    87
# SetFileAttributes
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
    88
_FILE_ATTRIBUTE_NORMAL = 0x80
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
    89
_FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x2000
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
    90
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    91
# Process Security and Access Rights
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    92
_PROCESS_QUERY_INFORMATION = 0x0400
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    93
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    94
# GetExitCodeProcess
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    95
_STILL_ACTIVE = 259
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    96
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    97
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
    98
class _STARTUPINFO(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
    99
    _fields_ = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   100
        (r'cb', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   101
        (r'lpReserved', _LPSTR),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   102
        (r'lpDesktop', _LPSTR),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   103
        (r'lpTitle', _LPSTR),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   104
        (r'dwX', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   105
        (r'dwY', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   106
        (r'dwXSize', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   107
        (r'dwYSize', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   108
        (r'dwXCountChars', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   109
        (r'dwYCountChars', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   110
        (r'dwFillAttribute', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   111
        (r'dwFlags', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   112
        (r'wShowWindow', _WORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   113
        (r'cbReserved2', _WORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   114
        (r'lpReserved2', ctypes.c_char_p),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   115
        (r'hStdInput', _HANDLE),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   116
        (r'hStdOutput', _HANDLE),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   117
        (r'hStdError', _HANDLE),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   118
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   119
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   120
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   121
class _PROCESS_INFORMATION(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   122
    _fields_ = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   123
        (r'hProcess', _HANDLE),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   124
        (r'hThread', _HANDLE),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   125
        (r'dwProcessId', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   126
        (r'dwThreadId', _DWORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   127
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   128
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   129
17050
e780fb37168b win32: specify _CREATE_NO_WINDOW on spawndetached()
Adrian Buehlmann <adrian@cadifra.com>
parents: 17006
diff changeset
   130
_CREATE_NO_WINDOW = 0x08000000
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   131
_SW_HIDE = 0
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   132
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   133
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   134
class _COORD(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   135
    _fields_ = [(r'X', ctypes.c_short), (r'Y', ctypes.c_short)]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   136
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   137
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   138
class _SMALL_RECT(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   139
    _fields_ = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   140
        (r'Left', ctypes.c_short),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   141
        (r'Top', ctypes.c_short),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   142
        (r'Right', ctypes.c_short),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   143
        (r'Bottom', ctypes.c_short),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   144
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   145
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   146
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   147
class _CONSOLE_SCREEN_BUFFER_INFO(ctypes.Structure):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   148
    _fields_ = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   149
        (r'dwSize', _COORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   150
        (r'dwCursorPosition', _COORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   151
        (r'wAttributes', _WORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   152
        (r'srWindow', _SMALL_RECT),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   153
        (r'dwMaximumWindowSize', _COORD),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   154
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   155
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   156
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   157
_STD_OUTPUT_HANDLE = _DWORD(-11).value
14344
e1db8a00188b win32.py: more explicit definition of _STD_ERROR_HANDLE
Adrian Buehlmann <adrian@cadifra.com>
parents: 14237
diff changeset
   158
_STD_ERROR_HANDLE = _DWORD(-12).value
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   159
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   160
# CERT_TRUST_STATUS dwErrorStatus
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   161
CERT_TRUST_IS_PARTIAL_CHAIN = 0x10000
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   162
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   163
# CertCreateCertificateContext encodings
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   164
X509_ASN_ENCODING = 0x00000001
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   165
PKCS_7_ASN_ENCODING = 0x00010000
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   166
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   167
# These structs are only complete enough to achieve what we need.
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   168
class CERT_CHAIN_CONTEXT(ctypes.Structure):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   169
    _fields_ = (
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   170
        (r"cbSize", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   171
        # CERT_TRUST_STATUS struct
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   172
        (r"dwErrorStatus", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   173
        (r"dwInfoStatus", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   174
        (r"cChain", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   175
        (r"rgpChain", ctypes.c_void_p),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   176
        (r"cLowerQualityChainContext", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   177
        (r"rgpLowerQualityChainContext", ctypes.c_void_p),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   178
        (r"fHasRevocationFreshnessTime", _BOOL),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   179
        (r"dwRevocationFreshnessTime", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   180
    )
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   181
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   182
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   183
class CERT_USAGE_MATCH(ctypes.Structure):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   184
    _fields_ = (
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   185
        (r"dwType", _DWORD),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   186
        # CERT_ENHKEY_USAGE struct
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   187
        (r"cUsageIdentifier", _DWORD),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   188
        (r"rgpszUsageIdentifier", ctypes.c_void_p),  # LPSTR *
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   189
    )
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   190
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   191
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   192
class CERT_CHAIN_PARA(ctypes.Structure):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   193
    _fields_ = (
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   194
        (r"cbSize", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   195
        (r"RequestedUsage", CERT_USAGE_MATCH),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   196
        (r"RequestedIssuancePolicy", CERT_USAGE_MATCH),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   197
        (r"dwUrlRetrievalTimeout", _DWORD),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   198
        (r"fCheckRevocationFreshnessTime", _BOOL),
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   199
        (r"dwRevocationFreshnessTime", _DWORD),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   200
        (r"pftCacheResync", ctypes.c_void_p),  # LPFILETIME
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   201
        (r"pStrongSignPara", ctypes.c_void_p),  # PCCERT_STRONG_SIGN_PARA
39611
f3900f4c63d4 py3: prevent the win32 ctype _fields_ from being transformed to bytes
Matt Harbison <matt_harbison@yahoo.com>
parents: 38783
diff changeset
   202
        (r"dwStrongSignFlags", _DWORD),
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   203
    )
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   204
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   205
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   206
# types of parameters of C functions used (required by pypy)
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   207
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   208
_crypt32.CertCreateCertificateContext.argtypes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   209
    _DWORD,  # cert encoding
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   210
    ctypes.c_char_p,  # cert
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   211
    _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   212
]  # cert size
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   213
_crypt32.CertCreateCertificateContext.restype = _PCCERT_CONTEXT
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   214
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   215
_crypt32.CertGetCertificateChain.argtypes = [
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   216
    ctypes.c_void_p,  # HCERTCHAINENGINE
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   217
    _PCCERT_CONTEXT,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   218
    ctypes.c_void_p,  # LPFILETIME
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   219
    ctypes.c_void_p,  # HCERTSTORE
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   220
    ctypes.c_void_p,  # PCERT_CHAIN_PARA
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   221
    _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   222
    ctypes.c_void_p,  # LPVOID
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   223
    ctypes.c_void_p,  # PCCERT_CHAIN_CONTEXT *
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   224
]
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   225
_crypt32.CertGetCertificateChain.restype = _BOOL
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   226
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   227
_crypt32.CertFreeCertificateContext.argtypes = [_PCCERT_CONTEXT]
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   228
_crypt32.CertFreeCertificateContext.restype = _BOOL
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   229
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   230
_kernel32.CreateFileA.argtypes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   231
    _LPCSTR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   232
    _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   233
    _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   234
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   235
    _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   236
    _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   237
    _HANDLE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   238
]
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   239
_kernel32.CreateFileA.restype = _HANDLE
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   240
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   241
_kernel32.GetFileInformationByHandle.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   242
_kernel32.GetFileInformationByHandle.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   243
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   244
_kernel32.CloseHandle.argtypes = [_HANDLE]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   245
_kernel32.CloseHandle.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   246
15095
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
   247
try:
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
   248
    _kernel32.CreateHardLinkA.argtypes = [_LPCSTR, _LPCSTR, ctypes.c_void_p]
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
   249
    _kernel32.CreateHardLinkA.restype = _BOOL
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
   250
except AttributeError:
ec222a29bdf0 win32: quietly ignore missing CreateHardLinkA for Wine
Matt Mackall <mpm@selenic.com>
parents: 14345
diff changeset
   251
    pass
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   252
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   253
_kernel32.SetFileAttributesA.argtypes = [_LPCSTR, _DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   254
_kernel32.SetFileAttributesA.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   255
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   256
_DRIVE_UNKNOWN = 0
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   257
_DRIVE_NO_ROOT_DIR = 1
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   258
_DRIVE_REMOVABLE = 2
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   259
_DRIVE_FIXED = 3
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   260
_DRIVE_REMOTE = 4
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   261
_DRIVE_CDROM = 5
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   262
_DRIVE_RAMDISK = 6
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   263
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   264
_kernel32.GetDriveTypeA.argtypes = [_LPCSTR]
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   265
_kernel32.GetDriveTypeA.restype = _UINT
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   266
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   267
_kernel32.GetVolumeInformationA.argtypes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   268
    _LPCSTR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   269
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   270
    _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   271
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   272
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   273
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   274
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   275
    _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   276
]
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   277
_kernel32.GetVolumeInformationA.restype = _BOOL
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   278
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   279
_kernel32.GetVolumePathNameA.argtypes = [_LPCSTR, ctypes.c_void_p, _DWORD]
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   280
_kernel32.GetVolumePathNameA.restype = _BOOL
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   281
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   282
_kernel32.OpenProcess.argtypes = [_DWORD, _BOOL, _DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   283
_kernel32.OpenProcess.restype = _HANDLE
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   284
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   285
_kernel32.GetExitCodeProcess.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   286
_kernel32.GetExitCodeProcess.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   287
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   288
_kernel32.GetLastError.argtypes = []
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   289
_kernel32.GetLastError.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   290
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   291
_kernel32.GetModuleFileNameA.argtypes = [_HANDLE, ctypes.c_void_p, _DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   292
_kernel32.GetModuleFileNameA.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   293
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   294
_kernel32.CreateProcessA.argtypes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   295
    _LPCSTR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   296
    _LPCSTR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   297
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   298
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   299
    _BOOL,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   300
    _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   301
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   302
    _LPCSTR,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   303
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   304
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   305
]
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   306
_kernel32.CreateProcessA.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   307
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   308
_kernel32.ExitProcess.argtypes = [_UINT]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   309
_kernel32.ExitProcess.restype = None
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   310
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   311
_kernel32.GetCurrentProcessId.argtypes = []
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   312
_kernel32.GetCurrentProcessId.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   313
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   314
_SIGNAL_HANDLER = ctypes.WINFUNCTYPE(_BOOL, _DWORD)
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   315
_kernel32.SetConsoleCtrlHandler.argtypes = [_SIGNAL_HANDLER, _BOOL]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   316
_kernel32.SetConsoleCtrlHandler.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   317
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   318
_kernel32.SetConsoleMode.argtypes = [_HANDLE, _DWORD]
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   319
_kernel32.SetConsoleMode.restype = _BOOL
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   320
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   321
_kernel32.GetConsoleMode.argtypes = [_HANDLE, ctypes.c_void_p]
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   322
_kernel32.GetConsoleMode.restype = _BOOL
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   323
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   324
_kernel32.GetStdHandle.argtypes = [_DWORD]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   325
_kernel32.GetStdHandle.restype = _HANDLE
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   326
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   327
_kernel32.GetConsoleScreenBufferInfo.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   328
_kernel32.GetConsoleScreenBufferInfo.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   329
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   330
_advapi32.GetUserNameA.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   331
_advapi32.GetUserNameA.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   332
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   333
_user32.GetWindowThreadProcessId.argtypes = [_HANDLE, ctypes.c_void_p]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   334
_user32.GetWindowThreadProcessId.restype = _DWORD
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   335
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   336
_user32.ShowWindow.argtypes = [_HANDLE, ctypes.c_int]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   337
_user32.ShowWindow.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   338
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   339
_WNDENUMPROC = ctypes.WINFUNCTYPE(_BOOL, _HWND, _LPARAM)
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   340
_user32.EnumWindows.argtypes = [_WNDENUMPROC, _LPARAM]
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   341
_user32.EnumWindows.restype = _BOOL
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   342
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   343
_kernel32.PeekNamedPipe.argtypes = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   344
    _HANDLE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   345
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   346
    _DWORD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   347
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   348
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   349
    ctypes.c_void_p,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   350
]
24652
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   351
_kernel32.PeekNamedPipe.restype = _BOOL
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   352
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   353
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   354
def _raiseoserror(name):
33419
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
   355
    # Force the code to a signed int to avoid an 'int too large' error.
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
   356
    # See https://bugs.python.org/issue28474
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
   357
    code = _kernel32.GetLastError()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   358
    if code > 0x7FFFFFFF:
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   359
        code -= 2 ** 32
33419
7c33adc823e0 win32: work around a WinError problem handling HRESULT types
Matt Harbison <matt_harbison@yahoo.com>
parents: 32676
diff changeset
   360
    err = ctypes.WinError(code=code)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   361
    raise OSError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   362
        err.errno, r'%s: %s' % (encoding.strfromlocal(name), err.strerror)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   363
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   364
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   365
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   366
def _getfileinfo(name):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   367
    fh = _kernel32.CreateFileA(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   368
        name,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   369
        0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   370
        _FILE_SHARE_READ | _FILE_SHARE_WRITE | _FILE_SHARE_DELETE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   371
        None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   372
        _OPEN_EXISTING,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   373
        _FILE_FLAG_BACKUP_SEMANTICS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   374
        None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   375
    )
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   376
    if fh == _INVALID_HANDLE_VALUE:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   377
        _raiseoserror(name)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   378
    try:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   379
        fi = _BY_HANDLE_FILE_INFORMATION()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   380
        if not _kernel32.GetFileInformationByHandle(fh, ctypes.byref(fi)):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   381
            _raiseoserror(name)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   382
        return fi
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   383
    finally:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   384
        _kernel32.CloseHandle(fh)
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   385
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   386
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   387
def checkcertificatechain(cert, build=True):
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   388
    '''Tests the given certificate to see if there is a complete chain to a
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   389
       trusted root certificate.  As a side effect, missing certificates are
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   390
       downloaded and installed unless ``build=False``.  True is returned if a
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   391
       chain to a trusted root exists (even if built on the fly), otherwise
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   392
       False.  NB: A chain to a trusted root does NOT imply that the certificate
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   393
       is valid.
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   394
    '''
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   395
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   396
    chainctxptr = ctypes.POINTER(CERT_CHAIN_CONTEXT)
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   397
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   398
    pchainctx = chainctxptr()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   399
    chainpara = CERT_CHAIN_PARA(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   400
        cbSize=ctypes.sizeof(CERT_CHAIN_PARA), RequestedUsage=CERT_USAGE_MATCH()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   401
    )
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   402
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   403
    certctx = _crypt32.CertCreateCertificateContext(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   404
        X509_ASN_ENCODING, cert, len(cert)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   405
    )
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   406
    if certctx is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   407
        _raiseoserror(b'CertCreateCertificateContext')
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   408
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   409
    flags = 0
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   410
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   411
    if not build:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   412
        flags |= 0x100  # CERT_CHAIN_DISABLE_AUTH_ROOT_AUTO_UPDATE
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   413
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   414
    try:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   415
        # Building the certificate chain will update root certs as necessary.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   416
        if not _crypt32.CertGetCertificateChain(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   417
            None,  # hChainEngine
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   418
            certctx,  # pCertContext
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   419
            None,  # pTime
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   420
            None,  # hAdditionalStore
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   421
            ctypes.byref(chainpara),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   422
            flags,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   423
            None,  # pvReserved
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   424
            ctypes.byref(pchainctx),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   425
        ):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   426
            _raiseoserror(b'CertGetCertificateChain')
33492
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   427
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   428
        chainctx = pchainctx.contents
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   429
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   430
        return chainctx.dwErrorStatus & CERT_TRUST_IS_PARTIAL_CHAIN == 0
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   431
    finally:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   432
        if pchainctx:
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   433
            _crypt32.CertFreeCertificateChain(pchainctx)
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   434
        _crypt32.CertFreeCertificateContext(certctx)
14af04391fb9 win32: add a method to trigger the Crypto API to complete a certificate chain
Matt Harbison <matt_harbison@yahoo.com>
parents: 33419
diff changeset
   435
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   436
14235
b9e1b041744f rename util.os_link to oslink
Adrian Buehlmann <adrian@cadifra.com>
parents: 14230
diff changeset
   437
def oslink(src, dst):
13976
9ca1ff3d4f8c win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents: 13795
diff changeset
   438
    try:
9ca1ff3d4f8c win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents: 13795
diff changeset
   439
        if not _kernel32.CreateHardLinkA(dst, src, None):
9ca1ff3d4f8c win32: Wine doesn't know about hardlinks
Matt Mackall <mpm@selenic.com>
parents: 13795
diff changeset
   440
            _raiseoserror(src)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   441
    except AttributeError:  # Wine doesn't support this function
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   442
        _raiseoserror(src)
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   443
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   444
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   445
def nlinks(name):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   446
    '''return number of hardlinks for the given file'''
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   447
    return _getfileinfo(name).nNumberOfLinks
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   448
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   449
17006
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
   450
def samefile(path1, path2):
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
   451
    '''Returns whether path1 and path2 refer to the same file or directory.'''
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
   452
    res1 = _getfileinfo(path1)
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
   453
    res2 = _getfileinfo(path2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   454
    return (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   455
        res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   456
        and res1.nFileIndexHigh == res2.nFileIndexHigh
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   457
        and res1.nFileIndexLow == res2.nFileIndexLow
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   458
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   459
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
   460
17006
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
   461
def samedevice(path1, path2):
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
   462
    '''Returns whether path1 and path2 are on the same device.'''
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
   463
    res1 = _getfileinfo(path1)
6fc7fd72ba3e win32.py: let samefile and samedevice work on directories too
Adrian Buehlmann <adrian@cadifra.com>
parents: 16807
diff changeset
   464
    res2 = _getfileinfo(path2)
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   465
    return res1.dwVolumeSerialNumber == res2.dwVolumeSerialNumber
10218
750b7a4f01f6 Add support for relinking on Windows.
Siddharth Agarwal <sid.bugzilla@gmail.com>
parents: 9198
diff changeset
   466
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   467
24652
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   468
def peekpipe(pipe):
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   469
    handle = msvcrt.get_osfhandle(pipe.fileno())
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   470
    avail = _DWORD()
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   471
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   472
    if not _kernel32.PeekNamedPipe(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   473
        handle, None, 0, None, ctypes.byref(avail), None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   474
    ):
24652
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   475
        err = _kernel32.GetLastError()
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   476
        if err == _ERROR_BROKEN_PIPE:
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   477
            return 0
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   478
        raise ctypes.WinError(err)
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   479
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   480
    return avail.value
232bf0028596 win32: add a method to fetch the available pipe data size
Matt Harbison <matt_harbison@yahoo.com>
parents: 24494
diff changeset
   481
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   482
38533
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
   483
def lasterrorwaspipeerror(err):
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
   484
    if err.errno != errno.EINVAL:
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
   485
        return False
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
   486
    err = _kernel32.GetLastError()
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
   487
    return err == _ERROR_BROKEN_PIPE or err == _ERROR_NO_DATA
3a0f322af192 windows: fix incorrect detection of broken pipe when writing to pager
Sune Foldager <cryo@cyanite.org>
parents: 35550
diff changeset
   488
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   489
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   490
def testpid(pid):
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   491
    '''return True if pid is still running or unable to
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   492
    determine, False otherwise'''
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   493
    h = _kernel32.OpenProcess(_PROCESS_QUERY_INFORMATION, False, pid)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   494
    if h:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   495
        try:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   496
            status = _DWORD()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   497
            if _kernel32.GetExitCodeProcess(h, ctypes.byref(status)):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   498
                return status.value == _STILL_ACTIVE
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   499
        finally:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   500
            _kernel32.CloseHandle(h)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   501
    return _kernel32.GetLastError() != _ERROR_INVALID_PARAMETER
2054
e18beba54a7e fix exception handling on windows.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   502
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   503
14236
e949a008999d rename util.executable_path to executablepath
Adrian Buehlmann <adrian@cadifra.com>
parents: 14235
diff changeset
   504
def executablepath():
13376
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
   505
    '''return full path of hg.exe'''
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   506
    size = 600
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   507
    buf = ctypes.create_string_buffer(size + 1)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   508
    len = _kernel32.GetModuleFileNameA(None, ctypes.byref(buf), size)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   509
    if len == 0:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   510
        raise ctypes.WinError()  # Note: WinError is a function
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   511
    elif len == size:
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   512
        raise ctypes.WinError(_ERROR_INSUFFICIENT_BUFFER)
13376
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
   513
    return buf.value
60b5c6c3fd12 win32: new function executable_path
Adrian Buehlmann <adrian@cadifra.com>
parents: 13375
diff changeset
   514
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   515
35512
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   516
def getvolumename(path):
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   517
    """Get the mount point of the filesystem from a directory or file
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   518
    (best-effort)
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   519
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   520
    Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   521
    """
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   522
    # realpath() calls GetFullPathName()
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   523
    realpath = os.path.realpath(path)
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   524
35550
ed30934165c9 win32: do not call GetVolumePathName() with the minimum buffer length
Yuya Nishihara <yuya@tcha.org>
parents: 35549
diff changeset
   525
    # allocate at least MAX_PATH long since GetVolumePathName('c:\\', buf, 4)
ed30934165c9 win32: do not call GetVolumePathName() with the minimum buffer length
Yuya Nishihara <yuya@tcha.org>
parents: 35549
diff changeset
   526
    # somehow fails on Windows XP
ed30934165c9 win32: do not call GetVolumePathName() with the minimum buffer length
Yuya Nishihara <yuya@tcha.org>
parents: 35549
diff changeset
   527
    size = max(len(realpath), _MAX_PATH) + 1
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   528
    buf = ctypes.create_string_buffer(size)
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   529
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   530
    if not _kernel32.GetVolumePathNameA(realpath, ctypes.byref(buf), size):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   531
        raise ctypes.WinError()  # Note: WinError is a function
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   532
35512
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   533
    return buf.value
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   534
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   535
35512
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   536
def getfstype(path):
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   537
    """Get the filesystem type name from a directory or file (best-effort)
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   538
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   539
    Returns None if we are unsure. Raises OSError on ENOENT, EPERM, etc.
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   540
    """
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   541
    volume = getvolumename(path)
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   542
5cc1becd0493 win32: split a utility function to obtain the volume out of getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 35510
diff changeset
   543
    t = _kernel32.GetDriveTypeA(volume)
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   544
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   545
    if t == _DRIVE_REMOTE:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   546
        return b'cifs'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   547
    elif t not in (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   548
        _DRIVE_REMOVABLE,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   549
        _DRIVE_FIXED,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   550
        _DRIVE_CDROM,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   551
        _DRIVE_RAMDISK,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   552
    ):
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   553
        return None
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   554
35549
94a127152e25 win32: allocate buffer of maximum length for GetVolumeInformation()
Yuya Nishihara <yuya@tcha.org>
parents: 35512
diff changeset
   555
    size = _MAX_PATH + 1
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   556
    name = ctypes.create_string_buffer(size)
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   557
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   558
    if not _kernel32.GetVolumeInformationA(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   559
        volume, None, 0, None, None, None, ctypes.byref(name), size
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   560
    ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   561
        raise ctypes.WinError()  # Note: WinError is a function
35510
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   562
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   563
    return name.value
2062f7c2ac83 win32: implement util.getfstype()
Matt Harbison <matt_harbison@yahoo.com>
parents: 34022
diff changeset
   564
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   565
7890
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents: 7778
diff changeset
   566
def getuser():
e710f0f592b2 util: split out posix, windows, and win32 modules
Matt Mackall <mpm@selenic.com>
parents: 7778
diff changeset
   567
    '''return name of current user'''
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   568
    size = _DWORD(300)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   569
    buf = ctypes.create_string_buffer(size.value + 1)
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   570
    if not _advapi32.GetUserNameA(ctypes.byref(buf), ctypes.byref(size)):
24418
a2285e2fc949 win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21226
diff changeset
   571
        raise ctypes.WinError()
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   572
    return buf.value
4672
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
   573
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   574
14237
4d684d8210a1 rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents: 14236
diff changeset
   575
_signalhandler = []
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   576
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   577
14237
4d684d8210a1 rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents: 14236
diff changeset
   578
def setsignalhandler():
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   579
    '''Register a termination handler for console events including
4672
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
   580
    CTRL+C. python signal handlers do not work well with socket
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
   581
    operations.
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   582
    '''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   583
4672
272c0a09b203 Handle CTRL+C in serve under Windows.
Marcos Chaves <marcos.nospam@gmail.com>
parents: 4407
diff changeset
   584
    def handler(event):
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   585
        _kernel32.ExitProcess(1)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   586
14237
4d684d8210a1 rename util.set_signal_handler to setsignalhandler
Adrian Buehlmann <adrian@cadifra.com>
parents: 14236
diff changeset
   587
    if _signalhandler:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   588
        return  # already registered
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   589
    h = _SIGNAL_HANDLER(handler)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   590
    _signalhandler.append(h)  # needed to prevent garbage collection
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   591
    if not _kernel32.SetConsoleCtrlHandler(h, True):
24418
a2285e2fc949 win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21226
diff changeset
   592
        raise ctypes.WinError()
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   593
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   594
10240
3af4b39afe2a cmdutil: hide child window created by win32 spawndetached()
Patrick Mezard <pmezard@gmail.com>
parents: 10219
diff changeset
   595
def hidewindow():
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   596
    def callback(hwnd, pid):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   597
        wpid = _DWORD()
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   598
        _user32.GetWindowThreadProcessId(hwnd, ctypes.byref(wpid))
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   599
        if pid == wpid.value:
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   600
            _user32.ShowWindow(hwnd, _SW_HIDE)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   601
            return False  # stop enumerating windows
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   602
        return True
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   603
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   604
    pid = _kernel32.GetCurrentProcessId()
14345
bf9a105aed0a win32.py: add argtypes and restype
Adrian Buehlmann <adrian@cadifra.com>
parents: 14344
diff changeset
   605
    _user32.EnumWindows(_WNDENUMPROC(callback), pid)
11012
81631f0cf13b win32: detect console width on Windows
Patrick Mezard <pmezard@gmail.com>
parents: 10388
diff changeset
   606
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   607
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
   608
def termsize():
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   609
    # cmd.exe does not handle CR like a unix console, the CR is
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   610
    # counted in the line length. On 80 columns consoles, if 80
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   611
    # characters are written, the following CR won't apply on the
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   612
    # current line but on the new one. Keep room for it.
30313
392633d7860e scmutil: clarify that we explicitly do termwidth - 1 on Windows
Yuya Nishihara <yuya@tcha.org>
parents: 25994
diff changeset
   613
    width = 80 - 1
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
   614
    height = 25
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   615
    # Query stderr to avoid problems with redirections
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   616
    screenbuf = _kernel32.GetStdHandle(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   617
        _STD_ERROR_HANDLE
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   618
    )  # don't close the handle returned
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   619
    if screenbuf is None or screenbuf == _INVALID_HANDLE_VALUE:
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
   620
        return width, height
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   621
    csbi = _CONSOLE_SCREEN_BUFFER_INFO()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   622
    if not _kernel32.GetConsoleScreenBufferInfo(screenbuf, ctypes.byref(csbi)):
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
   623
        return width, height
30313
392633d7860e scmutil: clarify that we explicitly do termwidth - 1 on Windows
Yuya Nishihara <yuya@tcha.org>
parents: 25994
diff changeset
   624
    width = csbi.srWindow.Right - csbi.srWindow.Left  # don't '+ 1'
30314
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
   625
    height = csbi.srWindow.Bottom - csbi.srWindow.Top + 1
365812902904 scmutil: extend termwidth() to return terminal height, renamed to termsize()
Yuya Nishihara <yuya@tcha.org>
parents: 30313
diff changeset
   626
    return width, height
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   627
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   628
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   629
def enablevtmode():
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   630
    '''Enable virtual terminal mode for the associated console.  Return True if
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   631
    enabled, else False.'''
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   632
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   633
    ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   634
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   635
    handle = _kernel32.GetStdHandle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   636
        _STD_OUTPUT_HANDLE
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   637
    )  # don't close the handle
32664
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   638
    if handle == _INVALID_HANDLE_VALUE:
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   639
        return False
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   640
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   641
    mode = _DWORD(0)
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   642
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   643
    if not _kernel32.GetConsoleMode(handle, ctypes.byref(mode)):
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   644
        return False
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   645
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   646
    if (mode.value & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0:
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   647
        mode.value |= ENABLE_VIRTUAL_TERMINAL_PROCESSING
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   648
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   649
        if not _kernel32.SetConsoleMode(handle, mode):
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   650
            return False
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   651
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   652
    return True
2d56e6d23be7 win32: add a method to enable ANSI color code processing on Windows 10
Matt Harbison <matt_harbison@yahoo.com>
parents: 30667
diff changeset
   653
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   654
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   655
def spawndetached(args):
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   656
    # No standard library function really spawns a fully detached
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   657
    # process under win32 because they allocate pipes or other objects
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   658
    # to handle standard streams communications. Passing these objects
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   659
    # to the child process requires handle inheritance to be enabled
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   660
    # which makes really detached processes impossible.
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   661
    si = _STARTUPINFO()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   662
    si.cb = ctypes.sizeof(_STARTUPINFO)
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   663
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   664
    pi = _PROCESS_INFORMATION()
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   665
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   666
    env = b''
30637
344e68882cd3 py3: replace os.environ with encoding.environ (part 4 of 5)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30314
diff changeset
   667
    for k in encoding.environ:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   668
        env += b"%s=%s\0" % (k, encoding.environ[k])
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   669
    if not env:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   670
        env = b'\0'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   671
    env += b'\0'
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   672
39719
255d1885c7f8 py3: resolve Unicode issues around `hg serve` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39611
diff changeset
   673
    args = subprocess.list2cmdline(pycompat.rapply(encoding.strfromlocal, args))
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   674
39719
255d1885c7f8 py3: resolve Unicode issues around `hg serve` on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 39611
diff changeset
   675
    # TODO: CreateProcessW on py3?
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   676
    res = _kernel32.CreateProcessA(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   677
        None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   678
        encoding.strtolocal(args),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   679
        None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   680
        None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   681
        False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   682
        _CREATE_NO_WINDOW,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   683
        env,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   684
        encoding.getcwd(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   685
        ctypes.byref(si),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   686
        ctypes.byref(pi),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   687
    )
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   688
    if not res:
24418
a2285e2fc949 win32: 'raise ctypes.WinError' -> 'raise ctypes.WinError()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 21226
diff changeset
   689
        raise ctypes.WinError()
13375
f1fa8f481c7c port win32.py to using the Python ctypes library
Adrian Buehlmann <adrian@cadifra.com>
parents: 13374
diff changeset
   690
40928
576474baa209 win32: close the handles associated with a spawned child process
Matt Harbison <matt_harbison@yahoo.com>
parents: 39818
diff changeset
   691
    _kernel32.CloseHandle(pi.hProcess)
576474baa209 win32: close the handles associated with a spawned child process
Matt Harbison <matt_harbison@yahoo.com>
parents: 39818
diff changeset
   692
    _kernel32.CloseHandle(pi.hThread)
576474baa209 win32: close the handles associated with a spawned child process
Matt Harbison <matt_harbison@yahoo.com>
parents: 39818
diff changeset
   693
32676
4c3d9ee87382 win32: drop a py26 daemonizing hack
Matt Harbison <matt_harbison@yahoo.com>
parents: 32664
diff changeset
   694
    return pi.dwProcessId
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   695
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   696
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   697
def unlink(f):
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   698
    '''try to implement POSIX' unlink semantics on Windows'''
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   699
21226
4898c37e03c0 win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents: 21193
diff changeset
   700
    if os.path.isdir(f):
4898c37e03c0 win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents: 21193
diff changeset
   701
        # use EPERM because it is POSIX prescribed value, even though
4898c37e03c0 win32: backout 1a9ebc83a74c
Steve Borho <steve@borho.org>
parents: 21193
diff changeset
   702
        # unlink(2) on directories returns EISDIR on Linux
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   703
        raise IOError(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   704
            errno.EPERM,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   705
            r"Unlinking directory not permitted: '%s'"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   706
            % encoding.strfromlocal(f),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   707
        )
19159
1b329f8c7b24 windows: check target type before actual unlinking to follow POSIX semantics
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 18959
diff changeset
   708
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   709
    # POSIX allows to unlink and rename open files. Windows has serious
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   710
    # problems with doing that:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   711
    # - Calling os.unlink (or os.rename) on a file f fails if f or any
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   712
    #   hardlinked copy of f has been opened with Python's open(). There is no
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   713
    #   way such a file can be deleted or renamed on Windows (other than
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   714
    #   scheduling the delete or rename for the next reboot).
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   715
    # - Calling os.unlink on a file that has been opened with Mercurial's
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   716
    #   posixfile (or comparable methods) will delay the actual deletion of
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   717
    #   the file for as long as the file is held open. The filename is blocked
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   718
    #   during that time and cannot be used for recreating a new file under
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   719
    #   that same name ("zombie file"). Directories containing such zombie files
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   720
    #   cannot be removed or moved.
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   721
    # A file that has been opened with posixfile can be renamed, so we rename
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   722
    # f to a random temporary name before calling os.unlink on it. This allows
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   723
    # callers to recreate f immediately while having other readers do their
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   724
    # implicit zombie filename blocking on a temporary name.
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   725
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38533
diff changeset
   726
    for tries in pycompat.xrange(10):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   727
        temp = b'%s-%08x' % (f, random.randint(0, 0xFFFFFFFF))
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   728
        try:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   729
            os.rename(f, temp)  # raises OSError EEXIST if temp exists
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   730
            break
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24652
diff changeset
   731
        except OSError as e:
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   732
            if e.errno != errno.EEXIST:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   733
                raise
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   734
    else:
39762
edaa40dc5fe5 py3: create built in exceptions with str type messages in win32.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 39719
diff changeset
   735
        raise IOError(errno.EEXIST, r"No usable temporary filename found")
13775
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   736
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   737
    try:
930efdc6bfa4 windows: move unlink to win32.py
Adrian Buehlmann <adrian@cadifra.com>
parents: 13379
diff changeset
   738
        os.unlink(temp)
13776
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   739
    except OSError:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   740
        # The unlink might have failed because the READONLY attribute may heave
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   741
        # been set on the original file. Rename works fine with READONLY set,
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   742
        # but not os.unlink. Reset all attributes and try again.
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   743
        _kernel32.SetFileAttributesA(temp, _FILE_ATTRIBUTE_NORMAL)
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   744
        try:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   745
            os.unlink(temp)
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   746
        except OSError:
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   747
            # The unlink might have failed due to some very rude AV-Scanners.
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   748
            # Leaking a tempfile is the lesser evil than aborting here and
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   749
            # leaving some potentially serious inconsistencies.
a2f0fdb1e488 win32: remove READONLY attribute on unlink
Adrian Buehlmann <adrian@cadifra.com>
parents: 13775
diff changeset
   750
            pass
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
   751
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 40928
diff changeset
   752
13795
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
   753
def makedir(path, notindexed):
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
   754
    os.mkdir(path)
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
   755
    if notindexed:
43b5fe18ea6c set NOT_CONTENT_INDEXED on .hg dir (issue2694)
Adrian Buehlmann <adrian@cadifra.com>
parents: 13776
diff changeset
   756
        _kernel32.SetFileAttributesA(path, _FILE_ATTRIBUTE_NOT_CONTENT_INDEXED)