2006-10-28 19:45:02 +00:00
/*
* exec . c
*
* This file is a part of NSIS .
*
2017-01-02 03:51:39 +00:00
* Copyright ( C ) 1999 - 2017 Nullsoft and Contributors
2006-10-28 19:45:02 +00:00
*
* Licensed under the zlib / libpng license ( the " License " ) ;
* you may not use this file except in compliance with the License .
*
* Licence details can be found in the file COPYING .
*
* This software is provided ' as - is ' , without any express or implied
* warranty .
2010-03-24 17:22:56 +00:00
*
* Unicode support by Jim Park - - 08 / 13 / 2007
2006-10-28 19:45:02 +00:00
*/
2004-01-30 22:04:10 +00:00
# include "../Platform.h"
2002-08-02 10:01:35 +00:00
# include <shlobj.h>
# include "fileform.h"
# include "util.h"
# include "state.h"
# include "ui.h"
2005-01-11 16:33:12 +00:00
# include "components.h"
2002-08-02 10:01:35 +00:00
# include "exec.h"
2008-11-29 22:03:33 +00:00
# include "plugin.h"
2002-08-02 10:01:35 +00:00
# include "lang.h"
# include "resource.h"
2008-12-09 22:53:39 +00:00
# include "api.h"
2010-03-24 17:22:56 +00:00
# include "../tchar.h"
2002-08-02 10:01:35 +00:00
# define EXEC_ERROR 0x7FFFFFFF
# ifdef NSIS_CONFIG_COMPONENTPAGE
HWND g_SectionHack ;
# endif
# ifdef NSIS_SUPPORT_STACK
typedef struct _stack_t {
struct _stack_t * next ;
2010-03-24 17:22:56 +00:00
TCHAR text [ NSIS_MAX_STRLEN ] ;
2002-08-02 10:01:35 +00:00
} stack_t ;
static stack_t * g_st ;
# endif
2008-12-09 23:10:07 +00:00
exec_flags_t g_exec_flags ;
exec_flags_t g_exec_flags_last_used ;
2003-09-04 18:25:57 +00:00
2008-12-09 22:53:39 +00:00
extra_parameters plugin_extra_parameters = {
2004-10-23 17:43:08 +00:00
& g_exec_flags ,
2006-03-07 14:14:25 +00:00
& ExecuteCodeSegment ,
2008-11-29 22:03:33 +00:00
& validate_filename ,
& RegisterPluginCallback
2004-10-23 17:43:08 +00:00
} ;
2003-09-04 18:25:57 +00:00
# if defined(NSIS_SUPPORT_ACTIVEXREG) || defined(NSIS_SUPPORT_CREATESHORTCUT)
HRESULT g_hres ;
# endif
2002-08-02 10:01:35 +00:00
2002-09-19 22:25:15 +00:00
static int NSISCALL ExecuteEntry ( entry * entry_ ) ;
2002-08-02 10:01:35 +00:00
2010-03-24 17:22:56 +00:00
/**
* If v is negative , then the address to resolve is actually
* stored in the global user variables . Convert the value
* to integer and return .
*/
2007-04-20 23:40:05 +00:00
int NSISCALL resolveaddr ( int v )
{
if ( v < 0 )
{
return myatoi ( g_usrvars [ - ( v + 1 ) ] ) ;
}
return v ;
}
2002-08-02 10:01:35 +00:00
2002-09-19 22:25:15 +00:00
int NSISCALL ExecuteCodeSegment ( int pos , HWND hwndProgress )
2002-08-02 10:01:35 +00:00
{
while ( pos > = 0 )
{
int rv ;
2003-09-04 18:25:57 +00:00
if ( g_entries [ pos ] . which = = EW_RET ) return 0 ;
rv = ExecuteEntry ( g_entries + pos ) ;
2002-08-02 10:01:35 +00:00
if ( rv = = EXEC_ERROR ) return EXEC_ERROR ;
rv = resolveaddr ( rv ) ;
2002-09-19 21:53:24 +00:00
2002-08-02 10:01:35 +00:00
if ( ! rv ) { rv + + ; pos + + ; }
else
{
int t = pos ;
rv - - ; // rv is decremented here by 1, since it was +1 on the other end.
pos = rv ; // set new position
rv - = t ; // set rv to delta for progress adjustment
}
2002-09-19 21:53:24 +00:00
if ( hwndProgress )
2002-08-02 10:01:35 +00:00
{
extern int progress_bar_pos , progress_bar_len ;
progress_bar_pos + = rv ;
2007-04-20 20:50:33 +00:00
SendMessage ( hwndProgress , PBM_SETPOS , MulDiv ( progress_bar_pos , 30000 , progress_bar_len ) , 0 ) ;
2002-08-02 10:01:35 +00:00
}
}
return 0 ;
}
2004-08-06 21:47:14 +00:00
# ifdef NSIS_SUPPORT_CODECALLBACKS
2004-08-06 11:05:48 +00:00
int NSISCALL ExecuteCallbackFunction ( int num )
{
return ExecuteCodeSegment ( * ( & g_header - > code_onInit + num ) , NULL ) ;
}
2004-08-06 21:47:14 +00:00
# endif
2012-09-08 02:50:09 +00:00
static TCHAR g_bufs [ 5 ] [ NSIS_MAX_STRLEN ] ;
static int * g_parms ;
2002-09-19 21:53:24 +00:00
2004-04-16 22:36:03 +00:00
void NSISCALL update_status_text_buf1 ( int strtab )
{
2012-09-08 02:50:09 +00:00
update_status_text ( strtab , g_bufs [ 1 ] ) ;
2004-04-16 22:36:03 +00:00
}
2016-12-05 15:44:19 +00:00
# ifdef _WIN64
static INT_PTR NSISCALL GetIntPtrFromParm ( int id )
2002-09-19 21:53:24 +00:00
{
2016-12-05 15:44:19 +00:00
return strtoiptr ( GetNSISStringTT ( g_parms [ id ] ) ) ;
2002-09-19 21:53:24 +00:00
}
2016-12-05 15:44:19 +00:00
# else
# define GetIntPtrFromParm(id_) ( (INT32)(GetIntFromParmEx(id_).LowPart) )
# endif
2013-08-07 23:04:23 +00:00
# define GetHwndFromParm(id_) ( (HWND)GetIntPtrFromParm(id_) )
# define GetIntFromParm(id_) ( (INT32)(UINT32)GetIntPtrFromParm(id_) )
2016-12-05 15:44:19 +00:00
static LARGE_INTEGER GetIntFromParmEx ( int id )
{
LARGE_INTEGER v ;
const TCHAR * p = GetNSISStringTT ( g_parms [ id ] ) ;
v . LowPart = myatoi ( p ) , v . HighPart = * p ;
return v ; // HighPart is non-zero if the string is not empty
}
2002-09-19 21:53:24 +00:00
2002-09-24 18:49:21 +00:00
// NB - USE CAUTION when rearranging code to make use of the new return value of
// this function - be sure the parm being accessed is not modified before the call.
2003-02-07 23:04:25 +00:00
// Use a negative number to get the string validated as a file name
2010-03-24 17:22:56 +00:00
// Note: Calling GetNSISString has the side effect that the buffer holding
// the string to expand gets modified.
// When calling this function with numbers like 0x13, it means create the string
2012-09-08 02:50:09 +00:00
// from the string ID found in entry.offset[3] and put it into g_bufs[1].
2010-03-24 17:22:56 +00:00
static TCHAR * NSISCALL GetStringFromParm ( int id_ )
2002-09-19 21:53:24 +00:00
{
2003-02-07 23:04:25 +00:00
int id = id_ < 0 ? - id_ : id_ ;
2012-09-08 02:50:09 +00:00
TCHAR * result = GetNSISString ( g_bufs [ id > > 4 ] , g_parms [ id & 0xF ] ) ;
2003-02-07 23:04:25 +00:00
if ( id_ < 0 ) validate_filename ( result ) ;
return result ;
2002-09-19 21:53:24 +00:00
}
2004-06-25 19:53:05 +00:00
# ifdef NSIS_SUPPORT_REGISTRYFUNCTIONS
2017-06-04 22:48:13 +00:00
static HKEY NSISCALL GetRegRootKey ( int RootKey )
{
if ( RootKey ! = ( int ) HKSHCTX ) return ( HKEY ) ( UINT_PTR ) RootKey ;
return ( HKEY ) ( ( UINT_PTR ) HKEY_CURRENT_USER + g_exec_flags . all_user_var ) ; // SHCTX: HKEY_CURRENT_USER + 1 == HKEY_LOCAL_MACHINE
}
static HKEY NSISCALL RegOpenScriptKey ( REGSAM RS )
{
HKEY hKey ;
return RegKeyOpen ( GetRegRootKey ( g_parms [ 1 ] ) , GetStringFromParm ( 0x22 ) , RS | KEY_FROMSCRIPT , & hKey ) ? NULL : hKey ;
}
static HKEY NSISCALL RegCreateScriptKey ( int RootKey , LPCTSTR SubKey , REGSAM RS )
{
HKEY hKey ;
return RegKeyCreate ( GetRegRootKey ( RootKey ) , SubKey , RS | KEY_FROMSCRIPT , & hKey ) ? NULL : hKey ;
}
2007-04-26 20:26:04 +00:00
2017-06-04 22:48:13 +00:00
// RegDeleteKey on Win9x will delete a tree of keys, WinNT will only delete a key without subkeys.
// RegDeleteKeyEx on 32-bit Windows accepts but ignores the KEY_WOW64_xxKEY flags and always uses the
// one and only native key. Our RegKeyOpen will intentionally fail if a incompatible WoW64 flag is used.
# define RegDeleteScriptKey(RootKey, SubKey, Flags) RegDeleteScriptKeyWorker(GetRegRootKey(RootKey), (SubKey), (Flags))
static LONG NSISCALL RegDeleteScriptKeyWorker ( HKEY hThisKey , LPCTSTR SubKey , UINT Flags )
2004-06-25 19:53:05 +00:00
{
2017-06-04 22:48:13 +00:00
HKEY hKey ;
UINT onlyifempty = Flags ;
REGSAM viewsam = g_exec_flags . alter_reg_view ; // Not using KEY_ALTERVIEW here because viewsam is also passed to RegDeleteKeyEx.
LONG retval = RegKeyOpen ( hThisKey , SubKey , KEY_ENUMERATE_SUB_KEYS | viewsam , & hKey ) ;
if ( retval = = ERROR_SUCCESS )
2004-06-25 19:53:05 +00:00
{
2017-06-04 22:48:13 +00:00
TCHAR child [ MAX_PATH + 1 ] ; // NB - don't change this to static (recursive function)
while ( RegEnumKey ( hKey , 0 , child , COUNTOF ( child ) ) = = ERROR_SUCCESS )
2004-06-25 19:53:05 +00:00
{
2017-06-04 22:48:13 +00:00
if ( onlyifempty ) return ( RegCloseKey ( hKey ) , ! ERROR_SUCCESS ) ;
if ( ( retval = RegDeleteScriptKeyWorker ( hKey , child , Flags ) ) ! = ERROR_SUCCESS ) break ;
2004-06-25 19:53:05 +00:00
}
2017-06-04 22:48:13 +00:00
RegCloseKey ( hKey ) ;
2007-04-14 12:50:32 +00:00
{
2010-03-24 17:22:56 +00:00
typedef LONG ( WINAPI * RegDeleteKeyExPtr ) ( HKEY , LPCTSTR , REGSAM , DWORD ) ;
RegDeleteKeyExPtr RDKE = ( RegDeleteKeyExPtr )
2014-02-08 00:13:52 +00:00
# ifdef _WIN64
RegDeleteKeyEx ;
# else
2010-03-24 17:22:56 +00:00
myGetProcAddress ( MGA_RegDeleteKeyEx ) ;
2014-02-08 00:13:52 +00:00
# endif
2007-04-14 12:50:32 +00:00
if ( RDKE )
2017-06-04 22:48:13 +00:00
retval = RDKE ( hThisKey , SubKey , viewsam , 0 ) ;
2007-04-14 12:50:32 +00:00
else
2017-06-04 22:48:13 +00:00
retval = RegDeleteKey ( hThisKey , SubKey ) ;
2007-04-14 12:50:32 +00:00
}
2004-06-25 19:53:05 +00:00
}
return retval ;
}
# endif //NSIS_SUPPORT_REGISTRYFUNCTIONS
2002-08-02 10:01:35 +00:00
// returns EXEC_ERROR on error
// returns 0, advance position by 1
// otherwise, returns new_position+1
2002-09-19 22:25:15 +00:00
static int NSISCALL ExecuteEntry ( entry * entry_ )
2002-08-02 10:01:35 +00:00
{
2012-09-08 02:50:09 +00:00
TCHAR * buf0 = g_bufs [ 0 ] ;
TCHAR * buf1 = g_bufs [ 1 ] ;
TCHAR * buf2 = g_bufs [ 2 ] ;
TCHAR * buf3 = g_bufs [ 3 ] ;
//char *buf4 = g_bufs[4];
2002-09-21 02:44:49 +00:00
2010-03-24 17:22:56 +00:00
TCHAR * var0 ;
TCHAR * var1 ;
2003-11-27 20:19:48 +00:00
//char *var2;
//char *var3;
2003-11-24 17:05:10 +00:00
//char *var4;
//char *var5;
2003-09-04 18:25:57 +00:00
2004-01-29 01:23:24 +00:00
# ifdef NSIS_CONFIG_VISIBLE_SUPPORT
2003-11-24 17:05:10 +00:00
// Saves 8 bytes
HWND mainHwnd = g_hwnd ;
# define g_hwnd mainHwnd
2004-01-29 01:23:24 +00:00
# endif
2003-11-24 17:05:10 +00:00
2003-09-04 18:25:57 +00:00
int exec_error = 0 ;
2004-05-08 16:07:22 +00:00
entry lent = * entry_ ;
2003-11-24 17:05:10 +00:00
# define which (lent.which)
# define parm0 (lent.offsets[0])
# define parm1 (lent.offsets[1])
# define parm2 (lent.offsets[2])
# define parm3 (lent.offsets[3])
# define parm4 (lent.offsets[4])
# define parm5 (lent.offsets[5])
var0 = g_usrvars [ parm0 ] ;
var1 = g_usrvars [ parm1 ] ;
// not used yet
2003-11-27 20:19:48 +00:00
//var2 = g_usrvars[parm2];
//var3 = g_usrvars[parm3];
2003-11-24 17:05:10 +00:00
//var4 = g_usrvars[parm4];
//var5 = g_usrvars[parm5];
2012-09-08 02:50:09 +00:00
g_parms = lent . offsets ;
2003-03-28 18:41:15 +00:00
2002-08-02 10:01:35 +00:00
switch ( which )
{
2002-09-19 21:53:24 +00:00
case EW_NOP :
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Jump: %d " ) , parm0 ) ;
2002-08-28 10:08:38 +00:00
return parm0 ;
2002-08-02 10:01:35 +00:00
case EW_ABORT :
{
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Aborting: \" %s \" " ) , GetStringFromParm ( 0x00 ) ) ;
2003-09-04 18:25:57 +00:00
update_status_text ( parm0 , 0 ) ;
2002-08-02 10:01:35 +00:00
}
return EXEC_ERROR ;
case EW_QUIT :
g_quit_flag + + ;
if ( g_hwnd ) PostQuitMessage ( 0 ) ; // make sure we bail out fast.
return EXEC_ERROR ;
case EW_CALL :
{
2002-08-28 10:08:38 +00:00
int v = resolveaddr ( parm0 ) - 1 ; // address is -1, since we encode it as +1
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Call: %d " ) , v ) ;
2002-09-19 22:25:15 +00:00
return ExecuteCodeSegment ( v , NULL ) ;
2002-08-02 10:01:35 +00:00
}
case EW_UPDATETEXT :
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " detailprint: %s " ) , GetStringFromParm ( 0x00 ) ) ;
2007-09-08 17:20:11 +00:00
update_status_text ( parm0 , 0 ) ;
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_SLEEP :
{
2003-09-04 18:25:57 +00:00
int x = GetIntFromParm ( 0 ) ;
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Sleep(%d) " ) , x ) ;
2003-05-18 15:56:09 +00:00
Sleep ( max ( x , 1 ) ) ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2003-09-10 16:39:06 +00:00
# ifdef NSIS_CONFIG_VISIBLE_SUPPORT
2002-08-02 10:01:35 +00:00
case EW_BRINGTOFRONT :
2010-03-24 17:22:56 +00:00
log_printf ( _T ( " BringToFront " ) ) ;
2002-08-02 10:01:35 +00:00
SetForegroundWindow ( g_hwnd ) ;
2003-04-01 18:07:32 +00:00
break ;
2003-09-10 16:39:06 +00:00
# endif //NSIS_CONFIG_VISIBLE_SUPPORT
2003-02-07 23:04:25 +00:00
case EW_SETFLAG :
2007-09-08 17:20:11 +00:00
if ( ! parm2 )
{
FIELDN ( g_exec_flags_last_used , parm0 ) = FIELDN ( g_exec_flags , parm0 ) ;
FIELDN ( g_exec_flags , parm0 ) = GetIntFromParm ( 1 ) ;
}
else
{
FIELDN ( g_exec_flags , parm0 ) = FIELDN ( g_exec_flags_last_used , parm0 ) ;
}
2003-04-01 18:07:32 +00:00
break ;
2003-04-02 19:54:53 +00:00
case EW_IFFLAG :
{
2004-03-29 20:21:00 +00:00
int f = lent . offsets [ ! FIELDN ( g_exec_flags , parm2 ) ] ;
FIELDN ( g_exec_flags , parm2 ) & = parm3 ;
2003-04-02 19:54:53 +00:00
return f ;
}
2003-05-24 13:50:24 +00:00
case EW_GETFLAG :
2004-03-29 20:21:00 +00:00
myitoa ( var0 , FIELDN ( g_exec_flags , parm1 ) ) ;
2003-05-24 13:50:24 +00:00
break ;
2003-09-10 16:39:06 +00:00
# ifdef NSIS_CONFIG_VISIBLE_SUPPORT
2002-08-02 10:01:35 +00:00
case EW_CHDETAILSVIEW :
2002-08-28 10:08:38 +00:00
if ( insthwndbutton ) ShowWindow ( insthwndbutton , parm1 ) ;
2002-09-19 21:53:24 +00:00
if ( insthwnd ) ShowWindow ( insthwnd , parm0 ) ;
2003-04-01 18:07:32 +00:00
break ;
2003-09-10 16:39:06 +00:00
# endif //NSIS_CONFIG_VISIBLE_SUPPORT
2003-11-27 20:19:48 +00:00
case EW_SETFILEATTRIBUTES :
{
2010-03-24 17:22:56 +00:00
TCHAR * buf1 = GetStringFromParm ( - 0x10 ) ;
log_printf3 ( _T ( " SetFileAttributes: \" %s \" :%08X " ) , buf1 , parm1 ) ;
2003-02-07 23:04:25 +00:00
if ( ! SetFileAttributes ( buf1 , parm1 ) )
2002-08-02 10:01:35 +00:00
{
2003-09-04 18:25:57 +00:00
exec_error + + ;
2010-03-24 17:22:56 +00:00
log_printf ( _T ( " SetFileAttributes failed. " ) ) ;
2002-08-02 10:01:35 +00:00
}
2002-09-24 18:49:21 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-09-24 18:49:21 +00:00
case EW_CREATEDIR : {
2010-03-24 17:22:56 +00:00
TCHAR * buf1 = GetStringFromParm ( - 0x10 ) ;
log_printf3 ( _T ( " CreateDirectory: \" %s \" (%d) " ) , buf1 , parm1 ) ;
2002-09-25 13:10:21 +00:00
{
2015-12-07 20:49:46 +00:00
TCHAR * p = skip_root ( buf1 ) , c = _T ( ' c ' ) ;
2007-02-10 14:23:10 +00:00
if ( p )
2003-11-24 13:29:40 +00:00
{
2003-02-19 20:36:20 +00:00
while ( c )
2002-09-25 13:10:21 +00:00
{
2015-12-07 20:49:46 +00:00
DWORD ec ;
2010-03-24 17:22:56 +00:00
p = findchar ( p , _T ( ' \\ ' ) ) ;
2015-12-07 20:49:46 +00:00
c = * p , * p = 0 ;
if ( ! c & & parm2 & & UserIsAdminGrpMember ( ) ) // Lock down the final directory?
ec = CreateRestrictedDirectory ( buf1 ) ;
else
ec = CreateNormalDirectory ( buf1 ) ;
if ( ec )
2005-04-08 15:29:52 +00:00
{
2015-12-07 20:49:46 +00:00
if ( ec ! = ERROR_ALREADY_EXISTS )
2010-03-24 17:22:56 +00:00
{
2015-12-07 20:49:46 +00:00
log_printf3 ( _T ( " CreateDirectory: can't create \" %s \" (err=%d) " ) , buf1 , ec ) ;
2003-09-04 18:25:57 +00:00
exec_error + + ;
2005-04-08 15:29:52 +00:00
}
else if ( ( GetFileAttributes ( buf1 ) & FILE_ATTRIBUTE_DIRECTORY ) = = 0 )
{
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " CreateDirectory: can't create \" %s \" - a file already exists " ) , buf1 ) ;
2005-04-08 15:29:52 +00:00
exec_error + + ;
}
2003-02-20 18:47:58 +00:00
}
2008-06-13 17:25:03 +00:00
else
{
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " CreateDirectory: \" %s \" created " ) , buf1 ) ;
2008-06-13 17:25:03 +00:00
}
2003-02-19 20:36:20 +00:00
* p + + = c ;
2002-09-25 13:10:21 +00:00
}
}
}
2003-09-10 13:44:24 +00:00
if ( parm1 )
{
2004-04-16 22:36:03 +00:00
update_status_text_buf1 ( LANG_OUTPUTDIR ) ;
2003-09-10 13:44:24 +00:00
mystrcpy ( state_output_directory , buf1 ) ;
2010-02-06 17:04:37 +00:00
if ( ! SetCurrentDirectory ( buf1 ) )
{
2014-05-08 20:12:26 +00:00
log_printf3 ( _T ( " SetCurrentDirectory(%s) failed (%d) " ) , buf1 , GetLastError ( ) ) ;
2010-02-06 17:04:37 +00:00
exec_error + + ;
}
2003-09-10 13:44:24 +00:00
}
2004-04-16 22:36:03 +00:00
else update_status_text_buf1 ( LANG_CREATEDIR ) ;
2002-09-24 18:49:21 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2003-02-07 23:04:25 +00:00
case EW_IFFILEEXISTS :
{
2010-03-24 17:22:56 +00:00
TCHAR * buf0 = GetStringFromParm ( 0x00 ) ;
2003-09-28 12:14:10 +00:00
if ( file_exists ( buf0 ) )
2002-08-02 10:01:35 +00:00
{
2010-03-24 17:22:56 +00:00
log_printf3 ( _T ( " IfFileExists: file \" %s \" exists, jumping %d " ) , buf0 , parm1 ) ;
2002-08-28 10:08:38 +00:00
return parm1 ;
2002-08-02 10:01:35 +00:00
}
2010-03-24 17:22:56 +00:00
log_printf3 ( _T ( " IfFileExists: file \" %s \" does not exist, jumping %d " ) , buf0 , parm2 ) ;
2002-09-24 18:49:21 +00:00
}
2002-08-28 10:08:38 +00:00
return parm2 ;
2002-08-02 10:01:35 +00:00
# ifdef NSIS_SUPPORT_RENAME
case EW_RENAME :
{
2010-03-24 17:22:56 +00:00
TCHAR * buf3 = GetStringFromParm ( - 0x30 ) ;
TCHAR * buf2 = GetStringFromParm ( - 0x21 ) ;
2012-09-08 02:50:09 +00:00
# ifdef NSIS_CONFIG_LOG
TCHAR * buf1 =
# endif
GetStringFromParm ( 0x13 ) ; // For update_status_text_buf1 and log_printf
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Rename: %s " ) , buf1 ) ;
2004-04-16 22:36:03 +00:00
if ( MoveFile ( buf3 , buf2 ) )
2002-08-02 10:01:35 +00:00
{
2004-04-16 22:36:03 +00:00
update_status_text_buf1 ( LANG_RENAME ) ;
2002-08-02 10:01:35 +00:00
}
else
{
# ifdef NSIS_SUPPORT_MOVEONREBOOT
2004-04-16 22:36:03 +00:00
if ( parm2 & & file_exists ( buf3 ) )
2002-08-02 10:01:35 +00:00
{
2004-04-16 22:36:03 +00:00
MoveFileOnReboot ( buf3 , buf2 ) ;
update_status_text_buf1 ( LANG_RENAMEONREBOOT ) ;
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Rename on reboot: %s " ) , buf1 ) ;
2002-08-02 10:01:35 +00:00
}
else
# endif
{
2003-09-04 18:25:57 +00:00
exec_error + + ;
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Rename failed: %s " ) , buf1 ) ;
2002-08-02 10:01:35 +00:00
}
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_RENAME
# ifdef NSIS_SUPPORT_FNUTIL
case EW_GETFULLPATHNAME :
{
2010-03-24 17:22:56 +00:00
TCHAR * fp ;
TCHAR * p = var1 ;
TCHAR * buf0 = GetStringFromParm ( 0x00 ) ;
2002-09-19 21:53:24 +00:00
if ( ! GetFullPathName ( buf0 , NSIS_MAX_STRLEN , p , & fp ) )
2002-08-02 10:01:35 +00:00
{
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
* p = 0 ;
}
2002-09-19 21:53:24 +00:00
else if ( fp > buf0 & & * fp )
2002-08-02 10:01:35 +00:00
{
2002-09-19 21:53:24 +00:00
WIN32_FIND_DATA * fd = file_exists ( buf0 ) ;
2002-08-02 10:01:35 +00:00
if ( fd )
{
2002-08-19 21:24:44 +00:00
mystrcpy ( fp , fd - > cFileName ) ;
2002-08-02 10:01:35 +00:00
}
else
{
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
* p = 0 ;
}
}
2002-08-28 10:08:38 +00:00
if ( ! parm2 ) GetShortPathName ( p , p , NSIS_MAX_STRLEN ) ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_SEARCHPATH :
{
2010-03-24 17:22:56 +00:00
TCHAR * fp ;
TCHAR * p = var0 ;
TCHAR * buf0 = GetStringFromParm ( - 0x01 ) ;
2002-09-19 21:53:24 +00:00
if ( ! SearchPath ( NULL , buf0 , NULL , NSIS_MAX_STRLEN , p , & fp ) )
2002-08-02 10:01:35 +00:00
{
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-09-22 14:22:35 +00:00
p [ 0 ] = 0 ;
2002-08-02 10:01:35 +00:00
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_GETTEMPFILENAME :
{
2010-03-24 17:22:56 +00:00
TCHAR * textout = var0 ;
2003-09-04 18:25:57 +00:00
if ( ! my_GetTempFileName ( textout , GetStringFromParm ( - 0x11 ) ) )
exec_error + + ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif
# ifdef NSIS_SUPPORT_FILE
case EW_EXTRACTFILE :
{
HANDLE hOut ;
int ret ;
2010-03-24 17:22:56 +00:00
TCHAR * buf3 = GetStringFromParm ( 0x31 ) ;
2003-09-07 16:46:50 +00:00
int overwriteflag = parm0 & 7 ;
2002-08-02 10:01:35 +00:00
2010-03-24 17:22:56 +00:00
log_printf4 ( _T ( " File: overwriteflag=%d, allowskipfilesflag=%d, name= \" %s \" " ) , overwriteflag , ( parm0 > > 3 ) & MB_ABORTRETRYIGNORE , buf3 ) ;
2002-09-19 21:53:24 +00:00
if ( validpathspec ( buf3 ) )
2002-08-02 10:01:35 +00:00
{
2002-09-19 21:53:24 +00:00
mystrcpy ( buf0 , buf3 ) ;
2002-08-02 10:01:35 +00:00
}
2005-08-06 12:47:46 +00:00
else mystrcat ( addtrailingslash ( mystrcpy ( buf0 , state_output_directory ) ) , buf3 ) ;
2003-02-07 23:04:25 +00:00
validate_filename ( buf0 ) ;
2002-08-02 10:01:35 +00:00
_tryagain :
2003-09-07 16:46:50 +00:00
if ( overwriteflag > = 3 ) // check date and time
2002-08-02 10:01:35 +00:00
{
2002-09-19 21:53:24 +00:00
WIN32_FIND_DATA * ffd = file_exists ( buf0 ) ;
2003-09-08 10:38:34 +00:00
// if it doesn't exist, overwrite flag will be off (though it doesn't really matter)
int cmp = 0 ;
2002-08-02 10:01:35 +00:00
if ( ffd )
{
2003-11-24 17:05:10 +00:00
cmp = CompareFileTime ( & ffd - > ftLastWriteTime , ( FILETIME * ) ( lent . offsets + 3 ) ) ;
2002-08-02 10:01:35 +00:00
}
2003-09-08 10:38:34 +00:00
overwriteflag = ! ( cmp & ( 0x80000000 | ( overwriteflag - 3 ) ) ) ;
2002-08-02 10:01:35 +00:00
}
2003-09-09 14:25:16 +00:00
// remove read only flag if overwrite mode is on
2003-09-04 18:25:57 +00:00
if ( ! overwriteflag )
{
2006-11-25 11:32:19 +00:00
remove_ro_attr ( buf0 ) ;
2003-09-04 18:25:57 +00:00
}
2002-09-19 21:53:24 +00:00
hOut = myOpenFile ( buf0 , GENERIC_WRITE , ( overwriteflag = = 1 ) ? CREATE_NEW : CREATE_ALWAYS ) ;
2002-08-02 10:01:35 +00:00
if ( hOut = = INVALID_HANDLE_VALUE )
{
2002-09-19 21:53:24 +00:00
if ( overwriteflag )
2002-08-02 10:01:35 +00:00
{
2003-09-04 18:25:57 +00:00
update_status_text ( LANG_SKIPPED , buf3 ) ;
2006-04-05 18:44:28 +00:00
if ( overwriteflag = = 2 ) exec_error + + ;
2010-03-24 17:22:56 +00:00
log_printf3 ( _T ( " File: skipped: \" %s \" (overwriteflag=%d) " ) , buf0 , overwriteflag ) ;
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
}
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " File: error creating \" %s \" " ) , buf0 ) ;
2002-08-02 10:01:35 +00:00
2004-10-14 21:34:17 +00:00
mystrcpy ( buf2 , g_usrvars [ 0 ] ) ; // save $0
mystrcpy ( g_usrvars [ 0 ] , buf0 ) ; // copy file name to $0
GetNSISString ( buf1 , parm5 ) ; // use $0
2002-09-19 21:53:24 +00:00
mystrcpy ( g_usrvars [ 0 ] , buf2 ) ; // restore $0
2002-08-02 10:01:35 +00:00
2003-05-26 17:55:15 +00:00
// Modified by ramon 23 May 2003
2003-09-07 16:46:50 +00:00
switch ( my_MessageBox ( buf1 , parm0 > > 3 ) )
2002-08-02 10:01:35 +00:00
{
case IDRETRY :
2010-03-24 17:22:56 +00:00
log_printf ( _T ( " File: error, user retry " ) ) ;
2002-08-02 10:01:35 +00:00
goto _tryagain ;
case IDIGNORE :
2010-03-24 17:22:56 +00:00
log_printf ( _T ( " File: error, user cancel " ) ) ;
2003-09-04 18:25:57 +00:00
g_exec_flags . exec_error + + ;
2002-08-02 10:01:35 +00:00
return 0 ;
default :
2010-03-24 17:22:56 +00:00
log_printf ( _T ( " File: error, user abort " ) ) ;
2003-09-04 18:25:57 +00:00
update_status_text ( LANG_CANTWRITE , buf0 ) ;
2002-08-02 10:01:35 +00:00
return EXEC_ERROR ;
}
}
2003-09-04 18:25:57 +00:00
update_status_text ( LANG_EXTRACT , buf3 ) ;
{
2007-09-08 17:20:11 +00:00
g_exec_flags . status_update + + ;
2003-09-04 18:25:57 +00:00
ret = GetCompressedDataFromDataBlock ( parm2 , hOut ) ;
2007-09-08 17:20:11 +00:00
g_exec_flags . status_update - - ;
2003-09-04 18:25:57 +00:00
}
2002-08-02 10:01:35 +00:00
2010-03-24 17:22:56 +00:00
log_printf3 ( _T ( " File: wrote %d to \" %s \" " ) , ret , buf0 ) ;
2002-08-02 10:01:35 +00:00
2002-08-28 10:08:38 +00:00
if ( parm3 ! = 0xffffffff | | parm4 ! = 0xffffffff )
2003-11-24 17:05:10 +00:00
SetFileTime ( hOut , ( FILETIME * ) ( lent . offsets + 3 ) , NULL , ( FILETIME * ) ( lent . offsets + 3 ) ) ;
2002-08-02 10:01:35 +00:00
CloseHandle ( hOut ) ;
if ( ret < 0 )
{
if ( ret = = - 2 )
{
2003-09-04 18:25:57 +00:00
GetNSISString ( buf0 , LANG_ERRORWRITING ) ;
2005-08-06 12:47:46 +00:00
mystrcat ( buf0 , buf3 ) ;
2002-08-02 10:01:35 +00:00
}
else
{
2003-09-04 18:25:57 +00:00
GetNSISString ( buf0 , LANG_ERRORDECOMPRESSING ) ;
2002-08-02 10:01:35 +00:00
}
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " %s " ) , buf0 ) ;
2005-03-17 20:44:31 +00:00
my_MessageBox ( buf0 , MB_OK | MB_ICONSTOP | ( IDOK < < 21 ) ) ;
2002-08-02 10:01:35 +00:00
return EXEC_ERROR ;
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_FILE
# ifdef NSIS_SUPPORT_DELETE
case EW_DELETEFILE :
{
2010-03-24 17:22:56 +00:00
TCHAR * buf0 = GetStringFromParm ( 0x00 ) ;
log_printf2 ( _T ( " Delete: \" %s \" " ) , buf0 ) ;
2004-08-06 17:03:07 +00:00
myDelete ( buf0 , parm1 ) ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_DELETE
# ifdef NSIS_SUPPORT_MESSAGEBOX
2002-09-19 21:53:24 +00:00
case EW_MESSAGEBOX : // MessageBox
2002-08-02 10:01:35 +00:00
{
int v ;
2010-03-24 17:22:56 +00:00
TCHAR * buf3 = GetStringFromParm ( 0x31 ) ;
log_printf3 ( _T ( " MessageBox: %d, \" %s \" " ) , parm0 , buf3 ) ;
2002-09-19 21:53:24 +00:00
v = my_MessageBox ( buf3 , parm0 ) ;
2002-08-02 10:01:35 +00:00
if ( v )
{
2003-03-29 17:16:09 +00:00
if ( v = = parm2 )
2002-08-02 10:01:35 +00:00
{
2002-08-28 10:08:38 +00:00
return parm3 ;
2002-08-02 10:01:35 +00:00
}
2003-03-29 17:16:09 +00:00
if ( v = = parm4 )
2002-08-02 10:01:35 +00:00
{
2003-03-29 17:16:09 +00:00
return parm5 ;
2002-08-02 10:01:35 +00:00
}
}
2003-09-04 18:25:57 +00:00
else exec_error + + ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_MESSAGEBOX
# ifdef NSIS_SUPPORT_RMDIR
case EW_RMDIR :
{
2010-03-24 17:22:56 +00:00
TCHAR * buf1 = GetStringFromParm ( - 0x10 ) ;
log_printf2 ( _T ( " RMDir: \" %s \" " ) , buf1 ) ;
2002-08-02 10:01:35 +00:00
2004-08-06 17:03:07 +00:00
myDelete ( buf1 , parm1 ) ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_RMDIR
# ifdef NSIS_SUPPORT_STROPTS
2003-11-25 17:07:40 +00:00
case EW_STRLEN :
{
2010-03-24 17:22:56 +00:00
TCHAR * buf0 = GetStringFromParm ( 0x01 ) ;
2002-09-19 21:53:24 +00:00
myitoa ( var0 , mystrlen ( buf0 ) ) ;
2002-09-24 18:49:21 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_ASSIGNVAR :
{
2016-12-05 15:44:19 +00:00
LARGE_INTEGER newlenex = GetIntFromParmEx ( 2 ) ;
int start = GetIntFromParm ( 3 ) , newlen = newlenex . LowPart ;
TCHAR * p = var0 , * buf0 = GetStringFromParm ( 0x01 ) ;
int srclen = mystrlen ( buf0 ) ;
2002-08-02 10:01:35 +00:00
* p = 0 ;
2016-12-05 15:44:19 +00:00
if ( ! newlenex . HighPart ) newlen = srclen ; // "StrCpy $1 $2 $3" where $3=""
if ( newlen )
2002-08-02 10:01:35 +00:00
{
2016-12-05 15:44:19 +00:00
if ( start < 0 ) start = srclen + start ;
2002-08-02 10:01:35 +00:00
if ( start > = 0 )
{
2016-12-05 15:44:19 +00:00
if ( start > srclen ) start = srclen ;
2002-09-19 21:53:24 +00:00
mystrcpy ( p , buf0 + start ) ;
2002-08-02 10:01:35 +00:00
if ( newlen )
{
2002-08-19 21:24:44 +00:00
if ( newlen < 0 ) newlen = mystrlen ( p ) + newlen ;
2002-08-02 10:01:35 +00:00
if ( newlen < 0 ) newlen = 0 ;
if ( newlen < NSIS_MAX_STRLEN ) p [ newlen ] = 0 ;
}
}
}
}
2003-04-01 18:07:32 +00:00
break ;
2006-01-06 16:00:15 +00:00
case EW_STRCMP :
{
2010-03-24 17:22:56 +00:00
TCHAR * buf2 = GetStringFromParm ( 0x20 ) ;
TCHAR * buf3 = GetStringFromParm ( 0x31 ) ;
2006-01-06 16:00:15 +00:00
if ( ! parm4 ) {
// case insensitive
if ( ! lstrcmpi ( buf2 , buf3 ) ) return parm2 ;
}
else {
// case sensitive
if ( ! lstrcmp ( buf2 , buf3 ) ) return parm2 ;
}
2002-09-24 18:49:21 +00:00
}
2002-08-28 10:08:38 +00:00
return parm3 ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_STROPTS
# ifdef NSIS_SUPPORT_ENVIRONMENT
case EW_READENVSTR :
{
2010-03-24 17:22:56 +00:00
TCHAR * p = var0 ;
TCHAR * buf0 = GetStringFromParm ( 0x01 ) ;
2007-03-03 14:18:20 +00:00
if ( ! ExpandEnvironmentStrings ( buf0 , p , NSIS_MAX_STRLEN )
| | ( parm2 & & ! lstrcmp ( buf0 , p ) ) )
2002-08-02 10:01:35 +00:00
{
2007-03-03 14:18:20 +00:00
exec_error + + ;
* p = 0 ;
2002-08-02 10:01:35 +00:00
}
p [ NSIS_MAX_STRLEN - 1 ] = 0 ;
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_ENVIRONMENT
# ifdef NSIS_SUPPORT_INTOPTS
case EW_INTCMP :
{
int v , v2 ;
2003-09-04 18:25:57 +00:00
v = GetIntFromParm ( 0 ) ;
v2 = GetIntFromParm ( 1 ) ;
2003-03-20 20:49:13 +00:00
if ( ! parm5 ) {
// signed
if ( v < v2 ) return parm3 ;
if ( v > v2 ) return parm4 ;
}
else {
// unsigned
if ( ( unsigned int ) v < ( unsigned int ) v2 ) return parm3 ;
if ( ( unsigned int ) v > ( unsigned int ) v2 ) return parm4 ;
}
2002-08-02 10:01:35 +00:00
}
2002-08-28 10:08:38 +00:00
return parm2 ;
2002-08-02 10:01:35 +00:00
case EW_INTOP :
{
int v , v2 ;
2010-03-24 17:22:56 +00:00
TCHAR * p = var0 ;
2013-08-07 23:04:23 +00:00
v = GetIntFromParm ( 1 ) ; // BUGBUG64: TODO: These should be INT_PTR, the script might be playing with pointers and System::Call
2003-09-04 18:25:57 +00:00
v2 = GetIntFromParm ( 2 ) ;
2002-08-28 10:08:38 +00:00
switch ( parm3 )
2002-08-02 10:01:35 +00:00
{
case 0 : v + = v2 ; break ;
case 1 : v - = v2 ; break ;
case 2 : v * = v2 ; break ;
2003-09-04 18:25:57 +00:00
case 3 : if ( v2 ) v / = v2 ; else { v = 0 ; exec_error + + ; } break ;
2002-08-02 10:01:35 +00:00
case 4 : v | = v2 ; break ;
case 5 : v & = v2 ; break ;
case 6 : v ^ = v2 ; break ;
2003-03-28 18:41:15 +00:00
case 7 : v = ! v ; break ;
case 8 : v = v | | v2 ; break ;
case 9 : v = v & & v2 ; break ;
2003-09-04 18:25:57 +00:00
case 10 : if ( v2 ) v % = v2 ; else { v = 0 ; exec_error + + ; } break ;
2004-06-25 15:24:20 +00:00
case 11 : v = v < < v2 ; break ;
case 12 : v = v > > v2 ; break ;
2002-08-02 10:01:35 +00:00
}
myitoa ( p , v ) ;
}
2003-04-01 18:07:32 +00:00
break ;
2002-09-24 18:49:21 +00:00
case EW_INTFMT : {
2010-03-24 17:22:56 +00:00
TCHAR * buf0 = GetStringFromParm ( 0x01 ) ;
2002-09-19 21:53:24 +00:00
wsprintf ( var0 ,
buf0 ,
2013-08-07 23:04:23 +00:00
GetIntPtrFromParm ( 2 ) ) ;
2002-09-24 18:49:21 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_INTOPTS
# ifdef NSIS_SUPPORT_STACK
case EW_PUSHPOP :
{
2002-09-19 21:53:24 +00:00
stack_t * s = g_st ;
2002-08-28 10:08:38 +00:00
int cnt = parm2 ;
2002-08-02 10:01:35 +00:00
if ( cnt ) //Exch contributed by Fritz Elfert
{
while ( cnt - - & & s ) s = s - > next ;
if ( ! s )
{
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Exch: stack < %d elements " ) , parm2 ) ;
2005-03-17 20:44:31 +00:00
my_MessageBox ( GetNSISStringTT ( LANG_INSTCORRUPTED ) , MB_OK | MB_ICONSTOP | ( IDOK < < 21 ) ) ;
2003-04-01 18:07:32 +00:00
return EXEC_ERROR ;
2002-08-02 10:01:35 +00:00
}
2002-09-19 21:53:24 +00:00
mystrcpy ( buf0 , s - > text ) ;
2002-08-19 21:24:44 +00:00
mystrcpy ( s - > text , g_st - > text ) ;
2002-09-19 21:53:24 +00:00
mystrcpy ( g_st - > text , buf0 ) ;
2002-08-02 10:01:35 +00:00
}
2002-09-19 21:53:24 +00:00
else if ( parm1 )
2002-08-02 10:01:35 +00:00
{
2002-09-19 21:53:24 +00:00
if ( ! s )
2002-08-02 10:01:35 +00:00
{
2010-03-24 17:22:56 +00:00
log_printf ( _T ( " Pop: stack empty " ) ) ;
2003-09-04 18:25:57 +00:00
exec_error + + ;
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
}
2002-09-19 21:53:24 +00:00
mystrcpy ( var0 , s - > text ) ;
g_st = s - > next ;
2002-08-02 10:01:35 +00:00
GlobalFree ( ( HGLOBAL ) s ) ;
}
else
{
2005-09-09 16:08:44 +00:00
s = ( stack_t * ) GlobalAlloc ( GPTR , sizeof ( stack_t ) ) ;
2003-09-04 18:25:57 +00:00
GetNSISString ( s - > text , parm0 ) ;
2002-08-02 10:01:35 +00:00
s - > next = g_st ;
g_st = s ;
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_STACK
# ifdef NSIS_SUPPORT_HWNDS
case EW_FINDWINDOW :
case EW_SENDMESSAGE :
{
2013-08-07 23:04:23 +00:00
LRESULT v ;
INT_PTR b3 = GetIntPtrFromParm ( 3 ) ;
INT_PTR b4 = GetIntPtrFromParm ( 4 ) ;
if ( parm5 & 1 ) b3 = ( INT_PTR ) GetStringFromParm ( 0x33 ) ;
if ( parm5 & 2 ) b4 = ( INT_PTR ) GetStringFromParm ( 0x44 ) ;
2002-08-02 10:01:35 +00:00
2002-09-19 21:53:24 +00:00
if ( which = = EW_SENDMESSAGE )
2002-09-13 20:59:04 +00:00
{
2013-08-07 23:04:23 +00:00
HWND hwnd = GetHwndFromParm ( 1 ) ;
2003-09-04 18:25:57 +00:00
int msg = GetIntFromParm ( 2 ) ;
2002-08-02 10:01:35 +00:00
2014-02-08 00:13:52 +00:00
if ( parm5 > > 2 ) exec_error + = ! SendMessageTimeout ( hwnd , msg , b3 , b4 , SMTO_NORMAL , parm5 > > 2 , ( PDWORD_PTR ) & v ) ;
2010-03-24 17:22:56 +00:00
// Jim Park: This sends script messages. Some messages require
// settings for Unicode. This means the user's script may need
// to change for Unicode NSIS.
2002-09-13 21:23:01 +00:00
else v = SendMessage ( hwnd , msg , b3 , b4 ) ;
2002-09-13 20:59:04 +00:00
}
else
{
2010-03-24 17:22:56 +00:00
TCHAR * buf0 = GetStringFromParm ( 0x01 ) ;
TCHAR * buf1 = GetStringFromParm ( 0x12 ) ;
2013-08-07 23:04:23 +00:00
v = ( LRESULT ) FindWindowEx ( ( HWND ) b3 , ( HWND ) b4 , buf0 [ 0 ] ? buf0 : NULL , buf1 [ 0 ] ? buf1 : NULL ) ;
2002-08-21 16:36:09 +00:00
}
2002-09-19 21:53:24 +00:00
2013-08-07 23:04:23 +00:00
if ( parm0 > = 0 ) iptrtostr ( var0 , v ) ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_ISWINDOW :
2013-08-07 23:04:23 +00:00
if ( IsWindow ( GetHwndFromParm ( 0 ) ) ) return parm1 ;
2002-08-28 10:08:38 +00:00
return parm2 ;
2002-09-18 19:08:53 +00:00
# ifdef NSIS_CONFIG_ENHANCEDUI_SUPPORT
2002-08-21 16:36:09 +00:00
case EW_GETDLGITEM :
2013-08-07 23:04:23 +00:00
iptrtostr (
2002-09-19 21:53:24 +00:00
var0 ,
2013-08-07 23:04:23 +00:00
( INT_PTR ) GetDlgItem (
GetHwndFromParm ( 1 ) ,
2003-09-04 18:25:57 +00:00
GetIntFromParm ( 2 )
2002-08-21 16:36:09 +00:00
)
) ;
2003-04-01 18:07:32 +00:00
break ;
2003-09-04 18:25:57 +00:00
case EW_SETCTLCOLORS :
2003-03-28 18:41:15 +00:00
{
2003-09-04 18:25:57 +00:00
ctlcolors * c = ( ctlcolors * ) ( g_blocks [ NB_CTLCOLORS ] . offset + parm1 ) ;
2013-08-07 23:04:23 +00:00
SetWindowLongPtr ( GetHwndFromParm ( 0 ) , GWLP_USERDATA , ( LONG_PTR ) c ) ;
2003-03-28 18:41:15 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-09-18 19:08:53 +00:00
case EW_SETBRANDINGIMAGE :
{
RECT r ;
2003-01-27 17:03:35 +00:00
HANDLE hImage ;
HWND hwImage = GetDlgItem ( g_hwnd , parm1 ) ;
2003-05-09 21:11:14 +00:00
GetClientRect ( hwImage , & r ) ;
2003-01-27 17:03:35 +00:00
hImage = LoadImage (
2002-09-18 19:08:53 +00:00
0 ,
2003-09-04 18:25:57 +00:00
GetStringFromParm ( 0x00 ) ,
2002-09-18 19:08:53 +00:00
IMAGE_BITMAP ,
2003-09-23 19:01:19 +00:00
parm2 * r . right ,
parm2 * r . bottom ,
2002-09-18 19:08:53 +00:00
LR_LOADFROMFILE
) ;
2003-09-04 18:25:57 +00:00
hImage = ( HANDLE ) SendMessage (
2002-09-18 19:08:53 +00:00
hwImage ,
STM_SETIMAGE ,
IMAGE_BITMAP ,
2003-01-27 17:03:35 +00:00
( LPARAM ) hImage
2002-09-18 19:08:53 +00:00
) ;
2003-09-04 18:25:57 +00:00
// delete old image
if ( hImage ) DeleteObject ( hImage ) ;
2002-09-18 19:08:53 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-09-18 19:08:53 +00:00
case EW_CREATEFONT :
{
2002-09-21 06:13:15 +00:00
static LOGFONT f ;
2012-11-09 23:17:33 +00:00
const HDC hdc = GetDC ( g_hwnd ) ;
f . lfHeight = - MulDiv ( GetIntFromParm ( 2 ) , GetDeviceCaps ( hdc , LOGPIXELSY ) , 72 ) ;
ReleaseDC ( g_hwnd , hdc ) ;
2003-09-04 18:25:57 +00:00
f . lfWeight = GetIntFromParm ( 3 ) ;
2002-09-18 19:08:53 +00:00
f . lfItalic = parm4 & 1 ;
f . lfUnderline = parm4 & 2 ;
f . lfStrikeOut = parm4 & 4 ;
2003-01-28 14:28:56 +00:00
f . lfCharSet = DEFAULT_CHARSET ;
2003-09-04 18:25:57 +00:00
GetNSISString ( f . lfFaceName , parm1 ) ;
2013-08-07 23:04:23 +00:00
iptrtostr ( var0 , ( INT_PTR ) CreateFontIndirect ( & f ) ) ;
2002-09-18 19:08:53 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-11-15 13:15:42 +00:00
case EW_SHOWWINDOW :
2004-06-25 19:53:05 +00:00
{
2013-08-07 23:04:23 +00:00
HWND hw = GetHwndFromParm ( 0 ) ;
2004-06-25 19:53:05 +00:00
int a = GetIntFromParm ( 1 ) ;
2010-03-24 17:22:56 +00:00
if ( parm2 ) log_printf ( _T ( " HideWindow " ) ) ;
2003-07-16 22:36:18 +00:00
if ( ! parm3 )
2004-06-25 19:53:05 +00:00
ShowWindow ( hw , a ) ;
2003-07-16 22:36:18 +00:00
else
2004-06-25 19:53:05 +00:00
EnableWindow ( hw , a ) ;
}
2003-04-01 18:07:32 +00:00
break ;
2002-09-18 19:08:53 +00:00
# endif //NSIS_CONFIG_ENHANCEDUI_SUPPORT
# endif //NSIS_SUPPORT_HWNDS
2002-08-02 10:01:35 +00:00
# ifdef NSIS_SUPPORT_SHELLEXECUTE
case EW_SHELLEXEC : // this uses improvements of Andras Varga
{
2017-03-21 22:04:40 +00:00
SHELLEXECUTEINFO sei ;
TCHAR * buf0 = GetStringFromParm ( 0x00 ) ; // Verb
TCHAR * buf3 = GetStringFromParm ( 0x31 ) ; // File
TCHAR * buf2 = GetStringFromParm ( 0x22 ) ; // Parameters
2012-09-08 02:50:09 +00:00
GetStringFromParm ( 0x15 ) ; // For update_status_text_buf1
2004-04-16 22:36:03 +00:00
update_status_text_buf1 ( LANG_EXECSHELL ) ;
2017-03-21 22:04:40 +00:00
sei . cbSize = sizeof ( SHELLEXECUTEINFO ) ;
sei . fMask = parm4 ;
sei . hwnd = g_hwnd , sei . nShow = parm3 ;
sei . lpVerb = buf0 [ 0 ] ? buf0 : NULL , sei . lpFile = buf3 , sei . lpParameters = buf2 [ 0 ] ? buf2 : NULL , sei . lpDirectory = state_output_directory ;
sei . lpIDList = NULL ; // Must set this because SEE_MASK_INVOKEIDLIST might be set
if ( ! ShellExecuteEx ( & sei ) )
2002-08-02 10:01:35 +00:00
{
2017-04-18 19:21:53 +00:00
log_printf5 ( _T ( " ExecShell: warning: error ( \" %s \" : file: \" %s \" params: \" %s \" )=%d " ) , buf0 , buf3 , buf2 , GetLastError ( ) ) ;
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
}
else
{
2017-03-21 22:04:40 +00:00
if ( SEE_MASK_NOCLOSEPROCESS & sei . fMask )
{
WaitForProcess ( sei . hProcess ) ;
CloseHandle ( sei . hProcess ) ;
}
2010-03-24 17:22:56 +00:00
log_printf4 ( _T ( " ExecShell: success ( \" %s \" : file: \" %s \" params: \" %s \" ) " ) , buf0 , buf3 , buf2 ) ;
2002-08-02 10:01:35 +00:00
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_SHELLEXECUTE
# ifdef NSIS_SUPPORT_EXECUTE
case EW_EXECUTE :
{
HANDLE hProc ;
2010-03-24 17:22:56 +00:00
TCHAR * buf0 = GetStringFromParm ( 0x00 ) ;
log_printf2 ( _T ( " Exec: command= \" %s \" " ) , buf0 ) ;
2003-09-04 18:25:57 +00:00
update_status_text ( LANG_EXECUTE , buf0 ) ;
2002-08-02 10:01:35 +00:00
2007-04-19 21:20:17 +00:00
hProc = myCreateProcess ( buf0 ) ;
2002-08-02 10:01:35 +00:00
if ( hProc )
{
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Exec: success ( \" %s \" ) " ) , buf0 ) ;
2003-11-27 20:19:48 +00:00
if ( parm2 )
2002-08-02 10:01:35 +00:00
{
2017-03-21 22:04:40 +00:00
DWORD lExitCode = WaitForProcess ( hProc ) ;
2003-11-27 20:19:48 +00:00
if ( parm1 > = 0 ) myitoa ( var1 , lExitCode ) ;
2003-09-04 18:25:57 +00:00
else if ( lExitCode ) exec_error + + ;
2002-08-02 10:01:35 +00:00
}
2017-03-21 22:04:40 +00:00
CloseHandle ( hProc ) ;
2002-08-02 10:01:35 +00:00
}
2002-09-19 21:53:24 +00:00
else
{
2003-09-04 18:25:57 +00:00
exec_error + + ;
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Exec: failed createprocess ( \" %s \" ) " ) , buf0 ) ;
2002-08-02 10:01:35 +00:00
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_EXECUTE
# ifdef NSIS_SUPPORT_GETFILETIME
2002-09-19 21:53:24 +00:00
case EW_GETFILETIME :
2002-08-02 10:01:35 +00:00
// this new implementation based on one by Dave Bau
// used FindFirstFile instead of GetFileTime to better handle files that are locked.
// also allows GetFileTime to be passed a wildcard.
2002-09-19 21:53:24 +00:00
{
WIN32_FIND_DATA * ffd ;
2010-03-24 17:22:56 +00:00
TCHAR * highout = var0 ;
TCHAR * lowout = var1 ;
TCHAR * buf0 = GetStringFromParm ( 0x02 ) ;
2002-08-02 10:01:35 +00:00
2002-09-19 21:53:24 +00:00
ffd = file_exists ( buf0 ) ;
if ( ffd )
{
myitoa ( lowout , ffd - > ftLastWriteTime . dwLowDateTime ) ;
myitoa ( highout , ffd - > ftLastWriteTime . dwHighDateTime ) ;
}
else
2002-08-02 10:01:35 +00:00
{
* lowout = * highout = 0 ;
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_GETFILETIME
# ifdef NSIS_SUPPORT_GETDLLVERSION
case EW_GETDLLVERSION :
{
2015-11-25 13:13:42 +00:00
TCHAR * highout = var0 , * lowout = var1 ;
DWORD s1 , d ;
2007-04-20 23:40:05 +00:00
VS_FIXEDFILEINFO * pvsf1 ;
2010-03-24 17:22:56 +00:00
TCHAR * buf1 = GetStringFromParm ( - 0x12 ) ;
2015-11-25 13:13:42 +00:00
s1 = ( ( DWORD ( WINAPI * ) ( LPCTSTR , DWORD * ) ) myGetProcAddress ( MGA_GetFileVersionInfoSize ) ) ( buf1 , & d ) ;
2002-08-02 10:01:35 +00:00
* lowout = * highout = 0 ;
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
if ( s1 )
{
void * b1 ;
2005-09-09 16:08:44 +00:00
b1 = GlobalAlloc ( GPTR , s1 ) ;
2002-08-02 10:01:35 +00:00
if ( b1 )
{
2015-11-25 13:13:42 +00:00
FARPROC gfvi = myGetProcAddress ( MGA_GetFileVersionInfo ) , vqv = myGetProcAddress ( MGA_VerQueryValue ) ;
2002-08-02 10:01:35 +00:00
UINT uLen ;
2015-11-25 13:13:42 +00:00
if ( ( ( BOOL ( WINAPI * ) ( LPCTSTR , DWORD , DWORD , LPVOID ) ) gfvi ) ( buf1 , 0 , s1 , b1 )
& & ( ( BOOL ( WINAPI * ) ( LPCVOID , LPCTSTR , LPVOID * , UINT * ) ) vqv ) ( b1 , _T ( " \\ " ) , ( void * ) & pvsf1 , & uLen ) )
2002-08-02 10:01:35 +00:00
{
myitoa ( highout , pvsf1 - > dwFileVersionMS ) ;
myitoa ( lowout , pvsf1 - > dwFileVersionLS ) ;
2003-09-04 18:25:57 +00:00
exec_error - - ;
2002-08-02 10:01:35 +00:00
}
GlobalFree ( b1 ) ;
}
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_GETDLLVERSION
# ifdef NSIS_SUPPORT_ACTIVEXREG
case EW_REGISTERDLL :
{
2003-09-04 18:25:57 +00:00
exec_error + + ;
if ( SUCCEEDED ( g_hres ) )
2002-08-02 10:01:35 +00:00
{
2004-11-11 20:34:50 +00:00
HANDLE h = NULL ;
2010-03-24 17:22:56 +00:00
TCHAR * buf1 = GetStringFromParm ( - 0x10 ) ;
TCHAR * buf0 = GetStringFromParm ( 0x01 ) ;
2002-09-19 21:53:24 +00:00
2004-11-11 21:28:25 +00:00
if ( parm4 )
2004-11-11 20:34:50 +00:00
h = GetModuleHandle ( buf1 ) ;
2003-09-04 18:25:57 +00:00
if ( ! h )
2007-01-23 18:16:57 +00:00
h = LoadLibraryEx ( buf1 , NULL , LOAD_WITH_ALTERED_SEARCH_PATH ) ;
2002-08-02 10:01:35 +00:00
if ( h )
{
2010-04-13 15:01:14 +00:00
// Jim Park: Need to use our special NSISGetProcAddress to convert
// buf0 to char before calling GetProcAddress() which only takes
// chars.
FARPROC funke = NSISGetProcAddress ( h , buf0 ) ;
2002-09-19 21:53:24 +00:00
if ( funke )
2002-08-02 10:01:35 +00:00
{
2003-09-04 18:25:57 +00:00
exec_error - - ;
2002-09-29 20:25:15 +00:00
if ( parm2 )
{
2004-04-16 22:36:03 +00:00
update_status_text_buf1 ( parm2 ) ;
2003-09-04 18:25:57 +00:00
if ( funke ( ) ) exec_error + + ;
2002-09-29 20:25:15 +00:00
}
else
2002-08-02 10:01:35 +00:00
{
2010-03-24 17:22:56 +00:00
void ( * func ) ( HWND , int , TCHAR * , void * , void * ) ;
2002-08-02 10:01:35 +00:00
func = ( void * ) funke ;
2003-09-10 16:39:06 +00:00
func (
g_hwnd ,
NSIS_MAX_STRLEN ,
2010-03-24 17:22:56 +00:00
( TCHAR * ) g_usrvars ,
2002-08-02 10:01:35 +00:00
# ifdef NSIS_SUPPORT_STACK
2004-10-23 17:43:08 +00:00
( void * ) & g_st ,
2002-08-02 10:01:35 +00:00
# else
2004-10-23 17:43:08 +00:00
NULL ,
2003-09-10 16:39:06 +00:00
# endif //NSIS_SUPPORT_STACK
2004-10-23 17:43:08 +00:00
& plugin_extra_parameters
2003-09-10 16:39:06 +00:00
) ;
2002-08-02 10:01:35 +00:00
}
}
else
{
2003-09-04 18:25:57 +00:00
update_status_text ( LANG_CANNOTFINDSYMBOL , buf0 ) ;
2010-03-24 17:22:56 +00:00
log_printf3 ( _T ( " Error registering DLL: %s not found in %s " ) , buf0 , buf1 ) ;
2002-08-02 10:01:35 +00:00
}
2008-11-29 22:03:33 +00:00
if ( ! parm3 & & Plugins_CanUnload ( h ) ) FreeLibrary ( h ) ;
2002-08-02 10:01:35 +00:00
}
else
{
2004-04-16 22:36:03 +00:00
update_status_text_buf1 ( LANG_COULDNOTLOAD ) ;
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " Error registering DLL: Could not load %s " ) , buf1 ) ;
2002-08-02 10:01:35 +00:00
}
}
else
{
2004-04-16 22:36:03 +00:00
update_status_text_buf1 ( LANG_NOOLE ) ;
2010-03-24 17:22:56 +00:00
log_printf ( _T ( " Error registering DLL: Could not initialize OLE " ) ) ;
2002-08-02 10:01:35 +00:00
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif
# ifdef NSIS_SUPPORT_CREATESHORTCUT
2003-05-24 13:50:24 +00:00
case EW_CREATESHORTCUT :
{
2010-03-24 17:22:56 +00:00
TCHAR * buf1 = GetStringFromParm ( - 0x10 ) ;
TCHAR * buf2 = GetStringFromParm ( - 0x21 ) ;
TCHAR * buf0 = GetStringFromParm ( 0x02 ) ;
TCHAR * buf3 = GetStringFromParm ( - 0x33 ) ;
TCHAR * buf4 = GetStringFromParm ( 0x45 ) ;
2015-11-21 13:12:40 +00:00
const int icoi = ( parm4 > > CS_II_SHIFT ) & ( CS_II_MASK > > CS_II_SHIFT ) , nwd = parm4 & CS_NWD ,
sc = ( parm4 > > CS_SC_SHIFT ) & ( CS_SC_MASK > > CS_SC_SHIFT ) , hk = ( parm4 > > CS_HK_SHIFT ) & ( CS_HK_MASK > > CS_HK_SHIFT ) ;
2002-09-25 12:54:10 +00:00
HRESULT hres ;
IShellLink * psl ;
2002-08-02 10:01:35 +00:00
2004-04-16 22:36:03 +00:00
if ( ! validpathspec ( buf2 ) )
2004-07-15 17:37:11 +00:00
GetStringFromParm ( 0x21 ) ;
2003-10-02 12:03:05 +00:00
2014-03-28 16:21:39 +00:00
log_printf8 ( _T ( " CreateShortcut: out: \" %s \" , in: \" %s %s \" , icon: %s,%d, sw=%d, hk=%d " ) ,
2015-11-21 13:12:40 +00:00
buf1 , buf2 , buf0 , buf3 , icoi , sc , hk ) ;
2002-09-25 12:54:10 +00:00
2003-09-04 18:25:57 +00:00
hres = CoCreateInstance ( & CLSID_ShellLink , NULL , CLSCTX_INPROC_SERVER ,
& IID_IShellLink , ( void * * ) & psl ) ;
if ( SUCCEEDED ( hres ) )
{
IPersistFile * ppf ;
2002-09-25 12:54:10 +00:00
2003-09-04 18:25:57 +00:00
hres = psl - > lpVtbl - > QueryInterface ( psl , & IID_IPersistFile , ( void * * ) & ppf ) ;
2002-09-25 12:54:10 +00:00
if ( SUCCEEDED ( hres ) )
{
2004-04-16 22:36:03 +00:00
hres = psl - > lpVtbl - > SetPath ( psl , buf2 ) ;
2015-11-21 13:12:40 +00:00
if ( ! nwd ) psl - > lpVtbl - > SetWorkingDirectory ( psl , state_output_directory ) ;
if ( sc ) psl - > lpVtbl - > SetShowCmd ( psl , sc ) ;
psl - > lpVtbl - > SetHotkey ( psl , ( unsigned short ) hk ) ;
if ( buf3 [ 0 ] ) psl - > lpVtbl - > SetIconLocation ( psl , buf3 , icoi ) ;
2003-11-27 23:21:15 +00:00
psl - > lpVtbl - > SetArguments ( psl , buf0 ) ;
psl - > lpVtbl - > SetDescription ( psl , buf4 ) ;
if ( SUCCEEDED ( hres ) )
{
2010-03-29 14:24:47 +00:00
# ifdef _UNICODE
2013-07-27 17:40:38 +00:00
hres = ppf - > lpVtbl - > Save ( ppf , buf1 , TRUE ) ;
2010-03-29 14:24:47 +00:00
# else
2013-08-07 23:04:23 +00:00
WCHAR * wsz = ( LPWSTR ) buf2 ; // buf2 + buf3 = WCHAR wsz[NSIS_MAX_STRLEN]
2013-07-27 17:40:38 +00:00
hres = E_FAIL ;
if ( MultiByteToWideChar ( CP_ACP , 0 , buf1 , - 1 , wsz , NSIS_MAX_STRLEN ) )
hres = ppf - > lpVtbl - > Save ( ppf , wsz , TRUE ) ;
2010-03-29 14:24:47 +00:00
# endif
2003-11-27 23:21:15 +00:00
}
2003-09-04 18:25:57 +00:00
ppf - > lpVtbl - > Release ( ppf ) ;
}
psl - > lpVtbl - > Release ( psl ) ;
2002-09-25 12:54:10 +00:00
}
2002-08-02 10:01:35 +00:00
2003-09-04 18:25:57 +00:00
if ( FAILED ( hres ) )
2002-08-02 10:01:35 +00:00
{
2003-09-04 18:25:57 +00:00
exec_error + + ;
2004-04-16 22:36:03 +00:00
update_status_text_buf1 ( LANG_ERRORCREATINGSHORTCUT ) ;
2002-08-02 10:01:35 +00:00
}
else
{
2004-04-16 22:36:03 +00:00
update_status_text_buf1 ( LANG_CREATESHORTCUT ) ;
2002-08-02 10:01:35 +00:00
}
2002-09-24 18:49:21 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_CREATESHORTCUT
# ifdef NSIS_SUPPORT_COPYFILES
case EW_COPYFILES : // CopyFile (added by NOP)
{
int res ;
2003-07-12 15:19:49 +00:00
SHFILEOPSTRUCT op ;
2010-03-24 17:22:56 +00:00
TCHAR * buf0 = GetStringFromParm ( 0x00 ) ;
TCHAR * buf1 = GetStringFromParm ( 0x11 ) ;
TCHAR * buf2 = GetStringFromParm ( 0x23 ) ; // LANG_COPYTO + buf1
log_printf3 ( _T ( " CopyFiles \" %s \" -> \" %s \" " ) , buf0 , buf1 ) ;
2007-04-12 20:24:13 +00:00
if ( ! file_exists ( buf0 ) )
{
// workaround for bug #774966
//
// on nt4, SHFileOperation silently fails if the source
// file doesn't exist. do a manual check instead.
update_status_text ( LANG_COPYFAILED , 0 ) ;
exec_error + + ;
break ;
}
2003-07-12 15:19:49 +00:00
op . hwnd = g_hwnd ;
op . wFunc = FO_COPY ;
2002-09-19 21:53:24 +00:00
buf0 [ mystrlen ( buf0 ) + 1 ] = 0 ;
buf1 [ mystrlen ( buf1 ) + 1 ] = 0 ;
2002-08-02 10:01:35 +00:00
2002-09-19 21:53:24 +00:00
op . pFrom = buf0 ;
op . pTo = buf1 ;
op . lpszProgressTitle = buf2 ;
2003-07-12 15:19:49 +00:00
op . fFlags = parm2 ;
2003-09-04 18:25:57 +00:00
update_status_text ( 0 , buf2 ) ;
2003-07-12 15:19:49 +00:00
res = SHFileOperation ( & op ) ;
if ( res )
2002-08-02 10:01:35 +00:00
{ // some of these changes were from Edgewise (wiked_edge@yahoo.com)
2003-09-04 18:25:57 +00:00
update_status_text ( LANG_COPYFAILED , 0 ) ;
exec_error + + ;
2003-07-12 15:19:49 +00:00
}
}
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_COPYFILES
# ifdef NSIS_SUPPORT_REBOOT
case EW_REBOOT :
2003-04-01 18:07:32 +00:00
if ( parm0 ! = 0xbadf00d )
{
2005-03-17 20:44:31 +00:00
my_MessageBox ( GetNSISStringTT ( LANG_INSTCORRUPTED ) , MB_OK | MB_ICONSTOP | ( IDOK < < 21 ) ) ;
2003-04-01 18:07:32 +00:00
return EXEC_ERROR ;
}
2002-09-19 21:53:24 +00:00
2004-10-14 13:56:02 +00:00
g_exec_flags . reboot_called + + ;
// a following EW_QUIT will make sure the installer quits right away
2002-08-02 10:01:35 +00:00
break ;
# endif //NSIS_SUPPORT_REBOOT
# ifdef NSIS_SUPPORT_INIFILES
case EW_WRITEINI :
{
2010-03-24 17:22:56 +00:00
TCHAR * sec = 0 , * key = 0 , * str = 0 ;
2002-09-19 21:53:24 +00:00
# ifdef NSIS_CONFIG_LOG
2010-03-24 17:22:56 +00:00
mystrcpy ( buf1 , _T ( " <RM> " ) ) ;
2002-09-19 21:53:24 +00:00
mystrcpy ( buf2 , buf1 ) ;
2002-08-02 10:01:35 +00:00
# endif
2013-08-07 23:04:23 +00:00
if ( parm0 ) sec = GetStringFromParm ( 0x00 ) ;
if ( parm1 ) key = GetStringFromParm ( 0x11 ) ;
if ( parm4 ) str = GetStringFromParm ( 0x22 ) ;
2003-09-04 18:25:57 +00:00
buf3 = GetStringFromParm ( - 0x33 ) ;
2010-03-24 17:22:56 +00:00
log_printf5 ( _T ( " WriteINIStr: wrote [%s] %s=%s in %s " ) , buf0 , buf1 , buf2 , buf3 ) ;
2003-09-04 18:25:57 +00:00
if ( ! WritePrivateProfileString ( sec , key , str , buf3 ) ) exec_error + + ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_READINISTR :
{
2010-04-14 14:27:51 +00:00
// GetPrivateProfileString can't read CR & LF characters inside values from INI files
2016-02-04 20:14:06 +00:00
// so we use "\n" as a detection system to see if we did successfully read a value
2010-04-14 14:27:51 +00:00
const TCHAR errstr [ ] = _T ( " \n " ) ;
2010-03-24 17:22:56 +00:00
TCHAR * p = var0 ;
TCHAR * buf0 = GetStringFromParm ( 0x01 ) ;
TCHAR * buf1 = GetStringFromParm ( 0x12 ) ;
TCHAR * buf2 = GetStringFromParm ( - 0x23 ) ;
2010-04-12 16:00:17 +00:00
GetPrivateProfileString ( buf0 , buf1 , errstr , p , NSIS_MAX_STRLEN - 1 , buf2 ) ;
2010-04-14 14:27:51 +00:00
if ( p [ 0 ] = = _T ( ' \n ' ) ) // we got the default string "\n" instead of a real value
2002-08-02 10:01:35 +00:00
{
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
p [ 0 ] = 0 ;
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_INIFILES
# ifdef NSIS_SUPPORT_REGISTRYFUNCTIONS
case EW_DELREG :
{
2017-06-04 22:48:13 +00:00
long res = ! ERROR_SUCCESS , rootkey = parm1 ;
const TCHAR * rkn UNUSED = RegKeyHandleToName ( ( HKEY ) rootkey ) ;
if ( ! parm4 ) // TOK_DELETEREGVALUE
2002-08-02 10:01:35 +00:00
{
2017-06-04 22:48:13 +00:00
HKEY hKey = RegOpenScriptKey ( KEY_SET_VALUE ) ;
2004-06-25 19:53:05 +00:00
if ( hKey )
2002-08-02 10:01:35 +00:00
{
2010-03-24 17:22:56 +00:00
TCHAR * buf3 = GetStringFromParm ( 0x33 ) ;
2004-06-25 19:53:05 +00:00
res = RegDeleteValue ( hKey , buf3 ) ;
2010-03-24 17:22:56 +00:00
log_printf4 ( _T ( " DeleteRegValue: \" %s \\ %s \" \" %s \" " ) , rkn , buf2 , buf3 ) ;
2002-08-02 10:01:35 +00:00
RegCloseKey ( hKey ) ;
}
}
2017-06-04 22:48:13 +00:00
else // TOK_DELETEREGKEY
2002-08-02 10:01:35 +00:00
{
2010-03-24 17:22:56 +00:00
TCHAR * buf2 = GetStringFromParm ( 0x22 ) ;
log_printf3 ( _T ( " DeleteRegKey: \" %s \\ %s \" " ) , rkn , buf2 ) ;
2017-06-04 22:48:13 +00:00
res = RegDeleteScriptKey ( rootkey , buf2 , parm4 > > 1 ) ; // Shifting away the TOK_DELETEREGKEY bit, onlyifempty is now the bottom bit (">> 1" is 1 byte smaller than "& 2")
2002-08-02 10:01:35 +00:00
}
2004-06-25 19:53:05 +00:00
if ( res ! = ERROR_SUCCESS )
exec_error + + ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_WRITEREG : // write registry value
{
2017-06-04 22:48:13 +00:00
int rootkey = parm0 , type = parm4 , rtype = parm5 ;
const TCHAR * rkn UNUSED = RegKeyHandleToName ( ( HKEY ) rootkey ) ;
2002-08-02 10:01:35 +00:00
HKEY hKey ;
2010-03-24 17:22:56 +00:00
TCHAR * buf0 = GetStringFromParm ( 0x02 ) ;
TCHAR * buf1 = GetStringFromParm ( 0x11 ) ;
2005-11-24 16:45:04 +00:00
2003-09-04 18:25:57 +00:00
exec_error + + ;
2017-06-04 22:48:13 +00:00
if ( ( hKey = RegCreateScriptKey ( rootkey , buf1 , KEY_SET_VALUE ) ) )
2002-08-02 10:01:35 +00:00
{
2003-11-27 23:21:15 +00:00
LPBYTE data = ( LPBYTE ) buf2 ;
DWORD size = 0 ;
if ( type = = REG_SZ )
2002-08-02 10:01:35 +00:00
{
2003-11-27 23:21:15 +00:00
GetStringFromParm ( 0x23 ) ;
2010-03-24 17:22:56 +00:00
size = ( mystrlen ( ( TCHAR * ) data ) + 1 ) * sizeof ( TCHAR ) ;
2005-11-24 16:45:04 +00:00
if ( rtype = = REG_SZ )
{
2010-03-24 17:22:56 +00:00
log_printf5 ( _T ( " WriteRegStr: \" %s \\ %s \" \" %s \" = \" %s \" " ) , rkn , buf1 , buf0 , data ) ;
2005-11-24 16:45:04 +00:00
}
else
{
2010-03-24 17:22:56 +00:00
log_printf5 ( _T ( " WriteRegExpandStr: \" %s \\ %s \" \" %s \" = \" %s \" " ) , rkn , buf1 , buf0 , data ) ;
2005-11-24 16:45:04 +00:00
}
2002-08-02 10:01:35 +00:00
}
2003-11-27 23:21:15 +00:00
if ( type = = REG_DWORD )
2002-08-02 10:01:35 +00:00
{
2003-11-27 23:21:15 +00:00
* ( LPDWORD ) data = GetIntFromParm ( 3 ) ;
size = sizeof ( DWORD ) ;
2010-03-24 17:22:56 +00:00
log_printf5 ( _T ( " WriteRegDWORD: \" %s \\ %s \" \" %s \" = \" 0x%08x \" " ) , rkn , buf1 , buf0 , * ( LPDWORD ) data ) ;
2002-08-02 10:01:35 +00:00
}
2003-11-27 23:21:15 +00:00
if ( type = = REG_BINARY )
2002-08-02 10:01:35 +00:00
{
2005-11-24 16:50:10 +00:00
# ifdef NSIS_CONFIG_LOG
2010-03-24 17:22:56 +00:00
TCHAR binbuf [ 128 ] ;
2017-05-29 16:25:18 +00:00
LPCTSTR logf = rtype = = REG_NONE ? _T ( " WriteRegNone " ) : rtype = = REG_MULTI_SZ ? _T ( " WriteRegMultiStr " ) : _T ( " WriteRegBin " ) ;
2005-11-24 16:50:10 +00:00
# endif
2004-06-25 19:53:05 +00:00
// use buf2, buf3 and buf4
2010-03-24 17:22:56 +00:00
size = GetCompressedDataFromDataBlockToMemory ( parm3 , data , ( 3 * NSIS_MAX_STRLEN ) * sizeof ( TCHAR ) ) ;
2014-05-08 20:12:26 +00:00
LogData2Hex ( binbuf , COUNTOF ( binbuf ) , data , size ) ;
2017-05-29 16:25:18 +00:00
log_printf6 ( _T ( " %s: \" %s \\ %s \" \" %s \" = \" %s \" " ) , logf , rkn , buf1 , buf0 , binbuf ) ;
2002-08-02 10:01:35 +00:00
}
2007-03-06 21:22:37 +00:00
2004-06-25 19:53:05 +00:00
if ( size > = 0 & & RegSetValueEx ( hKey , buf0 , 0 , rtype , data , size ) = = ERROR_SUCCESS )
2007-03-06 21:22:37 +00:00
{
2003-11-27 23:21:15 +00:00
exec_error - - ;
2007-03-06 21:22:37 +00:00
}
else
{
2010-03-24 17:22:56 +00:00
log_printf4 ( _T ( " WriteReg: error writing into \" %s \\ %s \" \" %s \" " ) , rkn , buf1 , buf0 ) ;
2007-03-06 21:22:37 +00:00
}
2002-08-02 10:01:35 +00:00
RegCloseKey ( hKey ) ;
}
2010-03-24 17:22:56 +00:00
else { log_printf3 ( _T ( " WriteReg: error creating key \" %s \\ %s \" " ) , rkn , buf1 ) ; }
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_READREGSTR : // read registry string
{
2017-06-04 22:48:13 +00:00
HKEY hKey = RegOpenScriptKey ( KEY_READ ) ;
2010-03-24 17:22:56 +00:00
TCHAR * p = var0 ;
TCHAR * buf3 = GetStringFromParm ( 0x33 ) ; // buf3 == key name
2002-08-02 10:01:35 +00:00
p [ 0 ] = 0 ;
2004-06-25 19:53:05 +00:00
if ( hKey )
2002-08-02 10:01:35 +00:00
{
2017-05-29 16:25:18 +00:00
DWORD l = NSIS_MAX_STRLEN * sizeof ( TCHAR ) , t ;
2002-08-02 10:01:35 +00:00
2010-04-13 15:01:14 +00:00
// Jim Park: If plain text in p or binary data in p,
// user must be careful in accessing p correctly.
if ( RegQueryValueEx ( hKey , buf3 , NULL , & t , ( LPBYTE ) p , & l ) ! = ERROR_SUCCESS | |
2002-08-02 10:01:35 +00:00
( t ! = REG_DWORD & & t ! = REG_SZ & & t ! = REG_EXPAND_SZ ) )
{
p [ 0 ] = 0 ;
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
}
else
2002-09-19 21:53:24 +00:00
{
if ( t = = REG_DWORD )
2002-08-02 10:01:35 +00:00
{
2007-04-20 23:40:05 +00:00
exec_error + = ! parm4 ;
2002-08-02 10:01:35 +00:00
myitoa ( p , * ( ( DWORD * ) p ) ) ;
}
2005-06-21 20:52:10 +00:00
else
{
2007-04-20 23:40:05 +00:00
exec_error + = parm4 ;
2010-04-13 15:01:14 +00:00
p [ NSIS_MAX_STRLEN - 1 ] = 0 ; // RegQueryValueEx adds a null terminator, UNLESS the value is NSIS_MAX_STRLEN long
2005-06-21 20:52:10 +00:00
}
2002-08-02 10:01:35 +00:00
}
RegCloseKey ( hKey ) ;
}
2003-09-04 18:25:57 +00:00
else exec_error + + ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_REGENUM :
{
2017-06-04 22:48:13 +00:00
HKEY hKey = RegOpenScriptKey ( KEY_READ ) ;
2010-03-24 17:22:56 +00:00
TCHAR * p = var0 ;
2003-09-04 18:25:57 +00:00
int b = GetIntFromParm ( 3 ) ;
2017-06-04 22:48:13 +00:00
p [ 0 ] = 0 ; // "" on error. This assumes that RegEnumKey and RegEnumValue do not party on our buffer!
if ( hKey )
2002-08-02 10:01:35 +00:00
{
2017-06-04 22:48:13 +00:00
DWORD d = NSIS_MAX_STRLEN - 1 ; // -1 is not required here?
if ( parm4 )
RegEnumKey ( hKey , b , p , d ) ;
else if ( RegEnumValue ( hKey , b , p , & d , NULL , NULL , NULL , NULL ) ! = ERROR_SUCCESS )
2005-04-08 14:04:05 +00:00
exec_error + + ;
2017-06-04 22:48:13 +00:00
p [ NSIS_MAX_STRLEN - 1 ] = 0 ; // Not required?
RegCloseKey ( hKey ) ;
2002-08-02 10:01:35 +00:00
}
2003-09-04 18:25:57 +00:00
else exec_error + + ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_REGISTRYFUNCTIONS
# ifdef NSIS_SUPPORT_FILEFUNCTIONS
2002-09-19 21:53:24 +00:00
case EW_FCLOSE :
2002-08-02 10:01:35 +00:00
{
2015-11-22 12:44:49 +00:00
HANDLE handle = ( HANDLE ) strtoiptr ( var0 ) ;
if ( handle ) CloseHandle ( handle ) ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_FOPEN :
{
HANDLE h ;
2010-03-24 17:22:56 +00:00
TCHAR * handleout = var0 ;
TCHAR * buf1 = GetStringFromParm ( - 0x13 ) ;
2003-02-07 23:04:25 +00:00
h = myOpenFile ( buf1 , parm1 , parm2 ) ;
2002-08-02 10:01:35 +00:00
if ( h = = INVALID_HANDLE_VALUE )
{
* handleout = 0 ;
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
}
else
{
2013-08-07 23:04:23 +00:00
iptrtostr ( handleout , ( INT_PTR ) h ) ;
2002-08-02 10:01:35 +00:00
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_FPUTS :
2010-05-17 15:11:29 +00:00
# ifdef _UNICODE
case EW_FPUTWS :
// Jim Park/Wizou: in Unicode version of NSIS, EW_FPUTS still deals with ANSI files (conversion is done). We add EW_FPUTWS to deal with Unicode files.
# endif
2002-08-02 10:01:35 +00:00
{
2010-05-17 15:11:29 +00:00
int l ; // number of bytes to write
2010-03-24 17:22:56 +00:00
TCHAR * t = var0 ;
2015-10-26 23:29:39 +00:00
const int writeCodPt = parm2 , ansi = EW_FPUTS = = which ;
if ( writeCodPt ) // FileWriteByte or FileWriteWord
2002-08-02 10:01:35 +00:00
{
2010-05-17 15:11:29 +00:00
// Note: In Unicode version, we put a WORD in buf1[0] and will write 1 or 2 bytes, depending on FileWriteByte/Word.
2015-11-22 12:44:49 +00:00
( ( _TUCHAR * ) buf1 ) [ 0 ] = ( _TUCHAR ) GetIntFromParm ( 1 ) ;
2015-10-26 23:29:39 +00:00
l = ( ansi ) ? 1 : sizeof ( TCHAR ) ;
2002-08-02 10:01:35 +00:00
}
2010-05-17 15:11:29 +00:00
# ifdef _UNICODE
else if ( which = = EW_FPUTS )
{
GetStringFromParm ( 0x21 ) ; // load string in buf2, convert it to ANSI in buf1
WideCharToMultiByte ( CP_ACP , 0 , buf2 , - 1 , ( LPSTR ) buf1 , NSIS_MAX_STRLEN , NULL , NULL ) ;
l = lstrlenA ( ( LPCSTR ) buf1 ) ;
}
# endif
2002-08-02 10:01:35 +00:00
else
{
2010-05-17 15:11:29 +00:00
l = mystrlen ( GetStringFromParm ( 0x11 ) ) * sizeof ( TCHAR ) ;
2002-08-02 10:01:35 +00:00
}
2015-10-26 23:29:39 +00:00
if ( * t )
2002-08-02 10:01:35 +00:00
{
2015-10-26 23:29:39 +00:00
const HANDLE hFile = ( HANDLE ) strtoiptr ( t ) ;
# ifdef _UNICODE
if ( ( ansi | writeCodPt ) | | ! parm3 | | SUCCEEDED ( UTF16LEBOM ( hFile , ( INT_PTR ) hFile ) ) )
# endif
2015-10-31 16:27:34 +00:00
if ( myWriteFile ( hFile , buf1 , l ) )
2015-10-26 23:29:39 +00:00
break ; // Success
2002-08-02 10:01:35 +00:00
}
2015-10-26 23:29:39 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_FGETS :
2010-05-17 15:11:29 +00:00
# ifdef _UNICODE
case EW_FGETWS :
// Jim Park/Wizou: in Unicode version of NSIS, EW_FGETS still deals with ANSI files (conversion is done). We add EW_FGETWS to deal with Unicode files.
# endif
2002-08-02 10:01:35 +00:00
{
2010-04-13 15:01:14 +00:00
TCHAR * textout = var1 ;
2013-07-27 23:09:54 +00:00
int rpos = 0 , ungetseek = sizeof ( TCHAR ) ;
2010-04-13 15:01:14 +00:00
TCHAR * hptr = var0 ;
2003-09-04 18:25:57 +00:00
int maxlen = GetIntFromParm ( 2 ) ;
2003-04-01 18:07:32 +00:00
if ( maxlen < 1 ) break ;
2002-08-02 10:01:35 +00:00
if ( maxlen > NSIS_MAX_STRLEN - 1 ) maxlen = NSIS_MAX_STRLEN - 1 ;
if ( * hptr )
{
2010-04-13 15:01:14 +00:00
TCHAR lc = 0 ;
2013-08-07 23:04:23 +00:00
HANDLE h = ( HANDLE ) strtoiptr ( hptr ) ;
2002-08-02 10:01:35 +00:00
while ( rpos < maxlen )
{
2010-04-13 15:01:14 +00:00
TCHAR c ;
2010-05-17 15:11:29 +00:00
# ifdef _UNICODE
2013-07-28 14:46:24 +00:00
if ( which = = EW_FGETS )
2010-05-17 15:11:29 +00:00
{
2013-07-27 23:09:54 +00:00
char tmpc [ 2 ] ;
DWORD mbtwcflags = MB_ERR_INVALID_CHARS , cbio ;
2013-07-28 14:46:24 +00:00
if ( ! ReadFile ( h , tmpc , 2 - parm3 , & cbio , NULL ) | | ! cbio ) break ;
2013-07-27 23:09:54 +00:00
ungetseek = cbio ;
2013-07-28 14:46:24 +00:00
c = ( unsigned char ) tmpc [ 0 ] ; // FileReadByte
if ( ! parm3 ) for ( ; ; ) // Try to parse as DBCS first, if that fails try again as a single byte
2013-07-27 23:09:54 +00:00
{
// BUGBUG: Limited to UCS-2/BMP, surrogate pairs are not supported.
if ( MultiByteToWideChar ( CP_ACP , mbtwcflags , tmpc , cbio , & c , 1 ) ) break ;
c = 0xfffd ; // Unicode replacement character
// If we read 2 bytes and it was not a DBCS character, we need to seek -1
if ( - - cbio ) SetFilePointer ( h , - ( - - ungetseek ) , NULL , FILE_CURRENT ) ; else break ;
}
2010-05-17 15:11:29 +00:00
}
else
# endif
2013-07-25 18:27:02 +00:00
{
2015-10-26 23:29:39 +00:00
# ifdef _UNICODE
if ( ! parm3 & & 0 = = rpos & & FAILED ( UTF16LEBOM ( h , FALSE ) ) ) break ;
# endif
2013-07-28 14:46:24 +00:00
// Read 1 TCHAR (FileReadUTF16LE, (Ansi)FileRead, FileReadWord)
if ( ! myReadFile ( h , & c , sizeof ( TCHAR ) ) ) break ;
2013-07-25 18:27:02 +00:00
}
2002-08-28 10:08:38 +00:00
if ( parm3 )
2002-08-02 10:01:35 +00:00
{
2013-07-27 23:09:54 +00:00
myitoa ( textout , ( UINT ) ( _TUCHAR ) c ) ;
2002-08-02 10:01:35 +00:00
return 0 ;
}
2010-04-13 15:01:14 +00:00
if ( lc = = _T ( ' \r ' ) | | lc = = _T ( ' \n ' ) )
2002-08-02 10:01:35 +00:00
{
2013-07-25 18:27:02 +00:00
if ( lc = = c | | ( c ! = _T ( ' \r ' ) & & c ! = _T ( ' \n ' ) ) )
2013-07-27 23:09:54 +00:00
SetFilePointer ( h , - ( ( int ) ungetseek ) , NULL , FILE_CURRENT ) ;
2013-07-25 18:27:02 +00:00
else
textout [ rpos + + ] = c ;
2002-08-02 10:01:35 +00:00
break ;
}
textout [ rpos + + ] = c ;
lc = c ;
2004-06-25 19:53:05 +00:00
if ( ! c ) break ;
2002-08-02 10:01:35 +00:00
}
}
textout [ rpos ] = 0 ;
2003-09-04 18:25:57 +00:00
if ( ! rpos ) exec_error + + ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_FSEEK :
{
2010-03-24 17:22:56 +00:00
TCHAR * t = var0 ;
2002-08-02 10:01:35 +00:00
if ( * t )
{
2013-08-07 23:04:23 +00:00
// TODO: Use SetFilePointerEx for > 4GB support on _WIN64
DWORD v = SetFilePointer ( ( HANDLE ) strtoiptr ( t ) , GetIntFromParm ( 2 ) , NULL , parm3 ) ;
2002-09-19 21:53:24 +00:00
2003-11-27 20:19:48 +00:00
if ( parm1 > = 0 )
2002-08-02 10:01:35 +00:00
{
2003-11-27 20:19:48 +00:00
myitoa ( var1 , v ) ;
2002-08-02 10:01:35 +00:00
}
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_FILEFUNCTIONS
# ifdef NSIS_SUPPORT_FINDFIRST
case EW_FINDCLOSE :
{
2015-11-22 12:44:49 +00:00
HANDLE hFind = ( HANDLE ) strtoiptr ( var0 ) ;
if ( hFind ) FindClose ( hFind ) ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_FINDNEXT :
{
2010-03-24 17:22:56 +00:00
TCHAR * textout = var0 ;
2015-11-22 12:44:49 +00:00
HANDLE hFind = ( HANDLE ) strtoiptr ( var1 ) ;
2002-08-02 10:01:35 +00:00
WIN32_FIND_DATA fd ;
2015-11-22 12:44:49 +00:00
if ( hFind & & FindNextFile ( hFind , & fd ) )
2002-08-02 10:01:35 +00:00
{
2002-08-19 21:24:44 +00:00
mystrcpy ( textout , fd . cFileName ) ;
2002-08-02 10:01:35 +00:00
}
else
{
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
* textout = 0 ;
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
case EW_FINDFIRST :
{
2010-03-24 17:22:56 +00:00
TCHAR * textout = var0 ;
TCHAR * handleout = var1 ;
2002-08-02 10:01:35 +00:00
HANDLE h ;
WIN32_FIND_DATA fd ;
2010-03-24 17:22:56 +00:00
TCHAR * buf0 = GetStringFromParm ( 0x02 ) ;
2002-09-19 21:53:24 +00:00
h = FindFirstFile ( buf0 , & fd ) ;
2002-08-02 10:01:35 +00:00
if ( h = = INVALID_HANDLE_VALUE )
{
* handleout = 0 ;
* textout = 0 ;
2003-09-04 18:25:57 +00:00
exec_error + + ;
2002-08-02 10:01:35 +00:00
}
else
{
2013-08-07 23:04:23 +00:00
iptrtostr ( handleout , ( INT_PTR ) h ) ;
2002-08-19 21:24:44 +00:00
mystrcpy ( textout , fd . cFileName ) ;
2002-08-02 10:01:35 +00:00
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_SUPPORT_FINDFIRST
# ifdef NSIS_CONFIG_UNINSTALL_SUPPORT
case EW_WRITEUNINSTALLER :
{
int ret = - 666 ;
HANDLE hFile ;
2010-03-24 17:22:56 +00:00
TCHAR * buf1 = GetStringFromParm ( - 0x10 ) ;
2007-07-05 17:43:22 +00:00
if ( ! validpathspec ( buf1 ) )
2007-07-14 10:53:35 +00:00
GetStringFromParm ( - 0x13 ) ;
2002-08-02 10:01:35 +00:00
2006-11-25 11:32:19 +00:00
remove_ro_attr ( buf1 ) ;
2002-09-19 21:53:24 +00:00
hFile = myOpenFile ( buf1 , GENERIC_WRITE , CREATE_ALWAYS ) ;
2002-08-02 10:01:35 +00:00
if ( hFile ! = INVALID_HANDLE_VALUE )
{
unsigned char * filebuf ;
2003-07-18 14:22:17 +00:00
int filehdrsize = g_filehdrsize ;
2005-09-09 16:08:44 +00:00
filebuf = ( unsigned char * ) GlobalAlloc ( GPTR , filehdrsize ) ;
2002-08-02 10:01:35 +00:00
if ( filebuf )
{
2003-09-04 18:25:57 +00:00
SetSelfFilePointer ( 0 ) ;
2003-07-18 14:22:17 +00:00
ReadSelfFile ( ( char * ) filebuf , filehdrsize ) ;
2002-08-02 10:01:35 +00:00
{
2010-03-24 17:22:56 +00:00
// parm1 = uninstdata_offset
// parm2 = m_unicon_size
2002-09-23 14:07:39 +00:00
unsigned char * seeker ;
2005-09-09 16:08:44 +00:00
unsigned char * unicon_data = seeker = ( unsigned char * ) GlobalAlloc ( GPTR , parm2 ) ;
2002-08-02 10:01:35 +00:00
if ( unicon_data ) {
2003-11-24 13:11:35 +00:00
GetCompressedDataFromDataBlockToMemory ( parm1 , unicon_data , parm2 ) ;
2002-09-23 14:07:39 +00:00
while ( * seeker ) {
2003-09-04 18:25:57 +00:00
struct icondata {
DWORD dwSize ;
DWORD dwOffset ;
} id = * ( struct icondata * ) seeker ;
seeker + = sizeof ( struct icondata ) ;
mini_memcpy ( filebuf + id . dwOffset , seeker , id . dwSize ) ;
seeker + = id . dwSize ;
2002-08-02 10:01:35 +00:00
}
GlobalFree ( unicon_data ) ;
}
}
2015-10-31 16:27:34 +00:00
myWriteFile ( hFile , ( char * ) filebuf , filehdrsize ) ;
2002-08-02 10:01:35 +00:00
GlobalFree ( filebuf ) ;
ret = GetCompressedDataFromDataBlock ( - 1 , hFile ) ;
}
CloseHandle ( hFile ) ;
}
2010-03-24 17:22:56 +00:00
log_printf3 ( _T ( " created uninstaller: %d, \" %s \" " ) , ret , buf1 ) ;
2002-08-02 10:01:35 +00:00
{
2003-09-04 18:25:57 +00:00
int str = LANG_CREATEDUNINST ;
if ( ret < 0 )
{
str = LANG_ERRORCREATING ;
DeleteFile ( buf1 ) ;
exec_error + + ;
}
2004-04-16 22:36:03 +00:00
update_status_text_buf1 ( str ) ;
2002-08-02 10:01:35 +00:00
}
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_CONFIG_UNINSTALL_SUPPORT
# ifdef NSIS_CONFIG_LOG
case EW_LOG :
2002-08-28 10:08:38 +00:00
if ( parm0 )
2002-08-02 10:01:35 +00:00
{
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " settings logging to %d " ) , parm1 ) ;
2002-08-28 10:08:38 +00:00
log_dolog = parm1 ;
2010-03-24 17:22:56 +00:00
log_printf2 ( _T ( " logging set to %d " ) , parm1 ) ;
2006-01-27 17:53:00 +00:00
# if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT)
2008-06-13 16:31:14 +00:00
if ( parm1 )
build_g_logfile ( ) ;
else
log_write ( 1 ) ;
2003-11-24 14:22:50 +00:00
# endif
2002-08-02 10:01:35 +00:00
}
else
{
2010-03-24 17:22:56 +00:00
TCHAR * buf0 = GetStringFromParm ( 0x01 ) ;
log_printf2 ( _T ( " %s " ) , buf0 ) ;
2002-08-02 10:01:35 +00:00
}
2003-04-01 18:07:32 +00:00
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_CONFIG_LOG
# ifdef NSIS_CONFIG_COMPONENTPAGE
case EW_SECTIONSET :
2003-05-18 15:56:09 +00:00
{
2003-09-04 18:25:57 +00:00
int x = GetIntFromParm ( 0 ) ;
2003-05-18 15:56:09 +00:00
if ( ( unsigned int ) x < ( unsigned int ) num_sections )
2002-08-02 10:01:35 +00:00
{
2003-09-04 18:25:57 +00:00
section * sec = g_sections + x ;
2003-11-27 20:19:48 +00:00
if ( parm2 > = 0 ) // get something
2002-08-02 10:01:35 +00:00
{
2003-11-27 20:19:48 +00:00
int res = ( ( int * ) sec ) [ parm2 ] ;
if ( ! parm2 )
2002-08-02 10:01:35 +00:00
{
2003-05-18 15:56:09 +00:00
// getting text
2005-01-14 15:13:47 +00:00
mystrcpy ( var1 , sec - > name ) ;
2002-08-02 10:01:35 +00:00
}
2003-05-18 15:56:09 +00:00
else
2002-08-02 10:01:35 +00:00
{
2003-05-18 15:56:09 +00:00
// getting number
2003-11-27 20:19:48 +00:00
myitoa ( var1 , res ) ;
2003-05-18 15:56:09 +00:00
}
}
else // set something
{
2003-11-27 20:19:48 +00:00
parm2 = - parm2 - 1 ;
if ( parm2 )
2003-05-18 15:56:09 +00:00
{
// not setting text, get int
2003-11-27 20:19:48 +00:00
parm1 = GetIntFromParm ( 1 ) ;
2003-05-18 15:56:09 +00:00
}
else
{
2005-01-14 15:13:47 +00:00
// setting text
GetNSISString ( sec - > name , parm4 ) ;
sec - > flags | = SF_NAMECHG ;
// parm1 is zero so name_ptr will be set to zero
// if name_ptr is zero, it won't be used after .onInit
2003-05-18 15:56:09 +00:00
}
2005-01-14 15:13:47 +00:00
2003-11-27 20:19:48 +00:00
( ( int * ) sec ) [ parm2 ] = parm1 ;
2005-01-11 16:33:12 +00:00
if ( parm3 ) // update flags
2003-05-18 15:56:09 +00:00
{
2005-01-11 16:33:12 +00:00
SectionFlagsChanged ( x ) ;
2002-08-02 10:01:35 +00:00
}
}
}
2003-09-04 18:25:57 +00:00
else exec_error + + ;
}
2003-04-01 18:07:32 +00:00
break ;
2003-05-24 13:50:24 +00:00
case EW_INSTTYPESET :
{
2005-01-11 16:33:12 +00:00
int x = GetIntFromParm ( 0 ) ;
2003-05-24 13:50:24 +00:00
2005-01-11 16:33:12 +00:00
if ( ( unsigned int ) x < ( unsigned int ) NSIS_MAX_INST_TYPES )
2003-05-24 13:50:24 +00:00
{
2005-01-11 16:33:12 +00:00
if ( parm3 ) // current install type
2003-05-24 13:50:24 +00:00
{
2005-01-11 16:33:12 +00:00
if ( parm2 ) // set install type
{
SetInstType ( x ) ;
2005-02-04 20:45:02 +00:00
RefreshSectionGroups ( ) ;
2005-01-11 16:33:12 +00:00
}
else // get install type
{
myitoa ( var1 , GetInstType ( 0 ) ) ;
}
2003-05-24 13:50:24 +00:00
}
2005-01-11 16:33:12 +00:00
else // install type text
2003-05-24 13:50:24 +00:00
{
2005-01-11 16:33:12 +00:00
if ( parm2 ) // set text
{
g_header - > install_types [ x ] = parm1 ;
}
else // get text
{
GetNSISString ( var1 , g_header - > install_types [ x ] ) ;
}
2003-05-24 13:50:24 +00:00
}
}
2003-09-04 18:25:57 +00:00
else exec_error + + ;
2003-05-24 13:50:24 +00:00
}
break ;
2002-08-02 10:01:35 +00:00
# endif //NSIS_CONFIG_COMPONENTPAGE
2003-11-09 22:45:25 +00:00
# ifdef NSIS_LOCKWINDOW_SUPPORT
case EW_LOCKWINDOW :
{
2016-10-12 19:31:57 +00:00
// ui_dlg_visible is 1 or 0, so is parm0. It is used because WM_SETREDRAW will toggle WS_VISIBLE!
// BUGBUG: This has unfortunate consequences when used in
// combination with BringToFront on the first page.
2016-10-11 19:47:21 +00:00
// See http://forums.winamp.com/showthread.php?t=397781 for details.
2016-10-12 19:31:57 +00:00
SendMessage ( g_hwnd , WM_SETREDRAW , parm0 & ui_dlg_visible , 0 ) ;
2016-10-11 19:47:21 +00:00
if ( parm0 ) InvalidateRect ( g_hwnd , NULL , FALSE ) ;
2005-02-03 20:26:40 +00:00
break ;
2003-11-09 22:45:25 +00:00
}
# endif //NSIS_LOCKWINDOW_SUPPORT
2002-08-02 10:01:35 +00:00
}
2003-09-04 18:25:57 +00:00
g_exec_flags . exec_error + = exec_error ;
2003-04-01 18:07:32 +00:00
return 0 ;
}