
The official plugins are now stored in architecture specific subdirectories under NSIS\Plugins. !AddPluginDir also gained a new (optional) architecture flag because MakeNSIS now stores separate plugin information for each target architecture. Storing plugins in the root of the Plugins directory is no longer supported. MinGW does not implement the unicode CRT startup functions so the entry point functions and linker parameters had to be changed. The unicode tools use the ansi entry point and a small helper function that calls into the real code: _tmain has full argc+argv emulation while wWinMain does not pass the command line parameters. The stubs do not use any CRT functions and have no CRT or unicode helper code, they call our entry point directly. git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6269 212acab6-be3b-0410-9dea-997c60f758d6
180 lines
5.5 KiB
C
180 lines
5.5 KiB
C
//---------------------------------------------------------------------------
|
|
// vpatchdll.c: NSIS plug-in version of the VPatch runtime
|
|
//---------------------------------------------------------------------------
|
|
// -=* VPatch *=-
|
|
//---------------------------------------------------------------------------
|
|
// Copyright (C) 2001-2005 Koen van de Sande / Van de Sande Productions
|
|
//---------------------------------------------------------------------------
|
|
// Website: http://www.tibed.net/vpatch
|
|
//
|
|
// This software is provided 'as-is', without any express or implied
|
|
// warranty. In no event will the authors be held liable for any damages
|
|
// arising from the use of this software.
|
|
//
|
|
// Permission is granted to anyone to use this software for any purpose,
|
|
// including commercial applications, and to alter it and redistribute it
|
|
// freely, subject to the following restrictions:
|
|
//
|
|
// 1. The origin of this software must not be misrepresented; you must not
|
|
// claim that you wrote the original software. If you use this software
|
|
// in a product, an acknowledgment in the product documentation would be
|
|
// appreciated but is not required.
|
|
// 2. Altered source versions must be plainly marked as such, and must not be
|
|
// misrepresented as being the original software.
|
|
// 3. This notice may not be removed or altered from any source distribution.
|
|
//
|
|
// Unicode support by Jim Park -- 08/29/2007
|
|
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
#include <nsis/pluginapi.h> // nsis plugin
|
|
#include "apply_patch.h"
|
|
#include "checksum.h"
|
|
|
|
/* ------------------------ Plug-in code ------------------------- */
|
|
|
|
HINSTANCE g_hInstance;
|
|
|
|
HWND g_hwndParent;
|
|
|
|
void __declspec(dllexport) vpatchfile(HWND hwndParent, int string_size,
|
|
TCHAR *variables, stack_t **stacktop) {
|
|
g_hwndParent=hwndParent;
|
|
|
|
EXDLL_INIT();
|
|
|
|
{
|
|
TCHAR source[MAX_PATH];
|
|
TCHAR dest[MAX_PATH];
|
|
TCHAR exename[MAX_PATH];
|
|
HANDLE hPatch, hSource, hDest;
|
|
int result;
|
|
|
|
popstring(exename);
|
|
popstring(source);
|
|
popstring(dest);
|
|
|
|
hPatch = CreateFile(exename, GENERIC_READ, FILE_SHARE_READ, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
|
if (hPatch == INVALID_HANDLE_VALUE) {
|
|
pushstring(_T("Unable to open patch file"));
|
|
return;
|
|
}
|
|
|
|
hSource = CreateFile(source, GENERIC_READ, FILE_SHARE_READ, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
|
if (hSource == INVALID_HANDLE_VALUE) {
|
|
CloseHandle(hPatch);
|
|
pushstring(_T("Unable to open source file"));
|
|
return;
|
|
}
|
|
|
|
hDest = CreateFile(dest, GENERIC_READ | GENERIC_WRITE, 0, NULL,
|
|
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
|
if (hDest == INVALID_HANDLE_VALUE) {
|
|
CloseHandle(hPatch);
|
|
CloseHandle(hSource);
|
|
pushstring(_T("Unable to open output file"));
|
|
return;
|
|
}
|
|
|
|
result = DoPatch(hPatch, hSource, hDest);
|
|
|
|
CloseHandle(hDest);
|
|
CloseHandle(hSource);
|
|
CloseHandle(hPatch);
|
|
|
|
if ((result != PATCH_SUCCESS)) {
|
|
if (result == PATCH_ERROR)
|
|
pushstring(_T("An error occured while patching"));
|
|
else if (result == PATCH_CORRUPT)
|
|
pushstring(_T("Patch data is invalid or corrupt"));
|
|
else if (result == PATCH_NOMATCH)
|
|
pushstring(_T("No suitable patches were found"));
|
|
else if (result == PATCH_UPTODATE)
|
|
pushstring(_T("OK, new version already installed"));
|
|
DeleteFile(dest);
|
|
} else {
|
|
pushstring(_T("OK"));
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
#ifdef DLL_CHECKSUMS
|
|
void __declspec(dllexport) GetFileCRC32(HWND hwndParent, int string_size,
|
|
TCHAR *variables, stack_t **stacktop) {
|
|
g_hwndParent=hwndParent;
|
|
|
|
EXDLL_INIT();
|
|
|
|
{
|
|
TCHAR filename[MAX_PATH];
|
|
char crc_string[9];
|
|
HANDLE hFile;
|
|
unsigned long crc;
|
|
|
|
popstring(filename);
|
|
|
|
hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
|
if (hFile == INVALID_HANDLE_VALUE) {
|
|
//pushstring("ERROR: Unable to open file for CRC32 calculation");
|
|
pushstring(_T(""));
|
|
return;
|
|
}
|
|
|
|
if (!FileCRC(hFile, &crc)) {
|
|
//pushstring("ERROR: Unable to calculate CRC32");
|
|
pushstring(_T(""));
|
|
} else {
|
|
crc_string[8] = '\0';
|
|
CRC32ToString(crc_string,crc);
|
|
PushStringA(crc_string);
|
|
}
|
|
|
|
CloseHandle(hFile);
|
|
}
|
|
}
|
|
|
|
void __declspec(dllexport) GetFileMD5(HWND hwndParent, int string_size,
|
|
TCHAR *variables, stack_t **stacktop) {
|
|
g_hwndParent=hwndParent;
|
|
|
|
EXDLL_INIT();
|
|
|
|
{
|
|
TCHAR filename[MAX_PATH];
|
|
char md5_string[33];
|
|
HANDLE hFile;
|
|
md5_byte_t digest[16];
|
|
|
|
popstring(filename);
|
|
|
|
hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
|
|
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
|
if (hFile == INVALID_HANDLE_VALUE) {
|
|
//pushstring("ERROR: Unable to open file for MD5 calculation");
|
|
pushstring(_T(""));
|
|
return;
|
|
}
|
|
|
|
if (!FileMD5(hFile, digest)) {
|
|
//pushstring("ERROR: Unable to calculate MD5");
|
|
pushstring(_T(""));
|
|
} else {
|
|
md5_string[32] = '\0';
|
|
MD5ToString(md5_string,digest);
|
|
PushStringA(md5_string);
|
|
}
|
|
|
|
CloseHandle(hFile);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) {
|
|
g_hInstance=hInst;
|
|
return TRUE;
|
|
}
|