/* autoload.cc: all dynamic load stuff.
- Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc.
+ Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
+ 2009, 2010, 2011 Red Hat, Inc.
This file is part of Cygwin.
details. */
#include "winsup.h"
+#include "miscfuncs.h"
+#include "fenv.h"
#define USE_SYS_TYPES_FD_SET
#include <winsock2.h>
+bool NO_COPY wsock_started;
+
/* Macro for defining "auto-load" functions.
* Note that this is self-modifying code *gasp*.
* The first invocation of a routine will trigger the loading of
/* LoadDLLprime is used to prime the DLL info information, providing an
additional initialization routine to call prior to calling the first
function. */
-#define LoadDLLprime(dllname, init_also) __asm__ (" \n\
+#define LoadDLLprime(dllname, init_also, no_resolve_on_fork) __asm__ (" \n\
.ifndef " #dllname "_primed \n\
.section .data_cygwin_nocopy,\"w\" \n\
.align 4 \n\
."#dllname "_info: \n\
.long _std_dll_init \n\
- .long 0 \n\
+ .long " #no_resolve_on_fork " \n\
.long -1 \n\
.long " #init_also " \n\
- .asciz \"" #dllname "\" \n\
+ .string16 \"" #dllname ".dll\" \n\
.text \n\
.set " #dllname "_primed, 1 \n\
.endif \n\
LoadDLLfuncEx3(name, n, dllname, notimp, err, 0)
/* Main DLL setup stuff. */
-#define LoadDLLfuncEx3(name, n, dllname, notimp, err, fn) \
- LoadDLLprime (dllname, dll_func_load) \
+#define LoadDLLfuncEx3(name, n, dllname, notimp, err, no_resolve_on_fork) \
+ LoadDLLprime (dllname, dll_func_load, no_resolve_on_fork) \
__asm__ (" \n\
.section ." #dllname "_autoload_text,\"wx\" \n\
.global _" mangle (name, n) " \n\
1:movl (2f),%eax \n\
call *(%eax) \n\
2:.long ." #dllname "_info \n\
- .long (" #n "+" #notimp ") | (((" #err ") & 0xff) <<16) | (((" #fn ") & 0xff) << 24) \n\
- .asciz \"" #name "\" \n\
- .text \n\
+ .long (" #n "+" #notimp ") | (((" #err ") & 0xff) <<16) \n\
+ .asciz \"" #name "\" \n\
+ .text \n\
");
/* DLL loader helper functions used during initialization. */
extern "C" {
__asm__ (" \n\
+ .text \n\
msg1: \n\
.ascii \"couldn't dynamically determine load address for '%s' (handle %p), %E\\0\"\n\
\n\
movl (%edx),%eax # Handle value \n\
pushl 4(%eax) \n\
leal 8(%edx),%eax # Location of name of function \n\
- push %eax \n\
- push $msg1 # The message \n\
+ pushl %eax \n\
+ pushl $msg1 # The message \n\
call ___api_fatal # Print message. Never returns \n\
\n\
.globl dll_func_load \n\
HANDLE handle;
LONG here;
void (*init) ();
- char name[];
+ WCHAR name[];
};
struct func_info
long long ll;
};
+
+/* This function is a workaround for the problem reported here:
+ http://cygwin.com/ml/cygwin/2011-02/msg00552.html
+ and discussed here:
+ http://cygwin.com/ml/cygwin-developers/2011-02/threads.html#00007
+
+ To wit: winmm.dll calls FreeLibrary in its DllMain and that can result
+ in LoadLibraryExW returning an ERROR_INVALID_ADDRESS. */
+static __inline bool
+dll_load (HANDLE& handle, WCHAR *name)
+{
+ HANDLE h = LoadLibraryW (name);
+ if (!h && handle && wincap.use_dont_resolve_hack ()
+ && GetLastError () == ERROR_INVALID_ADDRESS)
+ h = LoadLibraryExW (name, NULL, DONT_RESOLVE_DLL_REFERENCES);
+ if (!h)
+ return false;
+ handle = h;
+ return true;
+}
+
+#define RETRY_COUNT 10
+
/* The standard DLL initialization routine. */
__attribute__ ((used, noinline)) static long long
std_dll_init ()
{
- HANDLE h;
struct func_info *func = (struct func_info *) __builtin_return_address (0);
struct dll_info *dll = func->dll;
retchain ret;
do
{
InterlockedDecrement (&dll->here);
- low_priority_sleep (0);
+ yield ();
}
while (InterlockedIncrement (&dll->here));
- else if (!dll->handle)
+ else if ((uintptr_t) dll->handle <= 1)
{
- unsigned fpu_control = 0;
- __asm__ __volatile__ ("fnstcw %0": "=m" (fpu_control));
- if ((h = LoadLibrary (dll->name)) != NULL)
+ fenv_t fpuenv;
+ fegetenv (&fpuenv);
+ WCHAR dll_path[MAX_PATH];
+ DWORD err = ERROR_SUCCESS;
+ int i;
+ /* http://www.microsoft.com/technet/security/advisory/2269637.mspx */
+ wcpcpy (wcpcpy (dll_path, windows_system_directory), dll->name);
+ /* MSDN seems to imply that LoadLibrary can fail mysteriously, so,
+ since there have been reports of this in the mailing list, retry
+ several times before giving up. */
+ for (i = 1; i <= RETRY_COUNT; i++)
{
- __asm__ __volatile__ ("fldcw %0": : "m" (fpu_control));
- dll->handle = h;
+ /* If loading the library succeeds, just leave the loop. */
+ if (!dll_load (dll->handle, dll_path))
+ break;
+ /* Otherwise check error code returned by LoadLibrary. If the
+ error code is neither NOACCESS nor DLL_INIT_FAILED, break out
+ of the loop. */
+ err = GetLastError ();
+ if (err != ERROR_NOACCESS && err != ERROR_DLL_INIT_FAILED)
+ break;
+ if (i < RETRY_COUNT)
+ yield ();
}
- else if (!(func->decoration & 1))
- api_fatal ("could not load %s, %E", dll->name);
- else
- dll->handle = INVALID_HANDLE_VALUE;
+ if ((uintptr_t) dll->handle <= 1)
+ {
+ /* If LoadLibrary with full path returns one of the weird errors
+ reported on the Cygwin mailing list, retry with only the DLL
+ name. Only do this when the above retry loop has been exhausted. */
+ if (i > RETRY_COUNT && dll_load (dll->handle, dll->name))
+ /* got it with the fallback */;
+ else if ((func->decoration & 1))
+ dll->handle = INVALID_HANDLE_VALUE;
+ else
+ api_fatal ("unable to load %W, %E", dll_path);
+ }
+ fesetenv (&fpuenv);
}
+ /* Set "arguments" for dll_chain. */
+ ret.low = (long) dll->init;
+ ret.high = (long) func;
+
InterlockedDecrement (&dll->here);
/* Kludge alert. Redirects the return address to dll_chain. */
movl $dll_chain,4(%ebp) \n\
");
- /* Set "arguments for dll_chain. */
- ret.low = (long) dll->init;
- ret.high = (long) func;
return ret.ll;
}
/* Initialization function for winsock stuff. */
-bool NO_COPY wsock_started = 0;
WSADATA NO_COPY wsadata;
__attribute__ ((used, noinline, regparm(1))) static long long
wsock_init ()
while (InterlockedIncrement (&here))
{
InterlockedDecrement (&here);
- low_priority_sleep (0);
+ yield ();
}
if (!wsock_started)
{
- int (*wsastartup) (int, WSADATA *);
+ int __stdcall (*wsastartup) (int, WSADATA *);
/* Don't use autoload to load WSAStartup to eliminate recursion. */
- wsastartup = (int (*)(int, WSADATA *))
+ wsastartup = (int __stdcall (*)(int, WSADATA *))
GetProcAddress ((HMODULE) (dll->handle), "WSAStartup");
if (wsastartup)
{
return ret.ll;
}
-LoadDLLprime (wsock32, _wsock_init)
-LoadDLLprime (ws2_32, _wsock_init)
-
-LoadDLLfunc (AccessCheck, 32, advapi32)
-LoadDLLfunc (AddAccessAllowedAce, 16, advapi32)
-LoadDLLfunc (AddAccessDeniedAce, 16, advapi32)
-LoadDLLfunc (AddAce, 20, advapi32)
-LoadDLLfunc (AdjustTokenPrivileges, 24, advapi32)
-LoadDLLfuncEx (AllocateLocallyUniqueId, 4, advapi32, 1)
-LoadDLLfunc (CopySid, 12, advapi32)
-LoadDLLfunc (CreateProcessAsUserA, 44, advapi32)
-LoadDLLfuncEx (CryptAcquireContextA, 20, advapi32, 1)
-LoadDLLfuncEx (CryptGenRandom, 12, advapi32, 1)
-LoadDLLfuncEx (CryptReleaseContext, 8, advapi32, 1)
-LoadDLLfunc (DeregisterEventSource, 4, advapi32)
-LoadDLLfunc (DuplicateToken, 12, advapi32)
-LoadDLLfuncEx (DuplicateTokenEx, 24, advapi32, 1)
-LoadDLLfunc (EqualSid, 8, advapi32)
-LoadDLLfunc (FindFirstFreeAce, 8, advapi32)
-LoadDLLfunc (GetAce, 12, advapi32)
-LoadDLLfunc (GetFileSecurityA, 20, advapi32)
-LoadDLLfunc (GetKernelObjectSecurity, 20, advapi32)
-LoadDLLfunc (GetLengthSid, 4, advapi32)
-LoadDLLfunc (GetSecurityDescriptorDacl, 16, advapi32)
-LoadDLLfunc (GetSecurityDescriptorGroup, 12, advapi32)
-LoadDLLfunc (GetSecurityDescriptorOwner, 12, advapi32)
-LoadDLLfunc (GetSecurityInfo, 32, advapi32)
-LoadDLLfunc (GetSidIdentifierAuthority, 4, advapi32)
-LoadDLLfunc (GetSidSubAuthority, 8, advapi32)
-LoadDLLfunc (GetSidSubAuthorityCount, 4, advapi32)
-LoadDLLfunc (GetTokenInformation, 20, advapi32)
-LoadDLLfunc (GetUserNameA, 8, advapi32)
-LoadDLLfunc (ImpersonateLoggedOnUser, 4, advapi32)
-LoadDLLfunc (ImpersonateNamedPipeClient, 4, advapi32)
-LoadDLLfunc (InitializeAcl, 12, advapi32)
-LoadDLLfunc (InitializeSecurityDescriptor, 8, advapi32)
-LoadDLLfunc (InitializeSid, 12, advapi32)
-LoadDLLfunc (IsValidSid, 4, advapi32)
-LoadDLLfunc (LogonUserA, 24, advapi32)
-LoadDLLfunc (LookupAccountNameA, 28, advapi32)
-LoadDLLfunc (LookupAccountNameW, 28, advapi32)
-LoadDLLfunc (LookupAccountSidA, 28, advapi32)
-LoadDLLfunc (LookupPrivilegeValueA, 12, advapi32)
-LoadDLLfunc (LsaClose, 4, advapi32)
-LoadDLLfunc (LsaEnumerateAccountRights, 16, advapi32)
-LoadDLLfunc (LsaFreeMemory, 4, advapi32)
-LoadDLLfunc (LsaNtStatusToWinError, 4, advapi32)
-LoadDLLfunc (LsaOpenPolicy, 16, advapi32)
-LoadDLLfunc (LsaQueryInformationPolicy, 12, advapi32)
-LoadDLLfunc (MakeSelfRelativeSD, 12, advapi32)
-LoadDLLfunc (OpenProcessToken, 12, advapi32)
-LoadDLLfunc (OpenThreadToken, 16, advapi32)
-// LoadDLLfunc (RegCloseKey, 4, advapi32)
-LoadDLLfunc (RegCreateKeyExA, 36, advapi32)
-LoadDLLfunc (RegDeleteKeyA, 8, advapi32)
-LoadDLLfunc (RegDeleteValueA, 8, advapi32)
-LoadDLLfunc (RegLoadKeyA, 12, advapi32)
-LoadDLLfunc (RegEnumKeyExA, 32, advapi32)
-LoadDLLfunc (RegEnumValueA, 32, advapi32)
-LoadDLLfunc (RegOpenKeyExA, 20, advapi32)
-LoadDLLfunc (RegQueryInfoKeyA, 48, advapi32)
-LoadDLLfunc (RegQueryValueExA, 24, advapi32)
-LoadDLLfunc (RegSetValueExA, 24, advapi32)
-LoadDLLfunc (RegisterEventSourceA, 8, advapi32)
-LoadDLLfunc (ReportEventA, 36, advapi32)
-LoadDLLfunc (RevertToSelf, 0, advapi32)
-LoadDLLfunc (SetKernelObjectSecurity, 12, advapi32)
-LoadDLLfunc (SetSecurityDescriptorControl, 12, advapi32)
-LoadDLLfunc (SetSecurityDescriptorDacl, 16, advapi32)
-LoadDLLfunc (SetSecurityDescriptorGroup, 12, advapi32)
-LoadDLLfunc (SetSecurityDescriptorOwner, 12, advapi32)
-LoadDLLfunc (SetTokenInformation, 16, advapi32)
-LoadDLLfunc (RegGetKeySecurity, 16, advapi32)
+LoadDLLprime (ws2_32, _wsock_init, 0)
+
+LoadDLLfuncEx2 (DnsQuery_A, 24, dnsapi, 1, 127) // ERROR_PROC_NOT_FOUND
+LoadDLLfuncEx (DnsRecordListFree, 8, dnsapi, 1)
+
+// 50 = ERROR_NOT_SUPPORTED. Returned if OS doesn't support iphlpapi funcs
+LoadDLLfuncEx2 (GetAdaptersAddresses, 20, iphlpapi, 1, 50)
+LoadDLLfuncEx2 (GetExtendedTcpTable, 24, iphlpapi, 1, 50)
+LoadDLLfunc (GetIfEntry, 4, iphlpapi)
+LoadDLLfunc (GetIpAddrTable, 12, iphlpapi)
+LoadDLLfunc (GetIpForwardTable, 12, iphlpapi)
+LoadDLLfunc (GetNetworkParams, 8, iphlpapi)
+LoadDLLfunc (GetTcpTable, 12, iphlpapi)
+
+LoadDLLfuncEx (AttachConsole, 4, kernel32, 1)
+LoadDLLfunc (FindFirstVolumeA, 8, kernel32)
+LoadDLLfunc (FindNextVolumeA, 12, kernel32)
+LoadDLLfunc (FindVolumeClose, 4, kernel32)
+LoadDLLfunc (GetConsoleWindow, 0, kernel32)
+LoadDLLfuncEx (GetNamedPipeClientProcessId, 8, kernel32, 1)
+LoadDLLfuncEx (GetSystemWindowsDirectoryW, 8, kernel32, 1)
+LoadDLLfunc (GetVolumeNameForVolumeMountPointA, 12, kernel32)
+LoadDLLfunc (LocaleNameToLCID, 8, kernel32)
+
+LoadDLLfunc (WNetCloseEnum, 4, mpr)
+LoadDLLfunc (WNetEnumResourceA, 16, mpr)
+LoadDLLfunc (WNetGetProviderNameA, 12, mpr)
+LoadDLLfunc (WNetGetResourceInformationA, 16, mpr)
+LoadDLLfunc (WNetOpenEnumA, 20, mpr)
+/* 127 == ERROR_PROC_NOT_FOUND */
+LoadDLLfuncEx2 (DsGetDcNameW, 24, netapi32, 1, 127)
LoadDLLfunc (NetApiBufferFree, 4, netapi32)
-LoadDLLfuncEx (NetGetDCName, 12, netapi32, 1)
-LoadDLLfunc (NetLocalGroupEnum, 28, netapi32)
-LoadDLLfunc (NetLocalGroupGetMembers, 32, netapi32)
+LoadDLLfunc (NetGetAnyDCName, 12, netapi32)
+LoadDLLfunc (NetGetDCName, 12, netapi32)
LoadDLLfunc (NetUserGetGroups, 28, netapi32)
LoadDLLfunc (NetUserGetInfo, 16, netapi32)
-LoadDLLfunc (NetWkstaUserGetInfo, 12, netapi32)
-
-/* 0xc000007a == STATUS_PROCEDURE_NOT_FOUND */
-#define LoadDLLfuncNt(name, n, dllname) \
- LoadDLLfuncEx2(name, n, dllname, 1, 0xc000007a)
-LoadDLLfuncNt (NtClose, 4, ntdll)
-LoadDLLfuncNt (NtCreateFile, 44, ntdll)
-LoadDLLfuncNt (NtCreateSection, 28, ntdll)
-LoadDLLfuncNt (NtCreateToken, 52, ntdll)
-LoadDLLfuncNt (NtLockVirtualMemory, 16, ntdll)
-LoadDLLfuncNt (NtMapViewOfSection, 40, ntdll)
-LoadDLLfuncNt (NtOpenDirectoryObject, 12, ntdll)
-LoadDLLfuncNt (NtOpenFile, 24, ntdll)
-LoadDLLfuncNt (NtOpenSection, 12, ntdll)
-LoadDLLfuncNt (NtQueryDirectoryObject, 28, ntdll)
-LoadDLLfuncNt (NtQueryDirectoryFile, 44, ntdll)
-LoadDLLfuncNt (NtQueryEaFile, 36, ntdll)
-LoadDLLfuncNt (NtQueryInformationFile, 20, ntdll)
-LoadDLLfuncNt (NtQueryInformationProcess, 20, ntdll)
-LoadDLLfuncNt (NtQueryObject, 20, ntdll)
-LoadDLLfuncNt (NtQuerySystemInformation, 16, ntdll)
-LoadDLLfuncNt (NtQuerySecurityObject, 20, ntdll)
-LoadDLLfuncNt (NtQueryVirtualMemory, 24, ntdll)
-LoadDLLfuncNt (NtQueryVolumeInformationFile, 20, ntdll)
-LoadDLLfuncNt (NtSetEaFile, 16, ntdll)
-LoadDLLfuncNt (NtSetSecurityObject, 12, ntdll)
-LoadDLLfuncNt (NtUnlockVirtualMemory, 16, ntdll)
-LoadDLLfuncNt (NtUnmapViewOfSection, 8, ntdll)
-LoadDLLfuncNt (RtlInitUnicodeString, 8, ntdll)
-LoadDLLfuncNt (RtlIsDosDeviceName_U, 4, ntdll)
-LoadDLLfuncNt (RtlNtStatusToDosError, 4, ntdll)
+LoadDLLfunc (NetUserGetLocalGroups, 32, netapi32)
+
+LoadDLLfunc (NtCommitTransaction, 8, ntdll)
+LoadDLLfunc (NtCreateTransaction, 40, ntdll)
+LoadDLLfunc (NtRollbackTransaction, 8, ntdll)
+LoadDLLfunc (RtlGetCurrentTransaction, 0, ntdll)
+LoadDLLfunc (RtlSetCurrentTransaction, 4, ntdll)
+
+LoadDLLfunc (CoTaskMemFree, 4, ole32)
LoadDLLfuncEx (EnumProcessModules, 16, psapi, 1)
-LoadDLLfuncEx (GetModuleFileNameExA, 16, psapi, 1)
+LoadDLLfuncEx (GetModuleFileNameExW, 16, psapi, 1)
LoadDLLfuncEx (GetModuleInformation, 16, psapi, 1)
LoadDLLfuncEx (GetProcessMemoryInfo, 12, psapi, 1)
LoadDLLfuncEx (QueryWorkingSet, 12, psapi, 1)
-LoadDLLfuncEx (LsaDeregisterLogonProcess, 4, secur32, 1)
-LoadDLLfuncEx (LsaFreeReturnBuffer, 4, secur32, 1)
-LoadDLLfuncEx (LsaLogonUser, 56, secur32, 1)
-LoadDLLfuncEx (LsaLookupAuthenticationPackage, 12, secur32, 1)
-LoadDLLfuncEx (LsaRegisterLogonProcess, 12, secur32, 1)
+LoadDLLfunc (UuidCreate, 4, rpcrt4)
+LoadDLLfuncEx (UuidCreateSequential, 4, rpcrt4, 1)
+
+LoadDLLfunc (LsaDeregisterLogonProcess, 4, secur32)
+LoadDLLfunc (LsaFreeReturnBuffer, 4, secur32)
+LoadDLLfunc (LsaLogonUser, 56, secur32)
+LoadDLLfunc (LsaLookupAuthenticationPackage, 12, secur32)
+/* secur32 functions return NTSTATUS values. However, the error code must
+ fit in 16 bits , see LoadDLLprime.
+ The calling function, lsaauth(), checks for STATUS_SUCCESS (0), so we
+ simply return some arbitrary non-0 value (127 == ERROR_PROC_NOT_FOUND)
+ from here, if the function can't be loaded. */
+LoadDLLfuncEx2 (LsaRegisterLogonProcess, 12, secur32, 1, 127)
-LoadDLLfunc (CharToOemA, 8, user32)
-LoadDLLfunc (CharToOemBuffA, 12, user32)
+LoadDLLfunc (SHGetDesktopFolder, 4, shell32)
+
+LoadDLLfunc (CharNextExA, 12, user32)
LoadDLLfunc (CloseClipboard, 0, user32)
+LoadDLLfunc (CloseDesktop, 4, user32)
LoadDLLfunc (CloseWindowStation, 4, user32)
+LoadDLLfunc (CreateDesktopW, 24, user32)
LoadDLLfunc (CreateWindowExA, 48, user32)
-LoadDLLfunc (CreateWindowStationA, 16, user32)
+LoadDLLfunc (CreateWindowStationW, 16, user32)
LoadDLLfunc (DefWindowProcA, 16, user32)
LoadDLLfunc (DispatchMessageA, 4, user32)
LoadDLLfunc (EmptyClipboard, 0, user32)
LoadDLLfunc (GetPriorityClipboardFormat, 8, user32)
LoadDLLfunc (GetProcessWindowStation, 0, user32)
LoadDLLfunc (GetThreadDesktop, 4, user32)
+LoadDLLfunc (GetUserObjectInformationW, 20, user32)
LoadDLLfunc (GetWindowThreadProcessId, 8, user32)
-LoadDLLfunc (GetUserObjectInformationA, 20, user32)
-LoadDLLfunc (KillTimer, 8, user32)
LoadDLLfunc (MessageBeep, 4, user32)
LoadDLLfunc (MessageBoxA, 16, user32)
-LoadDLLfunc (MsgWaitForMultipleObjects, 20, user32)
-LoadDLLfunc (OemToCharBuffA, 12, user32)
+LoadDLLfunc (MsgWaitForMultipleObjectsEx, 20, user32)
LoadDLLfunc (OpenClipboard, 4, user32)
LoadDLLfunc (PeekMessageA, 20, user32)
LoadDLLfunc (PostMessageA, 16, user32)
LoadDLLfunc (RegisterClipboardFormatA, 4, user32)
LoadDLLfunc (SendMessageA, 16, user32)
LoadDLLfunc (SetClipboardData, 8, user32)
+LoadDLLfunc (SetParent, 8, user32)
LoadDLLfunc (SetProcessWindowStation, 4, user32)
-LoadDLLfunc (SetTimer, 16, user32)
-LoadDLLfunc (SetUserObjectSecurity, 12, user32)
-
-LoadDLLfunc (rcmd, 24, wsock32)
+LoadDLLfunc (SetThreadDesktop, 4, user32)
+LoadDLLfunc (ShowWindowAsync, 8, user32)
+
+LoadDLLfuncEx3 (waveInAddBuffer, 12, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveInClose, 4, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveInGetNumDevs, 0, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveInOpen, 24, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveInPrepareHeader, 12, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveInReset, 4, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveInStart, 4, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveInUnprepareHeader, 12, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveOutClose, 4, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveOutGetNumDevs, 0, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveOutGetVolume, 8, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveOutOpen, 24, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveOutPrepareHeader, 12, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveOutReset, 4, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveOutSetVolume, 8, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveOutUnprepareHeader, 12, winmm, 1, 0, 1)
+LoadDLLfuncEx3 (waveOutWrite, 12, winmm, 1, 0, 1)
LoadDLLfunc (accept, 12, ws2_32)
LoadDLLfunc (bind, 12, ws2_32)
LoadDLLfunc (connect, 12, ws2_32)
LoadDLLfunc (gethostbyaddr, 12, ws2_32)
LoadDLLfunc (gethostbyname, 4, ws2_32)
-LoadDLLfuncEx2 (gethostname, 8, ws2_32, 1, 1)
+LoadDLLfunc (gethostname, 8, ws2_32)
LoadDLLfunc (getpeername, 12, ws2_32)
LoadDLLfunc (getprotobyname, 4, ws2_32)
LoadDLLfunc (getprotobynumber, 4, ws2_32)
LoadDLLfunc (getservbyport, 8, ws2_32)
LoadDLLfunc (getsockname, 12, ws2_32)
LoadDLLfunc (getsockopt, 20, ws2_32)
-LoadDLLfunc (inet_addr, 4, ws2_32)
-LoadDLLfunc (inet_ntoa, 4, ws2_32)
LoadDLLfunc (ioctlsocket, 12, ws2_32)
LoadDLLfunc (listen, 8, ws2_32)
-LoadDLLfunc (recv, 16, ws2_32)
-LoadDLLfunc (recvfrom, 24, ws2_32)
-LoadDLLfunc (select, 20, ws2_32)
-LoadDLLfunc (send, 16, ws2_32)
-LoadDLLfunc (sendto, 24, ws2_32)
LoadDLLfunc (setsockopt, 20, ws2_32)
LoadDLLfunc (shutdown, 8, ws2_32)
LoadDLLfunc (socket, 12, ws2_32)
LoadDLLfunc (WSAAsyncSelect, 16, ws2_32)
-LoadDLLfunc (WSACloseEvent, 4, ws2_32)
-LoadDLLfunc (WSACreateEvent, 0, ws2_32)
-LoadDLLfunc (WSADuplicateSocketA, 12, ws2_32)
+LoadDLLfunc (WSADuplicateSocketW, 12, ws2_32)
+LoadDLLfunc (WSAEnumNetworkEvents, 12, ws2_32)
+LoadDLLfunc (WSAEventSelect, 12, ws2_32)
LoadDLLfunc (WSAGetLastError, 0, ws2_32)
-LoadDLLfunc (WSAGetOverlappedResult, 20, ws2_32)
+LoadDLLfunc (WSAIoctl, 36, ws2_32)
LoadDLLfunc (WSARecv, 28, ws2_32)
LoadDLLfunc (WSARecvFrom, 36, ws2_32)
-LoadDLLfunc (WSASend, 28, ws2_32)
+LoadDLLfunc (WSASendMsg, 24, ws2_32)
LoadDLLfunc (WSASendTo, 36, ws2_32)
-LoadDLLfunc (WSASetEvent, 4, ws2_32)
LoadDLLfunc (WSASetLastError, 4, ws2_32)
-LoadDLLfunc (WSASocketA, 24, ws2_32)
+LoadDLLfunc (WSASocketW, 24, ws2_32)
// LoadDLLfunc (WSAStartup, 8, ws2_32)
LoadDLLfunc (WSAWaitForMultipleEvents, 20, ws2_32)
-LoadDLLfunc (WSAEventSelect, 12, ws2_32)
-LoadDLLfunc (WSAEnumNetworkEvents, 12, ws2_32)
-LoadDLLfunc (__WSAFDIsSet, 8, ws2_32)
-
-LoadDLLfuncEx (GetIfTable, 12, iphlpapi, 1)
-LoadDLLfuncEx (GetIfEntry, 4, iphlpapi, 1)
-LoadDLLfuncEx (GetIpAddrTable, 12, iphlpapi, 1)
-LoadDLLfuncEx (GetNetworkParams, 8, iphlpapi, 1)
-LoadDLLfuncEx (GetTcpTable, 12, iphlpapi, 1)
-
-LoadDLLfunc (CoTaskMemFree, 4, ole32)
-
-LoadDLLfuncEx (CancelIo, 4, kernel32, 1)
-LoadDLLfuncEx (CreateHardLinkA, 12, kernel32, 1)
-LoadDLLfuncEx (CreateToolhelp32Snapshot, 8, kernel32, 1)
-LoadDLLfuncEx (FindFirstVolumeA, 8, kernel32, 1)
-LoadDLLfuncEx (FindNextVolumeA, 12, kernel32, 1)
-LoadDLLfuncEx (FindVolumeClose, 4, kernel32, 1)
-LoadDLLfuncEx2 (GetCompressedFileSizeA, 8, kernel32, 1, 0xffffffff)
-LoadDLLfuncEx (GetConsoleWindow, 0, kernel32, 1)
-LoadDLLfuncEx (GetDiskFreeSpaceEx, 16, kernel32, 1)
-LoadDLLfuncEx (GetNativeSystemInfo, 4, kernel32, 1)
-LoadDLLfuncEx (GetProcessWorkingSetSize, 12, kernel32, 1)
-LoadDLLfuncEx (GetVolumeNameForVolumeMountPointA, 12, kernel32, 1)
-LoadDLLfuncEx2 (IsDebuggerPresent, 0, kernel32, 1, 1)
-LoadDLLfunc (IsProcessorFeaturePresent, 4, kernel32);
-LoadDLLfuncEx (IsWow64Process, 8, kernel32, 1);
-LoadDLLfuncEx (Process32First, 8, kernel32, 1)
-LoadDLLfuncEx (Process32Next, 8, kernel32, 1)
-LoadDLLfuncEx (RegisterServiceProcess, 8, kernel32, 1)
-LoadDLLfuncEx (SetProcessWorkingSetSize, 12, kernel32, 1)
-LoadDLLfuncEx (SignalObjectAndWait, 16, kernel32, 1)
-LoadDLLfuncEx (SwitchToThread, 0, kernel32, 1)
-
-LoadDLLfunc (SHGetDesktopFolder, 4, shell32)
-
-LoadDLLfuncEx (waveOutGetNumDevs, 0, winmm, 1)
-LoadDLLfuncEx (waveOutOpen, 24, winmm, 1)
-LoadDLLfuncEx (waveOutReset, 4, winmm, 1)
-LoadDLLfuncEx (waveOutClose, 4, winmm, 1)
-LoadDLLfuncEx (waveOutGetVolume, 8, winmm, 1)
-LoadDLLfuncEx (waveOutSetVolume, 8, winmm, 1)
-LoadDLLfuncEx (waveOutUnprepareHeader, 12, winmm, 1)
-LoadDLLfuncEx (waveOutPrepareHeader, 12, winmm, 1)
-LoadDLLfuncEx (waveOutWrite, 12, winmm, 1)
-LoadDLLfuncEx (timeGetDevCaps, 8, winmm, 1)
-LoadDLLfuncEx (timeGetTime, 0, winmm, 1)
-LoadDLLfuncEx (timeBeginPeriod, 4, winmm, 1)
-LoadDLLfuncEx (timeEndPeriod, 4, winmm, 1)
-
-LoadDLLfuncEx (waveInGetNumDevs, 0, winmm, 1)
-LoadDLLfuncEx (waveInOpen, 24, winmm, 1)
-LoadDLLfuncEx (waveInUnprepareHeader, 12, winmm, 1)
-LoadDLLfuncEx (waveInPrepareHeader, 12, winmm, 1)
-LoadDLLfuncEx (waveInAddBuffer, 12, winmm, 1)
-LoadDLLfuncEx (waveInStart, 4, winmm, 1)
-LoadDLLfuncEx (waveInReset, 4, winmm, 1)
-LoadDLLfuncEx (waveInClose, 4, winmm, 1)
-
-LoadDLLfunc (WNetGetResourceInformationA, 16, mpr)
-LoadDLLfunc (WNetGetResourceParentA, 12, mpr)
-LoadDLLfunc (WNetOpenEnumA, 20, mpr)
-LoadDLLfunc (WNetEnumResourceA, 16, mpr)
-LoadDLLfunc (WNetCloseEnum, 4, mpr)
-
-LoadDLLfuncEx (UuidCreate, 4, rpcrt4, 1)
-LoadDLLfuncEx (UuidCreateSequential, 4, rpcrt4, 1)
}