NSIS/Contrib/VPatch/Source/Plugin/vpatchdll.c
wizou 752d7d239a Jim Park's Unicode NSIS merging - Step 1 : switch to TCHARs where relevant.
Compiler output is identical before & after this step

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/branches/wizou@6036 212acab6-be3b-0410-9dea-997c60f758d6
2010-03-24 17:22:56 +00:00

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(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) {
g_hInstance=hInst;
return TRUE;
}