Skip to content

Instantly share code, notes, and snippets.

@rbmm
Last active June 8, 2024 10:53
Show Gist options
  • Save rbmm/59419dcc3d559426a5fd8df12af96dd1 to your computer and use it in GitHub Desktop.
Save rbmm/59419dcc3d559426a5fd8df12af96dd1 to your computer and use it in GitHub Desktop.
inline ULONG BOOL_TO_ERROR(BOOL f)
{
return f ? NOERROR : GetLastError();
}
#define case_INTERNET_CALLBACK_STATUS(x) case INTERNET_STATUS_##x: return #x;
PCSTR GetStatusName(DWORD dwInternetStatus)
{
switch (dwInternetStatus)
{
case_INTERNET_CALLBACK_STATUS(RESOLVING_NAME)
case_INTERNET_CALLBACK_STATUS(NAME_RESOLVED)
case_INTERNET_CALLBACK_STATUS(CONNECTING_TO_SERVER)
case_INTERNET_CALLBACK_STATUS(CONNECTED_TO_SERVER)
case_INTERNET_CALLBACK_STATUS(SENDING_REQUEST)
case_INTERNET_CALLBACK_STATUS(REQUEST_SENT)
case_INTERNET_CALLBACK_STATUS(RECEIVING_RESPONSE)
case_INTERNET_CALLBACK_STATUS(RESPONSE_RECEIVED)
case_INTERNET_CALLBACK_STATUS(CLOSING_CONNECTION)
case_INTERNET_CALLBACK_STATUS(CONNECTION_CLOSED)
case_INTERNET_CALLBACK_STATUS(HANDLE_CREATED)
case_INTERNET_CALLBACK_STATUS(HANDLE_CLOSING)
case_INTERNET_CALLBACK_STATUS(DETECTING_PROXY)
case_INTERNET_CALLBACK_STATUS(REDIRECT)
case_INTERNET_CALLBACK_STATUS(INTERMEDIATE_RESPONSE)
case_INTERNET_CALLBACK_STATUS(REQUEST_COMPLETE)
case_INTERNET_CALLBACK_STATUS(COOKIE_SENT)
case_INTERNET_CALLBACK_STATUS(COOKIE_RECEIVED)
}
return "??";
}
void PrintHeaders(HINTERNET hRequest)
{
ULONG cb = 0x1000, dwError , len;
do
{
dwError = NOERROR;
if (PVOID buf = LocalAlloc(LMEM_FIXED, cb))
{
if (HttpQueryInfoW(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, buf, &cb, 0))
{
if (cb)
{
cb /= sizeof(WCHAR);
PWSTR phsz = (PWSTR)buf;
do
{
len = min(cb, 0x100);
DbgPrint("%.*S", len, phsz);
} while (phsz += len, cb -= len);
}
}
else
{
dwError = GetLastError();
}
LocalFree(buf);
}
else
{
dwError = ERROR_NO_SYSTEM_RESOURCES;
}
} while (dwError == ERROR_INSUFFICIENT_BUFFER);
}
class CInet
{
HINTERNET _M_hInternet = 0;
LONG _M_dwRefCount = 1;
protected:
virtual ~CInet()
{
DbgPrint("%x: %s<%p>\n", GetCurrentThreadId(), __FUNCTION__, this);
close();
}
HINTERNET Assign(HINTERNET hInternet)
{
_M_hInternet = hInternet;
return hInternet;
}
public:
CInet()
{
DbgPrint("%x: %s<%p>\n", GetCurrentThreadId(), __FUNCTION__, this);
}
void AddRef()
{
InterlockedIncrementNoFence(&_M_dwRefCount);
}
void Release()
{
if (!InterlockedDecrement(&_M_dwRefCount)) delete this;
}
HINTERNET Open(
_In_opt_ PCWSTR lpszAgent,
_In_ DWORD dwAccessType = INTERNET_OPEN_TYPE_DIRECT,
_In_opt_ PCWSTR lpszProxy = 0,
_In_opt_ PCWSTR lpszProxyBypass = 0
)
{
return Assign(InternetOpenW(lpszAgent, dwAccessType, lpszProxy, lpszProxyBypass, INTERNET_FLAG_ASYNC));
}
void close()
{
if (HINTERNET hInternet = InterlockedExchangePointer(&_M_hInternet, 0))
{
InternetCloseHandle(hInternet);
}
}
};
class CInetUI : public CInet
{
ULONG _M_dwThreadId = GetCurrentThreadId();
virtual ~CInetUI()
{
PostThreadMessageW(_M_dwThreadId, WM_QUIT, 0, 0);
}
};
class CCon : public CInet
{
CInet* _M_pInet;
virtual ~CCon()
{
_M_pInet->Release();
}
public:
CCon(CInet* pInet) : _M_pInet(pInet)
{
pInet->AddRef();
}
HINTERNET Connect(
_In_ HINTERNET hInternet,
_In_ PCWSTR lpszServerName,
_In_ INTERNET_PORT nServerPort,
_In_opt_ PCWSTR lpszUserName,
_In_opt_ PCWSTR lpszPassword,
_In_ DWORD dwService,
_In_ DWORD dwFlags
)
{
return Assign(InternetConnect(hInternet, lpszServerName,
nServerPort, lpszUserName, lpszPassword, dwService, dwFlags, 0));
}
};
class __declspec(novtable) CRequest : public CInet
{
CCon* _M_pSrv;
enum { api_none, api_HttpSendRequestW, api_InternetReadFile } _api = api_none;
ULONG _M_dwNumberOfBytesRead = 0;
static void WINAPI _S_StatusCallback(
_In_ HINTERNET hRequest,
_In_ DWORD_PTR dwContext,
_In_ DWORD dwInternetStatus,
_In_ PVOID lpvStatusInformation,
_In_ DWORD dwStatusInformationLength
)
{
reinterpret_cast<CRequest*>(dwContext)->StatusCallback(
hRequest, dwInternetStatus, lpvStatusInformation, dwStatusInformationLength);
}
void StatusCallback(
_In_ HINTERNET hRequest,
_In_ DWORD dwInternetStatus,
_In_ PVOID lpvStatusInformation,
_In_ DWORD dwStatusInformationLength
)
{
DbgPrint("%x: %s<%p>(%08x(%s), %p, %x)\n", GetCurrentThreadId(), __FUNCTION__, this,
dwInternetStatus, GetStatusName(dwInternetStatus), lpvStatusInformation, dwStatusInformationLength);
switch (dwInternetStatus)
{
case INTERNET_STATUS_HANDLE_CLOSING:
// will be no more callbacks
Release();
break;
case INTERNET_STATUS_REQUEST_COMPLETE:
OnRequestComplete(hRequest, reinterpret_cast<INTERNET_ASYNC_RESULT*>(lpvStatusInformation)->dwError);
break;
}
}
static PCSTR GetApiName(int api)
{
switch (api)
{
case api_HttpSendRequestW: return "HttpSendRequest";
case api_InternetReadFile: return "InternetReadFile";
}
return "api_???";
}
void OnRequestComplete(HINTERNET hRequest, ULONG dwError)
{
DbgPrint("%x: %s<%p>: %s=%x\n", GetCurrentThreadId(), __FUNCTION__, this, GetApiName(_api), dwError);
if (dwError)
{
close();
return;
}
switch (_api)
{
case api_HttpSendRequestW:
OnConnect(hRequest);
break;
case api_InternetReadFile:
OnRead(hRequest, _M_dwNumberOfBytesRead, TRUE);
break;
default: __debugbreak();
}
}
virtual PVOID GetBuf(_Out_ PULONG lpdwNumberOfBytesToRead) = 0;
virtual BOOL OnRead(ULONG dwNumberOfBytesRead) = 0;
virtual void OnReadCompleted() = 0;
void OnRead(HINTERNET hRequest, ULONG dwNumberOfBytesRead, BOOL bRead)
{
if (dwNumberOfBytesRead)
{
if (OnRead(dwNumberOfBytesRead) && bRead)
{
Read(hRequest);
}
}
else
{
OnReadCompleted();
close();
}
}
protected:
virtual ~CRequest()
{
_M_pSrv->Release();
}
void Read(HINTERNET hRequest)
{
_api = api_InternetReadFile;
__0:
DbgPrint("%x: InternetReadFile...\n", GetCurrentThreadId());
_M_dwNumberOfBytesRead = 0;
ULONG dwNumberOfBytesToRead;
PVOID lpBuffer = GetBuf(&dwNumberOfBytesToRead);
ULONG dwError = BOOL_TO_ERROR(InternetReadFile(hRequest, lpBuffer, dwNumberOfBytesToRead, &_M_dwNumberOfBytesRead));
DbgPrint("%x: InternetReadFile=%x, %x\n", GetCurrentThreadId(), dwError, _M_dwNumberOfBytesRead);
switch (dwError)
{
case ERROR_IO_PENDING:
break;
case NOERROR:
//optimization, we can goto default: here but will be recurcive calls
OnRead(hRequest, _M_dwNumberOfBytesRead, FALSE);
if (_M_dwNumberOfBytesRead)
{
goto __0;
}
break;
default:
OnRequestComplete(hRequest, dwError);
}
}
virtual void OnConnect(HINTERNET hRequest) = 0;
public:
CRequest(CCon* pSrv) : _M_pSrv(pSrv)
{
pSrv->AddRef();
}
HINTERNET OpenRequest(
_In_ HINTERNET hConnect,
_In_opt_ PCWSTR lpszVerb,
_In_opt_ PCWSTR lpszObjectName,
_In_opt_ PCWSTR lpszVersion,
_In_opt_ PCWSTR lpszReferrer,
_In_opt_z_ PCWSTR * lplpszAcceptTypes,
_In_ DWORD dwFlags
)
{
if (HINTERNET hRequest = HttpOpenRequestW(hConnect, lpszVerb, lpszObjectName, lpszVersion,
lpszReferrer, lplpszAcceptTypes, dwFlags, (ULONG_PTR)this))
{
Assign(hRequest);
AddRef();
if (INTERNET_INVALID_STATUS_CALLBACK == InternetSetStatusCallback(hRequest, _S_StatusCallback))
{
Release();
close();
return 0;
}
return hRequest;
}
return 0;
}
void SendRequest(
_In_ HINTERNET hRequest,
_In_reads_opt_(dwHeadersLength) PCWSTR lpszHeaders = 0,
_In_ DWORD dwHeadersLength = 0,
_In_reads_bytes_opt_(dwOptionalLength) PVOID lpOptional = 0,
_In_ DWORD dwOptionalLength = 0
)
{
_api = api_HttpSendRequestW;
switch (ULONG dwError = BOOL_TO_ERROR(HttpSendRequestW(hRequest, lpszHeaders, dwHeadersLength, lpOptional, dwOptionalLength)))
{
case ERROR_IO_PENDING:
break;
default:
OnRequestComplete(hRequest, dwError);
}
}
};
class CMyRequest : public CRequest
{
PSTR _M_Buf = 0;
ULONG _M_dwTotalRead = 0;
ULONG _M_dwFreeSpace = 0;
virtual ~CMyRequest()
{
if (_M_Buf) delete [] _M_Buf;
}
virtual void OnConnect(HINTERNET hRequest)
{
PrintHeaders(hRequest);
if (_M_Buf = new CHAR[_M_dwFreeSpace = 0x100000])
{
Read(hRequest);
}
else
{
close();
}
}
virtual void OnReadCompleted()
{
DbgPrint("%x: read completed !!\n", GetCurrentThreadId());
}
virtual PVOID GetBuf(_Out_ PULONG lpdwNumberOfBytesToRead)
{
*lpdwNumberOfBytesToRead = _M_dwFreeSpace;
return _M_Buf + _M_dwTotalRead;
}
virtual BOOL OnRead(ULONG dwNumberOfBytesRead)
{
_M_dwTotalRead += dwNumberOfBytesRead, _M_dwFreeSpace -= dwNumberOfBytesRead;
DbgPrint("%x: OnRead(%x/%x)\n", GetCurrentThreadId(), dwNumberOfBytesRead, _M_dwTotalRead);
return TRUE;
}
public:
CMyRequest(CCon* pSrv) : CRequest(pSrv)
{
}
};
void InternetTest(PCWSTR lpszServerName, PCWSTR lpszObjectName)
{
if (CInet* pInet = new CInetUI)
{
if (HINTERNET hInternet = pInet->Open(L"Test Agent"))
{
if (CCon* pSrv = new CCon(pInet))
{
if (HINTERNET hConnect = pSrv->Connect(hInternet, lpszServerName,
INTERNET_DEFAULT_HTTPS_PORT, 0, 0, INTERNET_SERVICE_HTTP, 0))
{
if (CRequest* pReq = new CMyRequest(pSrv))
{
if (HINTERNET hRequest = pReq->OpenRequest(hConnect, 0, lpszObjectName, 0, 0, 0,
INTERNET_FLAG_PRAGMA_NOCACHE|INTERNET_FLAG_SECURE))
{
pReq->SendRequest(hRequest);
}
pReq->Release();
}
}
pSrv->Release();
}
}
pInet->Release();
}
}
void InternetTest()
{
InternetTest(L"www.linkedin.com", L"/feed/");
MessageBoxW(0,0,0,0);
}
/*
7ac: CInet::CInet<000001BB7906DE50>
7ac: CInet::CInet<000001BB7906DEA0>
7ac: CInet::CInet<000001BB790AF630>
1818: CRequest::StatusCallback<000001BB790AF630>(00000050(DETECTING_PROXY), 0000000000000000, 0)
c20: CRequest::StatusCallback<000001BB790AF630>(00000140(COOKIE_SENT), 0000008501FFED90, 10)
c20: CRequest::StatusCallback<000001BB790AF630>(0000000a(RESOLVING_NAME), 000001BB79108C20, 10)
c20: CRequest::StatusCallback<000001BB790AF630>(0000000b(NAME_RESOLVED), 0000008501FFD900, d)
c20: CRequest::StatusCallback<000001BB790AF630>(00000014(CONNECTING_TO_SERVER), 0000008501FFDCC0, d)
1818: CRequest::StatusCallback<000001BB790AF630>(00000015(CONNECTED_TO_SERVER), 00000085020FEE20, d)
1818: CRequest::StatusCallback<000001BB790AF630>(0000001e(SENDING_REQUEST), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(0000001f(REQUEST_SENT), 00000085020FE790, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEF20, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEC70, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEC70, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEC70, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEC70, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000141(COOKIE_RECEIVED), 00000085020FEBC0, 20)
1818: CRequest::StatusCallback<000001BB790AF630>(0000006e(REDIRECT), 000001BB79159980, 5c)
1818: CRequest::StatusCallback<000001BB790AF630>(00000050(DETECTING_PROXY), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000140(COOKIE_SENT), 00000085020FEDE0, 10)
1818: CRequest::StatusCallback<000001BB790AF630>(0000001e(SENDING_REQUEST), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(0000001f(REQUEST_SENT), 00000085020FE550, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEF20, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEC70, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEC70, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEC70, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEC70, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000064(REQUEST_COMPLETE), 00000085020FF140, 10)
1818: CRequest::OnRequestComplete<000001BB790AF630>: HttpSendRequest=0
HTTP/1.1 200 OK
Date: Sat, 08 Jun 2024 08:57:24 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Last-Modified: Thu, 06 Jun 2024 10:59:02 PDT
X-FS-UUID: 00061a5d1ac9cee40a7684e9387e8da0
Strict-Transport-Security: max-age=31536000
X-Content-Type-Options: nosniff
X-Frame-Options: sameorigin
Content-Security-Policy: default-src 'none'; connect-src 'self' *.licdn.com *.linkedin.com cdn.linkedin.oribi.io dpm.demdex.net/id lnkd.demdex.net blob: accounts.google.com/gsi/ linkedin.sc.omtrdc.net/b/ss/ v.clarity.ms/collect *.microsoft.com *.adnxs.com *.tealiumiq.com login.microsoftonline.com; script-src 'report-sample' 'sha256-th47JTnh6tX15SUn/I+GGmsOSXpa7dh5Skner77gxlY=' 'sha256-SSoodjUD3LGm2FfFCVHGqEb8D4UM3OOigidT2UKDcYg=' 'sha256-cKTgdnmO6+hXd85a9wKg1effVfVzenUAtUCyOKY9bQE=' 'sha256-DwtT8+ZZKpxH9pqZNAmJ3GdbLAh5SsYaXR3omTXPCns=' 'sha256-sV9jZa797T0QWBzcU/CNd4tpBhTnh+TFdLnfjlitl28=' 'sha256-aa/Q8CRBDSqTQbCIyioPhZaz+G+dbPyu7BzsjInEmiU=' 'sha256-THuVhwbXPeTR0HszASqMOnIyxqEgvGyBwSPBKBF/iMc=' 'sha256-zTIusdVJJeXz9+iox2a+pdDglzbpRpFVRzEwvW4AONk=' 'sha256-iC8MPqNLw0FDnsBf4DlSkFLNTwhkI85aouiAEB819ic=' 'sha256-2EqrEvcPzl8c6/TSGVvaVMEe7lg700MAz/te4/3kTYY=' 'sha256-y5uW69VItKj51mcc7UD9qfptDVUqicZL+bItEpvVNDw=' 'sha256-DatsFGoJ8gFkzzxo47Ou76WZ+3QBPOQHtBu9p9b3DhA=' 'sha256-k95cyM8gFgPziZe5VQ2IvJvBUVyd5zFt2CokIUwqdHE=' 'sha256-PyCXNcEkzRWqbiNr087fizmiBBrq9O6GGD8eV3P09Ik=' 'sha256-RFqsjmAF1N5LnfpaHFvPqFlVkeIS/DtTAFor+JjJJVc=' 'sha256-2SQ55Erm3CPCb+k03EpNxU9bdV3XL9TnVTriDs7INZ4=' 'sha256-S/KSPe186K/1B0JEjbIXcCdpB97krdzX05S+dHnQjUs=' 'sha256-9pXOIwF4N0gPltLd3AI69lkCjSC2H/Eb3sc5zdmUyYU=' 'sha256-jou6v/Nleyzoc+LXktAv1Fp8M807dVVxy7E/yzVljHc=' 'sha256-6E4e/3dSvj/8JZT2S2yR91mspqM6MyOpKl5lrhHsZa8=' 'sha256-3woF8BZ54TeXM+czaH3aXoaJsVpiamuAKFsXDykAR/Q=' 'sha256-vIfNcKb8ixJg1cfJIoNNYjWcm0lezj1/XpUNFiZyVsU=' 'sha256-cLsHUHFgT/VGX04cZrJ9xgm4HbzTR7ptutkxK+7BlMk=' 'sha256-BwU8jMnQYUhjOpsDVABpfddV/DlP1ZYrFcTumYw7x54=' 'sha256-wz6ika9i3WU3bpUPdhYDZeO/NrDQniDyiscN0LWnyaY=' static.licdn.com static-exp1.licdn.com static-exp2.licdn.com static-exp3.licdn.com platform.linkedin.com platform-akam.linkedin.com platform-ecst.linkedin.com platform-azur.linkedin.com snap.licdn.com www.googletagmanager.com/gtag/js; img-src data: blob: * android-webview-video-poster:; font-src data: *; style-src 'self' 'unsafe-inline' static.licdn.com static-exp1.licdn.com static-exp2.licdn.com static-exp3.licdn.com; media-src 'self' *.licdn.com *.lynda.com; worker-src 'self' blob: static.licdn.com static-exp1.licdn.com static-exp2.licdn.com static-exp3.licdn.com; frame-src 'self' www.youtube.com/embed/ www.youtube-nocookie.com/embed/ lnkd.demdex.net smartlock.google.com accounts.google.com player.vimeo.com *.linkedin.com www.slideshare.net *.megaphone.fm *.omny.fm *.sounder.fm msit.powerbi.com app.powerbi.com linkedin.github.io *.licdn.com *.adnxs.com acdn.adnxs-simple.com radar.cedexis.com edge-auth.microsoft.com; frame-ancestors 'self' *.www.linkedin.com:*; manifest-src 'self'; report-uri https://www.linkedin.com/security/csp?f=grl
X-Li-Fabric: prod-lva1
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache, no-store
X-Li-Pop: cf-prod-lva1-x
X-Li-Proto: http/1.1
X-LI-UUID: AAYaXRrJzuQKdoTpOH6NoA==
CF-Cache-Status: DYNAMIC
Server: cloudflare
CF-RAY: 8907ac948b48a05b-FRA
1818: InternetReadFile...
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FE0E0, 4)
1818: InternetReadFile=0, 3574
1818: OnRead(3574/3574)
1818: InternetReadFile...
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FE0E0, 4)
1818: InternetReadFile=0, 559
1818: OnRead(559/3acd)
1818: InternetReadFile...
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FE0E0, 4)
1818: InternetReadFile=0, 26fb
1818: OnRead(26fb/61c8)
1818: InternetReadFile...
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: InternetReadFile=3e5, 0
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FEF20, 4)
1818: CRequest::StatusCallback<000001BB790AF630>(00000064(REQUEST_COMPLETE), 00000085020FF140, 10)
1818: CRequest::OnRequestComplete<000001BB790AF630>: InternetReadFile=0
1818: OnRead(553/671b)
1818: InternetReadFile...
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FE0E0, 4)
1818: InternetReadFile=0, 2016
1818: OnRead(2016/8731)
1818: InternetReadFile...
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FE0E0, 4)
1818: InternetReadFile=0, 559
1818: OnRead(559/8c8a)
1818: InternetReadFile...
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 00000085020FE0E0, 4)
1818: InternetReadFile=0, 1abd
1818: OnRead(1abd/a747)
1818: InternetReadFile...
1818: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
1818: InternetReadFile=3e5, 0
c20: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 0000008501FFEED0, 4)
c20: CRequest::StatusCallback<000001BB790AF630>(00000064(REQUEST_COMPLETE), 0000008501FFF0F0, 10)
c20: CRequest::OnRequestComplete<000001BB790AF630>: InternetReadFile=0
c20: OnRead(559/aca0)
c20: InternetReadFile...
c20: CRequest::StatusCallback<000001BB790AF630>(00000028(RECEIVING_RESPONSE), 0000000000000000, 0)
c20: CRequest::StatusCallback<000001BB790AF630>(00000029(RESPONSE_RECEIVED), 0000008501FFE090, 4)
c20: InternetReadFile=0, bbd
c20: OnRead(bbd/b85d)
c20: InternetReadFile...
c20: InternetReadFile=0, 0
c20: OnRead(0/b85d)
c20: read completed !!
c20: CRequest::StatusCallback<000001BB790AF630>(00000046(HANDLE_CLOSING), 0000008501FFEF80, 8)
c20: CInet::~CInet<000001BB7906DE50>
c20: CInet::~CInet<000001BB7906DEA0>
c20: CInet::~CInet<000001BB790AF630>
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment