[ros-diffs] [dchapyshev] 42115: - Add ws2help from alex-network-branch

dchapyshev at svn.reactos.org dchapyshev at svn.reactos.org
Tue Jul 21 11:16:26 CEST 2009


Author: dchapyshev
Date: Tue Jul 21 11:16:26 2009
New Revision: 42115

URL: http://svn.reactos.org/svn/reactos?rev=42115&view=rev
Log:
- Add ws2help from alex-network-branch

Added:
    trunk/reactos/dll/win32/ws2help_new/   (with props)
    trunk/reactos/dll/win32/ws2help_new/apc.c   (with props)
    trunk/reactos/dll/win32/ws2help_new/context.c   (with props)
    trunk/reactos/dll/win32/ws2help_new/dllmain.c   (with props)
    trunk/reactos/dll/win32/ws2help_new/handle.c   (with props)
    trunk/reactos/dll/win32/ws2help_new/notify.c   (with props)
    trunk/reactos/dll/win32/ws2help_new/precomp.h   (with props)
    trunk/reactos/dll/win32/ws2help_new/ws2help.h   (with props)
    trunk/reactos/dll/win32/ws2help_new/ws2help.rbuild   (with props)
    trunk/reactos/dll/win32/ws2help_new/ws2help.rc   (with props)
    trunk/reactos/dll/win32/ws2help_new/ws2help.spec   (with props)
    trunk/reactos/dll/win32/ws2help_new/wshdrv.h   (with props)

Propchange: trunk/reactos/dll/win32/ws2help_new/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Tue Jul 21 11:16:26 2009
@@ -1,0 +1,2 @@
+([Ii]ssue|[Bb]ug)s? #?(\d+)(,? ?#?(\d+))*(,? ?(and |or )?#?(\d+))?
+(\d+)

Propchange: trunk/reactos/dll/win32/ws2help_new/
------------------------------------------------------------------------------
    bugtraq:message = See issue #%BUGID% for more details.

Propchange: trunk/reactos/dll/win32/ws2help_new/
------------------------------------------------------------------------------
    bugtraq:url = http://www.reactos.org/bugzilla/show_bug.cgi?id=%BUGID%

Propchange: trunk/reactos/dll/win32/ws2help_new/
------------------------------------------------------------------------------
    tsvn:logminsize = 10

Added: trunk/reactos/dll/win32/ws2help_new/apc.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/apc.c?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/apc.c (added)
+++ trunk/reactos/dll/win32/ws2help_new/apc.c [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,152 @@
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS WinSock 2 DLL
+ * FILE:        include/ws2_32.h
+ * PURPOSE:     WinSock 2 DLL header
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+#define APCH        (HANDLE)'SOR '
+
+/* FUNCTIONS *****************************************************************/
+
+DWORD
+WINAPI
+WahOpenApcHelper(OUT PHANDLE ApcHelperHandle)
+{
+    DWORD ErrorCode;
+
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Validate handle */
+    if (!ApcHelperHandle) return ERROR_INVALID_PARAMETER;
+
+    /* 
+     * Return a bogus handle ("ROS")
+     * Historical note:(MS sends "CKM", which probably stands for "Keith Moore"
+     * (KM), one of the core architects of Winsock 2.2 from Microsoft.
+     */
+    *ApcHelperHandle = APCH;
+    return ERROR_SUCCESS;
+}
+
+DWORD
+WINAPI
+WahCloseApcHelper(IN HANDLE ApcHelperHandle)
+{
+    DWORD ErrorCode;
+
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Validate handle */
+    if (ApcHelperHandle != APCH) return ERROR_INVALID_PARAMETER;
+
+    /* return */
+    return ERROR_SUCCESS;
+}
+
+DWORD
+WINAPI
+WahCloseThread(IN HANDLE ApcHelperHandle,
+               IN LPWSATHREADID ThreadId)
+{
+    DWORD ErrorCode;
+
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Validate handles */
+    if ((ApcHelperHandle != APCH) || (!ThreadId) || (!ThreadId->ThreadHandle))
+    {
+        /* Invalid helper/thread handles */
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    /* Close the thread handle */
+    if (CloseHandle(ThreadId->ThreadHandle))
+    {
+        /* Clear the sturcture */
+        ThreadId->ThreadHandle = NULL;
+        ThreadId->Reserved = 0;
+        return NO_ERROR;
+    }
+
+    /* return */
+    return GetLastError();
+}
+
+INT
+WINAPI 
+WahQueueUserApc(IN HANDLE ApcHelperHandle,
+                IN LPWSATHREADID ThreadId,
+                IN LPWSAUSERAPC ApcRoutine,
+                IN PVOID ApcContext OPTIONAL)
+{
+    /* Validate params  */
+    if ((ApcHelperHandle != APCH) ||
+        (!ThreadId) ||
+        (!ThreadId->ThreadHandle) ||
+        (!ApcRoutine))
+    {
+        /* Invalid parameters */
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    /* Queue the APC */
+    if (QueueUserAPC(ApcRoutine, ThreadId->ThreadHandle, (ULONG_PTR)ApcContext))
+    {
+        /* Return success */
+        return ERROR_SUCCESS;
+    }
+
+    /* Fail */
+    return GetLastError();
+}
+
+DWORD
+WINAPI
+WahOpenCurrentThread(IN HANDLE ApcHelperHandle,
+                     OUT LPWSATHREADID ThreadId)
+{
+    HANDLE ProcessHandle, ThreadHandle;
+
+    /* Validate params  */
+    if ((ApcHelperHandle != APCH) || (!ThreadId))
+    {
+        /* Invalid parameters */
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    /* Get the process/thread handles */
+    ProcessHandle = GetCurrentProcess();
+    ThreadHandle = GetCurrentThread();
+
+    /* Duplicate the handle */
+    if (DuplicateHandle(ProcessHandle,
+                        ThreadHandle,
+                        ProcessHandle,
+                        &ThreadId->ThreadHandle,
+                        0,
+                        FALSE,
+                        DUPLICATE_SAME_ACCESS))
+    {
+        /* Save the thread handle and return */
+        ThreadId->Reserved = (DWORD_PTR)ThreadHandle;
+        return ERROR_SUCCESS;
+    }
+
+    /* Fail */
+    return GetLastError();
+}
+
+/* EOF */

Propchange: trunk/reactos/dll/win32/ws2help_new/apc.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/ws2help_new/context.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/context.c?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/context.c (added)
+++ trunk/reactos/dll/win32/ws2help_new/context.c [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,601 @@
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS WinSock 2 DLL
+ * FILE:        include/ws2_32.h
+ * PURPOSE:     WinSock 2 DLL header
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+CRITICAL_SECTION WshHandleTableLock;
+HANDLE ghWriterEvent;
+DWORD gdwSpinCount = 0;
+DWORD gHandleToIndexMask;
+
+CONST DWORD SockPrimes[] =
+{
+    31, 61, 127, 257, 521, 1031, 2053,
+    4099, 8191, 16381, 32749, 65537, 131071, 261983, 
+    -1
+};
+
+typedef volatile LONG VLONG;
+typedef VLONG *PVLONG;
+
+/* DEFINES *******************************************************************/
+
+/* Yes, we "abuse" the lower bits */
+#define WSH_SEARCH_TABLE_FROM_HANDLE(h, t) \
+    (&t->SearchTables[(((ULONG_PTR)h >> 2) & t->Mask)])
+
+#define WSH_HASH_FROM_HANDLE(h, hs) \
+    (hs->Handles[((ULONG_PTR)h % hs->Size)])
+
+#define AcquireWriteLock(t) \
+    EnterCriticalSection(&t->Lock);
+
+#define ReleaseWriteLock(t) \
+    LeaveCriticalSection(&t->Lock);
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+static __inline
+AcquireReadLock(IN PWAH_SEARCH_TABLE Table,
+                IN PVLONG *Count)
+{
+    LONG OldCount;
+
+    /* Start acquire loop */
+    do
+    {
+        /* Write and save count value */
+        *Count = Table->CurrentCount;
+        OldCount = **Count;
+
+        /* Check if it's valid and try to increment it */
+        if ((OldCount > 0) && (InterlockedCompareExchange(*Count,
+                                                          OldCount + 1,
+                                                          OldCount) == OldCount))
+        {
+            /* Everything went OK */
+            break;
+        }
+    } while (TRUE);
+}
+
+VOID
+static __inline
+ReleaseReadLock(IN PWAH_SEARCH_TABLE Table,
+                IN PVLONG Count)
+{
+    /* Decrement the count. If we went below 0, someone is waiting... */
+    if (InterlockedDecrement(Count) < 0)
+    {
+        /* We use pulse since this is a shared event */
+        PulseEvent(ghWriterEvent);
+    }
+}
+
+VOID
+WINAPI
+DoWaitForReaders(IN PWAH_SEARCH_TABLE Table,
+                 IN PVLONG Counter)
+{
+    HANDLE EventHandle;
+
+    /* Do a context switch */
+    SwitchToThread();
+
+    /* Check if the counter is above one */
+    if (*Counter > 0)
+    {
+        /* 
+         * This shouldn't happen unless priorities are messed up. Do a wait so
+         * that the threads with lower priority will get their chance now.
+         */
+        if (!ghWriterEvent)
+        {
+            /* We don't even have an event! Allocate one manually... */
+            EventHandle = CreateEvent(NULL, TRUE, FALSE, NULL);
+            if (EventHandle)
+            {
+                /* Save the event handle atomically */
+                if ((InterlockedCompareExchangePointer((PVOID*)&ghWriterEvent,
+                                                       EventHandle,
+                                                       NULL)))
+                {
+                    /* Someone beat us to it, close ours */
+                    CloseHandle(EventHandle);
+                }
+            }
+            else
+            {
+                /* Things couldn't get worse for us. Do a last-resort hack */
+                while (*Counter > 0) Sleep(10);
+            }
+        }
+
+        /* 
+         * Our event is ready. Tell the others to signal us by making sure
+         * that the last counter will be -1, notifying the last thread of our
+         * request.
+         */
+        if (InterlockedDecrement(Counter) >= 0)
+        {
+            /* Keep looping */
+            do
+            {
+                /* Wait in tiny bursts, so we can catch the PulseEvent */
+                WaitForSingleObject(ghWriterEvent, 10);
+            } while (*Counter >= 0);
+        }
+    }
+}
+
+VOID
+static __inline
+TryWaitForReaders(IN PWAH_SEARCH_TABLE Table)
+{
+    PVLONG OldCount = Table->CurrentCount;
+    LONG SpinCount;
+    
+    /* See which counter is being used */
+    if (OldCount == &Table->Count1)
+    {
+        /* Use counter 2 now */
+        Table->Count2 = 1;
+        Table->CurrentCount = &Table->Count2;
+    }
+    else
+    {
+        /* Use counter 1 now */
+        Table->Count1 = 1;
+        Table->CurrentCount = &Table->Count1;
+    }
+
+    /* Decrease the old count to block new readers */
+    if (InterlockedDecrement(OldCount) > 0)
+    {
+        /* On an MP machine, spin a bit first */
+        if (Table->SpinCount)
+        {
+            /* Get the spincount and loop it */
+            SpinCount = Table->SpinCount;
+            while (*OldCount > 0)
+            {
+                /* Check if the spin failed */
+                if (--SpinCount <= 0) break;
+            }
+        }
+
+        /* Check one last time if someone is still active */
+        if (*OldCount > 0)
+        {
+            /* Yep, we'll have to do a blocking (slow) wait */
+            DoWaitForReaders(Table, OldCount);
+        }
+    }
+}
+
+DWORD
+WINAPI
+WahCreateHandleContextTable(OUT PWAH_HANDLE_TABLE *Table)
+{
+    DWORD ErrorCode;
+    PWAH_HANDLE_TABLE LocalTable;
+    DWORD i;
+
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Assume NULL */
+    *Table = NULL;
+
+    /* Allocate enough tables */
+    LocalTable = HeapAlloc(GlobalHeap,
+                           0,
+                           FIELD_OFFSET(WSH_HANDLE_TABLE,
+                                        SearchTables[gHandleToIndexMask + 1]));
+
+    /* Make sure it was allocated */
+    if (!LocalTable) return WSA_NOT_ENOUGH_MEMORY;
+
+    /* Set the mask for the table */
+    LocalTable->Mask = gHandleToIndexMask;
+
+    /* Now initialize every table */
+    for (i = 0; i <= gHandleToIndexMask; i++)
+    {
+        /* No hash table yet */
+        LocalTable->SearchTables[i].HashTable = NULL;
+
+        /* Set the current count */
+        LocalTable->SearchTables[i].CurrentCount = &LocalTable->SearchTables[i].Count1;
+
+        /* Initialize the counts */
+        LocalTable->SearchTables[i].Count1 = 1;
+        LocalTable->SearchTables[i].Count2 = 0;
+
+        /* Set expanding state and spin count */
+        LocalTable->SearchTables[i].Expanding = FALSE;
+        LocalTable->SearchTables[i].SpinCount = gdwSpinCount;
+
+        /* Initialize the lock */
+        (VOID)InitializeCriticalSectionAndSpinCount(&LocalTable->
+                                                    SearchTables[i].Lock,
+                                                    gdwSpinCount);
+    }
+
+    /* Return pointer */
+    *Table = LocalTable;
+
+    /* Return success */
+    return ERROR_SUCCESS;
+}
+
+DWORD
+WINAPI
+WahDestroyHandleContextTable(IN PWAH_HANDLE_TABLE Table)
+{
+    DWORD i;
+
+    /* Make sure the table is valid */
+    if (!Table)
+    {
+        /* No valid table */
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    /* Loop each search table */
+    for (i = 0; i <= Table->Mask; i++)
+    {
+        /* Check if there's a table here */
+        if (Table->SearchTables[i].HashTable)
+        {
+            /* Free it */
+            HeapFree(GlobalHeap, 0, Table->SearchTables[i].HashTable);
+        }
+
+        /* Delete the lock */
+        DeleteCriticalSection(&Table->SearchTables[i].Lock);
+    }
+
+    /* Delete the table */
+    HeapFree(GlobalHeap, 0, Table);
+
+    /* Return success */
+    return ERROR_SUCCESS;
+}
+
+BOOL
+WINAPI
+WahEnumerateHandleContexts(IN PWAH_HANDLE_TABLE Table,
+                           IN PWAH_HANDLE_ENUMERATE_PROC Callback,
+                           IN PVOID Context)
+{
+    DWORD i, j;
+    PWAH_SEARCH_TABLE SearchTable;
+    PWAH_HASH_TABLE HashTable;
+    PWAH_HANDLE Handle;
+    BOOL GoOn = TRUE;
+
+    /* Loop the table */
+    for (i = 0; i <= Table->Mask; i++)
+    {
+        /* Get the Search table */
+        SearchTable = &Table->SearchTables[i];
+
+        /* Lock it */
+        AcquireWriteLock(SearchTable);
+
+        /* Mark us as expanding and wait for everyone */
+        SearchTable->Expanding = TRUE;
+        TryWaitForReaders(SearchTable);
+
+        /* Get the hash table */
+        HashTable = SearchTable->HashTable;
+
+        /* Make sure it exists */
+        if (HashTable)
+        {
+            /* Loop every handle in it */
+            for (j = 0; j < HashTable->Size; j++)
+            {
+                /* Get this handle */
+                Handle = HashTable->Handles[j];
+                if (!Handle) continue;
+
+                /* Call the callback proc */
+                GoOn = Callback(Context, Handle);
+                if (!GoOn) break;
+            }
+        }
+
+        /* Disable the expansion bit and release the lock */
+        SearchTable->Expanding = FALSE;
+        ReleaseWriteLock(SearchTable);
+
+        /* Check again if we should leave */
+        if (!GoOn) break;
+    }
+
+    /* return */
+    return GoOn;
+}
+
+PWAH_HANDLE
+WINAPI
+WahInsertHandleContext(IN PWAH_HANDLE_TABLE Table,
+                       IN PWAH_HANDLE Handle)
+{
+    PWAH_HANDLE *HashHandle, OldHandle;
+    PVLONG Count;
+    PWAH_HASH_TABLE HashTable, NewHashTable;
+    DWORD HandleCount, i;
+    PWAH_SEARCH_TABLE SearchTable;
+
+    /* Get the current Search Table */
+    SearchTable = WSH_SEARCH_TABLE_FROM_HANDLE(Handle->Handle, Table);
+
+    /* Start loop */
+    do
+    {
+        /* Get reader lock */
+        AcquireReadLock(SearchTable, &Count);
+
+        /* Get the hash table */
+        HashTable = SearchTable->HashTable;
+
+        /* Make sure we are not expanding, and that the table is there */
+        if (!(SearchTable->Expanding) && (HashTable))
+        {
+            /* Get the hash handle */
+            HashHandle = &WSH_HASH_FROM_HANDLE(Handle->Handle, HashTable);
+
+            /* Do the insert */
+            if (InterlockedCompareExchangePointer((PVOID*)HashHandle,
+                                                  Handle,
+                                                  NULL) == NULL)
+            {
+                /* Success, release the reader lock */
+                ReleaseReadLock(SearchTable, Count);
+
+                /* Save old handle */
+                OldHandle = Handle;
+                break;
+            }
+        }
+
+        /* Release the read lock since we're done with it now */
+        ReleaseReadLock(SearchTable, Count);
+
+        /* We need the writer lock to expand/create the table */
+        AcquireWriteLock(SearchTable);
+
+        /* Mark the table in use */
+        SearchTable->Expanding = TRUE;
+
+        /* Wait for all the readers to finish */
+        TryWaitForReaders(SearchTable);
+
+        /* Start loop */
+        do
+        {
+            /* Get the hash table again */
+            HashTable = SearchTable->HashTable;
+
+            /* Check if exists now */
+            if (HashTable)
+            {
+                /* It does! Do what we wanted to do earlier. Get the hash... */
+                HashHandle = &WSH_HASH_FROM_HANDLE(Handle->Handle, HashTable);
+
+                /* Check if it doesn't exist */
+                if (!(*HashHandle))
+                {
+                    /* Write it (no need for interlock, we have the RW lock) */
+                    OldHandle = Handle;
+                    *HashHandle = Handle;
+                    break;
+                }
+                else if ((*HashHandle)->Handle == Handle->Handle)
+                {
+                    /* Handle matches, write it (see comment above) */
+                    OldHandle = *HashHandle;
+                    *HashHandle = Handle;
+                    break;
+                }
+
+                /* No go, we need to expand the table. Remember the size now */
+                HandleCount = HashTable->Size;
+            }
+            else
+            {
+                /* Table is empty, we have to create it */
+                HandleCount = 0;
+            }
+
+ExpandTable:
+            /* Find a free prime */
+            for (i = 0; HandleCount >= SockPrimes[i]; i++);
+
+            /* Check if we found one */
+            if (SockPrimes[i] != 0xFFFFFFFF)
+            {
+                /* Use the prime */
+                HandleCount = SockPrimes[i];
+            }
+            else
+            {
+                /* No primes left. Table is quite large, so simply double it */
+                HandleCount *= 2;
+            }
+
+            /* Allocate the table */
+            NewHashTable = HeapAlloc(GlobalHeap,
+                                     0,
+                                     FIELD_OFFSET(WSH_HASH_TABLE,
+                                                  Handles[HandleCount]));
+
+            /* Hopefully we have one now */
+            if (NewHashTable)
+            {
+                /* Set its size */
+                NewHashTable->Size = HandleCount;
+
+                /* Initialize it */
+                RtlZeroMemory(NewHashTable->Handles, HandleCount * sizeof(PVOID));
+
+                /* Insert us first */
+                WSH_HASH_FROM_HANDLE(Handle->Handle, NewHashTable) = Handle;
+
+                /* Now check if our old table had entries in it */
+                if (HashTable)
+                {
+                    /* We need to move them */
+                    for (i = 0; i < HashTable->Size; i++)
+                    {
+                        /* Make sure the hash handle exists */
+                        if (HashTable->Handles[i])
+                        {
+                            /* Get it */
+                            HashHandle = &WSH_HASH_FROM_HANDLE(HashTable->
+                                                               Handles[i]->Handle,
+                                                               NewHashTable);
+
+                            /* Check if it has a value */
+                            if (!(*HashHandle))
+                            {
+                                /* It's empty, so just write the handle */
+                                *HashHandle = HashTable->Handles[i];
+                            }
+                            else
+                            {
+                                /* Not empty :/... that implies a collision */
+                                HeapFree(GlobalHeap, 0, NewHashTable);
+                                goto ExpandTable;
+                            }
+                        }
+                    }
+
+                    /* Write the new hash table */
+                    SearchTable->HashTable = NewHashTable;
+
+                    /* Wait for everyone to be done with it, then free it */
+                    TryWaitForReaders(SearchTable);
+                    HeapFree(GlobalHeap, 0, HashTable);
+                }
+                else
+                {
+                    /* It was empty, nothing to worry about */
+                    SearchTable->HashTable = NewHashTable;
+                }
+
+                /* Save the old handle */
+                OldHandle = Handle;
+            }
+            else
+            {
+                /* There was no old handle */
+                OldHandle = Handle;
+            }
+        } while (0);
+
+        /* Mark us as free, and release the write lock */
+        SearchTable->Expanding = FALSE;
+        ReleaseWriteLock(SearchTable);
+        break;
+    } while (1);
+
+    /* Return the old handle */
+    return OldHandle;
+}
+
+PWAH_HANDLE
+WINAPI
+WahReferenceContextByHandle(IN PWAH_HANDLE_TABLE Table,
+                            IN HANDLE Handle)
+{
+    PWAH_HANDLE HashHandle;
+    PWAH_SEARCH_TABLE SearchTable;
+    PWAH_HASH_TABLE HashTable;
+    PVLONG Count;
+
+    /* Get the current Search Table */
+    SearchTable = WSH_SEARCH_TABLE_FROM_HANDLE(Handle, Table);
+
+    /* Lock it */
+    AcquireReadLock(SearchTable, &Count);
+
+    /* Get the hash table and handle */
+    HashTable = SearchTable->HashTable;
+
+    /* Check if it's valid, and if it's the one we want */
+    if ((HashTable) && 
+        (HashHandle = WSH_HASH_FROM_HANDLE(Handle, HashTable)) &&
+        (HashHandle->Handle == Handle))
+    {
+        /* Reference the handle */
+        InterlockedIncrement(&HashHandle->RefCount);
+    }
+    else
+    {
+        /* Invalid handle */
+        HashHandle = NULL;
+    }
+
+    /* Release the lock */
+    ReleaseReadLock(SearchTable, Count);
+
+    /* Return */
+    return HashHandle;
+}
+
+DWORD
+WINAPI
+WahRemoveHandleContext(IN PWAH_HANDLE_TABLE Table,
+                       IN PWAH_HANDLE Handle)
+{
+    PWAH_HANDLE *HashHandle;
+    PWAH_SEARCH_TABLE SearchTable;
+    PWAH_HASH_TABLE HashTable;
+    DWORD ErrorCode = ERROR_SUCCESS;
+
+    /* Get the current Search Table */
+    SearchTable = WSH_SEARCH_TABLE_FROM_HANDLE(Handle->Handle, Table);
+
+    /* Lock it */
+    AcquireWriteLock(SearchTable);
+
+    /* Get the hash table and handle */
+    HashTable = SearchTable->HashTable;
+    HashHandle = &WSH_HASH_FROM_HANDLE(Handle->Handle, HashTable);
+
+    /* Make sure we have a handle, and write the new pointer */
+    if (HashHandle && (InterlockedCompareExchangePointer((PVOID*)HashHandle,
+                                                         NULL,
+                                                         Handle) == Handle))
+    {
+        /* Wait for everyone to be done with it */
+        TryWaitForReaders(SearchTable);
+    }
+    else
+    {
+        /* Invalid handle */
+        ErrorCode = ERROR_INVALID_PARAMETER;
+    }
+
+    /* Release the lock */
+    ReleaseWriteLock(SearchTable);
+
+    /* Return */
+    return ErrorCode;
+}
+
+/* EOF */

Propchange: trunk/reactos/dll/win32/ws2help_new/context.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/ws2help_new/dllmain.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/dllmain.c?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/dllmain.c (added)
+++ trunk/reactos/dll/win32/ws2help_new/dllmain.c [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,170 @@
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS WinSock 2 DLL
+ * FILE:        include/ws2_32.h
+ * PURPOSE:     WinSock 2 DLL header
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+HANDLE GlobalHeap;
+BOOL Ws2helpInitialized = FALSE;
+CRITICAL_SECTION StartupSyncronization;
+HINSTANCE LibraryHdl;
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+WINAPI
+NewCtxInit(VOID)
+{
+    NT_PRODUCT_TYPE ProductType = NtProductWinNt;
+    SYSTEM_INFO SystemInfo;
+    DWORD NumHandleBuckets;
+    HKEY KeyHandle;
+    DWORD RegSize = sizeof(DWORD);
+    DWORD RegType;
+    DWORD Mask;
+
+    /* Try to figure out if this is a workstation or server install */
+    RtlGetNtProductType(&ProductType);
+
+    /* Get the system info */
+    GetSystemInfo(&SystemInfo);
+
+    /* If this is an MP machine, set the default spinlock */
+    if (SystemInfo.dwNumberOfProcessors > 1) gdwSpinCount = 2000;
+
+    /* Figure how many "Handle Buckets" we'll use. Start with the default */
+    NumHandleBuckets = ProductType == NtProductWinNt ? 8 : 32;
+
+    /* Open the registry settings */
+    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
+                     "System\\CurrentControlSet\\Services\\Winsock2\\Parameters",
+                     0,
+                     KEY_QUERY_VALUE,
+                     &KeyHandle) == ERROR_SUCCESS)
+    {
+        /* Query the key */
+        RegQueryValueEx(KeyHandle,
+                        "Ws2_32NumHandleBuckets",
+                        0,
+                        &RegType,
+                        (LPBYTE)&NumHandleBuckets,
+                        &RegSize);
+
+        /* Are we on MP? */
+        if (SystemInfo.dwNumberOfProcessors > 1)
+        {
+            /* Also check for a custom spinlock setting */
+            RegQueryValueEx(KeyHandle,
+                            "Ws2_32SpinCount",
+                            0,
+                            &RegType,
+                            (LPBYTE)&gdwSpinCount,
+                            &RegSize);
+        }
+
+        /* Close the key, we're done */
+        RegCloseKey(KeyHandle);
+    }
+
+    /* Now get the bucket count and normalize it to be log2 and within 256 */
+    for (Mask = 256; !(Mask & NumHandleBuckets); Mask >>= 1);
+    NumHandleBuckets = Mask;
+
+    /* Normalize it again, to be within OS parameters */
+    if (ProductType == NtProductWinNt)
+    {
+        /* Is it within norms for non-server editions? */
+        if (NumHandleBuckets > 32) NumHandleBuckets = 32;
+        else if (NumHandleBuckets < 8) NumHandleBuckets = 8;
+    }
+    else
+    {
+        /* Is it within norms for server editions? */
+        if (NumHandleBuckets > 256) NumHandleBuckets = 256;
+        else if (NumHandleBuckets < 32) NumHandleBuckets = 32;
+    }
+
+    /* Normalize the spincount */
+    if (gdwSpinCount > 8000) gdwSpinCount = 8000;
+
+    /* Set the final mask */
+    gHandleToIndexMask = NumHandleBuckets -1;
+}
+
+DWORD
+WINAPI
+Ws2helpInitialize(VOID)
+{
+    /* Enter the startup CS */
+    EnterCriticalSection(&StartupSyncronization);
+
+    /* Check again for init */
+    if (!Ws2helpInitialized)
+    {
+        /* Initialize us */
+        NewCtxInit();
+        Ws2helpInitialized = TRUE;
+    }
+
+    /* Leave the CS and return */
+    LeaveCriticalSection(&StartupSyncronization);
+    return ERROR_SUCCESS;
+}
+
+BOOL 
+APIENTRY 
+DllMain(HANDLE hModule, 
+        DWORD  dwReason, 
+        LPVOID lpReserved)
+{
+    switch (dwReason)
+    {
+        case DLL_PROCESS_ATTACH:
+        
+            /* Save our handle */
+            LibraryHdl = hModule;
+
+            /* Improve Performance */
+            DisableThreadLibraryCalls(hModule);
+
+            /* Initialize startup CS */
+            InitializeCriticalSection(&StartupSyncronization);
+
+            /* Get Global Heap */
+            GlobalHeap = GetProcessHeap();
+        	break;
+
+        case DLL_THREAD_ATTACH:
+	    case DLL_THREAD_DETACH:
+            break;
+
+	    case DLL_PROCESS_DETACH:
+
+            /* Make sure we loaded */
+            if (!LibraryHdl) break;
+
+            /* Check if we are cleaning up */
+            if (lpReserved)
+            {
+                /* Free the security descriptor */
+                if (pSDPipe) HeapFree(GlobalHeap, 0, pSDPipe);
+
+                /* Close the event */
+                if (ghWriterEvent) CloseHandle(ghWriterEvent);
+
+                /* Delete the startup CS */
+                DeleteCriticalSection(&StartupSyncronization);
+                Ws2helpInitialized = FALSE;
+            }
+			break;
+    }
+
+    return TRUE;
+}

Propchange: trunk/reactos/dll/win32/ws2help_new/dllmain.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/ws2help_new/handle.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/handle.c?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/handle.c (added)
+++ trunk/reactos/dll/win32/ws2help_new/handle.c [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,447 @@
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS WinSock 2 DLL
+ * FILE:        include/ws2_32.h
+ * PURPOSE:     WinSock 2 DLL header
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+typedef struct _WSH_HELPER_CONTEXT
+{
+    HANDLE FileHandle;
+    HANDLE ThreadHandle;
+    HANDLE DllHandle;
+} WSH_HELPER_CONTEXT, *PWAH_HELPER_CONTEXT;
+
+LPFN_WSASEND pWSASend;
+LPFN_WSARECV pWSARecv;
+LPFN_WSASENDTO pWSASendTo;
+LPFN_WSARECVFROM pWSARecvFrom;
+LPFN_WSAGETLASTERROR pWSAGetLastError;
+LPFN_WSACANCELBLOCKINGCALL pWSACancelBlockingCall;
+LPFN_WSASETBLOCKINGHOOK pWSASetBlockingHook;
+LPFN_SELECT pSelect;
+LPFN_WSASTARTUP pWSAStartup;
+LPFN_WSACLEANUP pWSACleanup;
+LPFN_GETSOCKOPT pGetSockOpt;
+LPFN_WSAIOCTL pWSAIoctl;
+
+#define APCH (HANDLE)'SOR '
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+CALLBACK
+ApcThread(ULONG_PTR Context)
+{
+
+}
+
+NTSTATUS
+WINAPI
+DoSocketCancel(PVOID Context1,  
+               PVOID Context2,  
+               PVOID Context3)
+{
+    return STATUS_SUCCESS;
+}
+
+NTSTATUS
+WINAPI
+DoSocketRequest(PVOID Context1,  
+                PVOID Context2,  
+                PVOID Context3)
+{
+    return STATUS_SUCCESS;
+}
+
+VOID
+CALLBACK
+ExitThreadApc(ULONG_PTR Context)
+{
+    PWAH_HELPER_CONTEXT HelperContext = (PWAH_HELPER_CONTEXT)Context;
+
+    /* Close the file handle */
+    CloseHandle(HelperContext->FileHandle);
+
+    /* Free the context */
+    HeapFree(GlobalHeap, 0, HelperContext);
+
+    /* Exit the thread and library */
+    FreeLibraryAndExitThread(HelperContext->DllHandle, ERROR_SUCCESS);
+}
+
+DWORD
+WINAPI
+WahCloseHandleHelper(IN HANDLE HelperHandle)
+{
+    DWORD ErrorCode;
+    PWAH_HELPER_CONTEXT Context = HelperHandle;
+
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Validate the handle */
+    if (!Context) return ERROR_INVALID_PARAMETER;
+
+    /* Queue an APC to exit the thread */
+    if (QueueUserAPC(ExitThreadApc, Context->ThreadHandle, (ULONG_PTR)Context))
+    {
+        /* Done */
+        return ERROR_SUCCESS;
+    }
+    else
+    {
+        /* We failed somewhere */
+        return ERROR_GEN_FAILURE;
+    }
+}
+
+DWORD
+WINAPI
+WahCloseSocketHandle(IN HANDLE HelperHandle,
+                     IN SOCKET Socket)
+{
+    DWORD ErrorCode;
+    PWAH_HELPER_CONTEXT Context = HelperHandle;
+
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Validate the handle */
+    if (!(Context) || (Socket == INVALID_SOCKET) || !(Socket))
+    {
+        /* Invalid handle and/or socket */
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    /* Just close the handle and return */
+    CloseHandle((HANDLE)Socket);
+    return ERROR_SUCCESS;
+}
+
+DWORD
+WINAPI
+WahCreateSocketHandle(IN HANDLE HelperHandle,
+                      OUT SOCKET *Socket)
+{
+    DWORD ErrorCode;
+    INT OpenType;
+    DWORD Size = sizeof(OpenType);
+    DWORD CreateOptions = 0;
+    UNICODE_STRING Name;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    PFILE_FULL_EA_INFORMATION Ea;
+    PWAH_EA_DATA EaData;
+    CHAR EaBuffer[sizeof(*Ea) + sizeof(*EaData)];
+    NTSTATUS Status;
+    IO_STATUS_BLOCK IoStatusBlock;
+	PWAH_HELPER_CONTEXT	Context = (PWAH_HELPER_CONTEXT)HelperHandle;
+    
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Validate the handle and pointer */
+    if (!(Context) || !(Socket))
+    {
+        /* Invalid handle and/or socket */
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    /* Set pointer to EA */
+    Ea = (PFILE_FULL_EA_INFORMATION)EaBuffer;
+
+    /* Get the open type to determine the create options */
+    if ((pGetSockOpt(INVALID_SOCKET,
+                     SOL_SOCKET,
+                     SO_OPENTYPE,
+                     (PCHAR)&OpenType,
+                     (INT FAR*)&Size) == ERROR_SUCCESS) && (OpenType))
+    {
+        /* This is a sync open */
+        CreateOptions = FILE_SYNCHRONOUS_IO_NONALERT;
+    }
+
+    /* Initialize the attributes for the driver */
+    RtlInitUnicodeString(&Name, L"\\Device\\WS2IFSL\\NifsSct");
+    InitializeObjectAttributes(&ObjectAttributes,
+                               &Name,
+                               0,
+                               NULL,
+                               NULL);
+
+    /* Set up the EA */
+    Ea->NextEntryOffset = 0;
+    Ea->Flags = 0;
+    Ea->EaNameLength = sizeof("NifsSct");
+    Ea->EaValueLength = sizeof(*EaData);
+    RtlCopyMemory(Ea->EaName, "NifsSct", Ea->EaNameLength);
+
+    /* Get our EA data */
+    EaData = (PWAH_EA_DATA)(Ea + 1);
+
+    /* Write the EA Data */
+    EaData->FileHandle = Context->FileHandle;
+    EaData->Context = NULL;
+
+    /* Call the driver */
+    Status = NtCreateFile((PHANDLE)Socket,
+                           FILE_ALL_ACCESS,
+                           &ObjectAttributes,
+                           &IoStatusBlock,
+                           NULL,
+                           FILE_ATTRIBUTE_NORMAL,
+                           0,
+                           FILE_OPEN_IF,
+                           CreateOptions,
+                           Ea,
+                           sizeof(*Ea) + sizeof(*EaData));
+
+    /* Check for success */
+    if (NT_SUCCESS(Status))
+    {
+        /* Write the socket handle */
+        EaData->Context =(HANDLE)*Socket;
+
+        /* Tell the driver about it */
+        if (DeviceIoControl((HANDLE)*Socket,
+                            IOCTL_WS2IFSL_SET_HANDLE,
+                            &EaData,
+                            sizeof(WSH_EA_DATA),
+                            NULL,
+                            0,
+                            &Size,
+                            NULL))
+        {
+            /* Set success */
+            ErrorCode = NO_ERROR;
+        }
+        else 
+        {
+            /* We failed. Get the error and close the socket */
+            ErrorCode = GetLastError();
+            CloseHandle((HANDLE)*Socket);
+            *Socket = 0;
+        }
+    }
+    else
+    {
+        /* Create file failed, conver error code */
+        ErrorCode = RtlNtStatusToDosError(Status);
+    }
+
+    /* Return to caller */
+    return ErrorCode;
+}
+
+INT
+WINAPI
+WahDisableNonIFSHandleSupport(VOID)
+{
+    DWORD ErrorCode;
+    SC_HANDLE ServiceMgrHandle, Ws2IfsHandle;
+
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Open the service DB */
+    ServiceMgrHandle = OpenSCManager(NULL,
+                                     SERVICES_ACTIVE_DATABASE,
+                                     SC_MANAGER_CREATE_SERVICE);
+    if (!ServiceMgrHandle) return GetLastError();
+    
+    /* Open the service */
+    Ws2IfsHandle = OpenService(ServiceMgrHandle, "WS2IFSL", SERVICE_ALL_ACCESS);
+
+    /* Disable the servce */
+    ChangeServiceConfig(Ws2IfsHandle,
+                        SERVICE_NO_CHANGE,
+                        SERVICE_DISABLED,
+                        SERVICE_NO_CHANGE,
+                        NULL,
+                        NULL,
+                        NULL,
+                        NULL,
+                        NULL,
+                        NULL,
+                        NULL);
+
+    /* Close the handles and return */
+    CloseServiceHandle(ServiceMgrHandle);
+    CloseServiceHandle(Ws2IfsHandle);
+    return ERROR_SUCCESS;
+}
+
+INT
+WINAPI
+WahEnableNonIFSHandleSupport(VOID)
+{
+    return 0;
+}
+
+DWORD
+WINAPI
+WahOpenHandleHelper(OUT PHANDLE HelperHandle)
+{
+    DWORD ErrorCode;
+    HINSTANCE hWs2_32;
+    UNICODE_STRING Name;
+    OBJECT_ATTRIBUTES ObjectAttributes;
+    PFILE_FULL_EA_INFORMATION Ea;
+    PWAH_EA_DATA2 EaData;
+    CHAR EaBuffer[sizeof(*Ea) + sizeof(*EaData)];
+    NTSTATUS Status;
+    IO_STATUS_BLOCK IoStatusBlock;
+    DWORD Tid;
+    PWAH_HELPER_CONTEXT Context;
+
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Validate the pointer */
+    if (!HelperHandle)
+    {
+        /* Invalid handle and/or socket */
+        return ERROR_INVALID_PARAMETER;
+    }
+
+    /* Get ws2_32.dll's handle. We don't load it: it MUST be here */
+    hWs2_32 = GetModuleHandle ("WS2_32.DLL");
+    if (!hWs2_32) return WSASYSCALLFAILURE;
+
+    /* Dynamically load all its APIs */
+    if (!((pGetSockOpt = (LPFN_GETSOCKOPT)GetProcAddress(hWs2_32, "getsockopt"))) ||
+        !((pSelect = (LPFN_SELECT)GetProcAddress(hWs2_32, "select"))) ||
+        !((pWSACancelBlockingCall = (LPFN_WSACANCELBLOCKINGCALL)GetProcAddress(hWs2_32, "WSACancelBlockingCall"))) ||
+        !((pWSACleanup = (LPFN_WSACLEANUP)GetProcAddress(hWs2_32, "WSACleanup"))) ||
+        !((pWSAGetLastError = (LPFN_WSAGETLASTERROR)GetProcAddress(hWs2_32, "WSAGetLastError"))) ||
+        !((pWSASetBlockingHook = (LPFN_WSASETBLOCKINGHOOK)GetProcAddress(hWs2_32, "WSASetBlockingHook"))) ||
+        !((pWSARecv = (LPFN_WSARECV)GetProcAddress(hWs2_32, "WSARecv"))) ||
+        !((pWSASend = (LPFN_WSASEND)GetProcAddress(hWs2_32, "WSASend"))) ||
+        !((pWSASendTo = (LPFN_WSASENDTO)GetProcAddress(hWs2_32, "WSASendTo"))) ||
+        !((pWSAStartup = (LPFN_WSASTARTUP)GetProcAddress(hWs2_32, "WSAStartup"))) ||
+        !((pWSARecvFrom = (LPFN_WSARECVFROM)GetProcAddress(hWs2_32, "WSARecvFrom"))) ||
+        !((pWSAIoctl = (LPFN_WSAIOCTL)GetProcAddress(hWs2_32, "WSAIoctl"))))
+    {
+        /* Uh, guess we failed somewhere */
+        return WSASYSCALLFAILURE;
+    }
+
+    /* Set pointer EA structure */
+    Ea = (PFILE_FULL_EA_INFORMATION)EaBuffer;
+
+    /* Create the helper context */
+    Context = HeapAlloc(GlobalHeap, 0, sizeof(WSH_HELPER_CONTEXT));
+    if (Context)
+    {
+        /* Create the special request thread */
+		Context->ThreadHandle = CreateThread(NULL,
+                                             0,
+                                             (PVOID)ApcThread,
+                                             Context,
+                                             CREATE_SUSPENDED,
+                                             &Tid);
+		if (Context->ThreadHandle)
+        {
+            /* Create the attributes for the driver open */
+			RtlInitUnicodeString(&Name,  L"\\Device\\WS2IFSL\\NifsPvd");
+			InitializeObjectAttributes(&ObjectAttributes,
+								       &Name,
+                                       0,
+                                       NULL,
+                                       NULL);
+
+            /* Setup the EA */
+			Ea->NextEntryOffset = 0;
+			Ea->Flags = 0;
+			Ea->EaNameLength = sizeof("NifsPvd");
+			Ea->EaValueLength = sizeof(*EaData);
+			RtlCopyMemory(Ea->EaName, "NifsPvd", Ea->EaNameLength);
+                
+            /* Get our EA data */
+            EaData = (PWAH_EA_DATA2)(Ea + 1);
+
+            /* Fill out the EA Data */
+			EaData->ThreadHandle = Context->ThreadHandle;
+			EaData->RequestRoutine = DoSocketRequest;
+			EaData->CancelRoutine = DoSocketCancel;
+			EaData->ApcContext = Context;
+			EaData->Reserved = 0;
+
+            /* Call the driver */
+			Status = NtCreateFile(&Context->FileHandle,
+								  FILE_ALL_ACCESS,
+								  &ObjectAttributes,
+								  &IoStatusBlock,
+								  NULL,
+								  FILE_ATTRIBUTE_NORMAL,
+								  0,
+								  FILE_OPEN_IF,
+								  0,
+								  Ea,
+								  sizeof(*Ea) + sizeof(*EaData));
+			
+            /* Check for success */
+            if (NT_SUCCESS(Status)) 
+            {
+                /* Resume the thread and return a handle to the context */
+                ResumeThread(Context->ThreadHandle);
+				*HelperHandle = (HANDLE)Context;
+				return ERROR_SUCCESS;
+			}
+		    else
+            { 
+                /* Get the error code */
+			    ErrorCode = RtlNtStatusToDosError(Status);
+            }
+
+            /* We failed, mark us as such */
+            Context->FileHandle = NULL;
+            ResumeThread(Context->ThreadHandle);
+        }
+		else
+        {
+            /* Get the error code */
+			ErrorCode = GetLastError();
+		}
+
+        /* If we got here, we failed, so free the context */
+		HeapFree(GlobalHeap, 0, Context);
+    }
+    else
+    {
+        /* Get the errror code */
+        ErrorCode = GetLastError();
+    }
+
+    /* Return to caller */
+    return ErrorCode;
+}
+
+DWORD
+WINAPI
+WahCompleteRequest(IN HANDLE HelperHandle,
+                   IN SOCKET Socket,
+                   IN LPWSAOVERLAPPED lpOverlapped,
+                   IN DWORD ErrorCode,
+                   IN DWORD BytesTransferred)
+{
+    UNREFERENCED_PARAMETER(HelperHandle);
+    UNREFERENCED_PARAMETER(Socket);
+    UNREFERENCED_PARAMETER(lpOverlapped);
+    UNREFERENCED_PARAMETER(ErrorCode);
+    UNREFERENCED_PARAMETER(BytesTransferred);
+    return ERROR_SUCCESS;
+}
+
+/* EOF */

Propchange: trunk/reactos/dll/win32/ws2help_new/handle.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/ws2help_new/notify.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/notify.c?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/notify.c (added)
+++ trunk/reactos/dll/win32/ws2help_new/notify.c [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,87 @@
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS WinSock 2 DLL
+ * FILE:        include/ws2_32.h
+ * PURPOSE:     WinSock 2 DLL header
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "precomp.h"
+
+/* DATA **********************************************************************/
+
+#define HANH        (HANDLE)'2SOR'
+
+PSECURITY_DESCRIPTOR pSDPipe = NULL;
+
+/* FUNCTIONS *****************************************************************/
+
+DWORD
+WINAPI
+WahCloseNotificationHandleHelper(IN HANDLE HelperHandle)
+{
+    DWORD ErrorCode;
+
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Validate handle */
+    if (HelperHandle != HANH) return ERROR_INVALID_PARAMETER;
+
+    /* return */
+    return ERROR_SUCCESS;
+}
+
+DWORD
+WINAPI
+WahCreateNotificationHandle(IN HANDLE HelperHandle,
+                            OUT PHANDLE NotificationHelperHandle)
+{
+    UNREFERENCED_PARAMETER(HelperHandle);
+    UNREFERENCED_PARAMETER(NotificationHelperHandle);
+    return 0;
+}
+
+DWORD
+WINAPI
+WahOpenNotificationHandleHelper(OUT PHANDLE HelperHandle)
+{
+    DWORD ErrorCode;
+
+    /* Enter the prolog, make sure we're initialized */
+    ErrorCode = WS2HELP_PROLOG();
+    if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+
+    /* Validate handle */
+    if (!HelperHandle) return ERROR_INVALID_PARAMETER;
+
+    /* Return a bogus handle ("ROS2") */
+    *HelperHandle = HANH;
+    return ERROR_SUCCESS;
+}
+
+INT
+WINAPI
+WahNotifyAllProcesses(IN HANDLE NotificationHelperHandle)
+{
+    UNREFERENCED_PARAMETER(NotificationHelperHandle);
+    return 0;
+}
+
+INT
+WINAPI 
+WahWaitForNotification(IN HANDLE NotificationHelperHandle,
+                       IN HANDLE lpNotificationHandle,
+                       IN LPWSAOVERLAPPED lpOverlapped,
+                       IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
+{
+    UNREFERENCED_PARAMETER(NotificationHelperHandle);
+    UNREFERENCED_PARAMETER(lpNotificationHandle);
+    UNREFERENCED_PARAMETER(lpOverlapped);
+    UNREFERENCED_PARAMETER(lpCompletionRoutine);
+    return 0;
+}
+
+/* EOF */

Propchange: trunk/reactos/dll/win32/ws2help_new/notify.c
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/ws2help_new/precomp.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/precomp.h?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/precomp.h (added)
+++ trunk/reactos/dll/win32/ws2help_new/precomp.h [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,47 @@
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS WinSock 2 Helper DLL
+ * FILE:        lib/ws2help/precomp.h
+ * PURPOSE:     WinSock 2 Helper DLL
+ */
+#ifndef __PRECOMP_H
+#define __PRECOMP_H
+
+/* Winsock Provider Headers */
+#define WIN32_NO_STATUS
+#define _WIN32_WINNT 0x502
+#define NTOS_MODE_USER
+#define INCL_WINSOCK_API_TYPEDEFS 1
+#include <ws2spi.h>
+
+/* NDK Headers */
+#include <rtlfuncs.h>
+#include <iofuncs.h>
+
+/* Shared Winsock Helper headers */
+#include <ws2help.h>
+#include <wshdrv.h>
+
+/* Missing definition */
+#define SO_OPENTYPE 0x20
+
+/* Global data */
+extern HANDLE GlobalHeap;
+extern PSECURITY_DESCRIPTOR pSDPipe;
+extern HANDLE ghWriterEvent;
+extern BOOL Ws2helpInitialized;
+extern DWORD gdwSpinCount;
+extern DWORD gHandleToIndexMask;
+
+/* Functions */
+DWORD
+WINAPI
+Ws2helpInitialize(VOID);
+
+/* Initialization macro */
+#define WS2HELP_PROLOG() \
+    (Ws2helpInitialized? ERROR_SUCCESS : Ws2helpInitialize())
+
+#endif /* __WS2HELP_H */
+
+/* EOF */

Propchange: trunk/reactos/dll/win32/ws2help_new/precomp.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/ws2help_new/ws2help.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/ws2help.h?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/ws2help.h (added)
+++ trunk/reactos/dll/win32/ws2help_new/ws2help.h [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,163 @@
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS WinSock 2 Helper DLL
+ * FILE:        include/libs/winsock/ws2help.h
+ * PURPOSE:     WinSock 2 Helper DLL header
+ */
+
+#ifndef __WS2HELP_H
+#define __WS2HELP_H
+
+/* Types */
+typedef struct _WSH_HANDLE
+{
+    LONG RefCount;
+    HANDLE Handle;
+} WSH_HANDLE, *PWAH_HANDLE;
+
+typedef struct _WSH_HASH_TABLE
+{
+    DWORD Size;
+    PWAH_HANDLE Handles[1];
+} WSH_HASH_TABLE, *PWAH_HASH_TABLE;
+
+typedef struct _WSH_SEARCH_TABLE
+{
+    volatile PWAH_HASH_TABLE HashTable;
+    volatile PLONG CurrentCount;
+    LONG Count1;
+    LONG Count2;
+    LONG SpinCount;
+    BOOL Expanding;
+    CRITICAL_SECTION Lock;
+} WSH_SEARCH_TABLE, *PWAH_SEARCH_TABLE;
+
+typedef struct _WSH_HANDLE_TABLE 
+{
+    DWORD Mask;
+    WSH_SEARCH_TABLE SearchTables[1];
+} WSH_HANDLE_TABLE, *PWAH_HANDLE_TABLE;
+
+//typedef struct _WSH_HANDLE_TABLE *PWAH_HANDLE_TABLE;
+
+typedef BOOL
+(WINAPI *PWAH_HANDLE_ENUMERATE_PROC)(
+    IN PVOID Context,
+    IN PWAH_HANDLE Handle
+);
+
+PWAH_HANDLE
+WINAPI
+WahReferenceContextByHandle(
+    IN PWAH_HANDLE_TABLE Table,
+    IN HANDLE Handle
+);
+
+DWORD
+WINAPI
+WahRemoveHandleContext(
+    IN PWAH_HANDLE_TABLE Table,
+    IN PWAH_HANDLE Handle
+);
+
+DWORD
+WINAPI
+WahCloseSocketHandle(
+    IN HANDLE HelperHandle,
+    IN SOCKET Socket
+);
+
+DWORD
+WINAPI
+WahOpenCurrentThread(
+    IN HANDLE HelperHandle,
+    OUT LPWSATHREADID ThreadId
+);
+
+DWORD
+WINAPI
+WahCloseApcHelper(
+    IN HANDLE HelperHandle
+);
+
+DWORD
+WINAPI
+WahCloseThread(
+    IN HANDLE HelperHandle,
+    IN LPWSATHREADID ThreadId
+);
+
+DWORD
+WINAPI
+WahCloseHandleHelper(
+    IN HANDLE HelperHandle
+);
+
+DWORD
+WINAPI
+WahCloseNotificationHandleHelper(
+    IN HANDLE HelperHandle
+);
+
+DWORD
+WINAPI
+WahOpenNotificationHandleHelper(
+    OUT PHANDLE HelperHandle
+);
+
+DWORD
+WINAPI
+WahCreateNotificationHandle(
+    IN HANDLE HelperHandle,
+    OUT PHANDLE NotificationHelperHandle
+);
+
+INT
+WINAPI 
+WahWaitForNotification(
+    IN HANDLE NotificationHelperHandle,
+    IN HANDLE lpNotificationHandle,
+    IN LPWSAOVERLAPPED lpOverlapped,
+    IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
+);
+
+INT
+WINAPI
+WahNotifyAllProcesses(
+    IN HANDLE NotificationHelperHandle
+);
+
+BOOL
+WINAPI
+WahEnumerateHandleContexts(
+    IN PWAH_HANDLE_TABLE Table,
+    IN PWAH_HANDLE_ENUMERATE_PROC Callback,
+    IN PVOID Context
+);
+
+DWORD
+WINAPI
+WahCreateHandleContextTable(
+    OUT PWAH_HANDLE_TABLE *Table
+);
+
+DWORD
+WINAPI
+WahDestroyHandleContextTable(
+    IN PWAH_HANDLE_TABLE Table
+);
+
+PWAH_HANDLE
+WINAPI
+WahInsertHandleContext(
+    IN PWAH_HANDLE_TABLE Table,
+    IN PWAH_HANDLE Handle
+);
+
+DWORD
+WINAPI
+WahOpenApcHelper(
+    OUT PHANDLE ApcHelperHandle
+);
+
+#endif

Propchange: trunk/reactos/dll/win32/ws2help_new/ws2help.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/ws2help_new/ws2help.rbuild
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/ws2help.rbuild?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/ws2help.rbuild (added)
+++ trunk/reactos/dll/win32/ws2help_new/ws2help.rbuild [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,14 @@
+<module name="ws2help" type="win32dll" baseaddress="${BASEADDRESS_WS2HELP}" installbase="system32" installname="ws2help.dll">
+	<importlibrary definition="ws2help.spec" />
+	<include base="ws2help">.</include>
+	<library>advapi32</library>
+	<library>ntdll</library>
+	<library>kernel32</library>
+	<library>ws2_32</library>
+	<file>apc.c</file>
+	<file>context.c</file>
+	<file>dllmain.c</file>
+	<file>handle.c</file>
+	<file>notify.c</file>
+	<file>ws2help.rc</file>
+</module>

Propchange: trunk/reactos/dll/win32/ws2help_new/ws2help.rbuild
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/ws2help_new/ws2help.rc
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/ws2help.rc?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/ws2help.rc (added)
+++ trunk/reactos/dll/win32/ws2help_new/ws2help.rc [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,7 @@
+/* $Id: ws2help.rc 12852 2005-01-06 13:58:04Z mf $ */
+
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION	"Windows Sockets 2 Helper API\0"
+#define REACTOS_STR_INTERNAL_NAME	"ws2help\0"
+#define REACTOS_STR_ORIGINAL_FILENAME	"ws2help.dll\0"
+#include <reactos/version.rc>

Propchange: trunk/reactos/dll/win32/ws2help_new/ws2help.rc
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/ws2help_new/ws2help.spec
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/ws2help.spec?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/ws2help.spec (added)
+++ trunk/reactos/dll/win32/ws2help_new/ws2help.spec [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,23 @@
+@ stdcall WahCloseApcHelper(long)
+@ stdcall WahCloseHandleHelper(long)
+@ stdcall WahCloseNotificationHandleHelper(long)
+@ stdcall WahCloseSocketHandle(long ptr)
+@ stdcall WahCloseThread(long ptr)
+@ stdcall WahCompleteRequest(long ptr ptr long long)
+@ stdcall WahCreateHandleContextTable(ptr)
+@ stdcall WahCreateNotificationHandle(long ptr)
+@ stdcall WahCreateSocketHandle(long ptr)
+@ stdcall WahDestroyHandleContextTable(ptr)
+@ stdcall WahDisableNonIFSHandleSupport()
+@ stdcall WahEnableNonIFSHandleSupport()
+@ stdcall WahEnumerateHandleContexts(ptr ptr ptr)
+@ stdcall WahInsertHandleContext(ptr ptr)
+@ stdcall WahNotifyAllProcesses(long)
+@ stdcall WahOpenApcHelper(ptr)
+@ stdcall WahOpenCurrentThread(long ptr)
+@ stdcall WahOpenHandleHelper(ptr)
+@ stdcall WahOpenNotificationHandleHelper(ptr)
+@ stdcall WahQueueUserApc(long ptr ptr ptr)
+@ stdcall WahReferenceContextByHandle(ptr long)
+@ stdcall WahRemoveHandleContext(ptr ptr)
+@ stdcall WahWaitForNotification(long long ptr ptr)

Propchange: trunk/reactos/dll/win32/ws2help_new/ws2help.spec
------------------------------------------------------------------------------
    svn:eol-style = native

Added: trunk/reactos/dll/win32/ws2help_new/wshdrv.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/ws2help_new/wshdrv.h?rev=42115&view=auto
==============================================================================
--- trunk/reactos/dll/win32/ws2help_new/wshdrv.h (added)
+++ trunk/reactos/dll/win32/ws2help_new/wshdrv.h [iso-8859-1] Tue Jul 21 11:16:26 2009
@@ -1,0 +1,28 @@
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS WinSock 2 DLL
+ * FILE:        include/drivers/ws2ifsl/wshdrv.h
+ * PURPOSE:     WinSock 2 Helper Driver header
+ */
+
+#ifndef __WSHDRV_H
+#define __WSHDRV_H
+
+typedef struct _WSH_EA_DATA
+{
+    HANDLE FileHandle;
+    PVOID Context;
+} WSH_EA_DATA, *PWAH_EA_DATA;
+
+typedef struct _WAH_EA_DATA2
+{
+    HANDLE ThreadHandle;
+    PVOID RequestRoutine;
+    PVOID CancelRoutine;
+    PVOID ApcContext;
+    ULONG Reserved;
+} WAH_EA_DATA2, *PWAH_EA_DATA2;
+
+#define IOCTL_WS2IFSL_SET_HANDLE 0x12B00
+
+#endif

Propchange: trunk/reactos/dll/win32/ws2help_new/wshdrv.h
------------------------------------------------------------------------------
    svn:eol-style = native



More information about the Ros-diffs mailing list