1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
U
Z±dŸ"ã@sddlZddlZddlZdZe d¡Ze de¡Ze dde¡Ze dde¡Ze ¡Ze     e¡e 
d¡Z e 
d    ¡Z e 
d
¡Z e d d ¡ZGd d„dejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZdd„Zddddœdd„ZdS)éNa}
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
typedef int BOOL;
typedef unsigned char BYTE;
typedef BYTE BOOLEAN;
typedef void* PVOID;
typedef PVOID HANDLE;
typedef unsigned long DWORD;
typedef unsigned long ULONG;
typedef unsigned int NTSTATUS;
typedef unsigned long u_long;
typedef ULONG *PULONG;
typedef const void *LPCVOID;
typedef void *LPVOID;
typedef const wchar_t *LPCWSTR;
 
typedef uintptr_t ULONG_PTR;
typedef uintptr_t UINT_PTR;
 
typedef UINT_PTR SOCKET;
 
typedef struct _OVERLAPPED {
    ULONG_PTR Internal;
    ULONG_PTR InternalHigh;
    union {
        struct {
            DWORD Offset;
            DWORD OffsetHigh;
        } DUMMYSTRUCTNAME;
        PVOID Pointer;
    } DUMMYUNIONNAME;
 
    HANDLE  hEvent;
} OVERLAPPED, *LPOVERLAPPED;
 
typedef OVERLAPPED WSAOVERLAPPED;
typedef LPOVERLAPPED LPWSAOVERLAPPED;
typedef PVOID LPSECURITY_ATTRIBUTES;
typedef PVOID LPCSTR;
 
typedef struct _OVERLAPPED_ENTRY {
    ULONG_PTR lpCompletionKey;
    LPOVERLAPPED lpOverlapped;
    ULONG_PTR Internal;
    DWORD dwNumberOfBytesTransferred;
} OVERLAPPED_ENTRY, *LPOVERLAPPED_ENTRY;
 
// kernel32.dll
HANDLE WINAPI CreateIoCompletionPort(
  _In_     HANDLE    FileHandle,
  _In_opt_ HANDLE    ExistingCompletionPort,
  _In_     ULONG_PTR CompletionKey,
  _In_     DWORD     NumberOfConcurrentThreads
);
 
BOOL SetFileCompletionNotificationModes(
  HANDLE FileHandle,
  UCHAR  Flags
);
 
HANDLE CreateFileW(
  LPCWSTR               lpFileName,
  DWORD                 dwDesiredAccess,
  DWORD                 dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD                 dwCreationDisposition,
  DWORD                 dwFlagsAndAttributes,
  HANDLE                hTemplateFile
);
 
BOOL WINAPI CloseHandle(
  _In_ HANDLE hObject
);
 
BOOL WINAPI PostQueuedCompletionStatus(
  _In_     HANDLE       CompletionPort,
  _In_     DWORD        dwNumberOfBytesTransferred,
  _In_     ULONG_PTR    dwCompletionKey,
  _In_opt_ LPOVERLAPPED lpOverlapped
);
 
BOOL WINAPI GetQueuedCompletionStatusEx(
  _In_  HANDLE             CompletionPort,
  _Out_ LPOVERLAPPED_ENTRY lpCompletionPortEntries,
  _In_  ULONG              ulCount,
  _Out_ PULONG             ulNumEntriesRemoved,
  _In_  DWORD              dwMilliseconds,
  _In_  BOOL               fAlertable
);
 
BOOL WINAPI CancelIoEx(
  _In_     HANDLE       hFile,
  _In_opt_ LPOVERLAPPED lpOverlapped
);
 
BOOL WriteFile(
  HANDLE       hFile,
  LPCVOID      lpBuffer,
  DWORD        nNumberOfBytesToWrite,
  LPDWORD      lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped
);
 
BOOL ReadFile(
  HANDLE       hFile,
  LPVOID       lpBuffer,
  DWORD        nNumberOfBytesToRead,
  LPDWORD      lpNumberOfBytesRead,
  LPOVERLAPPED lpOverlapped
);
 
BOOL WINAPI SetConsoleCtrlHandler(
  _In_opt_ void*            HandlerRoutine,
  _In_     BOOL             Add
);
 
HANDLE CreateEventA(
  LPSECURITY_ATTRIBUTES lpEventAttributes,
  BOOL                  bManualReset,
  BOOL                  bInitialState,
  LPCSTR                lpName
);
 
BOOL SetEvent(
  HANDLE hEvent
);
 
BOOL ResetEvent(
  HANDLE hEvent
);
 
DWORD WaitForSingleObject(
  HANDLE hHandle,
  DWORD  dwMilliseconds
);
 
DWORD WaitForMultipleObjects(
  DWORD        nCount,
  HANDLE       *lpHandles,
  BOOL         bWaitAll,
  DWORD        dwMilliseconds
);
 
ULONG RtlNtStatusToDosError(
  NTSTATUS Status
);
 
int WSAIoctl(
  SOCKET                             s,
  DWORD                              dwIoControlCode,
  LPVOID                             lpvInBuffer,
  DWORD                              cbInBuffer,
  LPVOID                             lpvOutBuffer,
  DWORD                              cbOutBuffer,
  LPDWORD                            lpcbBytesReturned,
  LPWSAOVERLAPPED                    lpOverlapped,
  // actually LPWSAOVERLAPPED_COMPLETION_ROUTINE
  void* lpCompletionRoutine
);
 
int WSAGetLastError();
 
BOOL DeviceIoControl(
  HANDLE       hDevice,
  DWORD        dwIoControlCode,
  LPVOID       lpInBuffer,
  DWORD        nInBufferSize,
  LPVOID       lpOutBuffer,
  DWORD        nOutBufferSize,
  LPDWORD      lpBytesReturned,
  LPOVERLAPPED lpOverlapped
);
 
// From https://github.com/piscisaureus/wepoll/blob/master/src/afd.h
typedef struct _AFD_POLL_HANDLE_INFO {
  HANDLE Handle;
  ULONG Events;
  NTSTATUS Status;
} AFD_POLL_HANDLE_INFO, *PAFD_POLL_HANDLE_INFO;
 
// This is really defined as a messy union to allow stuff like
// i.DUMMYSTRUCTNAME.LowPart, but we don't need those complications.
// Under all that it's just an int64.
typedef int64_t LARGE_INTEGER;
 
typedef struct _AFD_POLL_INFO {
  LARGE_INTEGER Timeout;
  ULONG NumberOfHandles;
  ULONG Exclusive;
  AFD_POLL_HANDLE_INFO Handles[1];
} AFD_POLL_INFO, *PAFD_POLL_INFO;
 
z3\b(_In_|_Inout_|_Out_|_Outptr_|_Reserved_)(opt_)?\bú z\bFAR\bz
\bPASCAL\bZ    __stdcallz kernel32.dllz    ntdll.dllz
ws2_32.dllÚHANDLEéÿÿÿÿc@s<eZdZdZdZdZdZdZdZdZ    dZ
dZ d    Z d
Z d Zd S) Ú
ErrorCodesié€rlÿÿiåiãißééWii6'N)Ú__name__Ú
__module__Ú __qualname__ZSTATUS_TIMEOUTÚ WAIT_TIMEOUTZWAIT_ABANDONEDÚ WAIT_OBJECT_0Z WAIT_FAILEDÚERROR_IO_PENDINGÚERROR_OPERATION_ABORTEDZERROR_ABANDONED_WAIT_0ZERROR_INVALID_HANDLEZERROR_INVALID_PARMETERZERROR_NOT_FOUNDZERROR_NOT_SOCKET©rrúOd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\trio/_core/_windows_cffi.pyrësrc@s8eZdZdZdZdZdZdZdZdZ    dZ
dZ dZ dZ d    S)
Ú    FileFlagslii@éééééN)r    r
r Ú GENERIC_READÚ SYNCHRONIZEÚFILE_FLAG_OVERLAPPEDZFILE_SHARE_READZFILE_SHARE_WRITEZFILE_SHARE_DELETEZ
CREATE_NEWZ CREATE_ALWAYSÚ OPEN_EXISTINGZ OPEN_ALWAYSZTRUNCATE_EXISTINGrrrrrúsrc@s@eZdZdZdZdZdZdZdZdZ    dZ
d    Z d
Z d Z d Zd ZdS)Ú AFDPollFlagsrrrééé é@réiiiiN)r    r
r ZAFD_POLL_RECEIVEZAFD_POLL_RECEIVE_EXPEDITEDZ AFD_POLL_SENDZAFD_POLL_DISCONNECTZAFD_POLL_ABORTZAFD_POLL_LOCAL_CLOSEZAFD_POLL_CONNECTZAFD_POLL_ACCEPTZAFD_POLL_CONNECT_FAILZ AFD_POLL_QOSZAFD_POLL_GROUP_QOSZ!AFD_POLL_ROUTING_INTERFACE_CHANGEZ"AFD_POLL_EVENT_ADDRESS_LIST_CHANGErrrrrsrc@seZdZdZdZdZdS)Ú    WSAIoctlsi"HiHiHN)r    r
r ZSIO_BASE_HANDLEZSIO_BSP_HANDLE_SELECTZSIO_BSP_HANDLE_POLLrrrrr"sr"c@seZdZdZdZdS)ÚCompletionModesrrN)r    r
r Z$FILE_SKIP_COMPLETION_PORT_ON_SUCCESSZFILE_SKIP_SET_EVENT_ON_HANDLErrrrr#"sr#c@seZdZdZdS)ÚIoControlCodesi$ N)r    r
r ZIOCTL_AFD_POLLrrrrr$'sr$cCs t|ƒtkrt d|¡S|SdS)Nr)ÚtypeÚintÚffiÚcast)ÚobjrrrÚ_handle0s  r*)ÚfilenameÚ    filename2cCs8|dkrt ¡\}}nt |¡\}}td||||ƒ‚dS)Nr)r'Z getwinerrorÚOSError)Úwinerrorr+r,ÚmsgÚ_rrrÚraise_winerror=sr1)N)ZcffiÚreÚenumZLIBÚcompileZREGEX_SAL_ANNOTATIONÚsubZFFIr'ZcdefZdlopenÚkernel32ZntdllZws2_32r(ÚINVALID_HANDLE_VALUEÚIntEnumrrÚIntFlagrr"r#r$r*r1rrrrÚ<module>s0Eÿ