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;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
}
}
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DataServiceHost.cs
- LineUtil.cs
- RunWorkerCompletedEventArgs.cs
- CategoryValueConverter.cs
- EntityDataSourceView.cs
- MulticastIPAddressInformationCollection.cs
- XpsFilter.cs
- TokenizerHelper.cs
- WebBrowser.cs
- XmlSerializableServices.cs
- BindingValueChangedEventArgs.cs
- SoapIncludeAttribute.cs
- CopyOfAction.cs
- TextInfo.cs
- EventlogProvider.cs
- ResourcesGenerator.cs
- ToolStripContentPanel.cs
- TextElement.cs
- ItemsControl.cs
- ModelItemDictionary.cs
- HostingEnvironmentException.cs
- CompiledQuery.cs
- Win32PrintDialog.cs
- ObjectDataSourceDesigner.cs
- DesignerLoader.cs
- CallInfo.cs
- Crypto.cs
- ProgressiveCrcCalculatingStream.cs
- COM2PropertyBuilderUITypeEditor.cs
- TimeSpanValidator.cs
- HwndHost.cs
- TypedElement.cs
- TreeViewCancelEvent.cs
- TrimSurroundingWhitespaceAttribute.cs
- InternalControlCollection.cs
- RubberbandSelector.cs
- ELinqQueryState.cs
- TypographyProperties.cs
- MethodAccessException.cs
- ColorAnimation.cs
- GridViewPageEventArgs.cs
- BlurEffect.cs
- XmlDomTextWriter.cs
- SessionStateItemCollection.cs
- coordinatorfactory.cs
- controlskin.cs
- HtmlInputReset.cs
- SqlClientWrapperSmiStream.cs
- HtmlTableCellCollection.cs
- StackBuilderSink.cs
- SelectedDatesCollection.cs
- _ProxyRegBlob.cs
- XmlResolver.cs
- ComponentDispatcherThread.cs
- OdbcParameterCollection.cs
- ManagementDateTime.cs
- TextEditorCopyPaste.cs
- SessionStateSection.cs
- TypeLibConverter.cs
- CalloutQueueItem.cs
- XmlSchemaIdentityConstraint.cs
- DispatchOperation.cs
- ProviderBase.cs
- XmlSchemaValidator.cs
- ObjectManager.cs
- SqlDataAdapter.cs
- SHA1.cs
- OleDbRowUpdatingEvent.cs
- XslTransform.cs
- CategoryNameCollection.cs
- XamlPathDataSerializer.cs
- OrderByBuilder.cs
- AppDomainProtocolHandler.cs
- DrawingDrawingContext.cs
- RoutedCommand.cs
- XmlDataSource.cs
- LicenseManager.cs
- PatternMatcher.cs
- InputReferenceExpression.cs
- ExecutionContext.cs
- baseaxisquery.cs
- InputLanguageSource.cs
- CompositeFontInfo.cs
- DataGridViewCheckBoxColumn.cs
- MethodAccessException.cs
- CodeTypeReferenceCollection.cs
- ArrangedElementCollection.cs
- Oid.cs
- Columns.cs
- Page.cs
- RijndaelManaged.cs
- Image.cs
- ElementFactory.cs
- SubtreeProcessor.cs
- DragEvent.cs
- ListBindingConverter.cs
- ObjectAssociationEndMapping.cs
- InstanceCreationEditor.cs
- PrinterResolution.cs
- RichTextBoxConstants.cs