Source code of Windows XP (NT5)
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.2 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