Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / 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;i EntityChunkCount){ 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 } }
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- BufferModesCollection.cs
- CollectionViewProxy.cs
- PrimitiveType.cs
- AbstractDataSvcMapFileLoader.cs
- SimpleWorkerRequest.cs
- VectorCollection.cs
- ToolStrip.cs
- BorderGapMaskConverter.cs
- InvalidateEvent.cs
- PropertyFilterAttribute.cs
- SimpleWebHandlerParser.cs
- WindowsTreeView.cs
- XmlTextReaderImplHelpers.cs
- XsltContext.cs
- documentsequencetextpointer.cs
- SpecialNameAttribute.cs
- RewritingValidator.cs
- TableLayoutStyle.cs
- DependencyObjectProvider.cs
- HtmlGenericControl.cs
- BaseAsyncResult.cs
- GeneratedContractType.cs
- ReadOnlyNameValueCollection.cs
- PixelFormatConverter.cs
- CanonicalFontFamilyReference.cs
- OutputCacheSettingsSection.cs
- OutputCacheProfile.cs
- ACE.cs
- CustomTokenProvider.cs
- DataSourceProvider.cs
- RequestCacheEntry.cs
- LoginAutoFormat.cs
- XomlDesignerLoader.cs
- validationstate.cs
- WebServiceParameterData.cs
- AuthenticatingEventArgs.cs
- AssemblyInfo.cs
- X509Certificate2Collection.cs
- TemplateKey.cs
- QuarticEase.cs
- SerializationEventsCache.cs
- ContractInstanceProvider.cs
- WinFormsSpinner.cs
- QuaternionAnimationBase.cs
- SchemaElementDecl.cs
- ZipIORawDataFileBlock.cs
- IdentityManager.cs
- IconConverter.cs
- DataExpression.cs
- ObjectFactoryCodeDomTreeGenerator.cs
- IntSecurity.cs
- EmptyImpersonationContext.cs
- SafeEventLogReadHandle.cs
- SerializableAttribute.cs
- HtmlControlAdapter.cs
- DataGridViewCellEventArgs.cs
- RegisteredExpandoAttribute.cs
- ServiceObjectContainer.cs
- PersistenceTypeAttribute.cs
- MatrixTransform.cs
- DPTypeDescriptorContext.cs
- PresentationAppDomainManager.cs
- CLRBindingWorker.cs
- CustomExpression.cs
- XsdBuilder.cs
- TraceContext.cs
- HtmlControl.cs
- COAUTHIDENTITY.cs
- WebPartVerbsEventArgs.cs
- DirtyTextRange.cs
- NullReferenceException.cs
- PriorityQueue.cs
- SqlDuplicator.cs
- WmlControlAdapter.cs
- CommonGetThemePartSize.cs
- DbLambda.cs
- OleDbTransaction.cs
- DataGridRowClipboardEventArgs.cs
- itemelement.cs
- UpDownBase.cs
- WsdlHelpGeneratorElement.cs
- UIElement.cs
- RegexRunner.cs
- OLEDB_Util.cs
- EntityDataReader.cs
- OrderByQueryOptionExpression.cs
- KeyValuePairs.cs
- SqlBooleanMismatchVisitor.cs
- ScopelessEnumAttribute.cs
- ConfigXmlDocument.cs
- Win32.cs
- TableRow.cs
- SaveFileDialog.cs
- DynamicDataRoute.cs
- SolidBrush.cs
- BaseTreeIterator.cs
- IISMapPath.cs
- XmlNavigatorFilter.cs
- FlowLayoutPanel.cs
- AutoResizedEvent.cs