using System;
using System.Runtime.InteropServices;
namespace PacProxyUsage
{
///
/// Summary description for Win32Api.
///
public class Win32Api
{
#region AutoProxy Constants
///
/// Applies only when setting proxy information
///
public const int WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0;
///
/// Internet accessed through a direct connection
///
public const int WINHTTP_ACCESS_TYPE_NO_PROXY = 1;
///
/// Internet accessed using a proxy
///
public const int WINHTTP_ACCESS_TYPE_NAMED_PROXY = 3;
///
/// Attempt to automatically discover the URL of the
/// PAC file using both DHCP and DNS queries to the local network.
///
public const int WINHTTP_AUTOPROXY_AUTO_DETECT = 0x00000001;
///
/// Download the PAC file from the URL in the WINHTTP_AUTOPROXY_OPTIONS structure.
///
public const int WINHTTP_AUTOPROXY_CONFIG_URL = 0x00000002;
///
/// Executes the Web Proxy Auto-Discovery (WPAD) protocol in-process instead of
/// delegating to an out-of-process WinHTTP AutoProxy Service, if available.
/// This flag must be combined with one of the other flags
///
public const int WINHTTP_AUTOPROXY_RUN_INPROCESS = 0x00010000;
///
/// By default, WinHTTP is configured to fall back to auto-discover a proxy
/// in-process. If this fallback behavior is undesirable in the event that
/// an out-of-process discovery fails, it can be disabled using this flag.
///
public const int WINHTTP_AUTOPROXY_RUN_OUTPROCESS_ONLY = 0x00020000;
///
/// Use DHCP to locate the proxy auto-configuration file.
///
public const int WINHTTP_AUTO_DETECT_TYPE_DHCP = 0x00000001;
///
/// Use DNS to attempt to locate the proxy auto-configuration file at a
/// well-known location on the domain of the local computer
///
public const int WINHTTP_AUTO_DETECT_TYPE_DNS_A = 0x00000002;
#endregion
#region Proxy Structures
///
/// The structure is used to indicate to the WinHttpGetProxyForURL
/// function whether to specify the URL of the Proxy Auto-Configuration
/// (PAC) file or to automatically locate the URL with DHCP or DNS
/// queries to the network
///
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct WINHTTP_AUTOPROXY_OPTIONS {
///
/// Mechanisms should be used to obtain the PAC file
///
[MarshalAs(UnmanagedType.U4)]
public int dwFlags;
///
/// If dwflags includes the WINHTTP_AUTOPROXY_AUTO_DETECT flag,
/// then dwAutoDetectFlags specifies what protocols are to be
/// used to locate the PAC file. If both the DHCP and DNS auto
/// detect flags are specified, then DHCP is used first;
/// if no PAC URL is discovered using DHCP, then DNS is used.
/// If dwflags does not include the WINHTTP_AUTOPROXY_AUTO_DETECT
/// flag, then dwAutoDetectFlags must be zero.
///
[MarshalAs(UnmanagedType.U4)]
public int dwAutoDetectFlags;
///
/// If dwflags includes the WINHTTP_AUTOPROXY_CONFIG_URL flag, the
/// lpszAutoConfigUrl must point to a null-terminated Unicode string
/// that contains the URL of the proxy auto-configuration (PAC) file.
/// If dwflags does not include the WINHTTP_AUTOPROXY_CONFIG_URL flag,
/// then lpszAutoConfigUrl must be NULL.
///
public string lpszAutoConfigUrl;
///
/// Reserved for future use; must be NULL.
///
public IntPtr lpvReserved;
///
/// Reserved for future use; must be zero.
///
[MarshalAs(UnmanagedType.U4)]
public int dwReserved;
///
/// Specifies whether the client's domain credentials should be automatically
/// sent in response to an NTLM or Negotiate Authentication challenge when
/// WinHTTP requests the PAC file.
/// If this flag is TRUE, credentials should automatically be sent in response
/// to an authentication challenge. If this flag is FALSE and authentication
/// is required to download the PAC file, the WinHttpGetProxyForUrl fails.
///
[MarshalAs(UnmanagedType.Bool)]
public bool fAutoLoginIfChallenged;
}
///
/// The structure contains the session or default proxy configuration.
///
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
public struct WINHTTP_PROXY_INFO {
///
/// Unsigned long integer value that contains the access type
///
[MarshalAs(UnmanagedType.U4)]
public int dwAccessType;
///
/// Pointer to a string value that contains the proxy server list
///
public string lpszProxy;
///
/// Pointer to a string value that contains the proxy bypass list
///
public string lpszProxyBypass;
}
#endregion
#region WinHttp
///
/// This function implements the Web Proxy Auto-Discovery (WPAD) protocol
/// for automatically configuring the proxy settings for an HTTP request.
/// The WPAD protocol downloads a Proxy Auto-Configuration (PAC) file,
/// which is a script that identifies the proxy server to use for a given
/// target URL. PAC files are typically deployed by the IT department within
/// a corporate network environment. The URL of the PAC file can either be
/// specified explicitly or WinHttpGetProxyForUrl can be instructed to
/// automatically discover the location of the PAC file on the local network.
///
/// The WinHTTP session handle returned by the WinHttpOpen function
/// A pointer to a null-terminated Unicode string that contains the
/// URL of the HTTP request that the application is preparing to send.
/// A pointer to a WINHTTP_AUTOPROXY_OPTIONS structure that
/// specifies the auto-proxy options to use.
/// A pointer to a WINHTTP_PROXY_INFO structure that receives the
/// proxy setting. This structure is then applied to the request handle using the
/// WINHTTP_OPTION_PROXY option.
///
[DllImport("winhttp.dll", SetLastError=true, CharSet=CharSet.Unicode)]
public static extern bool WinHttpGetProxyForUrl(
IntPtr hSession,
string lpcwszUrl,
ref WINHTTP_AUTOPROXY_OPTIONS pAutoProxyOptions,
ref WINHTTP_PROXY_INFO pProxyInfo);
///
/// The function initializes, for an application, the use of WinHTTP
/// functions and returns a WinHTTP-session handle
///
/// A pointer to a string variable that contains the name of the
/// application or entity calling the WinHTTP functions.
/// Type of access required. This can be one of the following values
/// A pointer to a string variable that contains the name of the
/// proxy server to use when proxy access is specified by setting dwAccessType to
/// WINHTTP_ACCESS_TYPE_NAMED_PROXY. The WinHTTP functions recognize only CERN type proxies for HTTP.
/// If dwAccessType is not set to WINHTTP_ACCESS_TYPE_NAMED_PROXY, this parameter must be set
/// to WINHTTP_NO_PROXY_NAME
/// A pointer to a string variable that contains an optional list
/// of host names or IP addresses, or both, that should not be routed through the proxy when
/// dwAccessType is set to WINHTTP_ACCESS_TYPE_NAMED_PROXY. The list can contain wildcard characters.
/// Do not use an empty string, because the WinHttpOpen function uses it as the proxy bypass list.
/// If this parameter specifies the "<local>" macro as the only entry, this function bypasses
/// any host name that does not contain a period. If dwAccessType is not set to WINHTTP_ACCESS_TYPE_NAMED_PROXY,
/// this parameter must be set to WINHTTP_NO_PROXY_BYPASS.
/// Unsigned long integer value that contains the flags that indicate various options
/// affecting the behavior of this function
/// Returns a valid session handle if successful, or NULL otherwise
[DllImport("winhttp.dll", SetLastError=true, CharSet=CharSet.Unicode)]
public static extern IntPtr WinHttpOpen(
string pwszUserAgent,
int dwAccessType,
IntPtr pwszProxyName,
IntPtr pwszProxyBypass,
int dwFlags
);
///
/// The function closes a single HINTERNET handle
///
/// Valid HINTERNET handle to be closed.
/// Returns TRUE if the handle is successfully closed, or FALSE otherwise
[DllImport("winhttp.dll", SetLastError=true, CharSet=CharSet.Unicode)]
public static extern bool WinHttpCloseHandle(IntPtr hInternet);
#endregion
[DllImport("kernel32.dll")]
public static extern int GetLastError();
}
}