1 /// [internal]
2 module libasync.internals.win32;
3 
4 version(Windows):
5 
6 public import core.sys.windows.windows;
7 public import std.c.windows.windows;
8 public import std.c.windows.winsock;
9 
10 extern(System) nothrow
11 {
12 	enum HWND HWND_MESSAGE = cast(HWND)-3;
13 	enum {
14 		GWLP_WNDPROC = -4,
15 		GWLP_HINSTANCE = -6,
16 		GWLP_HWNDPARENT = -8,
17 		GWLP_USERDATA = -21,
18 		GWLP_ID = -12,
19 	}
20 
21 	version(Win32){ // avoiding linking errors with out-of-the-box dmd
22 		alias SetWindowLongA SetWindowLongPtrA;
23 		alias GetWindowLongA GetWindowLongPtrA;
24 	} else {
25 		LONG_PTR SetWindowLongPtrA(HWND hWnd, int nIndex, LONG_PTR dwNewLong);
26 		LONG_PTR GetWindowLongPtrA(HWND hWnd, int nIndex);
27 	}
28 	LONG_PTR SetWindowLongPtrW(HWND hWnd, int nIndex, LONG_PTR dwNewLong);
29 	LONG_PTR GetWindowLongPtrW(HWND hWnd, int nIndex);
30 	LONG_PTR SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong);
31 	LONG_PTR GetWindowLongA(HWND hWnd, int nIndex);
32 
33 	alias void function(DWORD, DWORD, OVERLAPPED*) LPOVERLAPPED_COMPLETION_ROUTINE;
34 
35 	HANDLE CreateEventW(SECURITY_ATTRIBUTES* lpEventAttributes, BOOL bManualReset, BOOL bInitialState, LPCWSTR lpName);
36 	BOOL PostThreadMessageW(DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam);
37 	DWORD MsgWaitForMultipleObjectsEx(DWORD nCount, const(HANDLE) *pHandles, DWORD dwMilliseconds, DWORD dwWakeMask, DWORD dwFlags);
38 	static if (!is(typeof(&CreateFileW))) BOOL CloseHandle(HANDLE hObject);
39 	static if (!is(typeof(&CreateFileW))) HANDLE CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
40 					   DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
41 	BOOL WriteFileEx(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, OVERLAPPED* lpOverlapped, 
42 					 LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
43 	BOOL ReadFileEx(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, OVERLAPPED* lpOverlapped,
44 					LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
45 	BOOL GetFileSizeEx(HANDLE hFile, long *lpFileSize);
46 	BOOL SetEndOfFile(HANDLE hFile);
47 	BOOL GetOverlappedResult(HANDLE hFile, OVERLAPPED* lpOverlapped, DWORD* lpNumberOfBytesTransferred, BOOL bWait);
48 	BOOL PostMessageW(HWND hwnd, UINT msg, WPARAM wPara, LPARAM lParam);
49 	BOOL PostThreadMessageA(HWND hwnd, UINT msg, WPARAM wPara, LPARAM lParam);
50 
51 	static if (__VERSION__ < 2065) {
52 		BOOL PeekMessageW(MSG *lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg);
53 		LONG DispatchMessageW(MSG *lpMsg);
54 
55 		enum {
56 			ERROR_ALREADY_EXISTS = 183,
57 			ERROR_IO_PENDING = 997
58 		}
59 	}
60 
61 	struct FILE_NOTIFY_INFORMATION {
62 		DWORD NextEntryOffset;
63 		DWORD Action;
64 		DWORD FileNameLength;
65 		WCHAR[1] FileName;
66 	}
67 
68 	BOOL ReadDirectoryChangesW(HANDLE hDirectory, void* lpBuffer, DWORD nBufferLength, BOOL bWatchSubtree, DWORD dwNotifyFilter, LPDWORD lpBytesReturned, void* lpOverlapped, void* lpCompletionRoutine);
69 	HANDLE FindFirstChangeNotificationW(LPCWSTR lpPathName, BOOL bWatchSubtree, DWORD dwNotifyFilter);
70 	HANDLE FindNextChangeNotification(HANDLE hChangeHandle);
71 
72 	enum{
73 		WSAPROTOCOL_LEN  = 255,
74 		MAX_PROTOCOL_CHAIN = 7,
75 	};
76 
77 	enum WSA_IO_PENDING = 997;
78 
79 	struct WSAPROTOCOL_INFOW {
80 		DWORD            dwServiceFlags1;
81 		DWORD            dwServiceFlags2;
82 		DWORD            dwServiceFlags3;
83 		DWORD            dwServiceFlags4;
84 		DWORD            dwProviderFlags;
85 		GUID             ProviderId;
86 		DWORD            dwCatalogEntryId;
87 		WSAPROTOCOLCHAIN ProtocolChain;
88 		int              iVersion;
89 		int              iAddressFamily;
90 		int              iMaxSockAddr;
91 		int              iMinSockAddr;
92 		int              iSocketType;
93 		int              iProtocol;
94 		int              iProtocolMaxOffset;
95 		int              iNetworkByteOrder;
96 		int              iSecurityScheme;
97 		DWORD            dwMessageSize;
98 		DWORD            dwProviderReserved;
99 		WCHAR[WSAPROTOCOL_LEN+1] szProtocol;
100 	};
101 
102 	struct WSAPROTOCOLCHAIN {
103 		int ChainLen;                   
104 		DWORD[MAX_PROTOCOL_CHAIN] ChainEntries;
105 	};
106 
107 	struct WSABUF {
108 		size_t   len;
109 		ubyte *buf;
110 	}
111 
112 	struct WSAOVERLAPPEDX {
113 		ULONG_PTR Internal;
114 		ULONG_PTR InternalHigh;
115 		union {
116 			struct {
117 				DWORD Offset;
118 				DWORD OffsetHigh;
119 			}
120 			PVOID  Pointer;
121 		}
122 		HANDLE hEvent;
123 	}
124 
125 	enum {
126 		WSA_FLAG_OVERLAPPED = 0x01
127 	}
128 
129 	enum {
130 		FD_READ = 0x0001,
131 		FD_WRITE = 0x0002,
132 		FD_OOB = 0x0004,
133 		FD_ACCEPT = 0x0008,
134 		FD_CONNECT = 0x0010,
135 		FD_CLOSE = 0x0020,
136 		FD_QOS = 0x0040,
137 		FD_GROUP_QOS = 0x0080,
138 		FD_ROUTING_INTERFACE_CHANGE = 0x0100,
139 		FD_ADDRESS_LIST_CHANGE = 0x0200
140 	}
141 
142 	struct ADDRINFOEXW {
143 		int ai_flags;
144 		int ai_family;
145 		int ai_socktype;
146 		int ai_protocol;
147 		size_t ai_addrlen;
148 		LPCWSTR ai_canonname;
149 		sockaddr* ai_addr;
150 		void* ai_blob;
151 		size_t ai_bloblen;
152 		GUID* ai_provider;
153 		ADDRINFOEXW* ai_next;
154 	}
155 
156 	struct ADDRINFOA {
157 		int ai_flags;
158 		int ai_family;
159 		int ai_socktype;
160 		int ai_protocol;
161 		size_t ai_addrlen;
162 		LPSTR ai_canonname;
163 		sockaddr* ai_addr;
164 		ADDRINFOA* ai_next;
165 	}
166 
167 	struct ADDRINFOW {
168 		int ai_flags;
169 		int ai_family;
170 		int ai_socktype;
171 		int ai_protocol;
172 		size_t ai_addrlen;
173 		LPWSTR ai_canonname;
174 		sockaddr* ai_addr;
175 		ADDRINFOW* ai_next;
176 	}
177 
178 	enum {
179 		NS_ALL = 0,
180 		NS_DNS = 12
181 	}
182 
183 	struct WSAPROTOCOL_INFO {
184 		DWORD            dwServiceFlags1;
185 		DWORD            dwServiceFlags2;
186 		DWORD            dwServiceFlags3;
187 		DWORD            dwServiceFlags4;
188 		DWORD            dwProviderFlags;
189 		GUID             ProviderId;
190 		DWORD            dwCatalogEntryId;
191 		WSAPROTOCOLCHAIN ProtocolChain;
192 		int              iVersion;
193 		int              iAddressFamily;
194 		int              iMaxSockAddr;
195 		int              iMinSockAddr;
196 		int              iSocketType;
197 		int              iProtocol;
198 		int              iProtocolMaxOffset;
199 		int              iNetworkByteOrder;
200 		int              iSecurityScheme;
201 		DWORD            dwMessageSize;
202 		DWORD            dwProviderReserved;
203 		CHAR[WSAPROTOCOL_LEN+1] szProtocol;
204 	}
205 	alias sockaddr SOCKADDR;
206 
207 	alias void function(DWORD, DWORD, WSAOVERLAPPEDX*, DWORD) LPWSAOVERLAPPED_COMPLETION_ROUTINEX;
208 	alias void function(DWORD, DWORD, WSAOVERLAPPEDX*) LPLOOKUPSERVICE_COMPLETION_ROUTINE;
209 	alias void* LPCONDITIONPROC;
210 	alias void* LPTRANSMIT_FILE_BUFFERS;
211 
212 	SOCKET WSAAccept(SOCKET s, sockaddr *addr, INT* addrlen, LPCONDITIONPROC lpfnCondition, DWORD_PTR dwCallbackData);
213 	int WSAAsyncSelect(SOCKET s, HWND hWnd, uint wMsg, sizediff_t lEvent);
214 	SOCKET WSASocketW(int af, int type, int protocol, WSAPROTOCOL_INFOW *lpProtocolInfo, uint g, DWORD dwFlags);
215 	int WSARecv(SOCKET s, WSABUF* lpBuffers, DWORD dwBufferCount, DWORD* lpNumberOfBytesRecvd, DWORD* lpFlags, in WSAOVERLAPPEDX* lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINEX lpCompletionRoutine);
216 	int WSASend(SOCKET s, in WSABUF* lpBuffers, DWORD dwBufferCount, DWORD* lpNumberOfBytesSent, DWORD dwFlags, in WSAOVERLAPPEDX* lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINEX lpCompletionRoutine);
217 	int WSASendDisconnect(SOCKET s, WSABUF* lpOutboundDisconnectData);
218 	INT WSAStringToAddressA(in LPTSTR AddressString, INT AddressFamily, in WSAPROTOCOL_INFO* lpProtocolInfo, SOCKADDR* lpAddress, INT* lpAddressLength);
219 	INT WSAStringToAddressW(in LPWSTR AddressString, INT AddressFamily, in WSAPROTOCOL_INFOW* lpProtocolInfo, SOCKADDR* lpAddress, INT* lpAddressLength);
220 	INT WSAAddressToStringW(in SOCKADDR* lpsaAddress, DWORD dwAddressLength, in WSAPROTOCOL_INFO* lpProtocolInfo, LPWSTR lpszAddressString, DWORD* lpdwAddressStringLength);
221 	int GetAddrInfoExW(LPCWSTR pName, LPCWSTR pServiceName, DWORD dwNameSpace, GUID* lpNspId, const ADDRINFOEXW *pHints, ADDRINFOEXW **ppResult, timeval *timeout, WSAOVERLAPPEDX* lpOverlapped, LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine, HANDLE* lpNameHandle);
222 	int GetAddrInfoW(LPCWSTR pName, LPCWSTR pServiceName, const ADDRINFOW *pHints, ADDRINFOW **ppResult);
223 	int getaddrinfo(LPCSTR pName, LPCSTR pServiceName, const ADDRINFOA *pHints, ADDRINFOA **ppResult);
224 	void FreeAddrInfoW(ADDRINFOW* pAddrInfo);
225 	void FreeAddrInfoExW(ADDRINFOEXW* pAddrInfo);
226 	void freeaddrinfo(ADDRINFOA* ai);
227 	BOOL TransmitFile(SOCKET hSocket, HANDLE hFile, DWORD nNumberOfBytesToWrite, DWORD nNumberOfBytesPerSend, OVERLAPPED* lpOverlapped, LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, DWORD dwFlags);
228 
229 
230 	struct GUID
231 	{
232 		DWORD Data1;
233 		WORD Data2;
234 		WORD Data3;
235 		BYTE[8]  Data4;
236 	};
237 
238 	enum WM_USER = 0x0400;
239 
240 	enum {
241 		QS_ALLPOSTMESSAGE = 0x0100,
242 		QS_HOTKEY = 0x0080,
243 		QS_KEY = 0x0001,
244 		QS_MOUSEBUTTON = 0x0004,
245 		QS_MOUSEMOVE = 0x0002,
246 		QS_PAINT = 0x0020,
247 		QS_POSTMESSAGE = 0x0008,
248 		QS_RAWINPUT = 0x0400,
249 		QS_SENDMESSAGE = 0x0040,
250 		QS_TIMER = 0x0010, 
251 
252 		QS_MOUSE = (QS_MOUSEMOVE | QS_MOUSEBUTTON),
253 		QS_INPUT = (QS_MOUSE | QS_KEY | QS_RAWINPUT),
254 		QS_ALLEVENTS = (QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY),
255 		QS_ALLINPUT = (QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE),
256 	};
257 
258 	enum {
259 		MWMO_ALERTABLE = 0x0002,
260 		MWMO_INPUTAVAILABLE = 0x0004,
261 		MWMO_WAITALL = 0x0001,
262 	};
263 }