blob: ec380ec6f53aa715336189232902235b539dc4cc [file] [log] [blame]
cliechti183d4ae2009-07-23 22:03:51 +00001from ctypes import *
2from ctypes.wintypes import HANDLE
3from ctypes.wintypes import BOOL
4from ctypes.wintypes import LPCWSTR
5_stdcall_libraries = {}
6_stdcall_libraries['kernel32'] = WinDLL('kernel32')
7from ctypes.wintypes import DWORD
8from ctypes.wintypes import WORD
9from ctypes.wintypes import BYTE
10
cliechtie37b6a82009-07-24 12:19:50 +000011INVALID_HANDLE_VALUE = HANDLE(-1).value
cliechti183d4ae2009-07-23 22:03:51 +000012
cliechti251e5ce2011-08-25 01:24:49 +000013# some details of the windows API differ between 32 and 64 bit systems..
14def is_64bit():
15 """Returns true when running on a 64 bit system"""
16 return sizeof(c_ulong) != sizeof(c_void_p)
17
cliechtide432902011-08-18 22:51:41 +000018# ULONG_PTR is a an ordinary number, not a pointer and contrary to the name it
19# is either 32 or 64 bits, depending on the type of windows...
20# so test if this a 32 bit windows...
cliechti251e5ce2011-08-25 01:24:49 +000021if is_64bit():
cliechtide432902011-08-18 22:51:41 +000022 # assume 64 bits
23 ULONG_PTR = c_int64
cliechti251e5ce2011-08-25 01:24:49 +000024else:
25 # 32 bits
26 ULONG_PTR = c_ulong
cliechtide432902011-08-18 22:51:41 +000027
28
cliechti183d4ae2009-07-23 22:03:51 +000029class _SECURITY_ATTRIBUTES(Structure):
30 pass
31LPSECURITY_ATTRIBUTES = POINTER(_SECURITY_ATTRIBUTES)
32
cliechtie37b6a82009-07-24 12:19:50 +000033
cliechti8a345132011-08-05 02:33:14 +000034try:
35 CreateEventW = _stdcall_libraries['kernel32'].CreateEventW
36except AttributeError:
37 # Fallback to non wide char version for old OS...
38 from ctypes.wintypes import LPCSTR
39 CreateEventA = _stdcall_libraries['kernel32'].CreateEventA
40 CreateEventA.restype = HANDLE
41 CreateEventA.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCSTR]
42 CreateEvent=CreateEventA
43
44 CreateFileA = _stdcall_libraries['kernel32'].CreateFileA
45 CreateFileA.restype = HANDLE
46 CreateFileA.argtypes = [LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
47 CreateFile = CreateFileA
48else:
49 CreateEventW.restype = HANDLE
50 CreateEventW.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR]
51 CreateEvent = CreateEventW # alias
52
53 CreateFileW = _stdcall_libraries['kernel32'].CreateFileW
54 CreateFileW.restype = HANDLE
55 CreateFileW.argtypes = [LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE]
56 CreateFile = CreateFileW # alias
cliechti183d4ae2009-07-23 22:03:51 +000057
58class _OVERLAPPED(Structure):
59 pass
60OVERLAPPED = _OVERLAPPED
61
62class _COMSTAT(Structure):
63 pass
64COMSTAT = _COMSTAT
65
66class _DCB(Structure):
67 pass
68DCB = _DCB
69
70class _COMMTIMEOUTS(Structure):
71 pass
72COMMTIMEOUTS = _COMMTIMEOUTS
73
74GetLastError = _stdcall_libraries['kernel32'].GetLastError
75GetLastError.restype = DWORD
76GetLastError.argtypes = []
77
78LPOVERLAPPED = POINTER(_OVERLAPPED)
79LPDWORD = POINTER(DWORD)
80
81GetOverlappedResult = _stdcall_libraries['kernel32'].GetOverlappedResult
82GetOverlappedResult.restype = BOOL
83GetOverlappedResult.argtypes = [HANDLE, LPOVERLAPPED, LPDWORD, BOOL]
84
85ResetEvent = _stdcall_libraries['kernel32'].ResetEvent
86ResetEvent.restype = BOOL
87ResetEvent.argtypes = [HANDLE]
88
89LPCVOID = c_void_p
90
91WriteFile = _stdcall_libraries['kernel32'].WriteFile
92WriteFile.restype = BOOL
93WriteFile.argtypes = [HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED]
94
95LPVOID = c_void_p
96
97ReadFile = _stdcall_libraries['kernel32'].ReadFile
98ReadFile.restype = BOOL
99ReadFile.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED]
100
101CloseHandle = _stdcall_libraries['kernel32'].CloseHandle
102CloseHandle.restype = BOOL
103CloseHandle.argtypes = [HANDLE]
104
105ClearCommBreak = _stdcall_libraries['kernel32'].ClearCommBreak
106ClearCommBreak.restype = BOOL
107ClearCommBreak.argtypes = [HANDLE]
108
109LPCOMSTAT = POINTER(_COMSTAT)
110
111ClearCommError = _stdcall_libraries['kernel32'].ClearCommError
112ClearCommError.restype = BOOL
113ClearCommError.argtypes = [HANDLE, LPDWORD, LPCOMSTAT]
114
115SetupComm = _stdcall_libraries['kernel32'].SetupComm
116SetupComm.restype = BOOL
117SetupComm.argtypes = [HANDLE, DWORD, DWORD]
118
119EscapeCommFunction = _stdcall_libraries['kernel32'].EscapeCommFunction
120EscapeCommFunction.restype = BOOL
121EscapeCommFunction.argtypes = [HANDLE, DWORD]
122
123GetCommModemStatus = _stdcall_libraries['kernel32'].GetCommModemStatus
124GetCommModemStatus.restype = BOOL
125GetCommModemStatus.argtypes = [HANDLE, LPDWORD]
126
127LPDCB = POINTER(_DCB)
128
129GetCommState = _stdcall_libraries['kernel32'].GetCommState
130GetCommState.restype = BOOL
131GetCommState.argtypes = [HANDLE, LPDCB]
132
133LPCOMMTIMEOUTS = POINTER(_COMMTIMEOUTS)
134
135GetCommTimeouts = _stdcall_libraries['kernel32'].GetCommTimeouts
136GetCommTimeouts.restype = BOOL
137GetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
138
139PurgeComm = _stdcall_libraries['kernel32'].PurgeComm
140PurgeComm.restype = BOOL
141PurgeComm.argtypes = [HANDLE, DWORD]
142
143SetCommBreak = _stdcall_libraries['kernel32'].SetCommBreak
144SetCommBreak.restype = BOOL
145SetCommBreak.argtypes = [HANDLE]
146
147SetCommMask = _stdcall_libraries['kernel32'].SetCommMask
148SetCommMask.restype = BOOL
149SetCommMask.argtypes = [HANDLE, DWORD]
150
151SetCommState = _stdcall_libraries['kernel32'].SetCommState
152SetCommState.restype = BOOL
153SetCommState.argtypes = [HANDLE, LPDCB]
154
155SetCommTimeouts = _stdcall_libraries['kernel32'].SetCommTimeouts
156SetCommTimeouts.restype = BOOL
157SetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS]
158
cliechtie37b6a82009-07-24 12:19:50 +0000159WaitForSingleObject = _stdcall_libraries['kernel32'].WaitForSingleObject
160WaitForSingleObject.restype = DWORD
161WaitForSingleObject.argtypes = [HANDLE, DWORD]
162
cliechti183d4ae2009-07-23 22:03:51 +0000163ONESTOPBIT = 0 # Variable c_int
164TWOSTOPBITS = 2 # Variable c_int
165ONE5STOPBITS = 1
166
167NOPARITY = 0 # Variable c_int
168ODDPARITY = 1 # Variable c_int
169EVENPARITY = 2 # Variable c_int
170MARKPARITY = 3
171SPACEPARITY = 4
172
cliechtie37b6a82009-07-24 12:19:50 +0000173RTS_CONTROL_HANDSHAKE = 2 # Variable c_int
174RTS_CONTROL_DISABLE = 0 # Variable c_int
175RTS_CONTROL_ENABLE = 1 # Variable c_int
cliechti1f89a0a2011-08-05 02:53:24 +0000176RTS_CONTROL_TOGGLE = 3 # Variable c_int
cliechtie37b6a82009-07-24 12:19:50 +0000177SETRTS = 3
178CLRRTS = 4
179
180DTR_CONTROL_HANDSHAKE = 2 # Variable c_int
181DTR_CONTROL_DISABLE = 0 # Variable c_int
182DTR_CONTROL_ENABLE = 1 # Variable c_int
183SETDTR = 5
184CLRDTR = 6
185
cliechti183d4ae2009-07-23 22:03:51 +0000186MS_DSR_ON = 32 # Variable c_ulong
187EV_RING = 256 # Variable c_int
188EV_PERR = 512 # Variable c_int
189EV_ERR = 128 # Variable c_int
190SETXOFF = 1 # Variable c_int
191EV_RXCHAR = 1 # Variable c_int
192GENERIC_WRITE = 1073741824 # Variable c_long
193PURGE_TXCLEAR = 4 # Variable c_int
194FILE_FLAG_OVERLAPPED = 1073741824 # Variable c_int
195EV_DSR = 16 # Variable c_int
Chris Liechti68340d72015-08-03 14:15:48 +0200196MAXDWORD = 4294967295 # Variable c_uint
cliechti183d4ae2009-07-23 22:03:51 +0000197EV_RLSD = 32 # Variable c_int
198ERROR_IO_PENDING = 997 # Variable c_long
199MS_CTS_ON = 16 # Variable c_ulong
200EV_EVENT1 = 2048 # Variable c_int
cliechti183d4ae2009-07-23 22:03:51 +0000201EV_RX80FULL = 1024 # Variable c_int
202PURGE_RXABORT = 2 # Variable c_int
203FILE_ATTRIBUTE_NORMAL = 128 # Variable c_int
204PURGE_TXABORT = 1 # Variable c_int
205SETXON = 2 # Variable c_int
206OPEN_EXISTING = 3 # Variable c_int
cliechti183d4ae2009-07-23 22:03:51 +0000207MS_RING_ON = 64 # Variable c_ulong
208EV_TXEMPTY = 4 # Variable c_int
209EV_RXFLAG = 2 # Variable c_int
cliechti183d4ae2009-07-23 22:03:51 +0000210MS_RLSD_ON = 128 # Variable c_ulong
Chris Liechti68340d72015-08-03 14:15:48 +0200211GENERIC_READ = 2147483648 # Variable c_ulong
cliechti183d4ae2009-07-23 22:03:51 +0000212EV_EVENT2 = 4096 # Variable c_int
213EV_CTS = 8 # Variable c_int
214EV_BREAK = 64 # Variable c_int
215PURGE_RXCLEAR = 8 # Variable c_int
Chris Liechti68340d72015-08-03 14:15:48 +0200216INFINITE = 0xFFFFFFFF
cliechti183d4ae2009-07-23 22:03:51 +0000217
cliechtide432902011-08-18 22:51:41 +0000218
cliechti183d4ae2009-07-23 22:03:51 +0000219class N11_OVERLAPPED4DOLLAR_48E(Union):
220 pass
221class N11_OVERLAPPED4DOLLAR_484DOLLAR_49E(Structure):
222 pass
223N11_OVERLAPPED4DOLLAR_484DOLLAR_49E._fields_ = [
224 ('Offset', DWORD),
225 ('OffsetHigh', DWORD),
226]
227
228PVOID = c_void_p
229
230N11_OVERLAPPED4DOLLAR_48E._anonymous_ = ['_0']
231N11_OVERLAPPED4DOLLAR_48E._fields_ = [
232 ('_0', N11_OVERLAPPED4DOLLAR_484DOLLAR_49E),
233 ('Pointer', PVOID),
234]
235_OVERLAPPED._anonymous_ = ['_0']
236_OVERLAPPED._fields_ = [
237 ('Internal', ULONG_PTR),
238 ('InternalHigh', ULONG_PTR),
239 ('_0', N11_OVERLAPPED4DOLLAR_48E),
240 ('hEvent', HANDLE),
241]
242_SECURITY_ATTRIBUTES._fields_ = [
243 ('nLength', DWORD),
244 ('lpSecurityDescriptor', LPVOID),
245 ('bInheritHandle', BOOL),
246]
247_COMSTAT._fields_ = [
248 ('fCtsHold', DWORD, 1),
249 ('fDsrHold', DWORD, 1),
250 ('fRlsdHold', DWORD, 1),
251 ('fXoffHold', DWORD, 1),
252 ('fXoffSent', DWORD, 1),
253 ('fEof', DWORD, 1),
254 ('fTxim', DWORD, 1),
255 ('fReserved', DWORD, 25),
256 ('cbInQue', DWORD),
257 ('cbOutQue', DWORD),
258]
259_DCB._fields_ = [
260 ('DCBlength', DWORD),
261 ('BaudRate', DWORD),
262 ('fBinary', DWORD, 1),
263 ('fParity', DWORD, 1),
264 ('fOutxCtsFlow', DWORD, 1),
265 ('fOutxDsrFlow', DWORD, 1),
266 ('fDtrControl', DWORD, 2),
267 ('fDsrSensitivity', DWORD, 1),
268 ('fTXContinueOnXoff', DWORD, 1),
269 ('fOutX', DWORD, 1),
270 ('fInX', DWORD, 1),
271 ('fErrorChar', DWORD, 1),
272 ('fNull', DWORD, 1),
273 ('fRtsControl', DWORD, 2),
274 ('fAbortOnError', DWORD, 1),
275 ('fDummy2', DWORD, 17),
276 ('wReserved', WORD),
277 ('XonLim', WORD),
278 ('XoffLim', WORD),
279 ('ByteSize', BYTE),
280 ('Parity', BYTE),
281 ('StopBits', BYTE),
282 ('XonChar', c_char),
283 ('XoffChar', c_char),
284 ('ErrorChar', c_char),
285 ('EofChar', c_char),
286 ('EvtChar', c_char),
287 ('wReserved1', WORD),
288]
289_COMMTIMEOUTS._fields_ = [
290 ('ReadIntervalTimeout', DWORD),
291 ('ReadTotalTimeoutMultiplier', DWORD),
292 ('ReadTotalTimeoutConstant', DWORD),
293 ('WriteTotalTimeoutMultiplier', DWORD),
294 ('WriteTotalTimeoutConstant', DWORD),
295]
296__all__ = ['GetLastError', 'MS_CTS_ON', 'FILE_ATTRIBUTE_NORMAL',
297 'DTR_CONTROL_ENABLE', '_COMSTAT', 'MS_RLSD_ON',
298 'GetOverlappedResult', 'SETXON', 'PURGE_TXABORT',
299 'PurgeComm', 'N11_OVERLAPPED4DOLLAR_48E', 'EV_RING',
300 'ONESTOPBIT', 'SETXOFF', 'PURGE_RXABORT', 'GetCommState',
301 'RTS_CONTROL_ENABLE', '_DCB', 'CreateEvent',
302 '_COMMTIMEOUTS', '_SECURITY_ATTRIBUTES', 'EV_DSR',
303 'EV_PERR', 'EV_RXFLAG', 'OPEN_EXISTING', 'DCB',
304 'FILE_FLAG_OVERLAPPED', 'EV_CTS', 'SetupComm',
305 'LPOVERLAPPED', 'EV_TXEMPTY', 'ClearCommBreak',
306 'LPSECURITY_ATTRIBUTES', 'SetCommBreak', 'SetCommTimeouts',
307 'COMMTIMEOUTS', 'ODDPARITY', 'EV_RLSD',
308 'GetCommModemStatus', 'EV_EVENT2', 'PURGE_TXCLEAR',
309 'EV_BREAK', 'EVENPARITY', 'LPCVOID', 'COMSTAT', 'ReadFile',
310 'PVOID', '_OVERLAPPED', 'WriteFile', 'GetCommTimeouts',
311 'ResetEvent', 'EV_RXCHAR', 'LPCOMSTAT', 'ClearCommError',
312 'ERROR_IO_PENDING', 'EscapeCommFunction', 'GENERIC_READ',
313 'RTS_CONTROL_HANDSHAKE', 'OVERLAPPED',
314 'DTR_CONTROL_HANDSHAKE', 'PURGE_RXCLEAR', 'GENERIC_WRITE',
315 'LPDCB', 'CreateEventW', 'SetCommMask', 'EV_EVENT1',
316 'SetCommState', 'LPVOID', 'CreateFileW', 'LPDWORD',
317 'EV_RX80FULL', 'TWOSTOPBITS', 'LPCOMMTIMEOUTS', 'MAXDWORD',
318 'MS_DSR_ON', 'MS_RING_ON',
319 'N11_OVERLAPPED4DOLLAR_484DOLLAR_49E', 'EV_ERR',
320 'ULONG_PTR', 'CreateFile', 'NOPARITY', 'CloseHandle']