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 }