UnsafeNativeMethods.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / ndp / fx / src / Net / System / Net / UnsafeNativeMethods.cs / 5 / UnsafeNativeMethods.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Net { 
    using System.Runtime.InteropServices; 
    using System.Runtime.CompilerServices;
    using System.Security.Permissions; 
    using System.Text;
    using System.Net.Sockets;
    using System.Net.Cache;
    using System.Threading; 
    using System.ComponentModel;
    using System.Collections; 
    using System.Globalization; 
    using System.Runtime.ConstrainedExecution;
    using System.Security; 
    using Microsoft.Win32.SafeHandles;

    [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
    internal static class UnsafeNclNativeMethods { 

#if FEATURE_PAL 
 #if !PLATFORM_UNIX 
        internal const String DLLPREFIX = "";
        internal const String DLLSUFFIX = ".dll"; 
 #else // !PLATFORM_UNIX
  #if __APPLE__
        internal const String DLLPREFIX = "lib";
        internal const String DLLSUFFIX = ".dylib"; 
  #elif _AIX
        internal const String DLLPREFIX = "lib"; 
        internal const String DLLSUFFIX = ".a"; 
  #elif __hppa__ || IA64
        internal const String DLLPREFIX = "lib"; 
        internal const String DLLSUFFIX = ".sl";
  #else
        internal const String DLLPREFIX = "lib";
        internal const String DLLSUFFIX = ".so"; 
  #endif
 #endif // !PLATFORM_UNIX 
 
        internal const String ROTOR_PAL   = DLLPREFIX + "rotor_pal" + DLLSUFFIX;
        internal const String ROTOR_PALRT = DLLPREFIX + "rotor_palrt" + DLLSUFFIX; 
        private const String KERNEL32 = ROTOR_PAL;
#else
        private const string KERNEL32 = "kernel32.dll";
#endif // !FEATURE_PAL 

#if !FEATURE_PAL 
        private const string WS2_32 = "ws2_32.dll"; 
#else
        private const string WS2_32 = ExternDll.Kernel32; // Resolves to rotor_pal 
#endif // !FEATURE_PAL

        private const string SECUR32 = "secur32.dll";
        private const string CRYPT32 = "crypt32.dll"; 
        private const string ADVAPI32 = "advapi32.dll";
        private const string HTTPAPI = "httpapi.dll"; 
        private const string SCHANNEL = "schannel.dll"; 
        private const string SECURITY = "security.dll";
        private const string RASAPI32 = "rasapi32.dll"; 
        private const string WININET = "wininet.dll";
        private const string WINHTTP = "winhttp.dll";
        private const string BCRYPT = "bcrypt.dll";
 
        /*
        // Consider removing. 
        [DllImport(KERNEL32)] 
        internal static extern IntPtr CreateSemaphore([In] IntPtr lpSemaphoreAttributes, [In] int lInitialCount, [In] int lMaximumCount, [In] string lpName);
        */ 

        /* Consider removing.
        [DllImport(KERNEL32)]
        internal static extern IntPtr CreateEvent([In] IntPtr lpEventAttributes, [In] bool manualResetEvent, [In] bool initalState, [In] IntPtr lpName); 
        */
 
        [DllImport(KERNEL32)] 
        internal static extern IntPtr CreateSemaphore([In] IntPtr lpSemaphoreAttributes, [In] int lInitialCount, [In] int lMaximumCount, [In] IntPtr lpName);
 
#if DEBUG
        [DllImport(KERNEL32)]
        internal static extern bool ReleaseSemaphore([In] IntPtr hSemaphore, [In] int lReleaseCount, [Out] out int lpPreviousCount);
 
#else
        [DllImport(KERNEL32)] 
        internal static extern bool ReleaseSemaphore([In] IntPtr hSemaphore, [In] int lReleaseCount, [In] IntPtr lpPreviousCount); 
#endif
 
        //
        internal static class ErrorCodes
        {
            internal const uint ERROR_SUCCESS               = 0; 
            internal const uint ERROR_HANDLE_EOF            = 38;
            internal const uint ERROR_NOT_SUPPORTED         = 50; 
            internal const uint ERROR_INVALID_PARAMETER     = 87; 
            internal const uint ERROR_ALREADY_EXISTS        = 183;
            internal const uint ERROR_MORE_DATA             = 234; 
            internal const uint ERROR_OPERATION_ABORTED     = 995;
            internal const uint ERROR_IO_PENDING            = 997;
            internal const uint ERROR_NOT_FOUND             = 1168;
        } 

        internal static class NTStatus 
        { 
            internal const uint STATUS_SUCCESS               = 0x00000000;
            internal const uint STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034; 
        }

        [DllImport(KERNEL32, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)]
        internal static extern uint GetCurrentThreadId(); 

#if !FEATURE_PAL 
        // Get the current FIPS policy setting on Vista and above 
        [DllImport(BCRYPT)]
        internal static extern uint BCryptGetFipsAlgorithmMode( 
                [MarshalAs(UnmanagedType.U1), Out]out bool pfEnabled);
#endif

 
#if STRESS || !DEBUG
        [DllImport(KERNEL32, ExactSpelling = true)] 
        internal static extern void DebugBreak(); 
#endif
 
#if FEATURE_PAL
        [DllImport(ROTOR_PALRT, CharSet=CharSet.Unicode, SetLastError=true, EntryPoint="PAL_FetchConfigurationStringW")]
        internal static extern bool FetchConfigurationString(bool perMachine, String parameterName, StringBuilder parameterValue, int parameterValueLength);
#endif // FEATURE_PAL 

#if !FEATURE_PAL 
        [SuppressUnmanagedCodeSecurity] 
        internal unsafe static class RegistryHelper
        { 
            internal const uint REG_NOTIFY_CHANGE_LAST_SET = 4;
            internal const uint REG_BINARY = 3;
            internal const uint KEY_READ = 0x00020019;
 
            internal static readonly IntPtr HKEY_CURRENT_USER = (IntPtr) unchecked((int) 0x80000001L);
            internal static readonly IntPtr HKEY_LOCAL_MACHINE = (IntPtr) unchecked((int) 0x80000002L); 
 
            // RELIABILITY:
            // this out parameter in this API, resultSubKey, is an allocated handle to a registry sub-key. 
            // it must be a SafeHandle so we can guarantee that it is released correctly and never leaked.
            [DllImport(ADVAPI32, BestFitMapping=false, ThrowOnUnmappableChar=true, ExactSpelling=false, CharSet=CharSet.Auto, SetLastError=true)]
            internal static extern uint RegOpenKeyEx(IntPtr key, string subKey, uint ulOptions, uint samDesired, out SafeRegistryHandle resultSubKey);
 
            [DllImport(ADVAPI32, BestFitMapping=false, ThrowOnUnmappableChar=true, ExactSpelling=false, CharSet=CharSet.Auto, SetLastError=true)]
            internal static extern uint RegOpenKeyEx(SafeRegistryHandle key, string subKey, uint ulOptions, uint samDesired, out SafeRegistryHandle resultSubKey); 
 
            [DllImport(ADVAPI32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern uint RegCloseKey(IntPtr key);

            [DllImport(ADVAPI32, ExactSpelling=true, SetLastError=true)]
            internal static extern uint RegNotifyChangeKeyValue(SafeRegistryHandle key, bool watchSubTree, uint notifyFilter, SafeWaitHandle regEvent, bool async); 

            [DllImport(ADVAPI32, ExactSpelling=true, SetLastError=true)] 
            internal static extern uint RegOpenCurrentUser(uint samDesired, out SafeRegistryHandle resultKey); 

            [DllImport(ADVAPI32, BestFitMapping=false, ThrowOnUnmappableChar=true, ExactSpelling=false, CharSet=CharSet.Auto, SetLastError=true)] 
            internal static extern uint RegQueryValueEx(SafeRegistryHandle key, string valueName, IntPtr reserved, out uint type, [Out] byte[] data, [In][Out] ref uint size);
        }

        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal unsafe class RasHelper
        { 
            private ManualResetEvent m_RasEvent; 
            private bool m_Suppressed;
 
            /* Consider removing
            internal void Close()
            {
                ManualResetEvent rasEvent = m_RasEvent; 
                m_RasEvent = null;
                m_Suppressed = false; 
                if (rasEvent != null) 
                {
                    rasEvent.Close(); 
                }
            }
            */
 
            internal RasHelper()
            { 
                m_RasEvent = new ManualResetEvent(false); 

                // Use -1 as a handle, to receive all RAS notifications for the local machine. 
                uint statusCode = RasConnectionNotification((IntPtr) (-1), m_RasEvent.SafeWaitHandle, RASCN_Connection | RASCN_Disconnection);

                GlobalLog.Print("RasHelper::RasHelper() RasConnectionNotification() statusCode:" + statusCode);
                if (statusCode != 0) 
                {
                    GlobalLog.Print("RasHelper::RasHelper() RasConnectionNotification() Marshal.GetLastWin32Error():" + Marshal.GetLastWin32Error()); 
                    m_Suppressed = true; 
                    m_RasEvent.Close();
                    m_RasEvent = null; 
                }
            }

            internal bool HasChanged 
            {
                get 
                { 
                    if (m_Suppressed)
                    { 
                        return false;
                    }

                    ManualResetEvent rasEvent = m_RasEvent; 
                    if (rasEvent == null)
                    { 
                        throw new ObjectDisposedException(GetType().FullName); 
                    }
                    return rasEvent.WaitOne(0, false); 
                }
            }

            internal void Reset() 
            {
                if (!m_Suppressed) 
                { 
                    ManualResetEvent rasEvent = m_RasEvent;
                    if (rasEvent == null) 
                    {
                        throw new ObjectDisposedException(GetType().FullName);
                    }
                    rasEvent.Reset(); 
                }
            } 
 
            internal static string GetCurrentConnectoid()
            { 
                uint dwSize = (uint) Marshal.SizeOf(typeof(RASCONN));
                GlobalLog.Print("RasHelper::GetCurrentConnectoid() using struct size dwSize:" + dwSize);

                uint count = 4; 
                uint statusCode = 0;
                RASCONN[] connections = null; 
                while (true) 
                {
                    uint cb = checked(dwSize * count); 
                    connections = new RASCONN[count];
                    connections[0].dwSize = dwSize;
                    statusCode = RasEnumConnections(connections, ref cb, ref count);
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() called RasEnumConnections() count:" + count + " statusCode: " + statusCode + " cb:" + cb); 
                    if (statusCode != ERROR_BUFFER_TOO_SMALL)
                    { 
                        break; 
                    }
                    count = checked(cb + dwSize - 1) / dwSize; 
                }

                if (count == 0 || statusCode != 0)
                { 
                    return null;
                } 
 
                for (uint i=0; i < count; i++)
                { 
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "]");
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].dwSize: " + connections[i].dwSize);
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].hrasconn: " + connections[i].hrasconn);
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].szEntryName: " + connections[i].szEntryName); 
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].szDeviceType: " + connections[i].szDeviceType);
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].szDeviceName: " + connections[i].szDeviceName); 
 
                    RASCONNSTATUS connectionStatus = new RASCONNSTATUS();
                    connectionStatus.dwSize = (uint)Marshal.SizeOf(connectionStatus); 
                    // RELIABILITY:
                    // the 'hrasconn' field is an IntPtr because it's defined as a handle
                    // that said, its use is that of a opaque ID, so we're not
                    // allocating anything that needs to be released for reliability. 
                    statusCode = RasGetConnectStatus(connections[i].hrasconn, ref connectionStatus);
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() called RasGetConnectStatus() statusCode: " + statusCode + " dwSize: " + connectionStatus.dwSize); 
                    if (statusCode==0) { 
                        GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].RASCONNSTATUS.dwSize: " + connectionStatus.dwSize);
                        GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].RASCONNSTATUS.rasconnstate: " + connectionStatus.rasconnstate); 
                        GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].RASCONNSTATUS.dwError: " + connectionStatus.dwError);
                        GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].RASCONNSTATUS.szDeviceType: " + connectionStatus.szDeviceType);
                        GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].RASCONNSTATUS.szDeviceName: " + connectionStatus.szDeviceName);
                        if (connectionStatus.rasconnstate==RASCONNSTATE.RASCS_Connected) { 
                            return connections[i].szEntryName;
                        } 
                    } 
                }
 
                return null;
            }

            [DllImport(RASAPI32, ExactSpelling=false, CharSet=CharSet.Auto, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=false)] 
            private static extern uint RasEnumConnections([In, Out] RASCONN[] lprasconn, ref uint lpcb, ref uint lpcConnections);
 
            [DllImport(RASAPI32, ExactSpelling=false, CharSet=CharSet.Auto, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=false)] 
            private static extern uint RasGetConnectStatus([In] IntPtr hrasconn, [In, Out] ref RASCONNSTATUS lprasconnstatus);
 
            [DllImport(RASAPI32, ExactSpelling=false, CharSet=CharSet.Auto, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=false)]
            private static extern uint RasConnectionNotification([In] IntPtr hrasconn, [In] SafeWaitHandle hEvent, uint dwFlags);

            const int RAS_MaxEntryName = 256; 
            const int RAS_MaxDeviceType = 16;
            const int RAS_MaxDeviceName = 128; 
            const int RAS_MaxPhoneNumber = 128; 
            const int RAS_MaxCallbackNumber = 128;
 
            const uint RASCN_Connection = 0x00000001;
            const uint RASCN_Disconnection = 0x00000002;

            const int UNLEN = 256; 
            const int PWLEN = 256;
            const int DNLEN = 15; 
 
            const int MAX_PATH = 260;
 
            const uint RASBASE = 600;
            const uint ERROR_DIAL_ALREADY_IN_PROGRESS = (RASBASE+156);
            const uint ERROR_BUFFER_TOO_SMALL = (RASBASE+3);
 
            [StructLayout(LayoutKind.Sequential, Pack=4, CharSet=CharSet.Auto)]
            struct RASCONN { 
                internal uint dwSize; 
                internal IntPtr hrasconn;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxEntryName + 1)] 
                internal string szEntryName;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxDeviceType + 1)]
                internal string szDeviceType;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxDeviceName + 1)] 
                internal string szDeviceName;
 
/* None of these are supported on Windows 98. 
   MSDN lies twice: there is no dwSessionId at all, and szPhonebook and dwSubEntry are not on Win98.
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_PATH)] 
                internal string szPhonebook;
                internal uint dwSubEntry;
                internal Guid guidEntry;
                internal uint dwFlags; 
                internal ulong luid;
*/ 
            } 

            [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] 
            struct RASCONNSTATUS {
                internal uint dwSize;
                internal RASCONNSTATE rasconnstate;
                internal uint dwError; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxDeviceType + 1)]
                internal string szDeviceType; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxDeviceName + 1)] 
                internal string szDeviceName;
/* Not supported on Windows 98. 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxPhoneNumber + 1)]
                internal string szPhoneNumber;
*/
            } 

            [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] 
            struct RASDIALPARAMS { 
                internal uint dwSize;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxEntryName + 1)] 
                internal string szEntryName;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxPhoneNumber + 1)]
                internal string szPhoneNumber;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxCallbackNumber + 1)] 
                internal string szCallbackNumber;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=UNLEN + 1)] 
                internal string szUserName; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=PWLEN + 1)]
                internal string szPassword; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=DNLEN + 1)]
                internal string szDomain;
/* Not supported on Windows 98.
                internal uint dwSubEntry; 
                internal uint dwCallbackId;
*/ 
            } 

            const int RASCS_PAUSED = 0x1000; 
            const int RASCS_DONE = 0x2000;

            enum RASCONNSTATE {
                RASCS_OpenPort = 0, 
                RASCS_PortOpened,
                RASCS_ConnectDevice, 
                RASCS_DeviceConnected, 
                RASCS_AllDevicesConnected,
                RASCS_Authenticate, 
                RASCS_AuthNotify,
                RASCS_AuthRetry,
                RASCS_AuthCallback,
                RASCS_AuthChangePassword, 
                RASCS_AuthProject,
                RASCS_AuthLinkSpeed, 
                RASCS_AuthAck, 
                RASCS_ReAuthenticate,
                RASCS_Authenticated, 
                RASCS_PrepareForCallback,
                RASCS_WaitForModemReset,
                RASCS_WaitForCallback,
                RASCS_Projected, 
                RASCS_StartAuthentication,    // Windows 95 only
                RASCS_CallbackComplete,       // Windows 95 only 
                RASCS_LogonNetwork,           // Windows 95 only 
                RASCS_SubEntryConnected,
                RASCS_SubEntryDisconnected, 
                RASCS_Interactive = RASCS_PAUSED,
                RASCS_RetryAuthentication,
                RASCS_CallbackSetByCaller,
                RASCS_PasswordExpired, 
                RASCS_InvokeEapUI,
                RASCS_Connected = RASCS_DONE, 
                RASCS_Disconnected 
            }
        } 


        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class SafeNetHandles_SECUR32 { 

            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern int FreeContextBuffer(
                [In] IntPtr contextBuffer); 

            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern int FreeCredentialsHandle( 
                  ref  SSPIHandle handlePtr
                  ); 
 
            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern int DeleteSecurityContext(
                  ref  SSPIHandle handlePtr
                  );
 
            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int AcceptSecurityContext( 
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr, 
                      [In] SecurityBufferDescriptor inputBuffer,
                      [In] ContextFlags     inFlags,
                      [In] Endianness       endianness,
                      ref  SSPIHandle       outContextPtr, 
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes, 
                      out  long timeStamp 
                      );
 
            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal unsafe static extern int QueryContextAttributesA(
                ref SSPIHandle contextHandle, 
                [In] ContextAttribute attribute,
                [In] void* buffer); 
 
            [DllImport(SECUR32, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal unsafe static extern int AcquireCredentialsHandleA( 
                      [In] string principal,
                      [In] string moduleName,
                      [In] int usage,
                      [In] void* logonID, 
                      [In] ref AuthIdentity authdata,
                      [In] void* keyCallback, 
                      [In] void* keyArgument, 
                      ref  SSPIHandle handlePtr,
                      [Out] out long timeStamp 
                      );

            [DllImport(SECUR32, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal unsafe static extern int AcquireCredentialsHandleA( 
                      [In] string principal,
                      [In] string moduleName, 
                      [In] int usage, 
                      [In] void* logonID,
                      [In] IntPtr zero, 
                      [In] void* keyCallback,
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr,
                      [Out] out long timeStamp 
                      );
 
            /* 
            // Consider removing.
            [DllImport(SECUR32, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal unsafe static extern int AcquireCredentialsHandleA(
                      [In] string principal,
                      [In] string moduleName,
                      [In] int usage, 
                      [In] void* logonID,
                      [In] ref SecureCredential authData, 
                      [In] void* keyCallback, 
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr, 
                      [Out] out long timeStamp
                      );
            */
 
            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int InitializeSecurityContextA( 
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr, 
                      [In] byte*            targetName,
                      [In] ContextFlags     inFlags,
                      [In] int              reservedI,
                      [In] Endianness       endianness, 
                      [In] SecurityBufferDescriptor inputBuffer,
                      [In] int              reservedII, 
                      ref  SSPIHandle       outContextPtr, 
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes, 
                      out  long timeStamp
                      );

            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)] 
            internal static extern int EnumerateSecurityPackagesA(
                [Out] out int pkgnum, 
                [Out] out SafeFreeContextBuffer_SECUR32 handle); 

        } 

        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class SafeNetHandles_SECURITY {
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern int FreeContextBuffer( 
                [In] IntPtr contextBuffer);
 

            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern int FreeCredentialsHandle( 
                  ref  SSPIHandle handlePtr
                  ); 
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern int DeleteSecurityContext(
                  ref  SSPIHandle handlePtr
                  );
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int AcceptSecurityContext( 
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr, 
                      [In] SecurityBufferDescriptor inputBuffer,
                      [In] ContextFlags     inFlags,
                      [In] Endianness       endianness,
                      ref  SSPIHandle       outContextPtr, 
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes, 
                      out  long timeStamp 
                      );
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal unsafe static extern int QueryContextAttributesW(
                ref SSPIHandle contextHandle, 
                [In] ContextAttribute attribute,
                [In] void* buffer); 
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            internal static extern int EnumerateSecurityPackagesW( 
                [Out] out int pkgnum,
                [Out] out SafeFreeContextBuffer_SECURITY handle);

            [DllImport(SECURITY, ExactSpelling=true, CharSet=CharSet.Unicode, SetLastError=true)] 
            internal unsafe static extern int AcquireCredentialsHandleW(
                      [In] string principal, 
                      [In] string moduleName, 
                      [In] int usage,
                      [In] void* logonID, 
                      [In] ref AuthIdentity authdata,
                      [In] void* keyCallback,
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr, 
                      [Out] out long timeStamp
                      ); 
 
            [DllImport(SECURITY, ExactSpelling=true, CharSet=CharSet.Unicode, SetLastError=true)]
            internal unsafe static extern int AcquireCredentialsHandleW( 
                      [In] string principal,
                      [In] string moduleName,
                      [In] int usage,
                      [In] void* logonID, 
                      [In] IntPtr zero,
                      [In] void* keyCallback, 
                      [In] void* keyArgument, 
                      ref  SSPIHandle handlePtr,
                      [Out] out long timeStamp 
                      );

            [DllImport(SECURITY, ExactSpelling=true, CharSet=CharSet.Unicode, SetLastError=true)]
            internal unsafe  static extern int AcquireCredentialsHandleW( 
                      [In] string principal,
                      [In] string moduleName, 
                      [In] int usage, 
                      [In] void* logonID,
                      [In] ref SecureCredential authData, 
                      [In] void* keyCallback,
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr,
                      [Out] out long timeStamp 
                      );
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal unsafe static extern int InitializeSecurityContextW( 
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr,
                      [In] byte*            targetName,
                      [In] ContextFlags     inFlags, 
                      [In] int              reservedI,
                      [In] Endianness       endianness, 
                      [In] SecurityBufferDescriptor inputBuffer, 
                      [In] int              reservedII,
                      ref  SSPIHandle       outContextPtr, 
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes,
                      out  long timeStamp
                      ); 

            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int CompleteAuthToken(
                      [In] void*            inContextPtr, 
                      [In, Out] SecurityBufferDescriptor inputBuffers
                      );

        } 

        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal static class SafeNetHandles_SCHANNEL { 

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern int FreeContextBuffer(
                [In] IntPtr contextBuffer);
 

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int QueryContextAttributesA(
                ref SSPIHandle contextHandle, 
                [In] ContextAttribute attribute,
                [In] void* buffer);

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)] 
            internal static extern int EnumerateSecurityPackagesA(
                [Out] out int pkgnum, 
                [Out] out SafeFreeContextBuffer_SCHANNEL handle); 

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal unsafe static extern int InitializeSecurityContextA(
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr, 
                      [In] byte*            targetName,
                      [In] ContextFlags     inFlags, 
                      [In] int              reservedI, 
                      [In] Endianness       endianness,
                      [In] SecurityBufferDescriptor inputBuffer, 
                      [In] int              reservedII,
                      ref  SSPIHandle       outContextPtr,
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes, 
                      out  long timeStamp
                      ); 
 
            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int AcceptSecurityContext(
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr,
                      [In] SecurityBufferDescriptor inputBuffer, 
                      [In] ContextFlags     inFlags,
                      [In] Endianness       endianness, 
                      ref  SSPIHandle       outContextPtr, 
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes, 
                      out  long timeStamp
                      );

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern int DeleteSecurityContext( 
                  ref  SSPIHandle handlePtr 
                  );
 

            /*
            // Consider removing.
            [DllImport(SCHANNEL, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal unsafe static extern int AcquireCredentialsHandleA(
                      [In] string principal, 
                      [In] string moduleName, 
                      [In] int usage,
                      [In] void* logonID, 
                      [In] ref AuthIdentity authdata,
                      [In] void* keyCallback,
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr, 
                      [Out] out long timeStamp
                      ); 
            */ 

            /* 
            // Consider removing.
            [DllImport(SCHANNEL, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal unsafe static extern int AcquireCredentialsHandleA(
                      [In] string principal, 
                      [In] string moduleName,
                      [In] int usage, 
                      [In] void* logonID, 
                      [In] IntPtr zero,
                      [In] void* keyCallback, 
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr,
                      [Out] out long timeStamp
                      ); 
            */
 
            [DllImport(SCHANNEL, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal unsafe static extern int AcquireCredentialsHandleA(
                      [In] string principal, 
                      [In] string moduleName,
                      [In] int usage,
                      [In] void* logonID,
                      [In] ref SecureCredential authData, 
                      [In] void* keyCallback,
                      [In] void* keyArgument, 
                      ref  SSPIHandle handlePtr, 
                      [Out] out long timeStamp
                      ); 

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern int FreeCredentialsHandle( 
                  ref  SSPIHandle handlePtr
                  ); 
 
        }
 
#endif // !FEATURE_PAL

        // Because the regular SafeNetHandles has a LocalAlloc with a different return type.
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal static class SafeNetHandlesSafeOverlappedFree {
            [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)] 
            internal static extern SafeOverlappedFree LocalAlloc(int uFlags, UIntPtr sizetdwBytes); 
        }
 
#if !FEATURE_PAL
        // Because the regular SafeNetHandles tries to bind this MustRun method on type initialization, failing
        // on legacy platforms.
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal static class SafeNetHandlesXPOrLater {
            [DllImport(WS2_32, ExactSpelling = true, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true, SetLastError = true)] 
            internal static extern int getaddrinfo( 
                [In] string nodename,
                [In] string servicename, 
                [In] ref AddressInfo hints,
                [Out] out SafeFreeAddrInfo handle
                );
 
            [DllImport(WS2_32, ExactSpelling = true, SetLastError = true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern void freeaddrinfo([In] IntPtr info ); 
        }
#endif 

        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class SafeNetHandles {
 
    #if !FEATURE_PAL
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)] 
            internal static extern int QuerySecurityContextToken(ref SSPIHandle phContext, [Out] out SafeCloseHandle handle); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern unsafe uint HttpCreateHttpHandle(out SafeCloseHandle pReqQueueHandle, uint options);
    #endif

            [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern bool CloseHandle(IntPtr handle); 
 
            [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)]
            internal static extern SafeLocalFree LocalAlloc(int uFlags, UIntPtr sizetdwBytes); 

            [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern IntPtr LocalFree(IntPtr handle); 

#if !FEATURE_PAL 
            [DllImport(KERNEL32, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal static extern unsafe SafeLoadLibrary LoadLibraryExA([In] string lpwLibFileName, [In] void* hFile, [In] uint dwFlags);
 
            [DllImport(KERNEL32, ExactSpelling=true, CharSet=CharSet.Unicode, SetLastError=true)]
            internal static extern unsafe SafeLoadLibrary LoadLibraryExW([In] string lpwLibFileName, [In] void* hFile, [In] uint dwFlags);
#endif // !FEATURE_PAL
 

            [DllImport(KERNEL32, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern unsafe bool FreeLibrary([In] IntPtr hModule);
 
#if !FEATURE_PAL

            /*
            // Consider removing. 
            [DllImport(CRYPT32, ExactSpelling=true, SetLastError=true)]
            internal static extern  bool CertGetCertificateChain( 
                [In] IntPtr                 chainEngine, 
                [In] SafeFreeCertContext    certContext,
                [In] IntPtr                 time, 
                [In] SafeCloseStore         additionalStore,
                [In] ref ChainParameters    certCP,
                [In] int                    flags,
                [In] IntPtr                 reserved, 
                [Out] out SafeFreeCertChain  chainContext);
            */ 
 
            [DllImport(CRYPT32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern void CertFreeCertificateChain(
                [In] IntPtr pChainContext);

            [DllImport(CRYPT32, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern bool CertFreeCertificateContext(      // Suppressing returned status check, it's always==TRUE, 
                [In] IntPtr certContext); 

            /* 
            // Consider removing.
            [DllImport(CRYPT32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern bool CertCloseStore( 
                [In] IntPtr hCertStore,
                [In] int dwFlags); 
            */ 

#endif // !FEATURE_PAL 

            [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern IntPtr GlobalFree(IntPtr handle); 

            // Blocking call - requires IntPtr instead of SafeCloseSocket. 
            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)] 
            internal static extern SafeCloseSocket.InnerSafeCloseSocket accept(
                                                  [In] IntPtr socketHandle, 
                                                  [Out] byte[] socketAddress,
                                                  [In, Out] ref int socketAddressSize
                                                  );
 
            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern SocketError closesocket( 
                                                  [In] IntPtr socketHandle
                                                  ); 

            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern SocketError ioctlsocket( 
                                                [In] IntPtr handle,
                                                [In] int cmd, 
                                                [In, Out] ref int argp 
                                                );
 
            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern SocketError WSAEventSelect(
                                                     [In] IntPtr handle, 
                                                     [In] IntPtr Event,
                                                     [In] AsyncEventBits NetworkEvents 
                                                     ); 

            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern SocketError setsockopt(
                                               [In] IntPtr handle,
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName,
                                               [In] ref Linger linger, 
                                               [In] int optionLength 
                                               );
 
            /* Consider removing
            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern SocketError setsockopt( 
                                               [In] IntPtr handle,
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName, 
                                               [In] ref int optionValue,
                                               [In] int optionLength 
                                               );
            */

#if !FEATURE_PAL 
            [DllImport(WININET, ExactSpelling=true, SetLastError = true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            unsafe internal static extern bool RetrieveUrlCacheEntryFileW( 
                                            [In]      char*     urlName,
                                            [In]      byte*     entryPtr,               //was [Out] 
                                            [In, Out] ref int   entryBufSize,
                                            [In]      int       dwReserved              //must be 0
                                            );
 
            [DllImport(WININET, ExactSpelling=true, SetLastError = true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            unsafe internal static extern bool UnlockUrlCacheEntryFileW( 
                                            [In]    char*       urlName,
                                            [In]    int         dwReserved                  //must be 0 
                                            );
#endif // !FEATURE_PAL
        }
 
        //
        // UnsafeNclNativeMethods.OSSOCK class contains all Unsafe() calls and should all be protected 
        // by the appropriate SocketPermission() to connect/accept to/from remote 
        // peers over the network and to perform name resolution.
        // te following calls deal mainly with: 
        // 1) socket calls
        // 2) DNS calls
        //
 
        //
        // here's a brief explanation of all possible decorations we use for PInvoke. 
        // these are used in such a way that we hope to gain maximum performance from the 
        // unmanaged/managed/unmanaged transition we need to undergo when calling into winsock:
        // 
        // [In] (Note: this is similar to what msdn will show)
        // the managed data will be marshalled so that the unmanaged function can read it but even
        // if it is changed in unmanaged world, the changes won't be propagated to the managed data
        // 
        // [Out] (Note: this is similar to what msdn will show)
        // the managed data will not be marshalled so that the unmanaged function will not see the 
        // managed data, if the data changes in unmanaged world, these changes will be propagated by 
        // the marshaller to the managed data
        // 
        // objects are marshalled differently if they're:
        //
        // 1) structs
        // for structs, by default, the whole layout is pushed on the stack as it is. 
        // in order to pass a pointer to the managed layout, we need to specify either the ref or out keyword.
        // 
        //      a) for IN and OUT: 
        //      [In, Out] ref Struct ([In, Out] is optional here)
        // 
        //      b) for IN only (the managed data will be marshalled so that the unmanaged
        //      function can read it but even if it changes it the change won't be propagated
        //      to the managed struct)
        //      [In] ref Struct 
        //
        //      c) for OUT only (the managed data will not be marshalled so that the 
        //      unmanaged function cannot read, the changes done in unmanaged code will be 
        //      propagated to the managed struct)
        //      [Out] out Struct ([Out] is optional here) 
        //
        // 2) array or classes
        // for array or classes, by default, a pointer to the managed layout is passed.
        // we don't need to specify neither the ref nor the out keyword. 
        //
        //      a) for IN and OUT: 
        //      [In, Out] byte[] 
        //
        //      b) for IN only (the managed data will be marshalled so that the unmanaged 
        //      function can read it but even if it changes it the change won't be propagated
        //      to the managed struct)
        //      [In] byte[] ([In] is optional here)
        // 
        //      c) for OUT only (the managed data will not be marshalled so that the
        //      unmanaged function cannot read, the changes done in unmanaged code will be 
        //      propagated to the managed struct) 
        //      [Out] byte[]
        // 
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class OSSOCK {

#if FEATURE_PAL 
            private const string WS2_32 = ROTOR_PAL;
#else 
            private const string WS2_32 = "ws2_32.dll"; 
            private const string mswsock = "mswsock.dll";
#endif 

            //
            // IPv6 Changes: These are initialized in InitializeSockets - don't set them here or
            //               there will be an ordering problem with the call above that will 
            //               result in both being set to false !
            // 
 
            [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
            internal struct WSAPROTOCOLCHAIN { 
                internal int ChainLen;                                 /* the length of the chain,     */
                [MarshalAs(UnmanagedType.ByValArray, SizeConst=7)]
                internal uint[] ChainEntries;       /* a list of dwCatalogEntryIds */
            } 

            [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] 
            internal struct WSAPROTOCOL_INFO { 
                internal uint dwServiceFlags1;
                internal uint dwServiceFlags2; 
                internal uint dwServiceFlags3;
                internal uint dwServiceFlags4;
                internal uint dwProviderFlags;
                Guid ProviderId; 
                internal uint dwCatalogEntryId;
                WSAPROTOCOLCHAIN ProtocolChain; 
                internal int iVersion; 
                internal AddressFamily iAddressFamily;
                internal int iMaxSockAddr; 
                internal int iMinSockAddr;
                internal int iSocketType;
                internal int iProtocol;
                internal int iProtocolMaxOffset; 
                internal int iNetworkByteOrder;
                internal int iSecurityScheme; 
                internal uint dwMessageSize; 
                internal uint dwProviderReserved;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] 
                internal string szProtocol;
            }

            [StructLayout(LayoutKind.Sequential)] 
            internal struct ControlData {
                internal UIntPtr length; 
                internal uint level; 
                internal uint type;
                internal uint address; 
                internal uint index;
            }

            [StructLayout(LayoutKind.Sequential)] 
            internal struct ControlDataIPv6 {
                internal UIntPtr length; 
                internal uint level; 
                internal uint type;
                [MarshalAs(UnmanagedType.ByValArray,SizeConst=16)] 
                internal byte[] address;
                internal uint index;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct WSAMsg { 
                internal IntPtr socketAddress; 
                internal uint addressLength;
                internal IntPtr buffers; 
                internal uint count;
                internal WSABuffer controlBuffer;
                internal SocketFlags flags;
            } 

            // 
            // Flags equivalent to winsock TRANSMIT_PACKETS_ELEMENT flags 
            //    #define TP_ELEMENT_MEMORY   1
            //    #define TP_ELEMENT_FILE     2 
            //    #define TP_ELEMENT_EOP      4
            //
            [Flags]
            internal enum TransmitPacketsElementFlags : uint { 
                None = 0x00,
                Memory = 0x01, 
                File = 0x02, 
                EndOfPacket = 0x04
            } 

            // Structure equivalent to TRANSMIT_PACKETS_ELEMENT
            //
            // typedef struct _TRANSMIT_PACKETS_ELEMENT { 
            //     ULONG dwElFlags;
            //     ULONG cLength; 
            //     union { 
            //         struct {
            //             LARGE_INTEGER nFileOffset; 
            //             HANDLE hFile;
            //         };
            //         PVOID pBuffer;
            //     } 
            //  };
            // } TRANSMIT_PACKETS_ELEMENT; 
            // 
            [StructLayout(LayoutKind.Explicit)]
            internal struct TransmitPacketsElement { 
                [System.Runtime.InteropServices.FieldOffset(0)]
                internal TransmitPacketsElementFlags flags;
                [System.Runtime.InteropServices.FieldOffset(4)]
                internal uint length; 
                [System.Runtime.InteropServices.FieldOffset(8)]
                internal Int64 fileOffset; 
                [System.Runtime.InteropServices.FieldOffset(8)] 
                internal IntPtr buffer;
                [System.Runtime.InteropServices.FieldOffset(16)] 
                internal IntPtr fileHandle;
            }

            /* 
               typedef struct _SOCKET_ADDRESS {
                   PSOCKADDR lpSockaddr; 
                   INT iSockaddrLength; 
               } SOCKET_ADDRESS, *PSOCKET_ADDRESS;			
            */ 
            [StructLayout(LayoutKind.Sequential)]
            internal struct SOCKET_ADDRESS {
                internal IntPtr lpSockAddr;
                internal int iSockaddrLength; 
            }
 
            /* 
               typedef struct _SOCKET_ADDRESS_LIST {
                   INT             iAddressCount; 
                   SOCKET_ADDRESS  Address[1];
               } SOCKET_ADDRESS_LIST, *PSOCKET_ADDRESS_LIST, FAR *LPSOCKET_ADDRESS_LIST;
            */
            [StructLayout(LayoutKind.Sequential)] 
            internal struct SOCKET_ADDRESS_LIST {
                internal int iAddressCount; 
                internal SOCKET_ADDRESS Addresses; 
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct TransmitFileBuffersStruct {
                internal IntPtr preBuffer;// Pointer to Buffer
                internal int preBufferLength; // Length of Buffer 
                internal IntPtr postBuffer;// Pointer to Buffer
                internal int postBufferLength; // Length of Buffer 
            } 

            // CharSet=Auto here since WSASocket has A and W versions. We can use Auto cause the method is not used under constrained execution region 
            [DllImport(WS2_32, CharSet=CharSet.Auto, SetLastError=true)]
            internal static extern SafeCloseSocket.InnerSafeCloseSocket WSASocket(
                                                    [In] AddressFamily addressFamily,
                                                    [In] SocketType socketType, 
                                                    [In] ProtocolType protocolType,
                                                    [In] IntPtr protocolInfo, // will be WSAProtcolInfo protocolInfo once we include QOS APIs 
                                                    [In] uint group, 
                                                    [In] SocketConstructorFlags flags
                                                    ); 

            [DllImport(WS2_32, CharSet=CharSet.Auto, SetLastError=true)]
            internal unsafe static extern SafeCloseSocket.InnerSafeCloseSocket WSASocket(
                                        [In] AddressFamily addressFamily, 
                                        [In] SocketType socketType,
                                        [In] ProtocolType protocolType, 
                                        [In] byte* pinnedBuffer, // will be WSAProtcolInfo protocolInfo once we include QOS APIs 
                                        [In] uint group,
                                        [In] SocketConstructorFlags flags 
                                        );


            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal static extern SocketError WSAStartup(
                                               [In] short wVersionRequested, 
                                               [Out] out WSAData lpWSAData 
                                               );
 
            [DllImport(WS2_32, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal static extern SocketError ioctlsocket(
                                                [In] SafeCloseSocket socketHandle, 
                                                [In] int cmd,
                                                [In, Out] ref int argp 
                                                ); 

            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal static extern IntPtr gethostbyname(
                                                  [In] string host
                                                  );
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern IntPtr gethostbyaddr( 
                                                  [In] ref int addr, 
                                                  [In] int len,
                                                  [In] ProtocolFamily type 
                                                  );

            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal static extern SocketError gethostname( 
                                                [Out] StringBuilder hostName,
                                                [In] int bufferLength 
                                                ); 

            // this should belong to SafeNativeMethods, but it will not for simplicity 
            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal static extern int inet_addr(
                                              [In] string cp
                                              ); 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getpeername( 
                                                [In] SafeCloseSocket socketHandle,
                                                [Out] byte[] socketAddress, 
                                                [In, Out] ref int socketAddressSize
                                                );

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName,
                                               [Out] out int optionValue, 
                                               [In, Out] ref int optionLength
                                               );

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName,
                                               [Out] byte[] optionValue, 
                                               [In, Out] ref int optionLength
                                               );

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName,
                                               [Out] out Linger optionValue, 
                                               [In, Out] ref int optionLength
                                               );

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName,
                                               [Out] out IPMulticastRequest optionValue, 
                                               [In, Out] ref int optionLength
                                               );

            // 
            // IPv6 Changes: need to receive and IPv6MulticastRequest from getsockopt
            // 
            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [Out] out IPv6MulticastRequest optionValue,
                                               [In, Out] ref int optionLength 
                                               );
 
            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError setsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [In] ref int optionValue,
                                               [In] int optionLength 
                                               );
 
            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError setsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [In] byte[] optionValue,
                                               [In] int optionLength 
                                               );
 
            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError setsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [In] ref IntPtr pointer,
                                               [In] int optionLength 
                                               );
 
            [DllImport(WS2_32, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal static extern SocketError setsockopt( 
                                               [In] SafeCloseSocket socketHandle,
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [In] ref Linger linger, 
                                               [In] int optionLength
                                               ); 
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError setsockopt( 
                                               [In] SafeCloseSocket socketHandle,
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [In] ref IPMulticastRequest mreq, 
                                               [In] int optionLength
                                               ); 
 
            //
            // IPv6 Changes: need to pass an IPv6MulticastRequest to setsockopt 
            //
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError setsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName, 
                                               [In] ref IPv6MulticastRequest mreq, 
                                               [In] int optionLength
                                               ); 

#if !FEATURE_PAL
            [DllImport(mswsock, SetLastError=true)]
            internal static extern bool AcceptEx( 
                                      [In] SafeCloseSocket listenSocketHandle,
                                      [In] SafeCloseSocket acceptSocketHandle, 
                                      [In] IntPtr      buffer, 
                                      [In] int         len,
                                      [In] int localAddressLength, 
                                      [In] int remoteAddressLength,
                                      [Out] out int bytesReceived,
                                      [In] IntPtr overlapped
                                      ); 

            [DllImport(mswsock, SetLastError=true)] 
            internal static extern bool TransmitFile( 
                                      [In] SafeCloseSocket socket,
                                      [In] SafeHandle fileHandle, 
                                      [In] int numberOfBytesToWrite,
                                      [In] int numberOfBytesPerSend,
                                      [In] IntPtr overlapped,
                                      [In] TransmitFileBuffers buffers, 
                                      [In] TransmitFileOptions flags
                                      ); 
 
            [DllImport(mswsock, SetLastError = true)]
            internal static extern bool TransmitFile( 
                                      [In] SafeCloseSocket socket,
                                      [In] SafeHandle fileHandle,
                                      [In] int numberOfBytesToWrite,
                                      [In] int numberOfBytesPerSend, 
                                      [In] IntPtr overlapped,
                                      [In] IntPtr buffers, 
                                      [In] TransmitFileOptions flags 
                                      );
 
            [DllImport(mswsock, SetLastError = true)]
            internal static extern bool TransmitFile(
                                      [In] SafeCloseSocket socket,
                                      [In] IntPtr fileHandle, 
                                      [In] int numberOfBytesToWrite,
                                      [In] int numberOfBytesPerSend, 
                                      [In] IntPtr overlapped, 
                                      [In] IntPtr buffers,
                                      [In] TransmitFileOptions flags 
                                      );

            [DllImport(mswsock, SetLastError=true, EntryPoint = "TransmitFile")]
            internal static extern bool TransmitFile2( 
                                      [In] SafeCloseSocket socket,
                                      [In] IntPtr fileHandle, 
                                      [In] int numberOfBytesToWrite, 
                                      [In] int numberOfBytesPerSend,
                                      [In] IntPtr overlapped, 
                                      [In] TransmitFileBuffers buffers,
                                      [In] TransmitFileOptions flags
                                      );
 

            [DllImport(mswsock, SetLastError = true, EntryPoint = "TransmitFile")] 
            internal static extern bool TransmitFile_Blocking( 
                                      [In] IntPtr socket,
                                      [In] SafeHandle fileHandle, 
                                      [In] int numberOfBytesToWrite,
                                      [In] int numberOfBytesPerSend,
                                      [In] IntPtr overlapped,
                                      [In] TransmitFileBuffers buffers, 
                                      [In] TransmitFileOptions flags
                                      ); 
 
            [DllImport(mswsock, SetLastError = true, EntryPoint = "TransmitFile")]
            internal static extern bool TransmitFile_Blocking2( 
                                      [In] IntPtr socket,
                                      [In] IntPtr fileHandle,
                                      [In] int numberOfBytesToWrite,
                                      [In] int numberOfBytesPerSend, 
                                      [In] IntPtr overlapped,
                                      [In] TransmitFileBuffers buffers, 
                                      [In] TransmitFileOptions flags 
                                      );
 
            [DllImport(mswsock, SetLastError = true)]
            internal static extern void GetAcceptExSockaddrs(
                                    [In] IntPtr       buffer,
                                    [In] int receiveDataLength, 
                                    [In] int localAddressLength,
                                    [In] int remoteAddressLength, 
                                    [Out] out IntPtr localSocketAddress, 
                                    [Out] out int localSocketAddressLength,
                                    [Out] out IntPtr remoteSocketAddress, 
                                    [Out] out int remoteSocketAddressLength
                                    );

#endif // !FEATURE_PAL 

            // This method is always blocking, so it uses an IntPtr. 
            [DllImport(WS2_32, SetLastError = true)] 
            internal unsafe static extern int send(
                                         [In] IntPtr      socketHandle, 
                                         [In] byte*       pinnedBuffer,
                                         [In] int         len,
                                         [In] SocketFlags socketFlags
                                         ); 

            // This method is always blocking, so it uses an IntPtr. 
            [DllImport(WS2_32, SetLastError = true)] 
            internal unsafe static extern int recv(
                                         [In] IntPtr      socketHandle, 
                                         [In] byte*       pinnedBuffer,
                                         [In] int         len,
                                         [In] SocketFlags socketFlags
                                         ); 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError listen( 
                                           [In] SafeCloseSocket socketHandle,
                                           [In] int backlog 
                                           );

            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError bind( 
                                         [In] SafeCloseSocket socketHandle,
                                         [In] byte[] socketAddress, 
                                         [In] int socketAddressSize 
                                         );
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError shutdown(
                                             [In] SafeCloseSocket socketHandle,
                                             [In] int how 
                                             );
 
            // This method is always blocking, so it uses an IntPtr. 
            [DllImport(WS2_32, SetLastError = true)]
            internal unsafe static extern int sendto( 
                                           [In] IntPtr      socketHandle,
                                           [In] byte*       pinnedBuffer,
                                           [In] int         len,
                                           [In] SocketFlags socketFlags, 
                                           [In] byte[]      socketAddress,
                                           [In] int         socketAddressSize 
                                           ); 

            // This method is always blocking, so it uses an IntPtr. 
            [DllImport(WS2_32, SetLastError = true)]
            internal unsafe static extern int recvfrom(
                                             [In] IntPtr        socketHandle,
                                             [In] byte*         pinnedBuffer, 
                                             [In] int           len,
                                             [In] SocketFlags   socketFlags, 
                                             [Out] byte[]       socketAddress, 
                                             [In, Out] ref int  socketAddressSize
                                             ); 

            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError getsockname(
                                                [In] SafeCloseSocket socketHandle, 
                                                [Out] byte[] socketAddress,
                                                [In, Out] ref int socketAddressSize 
                                                ); 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern int select(
                                           [In] int ignoredParameter,
                                           [In, Out] IntPtr[] readfds,
                                           [In, Out] IntPtr[] writefds, 
                                           [In, Out] IntPtr[] exceptfds,
                                           [In] ref TimeValue timeout 
                                           ); 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern int select(
                                           [In] int ignoredParameter,
                                           [In, Out] IntPtr[] readfds,
                                           [In, Out] IntPtr[] writefds, 
                                           [In, Out] IntPtr[] exceptfds,
                                           [In] IntPtr nullTimeout 
                                           ); 

            // This function is always potentially blocking so it uses an IntPtr. 
            [DllImport(WS2_32, SetLastError = true)]
            internal static extern SocketError WSAConnect(
                                              [In] IntPtr socketHandle,
                                              [In] byte[] socketAddress, 
                                              [In] int    socketAddressSize,
                                              [In] IntPtr inBuffer, 
                                              [In] IntPtr outBuffer, 
                                              [In] IntPtr sQOS,
                                              [In] IntPtr gQOS 
                                              );


            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError WSASend(
                                              [In] SafeCloseSocket socketHandle, 
                                              [In] ref WSABuffer buffer, 
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred, 
                                              [In] SocketFlags socketFlags,
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine
                                              ); 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError WSASend( 
                                              [In] SafeCloseSocket socketHandle,
                                              [In] WSABuffer[] buffersArray, 
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred,
                                              [In] SocketFlags socketFlags,
                                              [In] IntPtr overlapped, 
                                              [In] IntPtr completionRoutine
                                              ); 
 
            [DllImport(WS2_32, SetLastError = true)]
            internal static extern SocketError WSASend( 
                                              [In] SafeCloseSocket socketHandle,
                                              [In] IntPtr buffers,
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred, 
                                              [In] SocketFlags socketFlags,
                                              [In] IntPtr overlapped, 
                                              [In] IntPtr completionRoutine 
                                              );
            /* Consider removing 
            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSASend")]
            internal static extern SocketError WSASend_Blocking(
                                              [In] IntPtr socketHandle,
                                              [In] ref WSABuffer buffer, 
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred, 
                                              [In] SocketFlags socketFlags, 
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine 
                                              );
            */

            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSASend")] 
            internal static extern SocketError WSASend_Blocking(
                                              [In] IntPtr socketHandle, 
                                              [In] WSABuffer[] buffersArray, 
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred, 
                                              [In] SocketFlags socketFlags,
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine
                                              ); 

            [DllImport(WS2_32, SetLastError = true)] 
            internal static extern SocketError WSASendTo( 
                                                [In] SafeCloseSocket socketHandle,
                                                [In] ref WSABuffer buffer, 
                                                [In] int bufferCount,
                                                [Out] out int bytesTransferred,
                                                [In] SocketFlags socketFlags,
                                                [In] IntPtr socketAddress, 
                                                [In] int socketAddressSize,
                                                [In] IntPtr overlapped, 
                                                [In] IntPtr completionRoutine 
                                                );
 
            [DllImport(WS2_32, SetLastError = true)]
            internal static extern SocketError WSASendTo(
                                                [In] SafeCloseSocket socketHandle,
                                                [In] WSABuffer[] buffersArray, 
                                                [In] int bufferCount,
                                                [Out] out int bytesTransferred, 
                                                [In] SocketFlags socketFlags, 
                                                [In] IntPtr socketAddress,
                                                [In] int socketAddressSize, 
                                                [In] IntPtr overlapped,
                                                [In] IntPtr completionRoutine
                                                );
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError WSARecv( 
                                              [In] SafeCloseSocket socketHandle, 
                                              [In, Out] ref WSABuffer buffer,
                                              [In] int bufferCount, 
                                              [Out] out int bytesTransferred,
                                              [In, Out] ref SocketFlags socketFlags,
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine 
                                              );
 
            [DllImport(WS2_32, SetLastError = true)] 
            internal static extern SocketError WSARecv(
                                              [In] SafeCloseSocket socketHandle, 
                                              [In, Out] WSABuffer[] buffers,
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred,
                                              [In, Out] ref SocketFlags socketFlags, 
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine 
                                              ); 

            [DllImport(WS2_32, SetLastError = true)] 
            internal static extern SocketError WSARecv(
                                              [In] SafeCloseSocket socketHandle,
                                              [In] IntPtr buffers,
                                              [In] int bufferCount, 
                                              [Out] out int bytesTransferred,
                                              [In, Out] ref SocketFlags socketFlags, 
                                              [In] IntPtr overlapped, 
                                              [In] IntPtr completionRoutine
                                              ); 

            /* Consider removing
            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSARecv")]
            internal static extern SocketError WSARecv_Blocking( 
                                              [In] IntPtr socketHandle,
                                              [In, Out] ref WSABuffer buffer, 
                                              [In] int bufferCount, 
                                              [Out] out int bytesTransferred,
                                              [In, Out] ref SocketFlags socketFlags, 
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine
                                              );
            */ 

            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSARecv")] 
            internal static extern SocketError WSARecv_Blocking( 
                                              [In] IntPtr socketHandle,
                                              [In, Out] WSABuffer[] buffers, 
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred,
                                              [In, Out] ref SocketFlags socketFlags,
                                              [In] IntPtr overlapped, 
                                              [In] IntPtr completionRoutine
                                              ); 
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError WSARecvFrom( 
                                                  [In] SafeCloseSocket socketHandle,
                                                  [In, Out] ref WSABuffer buffer,
                                                  [In] int bufferCount,
                                                  [Out] out int bytesTransferred, 
                                                  [In, Out] ref SocketFlags socketFlags,
                                                  [In] IntPtr socketAddressPointer, 
                                                  [In] IntPtr socketAddressSizePointer, 
                                                  [In] IntPtr overlapped,
                                                  [In] IntPtr completionRoutine 
                                                  );

            [DllImport(WS2_32, SetLastError = true)]
            internal static extern SocketError WSARecvFrom( 
                                                  [In] SafeCloseSocket socketHandle,
                                                  [In, Out] WSABuffer[] buffers, 
                                                  [In] int bufferCount, 
                                                  [Out] out int bytesTransferred,
                                                  [In, Out] ref SocketFlags socketFlags, 
                                                  [In] IntPtr socketAddressPointer,
                                                  [In] IntPtr socketAddressSizePointer,
                                                  [In] IntPtr overlapped,
                                                  [In] IntPtr completionRoutine 
                                                  );
 
            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError WSAEventSelect(
                                                     [In] SafeCloseSocket socketHandle, 
                                                     [In] SafeHandle Event,
                                                     [In] AsyncEventBits NetworkEvents
                                                     );
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError WSAEventSelect( 
                                         [In] SafeCloseSocket socketHandle, 
                                         [In] IntPtr Event,
                                         [In] AsyncEventBits NetworkEvents 
                                         );


            // Used with SIOGETEXTENSIONFUNCTIONPOINTER - we're assuming that will never block. 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError WSAIoctl( 
                                                [In] SafeCloseSocket socketHandle, 
                                                [In] int ioControlCode,
                                                [In,Out] ref Guid guid, 
                                                [In] int guidSize,
                                                [Out] out IntPtr funcPtr,
                                                [In]  int funcPtrSize,
                                                [Out] out int bytesTransferred, 
                                                [In] IntPtr shouldBeNull,
                                                [In] IntPtr shouldBeNull2 
                                                ); 

            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSAIoctl")] 
            internal static extern SocketError WSAIoctl_Blocking(
                                                [In] IntPtr socketHandle,
                                                [In] int ioControlCode,
                                                [In] byte[] inBuffer, 
                                                [In] int inBufferSize,
                                                [Out] byte[] outBuffer, 
                                                [In] int outBufferSize, 
                                                [Out] out int bytesTransferred,
                                                [In] IntPtr overlapped, 
                                                [In] IntPtr completionRoutine
                                                );

            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSAIoctl")] 
            internal static extern SocketError WSAIoctl_Blocking_Internal(
                                                [In]  IntPtr socketHandle, 
                                                [In]  uint ioControlCode, 
                                                [In]  IntPtr inBuffer,
                                                [In]  int inBufferSize, 
                                                [Out] IntPtr outBuffer,
                                                [In]  int outBufferSize,
                                                [Out] out int bytesTransferred,
                                                [In]  IntPtr overlapped, 
                                                [In]  IntPtr completionRoutine
                                                );			 
 
            [DllImport(WS2_32,SetLastError=true)]
            internal static extern SocketError WSAEnumNetworkEvents( 
                                                     [In] SafeCloseSocket socketHandle,
                                                     [In] SafeWaitHandle Event,
                                                     [In, Out] ref NetworkEvents networkEvents
                                                     ); 

#if !FEATURE_PAL 
            [DllImport(WS2_32, SetLastError=true)] 
            internal unsafe static extern int WSADuplicateSocket(
                [In] SafeCloseSocket socketHandle, 
                [In] uint targetProcessID,
                [In] byte* pinnedBuffer
            );
#endif // !FEATURE_PAL 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern bool WSAGetOverlappedResult( 
                                                     [In] SafeCloseSocket socketHandle,
                                                     [In] IntPtr overlapped, 
                                                     [Out] out uint bytesTransferred,
                                                     [In] bool wait,
                                                     [Out] out SocketFlags socketFlags
                                                     ); 
#if !FEATURE_PAL
            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal static extern SocketError WSAStringToAddress( 
                [In] string addressString,
                [In] AddressFamily addressFamily, 
                [In] IntPtr lpProtocolInfo, // always passing in a 0
                [Out] byte[] socketAddress,
                [In, Out] ref int socketAddressSize );
 
            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal static extern SocketError WSAAddressToString( 
                [In] byte[] socketAddress, 
                [In] int socketAddressSize,
                [In] IntPtr lpProtocolInfo,// always passing in a 0 
                [Out]StringBuilder addressString,
                [In, Out] ref int addressStringLength);

            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal static extern SocketError getnameinfo(
                [In]         byte[]        sa, 
                [In]         int           salen, 
                [In,Out]     StringBuilder host,
                [In]         int           hostlen, 
                [In,Out]     StringBuilder serv,
                [In]         int           servlen,
                [In]         int           flags);
 
            //if we change this back to auto, we also have to change
            //WSAPROTOCOL_INFO and WSAPROTOCOLCHAIN 
            [DllImport(WS2_32, SetLastError=true, CharSet=CharSet.Auto, ExactSpelling=false)] 
            internal static extern int WSAEnumProtocols(
                                                        [MarshalAs(UnmanagedType.LPArray)] 
                                                        [In] int[]     lpiProtocols,
                                                        [In] SafeLocalFree lpProtocolBuffer,
                                                        [In][Out] ref uint lpdwBufferLength
                                                       ); 
#if SOCKETTHREADPOOL
            [DllImport("kernel32.dll", SetLastError = true)] 
            public static extern bool BindIoCompletionCallback( 
                SafeCloseSocket socketHandle,
                IOCompletionCallback function, 
                Int32 flags
            );

            [DllImport("kernel32.dll", SetLastError = true)] 
            public static extern IntPtr CreateIoCompletionPort(
                SafeCloseSocket socketHandle, 
                IntPtr ExistingCompletionPort, 
                Int32 CompletionKey,
                Int32 NumberOfConcurrentThreads 
            );

            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern IntPtr CreateIoCompletionPort( 
                SafeHandle Handle,
                IntPtr ExistingCompletionPort, 
                Int32 CompletionKey, 
                Int32 NumberOfConcurrentThreads
            ); 
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern IntPtr CreateIoCompletionPort(
                IntPtr Handle,
                IntPtr ExistingCompletionPort, 
                Int32 CompletionKey,
                Int32 NumberOfConcurrentThreads 
            ); 

            [DllImport("kernel32.dll", SetLastError = true)] 
            public static extern unsafe bool GetQueuedCompletionStatus(
              IntPtr CompletionPort,
              out UInt32 lpNumberOfBytes,
              out Int32 lpCompletionKey, 
              out NativeOverlapped* lpOverlapped,
              Int32 dwMilliseconds 
            ); 

            [DllImport("kernel32.dll", SetLastError = true)] 
            public static extern bool PostQueuedCompletionStatus(
                IntPtr CompletionPort,
                Int32 dwNumberOfBytesTransferred,
                IntPtr dwCompletionKey, 
                IntPtr dwZero
            ); 
#endif // SOCKETTHREADPOOL 
#endif // !FEATURE_PAL
 
        }; // class UnsafeNclNativeMethods.OSSOCK

#if !FEATURE_PAL
        // 
        // UnsafeNclNativeMethods.NativePKI class contains methods
        // imported from crypt32.dll. 
        // They deal mainly with certificates handling when doing https:// 
        //
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal static class NativePKI {

            private const string CRYPT32 = "crypt32.dll";
 
            [DllImport(CRYPT32, ExactSpelling=true, SetLastError=true)]
            internal static extern  int CertVerifyCertificateChainPolicy( 
                [In] IntPtr                     policy, 
                [In] SafeFreeCertChain          chainContext,
                [In] ref ChainPolicyParameter   cpp, 
                [In, Out] ref ChainPolicyStatus ps);


        }; // class UnsafeNclNativeMethods.NativePKI 

        // 
        // We need to import the same interface from 3 different DLLs, 
        //  Security.dll, Secur32.dll, and Schannel.Dll.
        //  Secur32.dll and Schannel.dll are for Win9x. 
        //  Security.dll is for NT platforms.
        //
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class NativeNTSSPI { 

            private const string SECURITY = "security.dll"; 
 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)] 
            internal static extern int EncryptMessage(
                  ref SSPIHandle contextHandle,
                  [In] uint qualityOfProtection,
                  [In, Out] SecurityBufferDescriptor inputOutput, 
                  [In] uint sequenceNumber
                  ); 
 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)] 
            internal static unsafe extern int DecryptMessage(
                  [In] ref SSPIHandle contextHandle,
                  [In, Out] SecurityBufferDescriptor inputOutput,
                  [In] uint sequenceNumber, 
                       uint *qualityOfProtection
                  ); 
 
        }; // class UnsafeNclNativeMethods.NativeNTSSPI
 
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class NativeSSLWin9xSSPI {

            private const string SCHANNEL = "schannel.dll"; 
            private const string SECUR32  = "secur32.dll";
 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)]
            internal static extern int SealMessage( 
                  ref SSPIHandle contextHandle,
                  [In] uint qualityOfProtection,
                  [In, Out] SecurityBufferDescriptor inputOutput,
                  [In] uint sequenceNumber 
                  );
 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)]
            internal static extern int UnsealMessage( 
                  [In] ref SSPIHandle contextHandle,
                  [In, Out] SecurityBufferDescriptor inputOutput,
                  [In] IntPtr   qualityOfProtection,     //should be null or change the type to be ref long
                  [In] uint sequenceNumber 
                  );
 
        } // class UnsafeNclNativeMethods.NativeSSLWin9xSSPI 

 
        //
        // A few things for AutoDetect
        //
        internal const uint AUTO_DETECT_TYPE_DHCP  = 1; 
        internal const uint AUTO_DETECT_TYPE_DNS_A = 2;
 
        // WININET.dll - 
        //  this is the main DLL used by Internet Explorer for creating and handling Network
        //      connections, we need to load it and call it for auto-proxy detection.  Avoid loading this dll! 
        //
        [SuppressUnmanagedCodeSecurity]
        internal static class WinInet
        { 
            [DllImport(WININET, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal static extern bool DetectAutoProxyUrl( 
                [Out] StringBuilder autoProxyUrl, 
                [In] int autoProxyUrlLength,
                [In] int detectFlags 
                );
        }

        // The replacement for WinInet, WinHttp is preferred where it's available.  We require version 5.1. 
        [SuppressUnmanagedCodeSecurity]
        internal static class WinHttp 
        { 
            [DllImport(WINHTTP, ExactSpelling=true, SetLastError=true)]
            internal static extern bool WinHttpDetectAutoProxyConfigUrl(uint autoDetectFlags, out SafeGlobalFree autoConfigUrl); 
        }


        // 
        // Caching (must use WinInet to cache).
        // 
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal static class UnsafeWinInetCache {
            public  const int    MAX_PATH = 260; 

            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)]
            internal static extern bool CreateUrlCacheEntryW(
                                            [In]  string        urlName, 
                                            [In]  int           expectedFileSize,
                                            [In]  string        fileExtension, 
                                            [Out] System.Text.StringBuilder fileName, 
                                            [In]  int           dwReserved
        ); 

            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)]
            unsafe internal static extern bool CommitUrlCacheEntryW(
                                            [In] string                 urlName, 
                                            [In] string                 localFileName,
                                            [In] _WinInetCache.FILETIME  expireTime, 
                                            [In] _WinInetCache.FILETIME  lastModifiedTime, 
                                            [In] _WinInetCache.EntryType EntryType,
                                            [In] byte*                  headerInfo, 
                                            [In] int                    headerSizeTChars,
                                            [In] string                 fileExtension,
                                            [In] string                 originalUrl
        ); 

            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)] 
            unsafe internal static extern bool GetUrlCacheEntryInfoW( 
                                            [In]      string    urlName,
                                            [In]      byte*     entryPtr,                       //was [Out] 
                                            [In, Out] ref int   bufferSz
                                            );

            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)] 
            unsafe internal static extern bool SetUrlCacheEntryInfoW(
                                            [In] string                 lpszUrlName, 
                                            [In] byte*                  EntryPtr, 
                                            [In] _WinInetCache.Entry_FC  fieldControl
                                            ); 

            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)]
            internal static extern bool DeleteUrlCacheEntryW( [In] string urlName);
 
            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)]
            internal static extern bool UnlockUrlCacheEntryFileW( 
                                            [In] string     urlName, 
                                            [In] int        dwReserved                  //must be 0
                                            ); 

    /*********
    NOT USED SO FAR
            unsafe private extern static SafeUnlockUrlCacheEntryStream RetrieveUrlCacheEntryStream( 
                                            [In]      string    urlName,
                                            [In]      byte*     entryPtr,               //was [Out] 
                                            [In, Out] ref int   entryBufSize, 
                                            [In]      bool      randomRead,
                                            [In]      int       dwReserved 
                                            );

            unsafe internal static extern bool ReadUrlCacheEntryStream(
                                            [In]      SafeUnlockUrlCacheEntryStream  urlCacheStream, 
                                            [In]      int       offset,
                                            [In]      byte*     bufferPtr, 
                                            [In, Out] ref int   bufferSz, 
                                            [In]      int       dwReserved                      //must be 0
                                            ); 

            internal static extern bool UnlockUrlCacheEntryStream(
                                    [In] IntPtr         urlCacheStream,
                                    [In] int            dwReserved                      //mustbe 0 
                                    );
 
            unsafe internal static extern bool GetUrlCacheEntryInfoEx( 
                                    [In]      string    url,
                                    [In]      byte*     entryPtr,                       //was [Out] 
                                    [In, Out] ref int   entryBufSize,
                                    [In]      IntPtr    lpszReserved,                   //was[Out] must pass null
                                    [In]      IntPtr    lpdwReserved,                   //was[In, Out] must pass null
                                    [In]      IntPtr    lpReserved,                     //must pass null 
                                    [In]      int       dwFlags                         //reserved must be 0
                                    ); 
 
            internal static extern IntPtr  FindFirstUrlCacheGroup(
                                    [In]  _WinInetCache.GroupFlag     flags, 
                                    [In]  _WinInetCache.GroupSrchType searchFilter,
                                    [In]  IntPtr                     searchConditionPtr, //must be null
                                    [In]  int                        searchConditionSz,  //must be 0
                                    [Out] out WinInet.GroupId        groupId, 
                                    [In]  IntPtr                     lpReserved          //was [In,Out] must be IntPtr.Zero
                                    ); 
 
            internal static extern bool FindNextUrlCacheGroup(
                                    [In]  IntPtr                    hFind, 
                                    [Out] out _WinInetCache.GroupId  groupId,
                                    [In]  IntPtr                    lpReserved          //was [In,Out] must be IntPtr.Zero
                                    );
 
            internal static extern bool GetUrlCacheGroupAttribute(
                                    [In]   _WinInetCache.GroupId     groupId, 
                                    [In]   int                      flags,              //must 0 
                                    [In]   _WinInetCache.GroupAttr   attr,
                                    [Out] out _WinInetCache.GroupInfo groupInfo, 
                                    [In, Out] ref int               groupInfoSize,
                                    [In]  IntPtr                    lpReserved          //was [In,Out] must be IntPtr.Zero
                                    );
 
            internal static extern bool SetUrlCacheGroupAttribute(
                                    [In]  _WinInetCache.GroupId      groupId, 
                                    [In]  int                       flags,              //must be 0 
                                    [In]  _WinInetCache.GroupAttr    attr,
                                    [In]  _WinInetCache.GroupInfo    groupInfo, 
                                    [In]  IntPtr                    lpReserved          //was [In,Out] must be IntPtr.Zero
                                    );

            internal static extern WinInet.GroupId CreateUrlCacheGroup( 
                                    [In]  _WinInetCache.GroupFlag    flags,
                                    [In]  IntPtr                    lpReserved          //must be IntPtr.Zero 
                                    ); 

            internal static extern bool DeleteUrlCacheGroup( 
                                    [In]  _WinInetCache.GroupId      groupId,
                                    [In]  _WinInetCache.GroupFlag    flags,
                                    [In]  IntPtr                    lpReserved          //must be IntPtr.Zero
                                    ); 

 
            internal static extern bool SetUrlCacheEntryGroup( 
                                    [In] string                     urlName,
                                    [In] _WinInetCache.GroupSetFlag  flags, 
                                    [In] _WinInetCache.GroupId       groupId,
                                    [In] IntPtr                     groupAttributes,    // must pass NULL
                                    [In] int                        groupAttrCount,     // must pass 0
                                    [In] IntPtr                     lpReserved          // must pass NULL 
                                    );
 
            unsafe internal static extern IntPtr FindFirstUrlCacheEntryEx( 
                                    [In]      byte*             searchPattern,      //must be null
                                    [In]      int               dwFlags,            //must be 0 
                                    [In]      CacheEntry.EntryType srchFilter,
                                    [In]      WinInet.GroupId   groupId,
                                    [In]      byte*             entryPtr,           //was [out]
                                    [In, Out] ref int           entryBufSize, 
                                    [Out]     void*             lpReserved,         // must pass NULL
                                    [In]      void*             lpReserved2,        //was [In,Out] must be IntPtr.Zero 
                                    [In]      void*             lpReserved3         // must pass NULL 
                                    );
 
            unsafe internal static extern bool FindNextUrlCacheEntryEx(
                                    [In]     IntPtr             enumHandle,
                                    [In]     byte*              entryPtr,           //was [Out]
                                    [In, Out]ref int            entryBufSize, 
                                    [In]     void*              lpReserved,         // [Out] must pass NULL
                                    [In]     void*              lpReserved2,        // [In] [Out] must pass NULL 
                                    [In]     void*              lpReserved3         // must pass NULL 
                                    );
 
            unsafe internal static extern IntPtr FindFirstUrlCacheEntry(
                                    [In]     string             searchPattern,
                                    [In]     byte*              entryPtr,           //was [Out]
                                    [In, Out]ref int            entryBufSize 
                                    );
 
 
            unsafe internal static extern bool FindNextUrlCacheEntry(
                                    [In]     IntPtr             enumHandle, 
                                    [In]     byte*              entryPtr,           //was [Out]
                                    [In, Out]ref int            entryBufSize
                                    );
 
            internal static extern bool FindCloseUrlCache( [In] IntPtr enumHandle);
 
    /**********/ 
        }
 
#endif // !FEATURE_PAL

#if !FEATURE_PAL
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal unsafe class HttpApi {
 
            private HttpApi() { 
            }
 
            private const string HTTPAPI = "httpapi.dll";

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)]
            internal static extern uint HttpInitialize(HTTPAPI_VERSION Version, uint Flags, void* Reserved); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpReceiveRequestEntityBody(SafeCloseHandle RequestQueueHandle, ulong RequestId, uint Flags, void* pEntityBuffer, uint EntityBufferLength, uint* pBytesReturned, NativeOverlapped* pOverlapped); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpReceiveClientCertificate(SafeCloseHandle RequestQueueHandle, ulong ConnectionId, uint Flags, HTTP_SSL_CLIENT_CERT_INFO* pSslClientCertInfo, uint SslClientCertInfoSize, uint* pBytesReceived, NativeOverlapped* pOverlapped);

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)]
            internal static extern uint HttpReceiveHttpRequest(SafeCloseHandle RequestQueueHandle, ulong RequestId, uint Flags, HTTP_REQUEST* pRequestBuffer, uint RequestBufferLength, uint* pBytesReturned, NativeOverlapped* pOverlapped); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpAddUrl(SafeCloseHandle RequestQueueHandle, ushort* pFullyQualifiedUrl, void* pReserved); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpRemoveUrl(SafeCloseHandle RequestQueueHandle, ushort* pFullyQualifiedUrl);

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)]
            internal static extern uint HttpSendHttpResponse(SafeCloseHandle RequestQueueHandle, ulong RequestId, uint Flags, HTTP_RESPONSE* pHttpResponse, void* pCachePolicy, uint* pBytesSent, SafeLocalFree pRequestBuffer, uint RequestBufferLength, NativeOverlapped* pOverlapped, void* pLogData); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpSendResponseEntityBody(SafeCloseHandle RequestQueueHandle, ulong RequestId, uint Flags, ushort EntityChunkCount, HTTP_DATA_CHUNK* pEntityChunks, uint* pBytesSent, SafeLocalFree pRequestBuffer, uint RequestBufferLength, NativeOverlapped* pOverlapped, void* pLogData); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpWaitForDisconnect(SafeCloseHandle RequestQueueHandle, ulong ConnectionId, NativeOverlapped* pOverlapped);

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_VERSION { 
                internal ushort MajorVersion;
                internal ushort MinorVersion; 
            } 

            [StructLayout(LayoutKind.Sequential)] 
            internal struct HTTP_KNOWN_HEADER {
                internal ushort RawValueLength;
                internal sbyte* pRawValue;
            } 

            [StructLayout(LayoutKind.Sequential, Size=32)] 
            internal struct HTTP_DATA_CHUNK { 
                internal HTTP_DATA_CHUNK_TYPE DataChunkType;
                internal uint p0; 
                internal byte* pBuffer;
                internal uint BufferLength;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTPAPI_VERSION { 
                internal ushort HttpApiMajorVersion; 
                internal ushort HttpApiMinorVersion;
            } 

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_COOKED_URL {
                internal ushort FullUrlLength; 
                internal ushort HostLength;
                internal ushort AbsPathLength; 
                internal ushort QueryStringLength; 
                internal ushort* pFullUrl;
                internal ushort* pHost; 
                internal ushort* pAbsPath;
                internal ushort* pQueryString;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct SOCKADDR { 
                internal ushort sa_family; 
                internal byte sa_data;
                internal byte sa_data_02; 
                internal byte sa_data_03;
                internal byte sa_data_04;
                internal byte sa_data_05;
                internal byte sa_data_06; 
                internal byte sa_data_07;
                internal byte sa_data_08; 
                internal byte sa_data_09; 
                internal byte sa_data_10;
                internal byte sa_data_11; 
                internal byte sa_data_12;
                internal byte sa_data_13;
                internal byte sa_data_14;
            } 

            [StructLayout(LayoutKind.Sequential)] 
            internal struct HTTP_TRANSPORT_ADDRESS { 
                internal SOCKADDR* pRemoteAddress;
                internal SOCKADDR* pLocalAddress; 
            }

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_SSL_CLIENT_CERT_INFO { 
                internal uint CertFlags;
                internal uint CertEncodedSize; 
                internal byte* pCertEncoded; 
                internal void* Token;
                internal byte CertDeniedByMapper; 
            }

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_UNKNOWN_HEADER { 
                internal ushort NameLength;
                internal ushort RawValueLength; 
                internal sbyte* pName; 
                internal sbyte* pRawValue;
            } 

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_SSL_INFO {
                internal ushort ServerCertKeySize; 
                internal ushort ConnectionKeySize;
                internal uint ServerCertIssuerSize; 
                internal uint ServerCertSubjectSize; 
                internal sbyte* pServerCertIssuer;
                internal sbyte* pServerCertSubject; 
                internal HTTP_SSL_CLIENT_CERT_INFO* pClientCertInfo;
                internal uint SslClientCertNegotiated;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_RESPONSE_HEADERS { 
                internal ushort UnknownHeaderCount; 
                internal HTTP_UNKNOWN_HEADER* pUnknownHeaders;
                internal ushort TrailerCount; 
                internal HTTP_UNKNOWN_HEADER* pTrailers;
                internal HTTP_KNOWN_HEADER KnownHeaders;
                internal HTTP_KNOWN_HEADER KnownHeaders_02;
                internal HTTP_KNOWN_HEADER KnownHeaders_03; 
                internal HTTP_KNOWN_HEADER KnownHeaders_04;
                internal HTTP_KNOWN_HEADER KnownHeaders_05; 
                internal HTTP_KNOWN_HEADER KnownHeaders_06; 
                internal HTTP_KNOWN_HEADER KnownHeaders_07;
                internal HTTP_KNOWN_HEADER KnownHeaders_08; 
                internal HTTP_KNOWN_HEADER KnownHeaders_09;
                internal HTTP_KNOWN_HEADER KnownHeaders_10;
                internal HTTP_KNOWN_HEADER KnownHeaders_11;
                internal HTTP_KNOWN_HEADER KnownHeaders_12; 
                internal HTTP_KNOWN_HEADER KnownHeaders_13;
                internal HTTP_KNOWN_HEADER KnownHeaders_14; 
                internal HTTP_KNOWN_HEADER KnownHeaders_15; 
                internal HTTP_KNOWN_HEADER KnownHeaders_16;
                internal HTTP_KNOWN_HEADER KnownHeaders_17; 
                internal HTTP_KNOWN_HEADER KnownHeaders_18;
                internal HTTP_KNOWN_HEADER KnownHeaders_19;
                internal HTTP_KNOWN_HEADER KnownHeaders_20;
                internal HTTP_KNOWN_HEADER KnownHeaders_21; 
                internal HTTP_KNOWN_HEADER KnownHeaders_22;
                internal HTTP_KNOWN_HEADER KnownHeaders_23; 
                internal HTTP_KNOWN_HEADER KnownHeaders_24; 
                internal HTTP_KNOWN_HEADER KnownHeaders_25;
                internal HTTP_KNOWN_HEADER KnownHeaders_26; 
                internal HTTP_KNOWN_HEADER KnownHeaders_27;
                internal HTTP_KNOWN_HEADER KnownHeaders_28;
                internal HTTP_KNOWN_HEADER KnownHeaders_29;
                internal HTTP_KNOWN_HEADER KnownHeaders_30; 
            }
 
            [StructLayout(LayoutKind.Sequential)] 
            internal struct HTTP_REQUEST_HEADERS {
                internal ushort UnknownHeaderCount; 
                internal HTTP_UNKNOWN_HEADER* pUnknownHeaders;
                internal ushort TrailerCount;
                internal HTTP_UNKNOWN_HEADER* pTrailers;
                internal HTTP_KNOWN_HEADER KnownHeaders; 
                internal HTTP_KNOWN_HEADER KnownHeaders_02;
                internal HTTP_KNOWN_HEADER KnownHeaders_03; 
                internal HTTP_KNOWN_HEADER KnownHeaders_04; 
                internal HTTP_KNOWN_HEADER KnownHeaders_05;
                internal HTTP_KNOWN_HEADER KnownHeaders_06; 
                internal HTTP_KNOWN_HEADER KnownHeaders_07;
                internal HTTP_KNOWN_HEADER KnownHeaders_08;
                internal HTTP_KNOWN_HEADER KnownHeaders_09;
                internal HTTP_KNOWN_HEADER KnownHeaders_10; 
                internal HTTP_KNOWN_HEADER KnownHeaders_11;
                internal HTTP_KNOWN_HEADER KnownHeaders_12; 
                internal HTTP_KNOWN_HEADER KnownHeaders_13; 
                internal HTTP_KNOWN_HEADER KnownHeaders_14;
                internal HTTP_KNOWN_HEADER KnownHeaders_15; 
                internal HTTP_KNOWN_HEADER KnownHeaders_16;
                internal HTTP_KNOWN_HEADER KnownHeaders_17;
                internal HTTP_KNOWN_HEADER KnownHeaders_18;
                internal HTTP_KNOWN_HEADER KnownHeaders_19; 
                internal HTTP_KNOWN_HEADER KnownHeaders_20;
                internal HTTP_KNOWN_HEADER KnownHeaders_21; 
                internal HTTP_KNOWN_HEADER KnownHeaders_22; 
                internal HTTP_KNOWN_HEADER KnownHeaders_23;
                internal HTTP_KNOWN_HEADER KnownHeaders_24; 
                internal HTTP_KNOWN_HEADER KnownHeaders_25;
                internal HTTP_KNOWN_HEADER KnownHeaders_26;
                internal HTTP_KNOWN_HEADER KnownHeaders_27;
                internal HTTP_KNOWN_HEADER KnownHeaders_28; 
                internal HTTP_KNOWN_HEADER KnownHeaders_29;
                internal HTTP_KNOWN_HEADER KnownHeaders_30; 
                internal HTTP_KNOWN_HEADER KnownHeaders_31; 
                internal HTTP_KNOWN_HEADER KnownHeaders_32;
                internal HTTP_KNOWN_HEADER KnownHeaders_33; 
                internal HTTP_KNOWN_HEADER KnownHeaders_34;
                internal HTTP_KNOWN_HEADER KnownHeaders_35;
                internal HTTP_KNOWN_HEADER KnownHeaders_36;
                internal HTTP_KNOWN_HEADER KnownHeaders_37; 
                internal HTTP_KNOWN_HEADER KnownHeaders_38;
                internal HTTP_KNOWN_HEADER KnownHeaders_39; 
                internal HTTP_KNOWN_HEADER KnownHeaders_40; 
                internal HTTP_KNOWN_HEADER KnownHeaders_41;
            } 

            internal enum HTTP_VERB : int {
                HttpVerbUnparsed = 0,
                HttpVerbUnknown = 1, 
                HttpVerbInvalid = 2,
                HttpVerbOPTIONS = 3, 
                HttpVerbGET = 4, 
                HttpVerbHEAD = 5,
                HttpVerbPOST = 6, 
                HttpVerbPUT = 7,
                HttpVerbDELETE = 8,
                HttpVerbTRACE = 9,
                HttpVerbCONNECT = 10, 
                HttpVerbTRACK = 11,
                HttpVerbMOVE = 12, 
                HttpVerbCOPY = 13, 
                HttpVerbPROPFIND = 14,
                HttpVerbPROPPATCH = 15, 
                HttpVerbMKCOL = 16,
                HttpVerbLOCK = 17,
                HttpVerbUNLOCK = 18,
                HttpVerbSEARCH = 19, 
                HttpVerbMaximum = 20,
            } 
 
            internal static readonly string[] HttpVerbs = new string[] {
                null, 
                "Unknown",
                "Invalid",
                "OPTIONS",
                "GET", 
                "HEAD",
                "POST", 
                "PUT", 
                "DELETE",
                "TRACE", 
                "CONNECT",
                "TRACK",
                "MOVE",
                "COPY", 
                "PROPFIND",
                "PROPPATCH", 
                "MKCOL", 
                "LOCK",
                "UNLOCK", 
                "SEARCH",
            };

            internal enum HTTP_DATA_CHUNK_TYPE : int { 
                HttpDataChunkFromMemory = 0,
                HttpDataChunkFromFileHandle = 1, 
                HttpDataChunkFromFragmentCache = 2, 
                HttpDataChunkMaximum = 3,
            } 

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_RESPONSE {
                internal uint Flags; 
                internal HTTP_VERSION Version;
                internal ushort StatusCode; 
                internal ushort ReasonLength; 
                internal sbyte* pReason;
                internal HTTP_RESPONSE_HEADERS Headers; 
                internal ushort EntityChunkCount;
                internal HTTP_DATA_CHUNK* pEntityChunks;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_REQUEST { 
                internal uint Flags; 
                internal ulong ConnectionId;
                internal ulong RequestId; 
                internal ulong UrlContext;
                internal HTTP_VERSION Version;
                internal HTTP_VERB Verb;
                internal ushort UnknownVerbLength; 
                internal ushort RawUrlLength;
                internal sbyte* pUnknownVerb; 
                internal sbyte* pRawUrl; 
                internal HTTP_COOKED_URL CookedUrl;
                internal HTTP_TRANSPORT_ADDRESS Address; 
                internal HTTP_REQUEST_HEADERS Headers;
                internal ulong BytesReceived;
                internal ushort EntityChunkCount;
                internal HTTP_DATA_CHUNK* pEntityChunks; 
                internal ulong RawConnectionId;
                internal HTTP_SSL_INFO* pSslInfo; 
            } 

            // see http.w for definitions 
            [Flags]
            internal enum HTTP_FLAGS : uint {
                NONE                                                = 0x00000000,
                HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY                 = 0x00000001, 
                HTTP_SEND_RESPONSE_FLAG_DISCONNECT                  = 0x00000001,
                HTTP_SEND_RESPONSE_FLAG_MORE_DATA                   = 0x00000002, 
                HTTP_SEND_RESPONSE_FLAG_RAW_HEADER                  = 0x00000004, 
                HTTP_SEND_REQUEST_FLAG_MORE_DATA                    = 0x00000001,
            } 

            const int HttpHeaderRequestMaximum  = (int)HttpRequestHeader.UserAgent + 1;
            const int HttpHeaderResponseMaximum = (int)HttpResponseHeader.WwwAuthenticate + 1;
 
            internal static class HTTP_REQUEST_HEADER_ID {
                private static Hashtable m_Hashtable; 
 
                static HTTP_REQUEST_HEADER_ID() {
                    m_Hashtable = new Hashtable(HttpHeaderRequestMaximum); 
                    for (int i = 0; iHeaders.UnknownHeaderCount != 0) 
                    {
                        HTTP_UNKNOWN_HEADER* pUnknownHeader = (HTTP_UNKNOWN_HEADER*) (fixup + (byte*) request->Headers.pUnknownHeaders); 
                        for (index = 0; index < request->Headers.UnknownHeaderCount; index++)
                        {
                            if (pUnknownHeader->pName != null && pUnknownHeader->NameLength > 0 && pUnknownHeader->pRawValue != null && pUnknownHeader->RawValueLength > 0)
                            { 
                                string headerName = new string(pUnknownHeader->pName + fixup, 0, pUnknownHeader->NameLength);
                                string headerValue = new string(pUnknownHeader->pRawValue + fixup, 0, pUnknownHeader->RawValueLength); 
                                headerCollection.AddInternal(headerName, headerValue); 
                            }
                            pUnknownHeader++; 
                        }
                    }

                    // known headers 
                    HTTP_KNOWN_HEADER* pKnownHeader = &request->Headers.KnownHeaders;
                    for (index = 0; index < HttpHeaderRequestMaximum - 1; index++) 
                    { 
                        if (pKnownHeader->RawValueLength != 0 && pKnownHeader->pRawValue != null)
                        { 
                            string headerValue = new string(pKnownHeader->pRawValue + fixup, 0, pKnownHeader->RawValueLength);
                            headerCollection.AddInternal(HTTP_REQUEST_HEADER_ID.ToString(index), headerValue);
                        }
                        pKnownHeader++; 
                    }
                } 
 
                GlobalLog.Leave("HttpApi::GetHeaders()");
                return headerCollection; 
            }

            private static string GetKnownHeader(HTTP_REQUEST* request, long fixup, int headerIndex)
            { 
                GlobalLog.Enter("HttpApi::GetKnownHeader()");
                string header = null; 
 
                HTTP_KNOWN_HEADER* pKnownHeader = (&request->Headers.KnownHeaders) + headerIndex;
                GlobalLog.Print("HttpApi::GetKnownHeader() pKnownHeader:0x" + ((IntPtr) pKnownHeader).ToString("x")); 
                GlobalLog.Print("HttpApi::GetKnownHeader() pRawValue:0x" + ((IntPtr) pKnownHeader->pRawValue).ToString("x") + " RawValueLength:" + pKnownHeader->RawValueLength.ToString());
                if (pKnownHeader->RawValueLength != 0 && pKnownHeader->pRawValue != null)
                {
                    header = new string(pKnownHeader->pRawValue + fixup, 0, pKnownHeader->RawValueLength); 
                }
 
                GlobalLog.Leave("HttpApi::GetKnownHeader() return:" + ValidationHelper.ToString(header)); 
                return header;
            } 

            internal static string GetKnownHeader(HTTP_REQUEST* request, int headerIndex)
            {
                return GetKnownHeader(request, 0, headerIndex); 
            }
 
            internal static string GetKnownHeader(byte[] memoryBlob, IntPtr originalAddress, int headerIndex) 
            {
                fixed (byte* pMemoryBlob = memoryBlob) 
                {
                    return GetKnownHeader((HTTP_REQUEST*) pMemoryBlob, pMemoryBlob - (byte*) originalAddress, headerIndex);
                }
            } 

            private unsafe static string GetVerb(HTTP_REQUEST* request, long fixup) 
            { 
                GlobalLog.Enter("HttpApi::GetVerb()");
                string verb = null; 

                if ((int) request->Verb > (int) HTTP_VERB.HttpVerbUnknown && (int) request->Verb < (int) HTTP_VERB.HttpVerbMaximum)
                {
                    verb = HttpVerbs[(int) request->Verb]; 
                }
                else if (request->Verb == HTTP_VERB.HttpVerbUnknown && request->pUnknownVerb != null) 
                { 
                    verb = new string(request->pUnknownVerb + fixup, 0, request->UnknownVerbLength);
                } 

                GlobalLog.Leave("HttpApi::GetVerb() return:" + ValidationHelper.ToString(verb));
                return verb;
            } 

            internal unsafe static string GetVerb(HTTP_REQUEST* request) 
            { 
                return GetVerb(request, 0);
            } 

            internal unsafe static string GetVerb(byte[] memoryBlob, IntPtr originalAddress)
            {
                fixed (byte* pMemoryBlob = memoryBlob) 
                {
                    return GetVerb((HTTP_REQUEST*) pMemoryBlob, pMemoryBlob - (byte*) originalAddress); 
                } 
            }
 
            internal static HTTP_VERB GetKnownVerb(byte[] memoryBlob, IntPtr originalAddress)
            {
                GlobalLog.Enter("HttpApi::GetKnownVerb()");
 
                // Return value.
                HTTP_VERB verb = HTTP_VERB.HttpVerbUnknown; 
                fixed (byte* pMemoryBlob = memoryBlob) 
                {
                    HTTP_REQUEST* request = (HTTP_REQUEST*) pMemoryBlob; 
                    if ((int)request->Verb > (int)HTTP_VERB.HttpVerbUnparsed && (int)request->Verb < (int)HTTP_VERB.HttpVerbMaximum)
                    {
                        verb = request->Verb;
                    } 
                }
 
                GlobalLog.Leave("HttpApi::GetKnownVerb()"); 
                return verb;
            } 

            internal static uint GetChunks(byte[] memoryBlob, IntPtr originalAddress, ref int dataChunkIndex, ref uint dataChunkOffset, byte[] buffer, int offset, int size)
            {
                GlobalLog.Enter("HttpApi::GetChunks() memoryBlob:" + ValidationHelper.ToString(memoryBlob)); 

                // Return value. 
                uint dataRead = 0; 
                fixed(byte* pMemoryBlob = memoryBlob)
                { 
                    HTTP_REQUEST* request = (HTTP_REQUEST*) pMemoryBlob;
                    long fixup = pMemoryBlob - (byte*) originalAddress;

                    if (request->EntityChunkCount > 0 && dataChunkIndex < request->EntityChunkCount && dataChunkIndex != -1) 
                    {
                        HTTP_DATA_CHUNK* pDataChunk = (HTTP_DATA_CHUNK*) (fixup + (byte*) &request->pEntityChunks[dataChunkIndex]); 
 
                        fixed(byte* pReadBuffer = buffer)
                        { 
                            byte* pTo = &pReadBuffer[offset];

                            while (dataChunkIndex < request->EntityChunkCount && dataRead < size){
                                if(dataChunkOffset >= pDataChunk->BufferLength){ 
                                    dataChunkOffset = 0;
                                    dataChunkIndex ++; 
                                    pDataChunk++; 
                                }
                                else{ 
                                    byte* pFrom = pDataChunk->pBuffer + dataChunkOffset + fixup;

                                    uint bytesToRead =  pDataChunk->BufferLength - (uint)dataChunkOffset;
                                    if (bytesToRead  > (uint)size){ 
                                        bytesToRead = (uint)size;
                                    } 
                                    for (uint i=0;iEntityChunkCount){ 
                        dataChunkIndex = -1;
                    }
                }
 
                GlobalLog.Leave("HttpApi::GetChunks()");
                return dataRead; 
            } 

            internal static IPEndPoint GetRemoteEndPoint(byte[] memoryBlob, IntPtr originalAddress) 
            {
                GlobalLog.Enter("HttpApi::GetRemoteEndPoint()");

                SocketAddress v4address = new SocketAddress(AddressFamily.InterNetwork, SocketAddress.IPv4AddressSize); 
                SocketAddress v6address = new SocketAddress(AddressFamily.InterNetworkV6, SocketAddress.IPv6AddressSize);
 
                fixed (byte* pMemoryBlob = memoryBlob) 
                {
                    HTTP_REQUEST* request = (HTTP_REQUEST*) pMemoryBlob; 
                    IntPtr address = request->Address.pRemoteAddress != null ? (IntPtr) (pMemoryBlob - (byte*) originalAddress + (byte*) request->Address.pRemoteAddress) : IntPtr.Zero;
                    CopyOutAddress(address, ref v4address, ref v6address);
                }
 
                IPEndPoint endpoint = null;
                if (v4address != null) 
                { 
                    endpoint = IPEndPoint.Any.Create(v4address) as IPEndPoint;
                } 
                else if (v6address != null)
                {
                    endpoint = IPEndPoint.IPv6Any.Create(v6address) as IPEndPoint;
                } 

                GlobalLog.Leave("HttpApi::GetRemoteEndPoint()"); 
                return endpoint; 
            }
 
            internal static IPEndPoint GetLocalEndPoint(byte[] memoryBlob, IntPtr originalAddress)
            {
                GlobalLog.Enter("HttpApi::GetLocalEndPoint()");
 
                SocketAddress v4address = new SocketAddress(AddressFamily.InterNetwork, SocketAddress.IPv4AddressSize);
                SocketAddress v6address = new SocketAddress(AddressFamily.InterNetworkV6, SocketAddress.IPv6AddressSize); 
 
                fixed (byte* pMemoryBlob = memoryBlob)
                { 
                    HTTP_REQUEST* request = (HTTP_REQUEST*) pMemoryBlob;
                    IntPtr address = request->Address.pLocalAddress != null ? (IntPtr) (pMemoryBlob - (byte*) originalAddress + (byte*) request->Address.pLocalAddress) : IntPtr.Zero;
                    CopyOutAddress(address, ref v4address, ref v6address);
                } 

                IPEndPoint endpoint = null; 
                if (v4address != null) 
                {
                    endpoint = IPEndPoint.Any.Create(v4address) as IPEndPoint; 
                }
                else if (v6address != null)
                {
                    endpoint = IPEndPoint.IPv6Any.Create(v6address) as IPEndPoint; 
                }
 
                GlobalLog.Leave("HttpApi::GetLocalEndPoint()"); 
                return endpoint;
            } 

            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            private static void CopyOutAddress(IntPtr address, ref SocketAddress v4address, ref SocketAddress v6address)
            { 
                if (address != IntPtr.Zero)
                { 
                    ushort addressFamily = *((ushort*) address); 
                    if (addressFamily == (ushort) AddressFamily.InterNetwork)
                    { 
                        v6address = null;
                        fixed (byte* pBuffer = v4address.m_Buffer)
                        {
                            for (int index = 2; index < SocketAddress.IPv4AddressSize; index++) 
                            {
                                pBuffer[index] = ((byte*) address)[index]; 
                            } 
                        }
                        return; 
                    }
                    if (addressFamily == (ushort) AddressFamily.InterNetworkV6)
                    {
                        v4address = null; 
                        fixed (byte* pBuffer = v6address.m_Buffer)
                        { 
                            for (int index = 2; index < SocketAddress.IPv6AddressSize; index++) 
                            {
                                pBuffer[index] = ((byte*) address)[index]; 
                            }
                        }
                        return;
                    } 
                }
 
                v4address = null; 
                v6address = null;
            } 
        }
#endif // !FEATURE_PAL
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 

namespace System.Net { 
    using System.Runtime.InteropServices; 
    using System.Runtime.CompilerServices;
    using System.Security.Permissions; 
    using System.Text;
    using System.Net.Sockets;
    using System.Net.Cache;
    using System.Threading; 
    using System.ComponentModel;
    using System.Collections; 
    using System.Globalization; 
    using System.Runtime.ConstrainedExecution;
    using System.Security; 
    using Microsoft.Win32.SafeHandles;

    [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
    internal static class UnsafeNclNativeMethods { 

#if FEATURE_PAL 
 #if !PLATFORM_UNIX 
        internal const String DLLPREFIX = "";
        internal const String DLLSUFFIX = ".dll"; 
 #else // !PLATFORM_UNIX
  #if __APPLE__
        internal const String DLLPREFIX = "lib";
        internal const String DLLSUFFIX = ".dylib"; 
  #elif _AIX
        internal const String DLLPREFIX = "lib"; 
        internal const String DLLSUFFIX = ".a"; 
  #elif __hppa__ || IA64
        internal const String DLLPREFIX = "lib"; 
        internal const String DLLSUFFIX = ".sl";
  #else
        internal const String DLLPREFIX = "lib";
        internal const String DLLSUFFIX = ".so"; 
  #endif
 #endif // !PLATFORM_UNIX 
 
        internal const String ROTOR_PAL   = DLLPREFIX + "rotor_pal" + DLLSUFFIX;
        internal const String ROTOR_PALRT = DLLPREFIX + "rotor_palrt" + DLLSUFFIX; 
        private const String KERNEL32 = ROTOR_PAL;
#else
        private const string KERNEL32 = "kernel32.dll";
#endif // !FEATURE_PAL 

#if !FEATURE_PAL 
        private const string WS2_32 = "ws2_32.dll"; 
#else
        private const string WS2_32 = ExternDll.Kernel32; // Resolves to rotor_pal 
#endif // !FEATURE_PAL

        private const string SECUR32 = "secur32.dll";
        private const string CRYPT32 = "crypt32.dll"; 
        private const string ADVAPI32 = "advapi32.dll";
        private const string HTTPAPI = "httpapi.dll"; 
        private const string SCHANNEL = "schannel.dll"; 
        private const string SECURITY = "security.dll";
        private const string RASAPI32 = "rasapi32.dll"; 
        private const string WININET = "wininet.dll";
        private const string WINHTTP = "winhttp.dll";
        private const string BCRYPT = "bcrypt.dll";
 
        /*
        // Consider removing. 
        [DllImport(KERNEL32)] 
        internal static extern IntPtr CreateSemaphore([In] IntPtr lpSemaphoreAttributes, [In] int lInitialCount, [In] int lMaximumCount, [In] string lpName);
        */ 

        /* Consider removing.
        [DllImport(KERNEL32)]
        internal static extern IntPtr CreateEvent([In] IntPtr lpEventAttributes, [In] bool manualResetEvent, [In] bool initalState, [In] IntPtr lpName); 
        */
 
        [DllImport(KERNEL32)] 
        internal static extern IntPtr CreateSemaphore([In] IntPtr lpSemaphoreAttributes, [In] int lInitialCount, [In] int lMaximumCount, [In] IntPtr lpName);
 
#if DEBUG
        [DllImport(KERNEL32)]
        internal static extern bool ReleaseSemaphore([In] IntPtr hSemaphore, [In] int lReleaseCount, [Out] out int lpPreviousCount);
 
#else
        [DllImport(KERNEL32)] 
        internal static extern bool ReleaseSemaphore([In] IntPtr hSemaphore, [In] int lReleaseCount, [In] IntPtr lpPreviousCount); 
#endif
 
        //
        internal static class ErrorCodes
        {
            internal const uint ERROR_SUCCESS               = 0; 
            internal const uint ERROR_HANDLE_EOF            = 38;
            internal const uint ERROR_NOT_SUPPORTED         = 50; 
            internal const uint ERROR_INVALID_PARAMETER     = 87; 
            internal const uint ERROR_ALREADY_EXISTS        = 183;
            internal const uint ERROR_MORE_DATA             = 234; 
            internal const uint ERROR_OPERATION_ABORTED     = 995;
            internal const uint ERROR_IO_PENDING            = 997;
            internal const uint ERROR_NOT_FOUND             = 1168;
        } 

        internal static class NTStatus 
        { 
            internal const uint STATUS_SUCCESS               = 0x00000000;
            internal const uint STATUS_OBJECT_NAME_NOT_FOUND = 0xC0000034; 
        }

        [DllImport(KERNEL32, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)]
        internal static extern uint GetCurrentThreadId(); 

#if !FEATURE_PAL 
        // Get the current FIPS policy setting on Vista and above 
        [DllImport(BCRYPT)]
        internal static extern uint BCryptGetFipsAlgorithmMode( 
                [MarshalAs(UnmanagedType.U1), Out]out bool pfEnabled);
#endif

 
#if STRESS || !DEBUG
        [DllImport(KERNEL32, ExactSpelling = true)] 
        internal static extern void DebugBreak(); 
#endif
 
#if FEATURE_PAL
        [DllImport(ROTOR_PALRT, CharSet=CharSet.Unicode, SetLastError=true, EntryPoint="PAL_FetchConfigurationStringW")]
        internal static extern bool FetchConfigurationString(bool perMachine, String parameterName, StringBuilder parameterValue, int parameterValueLength);
#endif // FEATURE_PAL 

#if !FEATURE_PAL 
        [SuppressUnmanagedCodeSecurity] 
        internal unsafe static class RegistryHelper
        { 
            internal const uint REG_NOTIFY_CHANGE_LAST_SET = 4;
            internal const uint REG_BINARY = 3;
            internal const uint KEY_READ = 0x00020019;
 
            internal static readonly IntPtr HKEY_CURRENT_USER = (IntPtr) unchecked((int) 0x80000001L);
            internal static readonly IntPtr HKEY_LOCAL_MACHINE = (IntPtr) unchecked((int) 0x80000002L); 
 
            // RELIABILITY:
            // this out parameter in this API, resultSubKey, is an allocated handle to a registry sub-key. 
            // it must be a SafeHandle so we can guarantee that it is released correctly and never leaked.
            [DllImport(ADVAPI32, BestFitMapping=false, ThrowOnUnmappableChar=true, ExactSpelling=false, CharSet=CharSet.Auto, SetLastError=true)]
            internal static extern uint RegOpenKeyEx(IntPtr key, string subKey, uint ulOptions, uint samDesired, out SafeRegistryHandle resultSubKey);
 
            [DllImport(ADVAPI32, BestFitMapping=false, ThrowOnUnmappableChar=true, ExactSpelling=false, CharSet=CharSet.Auto, SetLastError=true)]
            internal static extern uint RegOpenKeyEx(SafeRegistryHandle key, string subKey, uint ulOptions, uint samDesired, out SafeRegistryHandle resultSubKey); 
 
            [DllImport(ADVAPI32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern uint RegCloseKey(IntPtr key);

            [DllImport(ADVAPI32, ExactSpelling=true, SetLastError=true)]
            internal static extern uint RegNotifyChangeKeyValue(SafeRegistryHandle key, bool watchSubTree, uint notifyFilter, SafeWaitHandle regEvent, bool async); 

            [DllImport(ADVAPI32, ExactSpelling=true, SetLastError=true)] 
            internal static extern uint RegOpenCurrentUser(uint samDesired, out SafeRegistryHandle resultKey); 

            [DllImport(ADVAPI32, BestFitMapping=false, ThrowOnUnmappableChar=true, ExactSpelling=false, CharSet=CharSet.Auto, SetLastError=true)] 
            internal static extern uint RegQueryValueEx(SafeRegistryHandle key, string valueName, IntPtr reserved, out uint type, [Out] byte[] data, [In][Out] ref uint size);
        }

        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal unsafe class RasHelper
        { 
            private ManualResetEvent m_RasEvent; 
            private bool m_Suppressed;
 
            /* Consider removing
            internal void Close()
            {
                ManualResetEvent rasEvent = m_RasEvent; 
                m_RasEvent = null;
                m_Suppressed = false; 
                if (rasEvent != null) 
                {
                    rasEvent.Close(); 
                }
            }
            */
 
            internal RasHelper()
            { 
                m_RasEvent = new ManualResetEvent(false); 

                // Use -1 as a handle, to receive all RAS notifications for the local machine. 
                uint statusCode = RasConnectionNotification((IntPtr) (-1), m_RasEvent.SafeWaitHandle, RASCN_Connection | RASCN_Disconnection);

                GlobalLog.Print("RasHelper::RasHelper() RasConnectionNotification() statusCode:" + statusCode);
                if (statusCode != 0) 
                {
                    GlobalLog.Print("RasHelper::RasHelper() RasConnectionNotification() Marshal.GetLastWin32Error():" + Marshal.GetLastWin32Error()); 
                    m_Suppressed = true; 
                    m_RasEvent.Close();
                    m_RasEvent = null; 
                }
            }

            internal bool HasChanged 
            {
                get 
                { 
                    if (m_Suppressed)
                    { 
                        return false;
                    }

                    ManualResetEvent rasEvent = m_RasEvent; 
                    if (rasEvent == null)
                    { 
                        throw new ObjectDisposedException(GetType().FullName); 
                    }
                    return rasEvent.WaitOne(0, false); 
                }
            }

            internal void Reset() 
            {
                if (!m_Suppressed) 
                { 
                    ManualResetEvent rasEvent = m_RasEvent;
                    if (rasEvent == null) 
                    {
                        throw new ObjectDisposedException(GetType().FullName);
                    }
                    rasEvent.Reset(); 
                }
            } 
 
            internal static string GetCurrentConnectoid()
            { 
                uint dwSize = (uint) Marshal.SizeOf(typeof(RASCONN));
                GlobalLog.Print("RasHelper::GetCurrentConnectoid() using struct size dwSize:" + dwSize);

                uint count = 4; 
                uint statusCode = 0;
                RASCONN[] connections = null; 
                while (true) 
                {
                    uint cb = checked(dwSize * count); 
                    connections = new RASCONN[count];
                    connections[0].dwSize = dwSize;
                    statusCode = RasEnumConnections(connections, ref cb, ref count);
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() called RasEnumConnections() count:" + count + " statusCode: " + statusCode + " cb:" + cb); 
                    if (statusCode != ERROR_BUFFER_TOO_SMALL)
                    { 
                        break; 
                    }
                    count = checked(cb + dwSize - 1) / dwSize; 
                }

                if (count == 0 || statusCode != 0)
                { 
                    return null;
                } 
 
                for (uint i=0; i < count; i++)
                { 
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "]");
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].dwSize: " + connections[i].dwSize);
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].hrasconn: " + connections[i].hrasconn);
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].szEntryName: " + connections[i].szEntryName); 
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].szDeviceType: " + connections[i].szDeviceType);
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].szDeviceName: " + connections[i].szDeviceName); 
 
                    RASCONNSTATUS connectionStatus = new RASCONNSTATUS();
                    connectionStatus.dwSize = (uint)Marshal.SizeOf(connectionStatus); 
                    // RELIABILITY:
                    // the 'hrasconn' field is an IntPtr because it's defined as a handle
                    // that said, its use is that of a opaque ID, so we're not
                    // allocating anything that needs to be released for reliability. 
                    statusCode = RasGetConnectStatus(connections[i].hrasconn, ref connectionStatus);
                    GlobalLog.Print("RasHelper::GetCurrentConnectoid() called RasGetConnectStatus() statusCode: " + statusCode + " dwSize: " + connectionStatus.dwSize); 
                    if (statusCode==0) { 
                        GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].RASCONNSTATUS.dwSize: " + connectionStatus.dwSize);
                        GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].RASCONNSTATUS.rasconnstate: " + connectionStatus.rasconnstate); 
                        GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].RASCONNSTATUS.dwError: " + connectionStatus.dwError);
                        GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].RASCONNSTATUS.szDeviceType: " + connectionStatus.szDeviceType);
                        GlobalLog.Print("RasHelper::GetCurrentConnectoid() RASCONN[" + i + "].RASCONNSTATUS.szDeviceName: " + connectionStatus.szDeviceName);
                        if (connectionStatus.rasconnstate==RASCONNSTATE.RASCS_Connected) { 
                            return connections[i].szEntryName;
                        } 
                    } 
                }
 
                return null;
            }

            [DllImport(RASAPI32, ExactSpelling=false, CharSet=CharSet.Auto, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=false)] 
            private static extern uint RasEnumConnections([In, Out] RASCONN[] lprasconn, ref uint lpcb, ref uint lpcConnections);
 
            [DllImport(RASAPI32, ExactSpelling=false, CharSet=CharSet.Auto, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=false)] 
            private static extern uint RasGetConnectStatus([In] IntPtr hrasconn, [In, Out] ref RASCONNSTATUS lprasconnstatus);
 
            [DllImport(RASAPI32, ExactSpelling=false, CharSet=CharSet.Auto, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=false)]
            private static extern uint RasConnectionNotification([In] IntPtr hrasconn, [In] SafeWaitHandle hEvent, uint dwFlags);

            const int RAS_MaxEntryName = 256; 
            const int RAS_MaxDeviceType = 16;
            const int RAS_MaxDeviceName = 128; 
            const int RAS_MaxPhoneNumber = 128; 
            const int RAS_MaxCallbackNumber = 128;
 
            const uint RASCN_Connection = 0x00000001;
            const uint RASCN_Disconnection = 0x00000002;

            const int UNLEN = 256; 
            const int PWLEN = 256;
            const int DNLEN = 15; 
 
            const int MAX_PATH = 260;
 
            const uint RASBASE = 600;
            const uint ERROR_DIAL_ALREADY_IN_PROGRESS = (RASBASE+156);
            const uint ERROR_BUFFER_TOO_SMALL = (RASBASE+3);
 
            [StructLayout(LayoutKind.Sequential, Pack=4, CharSet=CharSet.Auto)]
            struct RASCONN { 
                internal uint dwSize; 
                internal IntPtr hrasconn;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxEntryName + 1)] 
                internal string szEntryName;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxDeviceType + 1)]
                internal string szDeviceType;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxDeviceName + 1)] 
                internal string szDeviceName;
 
/* None of these are supported on Windows 98. 
   MSDN lies twice: there is no dwSessionId at all, and szPhonebook and dwSubEntry are not on Win98.
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_PATH)] 
                internal string szPhonebook;
                internal uint dwSubEntry;
                internal Guid guidEntry;
                internal uint dwFlags; 
                internal ulong luid;
*/ 
            } 

            [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] 
            struct RASCONNSTATUS {
                internal uint dwSize;
                internal RASCONNSTATE rasconnstate;
                internal uint dwError; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxDeviceType + 1)]
                internal string szDeviceType; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxDeviceName + 1)] 
                internal string szDeviceName;
/* Not supported on Windows 98. 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxPhoneNumber + 1)]
                internal string szPhoneNumber;
*/
            } 

            [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] 
            struct RASDIALPARAMS { 
                internal uint dwSize;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxEntryName + 1)] 
                internal string szEntryName;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxPhoneNumber + 1)]
                internal string szPhoneNumber;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=RAS_MaxCallbackNumber + 1)] 
                internal string szCallbackNumber;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=UNLEN + 1)] 
                internal string szUserName; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=PWLEN + 1)]
                internal string szPassword; 
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=DNLEN + 1)]
                internal string szDomain;
/* Not supported on Windows 98.
                internal uint dwSubEntry; 
                internal uint dwCallbackId;
*/ 
            } 

            const int RASCS_PAUSED = 0x1000; 
            const int RASCS_DONE = 0x2000;

            enum RASCONNSTATE {
                RASCS_OpenPort = 0, 
                RASCS_PortOpened,
                RASCS_ConnectDevice, 
                RASCS_DeviceConnected, 
                RASCS_AllDevicesConnected,
                RASCS_Authenticate, 
                RASCS_AuthNotify,
                RASCS_AuthRetry,
                RASCS_AuthCallback,
                RASCS_AuthChangePassword, 
                RASCS_AuthProject,
                RASCS_AuthLinkSpeed, 
                RASCS_AuthAck, 
                RASCS_ReAuthenticate,
                RASCS_Authenticated, 
                RASCS_PrepareForCallback,
                RASCS_WaitForModemReset,
                RASCS_WaitForCallback,
                RASCS_Projected, 
                RASCS_StartAuthentication,    // Windows 95 only
                RASCS_CallbackComplete,       // Windows 95 only 
                RASCS_LogonNetwork,           // Windows 95 only 
                RASCS_SubEntryConnected,
                RASCS_SubEntryDisconnected, 
                RASCS_Interactive = RASCS_PAUSED,
                RASCS_RetryAuthentication,
                RASCS_CallbackSetByCaller,
                RASCS_PasswordExpired, 
                RASCS_InvokeEapUI,
                RASCS_Connected = RASCS_DONE, 
                RASCS_Disconnected 
            }
        } 


        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class SafeNetHandles_SECUR32 { 

            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern int FreeContextBuffer(
                [In] IntPtr contextBuffer); 

            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern int FreeCredentialsHandle( 
                  ref  SSPIHandle handlePtr
                  ); 
 
            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern int DeleteSecurityContext(
                  ref  SSPIHandle handlePtr
                  );
 
            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int AcceptSecurityContext( 
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr, 
                      [In] SecurityBufferDescriptor inputBuffer,
                      [In] ContextFlags     inFlags,
                      [In] Endianness       endianness,
                      ref  SSPIHandle       outContextPtr, 
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes, 
                      out  long timeStamp 
                      );
 
            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal unsafe static extern int QueryContextAttributesA(
                ref SSPIHandle contextHandle, 
                [In] ContextAttribute attribute,
                [In] void* buffer); 
 
            [DllImport(SECUR32, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal unsafe static extern int AcquireCredentialsHandleA( 
                      [In] string principal,
                      [In] string moduleName,
                      [In] int usage,
                      [In] void* logonID, 
                      [In] ref AuthIdentity authdata,
                      [In] void* keyCallback, 
                      [In] void* keyArgument, 
                      ref  SSPIHandle handlePtr,
                      [Out] out long timeStamp 
                      );

            [DllImport(SECUR32, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal unsafe static extern int AcquireCredentialsHandleA( 
                      [In] string principal,
                      [In] string moduleName, 
                      [In] int usage, 
                      [In] void* logonID,
                      [In] IntPtr zero, 
                      [In] void* keyCallback,
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr,
                      [Out] out long timeStamp 
                      );
 
            /* 
            // Consider removing.
            [DllImport(SECUR32, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal unsafe static extern int AcquireCredentialsHandleA(
                      [In] string principal,
                      [In] string moduleName,
                      [In] int usage, 
                      [In] void* logonID,
                      [In] ref SecureCredential authData, 
                      [In] void* keyCallback, 
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr, 
                      [Out] out long timeStamp
                      );
            */
 
            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int InitializeSecurityContextA( 
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr, 
                      [In] byte*            targetName,
                      [In] ContextFlags     inFlags,
                      [In] int              reservedI,
                      [In] Endianness       endianness, 
                      [In] SecurityBufferDescriptor inputBuffer,
                      [In] int              reservedII, 
                      ref  SSPIHandle       outContextPtr, 
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes, 
                      out  long timeStamp
                      );

            [DllImport(SECUR32, ExactSpelling=true, SetLastError=true)] 
            internal static extern int EnumerateSecurityPackagesA(
                [Out] out int pkgnum, 
                [Out] out SafeFreeContextBuffer_SECUR32 handle); 

        } 

        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class SafeNetHandles_SECURITY {
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern int FreeContextBuffer( 
                [In] IntPtr contextBuffer);
 

            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern int FreeCredentialsHandle( 
                  ref  SSPIHandle handlePtr
                  ); 
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern int DeleteSecurityContext(
                  ref  SSPIHandle handlePtr
                  );
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int AcceptSecurityContext( 
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr, 
                      [In] SecurityBufferDescriptor inputBuffer,
                      [In] ContextFlags     inFlags,
                      [In] Endianness       endianness,
                      ref  SSPIHandle       outContextPtr, 
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes, 
                      out  long timeStamp 
                      );
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal unsafe static extern int QueryContextAttributesW(
                ref SSPIHandle contextHandle, 
                [In] ContextAttribute attribute,
                [In] void* buffer); 
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)]
            internal static extern int EnumerateSecurityPackagesW( 
                [Out] out int pkgnum,
                [Out] out SafeFreeContextBuffer_SECURITY handle);

            [DllImport(SECURITY, ExactSpelling=true, CharSet=CharSet.Unicode, SetLastError=true)] 
            internal unsafe static extern int AcquireCredentialsHandleW(
                      [In] string principal, 
                      [In] string moduleName, 
                      [In] int usage,
                      [In] void* logonID, 
                      [In] ref AuthIdentity authdata,
                      [In] void* keyCallback,
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr, 
                      [Out] out long timeStamp
                      ); 
 
            [DllImport(SECURITY, ExactSpelling=true, CharSet=CharSet.Unicode, SetLastError=true)]
            internal unsafe static extern int AcquireCredentialsHandleW( 
                      [In] string principal,
                      [In] string moduleName,
                      [In] int usage,
                      [In] void* logonID, 
                      [In] IntPtr zero,
                      [In] void* keyCallback, 
                      [In] void* keyArgument, 
                      ref  SSPIHandle handlePtr,
                      [Out] out long timeStamp 
                      );

            [DllImport(SECURITY, ExactSpelling=true, CharSet=CharSet.Unicode, SetLastError=true)]
            internal unsafe  static extern int AcquireCredentialsHandleW( 
                      [In] string principal,
                      [In] string moduleName, 
                      [In] int usage, 
                      [In] void* logonID,
                      [In] ref SecureCredential authData, 
                      [In] void* keyCallback,
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr,
                      [Out] out long timeStamp 
                      );
 
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal unsafe static extern int InitializeSecurityContextW( 
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr,
                      [In] byte*            targetName,
                      [In] ContextFlags     inFlags, 
                      [In] int              reservedI,
                      [In] Endianness       endianness, 
                      [In] SecurityBufferDescriptor inputBuffer, 
                      [In] int              reservedII,
                      ref  SSPIHandle       outContextPtr, 
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes,
                      out  long timeStamp
                      ); 

            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int CompleteAuthToken(
                      [In] void*            inContextPtr, 
                      [In, Out] SecurityBufferDescriptor inputBuffers
                      );

        } 

        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal static class SafeNetHandles_SCHANNEL { 

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern int FreeContextBuffer(
                [In] IntPtr contextBuffer);
 

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int QueryContextAttributesA(
                ref SSPIHandle contextHandle, 
                [In] ContextAttribute attribute,
                [In] void* buffer);

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)] 
            internal static extern int EnumerateSecurityPackagesA(
                [Out] out int pkgnum, 
                [Out] out SafeFreeContextBuffer_SCHANNEL handle); 

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal unsafe static extern int InitializeSecurityContextA(
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr, 
                      [In] byte*            targetName,
                      [In] ContextFlags     inFlags, 
                      [In] int              reservedI, 
                      [In] Endianness       endianness,
                      [In] SecurityBufferDescriptor inputBuffer, 
                      [In] int              reservedII,
                      ref  SSPIHandle       outContextPtr,
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes, 
                      out  long timeStamp
                      ); 
 
            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            internal unsafe static extern int AcceptSecurityContext(
                      ref  SSPIHandle       credentialHandle,
                      [In] void*            inContextPtr,
                      [In] SecurityBufferDescriptor inputBuffer, 
                      [In] ContextFlags     inFlags,
                      [In] Endianness       endianness, 
                      ref  SSPIHandle       outContextPtr, 
                      [In, Out] SecurityBufferDescriptor outputBuffer,
                      [In, Out] ref ContextFlags attributes, 
                      out  long timeStamp
                      );

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern int DeleteSecurityContext( 
                  ref  SSPIHandle handlePtr 
                  );
 

            /*
            // Consider removing.
            [DllImport(SCHANNEL, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal unsafe static extern int AcquireCredentialsHandleA(
                      [In] string principal, 
                      [In] string moduleName, 
                      [In] int usage,
                      [In] void* logonID, 
                      [In] ref AuthIdentity authdata,
                      [In] void* keyCallback,
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr, 
                      [Out] out long timeStamp
                      ); 
            */ 

            /* 
            // Consider removing.
            [DllImport(SCHANNEL, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal unsafe static extern int AcquireCredentialsHandleA(
                      [In] string principal, 
                      [In] string moduleName,
                      [In] int usage, 
                      [In] void* logonID, 
                      [In] IntPtr zero,
                      [In] void* keyCallback, 
                      [In] void* keyArgument,
                      ref  SSPIHandle handlePtr,
                      [Out] out long timeStamp
                      ); 
            */
 
            [DllImport(SCHANNEL, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal unsafe static extern int AcquireCredentialsHandleA(
                      [In] string principal, 
                      [In] string moduleName,
                      [In] int usage,
                      [In] void* logonID,
                      [In] ref SecureCredential authData, 
                      [In] void* keyCallback,
                      [In] void* keyArgument, 
                      ref  SSPIHandle handlePtr, 
                      [Out] out long timeStamp
                      ); 

            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern int FreeCredentialsHandle( 
                  ref  SSPIHandle handlePtr
                  ); 
 
        }
 
#endif // !FEATURE_PAL

        // Because the regular SafeNetHandles has a LocalAlloc with a different return type.
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal static class SafeNetHandlesSafeOverlappedFree {
            [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)] 
            internal static extern SafeOverlappedFree LocalAlloc(int uFlags, UIntPtr sizetdwBytes); 
        }
 
#if !FEATURE_PAL
        // Because the regular SafeNetHandles tries to bind this MustRun method on type initialization, failing
        // on legacy platforms.
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal static class SafeNetHandlesXPOrLater {
            [DllImport(WS2_32, ExactSpelling = true, CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true, SetLastError = true)] 
            internal static extern int getaddrinfo( 
                [In] string nodename,
                [In] string servicename, 
                [In] ref AddressInfo hints,
                [Out] out SafeFreeAddrInfo handle
                );
 
            [DllImport(WS2_32, ExactSpelling = true, SetLastError = true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern void freeaddrinfo([In] IntPtr info ); 
        }
#endif 

        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class SafeNetHandles {
 
    #if !FEATURE_PAL
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)] 
            internal static extern int QuerySecurityContextToken(ref SSPIHandle phContext, [Out] out SafeCloseHandle handle); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern unsafe uint HttpCreateHttpHandle(out SafeCloseHandle pReqQueueHandle, uint options);
    #endif

            [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern bool CloseHandle(IntPtr handle); 
 
            [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)]
            internal static extern SafeLocalFree LocalAlloc(int uFlags, UIntPtr sizetdwBytes); 

            [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern IntPtr LocalFree(IntPtr handle); 

#if !FEATURE_PAL 
            [DllImport(KERNEL32, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal static extern unsafe SafeLoadLibrary LoadLibraryExA([In] string lpwLibFileName, [In] void* hFile, [In] uint dwFlags);
 
            [DllImport(KERNEL32, ExactSpelling=true, CharSet=CharSet.Unicode, SetLastError=true)]
            internal static extern unsafe SafeLoadLibrary LoadLibraryExW([In] string lpwLibFileName, [In] void* hFile, [In] uint dwFlags);
#endif // !FEATURE_PAL
 

            [DllImport(KERNEL32, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern unsafe bool FreeLibrary([In] IntPtr hModule);
 
#if !FEATURE_PAL

            /*
            // Consider removing. 
            [DllImport(CRYPT32, ExactSpelling=true, SetLastError=true)]
            internal static extern  bool CertGetCertificateChain( 
                [In] IntPtr                 chainEngine, 
                [In] SafeFreeCertContext    certContext,
                [In] IntPtr                 time, 
                [In] SafeCloseStore         additionalStore,
                [In] ref ChainParameters    certCP,
                [In] int                    flags,
                [In] IntPtr                 reserved, 
                [Out] out SafeFreeCertChain  chainContext);
            */ 
 
            [DllImport(CRYPT32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern void CertFreeCertificateChain(
                [In] IntPtr pChainContext);

            [DllImport(CRYPT32, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern bool CertFreeCertificateContext(      // Suppressing returned status check, it's always==TRUE, 
                [In] IntPtr certContext); 

            /* 
            // Consider removing.
            [DllImport(CRYPT32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern bool CertCloseStore( 
                [In] IntPtr hCertStore,
                [In] int dwFlags); 
            */ 

#endif // !FEATURE_PAL 

            [DllImport(ExternDll.Kernel32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern IntPtr GlobalFree(IntPtr handle); 

            // Blocking call - requires IntPtr instead of SafeCloseSocket. 
            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)] 
            internal static extern SafeCloseSocket.InnerSafeCloseSocket accept(
                                                  [In] IntPtr socketHandle, 
                                                  [Out] byte[] socketAddress,
                                                  [In, Out] ref int socketAddressSize
                                                  );
 
            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] 
            internal static extern SocketError closesocket( 
                                                  [In] IntPtr socketHandle
                                                  ); 

            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern SocketError ioctlsocket( 
                                                [In] IntPtr handle,
                                                [In] int cmd, 
                                                [In, Out] ref int argp 
                                                );
 
            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern SocketError WSAEventSelect(
                                                     [In] IntPtr handle, 
                                                     [In] IntPtr Event,
                                                     [In] AsyncEventBits NetworkEvents 
                                                     ); 

            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern SocketError setsockopt(
                                               [In] IntPtr handle,
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName,
                                               [In] ref Linger linger, 
                                               [In] int optionLength 
                                               );
 
            /* Consider removing
            [DllImport(WS2_32, ExactSpelling=true, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            internal static extern SocketError setsockopt( 
                                               [In] IntPtr handle,
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName, 
                                               [In] ref int optionValue,
                                               [In] int optionLength 
                                               );
            */

#if !FEATURE_PAL 
            [DllImport(WININET, ExactSpelling=true, SetLastError = true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            unsafe internal static extern bool RetrieveUrlCacheEntryFileW( 
                                            [In]      char*     urlName,
                                            [In]      byte*     entryPtr,               //was [Out] 
                                            [In, Out] ref int   entryBufSize,
                                            [In]      int       dwReserved              //must be 0
                                            );
 
            [DllImport(WININET, ExactSpelling=true, SetLastError = true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            unsafe internal static extern bool UnlockUrlCacheEntryFileW( 
                                            [In]    char*       urlName,
                                            [In]    int         dwReserved                  //must be 0 
                                            );
#endif // !FEATURE_PAL
        }
 
        //
        // UnsafeNclNativeMethods.OSSOCK class contains all Unsafe() calls and should all be protected 
        // by the appropriate SocketPermission() to connect/accept to/from remote 
        // peers over the network and to perform name resolution.
        // te following calls deal mainly with: 
        // 1) socket calls
        // 2) DNS calls
        //
 
        //
        // here's a brief explanation of all possible decorations we use for PInvoke. 
        // these are used in such a way that we hope to gain maximum performance from the 
        // unmanaged/managed/unmanaged transition we need to undergo when calling into winsock:
        // 
        // [In] (Note: this is similar to what msdn will show)
        // the managed data will be marshalled so that the unmanaged function can read it but even
        // if it is changed in unmanaged world, the changes won't be propagated to the managed data
        // 
        // [Out] (Note: this is similar to what msdn will show)
        // the managed data will not be marshalled so that the unmanaged function will not see the 
        // managed data, if the data changes in unmanaged world, these changes will be propagated by 
        // the marshaller to the managed data
        // 
        // objects are marshalled differently if they're:
        //
        // 1) structs
        // for structs, by default, the whole layout is pushed on the stack as it is. 
        // in order to pass a pointer to the managed layout, we need to specify either the ref or out keyword.
        // 
        //      a) for IN and OUT: 
        //      [In, Out] ref Struct ([In, Out] is optional here)
        // 
        //      b) for IN only (the managed data will be marshalled so that the unmanaged
        //      function can read it but even if it changes it the change won't be propagated
        //      to the managed struct)
        //      [In] ref Struct 
        //
        //      c) for OUT only (the managed data will not be marshalled so that the 
        //      unmanaged function cannot read, the changes done in unmanaged code will be 
        //      propagated to the managed struct)
        //      [Out] out Struct ([Out] is optional here) 
        //
        // 2) array or classes
        // for array or classes, by default, a pointer to the managed layout is passed.
        // we don't need to specify neither the ref nor the out keyword. 
        //
        //      a) for IN and OUT: 
        //      [In, Out] byte[] 
        //
        //      b) for IN only (the managed data will be marshalled so that the unmanaged 
        //      function can read it but even if it changes it the change won't be propagated
        //      to the managed struct)
        //      [In] byte[] ([In] is optional here)
        // 
        //      c) for OUT only (the managed data will not be marshalled so that the
        //      unmanaged function cannot read, the changes done in unmanaged code will be 
        //      propagated to the managed struct) 
        //      [Out] byte[]
        // 
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class OSSOCK {

#if FEATURE_PAL 
            private const string WS2_32 = ROTOR_PAL;
#else 
            private const string WS2_32 = "ws2_32.dll"; 
            private const string mswsock = "mswsock.dll";
#endif 

            //
            // IPv6 Changes: These are initialized in InitializeSockets - don't set them here or
            //               there will be an ordering problem with the call above that will 
            //               result in both being set to false !
            // 
 
            [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
            internal struct WSAPROTOCOLCHAIN { 
                internal int ChainLen;                                 /* the length of the chain,     */
                [MarshalAs(UnmanagedType.ByValArray, SizeConst=7)]
                internal uint[] ChainEntries;       /* a list of dwCatalogEntryIds */
            } 

            [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] 
            internal struct WSAPROTOCOL_INFO { 
                internal uint dwServiceFlags1;
                internal uint dwServiceFlags2; 
                internal uint dwServiceFlags3;
                internal uint dwServiceFlags4;
                internal uint dwProviderFlags;
                Guid ProviderId; 
                internal uint dwCatalogEntryId;
                WSAPROTOCOLCHAIN ProtocolChain; 
                internal int iVersion; 
                internal AddressFamily iAddressFamily;
                internal int iMaxSockAddr; 
                internal int iMinSockAddr;
                internal int iSocketType;
                internal int iProtocol;
                internal int iProtocolMaxOffset; 
                internal int iNetworkByteOrder;
                internal int iSecurityScheme; 
                internal uint dwMessageSize; 
                internal uint dwProviderReserved;
                [MarshalAs(UnmanagedType.ByValTStr, SizeConst=256)] 
                internal string szProtocol;
            }

            [StructLayout(LayoutKind.Sequential)] 
            internal struct ControlData {
                internal UIntPtr length; 
                internal uint level; 
                internal uint type;
                internal uint address; 
                internal uint index;
            }

            [StructLayout(LayoutKind.Sequential)] 
            internal struct ControlDataIPv6 {
                internal UIntPtr length; 
                internal uint level; 
                internal uint type;
                [MarshalAs(UnmanagedType.ByValArray,SizeConst=16)] 
                internal byte[] address;
                internal uint index;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct WSAMsg { 
                internal IntPtr socketAddress; 
                internal uint addressLength;
                internal IntPtr buffers; 
                internal uint count;
                internal WSABuffer controlBuffer;
                internal SocketFlags flags;
            } 

            // 
            // Flags equivalent to winsock TRANSMIT_PACKETS_ELEMENT flags 
            //    #define TP_ELEMENT_MEMORY   1
            //    #define TP_ELEMENT_FILE     2 
            //    #define TP_ELEMENT_EOP      4
            //
            [Flags]
            internal enum TransmitPacketsElementFlags : uint { 
                None = 0x00,
                Memory = 0x01, 
                File = 0x02, 
                EndOfPacket = 0x04
            } 

            // Structure equivalent to TRANSMIT_PACKETS_ELEMENT
            //
            // typedef struct _TRANSMIT_PACKETS_ELEMENT { 
            //     ULONG dwElFlags;
            //     ULONG cLength; 
            //     union { 
            //         struct {
            //             LARGE_INTEGER nFileOffset; 
            //             HANDLE hFile;
            //         };
            //         PVOID pBuffer;
            //     } 
            //  };
            // } TRANSMIT_PACKETS_ELEMENT; 
            // 
            [StructLayout(LayoutKind.Explicit)]
            internal struct TransmitPacketsElement { 
                [System.Runtime.InteropServices.FieldOffset(0)]
                internal TransmitPacketsElementFlags flags;
                [System.Runtime.InteropServices.FieldOffset(4)]
                internal uint length; 
                [System.Runtime.InteropServices.FieldOffset(8)]
                internal Int64 fileOffset; 
                [System.Runtime.InteropServices.FieldOffset(8)] 
                internal IntPtr buffer;
                [System.Runtime.InteropServices.FieldOffset(16)] 
                internal IntPtr fileHandle;
            }

            /* 
               typedef struct _SOCKET_ADDRESS {
                   PSOCKADDR lpSockaddr; 
                   INT iSockaddrLength; 
               } SOCKET_ADDRESS, *PSOCKET_ADDRESS;			
            */ 
            [StructLayout(LayoutKind.Sequential)]
            internal struct SOCKET_ADDRESS {
                internal IntPtr lpSockAddr;
                internal int iSockaddrLength; 
            }
 
            /* 
               typedef struct _SOCKET_ADDRESS_LIST {
                   INT             iAddressCount; 
                   SOCKET_ADDRESS  Address[1];
               } SOCKET_ADDRESS_LIST, *PSOCKET_ADDRESS_LIST, FAR *LPSOCKET_ADDRESS_LIST;
            */
            [StructLayout(LayoutKind.Sequential)] 
            internal struct SOCKET_ADDRESS_LIST {
                internal int iAddressCount; 
                internal SOCKET_ADDRESS Addresses; 
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct TransmitFileBuffersStruct {
                internal IntPtr preBuffer;// Pointer to Buffer
                internal int preBufferLength; // Length of Buffer 
                internal IntPtr postBuffer;// Pointer to Buffer
                internal int postBufferLength; // Length of Buffer 
            } 

            // CharSet=Auto here since WSASocket has A and W versions. We can use Auto cause the method is not used under constrained execution region 
            [DllImport(WS2_32, CharSet=CharSet.Auto, SetLastError=true)]
            internal static extern SafeCloseSocket.InnerSafeCloseSocket WSASocket(
                                                    [In] AddressFamily addressFamily,
                                                    [In] SocketType socketType, 
                                                    [In] ProtocolType protocolType,
                                                    [In] IntPtr protocolInfo, // will be WSAProtcolInfo protocolInfo once we include QOS APIs 
                                                    [In] uint group, 
                                                    [In] SocketConstructorFlags flags
                                                    ); 

            [DllImport(WS2_32, CharSet=CharSet.Auto, SetLastError=true)]
            internal unsafe static extern SafeCloseSocket.InnerSafeCloseSocket WSASocket(
                                        [In] AddressFamily addressFamily, 
                                        [In] SocketType socketType,
                                        [In] ProtocolType protocolType, 
                                        [In] byte* pinnedBuffer, // will be WSAProtcolInfo protocolInfo once we include QOS APIs 
                                        [In] uint group,
                                        [In] SocketConstructorFlags flags 
                                        );


            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal static extern SocketError WSAStartup(
                                               [In] short wVersionRequested, 
                                               [Out] out WSAData lpWSAData 
                                               );
 
            [DllImport(WS2_32, SetLastError=true)]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal static extern SocketError ioctlsocket(
                                                [In] SafeCloseSocket socketHandle, 
                                                [In] int cmd,
                                                [In, Out] ref int argp 
                                                ); 

            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal static extern IntPtr gethostbyname(
                                                  [In] string host
                                                  );
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern IntPtr gethostbyaddr( 
                                                  [In] ref int addr, 
                                                  [In] int len,
                                                  [In] ProtocolFamily type 
                                                  );

            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal static extern SocketError gethostname( 
                                                [Out] StringBuilder hostName,
                                                [In] int bufferLength 
                                                ); 

            // this should belong to SafeNativeMethods, but it will not for simplicity 
            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal static extern int inet_addr(
                                              [In] string cp
                                              ); 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getpeername( 
                                                [In] SafeCloseSocket socketHandle,
                                                [Out] byte[] socketAddress, 
                                                [In, Out] ref int socketAddressSize
                                                );

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName,
                                               [Out] out int optionValue, 
                                               [In, Out] ref int optionLength
                                               );

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName,
                                               [Out] byte[] optionValue, 
                                               [In, Out] ref int optionLength
                                               );

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName,
                                               [Out] out Linger optionValue, 
                                               [In, Out] ref int optionLength
                                               );

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel, 
                                               [In] SocketOptionName optionName,
                                               [Out] out IPMulticastRequest optionValue, 
                                               [In, Out] ref int optionLength
                                               );

            // 
            // IPv6 Changes: need to receive and IPv6MulticastRequest from getsockopt
            // 
            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError getsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [Out] out IPv6MulticastRequest optionValue,
                                               [In, Out] ref int optionLength 
                                               );
 
            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError setsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [In] ref int optionValue,
                                               [In] int optionLength 
                                               );
 
            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError setsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [In] byte[] optionValue,
                                               [In] int optionLength 
                                               );
 
            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError setsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [In] ref IntPtr pointer,
                                               [In] int optionLength 
                                               );
 
            [DllImport(WS2_32, SetLastError=true)] 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            internal static extern SocketError setsockopt( 
                                               [In] SafeCloseSocket socketHandle,
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [In] ref Linger linger, 
                                               [In] int optionLength
                                               ); 
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError setsockopt( 
                                               [In] SafeCloseSocket socketHandle,
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName,
                                               [In] ref IPMulticastRequest mreq, 
                                               [In] int optionLength
                                               ); 
 
            //
            // IPv6 Changes: need to pass an IPv6MulticastRequest to setsockopt 
            //
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError setsockopt(
                                               [In] SafeCloseSocket socketHandle, 
                                               [In] SocketOptionLevel optionLevel,
                                               [In] SocketOptionName optionName, 
                                               [In] ref IPv6MulticastRequest mreq, 
                                               [In] int optionLength
                                               ); 

#if !FEATURE_PAL
            [DllImport(mswsock, SetLastError=true)]
            internal static extern bool AcceptEx( 
                                      [In] SafeCloseSocket listenSocketHandle,
                                      [In] SafeCloseSocket acceptSocketHandle, 
                                      [In] IntPtr      buffer, 
                                      [In] int         len,
                                      [In] int localAddressLength, 
                                      [In] int remoteAddressLength,
                                      [Out] out int bytesReceived,
                                      [In] IntPtr overlapped
                                      ); 

            [DllImport(mswsock, SetLastError=true)] 
            internal static extern bool TransmitFile( 
                                      [In] SafeCloseSocket socket,
                                      [In] SafeHandle fileHandle, 
                                      [In] int numberOfBytesToWrite,
                                      [In] int numberOfBytesPerSend,
                                      [In] IntPtr overlapped,
                                      [In] TransmitFileBuffers buffers, 
                                      [In] TransmitFileOptions flags
                                      ); 
 
            [DllImport(mswsock, SetLastError = true)]
            internal static extern bool TransmitFile( 
                                      [In] SafeCloseSocket socket,
                                      [In] SafeHandle fileHandle,
                                      [In] int numberOfBytesToWrite,
                                      [In] int numberOfBytesPerSend, 
                                      [In] IntPtr overlapped,
                                      [In] IntPtr buffers, 
                                      [In] TransmitFileOptions flags 
                                      );
 
            [DllImport(mswsock, SetLastError = true)]
            internal static extern bool TransmitFile(
                                      [In] SafeCloseSocket socket,
                                      [In] IntPtr fileHandle, 
                                      [In] int numberOfBytesToWrite,
                                      [In] int numberOfBytesPerSend, 
                                      [In] IntPtr overlapped, 
                                      [In] IntPtr buffers,
                                      [In] TransmitFileOptions flags 
                                      );

            [DllImport(mswsock, SetLastError=true, EntryPoint = "TransmitFile")]
            internal static extern bool TransmitFile2( 
                                      [In] SafeCloseSocket socket,
                                      [In] IntPtr fileHandle, 
                                      [In] int numberOfBytesToWrite, 
                                      [In] int numberOfBytesPerSend,
                                      [In] IntPtr overlapped, 
                                      [In] TransmitFileBuffers buffers,
                                      [In] TransmitFileOptions flags
                                      );
 

            [DllImport(mswsock, SetLastError = true, EntryPoint = "TransmitFile")] 
            internal static extern bool TransmitFile_Blocking( 
                                      [In] IntPtr socket,
                                      [In] SafeHandle fileHandle, 
                                      [In] int numberOfBytesToWrite,
                                      [In] int numberOfBytesPerSend,
                                      [In] IntPtr overlapped,
                                      [In] TransmitFileBuffers buffers, 
                                      [In] TransmitFileOptions flags
                                      ); 
 
            [DllImport(mswsock, SetLastError = true, EntryPoint = "TransmitFile")]
            internal static extern bool TransmitFile_Blocking2( 
                                      [In] IntPtr socket,
                                      [In] IntPtr fileHandle,
                                      [In] int numberOfBytesToWrite,
                                      [In] int numberOfBytesPerSend, 
                                      [In] IntPtr overlapped,
                                      [In] TransmitFileBuffers buffers, 
                                      [In] TransmitFileOptions flags 
                                      );
 
            [DllImport(mswsock, SetLastError = true)]
            internal static extern void GetAcceptExSockaddrs(
                                    [In] IntPtr       buffer,
                                    [In] int receiveDataLength, 
                                    [In] int localAddressLength,
                                    [In] int remoteAddressLength, 
                                    [Out] out IntPtr localSocketAddress, 
                                    [Out] out int localSocketAddressLength,
                                    [Out] out IntPtr remoteSocketAddress, 
                                    [Out] out int remoteSocketAddressLength
                                    );

#endif // !FEATURE_PAL 

            // This method is always blocking, so it uses an IntPtr. 
            [DllImport(WS2_32, SetLastError = true)] 
            internal unsafe static extern int send(
                                         [In] IntPtr      socketHandle, 
                                         [In] byte*       pinnedBuffer,
                                         [In] int         len,
                                         [In] SocketFlags socketFlags
                                         ); 

            // This method is always blocking, so it uses an IntPtr. 
            [DllImport(WS2_32, SetLastError = true)] 
            internal unsafe static extern int recv(
                                         [In] IntPtr      socketHandle, 
                                         [In] byte*       pinnedBuffer,
                                         [In] int         len,
                                         [In] SocketFlags socketFlags
                                         ); 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError listen( 
                                           [In] SafeCloseSocket socketHandle,
                                           [In] int backlog 
                                           );

            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError bind( 
                                         [In] SafeCloseSocket socketHandle,
                                         [In] byte[] socketAddress, 
                                         [In] int socketAddressSize 
                                         );
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError shutdown(
                                             [In] SafeCloseSocket socketHandle,
                                             [In] int how 
                                             );
 
            // This method is always blocking, so it uses an IntPtr. 
            [DllImport(WS2_32, SetLastError = true)]
            internal unsafe static extern int sendto( 
                                           [In] IntPtr      socketHandle,
                                           [In] byte*       pinnedBuffer,
                                           [In] int         len,
                                           [In] SocketFlags socketFlags, 
                                           [In] byte[]      socketAddress,
                                           [In] int         socketAddressSize 
                                           ); 

            // This method is always blocking, so it uses an IntPtr. 
            [DllImport(WS2_32, SetLastError = true)]
            internal unsafe static extern int recvfrom(
                                             [In] IntPtr        socketHandle,
                                             [In] byte*         pinnedBuffer, 
                                             [In] int           len,
                                             [In] SocketFlags   socketFlags, 
                                             [Out] byte[]       socketAddress, 
                                             [In, Out] ref int  socketAddressSize
                                             ); 

            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError getsockname(
                                                [In] SafeCloseSocket socketHandle, 
                                                [Out] byte[] socketAddress,
                                                [In, Out] ref int socketAddressSize 
                                                ); 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern int select(
                                           [In] int ignoredParameter,
                                           [In, Out] IntPtr[] readfds,
                                           [In, Out] IntPtr[] writefds, 
                                           [In, Out] IntPtr[] exceptfds,
                                           [In] ref TimeValue timeout 
                                           ); 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern int select(
                                           [In] int ignoredParameter,
                                           [In, Out] IntPtr[] readfds,
                                           [In, Out] IntPtr[] writefds, 
                                           [In, Out] IntPtr[] exceptfds,
                                           [In] IntPtr nullTimeout 
                                           ); 

            // This function is always potentially blocking so it uses an IntPtr. 
            [DllImport(WS2_32, SetLastError = true)]
            internal static extern SocketError WSAConnect(
                                              [In] IntPtr socketHandle,
                                              [In] byte[] socketAddress, 
                                              [In] int    socketAddressSize,
                                              [In] IntPtr inBuffer, 
                                              [In] IntPtr outBuffer, 
                                              [In] IntPtr sQOS,
                                              [In] IntPtr gQOS 
                                              );


            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError WSASend(
                                              [In] SafeCloseSocket socketHandle, 
                                              [In] ref WSABuffer buffer, 
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred, 
                                              [In] SocketFlags socketFlags,
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine
                                              ); 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError WSASend( 
                                              [In] SafeCloseSocket socketHandle,
                                              [In] WSABuffer[] buffersArray, 
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred,
                                              [In] SocketFlags socketFlags,
                                              [In] IntPtr overlapped, 
                                              [In] IntPtr completionRoutine
                                              ); 
 
            [DllImport(WS2_32, SetLastError = true)]
            internal static extern SocketError WSASend( 
                                              [In] SafeCloseSocket socketHandle,
                                              [In] IntPtr buffers,
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred, 
                                              [In] SocketFlags socketFlags,
                                              [In] IntPtr overlapped, 
                                              [In] IntPtr completionRoutine 
                                              );
            /* Consider removing 
            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSASend")]
            internal static extern SocketError WSASend_Blocking(
                                              [In] IntPtr socketHandle,
                                              [In] ref WSABuffer buffer, 
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred, 
                                              [In] SocketFlags socketFlags, 
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine 
                                              );
            */

            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSASend")] 
            internal static extern SocketError WSASend_Blocking(
                                              [In] IntPtr socketHandle, 
                                              [In] WSABuffer[] buffersArray, 
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred, 
                                              [In] SocketFlags socketFlags,
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine
                                              ); 

            [DllImport(WS2_32, SetLastError = true)] 
            internal static extern SocketError WSASendTo( 
                                                [In] SafeCloseSocket socketHandle,
                                                [In] ref WSABuffer buffer, 
                                                [In] int bufferCount,
                                                [Out] out int bytesTransferred,
                                                [In] SocketFlags socketFlags,
                                                [In] IntPtr socketAddress, 
                                                [In] int socketAddressSize,
                                                [In] IntPtr overlapped, 
                                                [In] IntPtr completionRoutine 
                                                );
 
            [DllImport(WS2_32, SetLastError = true)]
            internal static extern SocketError WSASendTo(
                                                [In] SafeCloseSocket socketHandle,
                                                [In] WSABuffer[] buffersArray, 
                                                [In] int bufferCount,
                                                [Out] out int bytesTransferred, 
                                                [In] SocketFlags socketFlags, 
                                                [In] IntPtr socketAddress,
                                                [In] int socketAddressSize, 
                                                [In] IntPtr overlapped,
                                                [In] IntPtr completionRoutine
                                                );
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError WSARecv( 
                                              [In] SafeCloseSocket socketHandle, 
                                              [In, Out] ref WSABuffer buffer,
                                              [In] int bufferCount, 
                                              [Out] out int bytesTransferred,
                                              [In, Out] ref SocketFlags socketFlags,
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine 
                                              );
 
            [DllImport(WS2_32, SetLastError = true)] 
            internal static extern SocketError WSARecv(
                                              [In] SafeCloseSocket socketHandle, 
                                              [In, Out] WSABuffer[] buffers,
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred,
                                              [In, Out] ref SocketFlags socketFlags, 
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine 
                                              ); 

            [DllImport(WS2_32, SetLastError = true)] 
            internal static extern SocketError WSARecv(
                                              [In] SafeCloseSocket socketHandle,
                                              [In] IntPtr buffers,
                                              [In] int bufferCount, 
                                              [Out] out int bytesTransferred,
                                              [In, Out] ref SocketFlags socketFlags, 
                                              [In] IntPtr overlapped, 
                                              [In] IntPtr completionRoutine
                                              ); 

            /* Consider removing
            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSARecv")]
            internal static extern SocketError WSARecv_Blocking( 
                                              [In] IntPtr socketHandle,
                                              [In, Out] ref WSABuffer buffer, 
                                              [In] int bufferCount, 
                                              [Out] out int bytesTransferred,
                                              [In, Out] ref SocketFlags socketFlags, 
                                              [In] IntPtr overlapped,
                                              [In] IntPtr completionRoutine
                                              );
            */ 

            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSARecv")] 
            internal static extern SocketError WSARecv_Blocking( 
                                              [In] IntPtr socketHandle,
                                              [In, Out] WSABuffer[] buffers, 
                                              [In] int bufferCount,
                                              [Out] out int bytesTransferred,
                                              [In, Out] ref SocketFlags socketFlags,
                                              [In] IntPtr overlapped, 
                                              [In] IntPtr completionRoutine
                                              ); 
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError WSARecvFrom( 
                                                  [In] SafeCloseSocket socketHandle,
                                                  [In, Out] ref WSABuffer buffer,
                                                  [In] int bufferCount,
                                                  [Out] out int bytesTransferred, 
                                                  [In, Out] ref SocketFlags socketFlags,
                                                  [In] IntPtr socketAddressPointer, 
                                                  [In] IntPtr socketAddressSizePointer, 
                                                  [In] IntPtr overlapped,
                                                  [In] IntPtr completionRoutine 
                                                  );

            [DllImport(WS2_32, SetLastError = true)]
            internal static extern SocketError WSARecvFrom( 
                                                  [In] SafeCloseSocket socketHandle,
                                                  [In, Out] WSABuffer[] buffers, 
                                                  [In] int bufferCount, 
                                                  [Out] out int bytesTransferred,
                                                  [In, Out] ref SocketFlags socketFlags, 
                                                  [In] IntPtr socketAddressPointer,
                                                  [In] IntPtr socketAddressSizePointer,
                                                  [In] IntPtr overlapped,
                                                  [In] IntPtr completionRoutine 
                                                  );
 
            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern SocketError WSAEventSelect(
                                                     [In] SafeCloseSocket socketHandle, 
                                                     [In] SafeHandle Event,
                                                     [In] AsyncEventBits NetworkEvents
                                                     );
 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError WSAEventSelect( 
                                         [In] SafeCloseSocket socketHandle, 
                                         [In] IntPtr Event,
                                         [In] AsyncEventBits NetworkEvents 
                                         );


            // Used with SIOGETEXTENSIONFUNCTIONPOINTER - we're assuming that will never block. 
            [DllImport(WS2_32, SetLastError=true)]
            internal static extern SocketError WSAIoctl( 
                                                [In] SafeCloseSocket socketHandle, 
                                                [In] int ioControlCode,
                                                [In,Out] ref Guid guid, 
                                                [In] int guidSize,
                                                [Out] out IntPtr funcPtr,
                                                [In]  int funcPtrSize,
                                                [Out] out int bytesTransferred, 
                                                [In] IntPtr shouldBeNull,
                                                [In] IntPtr shouldBeNull2 
                                                ); 

            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSAIoctl")] 
            internal static extern SocketError WSAIoctl_Blocking(
                                                [In] IntPtr socketHandle,
                                                [In] int ioControlCode,
                                                [In] byte[] inBuffer, 
                                                [In] int inBufferSize,
                                                [Out] byte[] outBuffer, 
                                                [In] int outBufferSize, 
                                                [Out] out int bytesTransferred,
                                                [In] IntPtr overlapped, 
                                                [In] IntPtr completionRoutine
                                                );

            [DllImport(WS2_32, SetLastError = true, EntryPoint = "WSAIoctl")] 
            internal static extern SocketError WSAIoctl_Blocking_Internal(
                                                [In]  IntPtr socketHandle, 
                                                [In]  uint ioControlCode, 
                                                [In]  IntPtr inBuffer,
                                                [In]  int inBufferSize, 
                                                [Out] IntPtr outBuffer,
                                                [In]  int outBufferSize,
                                                [Out] out int bytesTransferred,
                                                [In]  IntPtr overlapped, 
                                                [In]  IntPtr completionRoutine
                                                );			 
 
            [DllImport(WS2_32,SetLastError=true)]
            internal static extern SocketError WSAEnumNetworkEvents( 
                                                     [In] SafeCloseSocket socketHandle,
                                                     [In] SafeWaitHandle Event,
                                                     [In, Out] ref NetworkEvents networkEvents
                                                     ); 

#if !FEATURE_PAL 
            [DllImport(WS2_32, SetLastError=true)] 
            internal unsafe static extern int WSADuplicateSocket(
                [In] SafeCloseSocket socketHandle, 
                [In] uint targetProcessID,
                [In] byte* pinnedBuffer
            );
#endif // !FEATURE_PAL 

            [DllImport(WS2_32, SetLastError=true)] 
            internal static extern bool WSAGetOverlappedResult( 
                                                     [In] SafeCloseSocket socketHandle,
                                                     [In] IntPtr overlapped, 
                                                     [Out] out uint bytesTransferred,
                                                     [In] bool wait,
                                                     [Out] out SocketFlags socketFlags
                                                     ); 
#if !FEATURE_PAL
            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal static extern SocketError WSAStringToAddress( 
                [In] string addressString,
                [In] AddressFamily addressFamily, 
                [In] IntPtr lpProtocolInfo, // always passing in a 0
                [Out] byte[] socketAddress,
                [In, Out] ref int socketAddressSize );
 
            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal static extern SocketError WSAAddressToString( 
                [In] byte[] socketAddress, 
                [In] int socketAddressSize,
                [In] IntPtr lpProtocolInfo,// always passing in a 0 
                [Out]StringBuilder addressString,
                [In, Out] ref int addressStringLength);

            [DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)] 
            internal static extern SocketError getnameinfo(
                [In]         byte[]        sa, 
                [In]         int           salen, 
                [In,Out]     StringBuilder host,
                [In]         int           hostlen, 
                [In,Out]     StringBuilder serv,
                [In]         int           servlen,
                [In]         int           flags);
 
            //if we change this back to auto, we also have to change
            //WSAPROTOCOL_INFO and WSAPROTOCOLCHAIN 
            [DllImport(WS2_32, SetLastError=true, CharSet=CharSet.Auto, ExactSpelling=false)] 
            internal static extern int WSAEnumProtocols(
                                                        [MarshalAs(UnmanagedType.LPArray)] 
                                                        [In] int[]     lpiProtocols,
                                                        [In] SafeLocalFree lpProtocolBuffer,
                                                        [In][Out] ref uint lpdwBufferLength
                                                       ); 
#if SOCKETTHREADPOOL
            [DllImport("kernel32.dll", SetLastError = true)] 
            public static extern bool BindIoCompletionCallback( 
                SafeCloseSocket socketHandle,
                IOCompletionCallback function, 
                Int32 flags
            );

            [DllImport("kernel32.dll", SetLastError = true)] 
            public static extern IntPtr CreateIoCompletionPort(
                SafeCloseSocket socketHandle, 
                IntPtr ExistingCompletionPort, 
                Int32 CompletionKey,
                Int32 NumberOfConcurrentThreads 
            );

            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern IntPtr CreateIoCompletionPort( 
                SafeHandle Handle,
                IntPtr ExistingCompletionPort, 
                Int32 CompletionKey, 
                Int32 NumberOfConcurrentThreads
            ); 
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern IntPtr CreateIoCompletionPort(
                IntPtr Handle,
                IntPtr ExistingCompletionPort, 
                Int32 CompletionKey,
                Int32 NumberOfConcurrentThreads 
            ); 

            [DllImport("kernel32.dll", SetLastError = true)] 
            public static extern unsafe bool GetQueuedCompletionStatus(
              IntPtr CompletionPort,
              out UInt32 lpNumberOfBytes,
              out Int32 lpCompletionKey, 
              out NativeOverlapped* lpOverlapped,
              Int32 dwMilliseconds 
            ); 

            [DllImport("kernel32.dll", SetLastError = true)] 
            public static extern bool PostQueuedCompletionStatus(
                IntPtr CompletionPort,
                Int32 dwNumberOfBytesTransferred,
                IntPtr dwCompletionKey, 
                IntPtr dwZero
            ); 
#endif // SOCKETTHREADPOOL 
#endif // !FEATURE_PAL
 
        }; // class UnsafeNclNativeMethods.OSSOCK

#if !FEATURE_PAL
        // 
        // UnsafeNclNativeMethods.NativePKI class contains methods
        // imported from crypt32.dll. 
        // They deal mainly with certificates handling when doing https:// 
        //
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal static class NativePKI {

            private const string CRYPT32 = "crypt32.dll";
 
            [DllImport(CRYPT32, ExactSpelling=true, SetLastError=true)]
            internal static extern  int CertVerifyCertificateChainPolicy( 
                [In] IntPtr                     policy, 
                [In] SafeFreeCertChain          chainContext,
                [In] ref ChainPolicyParameter   cpp, 
                [In, Out] ref ChainPolicyStatus ps);


        }; // class UnsafeNclNativeMethods.NativePKI 

        // 
        // We need to import the same interface from 3 different DLLs, 
        //  Security.dll, Secur32.dll, and Schannel.Dll.
        //  Secur32.dll and Schannel.dll are for Win9x. 
        //  Security.dll is for NT platforms.
        //
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class NativeNTSSPI { 

            private const string SECURITY = "security.dll"; 
 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)] 
            internal static extern int EncryptMessage(
                  ref SSPIHandle contextHandle,
                  [In] uint qualityOfProtection,
                  [In, Out] SecurityBufferDescriptor inputOutput, 
                  [In] uint sequenceNumber
                  ); 
 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
            [DllImport(SECURITY, ExactSpelling=true, SetLastError=true)] 
            internal static unsafe extern int DecryptMessage(
                  [In] ref SSPIHandle contextHandle,
                  [In, Out] SecurityBufferDescriptor inputOutput,
                  [In] uint sequenceNumber, 
                       uint *qualityOfProtection
                  ); 
 
        }; // class UnsafeNclNativeMethods.NativeNTSSPI
 
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()]
        internal static class NativeSSLWin9xSSPI {

            private const string SCHANNEL = "schannel.dll"; 
            private const string SECUR32  = "secur32.dll";
 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)]
            internal static extern int SealMessage( 
                  ref SSPIHandle contextHandle,
                  [In] uint qualityOfProtection,
                  [In, Out] SecurityBufferDescriptor inputOutput,
                  [In] uint sequenceNumber 
                  );
 
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
            [DllImport(SCHANNEL, ExactSpelling=true, SetLastError=true)]
            internal static extern int UnsealMessage( 
                  [In] ref SSPIHandle contextHandle,
                  [In, Out] SecurityBufferDescriptor inputOutput,
                  [In] IntPtr   qualityOfProtection,     //should be null or change the type to be ref long
                  [In] uint sequenceNumber 
                  );
 
        } // class UnsafeNclNativeMethods.NativeSSLWin9xSSPI 

 
        //
        // A few things for AutoDetect
        //
        internal const uint AUTO_DETECT_TYPE_DHCP  = 1; 
        internal const uint AUTO_DETECT_TYPE_DNS_A = 2;
 
        // WININET.dll - 
        //  this is the main DLL used by Internet Explorer for creating and handling Network
        //      connections, we need to load it and call it for auto-proxy detection.  Avoid loading this dll! 
        //
        [SuppressUnmanagedCodeSecurity]
        internal static class WinInet
        { 
            [DllImport(WININET, ExactSpelling=true, CharSet=CharSet.Ansi, BestFitMapping=false, ThrowOnUnmappableChar=true, SetLastError=true)]
            internal static extern bool DetectAutoProxyUrl( 
                [Out] StringBuilder autoProxyUrl, 
                [In] int autoProxyUrlLength,
                [In] int detectFlags 
                );
        }

        // The replacement for WinInet, WinHttp is preferred where it's available.  We require version 5.1. 
        [SuppressUnmanagedCodeSecurity]
        internal static class WinHttp 
        { 
            [DllImport(WINHTTP, ExactSpelling=true, SetLastError=true)]
            internal static extern bool WinHttpDetectAutoProxyConfigUrl(uint autoDetectFlags, out SafeGlobalFree autoConfigUrl); 
        }


        // 
        // Caching (must use WinInet to cache).
        // 
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal static class UnsafeWinInetCache {
            public  const int    MAX_PATH = 260; 

            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)]
            internal static extern bool CreateUrlCacheEntryW(
                                            [In]  string        urlName, 
                                            [In]  int           expectedFileSize,
                                            [In]  string        fileExtension, 
                                            [Out] System.Text.StringBuilder fileName, 
                                            [In]  int           dwReserved
        ); 

            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)]
            unsafe internal static extern bool CommitUrlCacheEntryW(
                                            [In] string                 urlName, 
                                            [In] string                 localFileName,
                                            [In] _WinInetCache.FILETIME  expireTime, 
                                            [In] _WinInetCache.FILETIME  lastModifiedTime, 
                                            [In] _WinInetCache.EntryType EntryType,
                                            [In] byte*                  headerInfo, 
                                            [In] int                    headerSizeTChars,
                                            [In] string                 fileExtension,
                                            [In] string                 originalUrl
        ); 

            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)] 
            unsafe internal static extern bool GetUrlCacheEntryInfoW( 
                                            [In]      string    urlName,
                                            [In]      byte*     entryPtr,                       //was [Out] 
                                            [In, Out] ref int   bufferSz
                                            );

            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)] 
            unsafe internal static extern bool SetUrlCacheEntryInfoW(
                                            [In] string                 lpszUrlName, 
                                            [In] byte*                  EntryPtr, 
                                            [In] _WinInetCache.Entry_FC  fieldControl
                                            ); 

            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)]
            internal static extern bool DeleteUrlCacheEntryW( [In] string urlName);
 
            [DllImport(WININET, CharSet = CharSet.Unicode, ExactSpelling=true, SetLastError = true)]
            internal static extern bool UnlockUrlCacheEntryFileW( 
                                            [In] string     urlName, 
                                            [In] int        dwReserved                  //must be 0
                                            ); 

    /*********
    NOT USED SO FAR
            unsafe private extern static SafeUnlockUrlCacheEntryStream RetrieveUrlCacheEntryStream( 
                                            [In]      string    urlName,
                                            [In]      byte*     entryPtr,               //was [Out] 
                                            [In, Out] ref int   entryBufSize, 
                                            [In]      bool      randomRead,
                                            [In]      int       dwReserved 
                                            );

            unsafe internal static extern bool ReadUrlCacheEntryStream(
                                            [In]      SafeUnlockUrlCacheEntryStream  urlCacheStream, 
                                            [In]      int       offset,
                                            [In]      byte*     bufferPtr, 
                                            [In, Out] ref int   bufferSz, 
                                            [In]      int       dwReserved                      //must be 0
                                            ); 

            internal static extern bool UnlockUrlCacheEntryStream(
                                    [In] IntPtr         urlCacheStream,
                                    [In] int            dwReserved                      //mustbe 0 
                                    );
 
            unsafe internal static extern bool GetUrlCacheEntryInfoEx( 
                                    [In]      string    url,
                                    [In]      byte*     entryPtr,                       //was [Out] 
                                    [In, Out] ref int   entryBufSize,
                                    [In]      IntPtr    lpszReserved,                   //was[Out] must pass null
                                    [In]      IntPtr    lpdwReserved,                   //was[In, Out] must pass null
                                    [In]      IntPtr    lpReserved,                     //must pass null 
                                    [In]      int       dwFlags                         //reserved must be 0
                                    ); 
 
            internal static extern IntPtr  FindFirstUrlCacheGroup(
                                    [In]  _WinInetCache.GroupFlag     flags, 
                                    [In]  _WinInetCache.GroupSrchType searchFilter,
                                    [In]  IntPtr                     searchConditionPtr, //must be null
                                    [In]  int                        searchConditionSz,  //must be 0
                                    [Out] out WinInet.GroupId        groupId, 
                                    [In]  IntPtr                     lpReserved          //was [In,Out] must be IntPtr.Zero
                                    ); 
 
            internal static extern bool FindNextUrlCacheGroup(
                                    [In]  IntPtr                    hFind, 
                                    [Out] out _WinInetCache.GroupId  groupId,
                                    [In]  IntPtr                    lpReserved          //was [In,Out] must be IntPtr.Zero
                                    );
 
            internal static extern bool GetUrlCacheGroupAttribute(
                                    [In]   _WinInetCache.GroupId     groupId, 
                                    [In]   int                      flags,              //must 0 
                                    [In]   _WinInetCache.GroupAttr   attr,
                                    [Out] out _WinInetCache.GroupInfo groupInfo, 
                                    [In, Out] ref int               groupInfoSize,
                                    [In]  IntPtr                    lpReserved          //was [In,Out] must be IntPtr.Zero
                                    );
 
            internal static extern bool SetUrlCacheGroupAttribute(
                                    [In]  _WinInetCache.GroupId      groupId, 
                                    [In]  int                       flags,              //must be 0 
                                    [In]  _WinInetCache.GroupAttr    attr,
                                    [In]  _WinInetCache.GroupInfo    groupInfo, 
                                    [In]  IntPtr                    lpReserved          //was [In,Out] must be IntPtr.Zero
                                    );

            internal static extern WinInet.GroupId CreateUrlCacheGroup( 
                                    [In]  _WinInetCache.GroupFlag    flags,
                                    [In]  IntPtr                    lpReserved          //must be IntPtr.Zero 
                                    ); 

            internal static extern bool DeleteUrlCacheGroup( 
                                    [In]  _WinInetCache.GroupId      groupId,
                                    [In]  _WinInetCache.GroupFlag    flags,
                                    [In]  IntPtr                    lpReserved          //must be IntPtr.Zero
                                    ); 

 
            internal static extern bool SetUrlCacheEntryGroup( 
                                    [In] string                     urlName,
                                    [In] _WinInetCache.GroupSetFlag  flags, 
                                    [In] _WinInetCache.GroupId       groupId,
                                    [In] IntPtr                     groupAttributes,    // must pass NULL
                                    [In] int                        groupAttrCount,     // must pass 0
                                    [In] IntPtr                     lpReserved          // must pass NULL 
                                    );
 
            unsafe internal static extern IntPtr FindFirstUrlCacheEntryEx( 
                                    [In]      byte*             searchPattern,      //must be null
                                    [In]      int               dwFlags,            //must be 0 
                                    [In]      CacheEntry.EntryType srchFilter,
                                    [In]      WinInet.GroupId   groupId,
                                    [In]      byte*             entryPtr,           //was [out]
                                    [In, Out] ref int           entryBufSize, 
                                    [Out]     void*             lpReserved,         // must pass NULL
                                    [In]      void*             lpReserved2,        //was [In,Out] must be IntPtr.Zero 
                                    [In]      void*             lpReserved3         // must pass NULL 
                                    );
 
            unsafe internal static extern bool FindNextUrlCacheEntryEx(
                                    [In]     IntPtr             enumHandle,
                                    [In]     byte*              entryPtr,           //was [Out]
                                    [In, Out]ref int            entryBufSize, 
                                    [In]     void*              lpReserved,         // [Out] must pass NULL
                                    [In]     void*              lpReserved2,        // [In] [Out] must pass NULL 
                                    [In]     void*              lpReserved3         // must pass NULL 
                                    );
 
            unsafe internal static extern IntPtr FindFirstUrlCacheEntry(
                                    [In]     string             searchPattern,
                                    [In]     byte*              entryPtr,           //was [Out]
                                    [In, Out]ref int            entryBufSize 
                                    );
 
 
            unsafe internal static extern bool FindNextUrlCacheEntry(
                                    [In]     IntPtr             enumHandle, 
                                    [In]     byte*              entryPtr,           //was [Out]
                                    [In, Out]ref int            entryBufSize
                                    );
 
            internal static extern bool FindCloseUrlCache( [In] IntPtr enumHandle);
 
    /**********/ 
        }
 
#endif // !FEATURE_PAL

#if !FEATURE_PAL
        [System.Security.SuppressUnmanagedCodeSecurityAttribute()] 
        internal unsafe class HttpApi {
 
            private HttpApi() { 
            }
 
            private const string HTTPAPI = "httpapi.dll";

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)]
            internal static extern uint HttpInitialize(HTTPAPI_VERSION Version, uint Flags, void* Reserved); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpReceiveRequestEntityBody(SafeCloseHandle RequestQueueHandle, ulong RequestId, uint Flags, void* pEntityBuffer, uint EntityBufferLength, uint* pBytesReturned, NativeOverlapped* pOverlapped); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpReceiveClientCertificate(SafeCloseHandle RequestQueueHandle, ulong ConnectionId, uint Flags, HTTP_SSL_CLIENT_CERT_INFO* pSslClientCertInfo, uint SslClientCertInfoSize, uint* pBytesReceived, NativeOverlapped* pOverlapped);

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)]
            internal static extern uint HttpReceiveHttpRequest(SafeCloseHandle RequestQueueHandle, ulong RequestId, uint Flags, HTTP_REQUEST* pRequestBuffer, uint RequestBufferLength, uint* pBytesReturned, NativeOverlapped* pOverlapped); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpAddUrl(SafeCloseHandle RequestQueueHandle, ushort* pFullyQualifiedUrl, void* pReserved); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpRemoveUrl(SafeCloseHandle RequestQueueHandle, ushort* pFullyQualifiedUrl);

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)]
            internal static extern uint HttpSendHttpResponse(SafeCloseHandle RequestQueueHandle, ulong RequestId, uint Flags, HTTP_RESPONSE* pHttpResponse, void* pCachePolicy, uint* pBytesSent, SafeLocalFree pRequestBuffer, uint RequestBufferLength, NativeOverlapped* pOverlapped, void* pLogData); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpSendResponseEntityBody(SafeCloseHandle RequestQueueHandle, ulong RequestId, uint Flags, ushort EntityChunkCount, HTTP_DATA_CHUNK* pEntityChunks, uint* pBytesSent, SafeLocalFree pRequestBuffer, uint RequestBufferLength, NativeOverlapped* pOverlapped, void* pLogData); 

            [DllImport(HTTPAPI, ExactSpelling=true, CallingConvention=CallingConvention.StdCall, SetLastError=true)] 
            internal static extern uint HttpWaitForDisconnect(SafeCloseHandle RequestQueueHandle, ulong ConnectionId, NativeOverlapped* pOverlapped);

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_VERSION { 
                internal ushort MajorVersion;
                internal ushort MinorVersion; 
            } 

            [StructLayout(LayoutKind.Sequential)] 
            internal struct HTTP_KNOWN_HEADER {
                internal ushort RawValueLength;
                internal sbyte* pRawValue;
            } 

            [StructLayout(LayoutKind.Sequential, Size=32)] 
            internal struct HTTP_DATA_CHUNK { 
                internal HTTP_DATA_CHUNK_TYPE DataChunkType;
                internal uint p0; 
                internal byte* pBuffer;
                internal uint BufferLength;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTPAPI_VERSION { 
                internal ushort HttpApiMajorVersion; 
                internal ushort HttpApiMinorVersion;
            } 

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_COOKED_URL {
                internal ushort FullUrlLength; 
                internal ushort HostLength;
                internal ushort AbsPathLength; 
                internal ushort QueryStringLength; 
                internal ushort* pFullUrl;
                internal ushort* pHost; 
                internal ushort* pAbsPath;
                internal ushort* pQueryString;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct SOCKADDR { 
                internal ushort sa_family; 
                internal byte sa_data;
                internal byte sa_data_02; 
                internal byte sa_data_03;
                internal byte sa_data_04;
                internal byte sa_data_05;
                internal byte sa_data_06; 
                internal byte sa_data_07;
                internal byte sa_data_08; 
                internal byte sa_data_09; 
                internal byte sa_data_10;
                internal byte sa_data_11; 
                internal byte sa_data_12;
                internal byte sa_data_13;
                internal byte sa_data_14;
            } 

            [StructLayout(LayoutKind.Sequential)] 
            internal struct HTTP_TRANSPORT_ADDRESS { 
                internal SOCKADDR* pRemoteAddress;
                internal SOCKADDR* pLocalAddress; 
            }

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_SSL_CLIENT_CERT_INFO { 
                internal uint CertFlags;
                internal uint CertEncodedSize; 
                internal byte* pCertEncoded; 
                internal void* Token;
                internal byte CertDeniedByMapper; 
            }

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_UNKNOWN_HEADER { 
                internal ushort NameLength;
                internal ushort RawValueLength; 
                internal sbyte* pName; 
                internal sbyte* pRawValue;
            } 

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_SSL_INFO {
                internal ushort ServerCertKeySize; 
                internal ushort ConnectionKeySize;
                internal uint ServerCertIssuerSize; 
                internal uint ServerCertSubjectSize; 
                internal sbyte* pServerCertIssuer;
                internal sbyte* pServerCertSubject; 
                internal HTTP_SSL_CLIENT_CERT_INFO* pClientCertInfo;
                internal uint SslClientCertNegotiated;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_RESPONSE_HEADERS { 
                internal ushort UnknownHeaderCount; 
                internal HTTP_UNKNOWN_HEADER* pUnknownHeaders;
                internal ushort TrailerCount; 
                internal HTTP_UNKNOWN_HEADER* pTrailers;
                internal HTTP_KNOWN_HEADER KnownHeaders;
                internal HTTP_KNOWN_HEADER KnownHeaders_02;
                internal HTTP_KNOWN_HEADER KnownHeaders_03; 
                internal HTTP_KNOWN_HEADER KnownHeaders_04;
                internal HTTP_KNOWN_HEADER KnownHeaders_05; 
                internal HTTP_KNOWN_HEADER KnownHeaders_06; 
                internal HTTP_KNOWN_HEADER KnownHeaders_07;
                internal HTTP_KNOWN_HEADER KnownHeaders_08; 
                internal HTTP_KNOWN_HEADER KnownHeaders_09;
                internal HTTP_KNOWN_HEADER KnownHeaders_10;
                internal HTTP_KNOWN_HEADER KnownHeaders_11;
                internal HTTP_KNOWN_HEADER KnownHeaders_12; 
                internal HTTP_KNOWN_HEADER KnownHeaders_13;
                internal HTTP_KNOWN_HEADER KnownHeaders_14; 
                internal HTTP_KNOWN_HEADER KnownHeaders_15; 
                internal HTTP_KNOWN_HEADER KnownHeaders_16;
                internal HTTP_KNOWN_HEADER KnownHeaders_17; 
                internal HTTP_KNOWN_HEADER KnownHeaders_18;
                internal HTTP_KNOWN_HEADER KnownHeaders_19;
                internal HTTP_KNOWN_HEADER KnownHeaders_20;
                internal HTTP_KNOWN_HEADER KnownHeaders_21; 
                internal HTTP_KNOWN_HEADER KnownHeaders_22;
                internal HTTP_KNOWN_HEADER KnownHeaders_23; 
                internal HTTP_KNOWN_HEADER KnownHeaders_24; 
                internal HTTP_KNOWN_HEADER KnownHeaders_25;
                internal HTTP_KNOWN_HEADER KnownHeaders_26; 
                internal HTTP_KNOWN_HEADER KnownHeaders_27;
                internal HTTP_KNOWN_HEADER KnownHeaders_28;
                internal HTTP_KNOWN_HEADER KnownHeaders_29;
                internal HTTP_KNOWN_HEADER KnownHeaders_30; 
            }
 
            [StructLayout(LayoutKind.Sequential)] 
            internal struct HTTP_REQUEST_HEADERS {
                internal ushort UnknownHeaderCount; 
                internal HTTP_UNKNOWN_HEADER* pUnknownHeaders;
                internal ushort TrailerCount;
                internal HTTP_UNKNOWN_HEADER* pTrailers;
                internal HTTP_KNOWN_HEADER KnownHeaders; 
                internal HTTP_KNOWN_HEADER KnownHeaders_02;
                internal HTTP_KNOWN_HEADER KnownHeaders_03; 
                internal HTTP_KNOWN_HEADER KnownHeaders_04; 
                internal HTTP_KNOWN_HEADER KnownHeaders_05;
                internal HTTP_KNOWN_HEADER KnownHeaders_06; 
                internal HTTP_KNOWN_HEADER KnownHeaders_07;
                internal HTTP_KNOWN_HEADER KnownHeaders_08;
                internal HTTP_KNOWN_HEADER KnownHeaders_09;
                internal HTTP_KNOWN_HEADER KnownHeaders_10; 
                internal HTTP_KNOWN_HEADER KnownHeaders_11;
                internal HTTP_KNOWN_HEADER KnownHeaders_12; 
                internal HTTP_KNOWN_HEADER KnownHeaders_13; 
                internal HTTP_KNOWN_HEADER KnownHeaders_14;
                internal HTTP_KNOWN_HEADER KnownHeaders_15; 
                internal HTTP_KNOWN_HEADER KnownHeaders_16;
                internal HTTP_KNOWN_HEADER KnownHeaders_17;
                internal HTTP_KNOWN_HEADER KnownHeaders_18;
                internal HTTP_KNOWN_HEADER KnownHeaders_19; 
                internal HTTP_KNOWN_HEADER KnownHeaders_20;
                internal HTTP_KNOWN_HEADER KnownHeaders_21; 
                internal HTTP_KNOWN_HEADER KnownHeaders_22; 
                internal HTTP_KNOWN_HEADER KnownHeaders_23;
                internal HTTP_KNOWN_HEADER KnownHeaders_24; 
                internal HTTP_KNOWN_HEADER KnownHeaders_25;
                internal HTTP_KNOWN_HEADER KnownHeaders_26;
                internal HTTP_KNOWN_HEADER KnownHeaders_27;
                internal HTTP_KNOWN_HEADER KnownHeaders_28; 
                internal HTTP_KNOWN_HEADER KnownHeaders_29;
                internal HTTP_KNOWN_HEADER KnownHeaders_30; 
                internal HTTP_KNOWN_HEADER KnownHeaders_31; 
                internal HTTP_KNOWN_HEADER KnownHeaders_32;
                internal HTTP_KNOWN_HEADER KnownHeaders_33; 
                internal HTTP_KNOWN_HEADER KnownHeaders_34;
                internal HTTP_KNOWN_HEADER KnownHeaders_35;
                internal HTTP_KNOWN_HEADER KnownHeaders_36;
                internal HTTP_KNOWN_HEADER KnownHeaders_37; 
                internal HTTP_KNOWN_HEADER KnownHeaders_38;
                internal HTTP_KNOWN_HEADER KnownHeaders_39; 
                internal HTTP_KNOWN_HEADER KnownHeaders_40; 
                internal HTTP_KNOWN_HEADER KnownHeaders_41;
            } 

            internal enum HTTP_VERB : int {
                HttpVerbUnparsed = 0,
                HttpVerbUnknown = 1, 
                HttpVerbInvalid = 2,
                HttpVerbOPTIONS = 3, 
                HttpVerbGET = 4, 
                HttpVerbHEAD = 5,
                HttpVerbPOST = 6, 
                HttpVerbPUT = 7,
                HttpVerbDELETE = 8,
                HttpVerbTRACE = 9,
                HttpVerbCONNECT = 10, 
                HttpVerbTRACK = 11,
                HttpVerbMOVE = 12, 
                HttpVerbCOPY = 13, 
                HttpVerbPROPFIND = 14,
                HttpVerbPROPPATCH = 15, 
                HttpVerbMKCOL = 16,
                HttpVerbLOCK = 17,
                HttpVerbUNLOCK = 18,
                HttpVerbSEARCH = 19, 
                HttpVerbMaximum = 20,
            } 
 
            internal static readonly string[] HttpVerbs = new string[] {
                null, 
                "Unknown",
                "Invalid",
                "OPTIONS",
                "GET", 
                "HEAD",
                "POST", 
                "PUT", 
                "DELETE",
                "TRACE", 
                "CONNECT",
                "TRACK",
                "MOVE",
                "COPY", 
                "PROPFIND",
                "PROPPATCH", 
                "MKCOL", 
                "LOCK",
                "UNLOCK", 
                "SEARCH",
            };

            internal enum HTTP_DATA_CHUNK_TYPE : int { 
                HttpDataChunkFromMemory = 0,
                HttpDataChunkFromFileHandle = 1, 
                HttpDataChunkFromFragmentCache = 2, 
                HttpDataChunkMaximum = 3,
            } 

            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_RESPONSE {
                internal uint Flags; 
                internal HTTP_VERSION Version;
                internal ushort StatusCode; 
                internal ushort ReasonLength; 
                internal sbyte* pReason;
                internal HTTP_RESPONSE_HEADERS Headers; 
                internal ushort EntityChunkCount;
                internal HTTP_DATA_CHUNK* pEntityChunks;
            }
 
            [StructLayout(LayoutKind.Sequential)]
            internal struct HTTP_REQUEST { 
                internal uint Flags; 
                internal ulong ConnectionId;
                internal ulong RequestId; 
                internal ulong UrlContext;
                internal HTTP_VERSION Version;
                internal HTTP_VERB Verb;
                internal ushort UnknownVerbLength; 
                internal ushort RawUrlLength;
                internal sbyte* pUnknownVerb; 
                internal sbyte* pRawUrl; 
                internal HTTP_COOKED_URL CookedUrl;
                internal HTTP_TRANSPORT_ADDRESS Address; 
                internal HTTP_REQUEST_HEADERS Headers;
                internal ulong BytesReceived;
                internal ushort EntityChunkCount;
                internal HTTP_DATA_CHUNK* pEntityChunks; 
                internal ulong RawConnectionId;
                internal HTTP_SSL_INFO* pSslInfo; 
            } 

            // see http.w for definitions 
            [Flags]
            internal enum HTTP_FLAGS : uint {
                NONE                                                = 0x00000000,
                HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY                 = 0x00000001, 
                HTTP_SEND_RESPONSE_FLAG_DISCONNECT                  = 0x00000001,
                HTTP_SEND_RESPONSE_FLAG_MORE_DATA                   = 0x00000002, 
                HTTP_SEND_RESPONSE_FLAG_RAW_HEADER                  = 0x00000004, 
                HTTP_SEND_REQUEST_FLAG_MORE_DATA                    = 0x00000001,
            } 

            const int HttpHeaderRequestMaximum  = (int)HttpRequestHeader.UserAgent + 1;
            const int HttpHeaderResponseMaximum = (int)HttpResponseHeader.WwwAuthenticate + 1;
 
            internal static class HTTP_REQUEST_HEADER_ID {
                private static Hashtable m_Hashtable; 
 
                static HTTP_REQUEST_HEADER_ID() {
                    m_Hashtable = new Hashtable(HttpHeaderRequestMaximum); 
                    for (int i = 0; iHeaders.UnknownHeaderCount != 0) 
                    {
                        HTTP_UNKNOWN_HEADER* pUnknownHeader = (HTTP_UNKNOWN_HEADER*) (fixup + (byte*) request->Headers.pUnknownHeaders); 
                        for (index = 0; index < request->Headers.UnknownHeaderCount; index++)
                        {
                            if (pUnknownHeader->pName != null && pUnknownHeader->NameLength > 0 && pUnknownHeader->pRawValue != null && pUnknownHeader->RawValueLength > 0)
                            { 
                                string headerName = new string(pUnknownHeader->pName + fixup, 0, pUnknownHeader->NameLength);
                                string headerValue = new string(pUnknownHeader->pRawValue + fixup, 0, pUnknownHeader->RawValueLength); 
                                headerCollection.AddInternal(headerName, headerValue); 
                            }
                            pUnknownHeader++; 
                        }
                    }

                    // known headers 
                    HTTP_KNOWN_HEADER* pKnownHeader = &request->Headers.KnownHeaders;
                    for (index = 0; index < HttpHeaderRequestMaximum - 1; index++) 
                    { 
                        if (pKnownHeader->RawValueLength != 0 && pKnownHeader->pRawValue != null)
                        { 
                            string headerValue = new string(pKnownHeader->pRawValue + fixup, 0, pKnownHeader->RawValueLength);
                            headerCollection.AddInternal(HTTP_REQUEST_HEADER_ID.ToString(index), headerValue);
                        }
                        pKnownHeader++; 
                    }
                } 
 
                GlobalLog.Leave("HttpApi::GetHeaders()");
                return headerCollection; 
            }

            private static string GetKnownHeader(HTTP_REQUEST* request, long fixup, int headerIndex)
            { 
                GlobalLog.Enter("HttpApi::GetKnownHeader()");
                string header = null; 
 
                HTTP_KNOWN_HEADER* pKnownHeader = (&request->Headers.KnownHeaders) + headerIndex;
                GlobalLog.Print("HttpApi::GetKnownHeader() pKnownHeader:0x" + ((IntPtr) pKnownHeader).ToString("x")); 
                GlobalLog.Print("HttpApi::GetKnownHeader() pRawValue:0x" + ((IntPtr) pKnownHeader->pRawValue).ToString("x") + " RawValueLength:" + pKnownHeader->RawValueLength.ToString());
                if (pKnownHeader->RawValueLength != 0 && pKnownHeader->pRawValue != null)
                {
                    header = new string(pKnownHeader->pRawValue + fixup, 0, pKnownHeader->RawValueLength); 
                }
 
                GlobalLog.Leave("HttpApi::GetKnownHeader() return:" + ValidationHelper.ToString(header)); 
                return header;
            } 

            internal static string GetKnownHeader(HTTP_REQUEST* request, int headerIndex)
            {
                return GetKnownHeader(request, 0, headerIndex); 
            }
 
            internal static string GetKnownHeader(byte[] memoryBlob, IntPtr originalAddress, int headerIndex) 
            {
                fixed (byte* pMemoryBlob = memoryBlob) 
                {
                    return GetKnownHeader((HTTP_REQUEST*) pMemoryBlob, pMemoryBlob - (byte*) originalAddress, headerIndex);
                }
            } 

            private unsafe static string GetVerb(HTTP_REQUEST* request, long fixup) 
            { 
                GlobalLog.Enter("HttpApi::GetVerb()");
                string verb = null; 

                if ((int) request->Verb > (int) HTTP_VERB.HttpVerbUnknown && (int) request->Verb < (int) HTTP_VERB.HttpVerbMaximum)
                {
                    verb = HttpVerbs[(int) request->Verb]; 
                }
                else if (request->Verb == HTTP_VERB.HttpVerbUnknown && request->pUnknownVerb != null) 
                { 
                    verb = new string(request->pUnknownVerb + fixup, 0, request->UnknownVerbLength);
                } 

                GlobalLog.Leave("HttpApi::GetVerb() return:" + ValidationHelper.ToString(verb));
                return verb;
            } 

            internal unsafe static string GetVerb(HTTP_REQUEST* request) 
            { 
                return GetVerb(request, 0);
            } 

            internal unsafe static string GetVerb(byte[] memoryBlob, IntPtr originalAddress)
            {
                fixed (byte* pMemoryBlob = memoryBlob) 
                {
                    return GetVerb((HTTP_REQUEST*) pMemoryBlob, pMemoryBlob - (byte*) originalAddress); 
                } 
            }
 
            internal static HTTP_VERB GetKnownVerb(byte[] memoryBlob, IntPtr originalAddress)
            {
                GlobalLog.Enter("HttpApi::GetKnownVerb()");
 
                // Return value.
                HTTP_VERB verb = HTTP_VERB.HttpVerbUnknown; 
                fixed (byte* pMemoryBlob = memoryBlob) 
                {
                    HTTP_REQUEST* request = (HTTP_REQUEST*) pMemoryBlob; 
                    if ((int)request->Verb > (int)HTTP_VERB.HttpVerbUnparsed && (int)request->Verb < (int)HTTP_VERB.HttpVerbMaximum)
                    {
                        verb = request->Verb;
                    } 
                }
 
                GlobalLog.Leave("HttpApi::GetKnownVerb()"); 
                return verb;
            } 

            internal static uint GetChunks(byte[] memoryBlob, IntPtr originalAddress, ref int dataChunkIndex, ref uint dataChunkOffset, byte[] buffer, int offset, int size)
            {
                GlobalLog.Enter("HttpApi::GetChunks() memoryBlob:" + ValidationHelper.ToString(memoryBlob)); 

                // Return value. 
                uint dataRead = 0; 
                fixed(byte* pMemoryBlob = memoryBlob)
                { 
                    HTTP_REQUEST* request = (HTTP_REQUEST*) pMemoryBlob;
                    long fixup = pMemoryBlob - (byte*) originalAddress;

                    if (request->EntityChunkCount > 0 && dataChunkIndex < request->EntityChunkCount && dataChunkIndex != -1) 
                    {
                        HTTP_DATA_CHUNK* pDataChunk = (HTTP_DATA_CHUNK*) (fixup + (byte*) &request->pEntityChunks[dataChunkIndex]); 
 
                        fixed(byte* pReadBuffer = buffer)
                        { 
                            byte* pTo = &pReadBuffer[offset];

                            while (dataChunkIndex < request->EntityChunkCount && dataRead < size){
                                if(dataChunkOffset >= pDataChunk->BufferLength){ 
                                    dataChunkOffset = 0;
                                    dataChunkIndex ++; 
                                    pDataChunk++; 
                                }
                                else{ 
                                    byte* pFrom = pDataChunk->pBuffer + dataChunkOffset + fixup;

                                    uint bytesToRead =  pDataChunk->BufferLength - (uint)dataChunkOffset;
                                    if (bytesToRead  > (uint)size){ 
                                        bytesToRead = (uint)size;
                                    } 
                                    for (uint i=0;iEntityChunkCount){ 
                        dataChunkIndex = -1;
                    }
                }
 
                GlobalLog.Leave("HttpApi::GetChunks()");
                return dataRead; 
            } 

            internal static IPEndPoint GetRemoteEndPoint(byte[] memoryBlob, IntPtr originalAddress) 
            {
                GlobalLog.Enter("HttpApi::GetRemoteEndPoint()");

                SocketAddress v4address = new SocketAddress(AddressFamily.InterNetwork, SocketAddress.IPv4AddressSize); 
                SocketAddress v6address = new SocketAddress(AddressFamily.InterNetworkV6, SocketAddress.IPv6AddressSize);
 
                fixed (byte* pMemoryBlob = memoryBlob) 
                {
                    HTTP_REQUEST* request = (HTTP_REQUEST*) pMemoryBlob; 
                    IntPtr address = request->Address.pRemoteAddress != null ? (IntPtr) (pMemoryBlob - (byte*) originalAddress + (byte*) request->Address.pRemoteAddress) : IntPtr.Zero;
                    CopyOutAddress(address, ref v4address, ref v6address);
                }
 
                IPEndPoint endpoint = null;
                if (v4address != null) 
                { 
                    endpoint = IPEndPoint.Any.Create(v4address) as IPEndPoint;
                } 
                else if (v6address != null)
                {
                    endpoint = IPEndPoint.IPv6Any.Create(v6address) as IPEndPoint;
                } 

                GlobalLog.Leave("HttpApi::GetRemoteEndPoint()"); 
                return endpoint; 
            }
 
            internal static IPEndPoint GetLocalEndPoint(byte[] memoryBlob, IntPtr originalAddress)
            {
                GlobalLog.Enter("HttpApi::GetLocalEndPoint()");
 
                SocketAddress v4address = new SocketAddress(AddressFamily.InterNetwork, SocketAddress.IPv4AddressSize);
                SocketAddress v6address = new SocketAddress(AddressFamily.InterNetworkV6, SocketAddress.IPv6AddressSize); 
 
                fixed (byte* pMemoryBlob = memoryBlob)
                { 
                    HTTP_REQUEST* request = (HTTP_REQUEST*) pMemoryBlob;
                    IntPtr address = request->Address.pLocalAddress != null ? (IntPtr) (pMemoryBlob - (byte*) originalAddress + (byte*) request->Address.pLocalAddress) : IntPtr.Zero;
                    CopyOutAddress(address, ref v4address, ref v6address);
                } 

                IPEndPoint endpoint = null; 
                if (v4address != null) 
                {
                    endpoint = IPEndPoint.Any.Create(v4address) as IPEndPoint; 
                }
                else if (v6address != null)
                {
                    endpoint = IPEndPoint.IPv6Any.Create(v6address) as IPEndPoint; 
                }
 
                GlobalLog.Leave("HttpApi::GetLocalEndPoint()"); 
                return endpoint;
            } 

            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            private static void CopyOutAddress(IntPtr address, ref SocketAddress v4address, ref SocketAddress v6address)
            { 
                if (address != IntPtr.Zero)
                { 
                    ushort addressFamily = *((ushort*) address); 
                    if (addressFamily == (ushort) AddressFamily.InterNetwork)
                    { 
                        v6address = null;
                        fixed (byte* pBuffer = v4address.m_Buffer)
                        {
                            for (int index = 2; index < SocketAddress.IPv4AddressSize; index++) 
                            {
                                pBuffer[index] = ((byte*) address)[index]; 
                            } 
                        }
                        return; 
                    }
                    if (addressFamily == (ushort) AddressFamily.InterNetworkV6)
                    {
                        v4address = null; 
                        fixed (byte* pBuffer = v6address.m_Buffer)
                        { 
                            for (int index = 2; index < SocketAddress.IPv6AddressSize; index++) 
                            {
                                pBuffer[index] = ((byte*) address)[index]; 
                            }
                        }
                        return;
                    } 
                }
 
                v4address = null; 
                v6address = null;
            } 
        }
#endif // !FEATURE_PAL
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK