[WS2_32] The current ws2_32 served us well, but it's time for ws2_32_new to shine. It took slightly more than 7 years since Ged brought-in Alex' impressive work on this module, and thanks to the great follow-up work by Peter Hater, Andreas Maier, Thomas Faber and everyone else involved in the effort, we now have a chance to retire ws2_32 in favor of ws2_32_new. The test results speak for the excellent achievements, and this serves as a platform to continue inspecting and fixing the remaining test failures. Thank you all for a job well done! Please see CORE-10440 for a summary of the changes performed in this commit.

svn path=/trunk/; revision=72750
This commit is contained in:
Amine Khaldi 2016-09-20 16:51:28 +00:00
parent 840345bf57
commit 7d07b21168
45 changed files with 916 additions and 633 deletions

View file

@ -247,7 +247,6 @@ add_subdirectory(wmi)
add_subdirectory(wmiutils)
add_subdirectory(wmvcore)
add_subdirectory(ws2_32)
add_subdirectory(ws2_32_new)
add_subdirectory(ws2help)
add_subdirectory(wshirda)
add_subdirectory(wshom.ocx)

View file

@ -1,32 +1,57 @@
add_definitions(-DLE)
add_definitions(-DWINSOCK_API_LINKAGE=DECLSPEC_EXPORT)
include_directories(BEFORE include)
include_directories(${REACTOS_SOURCE_DIR}/sdk/include/reactos/wine)
spec2def(ws2_32.dll ws2_32.spec ADD_IMPORTLIB)
include_directories(
inc
${REACTOS_SOURCE_DIR}/sdk/include/reactos/winsock)
list(APPEND SOURCE
misc/bsd.c
misc/catalog.c
misc/dllmain.c
misc/event.c
misc/handle.c
misc/ns.c
misc/sndrcv.c
misc/stubs.c
misc/upcall.c
include/ws2_32.h)
src/addrconv.c
src/addrinfo.c
src/async.c
src/bhook.c
src/dcatalog.c
src/dcatitem.c
src/dllmain.c
src/dprocess.c
src/dprovide.c
src/dsocket.c
src/dthread.c
src/dupsock.c
src/enumprot.c
src/event.c
src/getproto.c
src/getxbyxx.c
src/ioctl.c
src/nscatalo.c
src/nscatent.c
src/nspinstl.c
src/nsprovid.c
src/nsquery.c
src/qos.c
src/qshelpr.c
src/rasdial.c
src/recv.c
src/rnr.c
#src/scihlpr.c
src/select.c
src/send.c
src/sockctrl.c
src/socklife.c
src/spinstal.c
src/sputil.c
src/startup.c
src/wsautil.c
inc/ws2_32.h)
add_library(ws2_32 SHARED
${SOURCE}
wine/async.c
wine/socket.c
ws2_32.rc
${CMAKE_CURRENT_BINARY_DIR}/ws2_32.def)
set_module_type(ws2_32 win32dll UNICODE)
target_link_libraries(ws2_32 wine ${PSEH_LIB})
add_delay_importlibs(ws2_32 user32)
add_importlibs(ws2_32 advapi32 dnsapi ws2help msvcrt kernel32 ntdll)
add_pch(ws2_32 include/ws2_32.h SOURCE)
set_module_type(ws2_32 win32dll)
target_link_libraries(ws2_32 ${PSEH_LIB})
add_importlibs(ws2_32 user32 advapi32 ws2help msvcrt kernel32 ntdll)
add_pch(ws2_32 inc/ws2_32.h SOURCE)
add_cd_file(TARGET ws2_32 DESTINATION reactos/system32 FOR all)

View file

@ -79,6 +79,7 @@ typedef struct _TPROVIDER
LONG RefCount;
WSPPROC_TABLE Service;
HINSTANCE DllHandle;
WSPUPCALLTABLE UpcallTable;
} TPROVIDER, *PTPROVIDER;
typedef struct _TCATALOG_ENTRY
@ -210,6 +211,17 @@ typedef struct _ENUM_CONTEXT
PNSCATALOG Catalog;
} ENUM_CONTEXT, *PENUM_CONTEXT;
typedef struct _NSPROVIDER_ENUM_CONTEXT
{
LPINT Protocols;
LPVOID ProtocolBuffer;
DWORD BufferLength;
DWORD BufferUsed;
DWORD Count;
BOOLEAN Unicode;
INT ErrorCode;
} NSPROVIDER_ENUM_CONTEXT, *PNSPROVIDER_ENUM_CONTEXT;
typedef struct _PROTOCOL_ENUM_CONTEXT
{
LPINT Protocols;

View file

@ -73,6 +73,8 @@ inet_addr(IN CONST CHAR FAR* cp)
register u_long val, base, n;
register unsigned char c;
u_long parts[4], *pp = parts;
if (!cp) return INADDR_ANY;
if (!isdigit(*cp)) return INADDR_NONE;
again:
/*
@ -144,7 +146,7 @@ again:
break;
default:
return (-1);
return (INADDR_NONE);
}
val = htonl(val);
return (val);

View file

@ -90,17 +90,76 @@ WINAPI
ParseV4Address(IN PCWSTR AddressString,
OUT PDWORD pAddress)
{
IN_ADDR Address;
PCWSTR Terminator;
NTSTATUS Status;
*pAddress = 0;
Status = RtlIpv4StringToAddressW(AddressString, FALSE, &Terminator, &Address);
if (!NT_SUCCESS(Status))
CHAR AnsiAddressString[MAX_HOSTNAME_LEN];
CHAR * cp = AnsiAddressString;
DWORD val, base;
unsigned char c;
DWORD parts[4], *pp = parts;
if (!AddressString)
return FALSE;
WideCharToMultiByte(CP_ACP,
0,
AddressString,
-1,
AnsiAddressString,
sizeof(AnsiAddressString),
NULL,
0);
if (!isdigit(*cp)) return FALSE;
again:
/*
* Collect number up to ``.''.
* Values are specified as for C:
* 0x=hex, 0=octal, other=decimal.
*/
val = 0; base = 10;
if (*cp == '0') {
if (*++cp == 'x' || *cp == 'X')
base = 16, cp++;
else
base = 8;
}
while ((c = *cp)) {
if (isdigit(c)) {
val = (val * base) + (c - '0');
cp++;
continue;
}
if (base == 16 && isxdigit(c)) {
val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
cp++;
continue;
}
break;
}
if (*cp == '.') {
/*
* Internet format:
* a.b.c.d
*/
if (pp >= parts + 4) return FALSE;
*pp++ = val;
cp++;
goto again;
}
/*
* Check for trailing characters.
*/
if (*cp) return FALSE;
*pp++ = val;
/*
* Concoct the address according to
* the number of parts specified.
*/
if ((DWORD)(pp - parts) != 4) return FALSE;
if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xff || parts[3] > 0xff) return FALSE;
val = (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3];
if (pAddress)
*pAddress = htonl(val);
*pAddress = Address.S_un.S_addr;
return TRUE;
}
@ -530,7 +589,7 @@ GetAddrInfoW(IN PCWSTR pszNodeName,
pszServiceName,
-1,
AnsiServiceName,
256,
sizeof(AnsiServiceName),
NULL,
0);
@ -543,6 +602,7 @@ GetAddrInfoW(IN PCWSTR pszNodeName,
/* Get the port directly */
wPort = wTcpPort = wUdpPort = htons(wPort);
#if 0
/* Check if this is both TCP and UDP */
if (iSocketType == 0)
{
@ -550,9 +610,11 @@ GetAddrInfoW(IN PCWSTR pszNodeName,
bClone = TRUE;
iSocketType = SOCK_STREAM;
}
#endif
}
else
{
wPort = 0;
/* The port name was a string. Check if this is a UDP socket */
if ((iSocketType == 0) || (iSocketType == SOCK_DGRAM))
{
@ -576,15 +638,18 @@ GetAddrInfoW(IN PCWSTR pszNodeName,
/* If we got 0, then fail */
if (wPort == 0)
{
return iSocketType ? EAI_SERVICE : EAI_NONAME;
return EAI_SERVICE;
}
/* Check if this was for both */
if (iSocketType == 0)
{
/* Do the TCP case right now */
iSocketType = (wTcpPort) ? SOCK_STREAM : SOCK_DGRAM;
bClone = (wTcpPort && wUdpPort);
if (wTcpPort && !wUdpPort)
iSocketType = SOCK_STREAM;
if (!wTcpPort && wUdpPort)
iSocketType = SOCK_DGRAM;
//bClone = (wTcpPort && wUdpPort);
}
}
}
@ -612,7 +677,7 @@ GetAddrInfoW(IN PCWSTR pszNodeName,
/* Set AI_NUMERICHOST since this is a numeric string */
(*pptResult)->ai_flags |= AI_NUMERICHOST;
/* Check if the canonical name was requestd */
/* Check if the canonical name was requested */
if (iFlags & AI_CANONNAME)
{
/* Get the canonical name */
@ -657,7 +722,7 @@ GetAddrInfoW(IN PCWSTR pszNodeName,
pszNodeName,
-1,
AnsiNodeName,
256,
sizeof(AnsiNodeName),
NULL,
0);
@ -736,23 +801,23 @@ getaddrinfo(const char FAR *nodename,
struct addrinfo FAR * FAR *res)
{
INT ErrorCode;
LPWSTR UnicodeNodeName;
LPWSTR UnicodeNodeName = NULL;
LPWSTR UnicodeServName = NULL;
DPRINT("getaddrinfo: %s, %s, %p, %p\n", nodename, servname, hints, res);
/* Check for WSAStartup */
if ((ErrorCode = WsQuickProlog()) != ERROR_SUCCESS) return ErrorCode;
/* Assume NULL */
*res = NULL;
/* Convert the node name */
UnicodeNodeName = UnicodeDupFromAnsi((LPSTR)nodename);
if (!UnicodeNodeName)
if (nodename)
{
/* Prepare to fail */
ErrorCode = GetLastError();
goto Quickie;
UnicodeNodeName = UnicodeDupFromAnsi((LPSTR)nodename);
if (!UnicodeNodeName)
{
/* Prepare to fail */
ErrorCode = GetLastError();
goto Quickie;
}
}
/* Convert the servname too, if we have one */
@ -937,7 +1002,7 @@ getnameinfo(const struct sockaddr FAR *sa,
{
/* Setup the data for it */
ServiceString = ServiceBuffer;
ServLength = sizeof(ServiceBuffer) / sizeof(WCHAR);
ServLength = sizeof(ServiceBuffer) - 1;
}
/* Now call the unicode function */

View file

@ -10,9 +10,10 @@
#include <ws2_32.h>
/* DATA **********************************************************************/
#define NDEBUG
#include <debug.h>
#define TCCATALOG_NAME "Protocol_Catalog9"
/* DATA **********************************************************************/
#define WsTcLock() EnterCriticalSection((LPCRITICAL_SECTION)&Catalog->Lock);
#define WsTcUnlock() LeaveCriticalSection((LPCRITICAL_SECTION)&Catalog->Lock);
@ -45,14 +46,33 @@ WsTcOpen(IN PTCATALOG Catalog,
DWORD RegSize = sizeof(DWORD);
DWORD UniqueId = 0;
DWORD NewData = 0;
CHAR* CatalogKeyName;
/* Initialize the catalog lock and namespace list */
InitializeCriticalSection((LPCRITICAL_SECTION)&Catalog->Lock);
InitializeListHead(&Catalog->ProtocolList);
/* Read the catalog name */
ErrorCode = RegQueryValueEx(ParentKey,
"Current_Protocol_Catalog",
0,
&RegType,
NULL,
&RegSize);
CatalogKeyName = HeapAlloc(WsSockHeap, 0, RegSize);
/* Read the catalog name */
ErrorCode = RegQueryValueEx(ParentKey,
"Current_Protocol_Catalog",
0,
&RegType,
(LPBYTE)CatalogKeyName,
&RegSize);
/* Open the Catalog Key */
ErrorCode = RegOpenKeyEx(ParentKey,
TCCATALOG_NAME,
CatalogKeyName,
0,
MAXIMUM_ALLOWED,
&CatalogKey);
@ -67,7 +87,7 @@ WsTcOpen(IN PTCATALOG Catalog,
{
/* Create the Catalog Name */
ErrorCode = RegCreateKeyEx(ParentKey,
TCCATALOG_NAME,
CatalogKeyName,
0,
NULL,
REG_OPTION_NON_VOLATILE,
@ -77,6 +97,10 @@ WsTcOpen(IN PTCATALOG Catalog,
&CreateDisposition);
}
HeapFree(WsSockHeap, 0, CatalogKeyName);
RegType = REG_DWORD;
RegSize = sizeof(DWORD);
/* Fail if that didn't work */
if (ErrorCode != ERROR_SUCCESS) return FALSE;
@ -149,6 +173,7 @@ WsTcOpen(IN PTCATALOG Catalog,
}
else
{
RegSize = sizeof(DWORD);
/* Read the serial number */
ErrorCode = RegQueryValueEx(CatalogKey,
"Serial_Access_Num",
@ -409,6 +434,7 @@ WsTcGetEntryFromCatalogEntryId(IN PTCATALOG Catalog,
IN DWORD CatalogEntryId,
IN PTCATALOG_ENTRY *CatalogEntry)
{
INT ErrorCode = WSAEINVAL;
PLIST_ENTRY NextEntry = Catalog->ProtocolList.Flink;
PTCATALOG_ENTRY Entry;
@ -435,6 +461,7 @@ WsTcGetEntryFromCatalogEntryId(IN PTCATALOG Catalog,
/* Reference the entry and return it */
InterlockedIncrement(&Entry->RefCount);
*CatalogEntry = Entry;
ErrorCode = ERROR_SUCCESS;
break;
}
}
@ -443,7 +470,7 @@ WsTcGetEntryFromCatalogEntryId(IN PTCATALOG Catalog,
WsTcUnlock();
/* Return */
return ERROR_SUCCESS;
return ErrorCode;
}
DWORD
@ -458,6 +485,7 @@ WsTcGetEntryFromTriplet(IN PTCATALOG Catalog,
INT ErrorCode = WSAEINVAL;
PLIST_ENTRY NextEntry = Catalog->ProtocolList.Flink;
PTCATALOG_ENTRY Entry;
DPRINT("WsTcGetEntryFromTriplet: %lx, %lx, %lx, %lx\n", af, type, protocol, StartId);
/* Assume failure */
*CatalogEntry = NULL;
@ -494,9 +522,9 @@ WsTcGetEntryFromTriplet(IN PTCATALOG Catalog,
if ((Entry->ProtocolInfo.iSocketType == type) || (type == 0))
{
/* Check if Protocol is In Range or if it's wildcard */
if (((Entry->ProtocolInfo.iProtocol >= protocol) &&
if (((Entry->ProtocolInfo.iProtocol <= protocol) &&
((Entry->ProtocolInfo.iProtocol +
Entry->ProtocolInfo.iProtocolMaxOffset) <= protocol)) ||
Entry->ProtocolInfo.iProtocolMaxOffset) >= protocol)) ||
(protocol == 0))
{
/* Check if it doesn't already have a provider */
@ -580,6 +608,7 @@ WsTcLoadProvider(IN PTCATALOG Catalog,
{
INT ErrorCode = ERROR_SUCCESS;
PTPROVIDER Provider;
DPRINT("WsTcLoadProvider: %p, %p\n", Catalog, CatalogEntry);
/* Lock the catalog */
WsTcLock();

View file

@ -67,6 +67,8 @@ WsTcEntryInitializeFromRegistry(IN PTCATALOG_ENTRY CatalogEntry,
DWORD RegType = REG_BINARY;
HKEY EntryKey;
DWORD Return;
LPBYTE Buf;
DWORD index;
/* Convert to a 00000xxx string */
sprintf(CatalogEntryName, "%0""12""lu", UniqueId);
@ -79,21 +81,34 @@ WsTcEntryInitializeFromRegistry(IN PTCATALOG_ENTRY CatalogEntry,
&EntryKey);
/* Get Size of Catalog Entry Structure */
Return = RegQueryValueExW(EntryKey,
L"PackedCatalogItem",
Return = RegQueryValueEx(EntryKey,
"PackedCatalogItem",
0,
NULL,
NULL,
&RegSize);
if(!(Buf = HeapAlloc(WsSockHeap, HEAP_ZERO_MEMORY, RegSize)))
return ERROR_NOT_ENOUGH_MEMORY;
/* Read the Whole Catalog Entry Structure */
Return = RegQueryValueExW(EntryKey,
L"PackedCatalogItem",
Return = RegQueryValueEx(EntryKey,
"PackedCatalogItem",
0,
&RegType,
(LPBYTE)&CatalogEntry->DllPath,
Buf,
&RegSize);
memcpy(CatalogEntry->DllPath, (LPCSTR)Buf, sizeof(CatalogEntry->DllPath));
index = sizeof(CatalogEntry->DllPath);
if(index < RegSize)
{
memcpy(&CatalogEntry->ProtocolInfo, &Buf[index], sizeof(WSAPROTOCOL_INFOW));
index += sizeof(WSAPROTOCOL_INFOW);
}
HeapFree(WsSockHeap, 0, Buf);
/* Done */
RegCloseKey(EntryKey);
return Return;

View file

@ -10,6 +10,9 @@
#include <ws2_32.h>
#define NDEBUG
#include <debug.h>
/* FUNCTIONS *****************************************************************/
PTPROVIDER
@ -18,6 +21,7 @@ WsTpAllocate(VOID)
{
PTPROVIDER Provider;
DPRINT("WsTpAllocate: WsSockHeap %d\n", WsSockHeap);
/* Allocate the object */
Provider = HeapAlloc(WsSockHeap, HEAP_ZERO_MEMORY, sizeof(*Provider));
@ -35,31 +39,32 @@ WsTpInitialize(IN PTPROVIDER Provider,
IN LPWSAPROTOCOL_INFOW ProtocolInfo)
{
WORD VersionRequested = MAKEWORD(2,2);
WSPUPCALLTABLE UpcallTable;
LPWSPSTARTUP WSPStartupProc;
WSPDATA WspData;
CHAR ExpandedDllPath[MAX_PATH];
DWORD ErrorCode;
DPRINT("WsTpInitialize: %p, %p, %p\n", Provider, DllName, ProtocolInfo);
/* Clear the tables */
RtlZeroMemory(&UpcallTable, sizeof(UpcallTable));
RtlZeroMemory(&Provider->UpcallTable, sizeof(WSPUPCALLTABLE));
RtlZeroMemory(&Provider->Service.lpWSPAccept, sizeof(WSPPROC_TABLE));
/* Set up the Upcall Table */
UpcallTable.lpWPUCloseEvent = WPUCloseEvent;
UpcallTable.lpWPUCloseSocketHandle = WPUCloseSocketHandle;
UpcallTable.lpWPUCreateEvent = WPUCreateEvent;
UpcallTable.lpWPUCreateSocketHandle = WPUCreateSocketHandle;
UpcallTable.lpWPUFDIsSet = WPUFDIsSet;
UpcallTable.lpWPUGetProviderPath = WPUGetProviderPath;
UpcallTable.lpWPUModifyIFSHandle = WPUModifyIFSHandle;
UpcallTable.lpWPUPostMessage = WPUPostMessage;
UpcallTable.lpWPUQueryBlockingCallback = WPUQueryBlockingCallback;
UpcallTable.lpWPUQuerySocketHandleContext = WPUQuerySocketHandleContext;
UpcallTable.lpWPUQueueApc = WPUQueueApc;
UpcallTable.lpWPUResetEvent = WPUResetEvent;
UpcallTable.lpWPUSetEvent = WPUSetEvent;
UpcallTable.lpWPUOpenCurrentThread = WPUOpenCurrentThread;
UpcallTable.lpWPUCloseThread = WPUCloseThread;
Provider->UpcallTable.lpWPUCloseEvent = WPUCloseEvent;
Provider->UpcallTable.lpWPUCloseSocketHandle = WPUCloseSocketHandle;
Provider->UpcallTable.lpWPUCreateEvent = WPUCreateEvent;
Provider->UpcallTable.lpWPUCreateSocketHandle = WPUCreateSocketHandle;
Provider->UpcallTable.lpWPUFDIsSet = WPUFDIsSet;
Provider->UpcallTable.lpWPUGetProviderPath = WPUGetProviderPath;
Provider->UpcallTable.lpWPUModifyIFSHandle = WPUModifyIFSHandle;
Provider->UpcallTable.lpWPUPostMessage = WPUPostMessage;
Provider->UpcallTable.lpWPUQueryBlockingCallback = WPUQueryBlockingCallback;
Provider->UpcallTable.lpWPUQuerySocketHandleContext = WPUQuerySocketHandleContext;
Provider->UpcallTable.lpWPUQueueApc = WPUQueueApc;
Provider->UpcallTable.lpWPUResetEvent = WPUResetEvent;
Provider->UpcallTable.lpWPUSetEvent = WPUSetEvent;
Provider->UpcallTable.lpWPUOpenCurrentThread = WPUOpenCurrentThread;
Provider->UpcallTable.lpWPUCloseThread = WPUCloseThread;
/* Expand the DLL Path */
ExpandEnvironmentStrings(DllName, ExpandedDllPath, MAX_PATH);
@ -67,18 +72,26 @@ WsTpInitialize(IN PTPROVIDER Provider,
/* Load the DLL */
Provider->DllHandle = LoadLibrary(ExpandedDllPath);
if(!Provider->DllHandle)
{
return SOCKET_ERROR;
}
/* Get the pointer to WSPStartup */
WSPStartupProc = (LPWSPSTARTUP)GetProcAddress(Provider->DllHandle, "WSPStartup");
if(!WSPStartupProc)
{
return SOCKET_ERROR;
}
/* Call it */
(*WSPStartupProc)(VersionRequested,
ErrorCode = (*WSPStartupProc)(VersionRequested,
&WspData,
ProtocolInfo,
UpcallTable,
Provider->UpcallTable,
(LPWSPPROC_TABLE)&Provider->Service.lpWSPAccept);
/* Return */
return ERROR_SUCCESS;
return ErrorCode;
}
DWORD

View file

@ -31,7 +31,7 @@ CheckProtocolMatch(IN LPINT ProtocolSet,
ProtocolId = ProtocolSet[i];
/* Loop the list */
while (ProtocolId != 0)
while (ProtocolId != 0 && ProtocolInfo->iProtocol != 0)
{
/* Check if it's within ranges */
if ((ProtocolId >= ProtocolInfo->iProtocol) &&
@ -188,7 +188,7 @@ WSCEnumProtocols(IN LPINT lpiProtocols,
}
/*
* @unimplemented
* @implemented
*/
INT
WSAAPI
@ -196,14 +196,46 @@ WSAEnumProtocolsA(IN LPINT lpiProtocols,
OUT LPWSAPROTOCOL_INFOA lpProtocolBuffer,
IN OUT LPDWORD lpdwBufferLength)
{
DPRINT("WSAEnumProtocolsA: %p\n", lpiProtocols);
UNIMPLEMENTED;
SetLastError(WSAEINVAL);
return SOCKET_ERROR;
INT error, i, count;
LPWSAPROTOCOL_INFOW protocolInfoW;
DWORD size;
DPRINT("WSAEnumProtocolsA: %p %p %p\n", lpiProtocols, lpProtocolBuffer, lpdwBufferLength);
if (!lpdwBufferLength)
{
SetLastError(WSAENOBUFS);
return SOCKET_ERROR;
}
count = WSCEnumProtocols(lpiProtocols, NULL, &size, &error);
if (!lpProtocolBuffer || *lpdwBufferLength < (size/sizeof(WSAPROTOCOL_INFOW))*sizeof(WSAPROTOCOL_INFOA))
{
*lpdwBufferLength = (size/sizeof(WSAPROTOCOL_INFOW))*sizeof(WSAPROTOCOL_INFOA);
SetLastError(WSAENOBUFS);
return SOCKET_ERROR;
}
protocolInfoW = HeapAlloc(WsSockHeap, 0, size);
count = WSCEnumProtocols(lpiProtocols, protocolInfoW, &size, &error);
if (SOCKET_ERROR == count)
{
HeapFree(WsSockHeap, 0, protocolInfoW);
SetLastError(error);
return SOCKET_ERROR;
}
*lpdwBufferLength = 0;
for (i = 0; i < count; i++)
{
/* Copy the data */
RtlMoveMemory(&lpProtocolBuffer[i],
&protocolInfoW[i],
sizeof(lpProtocolBuffer[0])-sizeof(lpProtocolBuffer[0].szProtocol));
wcstombs(lpProtocolBuffer[i].szProtocol, protocolInfoW[i].szProtocol, sizeof(lpProtocolBuffer[0].szProtocol));
*lpdwBufferLength += sizeof(WSAPROTOCOL_INFOA);
}
HeapFree(WsSockHeap, 0, protocolInfoW);
return i;
}
/*
* @unimplemented
* @implemented
*/
INT
WSAAPI
@ -211,14 +243,20 @@ WSAEnumProtocolsW(IN LPINT lpiProtocols,
OUT LPWSAPROTOCOL_INFOW lpProtocolBuffer,
IN OUT LPDWORD lpdwBufferLength)
{
DPRINT("WSAEnumProtocolsW: %p\n", lpiProtocols);
UNIMPLEMENTED;
SetLastError(WSAEINVAL);
return SOCKET_ERROR;
INT error, count;
DPRINT("WSAEnumProtocolsW: %p %p %p\n", lpiProtocols, lpProtocolBuffer, lpdwBufferLength);
count = WSCEnumProtocols(lpiProtocols, lpProtocolBuffer, lpdwBufferLength, &error);
if (SOCKET_ERROR == count)
{
SetLastError(error);
return SOCKET_ERROR;
}
return count;
}
/*
* @unimplemented
* @implemented
*/
INT
WSPAPI
@ -227,13 +265,11 @@ WPUGetProviderPath(IN LPGUID lpProviderId,
IN OUT LPINT lpProviderDllPathLen,
OUT LPINT lpErrno)
{
DPRINT("WPUGetProviderPath: %p\n", lpProviderId);
UNIMPLEMENTED;
return 0;
return WSCGetProviderPath(lpProviderId, lpszProviderDllPath, lpProviderDllPathLen, lpErrno);
}
/*
* @unimplemented
* @implemented
*/
INT
WSAAPI
@ -257,7 +293,7 @@ WSCGetProviderPath(IN LPGUID lpProviderId,
IN OUT LPINT lpProviderDllPathLen,
OUT LPINT lpErrno)
{
DPRINT("WSCGetProviderPath: %p\n", lpProviderId);
DPRINT("WSCGetProviderPath: %p %p %p %p\n", lpProviderId, lpszProviderDllPath, lpProviderDllPathLen, lpErrno);
UNIMPLEMENTED;
SetLastError(WSAEINVAL);
return SOCKET_ERROR;

View file

@ -19,12 +19,17 @@ HANDLE
WSAAPI
GetProtoOpenNetworkDatabase(PCHAR Name)
{
CHAR ExpandedPath[MAX_PATH];
CHAR DatabasePath[MAX_PATH];
PCHAR ExpandedPath;
PCHAR DatabasePath;
INT ErrorCode;
HKEY DatabaseKey;
DWORD RegType;
DWORD RegSize = sizeof(DatabasePath);
DWORD RegSize = 0;
HANDLE ret;
ExpandedPath = HeapAlloc(WsSockHeap, 0, MAX_PATH);
if (!ExpandedPath)
return INVALID_HANDLE_VALUE;
/* Open the database path key */
ErrorCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
@ -34,6 +39,21 @@ GetProtoOpenNetworkDatabase(PCHAR Name)
&DatabaseKey);
if (ErrorCode == NO_ERROR)
{
/* Read the actual path */
ErrorCode = RegQueryValueEx(DatabaseKey,
"DatabasePath",
NULL,
&RegType,
NULL,
&RegSize);
DatabasePath = HeapAlloc(WsSockHeap, 0, RegSize);
if (!DatabasePath)
{
HeapFree(WsSockHeap, 0, ExpandedPath);
return INVALID_HANDLE_VALUE;
}
/* Read the actual path */
ErrorCode = RegQueryValueEx(DatabaseKey,
"DatabasePath",
@ -42,37 +62,48 @@ GetProtoOpenNetworkDatabase(PCHAR Name)
(LPBYTE)DatabasePath,
&RegSize);
/* Close the key */
RegCloseKey(DatabaseKey);
/* Expand the name */
ExpandEnvironmentStrings(DatabasePath, ExpandedPath, MAX_PATH);
HeapFree(WsSockHeap, 0, DatabasePath);
}
else
{
/* Use defalt path */
GetSystemDirectory(ExpandedPath, MAX_PATH);
strcat(ExpandedPath, "DRIVERS\\ETC\\");
if (ExpandedPath[strlen(ExpandedPath) - 1] != '\\')
{
/* It isn't, so add it ourselves */
strncat(ExpandedPath, "\\", MAX_PATH);
}
strncat(ExpandedPath, "DRIVERS\\ETC\\", MAX_PATH);
}
/* Make sure that the path is backslash-terminated */
if (ExpandedPath[strlen(ExpandedPath) - 1] != '\\')
{
/* It isn't, so add it ourselves */
strcat(ExpandedPath, "\\");
strncat(ExpandedPath, "\\", MAX_PATH);
}
/* Add the database name */
strcat(ExpandedPath, Name);
strncat(ExpandedPath, Name, MAX_PATH);
/* Return a handle to the file */
return CreateFile(ExpandedPath,
ret = CreateFile(ExpandedPath,
FILE_READ_ACCESS,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
HeapFree(WsSockHeap, 0, ExpandedPath);
return ret;
}
PCHAR
@ -118,9 +149,6 @@ GetProtoGetNextEnt(IN HANDLE DbHandle,
&Read,
NULL)) return NULL;
/* Null terminate LineBuffer */
Buffer->LineBuffer[Read] = ANSI_NULL;
/* Find out where the line ends */
p1 = Buffer->LineBuffer;
p = strchr(Buffer->LineBuffer, '\n');
@ -215,7 +243,7 @@ getprotobynumber(IN INT number)
PWSTHREAD Thread;
INT ErrorCode;
PPROTOENT Protoent;
PVOID GetProtoBuffer;
PVOID GetProtoBuffer;
HANDLE DbHandle;
DPRINT("getprotobynumber: %lx\n", number);
@ -279,7 +307,7 @@ getprotobyname(IN CONST CHAR FAR *name)
PWSTHREAD Thread;
INT ErrorCode;
PPROTOENT Protoent;
PVOID GetProtoBuffer;
PVOID GetProtoBuffer;
HANDLE DbHandle;
DPRINT("getprotobyname: %s\n", name);

View file

@ -108,9 +108,11 @@ getxyDataEnt(IN OUT PCHAR *Results,
{
PWSAQUERYSETA WsaQuery = (PWSAQUERYSETA)*Results;
INT ErrorCode;
DWORD NewLength = Length;
HANDLE RnRHandle;
LPBLOB Blob = NULL;
PVOID NewResults;
PVOID NewResults = NULL;
DWORD dwControlFlags = LUP_RETURN_NAME;
/* Assume empty return name */
if (NewName) *NewName = NULL;
@ -121,12 +123,15 @@ getxyDataEnt(IN OUT PCHAR *Results,
WsaQuery->lpszServiceInstanceName = Name;
WsaQuery->lpServiceClassId = (LPGUID)Type;
WsaQuery->dwNameSpace = NS_ALL;
WsaQuery->dwNumberOfProtocols = 2;
WsaQuery->lpafpProtocols = &afp[0];
WsaQuery->dwNumberOfProtocols = sizeof(afp)/sizeof(afp[0]);
WsaQuery->lpafpProtocols = afp;
if(!IsEqualGUID(Type, &HostnameGuid))
dwControlFlags |= LUP_RETURN_BLOB;
/* Send the Query Request to find a Service */
ErrorCode = WSALookupServiceBeginA(WsaQuery,
LUP_RETURN_BLOB | LUP_RETURN_NAME,
dwControlFlags,
&RnRHandle);
if(ErrorCode == ERROR_SUCCESS)
@ -136,7 +141,7 @@ getxyDataEnt(IN OUT PCHAR *Results,
/* Service was found, send the real query */
ErrorCode = WSALookupServiceNextA(RnRHandle,
0,
&Length,
&NewLength,
WsaQuery);
/* Return the information requested */
@ -152,7 +157,7 @@ getxyDataEnt(IN OUT PCHAR *Results,
else
{
/* Check if this was a Hostname lookup */
if (Type == &HostnameGuid)
if (IsEqualGUID(Type, &HostnameGuid))
{
/* Return the name anyways */
if(NewName) *NewName = WsaQuery->lpszServiceInstanceName;
@ -368,7 +373,7 @@ gethostbyaddr(IN const char FAR * addr,
else
{
/* We failed, so zero it out */
Hostent = 0;
Hostent = NULL;
/* Normalize the error message */
if(GetLastError() == WSASERVICE_NOT_FOUND)
@ -390,18 +395,25 @@ gethostbyaddr(IN const char FAR * addr,
INT
WSAAPI
gethostname(OUT char FAR * name,
IN int namelen)
IN INT namelen)
{
PCHAR Name;
PCHAR Name = NULL;
CHAR ResultsBuffer[RNR_BUFFER_SIZE];
PCHAR Results = ResultsBuffer;
DPRINT("gethostname: %p\n", name);
if (!name || namelen < 1)
{
SetLastError(WSAEFAULT);
return SOCKET_ERROR;
}
/* Get the Hostname in a String */
if(getxyDataEnt(&Results, RNR_BUFFER_SIZE, NULL, &HostnameGuid, &Name))
/* getxyDataEnt does not return blob for HostnameGuid */
getxyDataEnt(&Results, RNR_BUFFER_SIZE, NULL, &HostnameGuid, &Name);
if(Name)
{
/* Copy it */
strcpy((LPSTR)name, Name);
strncpy((LPSTR)name, Name, namelen-1);
}
/* Check if we received a newly allocated buffer; free it. */
@ -450,7 +462,7 @@ getservbyport(IN int port,
}
/* Put it into the right syntax */
sprintf(PortName, "%d/%s", (port & 0xffff), proto);
sprintf(PortName, "%d/%s", (ntohs(port) & 0xffff), proto);
/* Get the Service in a Blob */
Blob = getxyDataEnt(&Results, RNR_BUFFER_SIZE, PortName, &IANAGuid, 0);
@ -471,9 +483,6 @@ getservbyport(IN int port,
{
/* We failed, so zero it out */
Servent = 0;
/* Normalize the error message */
if(GetLastError() == WSATYPE_NOT_FOUND) SetLastError(WSANO_DATA);
}
/* Check if we received a newly allocated buffer; free it. */
@ -543,9 +552,6 @@ getservbyname(IN const char FAR * name,
{
/* We failed, so zero it out */
Servent = 0;
/* Normalize the error message */
if(GetLastError() == WSATYPE_NOT_FOUND) SetLastError(WSANO_DATA);
}
/* Check if we received a newly allocated buffer; free it. */

View file

@ -10,9 +10,11 @@
#include <ws2_32.h>
#define NDEBUG
#include <debug.h>
/* DATA **********************************************************************/
#define NSCATALOG_NAME "NameSpace_Catalog5"
#define WsNcLock() EnterCriticalSection((LPCRITICAL_SECTION)&Catalog->Lock);
#define WsNcUnlock() LeaveCriticalSection((LPCRITICAL_SECTION)&Catalog->Lock);
@ -39,19 +41,37 @@ WsNcOpen(IN PNSCATALOG Catalog,
LONG ErrorCode;
DWORD CreateDisposition;
HKEY CatalogKey, NewKey;
//DWORD CatalogEntries = 0;
DWORD RegType = REG_DWORD;
DWORD RegSize = sizeof(DWORD);
DWORD UniqueId = 0;
DWORD NewData = 0;
CHAR* CatalogKeyName;
/* Initialize the catalog lock and namespace list */
InitializeCriticalSection((LPCRITICAL_SECTION)&Catalog->Lock);
InitializeListHead(&Catalog->CatalogList);
/* Read the catalog name */
ErrorCode = RegQueryValueEx(ParentKey,
"Current_NameSpace_Catalog",
0,
&RegType,
NULL,
&RegSize);
CatalogKeyName = HeapAlloc(WsSockHeap, 0, RegSize);
/* Read the catalog name */
ErrorCode = RegQueryValueEx(ParentKey,
"Current_NameSpace_Catalog",
0,
&RegType,
(LPBYTE)CatalogKeyName,
&RegSize);
/* Open the Catalog Key */
ErrorCode = RegOpenKeyEx(ParentKey,
NSCATALOG_NAME,
CatalogKeyName,
0,
MAXIMUM_ALLOWED,
&CatalogKey);
@ -66,7 +86,7 @@ WsNcOpen(IN PNSCATALOG Catalog,
{
/* Create the Catalog Name */
ErrorCode = RegCreateKeyEx(ParentKey,
NSCATALOG_NAME,
CatalogKeyName,
0,
NULL,
REG_OPTION_NON_VOLATILE,
@ -76,6 +96,10 @@ WsNcOpen(IN PNSCATALOG Catalog,
&CreateDisposition);
}
HeapFree(WsSockHeap, 0, CatalogKeyName);
RegType = REG_DWORD;
RegSize = sizeof(DWORD);
/* Fail if that didn't work */
if (ErrorCode != ERROR_SUCCESS) return FALSE;
@ -133,6 +157,7 @@ WsNcOpen(IN PNSCATALOG Catalog,
}
else
{
RegSize = sizeof(UniqueId);
/* Read the serial number */
ErrorCode = RegQueryValueEx(CatalogKey,
"Serial_Access_Num",

View file

@ -0,0 +1,181 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 API
* FILE: dll/win32/ws2_32_new/src/nscatent.c
* PURPOSE: Namespace Catalog Entry Object
* PROGRAMMER: Alex Ionescu (alex@relsoft.net)
*/
/* INCLUDES ******************************************************************/
#include <ws2_32.h>
/* FUNCTIONS *****************************************************************/
PNSCATALOG_ENTRY
WSAAPI
WsNcEntryAllocate(VOID)
{
PNSCATALOG_ENTRY CatalogEntry;
/* Allocate the catalog */
CatalogEntry = HeapAlloc(WsSockHeap, HEAP_ZERO_MEMORY, sizeof(*CatalogEntry));
/* Set the default non-null members */
CatalogEntry->RefCount = 1;
CatalogEntry->Enabled = TRUE;
CatalogEntry->AddressFamily = -1;
/* Return it */
return CatalogEntry;
}
VOID
WSAAPI
WsNcEntryDelete(IN PNSCATALOG_ENTRY CatalogEntry)
{
/* Check if a provider is loaded */
if (CatalogEntry->Provider)
{
/* Dereference it too */
WsNpDereference(CatalogEntry->Provider);
CatalogEntry->Provider = NULL;
}
/* Delete us */
HeapFree(WsSockHeap, 0, CatalogEntry);
}
VOID
WSAAPI
WsNcEntryDereference(IN PNSCATALOG_ENTRY CatalogEntry)
{
/* Dereference and check if it's now 0 */
if (!(InterlockedDecrement(&CatalogEntry->RefCount)))
{
/* We can delete the Provider now */
WsNcEntryDelete(CatalogEntry);
}
}
INT
WSAAPI
WsNcEntryInitializeFromRegistry(IN PNSCATALOG_ENTRY CatalogEntry,
IN HKEY ParentKey,
IN ULONG UniqueId)
{
INT ErrorCode;
CHAR CatalogEntryName[13];
HKEY EntryKey;
ULONG RegType = REG_SZ;
ULONG RegSize = MAX_PATH;
ULONG RegValue;
/* Convert to a 00000xxx string */
sprintf(CatalogEntryName, "%0""12""i", (int)UniqueId);
/* Open the Entry */
ErrorCode = RegOpenKeyEx(ParentKey,
CatalogEntryName,
0,
KEY_READ,
&EntryKey);
if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
/* Read the Library Path */
ErrorCode = RegQueryValueExW(EntryKey,
L"LibraryPath",
0,
&RegType,
(LPBYTE)&CatalogEntry->DllPath,
&RegSize);
if (ErrorCode != ERROR_SUCCESS) goto out;
/* Query Display String Size*/
ErrorCode = RegQueryValueExW(EntryKey,
L"DisplayString",
0,
NULL,
NULL,
&RegSize);
if (ErrorCode != ERROR_SUCCESS) goto out;
/* Allocate it */
CatalogEntry->ProviderName = (LPWSTR)HeapAlloc(WsSockHeap, 0, RegSize);
/* Read it */
ErrorCode = RegQueryValueExW(EntryKey,
L"DisplayString",
0,
&RegType,
(LPBYTE)CatalogEntry->ProviderName,
&RegSize);
if (ErrorCode != ERROR_SUCCESS) goto out;
/* Read the Provider Id */
RegType = REG_BINARY;
RegSize = sizeof(GUID);
ErrorCode = RegQueryValueEx(EntryKey,
"ProviderId",
0,
&RegType,
(LPBYTE)&CatalogEntry->ProviderId,
&RegSize);
if (ErrorCode != ERROR_SUCCESS) goto out;
/* Read the Address Family */
RegType = REG_DWORD;
RegSize = sizeof(DWORD);
ErrorCode = RegQueryValueEx(EntryKey,
"AddressFamily",
0,
&RegType,
(LPBYTE)&CatalogEntry->AddressFamily,
&RegSize);
if (ErrorCode != ERROR_SUCCESS) goto out;
/* Read the Namespace Id */
ErrorCode = RegQueryValueEx(EntryKey,
"SupportedNamespace",
0,
&RegType,
(LPBYTE)&CatalogEntry->NamespaceId,
&RegSize);
if (ErrorCode != ERROR_SUCCESS) goto out;
/* Read the Enabled Flag */
ErrorCode = RegQueryValueEx(EntryKey,
"Enabled",
0,
&RegType,
(LPBYTE)&RegValue,
&RegSize);
if (ErrorCode != ERROR_SUCCESS) goto out;
CatalogEntry->Enabled = RegValue != 0;
/* Read the Version */
ErrorCode = RegQueryValueEx(EntryKey,
"Version",
0,
&RegType,
(LPBYTE)&CatalogEntry->Version,
&RegSize);
if (ErrorCode != ERROR_SUCCESS) goto out;
/* Read the Support Service Class Info Flag */
ErrorCode = RegQueryValueEx(EntryKey,
"StoresServiceClassInfo",
0,
&RegType,
(LPBYTE)&RegValue,
&RegSize);
CatalogEntry->StoresServiceClassInfo = RegValue != 0;
out:
/* Done */
RegCloseKey(EntryKey);
return ErrorCode;
}
VOID
WSAAPI
WsNcEntrySetProvider(IN PNSCATALOG_ENTRY Entry,
IN PNS_PROVIDER Provider)
{
/* Reference the provider */
InterlockedIncrement(&Provider->RefCount);
/* Set it */
Entry->Provider = Provider;
}

View file

@ -360,7 +360,7 @@ WsNqLookupServiceBegin(IN PNSQUERY NsQuery,
{
WSASERVICECLASSINFOW ClassInfo;
PNSQUERY_PROVIDER Provider;
LPWSASERVICECLASSINFOW pClassInfo = NULL;
LPWSASERVICECLASSINFOW pClassInfo = &ClassInfo;
PNSQUERY_PROVIDER NextProvider;
PLIST_ENTRY Entry;
INT ErrorCode;
@ -438,7 +438,7 @@ WsNqLookupServiceBegin(IN PNSQUERY NsQuery,
/* Get the class information */
ClassInfo.lpServiceClassId = Restrictions->lpServiceClassId;
ErrorCode = WsNcGetServiceClassInfo(Catalog, &ClassInfoSize, &ClassInfo);
ErrorCode = WsNcGetServiceClassInfo(Catalog, &ClassInfoSize, pClassInfo);
/* Check if more buffer space is needed */
if ((ErrorCode == SOCKET_ERROR) && (GetLastError() == WSAEFAULT))

View file

@ -214,7 +214,7 @@ WSALookupServiceEnd(IN HANDLE hLookup)
}
/* Check for a valid handle, then validate and reference it */
if (!(Query) || !(WsNqValidateAndReference(Query)))
if (IsBadReadPtr(Query, sizeof(*Query)) || !WsNqValidateAndReference(Query))
{
/* Fail */
SetLastError(WSA_INVALID_HANDLE);
@ -249,7 +249,8 @@ WSALookupServiceBeginA(IN LPWSAQUERYSETA lpqsRestrictions,
DPRINT("WSALookupServiceBeginA: %p\n", lpqsRestrictions);
/* Verifiy pointer */
if (IsBadReadPtr(lpqsRestrictions, sizeof(*lpqsRestrictions)))
if (IsBadReadPtr(lpqsRestrictions, sizeof(*lpqsRestrictions)) ||
IsBadReadPtr(lpqsRestrictions->lpServiceClassId, sizeof(*lpqsRestrictions->lpServiceClassId)))
{
/* Invalid */
SetLastError(WSAEFAULT);
@ -334,7 +335,8 @@ WSALookupServiceBeginW(IN LPWSAQUERYSETW lpqsRestrictions,
/* Verify pointers */
if (IsBadWritePtr(lphLookup, sizeof(*lphLookup)) ||
IsBadReadPtr(lpqsRestrictions, sizeof(*lpqsRestrictions)))
IsBadReadPtr(lpqsRestrictions, sizeof(*lpqsRestrictions)) ||
IsBadReadPtr(lpqsRestrictions->lpServiceClassId, sizeof(*lpqsRestrictions->lpServiceClassId)))
{
/* They are invalid; fail */
SetLastError(WSAEFAULT);
@ -401,8 +403,16 @@ WSALookupServiceNextW(IN HANDLE hLookup,
return SOCKET_ERROR;
}
/* Verify pointer */
if (IsBadWritePtr(lpqsResults, sizeof(*lpqsResults)))
{
/* It is invalid; fail */
SetLastError(WSAEFAULT);
return SOCKET_ERROR;
}
/* Check for a valid handle, then validate and reference it */
if (!(Query) || !(WsNqValidateAndReference(Query)))
if (IsBadReadPtr(Query, sizeof(*Query)) || !WsNqValidateAndReference(Query))
{
/* Fail */
SetLastError(WSA_INVALID_HANDLE);
@ -611,34 +621,8 @@ WSAInstallServiceClassA(IN LPWSASERVICECLASSINFOA lpServiceClassInfo)
}
/*
* @unimplemented
*/
INT
WSAAPI
WSAEnumNameSpaceProvidersA(IN OUT LPDWORD lpdwBufferLength,
OUT LPWSANAMESPACE_INFOA lpnspBuffer)
{
DPRINT("WSAEnumNameSpaceProvidersA: %lx\n", lpnspBuffer);
SetLastError(WSAEINVAL);
return SOCKET_ERROR;
}
/*
* @unimplemented
*/
INT
WSAAPI
WSAEnumNameSpaceProvidersW(IN OUT LPDWORD lpdwBufferLength,
OUT LPWSANAMESPACE_INFOW lpnspBuffer)
{
DPRINT("WSAEnumNameSpaceProvidersW: %lx\n", lpnspBuffer);
SetLastError(WSAEINVAL);
return SOCKET_ERROR;
}
/*
* @unimplemented
*/
* @unimplemented
*/
INT
WSAAPI
WSAInstallServiceClassW(IN LPWSASERVICECLASSINFOW lpServiceClassInfo)
@ -648,6 +632,178 @@ WSAInstallServiceClassW(IN LPWSASERVICECLASSINFOW lpServiceClassInfo)
return SOCKET_ERROR;
}
VOID
WSAAPI
NSProviderInfoFromContext(IN PNSCATALOG_ENTRY Entry,
IN PNSPROVIDER_ENUM_CONTEXT Context)
{
INT size = Context->Unicode ? sizeof(WSANAMESPACE_INFOW) : sizeof(WSANAMESPACE_INFOA);
/* Calculate ProviderName string size */
INT size1 = Entry->ProviderName ? wcslen(Entry->ProviderName) + 1 : 0;
INT size2 = Context->Unicode ? size1 * sizeof(WCHAR) : size1 * sizeof(CHAR);
WSANAMESPACE_INFOW infoW;
/* Fill NS Provider data */
infoW.dwNameSpace = Entry->NamespaceId;
infoW.dwVersion = Entry->Version;
infoW.fActive = Entry->Enabled;
RtlMoveMemory(&infoW.NSProviderId,
&Entry->ProviderId,
sizeof(infoW.NSProviderId));
if (size2)
{
/* Calculate ProviderName string pointer */
infoW.lpszIdentifier = (LPWSTR)((ULONG_PTR)Context->ProtocolBuffer +
Context->BufferUsed + size);
}
else
{
infoW.lpszIdentifier = NULL;
}
/* Check if we'll have space */
if ((Context->BufferUsed + size + size2) <=
(Context->BufferLength))
{
/* Copy the data */
RtlMoveMemory((PVOID)((ULONG_PTR)Context->ProtocolBuffer +
Context->BufferUsed),
&infoW,
size);
if (size2)
{
/* Entry->ProviderName is LPWSTR */
if (Context->Unicode)
{
RtlMoveMemory((PVOID)((ULONG_PTR)Context->ProtocolBuffer +
Context->BufferUsed + size),
Entry->ProviderName,
size2);
}
else
{
/* Call the conversion function */
WideCharToMultiByte(CP_ACP,
0,
Entry->ProviderName,
-1,
(LPSTR)((ULONG_PTR)Context->ProtocolBuffer +
Context->BufferUsed + size),
size2,
NULL,
NULL);
}
}
/* Increase the count */
Context->Count++;
}
}
BOOL
WSAAPI
NSProvidersEnumerationProc(PVOID EnumContext,
PNSCATALOG_ENTRY Entry)
{
PNSPROVIDER_ENUM_CONTEXT Context = (PNSPROVIDER_ENUM_CONTEXT)EnumContext;
/* Calculate ProviderName string size */
INT size1 = Entry->ProviderName ? wcslen(Entry->ProviderName) + 1 : 0;
INT size2 = Context->Unicode ? size1 * sizeof(WCHAR) : size1 * sizeof(CHAR);
/* Copy the information */
NSProviderInfoFromContext(Entry, Context);
Context->BufferUsed += Context->Unicode ? (sizeof(WSANAMESPACE_INFOW)+size2) : (sizeof(WSANAMESPACE_INFOA)+size2);
/* Continue enumeration */
return TRUE;
}
INT
WSAAPI
WSAEnumNameSpaceProvidersInternal(IN OUT LPDWORD lpdwBufferLength,
OUT LPWSANAMESPACE_INFOA lpnspBuffer, BOOLEAN Unicode)
{
INT Status;
PWSPROCESS WsProcess;
PNSCATALOG Catalog;
NSPROVIDER_ENUM_CONTEXT Context;
DPRINT("WSAEnumNameSpaceProvidersInternal: %lx\n", lpnspBuffer);
if (!lpdwBufferLength)
{
WSASetLastError(WSAEFAULT);
return SOCKET_ERROR;
}
WsProcess = WsGetProcess();
/* Create a catalog object from the current one */
Catalog = WsProcGetNsCatalog(WsProcess);
if (!Catalog)
{
/* Fail if we couldn't */
WSASetLastError(WSA_NOT_ENOUGH_MEMORY);
return SOCKET_ERROR;
}
Context.ProtocolBuffer = lpnspBuffer;
Context.BufferLength = lpnspBuffer ? *lpdwBufferLength : 0;
Context.BufferUsed = 0;
Context.Count = 0;
Context.Unicode = Unicode;
Context.ErrorCode = ERROR_SUCCESS;
WsNcEnumerateCatalogItems(Catalog, NSProvidersEnumerationProc, &Context);
/* Get status */
Status = Context.Count;
/* Check the error code */
if (Context.ErrorCode == ERROR_SUCCESS)
{
/* Check if enough space was available */
if (Context.BufferLength < Context.BufferUsed)
{
/* Fail and tell them how much we need */
*lpdwBufferLength = Context.BufferUsed;
WSASetLastError(WSAEFAULT);
Status = SOCKET_ERROR;
}
}
else
{
/* Failure, normalize error */
Status = SOCKET_ERROR;
WSASetLastError(Context.ErrorCode);
}
/* Return */
return Status;
}
/*
* @implemented
*/
INT
WSAAPI
WSAEnumNameSpaceProvidersA(IN OUT LPDWORD lpdwBufferLength,
OUT LPWSANAMESPACE_INFOA lpnspBuffer)
{
DPRINT("WSAEnumNameSpaceProvidersA: %lx\n", lpnspBuffer);
return WSAEnumNameSpaceProvidersInternal(lpdwBufferLength, (LPWSANAMESPACE_INFOA)lpnspBuffer, FALSE);
}
/*
* @implemented
*/
INT
WSAAPI
WSAEnumNameSpaceProvidersW(IN OUT LPDWORD lpdwBufferLength,
OUT LPWSANAMESPACE_INFOW lpnspBuffer)
{
DPRINT("WSAEnumNameSpaceProvidersW: %lx\n", lpnspBuffer);
return WSAEnumNameSpaceProvidersInternal(lpdwBufferLength, (LPWSANAMESPACE_INFOA)lpnspBuffer, TRUE);
}
/*
* @implemented
*/

View file

@ -31,7 +31,7 @@ send(IN SOCKET s,
LPWSATHREADID ThreadId;
WSABUF Buffers;
DWORD BytesSent;
DPRINT("send: %lx, %lx, %lx, %p\n", s, flags, len, buf);
DPRINT("sendto: %lx, %lx, %lx, %p\n", s, flags, len, buf);
/* Check for WSAStartup */
if ((ErrorCode = WsQuickPrologTid(&ThreadId)) == ERROR_SUCCESS)

View file

@ -441,6 +441,11 @@ setsockopt(IN SOCKET s,
return Status;
}
if (!optval && optlen > 0)
{
SetLastError(WSAEFAULT);
return SOCKET_ERROR;
}
/* Get the Socket Context */
if ((Socket = WsSockGetSocket(s)))

View file

@ -566,6 +566,20 @@ DoLookup:
goto DoLookup;
}
/* Check if we got a valid socket */
if (Status == WSAEINVAL)
{
Status = INVALID_SOCKET;
ErrorCode = WSAEINVAL;
}
/* Check if we got a valid socket */
if (Status == WSAEINVAL)
{
Status = INVALID_SOCKET;
ErrorCode = WSAEINVAL;
}
/* Check if we got a valid socket */
if (Status != INVALID_SOCKET)
{

View file

@ -83,11 +83,16 @@ WSACleanup(VOID)
WsAsyncTerminateThread();
}
DPRINT("WSACleanup RefCount = %ld\n", RefCount);
/* Return success */
ErrorCode = ERROR_SUCCESS;
/* Clear last error */
SetLastError(ERROR_SUCCESS);
}
else
{
DPRINT("WSACleanup unintialized\n");
/* Weren't initialized */
SetLastError(ErrorCode);
ErrorCode = SOCKET_ERROR;
@ -111,7 +116,7 @@ WSAStartup(IN WORD wVersionRequested,
WORD VersionReturned = 0;
DWORD ErrorCode = ERROR_SUCCESS;
PWSPROCESS CurrentProcess;
DPRINT("WSAStartup: %wx\n", wVersionRequested);
DPRINT("WSAStartup: %wx %d.%d\n", wVersionRequested, LOBYTE(wVersionRequested), HIBYTE(wVersionRequested));
/* Make sure that we went through DLL Init */
if (!WsDllHandle) return WSASYSNOTREADY;
@ -123,14 +128,15 @@ WSAStartup(IN WORD wVersionRequested,
/* We don't support this unknown version */
ErrorCode = WSAVERNOTSUPPORTED;
VersionReturned = MAKEWORD(2, 2);
break;
case 1:
/* We support only 1.0 and 1.1 */
if (HIBYTE(wVersionRequested) == 0)
if (HIBYTE(wVersionRequested) <= 1)
{
/* Caller wants 1.0, return it */
VersionReturned = wVersionRequested;
VersionReturned = MAKEWORD(1, HIBYTE(wVersionRequested));
}
else
{
@ -160,6 +166,12 @@ WSAStartup(IN WORD wVersionRequested,
break;
}
if (lpWSAData == NULL)
{
SetLastError(WSANOTINITIALISED);
return ErrorCode == ERROR_SUCCESS ? WSAEFAULT : ErrorCode;
}
/* Return the Version Requested, unless error */
lpWSAData->wVersion = VersionReturned;
@ -182,6 +194,13 @@ WSAStartup(IN WORD wVersionRequested,
lpWSAData->iMaxSockets = 0;
lpWSAData->iMaxUdpDg = 0;
}
/* Requested invalid version (0) */
if (ErrorCode != ERROR_SUCCESS)
{
SetLastError(WSANOTINITIALISED);
return ErrorCode;
}
/* Enter the startup synchronization lock */
WsStartupLock();
@ -223,6 +242,14 @@ WSAStartup(IN WORD wVersionRequested,
/* Increase the reference count */
InterlockedIncrement(&CurrentProcess->RefCount);
DPRINT("WSAStartup RefCount = %ld\n", CurrentProcess->RefCount);
/* Clear last error */
SetLastError(ERROR_SUCCESS);
}
else
{
SetLastError(WSANOTINITIALISED);
}
/* Leave the startup lock */

View file

@ -1,117 +1,117 @@
1 stdcall accept(long ptr ptr)
2 stdcall bind(long ptr long)
3 stdcall closesocket(long)
4 stdcall connect(long ptr long)
5 stdcall getpeername(long ptr ptr)
6 stdcall getsockname(long ptr ptr)
7 stdcall getsockopt(long long long ptr ptr)
8 stdcall htonl(long)
9 stdcall htons(long)
10 stdcall ioctlsocket(long long ptr)
11 stdcall inet_addr(str)
12 stdcall inet_ntoa(ptr)
13 stdcall listen(long long)
14 stdcall ntohl(long)
15 stdcall ntohs(long)
16 stdcall recv(long ptr long long)
17 stdcall recvfrom(long ptr long long ptr ptr)
18 stdcall select(long ptr ptr ptr ptr)
19 stdcall send(long ptr long long)
20 stdcall sendto(long ptr long long ptr long)
21 stdcall setsockopt(long long long ptr long)
22 stdcall shutdown(long long)
23 stdcall socket(long long long)
24 stdcall WSApSetPostRoutine(ptr)
25 stdcall FreeAddrInfoW(ptr) freeaddrinfo
26 stdcall GetAddrInfoW(wstr wstr ptr ptr)
27 stdcall GetNameInfoW(ptr long wstr long wstr long long)
28 stdcall WPUCompleteOverlappedRequest(long ptr long long ptr)
29 stdcall WSAAccept(long ptr ptr ptr long)
30 stdcall WSAAddressToStringA(ptr long ptr ptr ptr)
31 stdcall WSAAddressToStringW(ptr long ptr ptr ptr)
32 stdcall WSACloseEvent(long)
33 stdcall WSAConnect(long ptr long ptr ptr ptr ptr)
34 stdcall WSACreateEvent ()
35 stdcall WSADuplicateSocketA(long long ptr)
36 stdcall WSADuplicateSocketW(long long ptr)
37 stdcall WSAEnumNameSpaceProvidersA(ptr ptr)
38 stdcall WSAEnumNameSpaceProvidersW(ptr ptr)
39 stdcall WSAEnumNetworkEvents(long long ptr)
40 stdcall WSAEnumProtocolsA(ptr ptr ptr)
41 stdcall WSAEnumProtocolsW(ptr ptr ptr)
42 stdcall WSAEventSelect(long long long)
43 stdcall WSAGetOverlappedResult(long ptr ptr long ptr)
44 stdcall WSAGetQOSByName(long ptr ptr)
45 stdcall WSAGetServiceClassInfoA(ptr ptr ptr ptr)
46 stdcall WSAGetServiceClassInfoW(ptr ptr ptr ptr)
47 stdcall WSAGetServiceClassNameByClassIdA(ptr ptr ptr)
48 stdcall WSAGetServiceClassNameByClassIdW(ptr ptr ptr)
49 stdcall WSAHtonl(long long ptr)
50 stdcall WSAHtons(long long ptr)
51 stdcall gethostbyaddr(ptr long long)
52 stdcall gethostbyname(str)
53 stdcall getprotobyname(str)
54 stdcall getprotobynumber(long)
55 stdcall getservbyname(str str)
56 stdcall getservbyport(long str)
57 stdcall gethostname(ptr long)
58 stdcall WSAInstallServiceClassA(ptr)
59 stdcall WSAInstallServiceClassW(ptr)
60 stdcall WSAIoctl(long long ptr long ptr long ptr ptr ptr)
61 stdcall WSAJoinLeaf(long ptr long ptr ptr ptr ptr long)
62 stdcall WSALookupServiceBeginA(ptr long ptr)
63 stdcall WSALookupServiceBeginW(ptr long ptr)
64 stdcall WSALookupServiceEnd(long)
65 stdcall WSALookupServiceNextA(long long ptr ptr)
66 stdcall WSALookupServiceNextW(long long ptr ptr)
67 stdcall WSANSPIoctl(ptr long ptr long ptr long ptr ptr)
68 stdcall WSANtohl(long long ptr)
69 stdcall WSANtohs(long long ptr)
70 stdcall WSAProviderConfigChange(ptr ptr ptr)
71 stdcall WSARecv(long ptr long ptr ptr ptr ptr)
72 stdcall WSARecvDisconnect(long ptr)
73 stdcall WSARecvFrom(long ptr long ptr ptr ptr ptr ptr ptr )
74 stdcall WSARemoveServiceClass(ptr)
75 stdcall WSAResetEvent(long) kernel32.ResetEvent
76 stdcall WSASend(long ptr long ptr long ptr ptr)
77 stdcall WSASendDisconnect(long ptr)
78 stdcall WSASendTo(long ptr long ptr long ptr long ptr ptr)
79 stdcall WSASetEvent(long) kernel32.SetEvent
80 stdcall WSASetServiceA(ptr long long)
81 stdcall WSASetServiceW(ptr long long)
82 stdcall WSASocketA(long long long ptr long long)
83 stdcall WSASocketW(long long long ptr long long)
84 stdcall WSAStringToAddressA(str long ptr ptr ptr)
85 stdcall WSAStringToAddressW(wstr long ptr ptr ptr)
86 stdcall WSAWaitForMultipleEvents(long ptr long long long) kernel32.WaitForMultipleObjectsEx
87 stdcall WSCDeinstallProvider(ptr ptr)
88 stdcall WSCEnableNSProvider(ptr long)
89 stdcall WSCEnumProtocols(ptr ptr ptr ptr)
90 stdcall WSCGetProviderPath(ptr ptr ptr ptr)
91 stdcall WSCInstallNameSpace(wstr wstr long long ptr)
92 stdcall WSCInstallProvider(ptr wstr ptr long ptr)
93 stdcall WSCUnInstallNameSpace(ptr)
94 stdcall WSCUpdateProvider(ptr ptr ptr long ptr)
95 stdcall WSCWriteNameSpaceOrder(ptr long)
96 stdcall WSCWriteProviderOrder(ptr long)
97 stdcall freeaddrinfo(ptr)
98 stdcall getaddrinfo(str str ptr ptr)
99 stdcall getnameinfo(ptr long ptr long ptr long long)
101 stdcall WSAAsyncSelect(long long long long)
500 stdcall WEP()
@ stdcall WPUCompleteOverlappedRequest(long ptr long long ptr)
@ stdcall WSAAccept(long ptr ptr ptr long)
@ stdcall WSAAddressToStringA(ptr long ptr ptr ptr)
@ stdcall WSAAddressToStringW(ptr long ptr ptr ptr)
102 stdcall WSAAsyncGetHostByAddr(long long ptr long long ptr long)
103 stdcall WSAAsyncGetHostByName(long long str ptr long)
104 stdcall WSAAsyncGetProtoByNumber(long long long ptr long)
105 stdcall WSAAsyncGetProtoByName(long long str ptr long)
106 stdcall WSAAsyncGetServByPort(long long long str ptr long)
104 stdcall WSAAsyncGetProtoByNumber(long long long ptr long)
107 stdcall WSAAsyncGetServByName(long long str str ptr long)
106 stdcall WSAAsyncGetServByPort(long long long str ptr long)
101 stdcall WSAAsyncSelect(long long long long)
108 stdcall WSACancelAsyncRequest(long)
109 stdcall WSASetBlockingHook(ptr)
110 stdcall WSAUnhookBlockingHook()
111 stdcall WSAGetLastError()
112 stdcall WSASetLastError(long)
113 stdcall WSACancelBlockingCall()
114 stdcall WSAIsBlocking()
115 stdcall WSAStartup(long ptr)
116 stdcall WSACleanup()
151 stdcall __WSAFDIsSet(long ptr)
500 stdcall WEP()
@ stdcall WSACloseEvent(long)
@ stdcall WSAConnect(long ptr long ptr ptr ptr ptr)
@ stdcall WSACreateEvent ()
@ stdcall WSADuplicateSocketA(long long ptr)
@ stdcall WSADuplicateSocketW(long long ptr)
@ stdcall WSAEnumNameSpaceProvidersA(ptr ptr)
@ stdcall WSAEnumNameSpaceProvidersW(ptr ptr)
@ stdcall WSAEnumNetworkEvents(long long ptr)
@ stdcall WSAEnumProtocolsA(ptr ptr ptr)
@ stdcall WSAEnumProtocolsW(ptr ptr ptr)
@ stdcall WSAEventSelect(long long long)
111 stdcall WSAGetLastError()
@ stdcall WSAGetOverlappedResult(long ptr ptr long ptr)
@ stdcall WSAGetQOSByName(long ptr ptr)
@ stdcall WSAGetServiceClassInfoA(ptr ptr ptr ptr)
@ stdcall WSAGetServiceClassInfoW(ptr ptr ptr ptr)
@ stdcall WSAGetServiceClassNameByClassIdA(ptr ptr ptr)
@ stdcall WSAGetServiceClassNameByClassIdW(ptr ptr ptr)
@ stdcall WSAHtonl(long long ptr)
@ stdcall WSAHtons(long long ptr)
@ stdcall WSAInstallServiceClassA(ptr)
@ stdcall WSAInstallServiceClassW(ptr)
@ stdcall WSAIoctl(long long ptr long ptr long ptr ptr ptr)
114 stdcall WSAIsBlocking()
@ stdcall WSAJoinLeaf(long ptr long ptr ptr ptr ptr long)
@ stdcall WSALookupServiceBeginA(ptr long ptr)
@ stdcall WSALookupServiceBeginW(ptr long ptr)
@ stdcall WSALookupServiceEnd(long)
@ stdcall WSALookupServiceNextA(long long ptr ptr)
@ stdcall WSALookupServiceNextW(long long ptr ptr)
@ stdcall WSANSPIoctl(long long ptr long ptr long ptr ptr)
@ stdcall WSANtohl(long long ptr)
@ stdcall WSANtohs(long long ptr)
@ stdcall WSAProviderConfigChange(ptr ptr ptr)
@ stdcall WSARecv(long ptr long ptr ptr ptr ptr)
@ stdcall WSARecvDisconnect(long ptr)
@ stdcall WSARecvFrom(long ptr long ptr ptr ptr ptr ptr ptr)
@ stdcall WSARemoveServiceClass(ptr)
@ stdcall WSAResetEvent(long)
@ stdcall WSASend(long ptr long ptr long ptr ptr)
@ stdcall WSASendDisconnect(long ptr)
@ stdcall WSASendTo(long ptr long ptr long ptr long ptr ptr)
109 stdcall WSASetBlockingHook(ptr)
@ stdcall WSASetEvent(long)
112 stdcall WSASetLastError(long)
@ stdcall WSASetServiceA(ptr long long)
@ stdcall WSASetServiceW(ptr long long)
@ stdcall WSASocketA(long long long ptr long long)
@ stdcall WSASocketW(long long long ptr long long)
115 stdcall WSAStartup(long ptr)
@ stdcall WSAStringToAddressA(str long ptr ptr ptr)
@ stdcall WSAStringToAddressW(wstr long ptr ptr ptr)
110 stdcall WSAUnhookBlockingHook()
@ stdcall WSAWaitForMultipleEvents(long ptr long long long)
@ stdcall WSApSetPostRoutine(ptr)
@ stdcall FreeAddrInfoW(ptr) freeaddrinfo
@ stdcall WSCDeinstallProvider(ptr ptr)
@ stdcall WSCEnableNSProvider(ptr long)
@ stdcall WSCEnumProtocols(ptr ptr ptr ptr)
@ stdcall WSCGetProviderPath(ptr ptr ptr ptr)
@ stdcall WSCInstallNameSpace(wstr wstr long long ptr)
@ stdcall WSCInstallProvider(ptr wstr ptr long ptr)
@ stdcall WSCUnInstallNameSpace(ptr)
@ stdcall WSCUpdateProvider(ptr ptr ptr long ptr)
@ stdcall WSCWriteNameSpaceOrder(ptr long)
@ stdcall WSCWriteProviderOrder(ptr long)
151 stdcall __WSAFDIsSet(long ptr)
1 stdcall accept(long ptr ptr)
2 stdcall bind(long ptr long)
3 stdcall closesocket(long)
4 stdcall connect(long ptr long)
@ stdcall freeaddrinfo(ptr)
@ stdcall getaddrinfo(str str ptr ptr)
51 stdcall gethostbyaddr(ptr long long)
52 stdcall gethostbyname(str)
57 stdcall gethostname(ptr long)
@ stdcall getnameinfo(ptr long ptr long ptr long long)
5 stdcall getpeername(long ptr ptr)
53 stdcall getprotobyname(str)
54 stdcall getprotobynumber(long)
55 stdcall getservbyname(str str)
56 stdcall getservbyport(long str)
6 stdcall getsockname(long ptr ptr)
7 stdcall getsockopt(long long long ptr ptr)
8 stdcall htonl(long)
9 stdcall htons(long)
11 stdcall inet_addr(str)
12 stdcall inet_ntoa(ptr)
10 stdcall ioctlsocket(long long ptr)
13 stdcall listen(long long)
14 stdcall ntohl(long)
15 stdcall ntohs(long)
16 stdcall recv(long ptr long long)
17 stdcall recvfrom(long ptr long long ptr ptr)
18 stdcall select(long ptr ptr ptr ptr)
19 stdcall send(long ptr long long)
20 stdcall sendto(long ptr long long ptr long)
21 stdcall setsockopt(long long long ptr long)
22 stdcall shutdown(long long)
23 stdcall socket(long long long)
@ stdcall GetAddrInfoW(wstr wstr ptr ptr)
@ stdcall GetNameInfoW(ptr long wstr long wstr long long)

View file

@ -1,57 +0,0 @@
add_definitions(-DLE)
spec2def(ws2_32_new.dll ws2_32.spec)
include_directories(
inc
${REACTOS_SOURCE_DIR}/sdk/include/reactos/winsock)
list(APPEND SOURCE
src/addrconv.c
src/addrinfo.c
src/async.c
src/bhook.c
src/dcatalog.c
src/dcatitem.c
src/dllmain.c
src/dprocess.c
src/dprovide.c
src/dsocket.c
src/dthread.c
src/dupsock.c
src/enumprot.c
src/event.c
src/getproto.c
src/getxbyxx.c
src/ioctl.c
src/nscatalo.c
src/nscatent.c
src/nspinstl.c
src/nsprovid.c
src/nsquery.c
src/qos.c
src/qshelpr.c
src/rasdial.c
src/recv.c
src/rnr.c
#src/scihlpr.c
src/select.c
src/send.c
src/sockctrl.c
src/socklife.c
src/spinstal.c
src/sputil.c
src/startup.c
src/wsautil.c
inc/ws2_32.h)
add_library(ws2_32_new SHARED
${SOURCE}
ws2_32.rc
${CMAKE_CURRENT_BINARY_DIR}/ws2_32_new.def)
set_module_type(ws2_32_new win32dll)
target_link_libraries(ws2_32_new ${PSEH_LIB})
add_importlibs(ws2_32_new user32 advapi32 ws2help msvcrt kernel32 ntdll)
add_pch(ws2_32_new inc/ws2_32.h SOURCE)
add_cd_file(TARGET ws2_32_new DESTINATION reactos/system32 FOR all)

View file

@ -1,176 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 API
* FILE: dll/win32/ws2_32_new/src/nscatent.c
* PURPOSE: Namespace Catalog Entry Object
* PROGRAMMER: Alex Ionescu (alex@relsoft.net)
*/
/* INCLUDES ******************************************************************/
#include <ws2_32.h>
/* FUNCTIONS *****************************************************************/
PNSCATALOG_ENTRY
WSAAPI
WsNcEntryAllocate(VOID)
{
PNSCATALOG_ENTRY CatalogEntry;
/* Allocate the catalog */
CatalogEntry = HeapAlloc(WsSockHeap, HEAP_ZERO_MEMORY, sizeof(*CatalogEntry));
/* Set the default non-null members */
CatalogEntry->RefCount = 1;
CatalogEntry->Enabled = TRUE;
CatalogEntry->AddressFamily = -1;
/* Return it */
return CatalogEntry;
}
VOID
WSAAPI
WsNcEntryDelete(IN PNSCATALOG_ENTRY CatalogEntry)
{
/* Check if a provider is loaded */
if (CatalogEntry->Provider)
{
/* Dereference it too */
WsNpDereference(CatalogEntry->Provider);
CatalogEntry->Provider = NULL;
}
/* Delete us */
HeapFree(WsSockHeap, 0, CatalogEntry);
}
VOID
WSAAPI
WsNcEntryDereference(IN PNSCATALOG_ENTRY CatalogEntry)
{
/* Dereference and check if it's now 0 */
if (!(InterlockedDecrement(&CatalogEntry->RefCount)))
{
/* We can delete the Provider now */
WsNcEntryDelete(CatalogEntry);
}
}
INT
WSAAPI
WsNcEntryInitializeFromRegistry(IN PNSCATALOG_ENTRY CatalogEntry,
IN HKEY ParentKey,
IN ULONG UniqueId)
{
CHAR CatalogEntryName[13];
HKEY EntryKey;
ULONG RegType = REG_SZ;
ULONG RegSize = MAX_PATH;
/* Convert to a 00000xxx string */
sprintf(CatalogEntryName, "%0""12""i", (int)UniqueId);
/* Open the Entry */
RegOpenKeyEx(ParentKey,
CatalogEntryName,
0,
KEY_READ,
&EntryKey);
/* Read the Library Path */
RegQueryValueExW(EntryKey,
L"LibraryPath",
0,
&RegType,
(LPBYTE)&CatalogEntry->DllPath,
&RegSize);
/* Query Display String Size*/
RegQueryValueExW(EntryKey,
L"DisplayString",
0,
NULL,
NULL,
&RegSize);
/* Allocate it */
CatalogEntry->ProviderName = (LPWSTR)HeapAlloc(WsSockHeap, 0, RegSize);
/* Read it */
RegQueryValueExW(EntryKey,
L"DisplayString",
0,
&RegType,
(LPBYTE)CatalogEntry->ProviderName,
&RegSize);
/* Read the Provider Id */
RegType = REG_BINARY;
RegSize = sizeof(GUID);
RegQueryValueEx(EntryKey,
"ProviderId",
0,
&RegType,
(LPBYTE)&CatalogEntry->ProviderId,
&RegSize);
/* Read the Address Family */
RegType = REG_DWORD;
RegSize = sizeof(DWORD);
RegQueryValueEx(EntryKey,
"AddressFamily",
0,
&RegType,
(LPBYTE)&CatalogEntry->AddressFamily,
&RegSize);
/* Read the Namespace Id */
RegQueryValueEx(EntryKey,
"SupportedNamespace",
0,
&RegType,
(LPBYTE)&CatalogEntry->NamespaceId,
&RegSize);
/* Read the Enabled Flag */
RegQueryValueEx(EntryKey,
"Enabled",
0,
&RegType,
(LPBYTE)&CatalogEntry->Enabled,
&RegSize);
/* Read the Version */
RegQueryValueEx(EntryKey,
"Version",
0,
&RegType,
(LPBYTE)&CatalogEntry->Version,
&RegSize);
/* Read the Support Service Class Info Flag */
RegQueryValueEx(EntryKey,
"Version",
0,
&RegType,
(LPBYTE)&CatalogEntry->StoresServiceClassInfo,
&RegSize);
/* Done */
RegCloseKey(EntryKey);
return ERROR_SUCCESS;
}
VOID
WSAAPI
WsNcEntrySetProvider(IN PNSCATALOG_ENTRY Entry,
IN PNS_PROVIDER Provider)
{
/* Reference the provider */
InterlockedIncrement(&Provider->RefCount);
/* Set it */
Entry->Provider = Provider;
}

View file

@ -1,5 +0,0 @@
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "Windows Sockets 2 DLL"
#define REACTOS_STR_INTERNAL_NAME "ws2_32"
#define REACTOS_STR_ORIGINAL_FILENAME "ws2_32.dll"
#include <reactos/version.rc>

View file

@ -1,117 +0,0 @@
500 stdcall WEP()
@ stdcall WPUCompleteOverlappedRequest(long ptr long long ptr)
@ stdcall WSAAccept(long ptr ptr ptr long)
@ stdcall WSAAddressToStringA(ptr long ptr ptr ptr)
@ stdcall WSAAddressToStringW(ptr long ptr ptr ptr)
102 stdcall WSAAsyncGetHostByAddr(long long ptr long long ptr long)
103 stdcall WSAAsyncGetHostByName(long long str ptr long)
105 stdcall WSAAsyncGetProtoByName(long long str ptr long)
104 stdcall WSAAsyncGetProtoByNumber(long long long ptr long)
107 stdcall WSAAsyncGetServByName(long long str str ptr long)
106 stdcall WSAAsyncGetServByPort(long long long str ptr long)
101 stdcall WSAAsyncSelect(long long long long)
108 stdcall WSACancelAsyncRequest(long)
113 stdcall WSACancelBlockingCall()
116 stdcall WSACleanup()
@ stdcall WSACloseEvent(long)
@ stdcall WSAConnect(long ptr long ptr ptr ptr ptr)
@ stdcall WSACreateEvent ()
@ stdcall WSADuplicateSocketA(long long ptr)
@ stdcall WSADuplicateSocketW(long long ptr)
@ stdcall WSAEnumNameSpaceProvidersA(ptr ptr)
@ stdcall WSAEnumNameSpaceProvidersW(ptr ptr)
@ stdcall WSAEnumNetworkEvents(long long ptr)
@ stdcall WSAEnumProtocolsA(ptr ptr ptr)
@ stdcall WSAEnumProtocolsW(ptr ptr ptr)
@ stdcall WSAEventSelect(long long long)
111 stdcall WSAGetLastError()
@ stdcall WSAGetOverlappedResult(long ptr ptr long ptr)
@ stdcall WSAGetQOSByName(long ptr ptr)
@ stdcall WSAGetServiceClassInfoA(ptr ptr ptr ptr)
@ stdcall WSAGetServiceClassInfoW(ptr ptr ptr ptr)
@ stdcall WSAGetServiceClassNameByClassIdA(ptr ptr ptr)
@ stdcall WSAGetServiceClassNameByClassIdW(ptr ptr ptr)
@ stdcall WSAHtonl(long long ptr)
@ stdcall WSAHtons(long long ptr)
@ stdcall WSAInstallServiceClassA(ptr)
@ stdcall WSAInstallServiceClassW(ptr)
@ stdcall WSAIoctl(long long ptr long ptr long ptr ptr ptr)
114 stdcall WSAIsBlocking()
@ stdcall WSAJoinLeaf(long ptr long ptr ptr ptr ptr long)
@ stdcall WSALookupServiceBeginA(ptr long ptr)
@ stdcall WSALookupServiceBeginW(ptr long ptr)
@ stdcall WSALookupServiceEnd(long)
@ stdcall WSALookupServiceNextA(long long ptr ptr)
@ stdcall WSALookupServiceNextW(long long ptr ptr)
@ stdcall WSANSPIoctl(long long ptr long ptr long ptr ptr)
@ stdcall WSANtohl(long long ptr)
@ stdcall WSANtohs(long long ptr)
@ stdcall WSAProviderConfigChange(ptr ptr ptr)
@ stdcall WSARecv(long ptr long ptr ptr ptr ptr)
@ stdcall WSARecvDisconnect(long ptr)
@ stdcall WSARecvFrom(long ptr long ptr ptr ptr ptr ptr ptr)
@ stdcall WSARemoveServiceClass(ptr)
@ stdcall WSAResetEvent(long)
@ stdcall WSASend(long ptr long ptr long ptr ptr)
@ stdcall WSASendDisconnect(long ptr)
@ stdcall WSASendTo(long ptr long ptr long ptr long ptr ptr)
109 stdcall WSASetBlockingHook(ptr)
@ stdcall WSASetEvent(long)
112 stdcall WSASetLastError(long)
@ stdcall WSASetServiceA(ptr long long)
@ stdcall WSASetServiceW(ptr long long)
@ stdcall WSASocketA(long long long ptr long long)
@ stdcall WSASocketW(long long long ptr long long)
115 stdcall WSAStartup(long ptr)
@ stdcall WSAStringToAddressA(str long ptr ptr ptr)
@ stdcall WSAStringToAddressW(wstr long ptr ptr ptr)
110 stdcall WSAUnhookBlockingHook()
@ stdcall WSAWaitForMultipleEvents(long ptr long long long)
@ stdcall WSApSetPostRoutine(ptr)
@ stdcall FreeAddrInfoW(ptr) freeaddrinfo
@ stdcall WSCDeinstallProvider(ptr ptr)
@ stdcall WSCEnableNSProvider(ptr long)
@ stdcall WSCEnumProtocols(ptr ptr ptr ptr)
@ stdcall WSCGetProviderPath(ptr ptr ptr ptr)
@ stdcall WSCInstallNameSpace(wstr wstr long long ptr)
@ stdcall WSCInstallProvider(ptr wstr ptr long ptr)
@ stdcall WSCUnInstallNameSpace(ptr)
@ stdcall WSCUpdateProvider(ptr ptr ptr long ptr)
@ stdcall WSCWriteNameSpaceOrder(ptr long)
@ stdcall WSCWriteProviderOrder(ptr long)
151 stdcall __WSAFDIsSet(long ptr)
1 stdcall accept(long ptr ptr)
2 stdcall bind(long ptr long)
3 stdcall closesocket(long)
4 stdcall connect(long ptr long)
@ stdcall freeaddrinfo(ptr)
@ stdcall getaddrinfo(str str ptr ptr)
51 stdcall gethostbyaddr(ptr long long)
52 stdcall gethostbyname(str)
57 stdcall gethostname(ptr long)
@ stdcall getnameinfo(ptr long ptr long ptr long long)
5 stdcall getpeername(long ptr ptr)
53 stdcall getprotobyname(str)
54 stdcall getprotobynumber(long)
55 stdcall getservbyname(str str)
56 stdcall getservbyport(long str)
6 stdcall getsockname(long ptr ptr)
7 stdcall getsockopt(long long long ptr ptr)
8 stdcall htonl(long)
9 stdcall htons(long)
11 stdcall inet_addr(str)
12 stdcall inet_ntoa(ptr)
10 stdcall ioctlsocket(long long ptr)
13 stdcall listen(long long)
14 stdcall ntohl(long)
15 stdcall ntohs(long)
16 stdcall recv(long ptr long long)
17 stdcall recvfrom(long ptr long long ptr ptr)
18 stdcall select(long ptr ptr ptr ptr)
19 stdcall send(long ptr long long)
20 stdcall sendto(long ptr long long ptr long)
21 stdcall setsockopt(long long long ptr long)
22 stdcall shutdown(long long)
23 stdcall socket(long long long)
@ stdcall GetAddrInfoW(wstr wstr ptr ptr)
@ stdcall GetNameInfoW(ptr long wstr long wstr long long)