|
1 | 1 | from __future__ import annotations |
2 | 2 |
|
3 | 3 | import enum |
4 | | -import re |
5 | 4 | from typing import TYPE_CHECKING, NewType, NoReturn, Protocol, cast |
6 | 5 |
|
7 | 6 | if TYPE_CHECKING: |
| 7 | + import cffi |
8 | 8 | from typing_extensions import TypeAlias |
9 | 9 |
|
10 | | -import cffi |
| 10 | + CData: TypeAlias = cffi.api.FFI.CData |
| 11 | + CType: TypeAlias = cffi.api.FFI.CType |
| 12 | + |
| 13 | +from ._generated_windows_ffi import ffi |
11 | 14 |
|
12 | 15 | ################################################################ |
13 | 16 | # Functions and types |
14 | 17 | ################################################################ |
15 | 18 |
|
16 | | -LIB = """ |
17 | | -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx |
18 | | -typedef int BOOL; |
19 | | -typedef unsigned char BYTE; |
20 | | -typedef BYTE BOOLEAN; |
21 | | -typedef void* PVOID; |
22 | | -typedef PVOID HANDLE; |
23 | | -typedef unsigned long DWORD; |
24 | | -typedef unsigned long ULONG; |
25 | | -typedef unsigned int NTSTATUS; |
26 | | -typedef unsigned long u_long; |
27 | | -typedef ULONG *PULONG; |
28 | | -typedef const void *LPCVOID; |
29 | | -typedef void *LPVOID; |
30 | | -typedef const wchar_t *LPCWSTR; |
31 | | -
|
32 | | -typedef uintptr_t ULONG_PTR; |
33 | | -typedef uintptr_t UINT_PTR; |
34 | | -
|
35 | | -typedef UINT_PTR SOCKET; |
36 | | -
|
37 | | -typedef struct _OVERLAPPED { |
38 | | - ULONG_PTR Internal; |
39 | | - ULONG_PTR InternalHigh; |
40 | | - union { |
41 | | - struct { |
42 | | - DWORD Offset; |
43 | | - DWORD OffsetHigh; |
44 | | - } DUMMYSTRUCTNAME; |
45 | | - PVOID Pointer; |
46 | | - } DUMMYUNIONNAME; |
47 | | -
|
48 | | - HANDLE hEvent; |
49 | | -} OVERLAPPED, *LPOVERLAPPED; |
50 | | -
|
51 | | -typedef OVERLAPPED WSAOVERLAPPED; |
52 | | -typedef LPOVERLAPPED LPWSAOVERLAPPED; |
53 | | -typedef PVOID LPSECURITY_ATTRIBUTES; |
54 | | -typedef PVOID LPCSTR; |
55 | | -
|
56 | | -typedef struct _OVERLAPPED_ENTRY { |
57 | | - ULONG_PTR lpCompletionKey; |
58 | | - LPOVERLAPPED lpOverlapped; |
59 | | - ULONG_PTR Internal; |
60 | | - DWORD dwNumberOfBytesTransferred; |
61 | | -} OVERLAPPED_ENTRY, *LPOVERLAPPED_ENTRY; |
62 | | -
|
63 | | -// kernel32.dll |
64 | | -HANDLE WINAPI CreateIoCompletionPort( |
65 | | - _In_ HANDLE FileHandle, |
66 | | - _In_opt_ HANDLE ExistingCompletionPort, |
67 | | - _In_ ULONG_PTR CompletionKey, |
68 | | - _In_ DWORD NumberOfConcurrentThreads |
69 | | -); |
70 | | -
|
71 | | -BOOL SetFileCompletionNotificationModes( |
72 | | - HANDLE FileHandle, |
73 | | - UCHAR Flags |
74 | | -); |
75 | | -
|
76 | | -HANDLE CreateFileW( |
77 | | - LPCWSTR lpFileName, |
78 | | - DWORD dwDesiredAccess, |
79 | | - DWORD dwShareMode, |
80 | | - LPSECURITY_ATTRIBUTES lpSecurityAttributes, |
81 | | - DWORD dwCreationDisposition, |
82 | | - DWORD dwFlagsAndAttributes, |
83 | | - HANDLE hTemplateFile |
84 | | -); |
85 | | -
|
86 | | -BOOL WINAPI CloseHandle( |
87 | | - _In_ HANDLE hObject |
88 | | -); |
89 | | -
|
90 | | -BOOL WINAPI PostQueuedCompletionStatus( |
91 | | - _In_ HANDLE CompletionPort, |
92 | | - _In_ DWORD dwNumberOfBytesTransferred, |
93 | | - _In_ ULONG_PTR dwCompletionKey, |
94 | | - _In_opt_ LPOVERLAPPED lpOverlapped |
95 | | -); |
96 | | -
|
97 | | -BOOL WINAPI GetQueuedCompletionStatusEx( |
98 | | - _In_ HANDLE CompletionPort, |
99 | | - _Out_ LPOVERLAPPED_ENTRY lpCompletionPortEntries, |
100 | | - _In_ ULONG ulCount, |
101 | | - _Out_ PULONG ulNumEntriesRemoved, |
102 | | - _In_ DWORD dwMilliseconds, |
103 | | - _In_ BOOL fAlertable |
104 | | -); |
105 | | -
|
106 | | -BOOL WINAPI CancelIoEx( |
107 | | - _In_ HANDLE hFile, |
108 | | - _In_opt_ LPOVERLAPPED lpOverlapped |
109 | | -); |
110 | | -
|
111 | | -BOOL WriteFile( |
112 | | - HANDLE hFile, |
113 | | - LPCVOID lpBuffer, |
114 | | - DWORD nNumberOfBytesToWrite, |
115 | | - LPDWORD lpNumberOfBytesWritten, |
116 | | - LPOVERLAPPED lpOverlapped |
117 | | -); |
118 | | -
|
119 | | -BOOL ReadFile( |
120 | | - HANDLE hFile, |
121 | | - LPVOID lpBuffer, |
122 | | - DWORD nNumberOfBytesToRead, |
123 | | - LPDWORD lpNumberOfBytesRead, |
124 | | - LPOVERLAPPED lpOverlapped |
125 | | -); |
126 | | -
|
127 | | -BOOL WINAPI SetConsoleCtrlHandler( |
128 | | - _In_opt_ void* HandlerRoutine, |
129 | | - _In_ BOOL Add |
130 | | -); |
131 | | -
|
132 | | -HANDLE CreateEventA( |
133 | | - LPSECURITY_ATTRIBUTES lpEventAttributes, |
134 | | - BOOL bManualReset, |
135 | | - BOOL bInitialState, |
136 | | - LPCSTR lpName |
137 | | -); |
138 | | -
|
139 | | -BOOL SetEvent( |
140 | | - HANDLE hEvent |
141 | | -); |
142 | | -
|
143 | | -BOOL ResetEvent( |
144 | | - HANDLE hEvent |
145 | | -); |
146 | | -
|
147 | | -DWORD WaitForSingleObject( |
148 | | - HANDLE hHandle, |
149 | | - DWORD dwMilliseconds |
150 | | -); |
151 | | -
|
152 | | -DWORD WaitForMultipleObjects( |
153 | | - DWORD nCount, |
154 | | - HANDLE *lpHandles, |
155 | | - BOOL bWaitAll, |
156 | | - DWORD dwMilliseconds |
157 | | -); |
158 | | -
|
159 | | -ULONG RtlNtStatusToDosError( |
160 | | - NTSTATUS Status |
161 | | -); |
162 | | -
|
163 | | -int WSAIoctl( |
164 | | - SOCKET s, |
165 | | - DWORD dwIoControlCode, |
166 | | - LPVOID lpvInBuffer, |
167 | | - DWORD cbInBuffer, |
168 | | - LPVOID lpvOutBuffer, |
169 | | - DWORD cbOutBuffer, |
170 | | - LPDWORD lpcbBytesReturned, |
171 | | - LPWSAOVERLAPPED lpOverlapped, |
172 | | - // actually LPWSAOVERLAPPED_COMPLETION_ROUTINE |
173 | | - void* lpCompletionRoutine |
174 | | -); |
175 | | -
|
176 | | -int WSAGetLastError(); |
177 | | -
|
178 | | -BOOL DeviceIoControl( |
179 | | - HANDLE hDevice, |
180 | | - DWORD dwIoControlCode, |
181 | | - LPVOID lpInBuffer, |
182 | | - DWORD nInBufferSize, |
183 | | - LPVOID lpOutBuffer, |
184 | | - DWORD nOutBufferSize, |
185 | | - LPDWORD lpBytesReturned, |
186 | | - LPOVERLAPPED lpOverlapped |
187 | | -); |
188 | | -
|
189 | | -// From https://github.com/piscisaureus/wepoll/blob/master/src/afd.h |
190 | | -typedef struct _AFD_POLL_HANDLE_INFO { |
191 | | - HANDLE Handle; |
192 | | - ULONG Events; |
193 | | - NTSTATUS Status; |
194 | | -} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO; |
195 | | -
|
196 | | -// This is really defined as a messy union to allow stuff like |
197 | | -// i.DUMMYSTRUCTNAME.LowPart, but we don't need those complications. |
198 | | -// Under all that it's just an int64. |
199 | | -typedef int64_t LARGE_INTEGER; |
200 | | -
|
201 | | -typedef struct _AFD_POLL_INFO { |
202 | | - LARGE_INTEGER Timeout; |
203 | | - ULONG NumberOfHandles; |
204 | | - ULONG Exclusive; |
205 | | - AFD_POLL_HANDLE_INFO Handles[1]; |
206 | | -} AFD_POLL_INFO, *PAFD_POLL_INFO; |
207 | | -
|
208 | | -""" |
209 | | - |
210 | | -# cribbed from pywincffi |
211 | | -# programmatically strips out those annotations MSDN likes, like _In_ |
212 | | -REGEX_SAL_ANNOTATION = re.compile( |
213 | | - r"\b(_In_|_Inout_|_Out_|_Outptr_|_Reserved_)(opt_)?\b", |
214 | | -) |
215 | | -LIB = REGEX_SAL_ANNOTATION.sub(" ", LIB) |
216 | | - |
217 | | -# Other fixups: |
218 | | -# - get rid of FAR, cffi doesn't like it |
219 | | -LIB = re.sub(r"\bFAR\b", " ", LIB) |
220 | | -# - PASCAL is apparently an alias for __stdcall (on modern compilers - modern |
221 | | -# being _MSC_VER >= 800) |
222 | | -LIB = re.sub(r"\bPASCAL\b", "__stdcall", LIB) |
223 | | - |
224 | | -ffi = cffi.api.FFI() |
225 | | -ffi.cdef(LIB) |
226 | | - |
227 | | -CData: TypeAlias = cffi.api.FFI.CData |
228 | | -CType: TypeAlias = cffi.api.FFI.CType |
229 | | -AlwaysNull: TypeAlias = CType # We currently always pass ffi.NULL here. |
| 19 | +if not TYPE_CHECKING: |
| 20 | + CData: TypeAlias = ffi.CData |
| 21 | + CType: TypeAlias = ffi.CType |
| 22 | + |
| 23 | +AlwaysNull: TypeAlias = CData # We currently always pass ffi.NULL here. |
230 | 24 | Handle = NewType("Handle", CData) |
231 | 25 | HandleArray = NewType("HandleArray", CData) |
232 | 26 |
|
|
0 commit comments