367 lines
11 KiB
Python
367 lines
11 KiB
Python
#! python
|
|
#
|
|
# Constants and types for use with Windows API, used by serialwin32.py
|
|
#
|
|
# This file is part of pySerial. https://github.com/pyserial/pyserial
|
|
# (C) 2001-2015 Chris Liechti <cliechti@gmx.net>
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
# pylint: disable=invalid-name,too-few-public-methods,protected-access,too-many-instance-attributes
|
|
|
|
from __future__ import absolute_import
|
|
|
|
from ctypes import c_ulong, c_void_p, c_int64, c_char, \
|
|
WinDLL, sizeof, Structure, Union, POINTER
|
|
from ctypes.wintypes import HANDLE
|
|
from ctypes.wintypes import BOOL
|
|
from ctypes.wintypes import LPCWSTR
|
|
from ctypes.wintypes import DWORD
|
|
from ctypes.wintypes import WORD
|
|
from ctypes.wintypes import BYTE
|
|
_stdcall_libraries = {}
|
|
_stdcall_libraries['kernel32'] = WinDLL('kernel32')
|
|
|
|
INVALID_HANDLE_VALUE = HANDLE(-1).value
|
|
|
|
|
|
# some details of the windows API differ between 32 and 64 bit systems..
|
|
def is_64bit():
|
|
"""Returns true when running on a 64 bit system"""
|
|
return sizeof(c_ulong) != sizeof(c_void_p)
|
|
|
|
# ULONG_PTR is a an ordinary number, not a pointer and contrary to the name it
|
|
# is either 32 or 64 bits, depending on the type of windows...
|
|
# so test if this a 32 bit windows...
|
|
if is_64bit():
|
|
ULONG_PTR = c_int64
|
|
else:
|
|
ULONG_PTR = c_ulong
|
|
|
|
|
|
class _SECURITY_ATTRIBUTES(Structure):
|
|
pass
|
|
LPSECURITY_ATTRIBUTES = POINTER(_SECURITY_ATTRIBUTES)
|
|
|
|
|
|
try:
|
|
CreateEventW = _stdcall_libraries['kernel32'].CreateEventW
|
|
except AttributeError:
|
|
# Fallback to non wide char version for old OS...
|
|
from ctypes.wintypes import LPCSTR
|
|
CreateEventA = _stdcall_libraries['kernel32'].CreateEventA
|
|
CreateEventA.restype = HANDLE
|
|
CreateEventA.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCSTR]
|
|
CreateEvent = CreateEventA
|
|
|
|
CreateFileA = _stdcall_libraries['kernel32'].CreateFileA
|
|
CreateFileA.restype = HANDLE
|
|
CreateFileA.argtypes = [LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
|
|
CreateFile = CreateFileA
|
|
else:
|
|
CreateEventW.restype = HANDLE
|
|
CreateEventW.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR]
|
|
CreateEvent = CreateEventW # alias
|
|
|
|
CreateFileW = _stdcall_libraries['kernel32'].CreateFileW
|
|
CreateFileW.restype = HANDLE
|
|
CreateFileW.argtypes = [LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
|
|
CreateFile = CreateFileW # alias
|
|
|
|
|
|
class _OVERLAPPED(Structure):
|
|
pass
|
|
|
|
OVERLAPPED = _OVERLAPPED
|
|
|
|
|
|
class _COMSTAT(Structure):
|
|
pass
|
|
|
|
COMSTAT = _COMSTAT
|
|
|
|
|
|
class _DCB(Structure):
|
|
pass
|
|
|
|
DCB = _DCB
|
|
|
|
|
|
class _COMMTIMEOUTS(Structure):
|
|
pass
|
|
|
|
COMMTIMEOUTS = _COMMTIMEOUTS
|
|
|
|
GetLastError = _stdcall_libraries['kernel32'].GetLastError
|
|
GetLastError.restype = DWORD
|
|
GetLastError.argtypes = []
|
|
|
|
LPOVERLAPPED = POINTER(_OVERLAPPED)
|
|
LPDWORD = POINTER(DWORD)
|
|
|
|
GetOverlappedResult = _stdcall_libraries['kernel32'].GetOverlappedResult
|
|
GetOverlappedResult.restype = BOOL
|
|
GetOverlappedResult.argtypes = [HANDLE, LPOVERLAPPED, LPDWORD, BOOL]
|
|
|
|
ResetEvent = _stdcall_libraries['kernel32'].ResetEvent
|
|
ResetEvent.restype = BOOL
|
|
ResetEvent.argtypes = [HANDLE]
|
|
|
|
LPCVOID = c_void_p
|
|
|
|
WriteFile = _stdcall_libraries['kernel32'].WriteFile
|
|
WriteFile.restype = BOOL
|
|
WriteFile.argtypes = [HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED]
|
|
|
|
LPVOID = c_void_p
|
|
|
|
ReadFile = _stdcall_libraries['kernel32'].ReadFile
|
|
ReadFile.restype = BOOL
|
|
ReadFile.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED]
|
|
|
|
CloseHandle = _stdcall_libraries['kernel32'].CloseHandle
|
|
CloseHandle.restype = BOOL
|
|
CloseHandle.argtypes = [HANDLE]
|
|
|
|
ClearCommBreak = _stdcall_libraries['kernel32'].ClearCommBreak
|
|
ClearCommBreak.restype = BOOL
|
|
ClearCommBreak.argtypes = [HANDLE]
|
|
|
|
LPCOMSTAT = POINTER(_COMSTAT)
|
|
|
|
ClearCommError = _stdcall_libraries['kernel32'].ClearCommError
|
|
ClearCommError.restype = BOOL
|
|
ClearCommError.argtypes = [HANDLE, LPDWORD, LPCOMSTAT]
|
|
|
|
SetupComm = _stdcall_libraries['kernel32'].SetupComm
|
|
SetupComm.restype = BOOL
|
|
SetupComm.argtypes = [HANDLE, DWORD, DWORD]
|
|
|
|
EscapeCommFunction = _stdcall_libraries['kernel32'].EscapeCommFunction
|
|
EscapeCommFunction.restype = BOOL
|
|
EscapeCommFunction.argtypes = [HANDLE, DWORD]
|
|
|
|
GetCommModemStatus = _stdcall_libraries['kernel32'].GetCommModemStatus
|
|
GetCommModemStatus.restype = BOOL
|
|
GetCommModemStatus.argtypes = [HANDLE, LPDWORD]
|
|
|
|
LPDCB = POINTER(_DCB)
|
|
|
|
GetCommState = _stdcall_libraries['kernel32'].GetCommState
|
|
GetCommState.restype = BOOL
|
|
GetCommState.argtypes = [HANDLE, LPDCB]
|
|
|
|
LPCOMMTIMEOUTS = POINTER(_COMMTIMEOUTS)
|
|
|
|
GetCommTimeouts = _stdcall_libraries['kernel32'].GetCommTimeouts
|
|
GetCommTimeouts.restype = BOOL
|
|
GetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
|
|
|
|
PurgeComm = _stdcall_libraries['kernel32'].PurgeComm
|
|
PurgeComm.restype = BOOL
|
|
PurgeComm.argtypes = [HANDLE, DWORD]
|
|
|
|
SetCommBreak = _stdcall_libraries['kernel32'].SetCommBreak
|
|
SetCommBreak.restype = BOOL
|
|
SetCommBreak.argtypes = [HANDLE]
|
|
|
|
SetCommMask = _stdcall_libraries['kernel32'].SetCommMask
|
|
SetCommMask.restype = BOOL
|
|
SetCommMask.argtypes = [HANDLE, DWORD]
|
|
|
|
SetCommState = _stdcall_libraries['kernel32'].SetCommState
|
|
SetCommState.restype = BOOL
|
|
SetCommState.argtypes = [HANDLE, LPDCB]
|
|
|
|
SetCommTimeouts = _stdcall_libraries['kernel32'].SetCommTimeouts
|
|
SetCommTimeouts.restype = BOOL
|
|
SetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
|
|
|
|
WaitForSingleObject = _stdcall_libraries['kernel32'].WaitForSingleObject
|
|
WaitForSingleObject.restype = DWORD
|
|
WaitForSingleObject.argtypes = [HANDLE, DWORD]
|
|
|
|
WaitCommEvent = _stdcall_libraries['kernel32'].WaitCommEvent
|
|
WaitCommEvent.restype = BOOL
|
|
WaitCommEvent.argtypes = [HANDLE, LPDWORD, LPOVERLAPPED]
|
|
|
|
CancelIoEx = _stdcall_libraries['kernel32'].CancelIoEx
|
|
CancelIoEx.restype = BOOL
|
|
CancelIoEx.argtypes = [HANDLE, LPOVERLAPPED]
|
|
|
|
ONESTOPBIT = 0 # Variable c_int
|
|
TWOSTOPBITS = 2 # Variable c_int
|
|
ONE5STOPBITS = 1
|
|
|
|
NOPARITY = 0 # Variable c_int
|
|
ODDPARITY = 1 # Variable c_int
|
|
EVENPARITY = 2 # Variable c_int
|
|
MARKPARITY = 3
|
|
SPACEPARITY = 4
|
|
|
|
RTS_CONTROL_HANDSHAKE = 2 # Variable c_int
|
|
RTS_CONTROL_DISABLE = 0 # Variable c_int
|
|
RTS_CONTROL_ENABLE = 1 # Variable c_int
|
|
RTS_CONTROL_TOGGLE = 3 # Variable c_int
|
|
SETRTS = 3
|
|
CLRRTS = 4
|
|
|
|
DTR_CONTROL_HANDSHAKE = 2 # Variable c_int
|
|
DTR_CONTROL_DISABLE = 0 # Variable c_int
|
|
DTR_CONTROL_ENABLE = 1 # Variable c_int
|
|
SETDTR = 5
|
|
CLRDTR = 6
|
|
|
|
MS_DSR_ON = 32 # Variable c_ulong
|
|
EV_RING = 256 # Variable c_int
|
|
EV_PERR = 512 # Variable c_int
|
|
EV_ERR = 128 # Variable c_int
|
|
SETXOFF = 1 # Variable c_int
|
|
EV_RXCHAR = 1 # Variable c_int
|
|
GENERIC_WRITE = 1073741824 # Variable c_long
|
|
PURGE_TXCLEAR = 4 # Variable c_int
|
|
FILE_FLAG_OVERLAPPED = 1073741824 # Variable c_int
|
|
EV_DSR = 16 # Variable c_int
|
|
MAXDWORD = 4294967295 # Variable c_uint
|
|
EV_RLSD = 32 # Variable c_int
|
|
|
|
ERROR_SUCCESS = 0
|
|
ERROR_NOT_ENOUGH_MEMORY = 8
|
|
ERROR_OPERATION_ABORTED = 995
|
|
ERROR_IO_INCOMPLETE = 996
|
|
ERROR_IO_PENDING = 997 # Variable c_long
|
|
ERROR_INVALID_USER_BUFFER = 1784
|
|
|
|
MS_CTS_ON = 16 # Variable c_ulong
|
|
EV_EVENT1 = 2048 # Variable c_int
|
|
EV_RX80FULL = 1024 # Variable c_int
|
|
PURGE_RXABORT = 2 # Variable c_int
|
|
FILE_ATTRIBUTE_NORMAL = 128 # Variable c_int
|
|
PURGE_TXABORT = 1 # Variable c_int
|
|
SETXON = 2 # Variable c_int
|
|
OPEN_EXISTING = 3 # Variable c_int
|
|
MS_RING_ON = 64 # Variable c_ulong
|
|
EV_TXEMPTY = 4 # Variable c_int
|
|
EV_RXFLAG = 2 # Variable c_int
|
|
MS_RLSD_ON = 128 # Variable c_ulong
|
|
GENERIC_READ = 2147483648 # Variable c_ulong
|
|
EV_EVENT2 = 4096 # Variable c_int
|
|
EV_CTS = 8 # Variable c_int
|
|
EV_BREAK = 64 # Variable c_int
|
|
PURGE_RXCLEAR = 8 # Variable c_int
|
|
INFINITE = 0xFFFFFFFF
|
|
|
|
CE_RXOVER = 0x0001
|
|
CE_OVERRUN = 0x0002
|
|
CE_RXPARITY = 0x0004
|
|
CE_FRAME = 0x0008
|
|
CE_BREAK = 0x0010
|
|
|
|
|
|
class N11_OVERLAPPED4DOLLAR_48E(Union):
|
|
pass
|
|
|
|
|
|
class N11_OVERLAPPED4DOLLAR_484DOLLAR_49E(Structure):
|
|
pass
|
|
|
|
|
|
N11_OVERLAPPED4DOLLAR_484DOLLAR_49E._fields_ = [
|
|
('Offset', DWORD),
|
|
('OffsetHigh', DWORD),
|
|
]
|
|
|
|
PVOID = c_void_p
|
|
|
|
N11_OVERLAPPED4DOLLAR_48E._anonymous_ = ['_0']
|
|
N11_OVERLAPPED4DOLLAR_48E._fields_ = [
|
|
('_0', N11_OVERLAPPED4DOLLAR_484DOLLAR_49E),
|
|
('Pointer', PVOID),
|
|
]
|
|
_OVERLAPPED._anonymous_ = ['_0']
|
|
_OVERLAPPED._fields_ = [
|
|
('Internal', ULONG_PTR),
|
|
('InternalHigh', ULONG_PTR),
|
|
('_0', N11_OVERLAPPED4DOLLAR_48E),
|
|
('hEvent', HANDLE),
|
|
]
|
|
_SECURITY_ATTRIBUTES._fields_ = [
|
|
('nLength', DWORD),
|
|
('lpSecurityDescriptor', LPVOID),
|
|
('bInheritHandle', BOOL),
|
|
]
|
|
_COMSTAT._fields_ = [
|
|
('fCtsHold', DWORD, 1),
|
|
('fDsrHold', DWORD, 1),
|
|
('fRlsdHold', DWORD, 1),
|
|
('fXoffHold', DWORD, 1),
|
|
('fXoffSent', DWORD, 1),
|
|
('fEof', DWORD, 1),
|
|
('fTxim', DWORD, 1),
|
|
('fReserved', DWORD, 25),
|
|
('cbInQue', DWORD),
|
|
('cbOutQue', DWORD),
|
|
]
|
|
_DCB._fields_ = [
|
|
('DCBlength', DWORD),
|
|
('BaudRate', DWORD),
|
|
('fBinary', DWORD, 1),
|
|
('fParity', DWORD, 1),
|
|
('fOutxCtsFlow', DWORD, 1),
|
|
('fOutxDsrFlow', DWORD, 1),
|
|
('fDtrControl', DWORD, 2),
|
|
('fDsrSensitivity', DWORD, 1),
|
|
('fTXContinueOnXoff', DWORD, 1),
|
|
('fOutX', DWORD, 1),
|
|
('fInX', DWORD, 1),
|
|
('fErrorChar', DWORD, 1),
|
|
('fNull', DWORD, 1),
|
|
('fRtsControl', DWORD, 2),
|
|
('fAbortOnError', DWORD, 1),
|
|
('fDummy2', DWORD, 17),
|
|
('wReserved', WORD),
|
|
('XonLim', WORD),
|
|
('XoffLim', WORD),
|
|
('ByteSize', BYTE),
|
|
('Parity', BYTE),
|
|
('StopBits', BYTE),
|
|
('XonChar', c_char),
|
|
('XoffChar', c_char),
|
|
('ErrorChar', c_char),
|
|
('EofChar', c_char),
|
|
('EvtChar', c_char),
|
|
('wReserved1', WORD),
|
|
]
|
|
_COMMTIMEOUTS._fields_ = [
|
|
('ReadIntervalTimeout', DWORD),
|
|
('ReadTotalTimeoutMultiplier', DWORD),
|
|
('ReadTotalTimeoutConstant', DWORD),
|
|
('WriteTotalTimeoutMultiplier', DWORD),
|
|
('WriteTotalTimeoutConstant', DWORD),
|
|
]
|
|
__all__ = ['GetLastError', 'MS_CTS_ON', 'FILE_ATTRIBUTE_NORMAL',
|
|
'DTR_CONTROL_ENABLE', '_COMSTAT', 'MS_RLSD_ON',
|
|
'GetOverlappedResult', 'SETXON', 'PURGE_TXABORT',
|
|
'PurgeComm', 'N11_OVERLAPPED4DOLLAR_48E', 'EV_RING',
|
|
'ONESTOPBIT', 'SETXOFF', 'PURGE_RXABORT', 'GetCommState',
|
|
'RTS_CONTROL_ENABLE', '_DCB', 'CreateEvent',
|
|
'_COMMTIMEOUTS', '_SECURITY_ATTRIBUTES', 'EV_DSR',
|
|
'EV_PERR', 'EV_RXFLAG', 'OPEN_EXISTING', 'DCB',
|
|
'FILE_FLAG_OVERLAPPED', 'EV_CTS', 'SetupComm',
|
|
'LPOVERLAPPED', 'EV_TXEMPTY', 'ClearCommBreak',
|
|
'LPSECURITY_ATTRIBUTES', 'SetCommBreak', 'SetCommTimeouts',
|
|
'COMMTIMEOUTS', 'ODDPARITY', 'EV_RLSD',
|
|
'GetCommModemStatus', 'EV_EVENT2', 'PURGE_TXCLEAR',
|
|
'EV_BREAK', 'EVENPARITY', 'LPCVOID', 'COMSTAT', 'ReadFile',
|
|
'PVOID', '_OVERLAPPED', 'WriteFile', 'GetCommTimeouts',
|
|
'ResetEvent', 'EV_RXCHAR', 'LPCOMSTAT', 'ClearCommError',
|
|
'ERROR_IO_PENDING', 'EscapeCommFunction', 'GENERIC_READ',
|
|
'RTS_CONTROL_HANDSHAKE', 'OVERLAPPED',
|
|
'DTR_CONTROL_HANDSHAKE', 'PURGE_RXCLEAR', 'GENERIC_WRITE',
|
|
'LPDCB', 'CreateEventW', 'SetCommMask', 'EV_EVENT1',
|
|
'SetCommState', 'LPVOID', 'CreateFileW', 'LPDWORD',
|
|
'EV_RX80FULL', 'TWOSTOPBITS', 'LPCOMMTIMEOUTS', 'MAXDWORD',
|
|
'MS_DSR_ON', 'MS_RING_ON',
|
|
'N11_OVERLAPPED4DOLLAR_484DOLLAR_49E', 'EV_ERR',
|
|
'ULONG_PTR', 'CreateFile', 'NOPARITY', 'CloseHandle']
|