æ¬ç±»åºå®é ä¸æ¯ä¸ç§å¾å¤±è´¥çä¸è¥¿ï¼è³å°å¨æçæ¥æ¯è¶³å¤å¤±è´¥ å½æ¶ä¹ä¸ç¥éæ¯å¤´åç
è¿æ¯äººæªéï¼å± ç¶ä¼å»æ¦æªWinInetï¼çæ¥å å¹´åå¦ä¹ çWebProxyä¸HTTPæ¯ç½å¦äºï¼
ææ³åºè¯¥æ¯Â Retrieve-HttpOnly-Session-Cookie-in-WebBrowser è¿ç¯å¸åä¸çä¸äºè¯
误导äºææï¼æ¬ç±»åºçæºä»£ç å®é ä¸åªæ¯æä¾ç»å¤§å®¶å¦ä¹ API-HOOKçä¸ä¸ªå°å°åºç¨
ä¸è¿API-HOOKåäºå¥½å ç§ï¼ææå欢çè¿æ¯IATï¼EATï¼INLINEä¸ç§ï¼ä¸è¿è®ºå°å®
ç¨æ§INLINEæ¯æ好çï¼RING3级 稳å®æ§ä¸å®å ¨æ§è¿æ¯å¾OKçã
Hooking the methods exposed by WININET.DLL gives the ability to interact with each request sending to server, including theÂ
AJAXÂ
request!Â
The probable call sequence is shown as below:Â
Hide   Copy Code
1=> InternetOpen
2=> InternetConnect
3=> HttpOpenRequest
// .............
X=> InternetCloseHandle
By hooking these methods, it is possible for us to detect each request sent to the web server, and inject our codes before / after each request.
Why not WINSOCK? It is easier to hook methods exposed by WININET.DLL than hookingÂ
WINSOCKÂ
methods, since the former wraps the HTTP protocol.
There are two different ways in hooking, inline hook and routine hook. Inline hook is universal for almost all of the cases, however, routine hook is more robust. The sample implements it by modifying the IAT(Import Address Table), one of the routine hooks.
If you need more details about IAT hook, here is an article for reference.Â
好å§ï¼ä¸å¨ç»èªå·±æ¾çç±ï¼æ¬ç±»åºå·²ç»ä¿®æ£äºä¸äºå½å 主è¦æ¯ææºä»£ç 移æ¤å°ä½¿ç¨Â API-Hook / RING3
ä¸ï¼æ注解ä¸äºå½åä¸çåå¨ï¼å®é ä¸ä½ æ¹åå»ä¹æ¯ä¸æ ·çã
Inline-Hook ->Ex->Â NetHookã
NetCut ->NetworkCutã
NetTab -> NetworkTableã
NetworkProtocol ->NetServerã
NetTabCollection ->NetworkTableCollectionã
NetCutRequestComplete -> NetworkCutRequestComplete
ä¸è¿æ们å°ä¹å¯ä»¥å¯ä»¥ççï¼å¦æéè¿âå°å  / æªå âææ¯å¯ä»¥è½»æ¾å¾å°ä»ä¹ï¼
该å¤æ¦æªçæ¯ws2_32.dll导åºçå½æ°ï¼æäºäººä¼é®ä¸ºä»ä¹ä¸å»æ¦æªwsock32.dlå¢ï¼
ä½ å¯ä»¥è¿æ ·å»çå¾ ï¼å®é ä¸è¿ä¸¤ä¸ªDLL并没æ太大çåºå«ï¼ä¸ä¸ªå¾®è½¯ç¨äºCString
ä¸ä¸ªç¨äºstringï¼æ¬è´¨ä¸å®æ¯Â CString-> string æ以æ¯Â wsock32.dll ->ws2_32.dll
Http请æ±é¦å ä¼å»è§£æ对æ¹ä¸»æºçå°å表ï¼ç¶åéæ©ä¸ä¸ªåéå°åéè¿socketè¿
æ¥å¯¹æ¹ç主æºç80端å£ï¼ä¸ä¸ªå®æ´çHttp请æ±é¦å æ¯å®¢æ·ç«¯åéå议头ï¼ä¸å å«
请æ±çå议头ï¼å¯¹æ¹æ¥æ¶å°åè¿è¡ä¸ä¸ªå¤ç并è¿è¡ç¸åºæ们åªéè¦å»æ¥åæ¥èªæ
å¡å¨è¿åçæ°æ®å å³å¯ï¼å¾®è½¯å¨Internet Explorer 9ä¸æ¯æå¼å人åå¯ä»¥ç½ç»æå
大æ¦åæ¯è¿æ ·å»å®ç°çï¼ ææ¯ä¸å¤ªç¸ä¿¡å¾®è½¯å¼å人åå¯è½ä¼ä½¿ç¨ SOCK SPI çã
å¨NetCutä¸ä½ ä¹å¯ä»¥å®ç°è·å类似çåè½ï¼åªæ¯ç¸å¯¹æ§çä¼å¤æä¸äºï¼é£ä¹æ举
ä¸ä¸ªååæ们éè¦è·å请æ±è¿åç»å®¢æ·ç«¯çCookieï¼å¦ä½å»åå¢ï¼
// example:
private const int HTTP_QUERY_SET_COOKIE = 43;
private void _NetCut_RequestComplete(object sender, NetCut.NetTab e)
{
StringBuilder strBufferBuider = new StringBuilder(4096);
string strSetCookieValue = e.QueryInfo(e.RequestHandle, HTTP_QUERY_SET_COOKIE, strBufferBuider);
if(strSetCookieValue != null && strSetCookieValue.Length > 0)
Console.WriteLine(strSetCookieValue);
}
ä¸é¢åæ¯éè¿NetTabå»è·å请æ±è¿åç»å®¢æ·ç«¯ç Cookieï¼å¦ææåè¿åå¦åä¼è¿å null
ä¸è¿å¨NetTab对象ä¸å¯ä»¥éè¿ResponseCookieå±æ§è·åCookieï¼ä½ å¯ä»¥ä¸å¿ 使ç¨ä¸è¿°
代ç è¿è¡è·åæå¡å¨è¿åç»å®¢æ·ç«¯çCookie
好çï¼å¦ææ们éè¦å®¢æ·ç«¯åé请æ±éå çCookieéè¦è°ç¨å°WININET.DLLä¸å¯¼åºç
两个å½æ°Â InternetGetCookie / InternetGetCookieEx 便å¯ä»¥äºã
C# Declare:
[DllImport("wininet.dll", SetLastError=true)]
public static extern bool InternetGetCookie(
string url, string cookieName, StringBuilder cookieData, ref int size);
[DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool InternetGetCookieEx(string pchURL, string pchCookieName, StringBuilder pchCookieData, ref System.UInt32 pcchCookieData, int dwFlags, IntPtr lpReserved);
å¦æä½ éè¦æ¥é NetCutä¸çæºä»£ç ï¼é£ä¹ä½ é¦å éè¦ä¸è½½ï¼ CAT / Inline-Hook.dll
å¦æä½ éè¦é 读ä¸äºç¸å ³çèµæå¯ä»¥æ¥é C#æ¹é¢çå 容ï¼Â Inline-Hook / CSDN Blog.
å½ä½ ä¸è½½å®æ¯å解å ä¼çå ¶ä¸æå å«4.0ã2.0ç两个æä»¶å¤¹æ ¹æ®ä½ ç项ç®
ä¸ä½¿ç¨ç.NETæ¡æ¶çæ¬æå¼å¯¹åºçæ¬çæ件夹
注æä¸è¬é¡¹ç®é»è®¤æ¯AnyCPUï¼å¨64ä½ç³»ç»ä¸é»è®¤ä¸ºx64ï¼å¨32ç³»ç»ä¸é»è®¤ä¸ºx86
æä»¥ä½ å¨éæ©DLLçæ¶åä¸å®è¦æ³¨æè¿æ ·çé®é¢ï¼å¨ä»£ç ä¸ä¼ä½¿ç¨å°ä¸å®å ¨ä»£ç
Unsafeï¼ä¹å¯ä»¥è¯´æ¯æ¬å°ä»£ç æä»¥ä½ å¿ é¡»è¦å¨é¡¹ç®å±æ§ä¸å¾éâå 许ä¸å®å ¨ä»£ç â
å¨ä¸é¢ææ¯ä½¿ç¨çx86ç¨åºæ以ï¼æéè¦X86çDLLä¸å æç项ç®.NETçæ¬ä¸º4.0
ç°å¨æ们éè¦æ·»å 项ç®å¼ç¨ï¼ç¹å»âæ·»å å¼ç¨(R)â
å¨å¼¹åºçâå¼ç¨ç®¡çä¸âç¹å»âæµè§(B)âæé®ï¼ç¶åæ们æéè¦å¼ç¨çDLLè·¯å¾å¤å¶è¿å»
ç¹å»âéæ©è¦å¼ç¨çæ件...âçªå£ä¸âæ·»å âæé®ï¼OKã
éè¦æ³¨æçå°æ¹åºæ¬ä¸æ²¡æäºç°å¨å°±æ¯è´´ä»£ç ãé¦å æ¯NetHooké¨å
namespace System.Runtime.InteropServices
{
public class NetHook : InlineHook
{
public void Install(string strLibraryName, string strMethodName, IntPtr newMethodAddress)
{
IntPtr oldMethodAddress = base.GetProcAddress(strLibraryName, strMethodName);
base.Install(oldMethodAddress, newMethodAddress);
}
}
}
å¨ä¸é¢ä¸ºäºæ¯ææºNetCutç±»çæºä»£ç ï¼æ以æå¿ é¡»å¨æ¤å¤ä¸ºInlineHookæ©å±ä¸ä¸ªInstallæ¹æ³
NetCut使ç¨çåæ³ï¼ä½ å¯ä»¥åé  NetCut / CSDN Blog. å å«ç¤ºä¾ä»£ç  两个类æ¯ç¸ççã
ä¸é¢æ¯NetCutç±»çæºä»£ç ï¼æä¸äºä¸è¶³ä¹å¤å·²ç»è¢«æå°å°ä¿®å¤äºä¸ä¸ãæ¬ç±»å·¥ä½æå¤çé¨å
æ¯å¨NetworkTableCollectionï¼å ¶ä»ç±»å®å¨æ¯æ²¡åä»ä¹ãä¸è¿éè¦ä½ å»äºè§£éæ±ä½¿ç¨ç APIã
using System.Text;
using System.Collections.Generic;
using System.Runtime.InteropServices;
#pragma warning disable 649
namespace System.Net
{
[Flags]
public enum NetworkProtocol : uint
{
Ftp = 1,
Gopher,
Http
}
unsafe class Win32Native
{
[DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr InternetConnect(
IntPtr hInternet,
string lpszServerName,
short nServerPort,
string lpszUsername,
string lpszPassword,
int dwService,
int dwFlags,
IntPtr dwContext
);
[DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr HttpOpenRequest(
IntPtr hConnect,
string lpszVerb,
string lpszObjectName,
string lpszVersion,
string lpszReferer,
char** lplpszAcceptTypes,
int dwFlags,
IntPtr dwContext
);
[DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool HttpAddRequestHeaders(
IntPtr hRequest,
string pwszHeaders,
int dwHeadersLength,
uint dwModifiers
);
[DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool HttpSendRequest(
IntPtr hRequest,
string lpszHeaders,
uint dwHeadersLength,
IntPtr lpOptional,
uint dwOptionalLength
);
[DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool HttpQueryInfo(
IntPtr hInternet,
int dwInfoLevel,
StringBuilder lpBuffer,
ref uint lpdwBufferLength,
IntPtr lpdwIndex
);
[DllImport("WinInet.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool InternetCloseHandle(IntPtr hInternet);
public static readonly IntPtr NULL = IntPtr.Zero;
public const int HTTP_QUERY_RAW_HEADERS = 21;
public const int HTTP_QUERY_RAW_HEADERS_CRLF = 22;
public const int HTTP_QUERY_STATUS_CODE = 19;
public const int HTTP_QUERY_SET_COOKIE = 43;
}
public delegate void NetworkCutRequestComplete(object sender, NetworkTable e);
public partial class NetworkCut
{
private class NetworkCutBase
{
public NetHook InternetConnectA;
public NetHook InternetConnectW;
public NetHook HttpOpenRequestA;
public NetHook HttpOpenRequestW;
public NetHook HttpAddRequestHeadersA;
public NetHook HttpAddRequestHeadersW;
public NetHook HttpSendRequestA;
public NetHook HttpSendRequestW;
public NetworkCutBase()
{
var fields = typeof(NetworkCutBase).GetFields();
foreach (var field in fields)
field.SetValue(this, new NetHook());
}
}
private unsafe class Win32Pointer
{
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public delegate IntPtr InternetConnectA(
IntPtr hInternet,
string lpszServerName,
short nServerPort,
string lpszUsername,
string lpszPassword,
int dwService,
int dwFlags,
IntPtr dwContext
);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
public delegate IntPtr InternetConnectW(
IntPtr hInternet,
string lpszServerName,
short nServerPort,
string lpszUsername,
string lpszPassword,
int dwService,
int dwFlags,
IntPtr dwContext
);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public delegate IntPtr HttpOpenRequestA(
IntPtr hConnect,
string lpszVerb,
string lpszObjectName,
string lpszVersion,
string lpszReferer,
char** lplpszAcceptTypes,
int dwFlags,
IntPtr dwContext
);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
public delegate IntPtr HttpOpenRequestW(
IntPtr hConnect,
string lpszVerb,
string lpszObjectName,
string lpszVersion,
string lpszReferer,
char** lplpszAcceptTypes,
int dwFlags,
IntPtr dwContext
);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public delegate bool HttpAddRequestHeadersA(
IntPtr hRequest,
string pwszHeaders,
int dwHeadersLength,
uint dwModifiers
);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
public delegate bool HttpAddRequestHeadersW(
IntPtr hRequest,
string pwszHeaders,
int dwHeadersLength,
uint dwModifiers
);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public delegate bool HttpSendRequestA(
IntPtr hRequest,
string lpszHeaders,
uint dwHeadersLength,
IntPtr lpOptional,
uint dwOptionalLength
);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
public delegate bool HttpSendRequestW(
IntPtr hRequest,
string lpszHeaders,
uint dwHeadersLength,
IntPtr lpOptional,
uint dwOptionalLength
);
}
}
public partial class NetworkCut
{
private NetworkCutBase mNetCutBase;
public event NetworkCutRequestComplete RequestComplete;
public NetworkCut()
{
this.mNetCutBase = new NetworkCutBase();
this.Items = new NetworkTableCollection(this);
}
public void Install()
{
this.ExecuteCommand(-1);
}
public void Uninstall()
{
this.ExecuteCommand(0);
}
public void Suspend()
{
this.ExecuteCommand(2);
}
public void Resume()
{
this.ExecuteCommand(1);
}
private void ExecuteCommand(int command)
{
var asm = typeof(NetworkCutBase).Assembly;
var fields = typeof(NetworkCutBase).GetFields();
foreach (var field in fields)
{
NetHook h = (field.GetValue(mNetCutBase) as NetHook);
switch (command)
{
case -1:
Type td = asm.GetType("System.Net.NetworkCut+Win32Pointer+" + field.Name);
Delegate d = Delegate.CreateDelegate(td, this, field.Name);
h.Install("WinInet.dll", field.Name, Marshal.GetFunctionPointerForDelegate(d));
break;
case 0:
h.Uninstall();
break;
case 1:
h.Resume();
break;
case 2:
h.Suspend();
break;
}
}
}
public NetworkTableCollection Items
{
get;
private set;
}
internal void OnRequestComplete(NetworkTable tab)
{
if (this.RequestComplete != null)
this.RequestComplete(this, tab);
}
}
public unsafe partial class NetworkCut
{
private IntPtr InternetConnectA(IntPtr hInternet, string lpszServerName, short nServerPort,
string lpszUsername, string lpszPassword, int dwService, int dwFlags, IntPtr dwContext)
{
try
{
mNetCutBase.InternetConnectA.Suspend();
IntPtr hConnect = Win32Native.InternetConnect(hInternet, lpszServerName, nServerPort,
lpszUsername, lpszPassword, dwService, dwFlags, dwContext);
this.Items.Add(hInternet, hConnect, lpszServerName, lpszUsername, lpszPassword, dwService, nServerPort);
return hConnect;
}
finally
{
mNetCutBase.InternetConnectA.Resume();
}
}
private IntPtr InternetConnectW(IntPtr hInternet, string lpszServerName, short nServerPort,
string lpszUsername, string lpszPassword, int dwService, int dwFlags, IntPtr dwContext)
{
try
{
mNetCutBase.InternetConnectW.Suspend();
IntPtr hConnect = Win32Native.InternetConnect(hInternet, lpszServerName, nServerPort,
lpszUsername, lpszPassword, dwService, dwFlags, dwContext);
this.Items.Add(hInternet, hConnect, lpszServerName, lpszUsername, lpszPassword, dwService, nServerPort);
return hConnect;
}
finally
{
mNetCutBase.InternetConnectW.Resume();
}
}
private IntPtr HttpOpenRequestA(IntPtr hConnect, string lpszVerb, string lpszObjectName, string lpszVersion,
string lpszReferer, char** lplpszAcceptTypes, int dwFlags, IntPtr dwContext)
{
try
{
mNetCutBase.HttpOpenRequestA.Suspend();
IntPtr hRequest = Win32Native.HttpOpenRequest(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferer, lplpszAcceptTypes, dwFlags, dwContext);
this.Items.Add(hConnect, hRequest, lpszVerb, lpszObjectName, lplpszAcceptTypes, lpszVersion);
return hRequest;
}
finally
{
mNetCutBase.HttpOpenRequestA.Resume();
}
}
private IntPtr HttpOpenRequestW(IntPtr hConnect, string lpszVerb, string lpszObjectName, string lpszVersion,
string lpszReferer, char** lplpszAcceptTypes, int dwFlags, IntPtr dwContext)
{
try
{
mNetCutBase.HttpOpenRequestW.Suspend();
IntPtr hRequest = Win32Native.HttpOpenRequest(hConnect, lpszVerb, lpszObjectName, lpszVersion, lpszReferer, lplpszAcceptTypes, dwFlags, dwContext);
this.Items.Add(hConnect, hRequest, lpszVerb, lpszObjectName, lplpszAcceptTypes, lpszVersion);
return hRequest;
}
finally
{
mNetCutBase.HttpOpenRequestW.Resume();
}
}
private bool HttpAddRequestHeadersA(IntPtr hRequest, string pwszHeaders, int dwHeadersLength, uint dwModifiers)
{
try
{
this.Items.Add(hRequest, pwszHeaders);
mNetCutBase.HttpAddRequestHeadersA.Suspend();
return Win32Native.HttpAddRequestHeaders(hRequest, pwszHeaders, dwHeadersLength, dwModifiers);
}
finally
{
mNetCutBase.HttpAddRequestHeadersA.Resume();
}
}
private bool HttpAddRequestHeadersW(IntPtr hRequest, string pwszHeaders, int dwHeadersLength, uint dwModifiers)
{
try
{
this.Items.Add(hRequest, pwszHeaders);
mNetCutBase.HttpAddRequestHeadersW.Suspend();
return Win32Native.HttpAddRequestHeaders(hRequest, pwszHeaders, dwHeadersLength, dwModifiers);
}
finally
{
mNetCutBase.HttpAddRequestHeadersW.Resume();
}
}
private bool HttpSendRequestA(IntPtr hRequest, string lpszHeaders, uint dwHeadersLength, IntPtr lpOptional, uint dwOptionalLength)
{
try
{
mNetCutBase.HttpSendRequestA.Suspend();
return this.Items.Add(hRequest, lpOptional, dwOptionalLength,
Win32Native.HttpSendRequest(hRequest, lpszHeaders, dwHeadersLength, lpOptional, dwOptionalLength)
);
}
finally
{
mNetCutBase.HttpSendRequestA.Resume();
}
}
private bool HttpSendRequestW(IntPtr hRequest, string lpszHeaders, uint dwHeadersLength, IntPtr lpOptional, uint dwOptionalLength)
{
try
{
mNetCutBase.HttpSendRequestW.Suspend();
return this.Items.Add(hRequest, lpOptional, dwOptionalLength,
Win32Native.HttpSendRequest(hRequest, lpszHeaders, dwHeadersLength, lpOptional, dwOptionalLength)
);
}
finally
{
mNetCutBase.HttpSendRequestW.Resume();
}
}
}
public sealed class NetworkTableCollection : List<NetworkTable>
{
private NetworkCut mNetCut;
private StringBuilder mBuffer = new StringBuilder(4096);
internal NetworkTableCollection(NetworkCut netCut)
{
this.mNetCut = netCut;
}
internal bool Add(IntPtr RequestHandle, IntPtr Data, uint Length, bool SendRequest)
{
if (RequestHandle != Win32Native.NULL)
for (int i = 0, nNoOfStatusCode; i < base.Count; i++)
{
var item = base[i];
if (item.RequestHandle == RequestHandle)
{
if (SendRequest)
{
item.SendRequest = SendRequest;
item.ResponseStatus = NetworkTable.HttpQueryInfo(RequestHandle, Win32Native.HTTP_QUERY_RAW_HEADERS, mBuffer);
item.ResponseCookie = NetworkTable.HttpQueryInfo(RequestHandle, Win32Native.HTTP_QUERY_SET_COOKIE, mBuffer);
int.TryParse(NetworkTable.HttpQueryInfo(RequestHandle, Win32Native.HTTP_QUERY_STATUS_CODE, mBuffer), out nNoOfStatusCode);
this.Add(item.ResponseHeaders, NetworkTable.HttpQueryInfo(RequestHandle, Win32Native.HTTP_QUERY_RAW_HEADERS_CRLF, mBuffer));
item.StatusCode = (HttpStatusCode)nNoOfStatusCode;
}
if (Data != Win32Native.NULL && Length > 0)
{
item.RequestData = new byte[Length];
Marshal.Copy(Data, item.RequestData, 0, (int)Length);
}
this.mNetCut.OnRequestComplete(item);
break;
}
}
return SendRequest;
}
internal void Add(IntPtr RequestHandle, string Headers)
{
if (RequestHandle != Win32Native.NULL && Headers != null && Headers.Length > 0)
try
{
foreach (var item in this)
if (item.RequestHandle == RequestHandle)
this.Add(item.RequestHeaders, Headers);
}
catch
{
return;
}
}
internal void Add(WebHeaderCollection Item, string Headers)
{
if (Headers != null && Headers.Length > 0)
{
var splits = Headers.Split('\r', '\n');
foreach (var split in splits)
{
int index = -1;
if (split.Length > 0 && (index = split.IndexOf(':')) > -1)
{
var key = split.Substring(0, index++);
var value = split.Substring(++index);
Item.Add(key, value);
}
}
}
}
internal void Add(IntPtr SessionHandle, IntPtr ConnectHandle, string Host, string Username, string Password, int Service, short Port)
{
var item = new NetworkTable();
item.RequestPort = Port;
item.RequestHost = Host;
item.Username = Username;
item.Password = Password;
item.ConnectHandle = ConnectHandle;
item.SessionHandle = SessionHandle;
item.ConnectProtocol = (NetworkProtocol)Service;
base.Add(item);
}
internal unsafe void Add(IntPtr ConnectHandle, IntPtr RequestHandle, string Method, string Url, char** Accept, string Version)
{
if (ConnectHandle != Win32Native.NULL)
try
{
foreach (var item in this)
if (item.ConnectHandle == ConnectHandle)
{
item.RequestUrl = Url;
item.RequestMethod = Method;
item.ProtocolVersion = Version ?? "HTTP/1.1";
item.RequestHandle = RequestHandle;
var accept = string.Empty;
while (*Accept != null)
accept += new string(*Accept++);
item.Accept = accept;
return;
}
}
catch
{
return;
}
}
}
public partial class NetworkTable
{
public NetworkTable()
{
this.RequestHeaders = new WebHeaderCollection();
this.ResponseHeaders = new WebHeaderCollection();
}
public IntPtr ConnectHandle
{
get;
set;
}
public IntPtr RequestHandle
{
get;
set;
}
public IntPtr SessionHandle
{
get;
set;
}
public string RequestMethod // verb
{
get;
set;
}
public string Username
{
get;
set;
}
public string Password
{
get;
set;
}
public short RequestPort
{
get;
set;
}
public string RequestHost
{
get;
set;
}
public string RequestUrl
{
get;
set;
}
public NetworkProtocol ConnectProtocol
{
get;
set;
}
public string Accept
{
get;
set;
}
public string ProtocolVersion
{
get;
set;
}
public WebHeaderCollection RequestHeaders
{
get;
set;
}
public byte[] RequestData
{
get;
set;
}
public WebHeaderCollection ResponseHeaders
{
get;
set;
}
public string ResponseCookie
{
get;
set;
}
public string ResponseStatus
{
get;
set;
}
public HttpStatusCode StatusCode
{
get;
set;
}
public bool SendRequest
{
get;
set;
}
public bool CloseHandle()
{
return Win32Native.InternetCloseHandle(this.RequestHandle) |
Win32Native.InternetCloseHandle(this.ConnectHandle) |
Win32Native.InternetCloseHandle(this.SessionHandle);
}
public string QueryInfo(IntPtr Handle, int Query, StringBuilder Buffer)
{
return HttpQueryInfo(Handle, Query, Buffer);
}
public static string HttpQueryInfo(IntPtr Handle, int Query, StringBuilder Buffer)
{
uint size = (uint)Buffer.Capacity;
if (Win32Native.HttpQueryInfo(Handle, Query, Buffer, ref size, IntPtr.Zero))
return Convert.ToString(Buffer);
return null;
}
}
}