mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
5.1 KiB
185 lines
5.1 KiB
/******************************************************************************
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
dlutil.h
|
|
|
|
Abstract:
|
|
header for download library
|
|
|
|
******************************************************************************/
|
|
|
|
#ifndef DLUTIL_H
|
|
#define DLUTIL_H
|
|
|
|
#include <strsafe.h>
|
|
#include <wusafefn.h>
|
|
#include <mistsafe.h>
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// const defines & typedefs
|
|
|
|
#define UNLEN 256
|
|
|
|
// need to define this here cuz winhttp.h doesn't define it and we get dupe
|
|
// definitions if we try to include wininet.h just to get it.
|
|
#ifndef INTERNET_MAX_URL_LENGTH
|
|
#define INTERNET_MAX_URL_LENGTH 2200
|
|
#endif
|
|
|
|
const DWORD c_cbDownloadBuffer = 32 * 1024; // 32k
|
|
const DWORD c_cbDownloadBufferLite = 4 * 1024; // 4k
|
|
|
|
const DWORD c_dwRetryTimeLimitInmsWinHttp = 2 * 60 * 1000; // 120s (2m)
|
|
const DWORD c_dwRetryTimeLimitInmsWiuInet = 10 * 1000; // 10s
|
|
const DWORD c_cMaxRetries = 3;
|
|
|
|
const WCHAR c_wszUserAgent[] = L"Industry Update Control";
|
|
const char c_szUserAgent[] = "Industry Update Control";
|
|
|
|
const DWORD c_cchMaxURLSize = INTERNET_MAX_URL_LENGTH;
|
|
|
|
#ifdef UNICODE
|
|
#define c_tszUserAgent c_wszUserAgent
|
|
#else
|
|
#define c_tszUserAgent c_szUserAgent
|
|
#endif
|
|
|
|
typedef BOOL (__stdcall *pfn_ReadDataFromSite)(HINTERNET, LPVOID, DWORD, LPDWORD);
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// macro defines
|
|
|
|
#define sizeofSTRW(wsz) (sizeof(wsz) / sizeof(WCHAR))
|
|
#define sizeofSTRA(sz) (sizeof(sz))
|
|
#define sizeofSTRT(sz) (sizeof(sz) / sizeof(TCHAR))
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// necessary classes
|
|
|
|
class CAutoCritSec
|
|
{
|
|
private:
|
|
#if defined(DEBUG) || defined(DBG)
|
|
DWORD m_dwOwningThread;
|
|
DWORD m_cLocks;
|
|
#endif
|
|
|
|
CRITICAL_SECTION m_cs;
|
|
BOOL m_fInit;
|
|
|
|
public:
|
|
CAutoCritSec(void)
|
|
{
|
|
m_fInit = WUInitializeCriticalSectionAndSpinCount(&m_cs, 0x8000FA0);
|
|
#if defined(DEBUG) || defined(DBG)
|
|
m_cLocks = 0;
|
|
m_dwOwningThread = 0;
|
|
#endif
|
|
}
|
|
|
|
~CAutoCritSec(void)
|
|
{
|
|
#if defined(DEBUG) || defined(DBG)
|
|
if (m_cLocks > 0 || m_dwOwningThread != 0)
|
|
{
|
|
// can't do logging here cuz this could be run during DllMain
|
|
}
|
|
#endif
|
|
if (m_fInit)
|
|
DeleteCriticalSection(&m_cs);
|
|
}
|
|
|
|
BOOL Lock(void)
|
|
{
|
|
LOG_Block("CAutoCritSec::Lock()");
|
|
|
|
if (m_fInit)
|
|
{
|
|
EnterCriticalSection(&m_cs);
|
|
#if defined(DEBUG) || defined(DBG)
|
|
m_cLocks++;
|
|
m_dwOwningThread = GetCurrentThreadId();
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
LOG_Internet(_T("CAutoCritSec not initialized during Lock."));
|
|
}
|
|
|
|
return m_fInit;
|
|
}
|
|
|
|
BOOL Unlock(void)
|
|
{
|
|
LOG_Block("CAutoCritSec::Unlock()");
|
|
|
|
if (m_fInit)
|
|
{
|
|
#if defined(DEBUG) || defined(DBG)
|
|
if (m_cLocks == 0)
|
|
LOG_Internet(_T("CAutoCritSec: trying to unlock when lock count is 0"));
|
|
else
|
|
m_cLocks--;
|
|
|
|
if (m_dwOwningThread != GetCurrentThreadId())
|
|
{
|
|
LOG_Internet(_T("CAutoCritSec: lock not owned by current thread: Owning thread: %d. Current thread: %d"),
|
|
m_dwOwningThread, GetCurrentThreadId());
|
|
}
|
|
|
|
if (m_cLocks == 0)
|
|
m_dwOwningThread = 0;
|
|
#endif
|
|
LeaveCriticalSection(&m_cs);
|
|
}
|
|
else
|
|
{
|
|
LOG_Internet(_T("CAutoCritSec not initialized during Unlock."));
|
|
}
|
|
|
|
return m_fInit;
|
|
}
|
|
};
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// prototypes
|
|
|
|
BOOL IsServerFileDifferentW(FILETIME &ftServerTime, DWORD dwServerFileSize,
|
|
LPCWSTR wszLocalFile);
|
|
BOOL IsServerFileDifferentA(FILETIME &ftServerTime, DWORD dwServerFileSize,
|
|
LPCSTR szLocalFile);
|
|
#ifdef UNICODE
|
|
#define IsServerFileDifferent IsServerFileDifferentW
|
|
#else
|
|
#define IsServerFileDifferent IsServerFileDifferentA
|
|
#endif // !UNICODE
|
|
|
|
|
|
HRESULT PerformDownloadToFile(pfn_ReadDataFromSite pfnRead,
|
|
HINTERNET hRequest,
|
|
HANDLE hFile, DWORD cbFile,
|
|
DWORD cbBuffer,
|
|
HANDLE *rghEvents, DWORD cEvents,
|
|
PFNDownloadCallback fpnCallback, LPVOID pCallbackData,
|
|
DWORD *pcbDownloaded);
|
|
|
|
|
|
HRESULT StartWinInetDownload(HMODULE hmodWinInet,
|
|
LPCTSTR pszServerUrl,
|
|
LPCTSTR pszLocalPath,
|
|
DWORD *pdwDownloadedBytes,
|
|
HANDLE *hQuitEvents,
|
|
UINT nQuitEventCount,
|
|
PFNDownloadCallback fpnCallback,
|
|
LPVOID pCallbackData,
|
|
DWORD dwFlags,
|
|
DWORD cbDownloadBuffer);
|
|
|
|
HRESULT IsFileHtml(LPCTSTR pszFileName);
|
|
|
|
#endif
|