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.
148 lines
5.4 KiB
148 lines
5.4 KiB
#ifndef _PATCHDOWNLOAD
|
|
#define _PATCHDOWNLOAD
|
|
|
|
#include "advpext.h"
|
|
#include "download.h"
|
|
|
|
#define WM_FILEAVAILABLE WM_USER + 1
|
|
#define PATCHFLAG_DOWNLOAD_NEEDED 0x00000001
|
|
|
|
|
|
|
|
typedef struct {
|
|
WORD wOSVer;
|
|
WORD wQuietMode;
|
|
BOOL bUpdHlpDlls;
|
|
HINSTANCE hSetupLibrary;
|
|
BOOL fOSSupportsINFInstalls;
|
|
LPSTR lpszTitle;
|
|
HWND hWnd;
|
|
DWORD dwSetupEngine;
|
|
BOOL bCompressed;
|
|
char szBrowsePath[MAX_PATH];
|
|
HINF hInf;
|
|
BOOL bHiveLoaded;
|
|
CHAR szRegHiveKey[MAX_PATH];
|
|
} ADVCONTEXT, *PADVCONTEXT;
|
|
|
|
|
|
HRESULT ProcessFileSection(ADVCONTEXT ctx, LPCSTR lpszSrcDir);
|
|
|
|
|
|
typedef struct _FILE_LIST_INFO
|
|
{
|
|
PDOWNLOAD_FILEINFO FileList; //original file list
|
|
DWORD FileCount;
|
|
PATCH_DOWNLOAD_CALLBACK Callback;
|
|
PVOID CallbackContext;
|
|
}FILE_LIST_INFO, *PFILE_LIST_INFO;
|
|
|
|
|
|
typedef struct _PATCH_THREAD_INFO
|
|
{
|
|
//PATCH_QUEUE PatchQueue;
|
|
FILE_LIST_INFO FileListInfo; //original file list
|
|
DOWNLOAD_INFO* lpdwnProgressInfo;
|
|
HANDLE hFileDownloadEvent;
|
|
}PATCH_THREAD_INFO, *PPATCH_THREAD_INFO;
|
|
|
|
|
|
typedef struct _FILE
|
|
{
|
|
LPTSTR lpszFileName;
|
|
DWORD dwFileSize;
|
|
} FILE, *LPFILE;
|
|
|
|
|
|
class CPatchDownloader : public CDownloader
|
|
{
|
|
DOWNLOAD_FILEINFO* m_lpFileInfo;
|
|
PATCH_DOWNLOAD_CALLBACK m_lpfnCallback;
|
|
LPTSTR m_lpszRequestBuffer;
|
|
LPTSTR m_lpszSiteName;
|
|
TCHAR m_lpszDownLoadDir[MAX_PATH];
|
|
|
|
DWORD m_dwFileCount;
|
|
DWORD m_dwServerFileCount;
|
|
DWORD m_dwRequestDataLength;
|
|
DWORD m_dwCurrentFileSize;
|
|
DWORD m_dwCurrFileSizeRemaining;
|
|
DWORD m_dwCurrentFileIndex;
|
|
DWORD m_dwPatchThreadId;
|
|
|
|
HANDLE m_hCurrentFileHandle;
|
|
HANDLE m_hSubAllocator;
|
|
|
|
LPFILE m_lpFileList;
|
|
LPVOID m_lpvContext;
|
|
DOWNLOAD_INFO m_DownloadInfo;
|
|
|
|
|
|
HRESULT CreateRequestBuffer(DWORD);
|
|
BOOL ProcessDownloadChunk(LPTSTR lpBuffer, DWORD dwLength);
|
|
|
|
public:
|
|
CPatchDownloader(DOWNLOAD_FILEINFO* pdwn, DWORD dwFileCount, PATCH_DOWNLOAD_CALLBACK lpfn);
|
|
~CPatchDownloader();
|
|
|
|
STDMETHOD(GetBindInfo)(/* [out] */ DWORD *grfBINDINFOF, /* [unique][out][in] */ BINDINFO *pbindinfo);
|
|
|
|
STDMETHOD(OnProgress)(
|
|
/* [in] */ ULONG ulProgress,
|
|
/* [in] */ ULONG ulProgressMax,
|
|
/* [in] */ ULONG ulStatusCode,
|
|
/* [in] */ LPCWSTR szStatusText);
|
|
|
|
STDMETHOD(OnDataAvailable)(
|
|
/* [in] */ DWORD grfBSCF,
|
|
/* [in] */ DWORD dwSize,
|
|
/* [in] */ FORMATETC *pformatetc,
|
|
/* [in] */ STGMEDIUM *pstgmed);
|
|
|
|
|
|
|
|
HRESULT InternalDownloadAndPatchFiles(LPCTSTR lpszPath, CSiteMgr*, LPVOID lpvContext);
|
|
};
|
|
|
|
DWORD WINAPI PatchThread(IN LPVOID ThreadParam);
|
|
BOOL ProtectedPatchDownloadCallback(PATCH_DOWNLOAD_CALLBACK Callback, IN PATCH_DOWNLOAD_REASON CallbackReason,
|
|
IN PVOID CallbackData, IN PVOID CallbackContext);
|
|
|
|
void AddToFileList(LPCSTR lpszSrc, LPCSTR lpszTarget);
|
|
UINT WINAPI MyFileQueueCallback( PVOID Context,UINT Notification,UINT_PTR parm1,UINT_PTR parm2 );
|
|
void FreeFileList(PDOWNLOAD_FILEINFO pFileList);
|
|
HRESULT CreateRequestBuffer(DOWNLOAD_FILEINFO*pFileInfo, DWORD dwFileCount, DWORD dwDownloadClientID,
|
|
LPTSTR* lpRequestBuffer, LPDWORD);
|
|
|
|
|
|
BOOL IsDownloadedNeeded(LPCTSTR lp, LPCTSTR lpszFileName);
|
|
BOOL CALLBACK ProgressDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
|
|
BOOL SetProgressText(LPCTSTR lpszText);
|
|
BOOL SetProgressText(UINT uID);
|
|
BOOL VerifyHash(LPTSTR lpszFile);
|
|
HRESULT LoadSetupAPIFuncs();
|
|
HRESULT ApplyPatchesToLocalFiles(DOWNLOAD_FILEINFO* pFileList, DWORD dwFileCount);
|
|
|
|
|
|
static const TCHAR c_szSetupDefaultQueueCallback[] = "SetupDefaultQueueCallbackA";
|
|
static const TCHAR c_szSetupInstallFromInfSection[] = "SetupInstallFromInfSectionA";
|
|
static const TCHAR c_szSetupInitDefaultQueueCallbackEx[] = "SetupInitDefaultQueueCallbackEx";
|
|
static const TCHAR c_szSetupTermDefaultQueueCallback[] = "SetupTermDefaultQueueCallback";
|
|
static const TCHAR c_szSetupGetLineText[] = "SetupGetLineTextA";
|
|
static const TCHAR c_szSetupFindFirstLine[] = "SetupFindFirstLineA";
|
|
static const TCHAR c_szSetupFindNextLine[] = "SetupFindNextLine";
|
|
static const TCHAR c_szSetupGetStringField[] = "SetupGetStringFieldA";
|
|
static const TCHAR c_szSetupDecompressOrCopyFile[] = "SetupDecompressOrCopyFileA";
|
|
|
|
typedef UINT (WINAPI *PFSetupDefaultQueueCallback)( PVOID, UINT, UINT_PTR, UINT_PTR );
|
|
typedef BOOL (WINAPI *PFSetupInstallFromInfSection)( HWND, HINF, PCSTR, UINT, HKEY, PCSTR, UINT, PSP_FILE_CALLBACK_A, PVOID, HDEVINFO, PSP_DEVINFO_DATA );
|
|
typedef PVOID (WINAPI *PFSetupInitDefaultQueueCallbackEx)( HWND,HWND,UINT,DWORD,PVOID );
|
|
typedef VOID (WINAPI *PFSetupTermDefaultQueueCallback)( PVOID );
|
|
typedef BOOL (WINAPI *PFSetupFindFirstLine)( HINF, PCSTR, PCSTR, PINFCONTEXT );
|
|
typedef BOOL (WINAPI *PFSetupGetLineText)( PINFCONTEXT, HINF, PCSTR, PCSTR, PSTR, DWORD, PDWORD );
|
|
typedef BOOL (WINAPI *PFSetupFindNextLine)( PINFCONTEXT, PINFCONTEXT );
|
|
typedef BOOL (WINAPI *PFSetupGetStringField)(PINFCONTEXT, DWORD, PSTR, DWORD, PDWORD);
|
|
typedef DWORD (WINAPI *PFSetupDecompressOrCopyFile)(PCTSTR, PCTSTR, PUINT);
|
|
|
|
|
|
#endif
|