def _enable() -> None:
        from ctypes import POINTER
        from ctypes import windll
        from ctypes import WinError
        from ctypes import WINFUNCTYPE
        from ctypes.wintypes import BOOL
        from ctypes.wintypes import DWORD
        from ctypes.wintypes import HANDLE

        STD_ERROR_HANDLE = -12
        ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4

        def bool_errcheck(result, func, args):
            if not result:
                raise WinError()
            return args

        GetStdHandle = WINFUNCTYPE(HANDLE, DWORD)(
            ('GetStdHandle', windll.kernel32),
            ((1, 'nStdHandle'), ),
        )

        GetConsoleMode = WINFUNCTYPE(BOOL, HANDLE, POINTER(DWORD))(
            ('GetConsoleMode', windll.kernel32),
            ((1, 'hConsoleHandle'), (2, 'lpMode')),
        )
        GetConsoleMode.errcheck = bool_errcheck

        SetConsoleMode = WINFUNCTYPE(BOOL, HANDLE, DWORD)(
            ('SetConsoleMode', windll.kernel32),
            ((1, 'hConsoleHandle'), (1, 'dwMode')),
        )
        SetConsoleMode.errcheck = bool_errcheck

        # As of Windows 10, the Windows console supports (some) ANSI escape
        # sequences, but it needs to be enabled using `SetConsoleMode` first.
        #
        # More info on the escape sequences supported:
        # https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx
        stderr = GetStdHandle(STD_ERROR_HANDLE)
        flags = GetConsoleMode(stderr)
        SetConsoleMode(stderr, flags | ENABLE_VIRTUAL_TERMINAL_PROCESSING)
def CheckFreeSpace(path):
    """Return path/drive free space (in bytes)."""
    if IS_WINDOWS:
        try:
            # pylint: disable=invalid-name
            get_disk_free_space_ex = WINFUNCTYPE(c_int, c_wchar_p,
                                                 POINTER(c_uint64),
                                                 POINTER(c_uint64),
                                                 POINTER(c_uint64))
            get_disk_free_space_ex = get_disk_free_space_ex(
                ('GetDiskFreeSpaceExW', windll.kernel32), (
                    (1, 'lpszPathName'),
                    (2, 'lpFreeUserSpace'),
                    (2, 'lpTotalSpace'),
                    (2, 'lpFreeSpace'),
                ))
        except AttributeError:
            get_disk_free_space_ex = WINFUNCTYPE(c_int, c_char_p,
                                                 POINTER(c_uint64),
                                                 POINTER(c_uint64),
                                                 POINTER(c_uint64))
            get_disk_free_space_ex = get_disk_free_space_ex(
                ('GetDiskFreeSpaceExA', windll.kernel32), (
                    (1, 'lpszPathName'),
                    (2, 'lpFreeUserSpace'),
                    (2, 'lpTotalSpace'),
                    (2, 'lpFreeSpace'),
                ))

        def GetDiskFreeSpaceExErrCheck(result, unused_func, args):
            if not result:
                raise WinError()
            return args[1].value

        get_disk_free_space_ex.errcheck = GetDiskFreeSpaceExErrCheck

        return get_disk_free_space_ex(os.getenv('SystemDrive'))
    else:
        (_, f_frsize, _, _, f_bavail, _, _, _, _, _) = os.statvfs(path)
        return f_frsize * f_bavail
Esempio n. 3
0
def CheckFreeSpace(path):
  """Return path/drive free space (in bytes)."""
  if IS_WINDOWS:
    try:
      # pylint: disable=invalid-name
      get_disk_free_space_ex = WINFUNCTYPE(c_int, c_wchar_p,
                                           POINTER(c_uint64),
                                           POINTER(c_uint64),
                                           POINTER(c_uint64))
      get_disk_free_space_ex = get_disk_free_space_ex(
          ('GetDiskFreeSpaceExW', windll.kernel32), (
              (1, 'lpszPathName'),
              (2, 'lpFreeUserSpace'),
              (2, 'lpTotalSpace'),
              (2, 'lpFreeSpace'),))
    except AttributeError:
      get_disk_free_space_ex = WINFUNCTYPE(c_int, c_char_p,
                                           POINTER(c_uint64),
                                           POINTER(c_uint64),
                                           POINTER(c_uint64))
      get_disk_free_space_ex = get_disk_free_space_ex(
          ('GetDiskFreeSpaceExA', windll.kernel32), (
              (1, 'lpszPathName'),
              (2, 'lpFreeUserSpace'),
              (2, 'lpTotalSpace'),
              (2, 'lpFreeSpace'),))

    def GetDiskFreeSpaceExErrCheck(result, unused_func, args):
      if not result:
        raise WinError()
      return args[1].value
    get_disk_free_space_ex.errcheck = GetDiskFreeSpaceExErrCheck

    return get_disk_free_space_ex(os.getenv('SystemDrive'))
  else:
    (_, f_frsize, _, _, f_bavail, _, _, _, _, _) = os.statvfs(path)
    return f_frsize * f_bavail
Esempio n. 4
0
def cwrap(name, restype, *args, **kw):
    params=(restype,) + tuple(x.typ for x in args)
    paramflags=tuple(x.spec for x in args)
    func=WINFUNCTYPE(*params)((name, kw.get('lib', user32)), paramflags)
    func.errcheck=kw.get('errcheck', default_errcheck)
    return func
Esempio n. 5
0
def cwrap(name, restype, *args, **kw):
    params=(restype,) + tuple(x.typ for x in args)
    paramflags=tuple(x.spec for x in args)
    func=WINFUNCTYPE(*params)((name, kw.get('lib', user32)), paramflags)
    func.errcheck=kw.get('errcheck', default_errcheck)
    return func
Esempio n. 6
0
def bool_errcheck(result, func, args):
    if not result:
        raise WinError()
    return args


GetStdHandle = WINFUNCTYPE(HANDLE, DWORD)(
    ("GetStdHandle", windll.kernel32),
    ((1, "nStdHandle"), ),
)

GetConsoleMode = WINFUNCTYPE(BOOL, HANDLE, POINTER(DWORD))(
    ("GetConsoleMode", windll.kernel32),
    ((1, "hConsoleHandle"), (2, "lpMode")),
)
GetConsoleMode.errcheck = bool_errcheck

SetConsoleMode = WINFUNCTYPE(BOOL, HANDLE, DWORD)(
    ("SetConsoleMode", windll.kernel32),
    ((1, "hConsoleHandle"), (1, "dwMode")),
)
SetConsoleMode.errcheck = bool_errcheck


def enable_virtual_terminal_processing():
    """As of Windows 10, the Windows console supports (some) ANSI escape
    sequences, but it needs to be enabled using `SetConsoleMode` first.

    More info on the escape sequences supported:
    https://msdn.microsoft.com/en-us/library/windows/desktop/mt638032(v=vs.85).aspx
Esempio n. 7
0
get_user32_api = lambda *args, **kwds: fptr_from_dll(user32, *args, **kwds)
get_kernel32_api = lambda *args, **kwds: fptr_from_dll(kernel32, *args, **kwds)

## ~~~ stdlib ~~~
strcpy = ctypes.cdll.msvcrt.strcpy
wcscpy = ctypes.cdll.msvcrt.wcscpy
wcscpy_s = ctypes.cdll.msvcrt.wcscpy_s

## ~~~ WindowsAPI ~~~
_en = errcheck_null

FindWindow = WINFUNCTYPE(HWND, HWND, LPCTSTR)(
    ('FindWindowW', user32),
    ((1, 'lpClassName'), (1, 'lpWindowName'))
    )
FindWindow.errcheck = _en

FindWindowEx = WINFUNCTYPE(HWND, HWND, HWND, LPCTSTR, LPCTSTR)(
    ('FindWindowExW', user32),
    ((1, 'hwndParent'),
     (1, 'hwndChildAfter'),
     (1, 'lpClassName'),
     (1, 'lpWindowName'),
     ))
FindWindowEx.errcheck = _en

GetClassNameW = WINFUNCTYPE(INT, HWND, LPTSTR, INT)(
    ('GetClassNameW', user32),
    ((1, 'hWnd'),
     (1, 'lpClassName'),
     (1, 'nMaxCount'),