зеркало из https://github.com/mozilla/gecko-dev.git
NPOB Bug 473348 - Checkin the modified NSIS plugin source. r=bsmedberg
This commit is contained in:
Родитель
e7fb23c8ab
Коммит
512cbc5c69
|
@ -0,0 +1,25 @@
|
|||
# FIXME: install assembly and pascal includes into the correct locations
|
||||
|
||||
c_devel = Split("""
|
||||
exdll.h
|
||||
""")
|
||||
|
||||
example = Split("""
|
||||
exdll.c
|
||||
exdll.dpr
|
||||
exdll.dsp
|
||||
exdll.dsw
|
||||
exdll_with_unit.dpr
|
||||
nsis.pas
|
||||
extdll.inc
|
||||
""")
|
||||
|
||||
Import('defenv')
|
||||
|
||||
if defenv['PLATFORM'] == 'win32':
|
||||
example += c_devel
|
||||
else:
|
||||
defenv.DistributeIncC(c_devel)
|
||||
|
||||
defenv.DistributeExamples(example, path='Plugin')
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
// Unicode support by Jim Park -- 08/02/2007
|
||||
|
||||
#include <windows.h>
|
||||
#include "tchar.h"
|
||||
#include "exdll.h"
|
||||
|
||||
HINSTANCE g_hInstance;
|
||||
|
||||
HWND g_hwndParent;
|
||||
|
||||
// To work with Unicode version of NSIS, please use TCHAR-type
|
||||
// functions for accessing the variables and the stack.
|
||||
|
||||
void __declspec(dllexport) myFunction(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop,
|
||||
extra_parameters *extra)
|
||||
{
|
||||
g_hwndParent=hwndParent;
|
||||
|
||||
EXDLL_INIT();
|
||||
|
||||
|
||||
// note if you want parameters from the stack, pop them off in order.
|
||||
// i.e. if you are called via exdll::myFunction file.dat poop.dat
|
||||
// calling popstring() the first time would give you file.dat,
|
||||
// and the second time would give you poop.dat.
|
||||
// you should empty the stack of your parameters, and ONLY your
|
||||
// parameters.
|
||||
|
||||
// do your stuff here
|
||||
{
|
||||
TCHAR buf[1024];
|
||||
wsprintf(buf,_T("$0=%s\n"),getuservariable(INST_0));
|
||||
MessageBox(g_hwndParent,buf,0,MB_OK);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
|
||||
{
|
||||
g_hInstance=hInst;
|
||||
return TRUE;
|
||||
}
|
|
@ -0,0 +1,118 @@
|
|||
{
|
||||
NSIS ExDLL example
|
||||
(C) 2001 - Peter Windridge
|
||||
|
||||
Fixed and formatted by Brett Dever
|
||||
http://editor.nfscheats.com/
|
||||
|
||||
Tested in Delphi 7.0
|
||||
}
|
||||
|
||||
library exdll;
|
||||
|
||||
uses Windows;
|
||||
|
||||
type
|
||||
VarConstants = (
|
||||
INST_0,
|
||||
INST_1, // $1
|
||||
INST_2, // $2
|
||||
INST_3, // $3
|
||||
INST_4, // $4
|
||||
INST_5, // $5
|
||||
INST_6, // $6
|
||||
INST_7, // $7
|
||||
INST_8, // $8
|
||||
INST_9, // $9
|
||||
INST_R0, // $R0
|
||||
INST_R1, // $R1
|
||||
INST_R2, // $R2
|
||||
INST_R3, // $R3
|
||||
INST_R4, // $R4
|
||||
INST_R5, // $R5
|
||||
INST_R6, // $R6
|
||||
INST_R7, // $R7
|
||||
INST_R8, // $R8
|
||||
INST_R9, // $R9
|
||||
INST_CMDLINE, // $CMDLINE
|
||||
INST_INSTDIR, // $INSTDIR
|
||||
INST_OUTDIR, // $OUTDIR
|
||||
INST_EXEDIR, // $EXEDIR
|
||||
INST_LANG, // $LANGUAGE
|
||||
__INST_LAST
|
||||
);
|
||||
TVariableList = INST_0..__INST_LAST;
|
||||
pstack_t = ^stack_t;
|
||||
stack_t = record
|
||||
next: pstack_t;
|
||||
text: PChar;
|
||||
end;
|
||||
|
||||
var
|
||||
g_stringsize: integer;
|
||||
g_stacktop: ^pstack_t;
|
||||
g_variables: PChar;
|
||||
g_hwndParent: HWND;
|
||||
|
||||
function PopString(): string;
|
||||
var
|
||||
th: pstack_t;
|
||||
begin
|
||||
if integer(g_stacktop^) <> 0 then begin
|
||||
th := g_stacktop^;
|
||||
Result := PChar(@th.text);
|
||||
g_stacktop^ := th.next;
|
||||
GlobalFree(HGLOBAL(th));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure PushString(const str: string='');
|
||||
var
|
||||
th: pstack_t;
|
||||
begin
|
||||
if integer(g_stacktop) <> 0 then begin
|
||||
th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));
|
||||
lstrcpyn(@th.text, PChar(str), g_stringsize);
|
||||
th.next := g_stacktop^;
|
||||
g_stacktop^ := th;
|
||||
end;
|
||||
end;
|
||||
|
||||
function GetUserVariable(const varnum: TVariableList): string;
|
||||
begin
|
||||
if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
|
||||
Result := g_variables + integer(varnum) * g_stringsize
|
||||
else
|
||||
Result := '';
|
||||
end;
|
||||
|
||||
procedure SetUserVariable(const varnum: TVariableList; const value: string);
|
||||
begin
|
||||
if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
|
||||
lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))
|
||||
end;
|
||||
|
||||
procedure NSISDialog(const text, caption: string; const buttons: integer);
|
||||
begin
|
||||
MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
|
||||
end;
|
||||
|
||||
procedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;
|
||||
begin
|
||||
// setup global variables
|
||||
g_stringsize := string_size;
|
||||
g_hwndParent := hwndParent;
|
||||
g_stacktop := stacktop;
|
||||
g_variables := variables;
|
||||
// end global variable setup
|
||||
|
||||
NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);
|
||||
NSISDialog(PopString, 'pop', MB_OK);
|
||||
PushString('Hello, this is a push');
|
||||
SetUserVariable(INST_0, 'This is user var $0');
|
||||
end;
|
||||
|
||||
exports ex_dll;
|
||||
|
||||
begin
|
||||
end.
|
|
@ -0,0 +1,111 @@
|
|||
# Microsoft Developer Studio Project File - Name="exdll" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=exdll - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "exdll.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "exdll.mak" CFG="exdll - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "exdll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "exdll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "exdll - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /entry:"DllMain" /dll /machine:I386 /nodefaultlib /out:"../../Plugins/exdll.dll" /opt:nowin98
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "exdll - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXDLL_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "exdll - Win32 Release"
|
||||
# Name "exdll - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\exdll.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\exdll.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
|
@ -0,0 +1,29 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "exdll"=.\exdll.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
|
@ -0,0 +1,234 @@
|
|||
// Unicode support added by Jim Park -- 07/27/2007
|
||||
// Unicode support requires that all plugins take TCHARs instead as well. This
|
||||
// means existing plugins will not work for the Unicode version of NSIS unless
|
||||
// recompiled. You have been warned.
|
||||
|
||||
#ifndef _EXDLL_H_
|
||||
#define _EXDLL_H_
|
||||
|
||||
#include <windows.h>
|
||||
#include "tchar.h"
|
||||
|
||||
#if defined(__GNUC__)
|
||||
#define UNUSED __attribute__((unused))
|
||||
#else
|
||||
#define UNUSED
|
||||
#endif
|
||||
|
||||
// only include this file from one place in your DLL.
|
||||
// (it is all static, if you use it in two places it will fail)
|
||||
|
||||
#define EXDLL_INIT() { \
|
||||
g_stringsize=string_size; \
|
||||
g_stacktop=stacktop; \
|
||||
g_variables=variables; }
|
||||
|
||||
// For page showing plug-ins
|
||||
#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
|
||||
#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)
|
||||
|
||||
/* Jim Park: This char is compared as an int value and therefore
|
||||
it's fine as an ASCII. Do not need to change to wchar_t since
|
||||
it will get the same integer value. */
|
||||
#define NOTIFY_BYE_BYE _T('x')
|
||||
|
||||
typedef struct _stack_t {
|
||||
struct _stack_t *next;
|
||||
TCHAR text[1]; // this should be the length of string_size
|
||||
} stack_t;
|
||||
|
||||
|
||||
static unsigned int g_stringsize;
|
||||
static stack_t **g_stacktop;
|
||||
static TCHAR *g_variables;
|
||||
|
||||
static int __stdcall popstring(TCHAR *str) UNUSED; // 0 on success, 1 on empty stack
|
||||
static void __stdcall pushstring(const TCHAR *str) UNUSED;
|
||||
static TCHAR * __stdcall getuservariable(const int varnum) UNUSED;
|
||||
static void __stdcall setuservariable(const int varnum, const TCHAR *var) UNUSED;
|
||||
|
||||
enum
|
||||
{
|
||||
INST_0, // $0
|
||||
INST_1, // $1
|
||||
INST_2, // $2
|
||||
INST_3, // $3
|
||||
INST_4, // $4
|
||||
INST_5, // $5
|
||||
INST_6, // $6
|
||||
INST_7, // $7
|
||||
INST_8, // $8
|
||||
INST_9, // $9
|
||||
INST_R0, // $R0
|
||||
INST_R1, // $R1
|
||||
INST_R2, // $R2
|
||||
INST_R3, // $R3
|
||||
INST_R4, // $R4
|
||||
INST_R5, // $R5
|
||||
INST_R6, // $R6
|
||||
INST_R7, // $R7
|
||||
INST_R8, // $R8
|
||||
INST_R9, // $R9
|
||||
INST_CMDLINE, // $CMDLINE
|
||||
INST_INSTDIR, // $INSTDIR
|
||||
INST_OUTDIR, // $OUTDIR
|
||||
INST_EXEDIR, // $EXEDIR
|
||||
INST_LANG, // $LANGUAGE
|
||||
__INST_LAST
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
int autoclose;
|
||||
int all_user_var;
|
||||
int exec_error;
|
||||
int abort;
|
||||
int exec_reboot;
|
||||
int reboot_called;
|
||||
int XXX_cur_insttype; // deprecated
|
||||
int XXX_insttype_changed; // deprecated
|
||||
int silent;
|
||||
int instdir_error;
|
||||
int rtl;
|
||||
int errlvl;
|
||||
int alter_reg_view;
|
||||
int status_update;
|
||||
} exec_flags_type;
|
||||
|
||||
typedef struct {
|
||||
exec_flags_type *exec_flags;
|
||||
int (__stdcall *ExecuteCodeSegment)(int, HWND);
|
||||
void (__stdcall *validate_filename)(TCHAR *);
|
||||
} extra_parameters;
|
||||
|
||||
// utility functions (not required but often useful)
|
||||
static int __stdcall popstring(TCHAR *str)
|
||||
{
|
||||
stack_t *th;
|
||||
if (!g_stacktop || !*g_stacktop) return 1;
|
||||
th=(*g_stacktop);
|
||||
lstrcpy(str,th->text);
|
||||
*g_stacktop = th->next;
|
||||
GlobalFree((HGLOBAL)th);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __stdcall pushstring(const TCHAR *str)
|
||||
{
|
||||
stack_t *th;
|
||||
if (!g_stacktop) return;
|
||||
th=(stack_t*)GlobalAlloc(GPTR,(sizeof(stack_t)+(g_stringsize)*sizeof(TCHAR)));
|
||||
lstrcpyn(th->text,str,g_stringsize);
|
||||
th->next=*g_stacktop;
|
||||
*g_stacktop=th;
|
||||
}
|
||||
|
||||
static TCHAR * __stdcall getuservariable(const int varnum)
|
||||
{
|
||||
if (varnum < 0 || varnum >= __INST_LAST) return NULL;
|
||||
return g_variables+varnum*g_stringsize;
|
||||
}
|
||||
|
||||
static void __stdcall setuservariable(const int varnum, const TCHAR *var)
|
||||
{
|
||||
if (var != NULL && varnum >= 0 && varnum < __INST_LAST)
|
||||
lstrcpy(g_variables + varnum*g_stringsize, var);
|
||||
}
|
||||
|
||||
#ifdef _UNICODE
|
||||
#define PopStringW(x) popstring(x)
|
||||
#define PushStringW(x) pushstring(x)
|
||||
#define SetUserVariableW(x,y) setuservariable(x,y)
|
||||
|
||||
static int __stdcall PopStringA(char* ansiStr)
|
||||
{
|
||||
wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t));
|
||||
int rval = popstring(wideStr);
|
||||
WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
|
||||
GlobalFree((HGLOBAL)wideStr);
|
||||
return rval;
|
||||
}
|
||||
|
||||
static void __stdcall PushStringA(const char* ansiStr)
|
||||
{
|
||||
wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t));
|
||||
MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
|
||||
pushstring(wideStr);
|
||||
GlobalFree((HGLOBAL)wideStr);
|
||||
return;
|
||||
}
|
||||
|
||||
static void __stdcall GetUserVariableW(const int varnum, wchar_t* wideStr)
|
||||
{
|
||||
lstrcpyW(wideStr, getuservariable(varnum));
|
||||
}
|
||||
|
||||
static void __stdcall GetUserVariableA(const int varnum, char* ansiStr)
|
||||
{
|
||||
wchar_t* wideStr = getuservariable(varnum);
|
||||
WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
|
||||
}
|
||||
|
||||
static void __stdcall SetUserVariableA(const int varnum, const char* ansiStr)
|
||||
{
|
||||
if (ansiStr != NULL && varnum >= 0 && varnum < __INST_LAST)
|
||||
{
|
||||
wchar_t* wideStr = g_variables + varnum * g_stringsize;
|
||||
MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
// ANSI defs
|
||||
|
||||
#define PopStringA(x) popstring(x)
|
||||
#define PushStringA(x) pushstring(x)
|
||||
#define SetUserVariableA(x,y) setuservariable(x,y)
|
||||
|
||||
static int __stdcall PopStringW(wchar_t* wideStr)
|
||||
{
|
||||
char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize);
|
||||
int rval = popstring(ansiStr);
|
||||
MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
|
||||
GlobalFree((HGLOBAL)ansiStr);
|
||||
return rval;
|
||||
}
|
||||
|
||||
static void __stdcall PushStringW(wchar_t* wideStr)
|
||||
{
|
||||
char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize);
|
||||
WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
|
||||
pushstring(ansiStr);
|
||||
GlobalFree((HGLOBAL)ansiStr);
|
||||
}
|
||||
|
||||
static void __stdcall GetUserVariableW(const int varnum, wchar_t* wideStr)
|
||||
{
|
||||
char* ansiStr = getuservariable(varnum);
|
||||
MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
|
||||
}
|
||||
|
||||
static void __stdcall GetUserVariableA(const int varnum, char* ansiStr)
|
||||
{
|
||||
lstrcpyA(ansiStr, getuservariable(varnum));
|
||||
}
|
||||
|
||||
static void __stdcall SetUserVariableW(const int varnum, const wchar_t* wideStr)
|
||||
{
|
||||
if (wideStr != NULL && varnum >= 0 && varnum < __INST_LAST)
|
||||
{
|
||||
char* ansiStr = g_variables + varnum * g_stringsize;
|
||||
WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static BOOL __stdcall IsUnicode(void)
|
||||
{
|
||||
#ifdef _UNICODE
|
||||
return TRUE;
|
||||
#else
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif//_EXDLL_H_
|
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
NSIS ExDLL2 example
|
||||
Original is ExDLL
|
||||
(C) 2001 - Peter Windridge
|
||||
|
||||
Changed with delphi unit nsis.pas
|
||||
by bernhard mayer
|
||||
|
||||
Tested in Delphi 7.0
|
||||
}
|
||||
|
||||
library exdll;
|
||||
|
||||
uses
|
||||
nsis, windows;
|
||||
|
||||
procedure ex_dll(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer); cdecl;
|
||||
begin
|
||||
// set up global variables
|
||||
Init(hwndParent, string_size, variables, stacktop);
|
||||
|
||||
NSISDialog(GetUserVariable(INST_0), 'The value of $0', MB_OK);
|
||||
NSISDialog(PopString, 'pop', MB_OK);
|
||||
PushString('Hello, this is a push');
|
||||
SetUserVariable(INST_0, 'This is user var $0');
|
||||
end;
|
||||
|
||||
exports ex_dll;
|
||||
|
||||
begin
|
||||
end.
|
|
@ -0,0 +1,131 @@
|
|||
// Unicode support by Jim Park -- 08/23/2007
|
||||
|
||||
#include <windows.h>
|
||||
#include "exdllutil.h"
|
||||
|
||||
// utility functions (not required but often useful)
|
||||
static int __stdcall popstring(TCHAR *str)
|
||||
{
|
||||
stack_t *th;
|
||||
if (!g_stacktop || !*g_stacktop) return 1;
|
||||
th=(*g_stacktop);
|
||||
lstrcpy(str,th->text);
|
||||
*g_stacktop = th->next;
|
||||
GlobalFree((HGLOBAL)th);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __stdcall pushstring(const TCHAR *str)
|
||||
{
|
||||
stack_t *th;
|
||||
if (!g_stacktop) return;
|
||||
th=(stack_t*)GlobalAlloc(GPTR,(sizeof(stack_t)+(g_stringsize)*sizeof(TCHAR)));
|
||||
lstrcpyn(th->text,str,g_stringsize);
|
||||
th->next=*g_stacktop;
|
||||
*g_stacktop=th;
|
||||
}
|
||||
|
||||
static TCHAR * __stdcall getuservariable(const int varnum)
|
||||
{
|
||||
if (varnum < 0 || varnum >= __INST_LAST) return NULL;
|
||||
return g_variables+varnum*g_stringsize;
|
||||
}
|
||||
|
||||
static void __stdcall setuservariable(const int varnum, const TCHAR *var)
|
||||
{
|
||||
if (var != NULL && varnum >= 0 && varnum < __INST_LAST)
|
||||
lstrcpy(g_variables + varnum*g_stringsize, var);
|
||||
}
|
||||
|
||||
#ifdef _UNICODE
|
||||
static int __stdcall PopStringA(char* ansiStr)
|
||||
{
|
||||
wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t));
|
||||
int rval = popstring(wideStr);
|
||||
WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
|
||||
GlobalFree((HGLOBAL)wideStr);
|
||||
return rval;
|
||||
}
|
||||
|
||||
static void __stdcall PushStringA(const char* ansiStr)
|
||||
{
|
||||
wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t));
|
||||
MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
|
||||
pushtring(wideStr);
|
||||
GlobalFree((HGLOBAL)wideStr);
|
||||
return;
|
||||
}
|
||||
|
||||
static void __stdcall GetUserVariableW(const int varnum, wchar_t* wideStr)
|
||||
{
|
||||
lstrcpyW(wideStr, getuservariable(varnum));
|
||||
}
|
||||
|
||||
static void __stdcall GetUserVariableA(const int varnum, char* ansiStr)
|
||||
{
|
||||
wchar_t* wideStr = getuservariable(varnum);
|
||||
WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
|
||||
}
|
||||
|
||||
static void __stdcall SetUserVariableA(const int varnum, const char* ansiStr)
|
||||
{
|
||||
if (ansiStr != NULL && varnum >= 0 && varnum < __INST_LAST)
|
||||
{
|
||||
wchar_t* wideStr = g_variables + varnum * g_stringsize;
|
||||
MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
// ANSI defs
|
||||
static int __stdcall PopStringW(wchar_t* wideStr)
|
||||
{
|
||||
char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize);
|
||||
int rval = popstring(ansiStr);
|
||||
MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
|
||||
GlobalFree((HGLOBAL)ansiStr);
|
||||
return rval;
|
||||
}
|
||||
|
||||
static void __stdcall PushStringW(wchar_t* wideStr)
|
||||
{
|
||||
char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize);
|
||||
WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
|
||||
pushstring(ansiStr);
|
||||
GlobalFree((HGLOBAL)ansiStr);
|
||||
}
|
||||
|
||||
static void __stdcall GetUserVariableW(const int varnum, wchar_t* wideStr)
|
||||
{
|
||||
char* ansiStr = getuservariable(varnum);
|
||||
MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize);
|
||||
}
|
||||
|
||||
static void __stdcall GetUserVariableA(const int varnum, char* ansiStr)
|
||||
{
|
||||
lstrcpyA(ansiStr, getuservariable(varnum));
|
||||
}
|
||||
|
||||
static void __stdcall SetUserVariableW(const int varnum, const wchar_t* wideStr)
|
||||
{
|
||||
if (wideStr != NULL && varnum >= 0 && varnum < __INST_LAST)
|
||||
{
|
||||
char* ansiStr = g_variables + varnum * g_stringsize;
|
||||
WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static BOOL __stdcall IsUnicode(void)
|
||||
{
|
||||
#ifdef _UNICODE
|
||||
return TRUE;
|
||||
#else
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
static TCHAR* __stdcall AllocString()
|
||||
{
|
||||
return (TCHAR*) GlobalAlloc(GPTR, g_stringsize*sizeof(TCHAR));
|
||||
}
|
|
@ -0,0 +1,119 @@
|
|||
// Unicode support by Jim Park -- 08/23/2007
|
||||
// Jim Park: Should probably turn this into a nice class for C++ programs.
|
||||
|
||||
#pragma once
|
||||
#include <windows.h>
|
||||
#include <tchar.h>
|
||||
// only include this file from one place in your DLL.
|
||||
// (it is all static, if you use it in two places it will fail)
|
||||
|
||||
#define EXDLL_INIT() { \
|
||||
g_stringsize=string_size; \
|
||||
g_stacktop=stacktop; \
|
||||
g_variables=variables; }
|
||||
|
||||
// For page showing plug-ins
|
||||
#define WM_NOTIFY_OUTER_NEXT (WM_USER+0x8)
|
||||
#define WM_NOTIFY_CUSTOM_READY (WM_USER+0xd)
|
||||
|
||||
/* Jim Park: This char is compared as an int value and therefore
|
||||
it's fine as an ASCII. Do not need to change to wchar_t since
|
||||
it will get the same integer value. */
|
||||
#define NOTIFY_BYE_BYE _T('x')
|
||||
|
||||
typedef struct _stack_t {
|
||||
struct _stack_t *next;
|
||||
TCHAR text[1]; // this should be the length of string_size
|
||||
} stack_t;
|
||||
|
||||
static unsigned int g_stringsize;
|
||||
static stack_t **g_stacktop;
|
||||
static TCHAR *g_variables;
|
||||
|
||||
|
||||
enum
|
||||
{
|
||||
INST_0, // $0
|
||||
INST_1, // $1
|
||||
INST_2, // $2
|
||||
INST_3, // $3
|
||||
INST_4, // $4
|
||||
INST_5, // $5
|
||||
INST_6, // $6
|
||||
INST_7, // $7
|
||||
INST_8, // $8
|
||||
INST_9, // $9
|
||||
INST_R0, // $R0
|
||||
INST_R1, // $R1
|
||||
INST_R2, // $R2
|
||||
INST_R3, // $R3
|
||||
INST_R4, // $R4
|
||||
INST_R5, // $R5
|
||||
INST_R6, // $R6
|
||||
INST_R7, // $R7
|
||||
INST_R8, // $R8
|
||||
INST_R9, // $R9
|
||||
INST_CMDLINE, // $CMDLINE
|
||||
INST_INSTDIR, // $INSTDIR
|
||||
INST_OUTDIR, // $OUTDIR
|
||||
INST_EXEDIR, // $EXEDIR
|
||||
INST_LANG, // $LANGUAGE
|
||||
__INST_LAST
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
int autoclose;
|
||||
int all_user_var;
|
||||
int exec_error;
|
||||
int abort;
|
||||
int exec_reboot;
|
||||
int reboot_called;
|
||||
int XXX_cur_insttype; // deprecated
|
||||
int XXX_insttype_changed; // deprecated
|
||||
int silent;
|
||||
int instdir_error;
|
||||
int rtl;
|
||||
int errlvl;
|
||||
int alter_reg_view;
|
||||
} exec_flags_type;
|
||||
|
||||
typedef struct {
|
||||
exec_flags_type *exec_flags;
|
||||
int (__stdcall *ExecuteCodeSegment)(int, HWND);
|
||||
void (__stdcall *validate_filename)(TCHAR *);
|
||||
} extra_parameters;
|
||||
|
||||
static int __stdcall popstring(TCHAR *str); // 0 on success, 1 on empty stack
|
||||
static void __stdcall pushstring(const TCHAR *str);
|
||||
static char * __stdcall getuservariable(const int varnum);
|
||||
static void __stdcall setuservariable(const int varnum, const TCHAR *var);
|
||||
|
||||
#ifdef _UNICODE
|
||||
#define PopStringW(x) popstring(x)
|
||||
#define PushStringW(x) pushstring(x)
|
||||
#define SetUserVariableW(x,y) setuservariable(x,y)
|
||||
|
||||
static int __stdcall PopStringA(char* ansiStr);
|
||||
static void __stdcall PushStringA(const char* ansiStr);
|
||||
static void __stdcall GetUserVariableW(const int varnum, wchar_t* wideStr);
|
||||
static void __stdcall GetUserVariableA(const int varnum, char* ansiStr);
|
||||
static void __stdcall SetUserVariableA(const int varnum, const char* ansiStr);
|
||||
|
||||
#else
|
||||
// ANSI defs
|
||||
|
||||
#define PopStringA(x) popstring(x)
|
||||
#define PushStringA(x) pushstring(x)
|
||||
#define SetUserVariableA(x,y) setuservariable(x,y)
|
||||
|
||||
static int __stdcall PopStringW(wchar_t* wideStr);
|
||||
static void __stdcall PushStringW(wchar_t* wideStr);
|
||||
static void __stdcall GetUserVariableW(const int varnum, wchar_t* wideStr);
|
||||
static void __stdcall GetUserVariableA(const int varnum, char* ansiStr);
|
||||
static void __stdcall SetUserVariableW(const int varnum, const wchar_t* wideStr);
|
||||
|
||||
#endif
|
||||
|
||||
static BOOL __stdcall IsUnicode(void)
|
||||
static TCHAR* __stdcall AllocString();
|
||||
|
|
@ -0,0 +1,145 @@
|
|||
;################################################################
|
||||
; ExtDLL header for MASM32
|
||||
;
|
||||
; Author: Ramon
|
||||
;
|
||||
; Obs: This header must be included after windows.inc and kernel32.inc
|
||||
; because it need the prototypes for lstrcpy, lstrcpyn,
|
||||
; GlobalAlloc and GlobalFree
|
||||
;
|
||||
;################################################################
|
||||
stack_t struct
|
||||
next dd ?
|
||||
text dd ? ; 1 DUP(?) ; this should be the length of string_size
|
||||
stack_t ends
|
||||
|
||||
.const
|
||||
; For page showing plug-ins
|
||||
WM_NOTIFY_OUTER_NEXT equ (WM_USER+0x8)
|
||||
WM_NOTIFY_CUSTOM_READY equ (WM_USER+0xd)
|
||||
NOTIFY_BYE_BYE equ 'x'
|
||||
|
||||
INST_0 EQU 0 ; $0
|
||||
INST_1 EQU 1 ; $1
|
||||
INST_2 EQU 2 ; $2
|
||||
INST_3 EQU 3 ; $3
|
||||
INST_4 EQU 4 ; $4
|
||||
INST_5 EQU 5 ; $5
|
||||
INST_6 EQU 6 ; $6
|
||||
INST_7 EQU 7 ; $7
|
||||
INST_8 EQU 8 ; $8
|
||||
INST_9 EQU 9 ; $9
|
||||
INST_R0 EQU 10 ; $R0
|
||||
INST_R1 EQU 11 ; $R1
|
||||
INST_R2 EQU 12 ; $R2
|
||||
INST_R3 EQU 13 ; $R3
|
||||
INST_R4 EQU 14 ; $R4
|
||||
INST_R5 EQU 15 ; $R5
|
||||
INST_R6 EQU 16 ; $R6
|
||||
INST_R7 EQU 17 ; $R7
|
||||
INST_R8 EQU 18 ; $R8
|
||||
INST_R9 EQU 19 ; $R9
|
||||
INST_CMDLINE EQU 20 ; $CMDLINE
|
||||
INST_INSTDIR EQU 21 ; $INSTDIR
|
||||
INST_OUTDIR EQU 22 ; $OUTDIR
|
||||
INST_EXEDIR EQU 23 ; $EXEDIR
|
||||
INST_LANG EQU 24 ; $LANGUAGE
|
||||
__INST_LAST EQU 25
|
||||
|
||||
.data?
|
||||
g_stringsize dd ?
|
||||
g_stacktop dd ?
|
||||
g_variables dd ?
|
||||
|
||||
m2m MACRO M1, M2
|
||||
push M2
|
||||
pop M1
|
||||
ENDM
|
||||
|
||||
EXDLL_INIT MACRO
|
||||
m2m g_stringsize, string_size
|
||||
m2m g_stacktop, stacktop
|
||||
m2m g_variables, variables
|
||||
ENDM
|
||||
|
||||
.code
|
||||
|
||||
; utility functions (not required but often useful)
|
||||
popstring proc uses edi pStr:DWORD
|
||||
|
||||
LOCAL th:DWORD
|
||||
|
||||
mov edi, g_stacktop
|
||||
cmp edi, 0
|
||||
jz STACK_ERR
|
||||
mov edi, [edi]
|
||||
cmp edi, 0
|
||||
jz STACK_ERR
|
||||
|
||||
ASSUME edi:PTR stack_t
|
||||
invoke lstrcpy, pStr, ADDR [edi].text
|
||||
mov th , edi
|
||||
mov edi, [edi].next
|
||||
mov eax, g_stacktop
|
||||
mov [eax], edi
|
||||
invoke GlobalFree, th
|
||||
ASSUME edi:PTR NOTHING
|
||||
mov eax, 0
|
||||
ret
|
||||
|
||||
STACK_ERR:
|
||||
mov eax, 1
|
||||
ret
|
||||
|
||||
popstring endp
|
||||
|
||||
pushstring proc uses edi pStr:DWORD
|
||||
|
||||
cmp g_stacktop, 0
|
||||
jz STACK_ERR
|
||||
|
||||
mov eax, sizeof stack_t
|
||||
add eax, g_stringsize
|
||||
invoke GlobalAlloc, GPTR, eax
|
||||
|
||||
mov edi, eax
|
||||
assume edi:PTR stack_t
|
||||
|
||||
invoke lstrcpyn, ADDR [edi].text, pStr, g_stringsize
|
||||
mov eax, g_stacktop
|
||||
push DWORD PTR[eax]
|
||||
mov [eax], edi
|
||||
pop eax
|
||||
;lea edi, [edi].next ; Not needed [edi].next == edi
|
||||
mov DWORD PTR[edi], eax
|
||||
ASSUME edi:PTR NOTHING
|
||||
|
||||
STACK_ERR:
|
||||
ret
|
||||
|
||||
pushstring endp
|
||||
|
||||
getuservariable proc varnum:DWORD
|
||||
|
||||
.if varnum < 0 || varnum >= __INST_LAST
|
||||
xor eax, eax
|
||||
.else
|
||||
mov eax, varnum
|
||||
imul eax, g_stringsize
|
||||
add eax, g_variables
|
||||
.endif
|
||||
ret
|
||||
|
||||
getuservariable endp
|
||||
|
||||
setuservariable proc varnum:DWORD, var:DWORD
|
||||
|
||||
.if (var != NULL && varnum >= 0 && varnum < __INST_LAST)
|
||||
mov eax, varnum
|
||||
imul eax, g_stringsize
|
||||
add eax, g_variables
|
||||
invoke lstrcpy, eax, var
|
||||
.endif
|
||||
ret
|
||||
|
||||
setuservariable endp
|
|
@ -0,0 +1,126 @@
|
|||
{
|
||||
Original Code from
|
||||
(C) 2001 - Peter Windridge
|
||||
|
||||
Code in seperate unit and some changes
|
||||
2003 by Bernhard Mayer
|
||||
|
||||
Fixed and formatted by Brett Dever
|
||||
http://editor.nfscheats.com/
|
||||
|
||||
simply include this unit in your plugin project and export
|
||||
functions as needed
|
||||
}
|
||||
|
||||
|
||||
unit nsis;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
windows;
|
||||
|
||||
type
|
||||
VarConstants = (
|
||||
INST_0, // $0
|
||||
INST_1, // $1
|
||||
INST_2, // $2
|
||||
INST_3, // $3
|
||||
INST_4, // $4
|
||||
INST_5, // $5
|
||||
INST_6, // $6
|
||||
INST_7, // $7
|
||||
INST_8, // $8
|
||||
INST_9, // $9
|
||||
INST_R0, // $R0
|
||||
INST_R1, // $R1
|
||||
INST_R2, // $R2
|
||||
INST_R3, // $R3
|
||||
INST_R4, // $R4
|
||||
INST_R5, // $R5
|
||||
INST_R6, // $R6
|
||||
INST_R7, // $R7
|
||||
INST_R8, // $R8
|
||||
INST_R9, // $R9
|
||||
INST_CMDLINE, // $CMDLINE
|
||||
INST_INSTDIR, // $INSTDIR
|
||||
INST_OUTDIR, // $OUTDIR
|
||||
INST_EXEDIR, // $EXEDIR
|
||||
INST_LANG, // $LANGUAGE
|
||||
__INST_LAST
|
||||
);
|
||||
TVariableList = INST_0..__INST_LAST;
|
||||
pstack_t = ^stack_t;
|
||||
stack_t = record
|
||||
next: pstack_t;
|
||||
text: PChar;
|
||||
end;
|
||||
|
||||
var
|
||||
g_stringsize: integer;
|
||||
g_stacktop: ^pstack_t;
|
||||
g_variables: PChar;
|
||||
g_hwndParent: HWND;
|
||||
|
||||
procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer);
|
||||
function PopString(): string;
|
||||
procedure PushString(const str: string='');
|
||||
function GetUserVariable(const varnum: TVariableList): string;
|
||||
procedure SetUserVariable(const varnum: TVariableList; const value: string);
|
||||
procedure NSISDialog(const text, caption: string; const buttons: integer);
|
||||
|
||||
implementation
|
||||
|
||||
procedure Init(const hwndParent: HWND; const string_size: integer; const variables: PChar; const stacktop: pointer);
|
||||
begin
|
||||
g_stringsize := string_size;
|
||||
g_hwndParent := hwndParent;
|
||||
g_stacktop := stacktop;
|
||||
g_variables := variables;
|
||||
end;
|
||||
|
||||
function PopString(): string;
|
||||
var
|
||||
th: pstack_t;
|
||||
begin
|
||||
if integer(g_stacktop^) <> 0 then begin
|
||||
th := g_stacktop^;
|
||||
Result := PChar(@th.text);
|
||||
g_stacktop^ := th.next;
|
||||
GlobalFree(HGLOBAL(th));
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure PushString(const str: string='');
|
||||
var
|
||||
th: pstack_t;
|
||||
begin
|
||||
if integer(g_stacktop) <> 0 then begin
|
||||
th := pstack_t(GlobalAlloc(GPTR, SizeOf(stack_t) + g_stringsize));
|
||||
lstrcpyn(@th.text, PChar(str), g_stringsize);
|
||||
th.next := g_stacktop^;
|
||||
g_stacktop^ := th;
|
||||
end;
|
||||
end;
|
||||
|
||||
function GetUserVariable(const varnum: TVariableList): string;
|
||||
begin
|
||||
if (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
|
||||
Result := g_variables + integer(varnum) * g_stringsize
|
||||
else
|
||||
Result := '';
|
||||
end;
|
||||
|
||||
procedure SetUserVariable(const varnum: TVariableList; const value: string);
|
||||
begin
|
||||
if (value <> '') and (integer(varnum) >= 0) and (integer(varnum) < integer(__INST_LAST)) then
|
||||
lstrcpy(g_variables + integer(varnum) * g_stringsize, PChar(value))
|
||||
end;
|
||||
|
||||
procedure NSISDialog(const text, caption: string; const buttons: integer);
|
||||
begin
|
||||
MessageBox(g_hwndParent, PChar(text), PChar(caption), buttons);
|
||||
end;
|
||||
|
||||
begin
|
||||
end.
|
|
@ -0,0 +1,210 @@
|
|||
/*
|
||||
* tchar.h
|
||||
*
|
||||
* This file is a part of NSIS.
|
||||
*
|
||||
* Copyright (C) 1999-2007 Nullsoft and Contributors
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty.
|
||||
*
|
||||
* For Unicode support by Jim Park -- 08/30/2007
|
||||
*/
|
||||
|
||||
// Jim Park: Only those we use are listed here.
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef _UNICODE
|
||||
|
||||
#ifndef _T
|
||||
#define __T(x) L ## x
|
||||
#define _T(x) __T(x)
|
||||
#define _TEXT(x) __T(x)
|
||||
#endif
|
||||
typedef wchar_t TCHAR;
|
||||
typedef wchar_t _TUCHAR;
|
||||
|
||||
// program
|
||||
#define _tmain wmain
|
||||
#define _tWinMain wWinMain
|
||||
#define _tenviron _wenviron
|
||||
#define __targv __wargv
|
||||
|
||||
// printfs
|
||||
#define _ftprintf fwprintf
|
||||
#define _sntprintf _snwprintf
|
||||
#define _stprintf _swprintf
|
||||
#define _tprintf wprintf
|
||||
#define _vftprintf vfwprintf
|
||||
#define _vsntprintf _vsnwprintf
|
||||
#define _vstprintf _vswprintf
|
||||
|
||||
// scanfs
|
||||
#define _tscanf wscanf
|
||||
#define _stscanf swscanf
|
||||
|
||||
// string manipulations
|
||||
#define _tcscat wcscat
|
||||
#define _tcschr wcschr
|
||||
#define _tcsclen wcslen
|
||||
#define _tcscpy wcscpy
|
||||
#define _tcsdup _wcsdup
|
||||
#define _tcslen wcslen
|
||||
#define _tcsnccpy wcsncpy
|
||||
#define _tcsncpy wcsncpy
|
||||
#define _tcsrchr wcsrchr
|
||||
#define _tcsstr wcsstr
|
||||
#define _tcstok wcstok
|
||||
|
||||
// string comparisons
|
||||
#define _tcscmp wcscmp
|
||||
#define _tcsicmp _wcsicmp
|
||||
#define _tcsncicmp _wcsnicmp
|
||||
#define _tcsncmp wcsncmp
|
||||
#define _tcsnicmp _wcsnicmp
|
||||
|
||||
// upper / lower
|
||||
#define _tcslwr _wcslwr
|
||||
#define _tcsupr _wcsupr
|
||||
#define _totlower towlower
|
||||
#define _totupper towupper
|
||||
|
||||
// conversions to numbers
|
||||
#define _tcstoi64 _wcstoi64
|
||||
#define _tcstol wcstol
|
||||
#define _tcstoul wcstoul
|
||||
#define _tstof _wtof
|
||||
#define _tstoi _wtoi
|
||||
#define _tstoi64 _wtoi64
|
||||
#define _ttoi _wtoi
|
||||
#define _ttoi64 _wtoi64
|
||||
#define _ttol _wtol
|
||||
|
||||
// conversion from numbers to strings
|
||||
#define _itot _itow
|
||||
#define _ltot _ltow
|
||||
#define _i64tot _i64tow
|
||||
#define _ui64tot _ui64tow
|
||||
|
||||
// file manipulations
|
||||
#define _tfopen _wfopen
|
||||
#define _topen _wopen
|
||||
#define _tremove _wremove
|
||||
#define _tunlink _wunlink
|
||||
|
||||
// reading and writing to i/o
|
||||
#define _fgettc fgetwc
|
||||
#define _fgetts fgetws
|
||||
#define _fputts fputws
|
||||
#define _gettchar getwchar
|
||||
|
||||
// directory
|
||||
#define _tchdir _wchdir
|
||||
|
||||
// environment
|
||||
#define _tgetenv _wgetenv
|
||||
#define _tsystem _wsystem
|
||||
|
||||
// time
|
||||
#define _tcsftime wcsftime
|
||||
|
||||
#else // ANSI
|
||||
|
||||
#ifndef _T
|
||||
#define _T(x) x
|
||||
#define _TEXT(x) x
|
||||
#endif
|
||||
typedef char TCHAR;
|
||||
typedef unsigned char _TUCHAR;
|
||||
|
||||
// program
|
||||
#define _tmain main
|
||||
#define _tWinMain WinMain
|
||||
#define _tenviron environ
|
||||
#define __targv __argv
|
||||
|
||||
// printfs
|
||||
#define _ftprintf fprintf
|
||||
#define _sntprintf _snprintf
|
||||
#define _stprintf sprintf
|
||||
#define _tprintf printf
|
||||
#define _vftprintf vfprintf
|
||||
#define _vsntprintf _vsnprintf
|
||||
#define _vstprintf vsprintf
|
||||
|
||||
// scanfs
|
||||
#define _tscanf scanf
|
||||
#define _stscanf sscanf
|
||||
|
||||
// string manipulations
|
||||
#define _tcscat strcat
|
||||
#define _tcschr strchr
|
||||
#define _tcsclen strlen
|
||||
#define _tcscnlen strnlen
|
||||
#define _tcscpy strcpy
|
||||
#define _tcsdup _strdup
|
||||
#define _tcslen strlen
|
||||
#define _tcsnccpy strncpy
|
||||
#define _tcsrchr strrchr
|
||||
#define _tcsstr strstr
|
||||
#define _tcstok strtok
|
||||
|
||||
// string comparisons
|
||||
#define _tcscmp strcmp
|
||||
#define _tcsicmp _stricmp
|
||||
#define _tcsncmp strncmp
|
||||
#define _tcsncicmp _strnicmp
|
||||
#define _tcsnicmp _strnicmp
|
||||
|
||||
// upper / lower
|
||||
#define _tcslwr _strlwr
|
||||
#define _tcsupr _strupr
|
||||
|
||||
#define _totupper toupper
|
||||
#define _totlower tolower
|
||||
|
||||
// conversions to numbers
|
||||
#define _tcstol strtol
|
||||
#define _tcstoul strtoul
|
||||
#define _tstof atof
|
||||
#define _tstoi atoi
|
||||
#define _tstoi64 _atoi64
|
||||
#define _tstoi64 _atoi64
|
||||
#define _ttoi atoi
|
||||
#define _ttoi64 _atoi64
|
||||
#define _ttol atol
|
||||
|
||||
// conversion from numbers to strings
|
||||
#define _i64tot _i64toa
|
||||
#define _itot _itoa
|
||||
#define _ltot _ltoa
|
||||
#define _ui64tot _ui64toa
|
||||
|
||||
// file manipulations
|
||||
#define _tfopen fopen
|
||||
#define _topen _open
|
||||
#define _tremove remove
|
||||
#define _tunlink _unlink
|
||||
|
||||
// reading and writing to i/o
|
||||
#define _fgettc fgetc
|
||||
#define _fgetts fgets
|
||||
#define _fputts fputs
|
||||
#define _gettchar getchar
|
||||
|
||||
// directory
|
||||
#define _tchdir _chdir
|
||||
|
||||
// environment
|
||||
#define _tgetenv getenv
|
||||
#define _tsystem system
|
||||
|
||||
// time
|
||||
#define _tcsftime strftime
|
||||
|
||||
#endif
|
||||
|
||||
// is functions (the same in Unicode / ANSI)
|
||||
#define _istgraph isgraph
|
||||
#define _istascii __isascii
|
|
@ -0,0 +1,56 @@
|
|||
These directories contain modified source code to the NSIS Plugins used by the
|
||||
Windows installers. All of these plugin dll's have been compiled with VC6.
|
||||
|
||||
NSIS project page: http://nsis.sourceforge.net/
|
||||
NSIS Unicode port project page: http://www.scratchpaper.com/
|
||||
|
||||
APPLICABLE LICENSES
|
||||
-------------------
|
||||
* All NSIS source code, plug-ins, documentation, examples, header files and
|
||||
graphics, with the exception of the compression modules and where otherwise
|
||||
noted, are licensed under the zlib/libpng license.
|
||||
|
||||
* The zlib compression module for NSIS is licensed under the zlib/libpng
|
||||
license.
|
||||
|
||||
* The bzip2 compression module for NSIS is licensed under the bzip2 license.
|
||||
|
||||
* The LZMA compression module for NSIS is licensed under the Common Public
|
||||
License version 1.0.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
ExDLL NSIS Unicode source 2.38.1 for plugin projects
|
||||
http://www.scratchpaper.com/
|
||||
These files are required to compile the nsProcess and ShellLink plugins. No
|
||||
changes were made to these files.
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
nsProcess NSIS plugin v1.5
|
||||
http://nsis.sourceforge.net/NsProcess_plugin
|
||||
Unicode support was added for this plugin. A diff of the changes to the source
|
||||
are available at:
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=473348
|
||||
https://bugzilla.mozilla.org/attachment.cgi?id=357012
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
ShellLink NSIS plugin v1.1
|
||||
http://nsis.sourceforge.net/ShellLink_plug-in
|
||||
Unicode support was added for this plugin. A diff of the changes to the source
|
||||
are available at:
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=473348
|
||||
https://bugzilla.mozilla.org/attachment.cgi?id=357058
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
UAC NSIS plugin v0.0.10a
|
||||
http://nsis.sourceforge.net/UAC_plug-in
|
||||
The source files already support Unicode but there is no Unicode distribution
|
||||
so the plugin had to be compiled with Unicode support. A diff of the changes to
|
||||
the source are available at:
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=473348
|
||||
https://bugzilla.mozilla.org/attachment.cgi?id=357014
|
||||
|
||||
-------------------------------------------------------------------------------
|
|
@ -0,0 +1,242 @@
|
|||
/*****************************************************************
|
||||
* Conversion functions header v1.2 *
|
||||
* *
|
||||
* 2005 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) *
|
||||
* *
|
||||
* *
|
||||
*Functions: *
|
||||
* xatoi, xitoa, hex2dec, dec2hex, str2hex, hex2str *
|
||||
* *
|
||||
*Usage: *
|
||||
*#define xatoi //insert xatoi function *
|
||||
*#define xitoa //insert xitoa function *
|
||||
*#include "ConvFunc.h" *
|
||||
*****************************************************************/
|
||||
|
||||
#ifndef _CONVFUNC_
|
||||
#define _CONVFUNC_
|
||||
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xatoi
|
||||
*
|
||||
*Converts char to int.
|
||||
*
|
||||
*[in] char *str -string number
|
||||
*
|
||||
*Returns: integer
|
||||
*
|
||||
*Examples:
|
||||
* xatoi("45") == 45;
|
||||
* xatoi(" -0045:value") == -45;
|
||||
********************************************************************/
|
||||
#ifdef xatoi
|
||||
#define xatoi_INCLUDED
|
||||
#undef xatoi
|
||||
int xatoi(TCHAR *str)
|
||||
{
|
||||
BOOL bMinus=FALSE;
|
||||
int nNumber=0;
|
||||
|
||||
while (*str == TEXT(' '))
|
||||
++str;
|
||||
if (*str == TEXT('-'))
|
||||
{
|
||||
bMinus=TRUE;
|
||||
++str;
|
||||
}
|
||||
for (; (*str != TEXT('\0')) && (*str >= TEXT('0')) && (*str <= TEXT('9')); ++str)
|
||||
nNumber=(nNumber * 10) + (*str - 48);
|
||||
if (bMinus == TRUE)
|
||||
nNumber=0 - nNumber;
|
||||
return nNumber;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xitoa [API: wsprintf(szResult, "%d", 45)]
|
||||
*
|
||||
*Converts int to char.
|
||||
*
|
||||
*[out] char *str -string number
|
||||
*[in] int number -integer
|
||||
*
|
||||
*Examples:
|
||||
* xitoa(szResult, 45); //szResult == "45"
|
||||
* xitoa(szResult, -45); //szResult == "-45"
|
||||
********************************************************************/
|
||||
#ifdef xitoa
|
||||
#define xitoa_INCLUDED
|
||||
#undef xitoa
|
||||
void xitoa(char *str, int number)
|
||||
{
|
||||
int nCapacity=0;
|
||||
int nTmp=number;
|
||||
|
||||
if (number == 0)
|
||||
{
|
||||
str[0]='0';
|
||||
str[1]='\0';
|
||||
return;
|
||||
}
|
||||
if (number < 0)
|
||||
{
|
||||
str[0]='-';
|
||||
number=0 - number;
|
||||
++nCapacity;
|
||||
}
|
||||
for (; (nTmp != 0); ++nCapacity)
|
||||
nTmp=nTmp/10;
|
||||
for (str[nCapacity--]='\0'; (number != 0); --nCapacity)
|
||||
{
|
||||
str[nCapacity]=(number % 10) + 48;
|
||||
number=number/10;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* hex2dec
|
||||
*
|
||||
*Converts hex value to decimal.
|
||||
*
|
||||
*[in] char *hex -hex value
|
||||
*
|
||||
*Returns: integer
|
||||
*
|
||||
*Examples:
|
||||
* hex2dec("A1F") == 2591;
|
||||
********************************************************************/
|
||||
#if defined hex2dec || defined hex2str
|
||||
#define hex2dec_INCLUDED
|
||||
#undef hex2dec
|
||||
unsigned hex2dec(char *hex)
|
||||
{
|
||||
int a;
|
||||
int b=0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
a=*hex++;
|
||||
if (a >= '0' && a <= '9') a-='0';
|
||||
else if (a >= 'a' && a <= 'f') a-='a'-10;
|
||||
else if (a >= 'A' && a <= 'F') a-='A'-10;
|
||||
else return b;
|
||||
|
||||
if (*hex) b=(b + a) * 16;
|
||||
else return (b + a);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* dec2hex [API: wsprintf(szResult, "%02x", 2591)]
|
||||
*
|
||||
*Converts decimal to hex value.
|
||||
*
|
||||
*[in] DWORD dec -positive integer
|
||||
*[out] char *hex -hex value (output)
|
||||
*[in] BOOL lowercase -if TRUE hexadecimal value in lowercase
|
||||
* if FALSE in uppercase.
|
||||
*[in] DWORD width -minimum number of characters to the output
|
||||
*
|
||||
*Examples:
|
||||
* dec2hex(2591, szResult, FALSE, 2); //szResult == "A1F"
|
||||
* dec2hex(10, szResult, TRUE, 2); //szResult == "0a"
|
||||
********************************************************************/
|
||||
#if defined dec2hex || defined str2hex
|
||||
#define dec2hex_INCLUDED
|
||||
#undef dec2hex
|
||||
void dec2hex(unsigned int dec, char *hex, BOOL lowercase, unsigned int width)
|
||||
{
|
||||
unsigned int a=dec;
|
||||
unsigned int b=0;
|
||||
unsigned int c=0;
|
||||
char d='1';
|
||||
if (a == 0) d='0';
|
||||
|
||||
while (a)
|
||||
{
|
||||
b=a % 16;
|
||||
a=a / 16;
|
||||
if (b < 10) hex[c++]=b + '0';
|
||||
else if (lowercase == TRUE) hex[c++]=b + 'a' - 10;
|
||||
else hex[c++]=b + 'A' - 10;
|
||||
}
|
||||
while (width > c) hex[c++]='0';
|
||||
hex[c]='\0';
|
||||
|
||||
if (d == '1')
|
||||
for (b=0, --c; b < c; d=hex[b], hex[b++]=hex[c], hex[c--]=d);
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* str2hex
|
||||
*
|
||||
*Converts string to hex values.
|
||||
*
|
||||
*[in] unsigned char *str -string
|
||||
*[out] char *hex -hex string
|
||||
*[in] BOOL lowercase -if TRUE hexadecimal value in lowercase
|
||||
* if FALSE in uppercase.
|
||||
*[in] unsigned int bytes -number of characters in string
|
||||
*
|
||||
*Examples:
|
||||
* str2hex((unsigned char *)"Some Text", szResult, TRUE, lstrlen("Some Text")); //szResult == "536f6d652054657874"
|
||||
********************************************************************/
|
||||
#if defined str2hex && defined dec2hex_INCLUDED
|
||||
#define str2hex_INCLUDED
|
||||
#undef str2hex
|
||||
void str2hex(unsigned char *str, char *hex, BOOL lowercase, unsigned int bytes)
|
||||
{
|
||||
char a[16];
|
||||
unsigned int b=0;
|
||||
|
||||
for (hex[0]='\0'; b < bytes; ++b)
|
||||
{
|
||||
//wsprintf(a, "%02x", (unsigned int)str[b]);
|
||||
dec2hex((unsigned int)str[b], a, lowercase, 2);
|
||||
lstrcat(hex, a);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* hex2str
|
||||
*
|
||||
*Converts hex values to string.
|
||||
*
|
||||
*[in] char *hex -hex string
|
||||
*[out] char *str -string
|
||||
*
|
||||
*Examples:
|
||||
* hex2str("536f6d652054657874", szResult); //szResult == "Some Text"
|
||||
********************************************************************/
|
||||
#if defined hex2str && defined hex2dec_INCLUDED
|
||||
#define hex2str_INCLUDED
|
||||
#undef hex2str
|
||||
void hex2str(char *hex, char *str)
|
||||
{
|
||||
char a[4];
|
||||
|
||||
while (*hex)
|
||||
{
|
||||
a[0]=*hex;
|
||||
a[1]=*++hex;
|
||||
a[2]='\0';
|
||||
|
||||
if (*hex++) *str++=hex2dec(a);
|
||||
else break;
|
||||
}
|
||||
*str='\0';
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //_CONVFUNC_
|
|
@ -0,0 +1,229 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
|
||||
<HTML><HEAD><TITLE>ShellLink</TITLE>
|
||||
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
|
||||
<STYLE type=text/css>
|
||||
BODY {
|
||||
PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-WEIGHT: normal; FONT-SIZE: 10pt; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #f0f0f0
|
||||
}
|
||||
CENTER {
|
||||
TEXT-ALIGN: center
|
||||
}
|
||||
TABLE {
|
||||
MARGIN: auto; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left
|
||||
}
|
||||
.maintable {
|
||||
BORDER-RIGHT: #376eab 2px solid; BORDER-TOP: #376eab 2px solid; BORDER-LEFT: #376eab 2px solid; BORDER-BOTTOM: #376eab 2px solid
|
||||
}
|
||||
.margin {
|
||||
MARGIN: 20px
|
||||
}
|
||||
.text {
|
||||
MARGIN: 20px
|
||||
}
|
||||
.bold {
|
||||
FONT-WEIGHT: bold
|
||||
}
|
||||
.italic {
|
||||
FONT-STYLE: italic
|
||||
}
|
||||
.bigheader {
|
||||
FONT-SIZE: 24pt; MARGIN: 10px; COLOR: #333333; TEXT-ALIGN: center
|
||||
}
|
||||
.header {
|
||||
FONT-SIZE: 14pt; COLOR: #7a7272
|
||||
}
|
||||
.subheader {
|
||||
FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030
|
||||
}
|
||||
.footer {
|
||||
FONT-SIZE: 8pt; MARGIN: 5px; COLOR: #909090; TEXT-ALIGN: right
|
||||
}
|
||||
A:link {
|
||||
COLOR: #294f75; TEXT-DECORATION: none
|
||||
}
|
||||
A:visited {
|
||||
COLOR: #294f75; TEXT-DECORATION: none
|
||||
}
|
||||
A:active {
|
||||
COLOR: #294f75; TEXT-DECORATION: none
|
||||
}
|
||||
A:hover {
|
||||
COLOR: #182634; TEXT-DECORATION: none
|
||||
}
|
||||
</STYLE>
|
||||
|
||||
<META content="MSHTML 6.00.2800.1264" name=GENERATOR></HEAD>
|
||||
<BODY>
|
||||
<DIV class=center>
|
||||
<TABLE class=maintable cellSpacing=0 cellPadding=0 width=750>
|
||||
<TBODY>
|
||||
<TR>
|
||||
<TD>
|
||||
<TABLE cellSpacing=0 cellPadding=0>
|
||||
<TBODY>
|
||||
<TR>
|
||||
<TD>
|
||||
<P class=bigheader>ShellLink </P></TD></TR>
|
||||
<TR>
|
||||
<TD>
|
||||
<DIV style="MARGIN: 20px">
|
||||
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">Introduction</P>
|
||||
<P style="MARGIN: 20px">ShellLink is a NSIS plugin that allows you to read and write shell link (.lnk) files.</P>
|
||||
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">How to use</P>
|
||||
<P style="MARGIN: 20px">Make sure you have a valid path (link.lnk) to the shell link file.</P>
|
||||
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Working Directory</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::GetShortCutWorkingDirectory link.lnk
|
||||
Pop $0
|
||||
|
||||
$0=C:\Program Files\MyProgram
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Target</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::GetShortCutTarget link.lnk
|
||||
Pop $0
|
||||
|
||||
$0=C:\Program Files\MyProgram\run.exe
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Arguments </P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::GetShortCutArgs link.lnk
|
||||
Pop $0
|
||||
|
||||
$0=/s /d=1
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Icon Location </P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::GetShortCutIconLocation link.lnk
|
||||
Pop $0
|
||||
|
||||
$0=C:\Program Files\MyProgram\run.dll
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Icon Index </P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::GetShortCutIconIndex link.lnk
|
||||
Pop $0
|
||||
|
||||
$0=3
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Show Mode </P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::GetShortCutShowMode link.lnk
|
||||
Pop $0
|
||||
|
||||
$0=0 (SW_HIDE)
|
||||
$0=1 (SW_SHOWNORMAL or SW_NORMAL)
|
||||
$0=2 (SW_SHOWMINIMIZED)
|
||||
$0=3 (SW_SHOWMAXIMIZED or SW_MAXIMIZE)
|
||||
$0=4 (SW_SHOWNOACTIVATE)
|
||||
$0=5 (SW_SHOW)
|
||||
$0=6 (SW_MINIMIZE)
|
||||
$0=7 (SW_SHOWMINNOACTIVE)
|
||||
$0=8 (SW_SHOWNA)
|
||||
$0=9 (SW_RESTORE)
|
||||
$0=10 (SW_SHOWDEFAULT)
|
||||
$0=11 (SW_FORCEMINIMIZE or SW_MAX)
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Hot Keys</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::GetShortCutHotkey link.lnk
|
||||
Pop $0
|
||||
|
||||
$0=634
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Get Shortcut Description</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::GetShortCutDescription link.lnk
|
||||
Pop $0
|
||||
|
||||
$0=My Shortcut Description
|
||||
</PRE>
|
||||
|
||||
<BR>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Working Directory</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::SetShortCutWorkingDirectory link.lnk directory
|
||||
Pop $0
|
||||
|
||||
$0=0 -no errors
|
||||
$0=-1 -error
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Target</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::SetShortCutTarget link.lnk target.file
|
||||
Pop $0
|
||||
|
||||
$0=0 -no errors
|
||||
$0=-1 -error
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Arguments</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::SetShortCutArgs link.lnk parameters
|
||||
Pop $0
|
||||
|
||||
$0=0 -no errors
|
||||
$0=-1 -error
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Icon Location</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::SetShortCutIconLocation link.lnk icon.file
|
||||
Pop $0
|
||||
|
||||
$0=0 -no errors
|
||||
$0=-1 -error
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Icon Index</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::SetShortCutIconIndex link.lnk icon_index_number
|
||||
Pop $0
|
||||
|
||||
$0=0 -no errors
|
||||
$0=-1 -error
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Show Mode</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::SetShortCutShowMode link.lnk start_options
|
||||
Pop $0
|
||||
|
||||
$0=0 -no errors
|
||||
$0=-1 -error
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Hot Keys</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::SetShortCutHotkey link.lnk keyboard_shortcut
|
||||
Pop $0
|
||||
|
||||
$0=0 -no errors
|
||||
$0=-1 -error
|
||||
</PRE>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">Set Shortcut Description</P>
|
||||
<PRE style="MARGIN: 20px">ShellLink::SetShortCutDescription link.lnk description
|
||||
Pop $0
|
||||
|
||||
$0=0 -no errors
|
||||
$0=-1 -error
|
||||
</PRE>
|
||||
|
||||
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">Source code</P>
|
||||
<P style="FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN: 20px; COLOR: #303030">NSIS plug-in (C++)</P>
|
||||
<P style="MARGIN: 20px">A download link to the source and DLL of this NSIS plug-in
|
||||
can be found below.</P>
|
||||
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">Version history</P>
|
||||
<UL>
|
||||
<LI>1.1 by Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
|
||||
<BR> -code has been rewritten
|
||||
<BR> -added functions to change shell link information
|
||||
<BR> -reduced dll size 44Kb -> 4Kb
|
||||
<BR> -documentation updated
|
||||
<LI>1.0 first release of ShellLink.
|
||||
</UL>
|
||||
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">Credits</P>
|
||||
<P style="MARGIN: 20px">Written and documented by Angelo Mandato </P>
|
||||
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">License</P>
|
||||
<PRE style="MARGIN: 20px">© 2004 Angelo Mandato
|
||||
|
||||
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 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 distribution.
|
||||
</PRE>
|
||||
<P style="FONT-SIZE: 14pt; COLOR: #7a7272">Download</P>
|
||||
<P style="MARGIN: 20px"><a href="http://www.spaceblue.com/downloads/shelllink.zip">http://www.spaceblue.com/downloads/shelllink.zip</a></P>
|
||||
</DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></DIV></BODY></HTML>
|
|
@ -0,0 +1,350 @@
|
|||
/*
|
||||
Module : ShellLink.cpp
|
||||
Purpose: NSIS Plug-in for retriving shell link information
|
||||
Created: 12/16/2003
|
||||
Last Update: 01/14/2004
|
||||
|
||||
Copyright (c) 2004 Angelo Mandato.
|
||||
See ShellLink.html for more information
|
||||
|
||||
|
||||
Modified: 21/09/2005
|
||||
Author: Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
|
||||
Changes: -code has been rewritten
|
||||
-added functions to change shell link information
|
||||
-reduced dll size 44Kb -> 4Kb
|
||||
*/
|
||||
|
||||
#define UNICODE
|
||||
#define _UNICODE
|
||||
|
||||
// Uncomment for debugging message boxes
|
||||
//#define SHELLLINK_DEBUG
|
||||
|
||||
#include <windows.h>
|
||||
#include <shlobj.h>
|
||||
|
||||
#define xatoi
|
||||
#include "ConvFunc.h"
|
||||
|
||||
#define MAX_STRLEN 1024
|
||||
#define SHELLLINKTYPE_GETARGS 1
|
||||
#define SHELLLINKTYPE_GETDESC 2
|
||||
#define SHELLLINKTYPE_GETHOTKEY 3
|
||||
#define SHELLLINKTYPE_GETICONLOC 4
|
||||
#define SHELLLINKTYPE_GETICONINDEX 5
|
||||
#define SHELLLINKTYPE_GETPATH 6
|
||||
#define SHELLLINKTYPE_GETSHOWMODE 7
|
||||
#define SHELLLINKTYPE_GETWORKINGDIR 8
|
||||
#define SHELLLINKTYPE_SETARGS 9
|
||||
#define SHELLLINKTYPE_SETDESC 10
|
||||
#define SHELLLINKTYPE_SETHOTKEY 11
|
||||
#define SHELLLINKTYPE_SETICONLOC 12
|
||||
#define SHELLLINKTYPE_SETICONINDEX 13
|
||||
#define SHELLLINKTYPE_SETPATH 14
|
||||
#define SHELLLINKTYPE_SETSHOWMODE 15
|
||||
#define SHELLLINKTYPE_SETWORKINGDIR 16
|
||||
|
||||
typedef struct _stack_t {
|
||||
struct _stack_t *next;
|
||||
TCHAR text[MAX_STRLEN];
|
||||
} stack_t;
|
||||
|
||||
stack_t **g_stacktop;
|
||||
unsigned int g_stringsize;
|
||||
TCHAR *g_variables;
|
||||
TCHAR szBuf[MAX_STRLEN]=TEXT("");
|
||||
TCHAR szBuf2[MAX_STRLEN]=TEXT("");
|
||||
int nBuf;
|
||||
WORD wHotkey;
|
||||
|
||||
void ShortCutData(int nType, HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop);
|
||||
int popstring(TCHAR *str);
|
||||
void pushstring(TCHAR *str);
|
||||
|
||||
//Get
|
||||
extern "C" void __declspec(dllexport) GetShortCutArgs(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_GETARGS, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) GetShortCutDescription(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_GETDESC, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) GetShortCutHotkey(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_GETHOTKEY, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) GetShortCutIconLocation(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_GETICONLOC, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) GetShortCutIconIndex(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_GETICONINDEX, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) GetShortCutTarget(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_GETPATH, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) GetShortCutShowMode(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_GETSHOWMODE, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) GetShortCutWorkingDirectory(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_GETWORKINGDIR, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
//Set
|
||||
extern "C" void __declspec(dllexport) SetShortCutArgs(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_SETARGS, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) SetShortCutDescription(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_SETDESC, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) SetShortCutHotkey(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_SETHOTKEY, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) SetShortCutIconLocation(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_SETICONLOC, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) SetShortCutIconIndex(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_SETICONINDEX, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) SetShortCutTarget(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_SETPATH, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) SetShortCutShowMode(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
|
||||
ShortCutData(SHELLLINKTYPE_SETSHOWMODE, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
extern "C" void __declspec(dllexport) SetShortCutWorkingDirectory(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
ShortCutData(SHELLLINKTYPE_SETWORKINGDIR, hwndParent, string_size, variables, stacktop);
|
||||
}
|
||||
|
||||
void ShortCutData(int nType, HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
g_stringsize=string_size;
|
||||
g_stacktop=stacktop;
|
||||
g_variables=variables;
|
||||
{
|
||||
HRESULT hRes;
|
||||
IShellLink* m_psl;
|
||||
IPersistFile* m_ppf;
|
||||
|
||||
popstring(szBuf);
|
||||
if (nType > SHELLLINKTYPE_GETWORKINGDIR) popstring(szBuf2);
|
||||
|
||||
hRes=CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &m_psl);
|
||||
if (hRes == S_OK)
|
||||
{
|
||||
hRes=m_psl->QueryInterface(IID_IPersistFile, (LPVOID*) &m_ppf);
|
||||
if (hRes == S_OK)
|
||||
{
|
||||
#ifdef UNICODE
|
||||
hRes=m_ppf->Load(szBuf, STGM_READWRITE);
|
||||
#else
|
||||
WCHAR wszPath[MAX_PATH];
|
||||
MultiByteToWideChar(CP_ACP, 0, szBuf, -1, wszPath, MAX_PATH);
|
||||
|
||||
hRes=m_ppf->Load(wszPath, STGM_READWRITE);
|
||||
#endif
|
||||
if (hRes == S_OK)
|
||||
{
|
||||
if (nType <= SHELLLINKTYPE_GETWORKINGDIR)
|
||||
{
|
||||
//Get
|
||||
switch(nType)
|
||||
{
|
||||
case SHELLLINKTYPE_GETARGS:
|
||||
{
|
||||
hRes=m_psl->GetArguments(szBuf, MAX_PATH);
|
||||
if (hRes != S_OK) szBuf[0]=TEXT('\0');
|
||||
}; break;
|
||||
case SHELLLINKTYPE_GETDESC:
|
||||
{
|
||||
hRes=m_psl->GetDescription(szBuf, MAX_PATH);
|
||||
if (hRes != S_OK) szBuf[0]=TEXT('\0');
|
||||
}; break;
|
||||
case SHELLLINKTYPE_GETHOTKEY:
|
||||
{
|
||||
hRes=m_psl->GetHotkey(&wHotkey);
|
||||
if (hRes == S_OK) wsprintf(szBuf, TEXT("%d"), wHotkey);
|
||||
else szBuf[0]=TEXT('\0');
|
||||
}; break;
|
||||
case SHELLLINKTYPE_GETICONLOC:
|
||||
{
|
||||
hRes=m_psl->GetIconLocation(szBuf, MAX_PATH, &nBuf);
|
||||
if (hRes != S_OK) szBuf[0]=TEXT('\0');
|
||||
}; break;
|
||||
case SHELLLINKTYPE_GETICONINDEX:
|
||||
{
|
||||
hRes=m_psl->GetIconLocation(szBuf, MAX_PATH, &nBuf);
|
||||
if (hRes == S_OK) wsprintf(szBuf, TEXT("%d"), nBuf);
|
||||
else szBuf[0]=TEXT('\0');
|
||||
}; break;
|
||||
case SHELLLINKTYPE_GETPATH:
|
||||
{
|
||||
WIN32_FIND_DATA fd;
|
||||
|
||||
hRes=m_psl->GetPath(szBuf, MAX_PATH, &fd, SLGP_UNCPRIORITY);
|
||||
if (hRes != S_OK) szBuf[0]=TEXT('\0');
|
||||
}; break;
|
||||
case SHELLLINKTYPE_GETSHOWMODE:
|
||||
{
|
||||
hRes=m_psl->GetShowCmd(&nBuf);
|
||||
if (hRes == S_OK) wsprintf(szBuf, TEXT("%d"), nBuf);
|
||||
else szBuf[0]=TEXT('\0');
|
||||
}; break;
|
||||
case SHELLLINKTYPE_GETWORKINGDIR:
|
||||
{
|
||||
hRes=m_psl->GetWorkingDirectory(szBuf, MAX_PATH);
|
||||
if (hRes != S_OK) szBuf[0]=TEXT('\0');
|
||||
}; break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Set
|
||||
switch(nType)
|
||||
{
|
||||
case SHELLLINKTYPE_SETARGS:
|
||||
{
|
||||
hRes=m_psl->SetArguments(szBuf2);
|
||||
}; break;
|
||||
case SHELLLINKTYPE_SETDESC:
|
||||
{
|
||||
hRes=m_psl->SetDescription(szBuf2);
|
||||
}; break;
|
||||
case SHELLLINKTYPE_SETHOTKEY:
|
||||
{
|
||||
wHotkey=(unsigned short)xatoi(szBuf2);
|
||||
hRes=m_psl->SetHotkey(wHotkey);
|
||||
}; break;
|
||||
case SHELLLINKTYPE_SETICONLOC:
|
||||
{
|
||||
hRes=m_psl->GetIconLocation(szBuf, MAX_PATH, &nBuf);
|
||||
if (hRes == S_OK)
|
||||
hRes=m_psl->SetIconLocation(szBuf2, nBuf);
|
||||
}; break;
|
||||
case SHELLLINKTYPE_SETICONINDEX:
|
||||
{
|
||||
int nBuf2;
|
||||
nBuf=xatoi(szBuf2);
|
||||
hRes=m_psl->GetIconLocation(szBuf, MAX_PATH, &nBuf2);
|
||||
if (hRes == S_OK)
|
||||
hRes=m_psl->SetIconLocation(szBuf, nBuf);
|
||||
}; break;
|
||||
case SHELLLINKTYPE_SETPATH:
|
||||
{
|
||||
hRes=m_psl->SetPath(szBuf2);
|
||||
}; break;
|
||||
case SHELLLINKTYPE_SETSHOWMODE:
|
||||
{
|
||||
nBuf=xatoi(szBuf2);
|
||||
hRes=m_psl->SetShowCmd(nBuf);
|
||||
}; break;
|
||||
case SHELLLINKTYPE_SETWORKINGDIR:
|
||||
{
|
||||
hRes=m_psl->SetWorkingDirectory(szBuf2);
|
||||
}; break;
|
||||
}
|
||||
if (hRes == S_OK) hRes=m_ppf->Save(NULL, FALSE);
|
||||
#ifdef SHELLLINK_DEBUG
|
||||
else MessageBox(hwndParent, "ERROR: Save()", "ShellLink", MB_OK);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifdef SHELLLINK_DEBUG
|
||||
else MessageBox(hwndParent, "ERROR: Load()", "ShellLink", MB_OK);
|
||||
#endif
|
||||
}
|
||||
#ifdef SHELLLINK_DEBUG
|
||||
else MessageBox(hwndParent, "CShellLink::Initialise, Failed in call to QueryInterface for IPersistFile, HRESULT was %x\n", "ShellLink", MB_OK);
|
||||
#endif
|
||||
|
||||
// Cleanup:
|
||||
if (m_ppf) m_ppf->Release();
|
||||
if (m_psl) m_psl->Release();
|
||||
}
|
||||
#ifdef SHELLLINK_DEBUG
|
||||
else MessageBox(hwndParent, "ERROR: CoCreateInstance()", "ShellLink", MB_OK);
|
||||
#endif
|
||||
|
||||
if (hRes == S_OK)
|
||||
{
|
||||
if (nType <= SHELLLINKTYPE_GETWORKINGDIR) pushstring(szBuf);
|
||||
else pushstring(TEXT("0"));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (nType <= SHELLLINKTYPE_GETWORKINGDIR) pushstring(TEXT(""));
|
||||
else pushstring(TEXT("-1"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int popstring(TCHAR *str)
|
||||
{
|
||||
stack_t *th;
|
||||
if (!g_stacktop || !*g_stacktop) return 1;
|
||||
th=(*g_stacktop);
|
||||
lstrcpy(str,th->text);
|
||||
*g_stacktop=th->next;
|
||||
GlobalFree((HGLOBAL)th);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pushstring(TCHAR *str)
|
||||
{
|
||||
stack_t *th;
|
||||
if (!g_stacktop) return;
|
||||
th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize);
|
||||
lstrcpyn(th->text,str,g_stringsize);
|
||||
th->next=*g_stacktop;
|
||||
*g_stacktop=th;
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
# Microsoft Developer Studio Project File - Name="ShellLink" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=ShellLink - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "ShellLink.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "ShellLink.mak" CFG="ShellLink - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "ShellLink - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "ShellLink - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "ShellLink - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ShellLink_EXPORTS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ShellLink_EXPORTS" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib uuid.lib ole32.lib /nologo /entry:"DllMain" /dll /machine:I386 /nodefaultlib /out:"ShellLink.dll" /opt:nowin98
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "ShellLink - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ShellLink_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ShellLink_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "ShellLink - Win32 Release"
|
||||
# Name "ShellLink - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\ShellLink.cpp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
|
@ -0,0 +1,29 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "ShellLink"=.\ShellLink.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
History:
|
||||
--------
|
||||
v0.0.10a - 20081004 (AndersK)
|
||||
*Added SEE_MASK_NOZONECHECKS flag (experimental)
|
||||
|
||||
v0.0.10 - 20080812 (AndersK)
|
||||
*Added ugly hook hack to the shells run-as dialog on xp, defaults to other user
|
||||
|
||||
v0.0.9 - 20080721 (AndersK)
|
||||
*Fixed UAC_RealWorldFullyLoadedDualModeExample.nsi related bug (Thanks Case)
|
||||
|
||||
v0.0.8 - 20080310 (AndersK)
|
||||
+HTML Readme
|
||||
+Added UAC::GetOuterHwnd (used by UAC_RealWorldFullyLoadedDualModeExample.nsi)
|
||||
*Fixed UAC_RealWorldFullyLoadedDualModeExample.nsi
|
||||
*Major code cleanup in UAC.cpp
|
||||
-Removed UAC::RunElevatedAndProcessMessages (UAC::RunElevated now supports non NULL $HWNDParent)
|
||||
-Removed several useless sample scripts
|
||||
|
||||
v0.0.7e - 20080229 (AndersK)
|
||||
*Added ugly hack for hackwnd to find correct title and give us a proper taskbar so the elevation dialog does not get lost (2000,XP (This also fixed Alt-Tab icon on Vista))
|
||||
*Should compile with MSVC2005 now (Thanks Case)
|
||||
*More unicode fixes, this time even tested with NSIS Unicode (Only RunElevated and Exec tested)
|
||||
|
||||
v0.0.7d - 20080226 (AndersK)
|
||||
*Fixed a couple of unicode version bugs (Unicode version still untested)
|
||||
*Fixed weird XP string length bug (Thanks kfank)
|
||||
|
||||
v0.0.7c - 20080218 (AndersK)
|
||||
*Fixed SyncVars string length bug
|
||||
|
||||
v0.0.7b - 20080205 (AndersK)
|
||||
*Fixed DelayLoadDlls() problem on NT4
|
||||
|
||||
v0.0.7 - 20080120 (AndersK)
|
||||
+Added UAC::StackPush (For use with ExecCodeSegment)
|
||||
|
||||
v0.0.6d - 20071108 (AndersK)
|
||||
+Now syncs basic registers/variables before calling UAC::*Exec* and UAC::ExecCodeSegment (r0-r9,R0-R9,$CMDLINE,$INSTDIR,$OUTDIR,$EXEDIR,$LANGUAGE)
|
||||
+Added UAC::RunElevatedAndProcessMessages, this can be called after .onInit (Very experimental, DO NOT USE)
|
||||
+New include file with helper macros: UAC.nsh
|
||||
*Replazed Clammerz hack with a better version
|
||||
|
||||
v0.0.6c - 20071014 (AndersK)
|
||||
+Check for and split up "domain\user" style input in RunAs.cpp for CreateProcessWithLogonW
|
||||
*Added a ugly hack to trick messagebox'es in .OnInit to appear correctly on Vista (Thanks Clammerz)
|
||||
|
||||
v0.0.6b - 20070523 (AndersK)
|
||||
*Fixed showwindow flag (Thanks for the help kichik)
|
||||
|
||||
v0.0.6 - 20070512 (AndersK)
|
||||
+Added basic language support for MyRunAs dialog.
|
||||
|
||||
v0.0.5e - 20070509 (AndersK)
|
||||
*Fixed detection of UAC mode?
|
||||
+IPC window is visible (but offscreen) during elevation to help with SetForegroundWindow/Focus problems
|
||||
|
||||
v0.0.5d - 20070324 (AndersK)
|
||||
*Fixed stupid IsAdmin bug
|
||||
|
||||
v0.0.5c - 20070304 (AndersK)
|
||||
*_IsAdmin now uses CheckTokenMembership if it exists ( MSKB:Q118626 / http://blogs.msdn.com/larryosterman/archive/2007/03/14/why-does-kb-118626-use-accesscheck-to-check-if-you-re-a-member-of-the-administrators-group.aspx )
|
||||
|
||||
v0.0.5b - 20070301 (AndersK)
|
||||
*Fixed ExecCodeSegment (Thread now calls CoInitialize)
|
||||
|
||||
v0.0.5 - 20070228 (AndersK)
|
||||
+Added ExecCodeSegment (You can now call ANY code in the context of the original user)
|
||||
|
||||
v0.0.4b - 20070226 (AndersK)
|
||||
*Fixed (My)RunAs font (http://blogs.msdn.com/oldnewthing/archive/2005/02/04/366987.aspx)
|
||||
|
||||
v0.0.4 - 20070225 (AndersK)
|
||||
+Added (My)RunAs dialog, used on Vista when running as LUA with UAC off
|
||||
+Always uses /NCRC for elevated instance
|
||||
*Now compiles as UNICODE (Untested, no UnicodeNSIS to test on)
|
||||
|
||||
v0.0.3 - 20070224 (AndersK)
|
||||
+Added Exec/ExecWait
|
||||
+Added Verb & ShowWindow support for ShellExec[Wait]
|
||||
|
||||
v0.0.2 - 20070219 (AndersK)
|
||||
+Added ShellExecWait
|
||||
*IPC srv wnd now has its own thread and msg loop
|
||||
*Removed CRT dependency
|
||||
*Hopefully loads on Win95 now
|
||||
|
||||
v0.0.1 - 20070215 (AndersK)
|
||||
*Initial release
|
|
@ -0,0 +1,14 @@
|
|||
This software is provided 'as-is', without any express or implied warranty.
|
||||
|
||||
ZLIB/LIBPNG LICENSE
|
||||
-------------------
|
||||
|
||||
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.
|
|
@ -0,0 +1,149 @@
|
|||
/*
|
||||
Alternative to ExDll.h
|
||||
|
||||
v0.0.1 - 20060811 (AndersK)
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <TChar.h>
|
||||
|
||||
|
||||
typedef TCHAR NSISCH;
|
||||
#define NSISCALL __stdcall
|
||||
|
||||
namespace NSIS {
|
||||
|
||||
__forceinline void* NSISCALL MemAlloc(SIZE_T cb) {return GlobalAlloc(LPTR,cb);}
|
||||
__forceinline void NSISCALL MemFree(void* p) {GlobalFree(p);}
|
||||
|
||||
enum {
|
||||
INST_0, // $0
|
||||
INST_1, // $1
|
||||
INST_2, // $2
|
||||
INST_3, // $3
|
||||
INST_4, // $4
|
||||
INST_5, // $5
|
||||
INST_6, // $6
|
||||
INST_7, // $7
|
||||
INST_8, // $8
|
||||
INST_9, // $9
|
||||
INST_R0, // $R0
|
||||
INST_R1, // $R1
|
||||
INST_R2, // $R2
|
||||
INST_R3, // $R3
|
||||
INST_R4, // $R4
|
||||
INST_R5, // $R5
|
||||
INST_R6, // $R6
|
||||
INST_R7, // $R7
|
||||
INST_R8, // $R8
|
||||
INST_R9, // $R9
|
||||
INST_CMDLINE, // $CMDLINE
|
||||
INST_INSTDIR, // $INSTDIR
|
||||
INST_OUTDIR, // $OUTDIR
|
||||
INST_EXEDIR, // $EXEDIR
|
||||
INST_LANG, // $LANGUAGE
|
||||
__INST_LAST,
|
||||
|
||||
VIDX_TEMP=(INST_LANG+1), //#define state_temp_dir g_usrvars[25]
|
||||
VIDX_PLUGINSDIR,//# define state_plugins_dir g_usrvars[26]
|
||||
VIDX_EXEPATH,//#define state_exe_path g_usrvars[27]
|
||||
VIDX_EXEFILENAME,//#define state_exe_file g_usrvars[28]
|
||||
VIDX_STATECLICKNEXT,//#define state_click_next g_usrvars[30]
|
||||
__VIDX_UNDOCLAST
|
||||
};
|
||||
|
||||
|
||||
|
||||
typedef struct _stack_t {
|
||||
struct _stack_t *next;
|
||||
NSISCH text[ANYSIZE_ARRAY];
|
||||
} stack_t;
|
||||
|
||||
typedef struct {
|
||||
int autoclose;
|
||||
int all_user_var;
|
||||
int exec_error;
|
||||
int abort;
|
||||
int exec_reboot;
|
||||
int reboot_called;
|
||||
int XXX_cur_insttype; // deprecated
|
||||
int XXX_insttype_changed; // deprecated
|
||||
int silent;
|
||||
int instdir_error;
|
||||
int rtl;
|
||||
int errlvl;
|
||||
//NSIS v2.3x ?
|
||||
int alter_reg_view;
|
||||
int status_update;
|
||||
} exec_flags_type;
|
||||
|
||||
typedef struct {
|
||||
exec_flags_type *exec_flags;
|
||||
int (NSISCALL *ExecuteCodeSegment)(int, HWND);
|
||||
void (NSISCALL *validate_filename)(char *);
|
||||
} extra_parameters;
|
||||
|
||||
extern UINT StrSize;
|
||||
extern stack_t **StackTop;
|
||||
extern NSISCH*Vars;
|
||||
|
||||
inline bool NSISCALL SetErrLvl(extra_parameters*pExtraParams,int ErrLevel) {return pExtraParams? ((pExtraParams->exec_flags->errlvl=ErrLevel)||true):false;}
|
||||
inline bool NSISCALL SetErrorFlag(extra_parameters*pExtraParams) {return pExtraParams? ((pExtraParams->exec_flags->exec_error=1)||true):false;}
|
||||
inline bool NSISCALL ClearErrorFlag(extra_parameters*pExtraParams) {return pExtraParams?((pExtraParams->exec_flags->exec_error=0)||true):false;}
|
||||
|
||||
__forceinline int NSISCALL ExecuteCodeSegment(extra_parameters*pExtraParams,int pos,HWND hwndProgress=NULL) {
|
||||
return pExtraParams?pExtraParams->ExecuteCodeSegment(pos,hwndProgress):(/*EXEC_ERROR*/0x7FFFFFFF);
|
||||
}
|
||||
|
||||
static NSISCH* __fastcall GetVar(const int varnum)
|
||||
{
|
||||
//ASSERT(NSIS::Vars && NSIS::StrSize);
|
||||
if (varnum < 0 || varnum >= __VIDX_UNDOCLAST) return NULL;
|
||||
return NSIS::Vars+(varnum*NSIS::StrSize);
|
||||
}
|
||||
|
||||
inline void NSISCALL SetVarUINT(const int varnum,UINT Value) {
|
||||
wsprintf(GetVar(varnum),_T("%u"),Value);
|
||||
}
|
||||
|
||||
static stack_t* NSISCALL StackPop() {
|
||||
if (NSIS::StackTop && *NSIS::StackTop) {
|
||||
stack_t*s=(*NSIS::StackTop);
|
||||
*NSIS::StackTop=(*NSIS::StackTop)->next;
|
||||
return s;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
__forceinline void NSISCALL StackFreeItem(stack_t*pStackItem) {NSIS::MemFree(pStackItem);}
|
||||
|
||||
static DWORD NSISCALL StackPush(NSISCH*InStr,UINT StackStrSize=NSIS::StrSize) {
|
||||
if (!NSIS::StackTop)return ERROR_INVALID_PARAMETER;
|
||||
stack_t*sNew=(stack_t*)NSIS::MemAlloc(sizeof(stack_t)+(StackStrSize*sizeof(NSISCH)));
|
||||
if (!sNew)return ERROR_OUTOFMEMORY;
|
||||
lstrcpyn(sNew->text,InStr,StackStrSize);
|
||||
sNew->next=*NSIS::StackTop;
|
||||
*NSIS::StackTop=sNew;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
}; /* namespace */
|
||||
|
||||
#define NSISUTIL_INIT() namespace NSIS {static UINT StrSize;static stack_t **StackTop;static NSISCH*Vars;}//Call in only ONE source file
|
||||
#define NSISUTIL_INITEXPORT(_v,_strsize,_stackt) NSIS::Vars=_v;NSIS::StrSize=_strsize;NSIS::StackTop=_stackt
|
||||
|
||||
//#define NSISEXPORT4(_func,_h,_strsize,_v,_stackt) extern "C" void __declspec(dllexport) __cdecl \
|
||||
// _func (HWND _h,int _strsize,NSISCH*_v,NSIS::stack_t **_stackt) { NSISUTIL_INITEXPORT(_v,_strsize,_stackt); TRACE("EXPORT::" #_func "\n");
|
||||
//#define NSISEXPORT5(_func,_h,_strsize,_v,_stackt,_eparams) extern "C" void __declspec(dllexport) __cdecl \
|
||||
// _func (HWND _h,int _strsize,NSISCH*_v,NSIS::stack_t **_stackt,NSIS::extra_parameters* _eparams) { NSISUTIL_INITEXPORT(_v,_strsize,_stackt); TRACE("EXPORT::" #_func "\n");
|
||||
//#define NSISEXPORT NSISEXPORT5
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# define EXPORTNSISFUNC extern "C" void __declspec(dllexport) __cdecl
|
||||
# else
|
||||
# error EXPORTNSISFUNC needs compiler goo, you are on your own!
|
||||
# endif
|
||||
#define NSISFUNCSTART4(_h,_strsize,_v,_stackt) {NSISUTIL_INITEXPORT(_v,_strsize,_stackt);
|
||||
#define NSISFUNCSTART5(_h,_strsize,_v,_stackt,_eparams) NSISFUNCSTART4(_h,_strsize,_v,_stackt)
|
||||
#define NSISFUNCSTART NSISFUNCSTART5
|
||||
#define NSISFUNCEND() }
|
||||
|
|
@ -0,0 +1,276 @@
|
|||
//Copyright (C) 2007 Anders Kjersem. Licensed under the zlib/libpng license, see License.txt for details.
|
||||
/*
|
||||
If UAC is disabled, the runas verb is broken (Vista RTM) so when running as LUA there is no way to elevate so
|
||||
we provide our own dialog.
|
||||
*/
|
||||
|
||||
#include "UAC.h"
|
||||
#ifdef FEAT_CUSTOMRUNASDLG
|
||||
#include <Lmcons.h>//UNLEN && GNLEN && PWLEN
|
||||
#include <WindowsX.h>
|
||||
#include "resource.h"
|
||||
#include "NSISUtil.h"
|
||||
using namespace NSIS;
|
||||
#define ERRAPP_TRYAGAIN (0x20000000|1)
|
||||
#define MYMAX_DOMAIN (2+max(GNLEN,MAX_COMPUTERNAME_LENGTH)+1)
|
||||
|
||||
|
||||
static LPCTSTR g_RunAsDlgTitle=_T("Run as");
|
||||
static LPCTSTR g_RunAsHelpText=_T("You may not have the necessary permissions to use all the features of the program you are about to run. You may run this program as a different user or continue to run the program as the current user.");
|
||||
static LPCTSTR g_RunAsCurrUsrFmt=_T("&Current user (%s)");//Max 50 chars!
|
||||
static LPCTSTR g_RunAsSpecHelp=_T("Run the program as the &following user:");
|
||||
|
||||
FORCEINLINE bool MySetDlgItemText(HWND hDlg,int id,LPCTSTR s) {return MySndDlgItemMsg(hDlg,id,WM_SETTEXT,0,(LPARAM)s)!=0;}
|
||||
|
||||
typedef struct {
|
||||
SHELLEXECUTEINFO*pSEI;
|
||||
bool AsSelf;
|
||||
} RUNASDLGDATA;
|
||||
|
||||
void MyRunAsFmtCurrUserRadio(HWND hDlg,LPCTSTR Fmt) {
|
||||
TCHAR bufFullName[MYMAX_DOMAIN+UNLEN+1];
|
||||
TCHAR buf[50+MYMAX_DOMAIN+UNLEN+1];
|
||||
*bufFullName=0;
|
||||
ULONG cch;
|
||||
if ((!_GetUserNameEx || !_GetUserNameEx(NameSamCompatible,bufFullName,&(cch=COUNTOF(bufFullName)))) &&
|
||||
!_GetUserName(bufFullName,&(cch=COUNTOF(bufFullName))) ) {
|
||||
*bufFullName=0;
|
||||
}
|
||||
wsprintf(buf,Fmt,*bufFullName?bufFullName:_T("?"));
|
||||
MySetDlgItemText(hDlg,IDC_RUNASCURR,buf);
|
||||
|
||||
// default the "User name:" to Administrator from shell32
|
||||
if (LoadString(GetModuleHandle(_T("SHELL32.dll")),21763, bufFullName, COUNTOF(bufFullName)) > 0) {
|
||||
MySetDlgItemText(hDlg,IDC_USERNAME,bufFullName);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef FEAT_CUSTOMRUNASDLG_TRANSLATE
|
||||
void MyRunAsTranslateDlgString(LPCTSTR StrID,LPTSTR Ini,HWND hDlg,INT_PTR DlgItemId,int special=0) {
|
||||
TCHAR buf[MAX_PATH*2];
|
||||
DWORD len=GetPrivateProfileString(_T("MyRunAsStrings"),StrID,0,buf,ARRAYSIZE(buf),Ini);
|
||||
if (len) {
|
||||
if (IDC_RUNASCURR==special)
|
||||
MyRunAsFmtCurrUserRadio(hDlg,buf);
|
||||
else
|
||||
(DlgItemId==-1) ? SetWindowText(hDlg,buf) : MySetDlgItemText(hDlg,DlgItemId,buf);
|
||||
}
|
||||
}
|
||||
|
||||
void MyRunAsTranslateDlg(HWND hDlg) {
|
||||
DWORD len;
|
||||
TCHAR buf[MAX_PATH*2];
|
||||
HMODULE hDll=GetWindowInstance(hDlg);ASSERT(hDll);
|
||||
if ( (len=GetModuleFileName(hDll,buf,ARRAYSIZE(buf))) <1)return;
|
||||
buf[len-3]=0;
|
||||
lstrcat(buf,_T("lng"));
|
||||
MyRunAsTranslateDlgString(_T("DlgTitle"),buf,hDlg,-1);
|
||||
MyRunAsTranslateDlgString(_T("HelpText"),buf,hDlg,IDC_HELPTEXT);
|
||||
MyRunAsTranslateDlgString(_T("OptCurrUser"),buf,hDlg,IDC_RUNASCURR,IDC_RUNASCURR);
|
||||
MyRunAsTranslateDlgString(_T("OptOtherUser"),buf,hDlg,IDC_RUNASSPEC);
|
||||
MyRunAsTranslateDlgString(_T("Username"),buf,hDlg,IDC_LBLUSER);
|
||||
MyRunAsTranslateDlgString(_T("Pwd"),buf,hDlg,IDC_LBLPWD);
|
||||
MyRunAsTranslateDlgString(_T("OK"),buf,hDlg,IDOK);
|
||||
MyRunAsTranslateDlgString(_T("Cancel"),buf,hDlg,IDCANCEL);
|
||||
HWND h=GetDlgItem(hDlg,IDC_RUNASCURR);
|
||||
if (GetPrivateProfileInt(_T("MyRunAsCfg"),_T("DisableCurrUserOpt"),false,buf))EnableWindow(h,false);
|
||||
if (GetPrivateProfileInt(_T("MyRunAsCfg"),_T("HideCurrUserOpt"),false,buf))ShowWindow(h,false);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool ErrorIsLogonError(DWORD err) {
|
||||
switch (err) {
|
||||
case ERROR_LOGON_FAILURE:
|
||||
case ERROR_ACCOUNT_RESTRICTION:
|
||||
case ERROR_INVALID_LOGON_HOURS:
|
||||
case ERROR_INVALID_WORKSTATION:
|
||||
case ERROR_PASSWORD_EXPIRED:
|
||||
case ERROR_ACCOUNT_DISABLED:
|
||||
case ERROR_NONE_MAPPED:
|
||||
case ERROR_NO_SUCH_USER:
|
||||
case ERROR_INVALID_ACCOUNT_NAME:
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void VerifyOKBtn(HWND hDlg,RUNASDLGDATA*pRADD) {
|
||||
const bool HasText=pRADD?(pRADD->AsSelf?true:MySndDlgItemMsg(hDlg,IDC_USERNAME,WM_GETTEXTLENGTH)>0):false;
|
||||
EnableWindow(GetDlgItem(hDlg,IDOK),HasText);
|
||||
}
|
||||
|
||||
void SetDlgState(HWND hDlg,bool AsSelf,RUNASDLGDATA*pRADD) {
|
||||
if (pRADD)pRADD->AsSelf=AsSelf;
|
||||
MySndDlgItemMsg(hDlg,IDC_RUNASCURR,BM_SETCHECK,AsSelf?BST_CHECKED:BST_UNCHECKED);
|
||||
MySndDlgItemMsg(hDlg,IDC_RUNASSPEC,BM_SETCHECK,!AsSelf?BST_CHECKED:BST_UNCHECKED);
|
||||
int ids[]={IDC_USERNAME,IDC_PASSWORD,IDC_LBLUSER,IDC_LBLPWD};
|
||||
for (int i=0; i<COUNTOF(ids);++i)EnableWindow(GetDlgItem(hDlg,ids[i]),!AsSelf);
|
||||
VerifyOKBtn(hDlg,pRADD);
|
||||
}
|
||||
|
||||
INT_PTR CALLBACK MyRunAsDlgProc(HWND hwnd,UINT uMsg,WPARAM wp,LPARAM lp) {
|
||||
RUNASDLGDATA*pRADD=(RUNASDLGDATA*)GetWindowLongPtr(hwnd,GWLP_USERDATA);
|
||||
switch(uMsg) {
|
||||
//case WM_DESTROY:
|
||||
// break;
|
||||
case WM_CLOSE:
|
||||
return DestroyWindow(hwnd);
|
||||
case WM_INITDIALOG:
|
||||
{
|
||||
pRADD=(RUNASDLGDATA*)lp;ASSERT(pRADD);
|
||||
SetWindowLongPtr(hwnd,GWLP_USERDATA,lp);
|
||||
Edit_LimitText(GetDlgItem(hwnd,IDC_USERNAME),UNLEN+1+MYMAX_DOMAIN); //room for "foo@BAR" or "BAR\foo"
|
||||
Edit_LimitText(GetDlgItem(hwnd,IDC_PASSWORD),PWLEN);
|
||||
const HINSTANCE hSh32=GetModuleHandle(_T("SHELL32.dll"));
|
||||
const HICON hIco=(HICON)LoadImage(hSh32,MAKEINTRESOURCE(194),IMAGE_ICON,32,32,LR_SHARED);
|
||||
MySndDlgItemMsg(hwnd,IDC_SHICON,STM_SETICON,(WPARAM)hIco);
|
||||
SendMessage(hwnd,WM_SETTEXT,0,(LPARAM)g_RunAsDlgTitle);
|
||||
MySetDlgItemText(hwnd,IDC_HELPTEXT,g_RunAsHelpText);
|
||||
MyRunAsFmtCurrUserRadio(hwnd,g_RunAsCurrUsrFmt);
|
||||
MySetDlgItemText(hwnd,IDC_RUNASSPEC,g_RunAsSpecHelp);
|
||||
#ifdef FEAT_CUSTOMRUNASDLG_TRANSLATE
|
||||
MyRunAsTranslateDlg(hwnd);
|
||||
#endif
|
||||
SetDlgState(hwnd,false,pRADD);
|
||||
|
||||
#if defined(BUILD_DBG) && 0 //auto login used during testing ;)
|
||||
SetDlgItemText(hwnd,IDC_USERNAME,_T("root"));
|
||||
SetDlgItemText(hwnd,IDC_PASSWORD,_T("???"));
|
||||
Sleep(1);PostMessage(hwnd,WM_COMMAND,IDOK,0);
|
||||
#endif
|
||||
}
|
||||
return true;
|
||||
case WM_COMMAND:
|
||||
{
|
||||
switch(HIWORD(wp)) {
|
||||
case EN_CHANGE:
|
||||
VerifyOKBtn(hwnd,pRADD);
|
||||
break;
|
||||
case EN_SETFOCUS:
|
||||
case BN_CLICKED:
|
||||
if (LOWORD(wp)<=IDCANCEL)break;
|
||||
SetDlgState(hwnd,LOWORD(wp)==IDC_RUNASCURR,pRADD);
|
||||
return FALSE;
|
||||
}
|
||||
INT_PTR exitcode=!pRADD?-1:IDCANCEL;
|
||||
switch(LOWORD(wp)) {
|
||||
case IDOK:
|
||||
if (pRADD) {
|
||||
SHELLEXECUTEINFO&sei=*pRADD->pSEI;
|
||||
PROCESS_INFORMATION pi={0};
|
||||
DWORD ec=NO_ERROR;
|
||||
WCHAR*wszExec;//Also used as TCHAR buffer in AsSelf mode
|
||||
bool PerformTCharFmt=pRADD->AsSelf;
|
||||
//const DWORD CommonStartupInfoFlags=STARTF_FORCEONFEEDBACK;
|
||||
#ifdef UNICODE
|
||||
PerformTCharFmt=true;
|
||||
#endif
|
||||
wszExec=(WCHAR*)NSIS::MemAlloc( (pRADD->AsSelf?sizeof(TCHAR):sizeof(WCHAR)) *(lstrlen(sei.lpFile)+1+lstrlen(sei.lpParameters)+1));
|
||||
if (!wszExec)ec=ERROR_OUTOFMEMORY;
|
||||
if (PerformTCharFmt)wsprintf((TCHAR*)wszExec,_T("%s%s%s"),sei.lpFile,((sei.lpParameters&&*sei.lpParameters)?_T(" "):_T("")),sei.lpParameters);
|
||||
if (!ec) {
|
||||
if (pRADD->AsSelf) {
|
||||
STARTUPINFO si={sizeof(si)};
|
||||
TRACEF("MyRunAs:CreateProcess:%s|\n",wszExec);
|
||||
ec=(CreateProcess(0,(TCHAR*)wszExec,0,0,false,0,0,0,&si,&pi)?NO_ERROR:GetLastError());
|
||||
}
|
||||
else {
|
||||
//All Wide strings!
|
||||
WCHAR wszPwd[PWLEN+1];
|
||||
WCHAR wszUName[UNLEN+1+MYMAX_DOMAIN+1];
|
||||
STARTUPINFOW siw={sizeof(siw)};
|
||||
WCHAR*p;
|
||||
#ifndef UNICODE
|
||||
//Build unicode string, we already know the buffer is big enough so no error handling
|
||||
p=wszExec;
|
||||
MultiByteToWideChar(CP_THREAD_ACP,0,sei.lpFile,-1,p,0xFFFFFF);
|
||||
if (sei.lpParameters && *sei.lpParameters) {
|
||||
p+=lstrlen(sei.lpFile);*p++=L' ';*p=0;
|
||||
MultiByteToWideChar(CP_THREAD_ACP,0,sei.lpParameters,-1,p,0xFFFFFF);
|
||||
}
|
||||
#endif
|
||||
SendMessageW(GetDlgItem(hwnd,IDC_USERNAME),WM_GETTEXT,COUNTOF(wszUName),(LPARAM)wszUName);
|
||||
SendMessageW(GetDlgItem(hwnd,IDC_PASSWORD),WM_GETTEXT,COUNTOF(wszPwd),(LPARAM)wszPwd);
|
||||
|
||||
//Try to find [\\]domain\user and split into username and domain strings
|
||||
WCHAR*pUName=wszUName,*pDomain=0;
|
||||
p=wszUName;
|
||||
//if (*p==p[1]=='\\')pUName=(p+=2);else \ //Should we still split things up if the string starts with \\ ? Is it possible to use \\machine\user at all?
|
||||
++p;//Don't parse "\something", require at least one char before backslash "?[*\]something"
|
||||
while(*p && *p!='\\')++p;
|
||||
if (*p=='\\') {
|
||||
pDomain=pUName;
|
||||
pUName=p+1;*p=0;
|
||||
}
|
||||
|
||||
TRACEF("MyRunAs:CreateProcessWithLogonW:%ws|%ws|%ws|%ws|\n",pUName,pDomain?pDomain:L"NO?DOMAIN",wszPwd,wszExec);
|
||||
ec=(_CreateProcessWithLogonW(pUName,pDomain?pDomain:0,wszPwd,LOGON_WITH_PROFILE,0,wszExec,0,0,0,&siw,&pi)?NO_ERROR:GetLastError());
|
||||
TRACEF("MyRunAs:CreateProcessWithLogonW: ret=%u\n",ec);
|
||||
SecureZeroMemory(wszPwd,sizeof(wszPwd));//if (wszPwd) {volatile WCHAR*_p=wszPwd;for(;_p&&*_p;++_p)*_p=1;if (_p)*wszPwd=0;}//Burn password (And attempt to prevent compiler from removing it)
|
||||
if (ec && ErrorIsLogonError(ec)) {
|
||||
LPTSTR szMsg;
|
||||
DWORD ret=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,0,ec,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&szMsg,0,0);
|
||||
if (ret) {
|
||||
ec=ERRAPP_TRYAGAIN;
|
||||
MessageBox(hwnd,szMsg,0,MB_ICONWARNING);
|
||||
LocalFree(szMsg);
|
||||
}
|
||||
else ec=GetLastError();
|
||||
}
|
||||
}
|
||||
}
|
||||
NSIS::MemFree(wszExec);
|
||||
if (pi.hThread)CloseHandle(pi.hThread);
|
||||
if (ERRAPP_TRYAGAIN==ec)break;
|
||||
if (ec) {
|
||||
SetLastError(ec);
|
||||
exitcode=-1;
|
||||
}
|
||||
else {
|
||||
pRADD->pSEI->hProcess=pi.hProcess;
|
||||
exitcode=IDOK;
|
||||
}
|
||||
}
|
||||
case IDCANCEL:
|
||||
EndDialog(hwnd,exitcode);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DWORD MyRunAs(HINSTANCE hInstDll,SHELLEXECUTEINFO&sei) {
|
||||
INT_PTR ec;
|
||||
ASSERT(sei.cbSize>=sizeof(SHELLEXECUTEINFO) && hInstDll);
|
||||
if (ec=DelayLoadDlls())return ec;
|
||||
ASSERT(_CreateProcessWithLogonW && _GetUserName);
|
||||
RUNASDLGDATA radd={0};
|
||||
radd.pSEI=&sei;
|
||||
ec=DialogBoxParam(hInstDll,MAKEINTRESOURCE(IDD_MYRUNAS),sei.hwnd,MyRunAsDlgProc,(LPARAM)&radd);
|
||||
TRACEF("MyRunAs returned %d (%s|%s)\n",ec,sei.lpFile,sei.lpParameters);
|
||||
switch(ec) {
|
||||
case 0:
|
||||
return ERROR_INVALID_HANDLE;//DialogBoxParam returns 0 on bad hwnd
|
||||
case IDOK:
|
||||
return NO_ERROR;
|
||||
case IDCANCEL:
|
||||
return ERROR_CANCELLED;
|
||||
}
|
||||
return GetLastError();
|
||||
}
|
||||
|
||||
|
||||
#ifdef BUILD_DBG
|
||||
// RunDll exports are __stdcall, we dont care about that for this debug export, rundll32.exe is able to handle this mistake
|
||||
extern "C" void __declspec(dllexport) __cdecl DBGRDMyRunAs(HWND hwnd,HINSTANCE hinst,LPTSTR lpCmdLine,int nCmdShow) {
|
||||
SHELLEXECUTEINFO sei={sizeof(sei)};
|
||||
sei.lpFile=_T("Notepad.exe");//sei.lpParameters=_T("param1");
|
||||
TRACEF("ec=%d\n",MyRunAs(GetModuleHandle(_T("UAC.dll")),sei));
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* FEAT_CUSTOMRUNASDLG */
|
||||
|
|
@ -0,0 +1,222 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
||||
<html><head>
|
||||
<title>UAC plug-in readme</title>
|
||||
<script type="text/javascript">
|
||||
function NavGL(q){window.open("http://www.google.com/search?hl=en&btnI=I&num=2&q="+escape(q));return 0;}
|
||||
</script>
|
||||
<style type="text/css">
|
||||
html,body {background-color:#FFF; color:#000;}
|
||||
a:link, a:visited, a:active {color:#00F;}
|
||||
h2 {border-bottom:0.1em solid #000;}
|
||||
#docHdrHdln{text-align:center;}
|
||||
.importanttxt {color:#e00;}
|
||||
.code {font-family:monospace;}
|
||||
.nsisvar {color:#C00;}
|
||||
.str {color:#390}
|
||||
.inifile {background-color:#EEE;border:1px solid #000;padding:0.2em;}
|
||||
.inicomment {background-color:#f5f5c5;color:#555;}
|
||||
table.piexport {text-align:left;margin-bottom:1em;}
|
||||
table.piexport td {vertical-align:top;}
|
||||
table.piexport table.ret {padding:0;margin:0;border:0;}
|
||||
</style>
|
||||
</head><body>
|
||||
<h1 id="docHdrHdln">UAC plug-in</h1>
|
||||
|
||||
|
||||
<code><pre>
|
||||
Interactive User (MediumIL) Admin user(HighIL)
|
||||
+++[Setup.exe]++++++++++++++ +++[Setup.exe]++++++++++++++
|
||||
+ + + +
|
||||
+ ***[.OnInit]************ + + ***[.OnInit]************ +
|
||||
+ * UAC::RunElevated >---+-+------>+ * * +
|
||||
+ * NSIS.Quit() * + + * * +
|
||||
+ ************************ + + ***********||*********** +
|
||||
+ + + || +
|
||||
+ + + \/ +
|
||||
+ ***[Sections]*********** + + ***[Sections]*********** +
|
||||
+ * * + /--+-+-< UAC::Exec * +
|
||||
+ ************************ + | + ************************ +
|
||||
+ + | + +
|
||||
+ Win32.CreateProcess() <-+----/ + +
|
||||
+ + + +
|
||||
++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++
|
||||
</pre></code>
|
||||
|
||||
|
||||
<h2>Contents</h2>
|
||||
<ul>
|
||||
<li><a href="#exports">Plugin Functions</a>
|
||||
<li><a href="#lang">Language support</a>
|
||||
<li><a href="#knownissues">Known Issues</a>
|
||||
<li><a href="#glossary">Glossary</a>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="exports"><h2>Plugin Functions</h2></a><div class="CntSec"><p>
|
||||
Every function will try to emulate the basic NSIS instruction (of similar name) when UAC::RunElevated has not "succeeded" or running on a system that does not support elevation (Win9x/NT4)</p>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::RunElevated</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code (0 on success, 1223 if user aborted elevation dialog, anything else should be treated as a fatal error)</td></tr>
|
||||
<tr><td><span class="nsisvar">$1</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0</span>:
|
||||
<table class="ret">
|
||||
<tr><td>0</td><td>UAC is not supported by the OS</td></tr>
|
||||
<tr><td>1</td><td>Started a elevated child process, the current process should act like a wrapper (Call Quit without any further processing)</td></tr>
|
||||
<tr><td>2</td><td>The process is already running @ HighIL (Member of admin group)</td></tr>
|
||||
<tr><td>3</td><td>You should call RunElevated again (This can happen if a user without admin priv. is used in the runas dialog)</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
<tr><td><span class="nsisvar">$2</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0 && <span class="nsisvar">$1</span>==1</span>: ExitCode of the elevated fork process (The NSIS errlvl is also set)</td></tr>
|
||||
<tr><td><span class="nsisvar">$3</span></td><td><span class="code">If <span class="nsisvar">$0</span>==0</span>: 1 if the user is a member of the admin group or 0 otherwise</td></tr>
|
||||
</table></td></tr>
|
||||
<tr><td>Description:</td><td>Allows non-admin/UAC.LUA users to re-spawn the installer as another user and UAC.Admin users to elevate.</td></tr>
|
||||
</table>
|
||||
<!--table class="piexport"><tr><th colspan=2>UAC::RunElevatedAndProcessMessages <i style="font-size:smaller;">(Experimental)</i></th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td><i>See UAC::RunElevated</i></td></tr>
|
||||
<tr><td>Description:</td><td>Version of UAC::RunElevated that can be called from a page</td></tr>
|
||||
</table-->
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::Unload</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td></td></tr>
|
||||
<tr><td>Description:</td><td>Cleanup, you must call this function in .OnInstFailed, .onUserAbort and .OnInstSuccess</td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr>
|
||||
<th colspan=2>UAC::Exec</th></tr>
|
||||
<tr><td>Parameters:</td><td><INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
|
||||
</table></td></tr>
|
||||
</table>
|
||||
<table class="piexport"><tr>
|
||||
<th colspan=2>UAC::ExecWait</th></tr>
|
||||
<tr><td>Parameters:</td><td><INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
|
||||
<tr><td><span class="nsisvar">$1</span></td><td>Exitcode of new process</td></tr>
|
||||
</table></td></tr>
|
||||
</table>
|
||||
<table class="piexport"><tr>
|
||||
<th colspan=2>UAC::ShellExec</th></tr>
|
||||
<tr><td>Parameters:</td><td><STR:Verb> <INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
|
||||
</table></td></tr>
|
||||
</table>
|
||||
<table class="piexport"><tr>
|
||||
<th colspan=2>UAC::ShellExecWait</th></tr>
|
||||
<tr><td>Parameters:</td><td><STR:Verb> <INT:ShowWindow> <STR:App> <STR:Parameters> <STR:WorkingDir></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td>Win32 error code, 0 on success (ErrorFlag is also set on error)</td></tr>
|
||||
<tr><td><span class="nsisvar">$1</span></td><td>Exitcode of new process</td></tr>
|
||||
</table></td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::IsAdmin</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> (BOOL) result</td></tr>
|
||||
<tr><td>Description:</td><td>Check current thread/process token for a non-deny admin group SID entry</td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::ExecCodeSegment</th></tr>
|
||||
<tr><td>Parameters:</td><td><INT:NSISFunctionAddress></td></tr>
|
||||
<tr><td>Returns:</td><td>[None] (ErrorFlag is set on error)</td></tr>
|
||||
<tr><td>Description:</td><td>Calls NSIS function in LUA/outer instance (If you use instructions that alter the UI or the stack/variables in the code segment (StrCpy,Push/Pop/Exch,DetailPrint etc.) they will affect the hidden wrapper installer and not "your" installer instance)</td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::StackPush</th></tr>
|
||||
<tr><td>Parameters:</td><td><STR:String></td></tr>
|
||||
<tr><td>Returns:</td><td>[None] (ErrorFlag is set on error)</td></tr>
|
||||
<tr><td>Description:</td><td>Push to outer instance stack (For use with UAC::ExecCodeSegment)</td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::GetOuterHwnd</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> HWNDPARENT of outer instance</td></tr>
|
||||
<tr><td>Description:</td><td>For use with ${UAC.RunElevatedAndProcessMessages}</td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::SupportsUAC</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td><span class="nsisvar">$0</span> !=0 if supported</td></tr>
|
||||
<tr><td>Description:</td><td>Check if the OS supports UAC (And the user has UAC turned on) <span class="importanttxt">This function only tests if UAC is active, will return 0 on NT5 even though runas is implemented on those platforms, will also return 0 on NT6+ if UAC is off. You should only call this function during testing, NOT to determine if you can call UAC::RunElevated</span></td></tr>
|
||||
</table>
|
||||
|
||||
<table class="piexport"><tr><th colspan=2>UAC::GetElevationType</th></tr>
|
||||
<tr><td>Parameters:</td><td></td></tr>
|
||||
<tr><td>Returns:</td><td>
|
||||
<table class="ret">
|
||||
<tr><td><span class="nsisvar">$0</span></td><td><a href="#" OnClick="return NavGL('TOKEN_ELEVATION_TYPE Enumeration')">TOKEN_ELEVATION_TYPE</a>:
|
||||
<table class="ret">
|
||||
<tr><td>0</td><td>Unsupported/Failed (ErrorFlag is also set)</td></tr>
|
||||
<tr><td>1</td><td>TokenElevationTypeDefault: User is not using a split token (UAC disabled)</td></tr>
|
||||
<tr><td>2</td><td>TokenElevationTypeFull: UAC enabled, the (current) process is elevated</td></tr>
|
||||
<tr><td>3</td><td>TokenElevationTypeLimited: UAC enabled, the process is not elevated</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table></td></tr>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a name="lang"><h2>Language support</h2></a><div class="CntSec">
|
||||
<p>If the plugin is built with FEAT_CUSTOMRUNASDLG_TRANSLATE (Enabled by default),
|
||||
you can extract a file named <span class="str">UAC.LNG</span> to <span class="nsisvar">$pluginsdir</span>.
|
||||
It is a ini file with the following sections:
|
||||
</p><pre class="inifile">
|
||||
[MyRunAsCfg]
|
||||
<span class="inicomment">;Set to 1 to disable the radio button</span>
|
||||
DisableCurrUserOpt=
|
||||
<span class="inicomment">;Set to 1 to hide the radio button</span>
|
||||
HideCurrUserOpt=
|
||||
|
||||
[MyRunAsStrings]
|
||||
DlgTitle=Hello There!
|
||||
HelpText=Just do your thing!
|
||||
<span class="inicomment">;Label for current user radio button, %s is replaced with result of GetUserNameEx(NameSamCompatible,...)</span>
|
||||
OptCurrUser=Self service (%s)
|
||||
OptOtherUser=Run as someone:
|
||||
UserName=Who:
|
||||
Pwd=PIN:
|
||||
OK=Okey!
|
||||
Cancel=No Way</pre>
|
||||
</div>
|
||||
|
||||
<a name="knownissues"><h2>Known Issues</h2></a><div class="CntSec">
|
||||
<ul>
|
||||
<li>UACPI.KI#1: DetailPrint in outer process is ignored
|
||||
<li>UACPI.KI#2: Elevation can fail if the installer is located on a remote share that requires authentication
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
<a name="glossary"><h2>Glossary</h2></a><div class="CntSec">
|
||||
<ul>
|
||||
<li>AAM: Admin Approval Mode
|
||||
<li>IL: Integrity level (Part of the new MIC/WIC security levels added to NT6)
|
||||
<li>LUA: Limited/Least-privilege User Account
|
||||
<li>MIC: <a href="http://en.wikipedia.org/wiki/Mandatory_Integrity_Control">Mandatory Integrity Controls</a> (Now known as WIC)
|
||||
<li>UAC: User Account Control (Part of the UAP umbrella)
|
||||
<li>UAP: User Account Protection
|
||||
<li>WIC: <a href="http://www.securityfocus.com/infocus/1887">Windows Integrity Controls</a>
|
||||
<li>Win32 error code: Standard windows error codes, ERROR_???
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</body></html>
|
|
@ -0,0 +1,133 @@
|
|||
# Microsoft Developer Studio Project File - Name="UAC" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=UAC - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "UAC.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "UAC.mak" CFG="UAC - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "UAC - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "UAC - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "UAC - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UAC_EXPORTS" /YX /FD /c
|
||||
# ADD CPP /nologo /Gz /MD /W3 /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UAC_EXPORTS" /YX /FD /c
|
||||
# SUBTRACT CPP /Fr
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x414 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
# SUBTRACT LINK32 /map
|
||||
|
||||
!ELSEIF "$(CFG)" == "UAC - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UAC_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "UAC_EXPORTS" /YX /FD /GZ /c
|
||||
# SUBTRACT CPP /Fr
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x414 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "UAC - Win32 Release"
|
||||
# Name "UAC - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\RunAs.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\uac.cpp
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\NSISUtil.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\uac.h
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\resource.rc
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Other"
|
||||
|
||||
# PROP Default_Filter "txt"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\History.txt
|
||||
# End Source File
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
|
@ -0,0 +1,29 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "UAC"=".\UAC.dsp" - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
//{{NO_DEPENDENCIES}}
|
||||
// Microsoft Developer Studio generated include file.
|
||||
// Used by resource.rc
|
||||
//
|
||||
#define IDD_MYRUNAS 101
|
||||
#define IDC_RUNASCURR 1000
|
||||
#define IDC_RUNASSPEC 1001
|
||||
#define IDC_SHICON 1002
|
||||
#define IDC_HELPTEXT 1003
|
||||
#define IDC_USERNAME 1004
|
||||
#define IDC_PASSWORD 1005
|
||||
#define IDC_LBLUSER 1007
|
||||
#define IDC_LBLPWD 1008
|
||||
|
||||
// Next default values for new objects
|
||||
//
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||
#define _APS_NEXT_RESOURCE_VALUE 102
|
||||
#define _APS_NEXT_COMMAND_VALUE 40001
|
||||
#define _APS_NEXT_CONTROL_VALUE 1009
|
||||
#define _APS_NEXT_SYMED_VALUE 101
|
||||
#endif
|
||||
#endif
|
|
@ -0,0 +1,109 @@
|
|||
//Microsoft Developer Studio generated resource script.
|
||||
//
|
||||
#include "resource.h"
|
||||
|
||||
#define APSTUDIO_READONLY_SYMBOLS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 2 resource.
|
||||
//
|
||||
#include "afxres.h"
|
||||
#include "uac.h"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#undef APSTUDIO_READONLY_SYMBOLS
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// English (U.S.) resources
|
||||
|
||||
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
|
||||
#ifdef _WIN32
|
||||
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
#pragma code_page(1252)
|
||||
#endif //_WIN32
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Dialog
|
||||
//
|
||||
|
||||
IDD_MYRUNAS DIALOG DISCARDABLE 0, 0, 250, 145
|
||||
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_SETFOREGROUND | DS_FIXEDSYS |
|
||||
DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||
FONT 8, "MS Shell Dlg"
|
||||
BEGIN
|
||||
DEFPUSHBUTTON "&OK",IDOK,132,122,50,14
|
||||
PUSHBUTTON "Ca&ncel",IDCANCEL,188,122,50,14
|
||||
ICON "",IDC_SHICON,7,7,20,20
|
||||
LTEXT "",IDC_HELPTEXT,34,7,204,35
|
||||
CONTROL "",IDC_RUNASCURR,"Button",BS_AUTORADIOBUTTON,20,49,218,
|
||||
10
|
||||
CONTROL "",IDC_RUNASSPEC,"Button",BS_AUTORADIOBUTTON,20,65,218,
|
||||
10
|
||||
LTEXT "&User name:",IDC_LBLUSER,20,84,42,16
|
||||
EDITTEXT IDC_USERNAME,63,83,175,14,ES_AUTOHSCROLL
|
||||
LTEXT "&Password:",IDC_LBLPWD,20,102,42,20
|
||||
EDITTEXT IDC_PASSWORD,63,100,175,14,ES_PASSWORD | ES_AUTOHSCROLL
|
||||
END
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// DESIGNINFO
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
GUIDELINES DESIGNINFO DISCARDABLE
|
||||
BEGIN
|
||||
IDD_MYRUNAS, DIALOG
|
||||
BEGIN
|
||||
LEFTMARGIN, 7
|
||||
RIGHTMARGIN, 238
|
||||
TOPMARGIN, 7
|
||||
BOTTOMMARGIN, 136
|
||||
END
|
||||
END
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// TEXTINCLUDE
|
||||
//
|
||||
|
||||
1 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"resource.h\0"
|
||||
END
|
||||
|
||||
2 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"#include ""afxres.h""\r\n"
|
||||
"#include ""uac.h""\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
3 TEXTINCLUDE DISCARDABLE
|
||||
BEGIN
|
||||
"\r\n"
|
||||
"\0"
|
||||
END
|
||||
|
||||
#endif // APSTUDIO_INVOKED
|
||||
|
||||
#endif // English (U.S.) resources
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifndef APSTUDIO_INVOKED
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Generated from the TEXTINCLUDE 3 resource.
|
||||
//
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
#endif // not APSTUDIO_INVOKED
|
||||
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,141 @@
|
|||
//Copyright (C) 2007 Anders Kjersem. Licensed under the zlib/libpng license, see License.txt for details.
|
||||
#pragma once
|
||||
/** /#define BUILD_DBGRELEASE // Include simple debug output in release version */
|
||||
/** /#define BUILD_DBGSELECTELVMODE //Test MyRunAs in release builds*/
|
||||
|
||||
/**/#define UNICODE // Unicode build */
|
||||
/**/#define FEAT_CUSTOMRUNASDLG // Include custom runas dialog */
|
||||
/**/#define FEAT_CUSTOMRUNASDLG_TRANSLATE //*/
|
||||
/**/#define FEAT_MSRUNASDLGMODHACK // Default to other user radio button */
|
||||
|
||||
|
||||
#if !defined(APSTUDIO_INVOKED) && !defined(RC_INVOKED)
|
||||
|
||||
#if (defined(_MSC_VER) && !defined(_DEBUG))
|
||||
#pragma comment(linker,"/opt:nowin98")
|
||||
#pragma comment(linker,"/ignore:4078")
|
||||
#pragma comment(linker,"/merge:.rdata=.text")
|
||||
|
||||
//#pragma intrinsic(memset) //http://www.codeguru.com/forum/showthread.php?t=371491&page=2&pp=15 | http://www.ddj.com/windows/184416623
|
||||
#endif
|
||||
|
||||
#if defined(UNICODE) && !defined(_UNICODE)
|
||||
#define _UNICODE
|
||||
#endif
|
||||
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <ShellAPI.h>
|
||||
#include <TChar.h>
|
||||
#include "NSISUtil.h"
|
||||
|
||||
#ifndef SEE_MASK_NOZONECHECKS
|
||||
#define SEE_MASK_NOZONECHECKS 0x00800000
|
||||
#endif
|
||||
|
||||
#define COUNTOF(___c) ( sizeof(___c)/sizeof(___c[0]) )
|
||||
#ifndef ARRAYSIZE
|
||||
#define ARRAYSIZE COUNTOF
|
||||
#endif
|
||||
#define FORCEINLINE __forceinline
|
||||
|
||||
#if _MSC_VER >= 1400
|
||||
extern void* __cdecl memset(void*mem,int c,size_t len);
|
||||
#endif
|
||||
|
||||
FORCEINLINE LRESULT MySndDlgItemMsg(HWND hDlg,int id,UINT Msg,WPARAM wp=0,LPARAM lp=0) {return SendMessage(GetDlgItem(hDlg,id),Msg,wp,lp);}
|
||||
|
||||
|
||||
//DelayLoaded functions:
|
||||
typedef BOOL (WINAPI*ALLOWSETFOREGROUNDWINDOW)(DWORD dwProcessId);
|
||||
typedef BOOL (WINAPI*OPENPROCESSTOKEN)(HANDLE ProcessHandle,DWORD DesiredAccess,PHANDLE TokenHandle);
|
||||
typedef BOOL (WINAPI*OPENTHREADTOKEN)(HANDLE ThreadHandle,DWORD DesiredAccess,BOOL OpenAsSelf,PHANDLE TokenHandle);
|
||||
typedef BOOL (WINAPI*GETTOKENINFORMATION)(HANDLE hToken,TOKEN_INFORMATION_CLASS TokInfoClass,LPVOID TokInfo,DWORD TokInfoLenh,PDWORD RetLen);
|
||||
typedef BOOL (WINAPI*ALLOCATEANDINITIALIZESID)(PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,BYTE nSubAuthorityCount,DWORD sa0,DWORD sa1,DWORD sa2,DWORD sa3,DWORD sa4,DWORD sa5,DWORD sa6,DWORD sa7,PSID*pSid);
|
||||
typedef PVOID (WINAPI*FREESID)(PSID pSid);
|
||||
typedef BOOL (WINAPI*EQUALSID)(PSID pSid1,PSID pSid2);
|
||||
typedef BOOL (WINAPI*CHECKTOKENMEMBERSHIP)(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember);
|
||||
#ifdef FEAT_CUSTOMRUNASDLG
|
||||
typedef BOOL (WINAPI*GETUSERNAME)(LPTSTR lpBuffer,LPDWORD nSize);
|
||||
typedef BOOL (WINAPI*CREATEPROCESSWITHLOGONW)(LPCWSTR lpUsername,LPCWSTR lpDomain,LPCWSTR lpPassword,DWORD dwLogonFlags,LPCWSTR lpApplicationName,LPWSTR lpCommandLine,DWORD dwCreationFlags,LPVOID pEnv,LPCWSTR WorkDir,LPSTARTUPINFOW pSI,LPPROCESS_INFORMATION pPI);
|
||||
#define SECURITY_WIN32
|
||||
#include <Security.h>//NameSamCompatible
|
||||
typedef BOOLEAN (WINAPI*GETUSERNAMEEX)(EXTENDED_NAME_FORMAT NameFormat,LPTSTR lpNameBuffer,PULONG nSize);
|
||||
#endif
|
||||
#ifdef UAC_INITIMPORTS
|
||||
ALLOWSETFOREGROUNDWINDOW _AllowSetForegroundWindow=0;
|
||||
OPENPROCESSTOKEN _OpenProcessToken=0;
|
||||
OPENTHREADTOKEN _OpenThreadToken=0;
|
||||
GETTOKENINFORMATION _GetTokenInformation=0;
|
||||
ALLOCATEANDINITIALIZESID _AllocateAndInitializeSid=0;
|
||||
FREESID _FreeSid=0;
|
||||
EQUALSID _EqualSid=0;
|
||||
CHECKTOKENMEMBERSHIP _CheckTokenMembership=0;
|
||||
#ifdef FEAT_CUSTOMRUNASDLG
|
||||
GETUSERNAME _GetUserName=0;
|
||||
GETUSERNAMEEX _GetUserNameEx=0;
|
||||
CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW=0;
|
||||
#endif
|
||||
#else
|
||||
#ifdef FEAT_CUSTOMRUNASDLG
|
||||
extern GETUSERNAME _GetUserName;
|
||||
extern GETUSERNAMEEX _GetUserNameEx;
|
||||
extern CREATEPROCESSWITHLOGONW _CreateProcessWithLogonW;
|
||||
#endif
|
||||
#endif /* UAC_INITIMPORTS */
|
||||
|
||||
|
||||
extern DWORD DelayLoadDlls();
|
||||
#ifdef FEAT_CUSTOMRUNASDLG
|
||||
extern DWORD MyRunAs(HINSTANCE hInstDll,SHELLEXECUTEINFO&sei);
|
||||
#endif
|
||||
|
||||
#if !defined(NTDDI_VISTA) || defined(BUILD_OLDSDK)
|
||||
//#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < 0x06000000) || !defined(NTDDI_VISTA)
|
||||
//#if !defined(TOKEN_ELEVATION_TYPE) || defined(BUILD_OLDSDK)
|
||||
enum TOKEN_ELEVATION_TYPE {
|
||||
TokenElevationTypeDefault = 1,
|
||||
TokenElevationTypeFull,
|
||||
TokenElevationTypeLimited
|
||||
};
|
||||
enum _TOKEN_INFORMATION_CLASS___VISTA {
|
||||
TokenElevationType = (TokenOrigin+1),
|
||||
TokenLinkedToken,
|
||||
TokenElevation,
|
||||
TokenHasRestrictions,
|
||||
TokenAccessInformation,
|
||||
TokenVirtualizationAllowed,
|
||||
TokenVirtualizationEnabled,
|
||||
TokenIntegrityLevel,
|
||||
TokenUIAccess,
|
||||
TokenMandatoryPolicy,
|
||||
TokenLogonSid,
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(_DEBUG) || defined(BUILD_DBGRELEASE)
|
||||
//Simple debug helpers:
|
||||
#define BUILD_DBG
|
||||
/** /#define BUILD_XPTEST //Pretend UAC exists and "elevate" with NT runas */
|
||||
#define DBG_RESETDBGVIEW() do{HWND hDbgView=FindWindowA("dbgviewClass",0);PostMessage(hDbgView,WM_COMMAND,40020,0);if(0)SetForegroundWindow(hDbgView);}while(0)
|
||||
#define _pp_MakeStr_(x) #x
|
||||
#define pp_MakeStr(x) _pp_MakeStr_(x)
|
||||
#define TRACE OutputDebugStringA
|
||||
#define DBGONLY(_x) _x
|
||||
#ifndef ASSERT
|
||||
#define ASSERT(_x) do{if(!(_x)){MessageBoxA(GetActiveWindow(),#_x##"\n\n"##__FILE__##":"## pp_MakeStr(__LINE__),"SimpleAssert",0);/*TRACE(#_x##"\n"##__FILE__##":" pp_MakeStr(__LINE__)"\n");*/}}while(0)
|
||||
#endif
|
||||
#define VERIFY(_x) ASSERT(_x)
|
||||
static void TRACEF(const char*fmt,...) {va_list a;va_start(a,fmt);static TCHAR b[1024*4];if (sizeof(TCHAR)!=sizeof(char)){static TCHAR fmtBuf[COUNTOF(b)];VERIFY(wsprintf(fmtBuf,_T("%hs"),fmt)<COUNTOF(fmtBuf));fmt=(LPCSTR)fmtBuf;}wvsprintf(b,(TCHAR*)fmt,a);OutputDebugString(b);}
|
||||
#else
|
||||
#define TRACE /*(void)0*/
|
||||
#define DBGONLY(_x)
|
||||
#define ASSERT(_x)
|
||||
#define VERIFY(_x) ((void)(_x))
|
||||
#define TRACEF TRACE
|
||||
#endif /* DEBUG */
|
||||
|
||||
#endif /* APSTUDIO_INVOKED */
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
*****************************************************************
|
||||
*** nsProcess NSIS plugin v1.5 ***
|
||||
*****************************************************************
|
||||
|
||||
2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru)
|
||||
|
||||
Source function FIND_PROC_BY_NAME based
|
||||
upon the Ravi Kochhar (kochhar@physiology.wisc.edu) code
|
||||
Thanks iceman_k (FindProcDLL plugin) and
|
||||
DITMan (KillProcDLL plugin) for direct me
|
||||
|
||||
|
||||
Features:
|
||||
- Find a process by name
|
||||
- Kill a process by name
|
||||
- Kill all processes with specified name (not only one)
|
||||
- The process name is case-insensitive
|
||||
- Win95/98/ME/NT/2000/XP support
|
||||
- Small plugin size (4 Kb)
|
||||
|
||||
|
||||
**** Find process ****
|
||||
${nsProcess::FindProcess} "[file.exe]" $var
|
||||
|
||||
"[file.exe]" - Process name (e.g. "notepad.exe")
|
||||
|
||||
$var 0 Success
|
||||
603 Process was not currently running
|
||||
604 Unable to identify system type
|
||||
605 Unsupported OS
|
||||
606 Unable to load NTDLL.DLL
|
||||
607 Unable to get procedure address from NTDLL.DLL
|
||||
608 NtQuerySystemInformation failed
|
||||
609 Unable to load KERNEL32.DLL
|
||||
610 Unable to get procedure address from KERNEL32.DLL
|
||||
611 CreateToolhelp32Snapshot failed
|
||||
|
||||
|
||||
**** Kill process ****
|
||||
${nsProcess::KillProcess} "[file.exe]" $var
|
||||
|
||||
"[file.exe]" - Process name (e.g. "notepad.exe")
|
||||
|
||||
$var 0 Success
|
||||
601 No permission to terminate process
|
||||
602 Not all processes terminated successfully
|
||||
603 Process was not currently running
|
||||
604 Unable to identify system type
|
||||
605 Unsupported OS
|
||||
606 Unable to load NTDLL.DLL
|
||||
607 Unable to get procedure address from NTDLL.DLL
|
||||
608 NtQuerySystemInformation failed
|
||||
609 Unable to load KERNEL32.DLL
|
||||
610 Unable to get procedure address from KERNEL32.DLL
|
||||
611 CreateToolhelp32Snapshot failed
|
||||
|
||||
|
||||
**** Unload plugin ****
|
||||
${nsProcess::Unload}
|
|
@ -0,0 +1,820 @@
|
|||
/*****************************************************************
|
||||
* Conversion functions header v1.9 *
|
||||
* *
|
||||
* 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) *
|
||||
* *
|
||||
* *
|
||||
*Functions (ALLCONVFUNC): *
|
||||
* xatoi, xatoiW, xitoa, xitoaW, xatoui, xatouiW, *
|
||||
* xuitoa, xuitoaW, xatoi64, xatoi64W, xi64toa, xi64toaW, *
|
||||
* hex2dec, hex2decW, dec2hex, dec2hexW *
|
||||
* *
|
||||
*Special functions (ALLCONVFUNCS): *
|
||||
* str2hex, hex2str *
|
||||
* *
|
||||
*****************************************************************/
|
||||
|
||||
#ifndef _CONVFUNC_
|
||||
#define _CONVFUNC_
|
||||
|
||||
int xatoi(char *str);
|
||||
int xatoiW(wchar_t *wstr);
|
||||
char* xitoa(int number, char *str, int width);
|
||||
wchar_t* xitoaW(int number, wchar_t *wstr, int width);
|
||||
unsigned int xatoui(char *str);
|
||||
unsigned int xatouiW(wchar_t *wstr);
|
||||
char* xuitoa(unsigned int number, char *str, int width);
|
||||
wchar_t* xuitoaW(unsigned int number, wchar_t *wstr, int width);
|
||||
__int64 xatoi64(char *str);
|
||||
__int64 xatoi64W(wchar_t *wstr);
|
||||
char* xi64toa(__int64 number, char *str, int width);
|
||||
wchar_t* xi64toaW(__int64 number, wchar_t *wstr, int width);
|
||||
int hex2dec(char *hex);
|
||||
int hex2decW(wchar_t *whex);
|
||||
void dec2hex(unsigned int dec, char *hex, BOOL lowercase, unsigned int width);
|
||||
void dec2hexW(unsigned int dec, wchar_t *whex, BOOL lowercase, unsigned int width);
|
||||
|
||||
void str2hex(unsigned char *str, char *hex, BOOL lowercase, unsigned int bytes);
|
||||
void hex2str(char *hex, char *str);
|
||||
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xatoi
|
||||
*
|
||||
*Converts string to int.
|
||||
*
|
||||
*[in] char *str -string number
|
||||
*
|
||||
*Returns: integer
|
||||
*
|
||||
*Examples:
|
||||
* xatoi("45") == 45;
|
||||
* xatoi(" -0045:value") == -45;
|
||||
********************************************************************/
|
||||
#if defined xatoi || defined ALLCONVFUNC
|
||||
#define xatoi_INCLUDED
|
||||
#undef xatoi
|
||||
int xatoi(char *str)
|
||||
{
|
||||
int nNumber=0;
|
||||
BOOL bMinus=FALSE;
|
||||
|
||||
while (*str == ' ')
|
||||
++str;
|
||||
if (*str == '+')
|
||||
++str;
|
||||
else if (*str == '-')
|
||||
{
|
||||
bMinus=TRUE;
|
||||
++str;
|
||||
}
|
||||
for (; *str != '\0' && *str >= '0' && *str <= '9'; ++str)
|
||||
nNumber=(nNumber * 10) + (*str - '0');
|
||||
if (bMinus == TRUE)
|
||||
nNumber=0 - nNumber;
|
||||
return nNumber;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xatoiW
|
||||
*
|
||||
*Converts unicode string to int.
|
||||
*
|
||||
*[in] wchar_t *wstr -string number
|
||||
*
|
||||
*Returns: integer
|
||||
*
|
||||
*Examples:
|
||||
* xatoiW(L"45") == 45;
|
||||
* xatoiW(L" -0045:value") == -45;
|
||||
********************************************************************/
|
||||
#if defined xatoiW || defined ALLCONVFUNC
|
||||
#define xatoiW_INCLUDED
|
||||
#undef xatoiW
|
||||
int xatoiW(wchar_t *wstr)
|
||||
{
|
||||
int nNumber=0;
|
||||
BOOL bMinus=FALSE;
|
||||
|
||||
while (*wstr == ' ')
|
||||
++wstr;
|
||||
if (*wstr == '+')
|
||||
++wstr;
|
||||
else if (*wstr == '-')
|
||||
{
|
||||
bMinus=TRUE;
|
||||
++wstr;
|
||||
}
|
||||
for (; *wstr != '\0' && *wstr >= '0' && *wstr <= '9'; ++wstr)
|
||||
nNumber=(nNumber * 10) + (*wstr - '0');
|
||||
if (bMinus == TRUE)
|
||||
nNumber=0 - nNumber;
|
||||
return nNumber;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xitoa [API: wsprintf(szResult, "%d", 45)]
|
||||
*
|
||||
*Converts int to string.
|
||||
*
|
||||
*[in] int number -integer
|
||||
*[out] char *str -string number
|
||||
*[in] int width -minimum number of characters to the output
|
||||
*
|
||||
*Returns: a pointer to string
|
||||
*
|
||||
*Examples:
|
||||
* xitoa(45, szResult, 0); //szResult == "45"
|
||||
* xitoa(-45, szResult, 0); //szResult == "-45"
|
||||
* xitoa(45, szResult, 4); //szResult == "0045"
|
||||
********************************************************************/
|
||||
#if defined xitoa || defined ALLCONVFUNC
|
||||
#define xitoa_INCLUDED
|
||||
#undef xitoa
|
||||
char* xitoa(int number, char *str, int width)
|
||||
{
|
||||
char tmp[128]="";
|
||||
int a=0;
|
||||
int b=0;
|
||||
|
||||
if (number == 0)
|
||||
{
|
||||
str[0]='0';
|
||||
--width;
|
||||
b=1;
|
||||
}
|
||||
else if (number < 0)
|
||||
{
|
||||
str[0]='-';
|
||||
number=0 - number;
|
||||
--width;
|
||||
b=1;
|
||||
}
|
||||
for (tmp[a]='\0'; number != 0; ++a)
|
||||
{
|
||||
tmp[a]=(number % 10) + '0';
|
||||
number=number / 10;
|
||||
}
|
||||
for (; width > a; ++a) tmp[a]='0';
|
||||
for (--a; a >= 0; --a, ++b) str[b]=tmp[a];
|
||||
|
||||
str[b]='\0';
|
||||
return str;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xitoaW [API: wsprintfW(wszResult, L"%d", 45)]
|
||||
*
|
||||
*Converts int to unicode string.
|
||||
*
|
||||
*[in] int number -integer
|
||||
*[out] wchar_t *wstr -unicode string number
|
||||
*[in] int width -minimum number of characters to the output
|
||||
*
|
||||
*Returns: a pointer to unicode string
|
||||
*
|
||||
*Examples:
|
||||
* xitoaW(45, wszResult, 0); //wszResult == L"45"
|
||||
* xitoaW(-45, wszResult, 0); //wszResult == L"-45"
|
||||
* xitoaW(45, wszResult, 4); //wszResult == L"0045"
|
||||
********************************************************************/
|
||||
#if defined xitoaW || defined ALLCONVFUNC
|
||||
#define xitoaW_INCLUDED
|
||||
#undef xitoaW
|
||||
wchar_t* xitoaW(int number, wchar_t *wstr, int width)
|
||||
{
|
||||
wchar_t wtmp[128]=L"";
|
||||
int a=0;
|
||||
int b=0;
|
||||
|
||||
if (number == 0)
|
||||
{
|
||||
wstr[0]='0';
|
||||
--width;
|
||||
b=1;
|
||||
}
|
||||
else if (number < 0)
|
||||
{
|
||||
wstr[0]='-';
|
||||
number=0 - number;
|
||||
--width;
|
||||
b=1;
|
||||
}
|
||||
for (wtmp[a]='\0'; number != 0; ++a)
|
||||
{
|
||||
wtmp[a]=(number % 10) + '0';
|
||||
number=number / 10;
|
||||
}
|
||||
for (; width > a; ++a) wtmp[a]='0';
|
||||
for (--a; a >= 0; --a, ++b) wstr[b]=wtmp[a];
|
||||
|
||||
wstr[b]='\0';
|
||||
return wstr;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xatoui
|
||||
*
|
||||
*Converts string to unsigned int.
|
||||
*
|
||||
*[in] char *str -string number
|
||||
*
|
||||
*Returns: unsigned integer
|
||||
*
|
||||
*Examples:
|
||||
* xatoui("45") == 45;
|
||||
* xatoui(" -0045:value") == 0;
|
||||
********************************************************************/
|
||||
#if defined xatoui || defined ALLCONVFUNC
|
||||
#define xatoui_INCLUDED
|
||||
#undef xatoui
|
||||
unsigned int xatoui(char *str)
|
||||
{
|
||||
unsigned int nNumber=0;
|
||||
|
||||
while (*str == ' ')
|
||||
++str;
|
||||
if (*str == '+')
|
||||
++str;
|
||||
else if (*str == '-')
|
||||
return 0;
|
||||
for (; *str != '\0' && *str >= '0' && *str <= '9'; ++str)
|
||||
nNumber=(nNumber * 10) + (*str - '0');
|
||||
return nNumber;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xatouiW
|
||||
*
|
||||
*Converts unicode string to unsigned int.
|
||||
*
|
||||
*[in] wchar_t *wstr -unicode string number
|
||||
*
|
||||
*Returns: unsigned integer
|
||||
*
|
||||
*Examples:
|
||||
* xatouiW(L"45") == 45;
|
||||
* xatouiW(L" -0045:value") == 0;
|
||||
********************************************************************/
|
||||
#if defined xatouiW || defined ALLCONVFUNC
|
||||
#define xatouiW_INCLUDED
|
||||
#undef xatouiW
|
||||
unsigned int xatouiW(wchar_t *wstr)
|
||||
{
|
||||
unsigned int nNumber=0;
|
||||
|
||||
while (*wstr == ' ')
|
||||
++wstr;
|
||||
if (*wstr == '+')
|
||||
++wstr;
|
||||
else if (*wstr == '-')
|
||||
return 0;
|
||||
for (; *wstr != '\0' && *wstr >= '0' && *wstr <= '9'; ++wstr)
|
||||
nNumber=(nNumber * 10) + (*wstr - '0');
|
||||
return nNumber;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xuitoa
|
||||
*
|
||||
*Converts unsigned int to string.
|
||||
*
|
||||
*[in] unsigned int number -unsigned integer
|
||||
*[out] char *str -string number
|
||||
*[in] int width -minimum number of characters to the output
|
||||
*
|
||||
*Returns: a pointer to string
|
||||
*
|
||||
*Examples:
|
||||
* xuitoa(45, szResult, 0); //szResult == "45"
|
||||
* xuitoa(45, szResult, 4); //szResult == "0045"
|
||||
********************************************************************/
|
||||
#if defined xuitoa || defined ALLCONVFUNC
|
||||
#define xuitoa_INCLUDED
|
||||
#undef xuitoa
|
||||
char* xuitoa(unsigned int number, char *str, int width)
|
||||
{
|
||||
char tmp[128]="";
|
||||
int a=0;
|
||||
int b=0;
|
||||
|
||||
if (number == 0)
|
||||
{
|
||||
str[0]='0';
|
||||
--width;
|
||||
b=1;
|
||||
}
|
||||
for (tmp[a]='\0'; number != 0; ++a)
|
||||
{
|
||||
tmp[a]=(number % 10) + '0';
|
||||
number=number / 10;
|
||||
}
|
||||
for (; width > a; ++a) tmp[a]='0';
|
||||
for (--a; a >= 0; --a, ++b) str[b]=tmp[a];
|
||||
|
||||
str[b]='\0';
|
||||
return str;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xuitoaW
|
||||
*
|
||||
*Converts unsigned int to unicode string.
|
||||
*
|
||||
*[in] unsigned int number -unsigned integer
|
||||
*[out] wchar_t *wstr -unicode string number
|
||||
*[in] int width -minimum number of characters to the output
|
||||
*
|
||||
*Returns: a pointer to unicode string
|
||||
*
|
||||
*Examples:
|
||||
* xuitoaW(45, wszResult, 0); //wszResult == L"45"
|
||||
* xuitoaW(45, wszResult, 4); //wszResult == L"0045"
|
||||
********************************************************************/
|
||||
#if defined xuitoaW || defined ALLCONVFUNC
|
||||
#define xuitoaW_INCLUDED
|
||||
#undef xuitoaW
|
||||
wchar_t* xuitoaW(unsigned int number, wchar_t *wstr, int width)
|
||||
{
|
||||
wchar_t wtmp[128]=L"";
|
||||
int a=0;
|
||||
int b=0;
|
||||
|
||||
if (number == 0)
|
||||
{
|
||||
wstr[0]='0';
|
||||
--width;
|
||||
b=1;
|
||||
}
|
||||
for (wtmp[a]='\0'; number != 0; ++a)
|
||||
{
|
||||
wtmp[a]=(number % 10) + '0';
|
||||
number=number / 10;
|
||||
}
|
||||
for (; width > a; ++a) wtmp[a]='0';
|
||||
for (--a; a >= 0; --a, ++b) wstr[b]=wtmp[a];
|
||||
|
||||
wstr[b]='\0';
|
||||
return wstr;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xatoi64
|
||||
*
|
||||
*Converts string to int64.
|
||||
*
|
||||
*[in] char *str -string number
|
||||
*
|
||||
*Returns: 64-bit integer
|
||||
*
|
||||
*Examples:
|
||||
* xatoi64("45") == 45;
|
||||
* xatoi64(" -0045:value") == -45;
|
||||
********************************************************************/
|
||||
#if defined xatoi64 || defined ALLCONVFUNC
|
||||
#define xatoi64_INCLUDED
|
||||
#undef xatoi64
|
||||
__int64 xatoi64(char *str)
|
||||
{
|
||||
__int64 nNumber=0;
|
||||
BOOL bMinus=FALSE;
|
||||
|
||||
while (*str == ' ')
|
||||
++str;
|
||||
if (*str == '+')
|
||||
++str;
|
||||
else if (*str == '-')
|
||||
{
|
||||
bMinus=TRUE;
|
||||
++str;
|
||||
}
|
||||
for (; *str != '\0' && *str >= '0' && *str <= '9'; ++str)
|
||||
nNumber=(nNumber * 10) + (*str - '0');
|
||||
if (bMinus == TRUE)
|
||||
nNumber=0 - nNumber;
|
||||
return nNumber;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xatoi64W
|
||||
*
|
||||
*Converts unicode string to int64.
|
||||
*
|
||||
*[in] wchar_t *wstr -unicode string number
|
||||
*
|
||||
*Returns: 64-bit integer
|
||||
*
|
||||
*Examples:
|
||||
* xatoi64W(L"45") == 45;
|
||||
* xatoi64W(L" -0045:value") == -45;
|
||||
********************************************************************/
|
||||
#if defined xatoi64W || defined ALLCONVFUNC
|
||||
#define xatoi64W_INCLUDED
|
||||
#undef xatoi64W
|
||||
__int64 xatoi64W(wchar_t *wstr)
|
||||
{
|
||||
__int64 nNumber=0;
|
||||
BOOL bMinus=FALSE;
|
||||
|
||||
while (*wstr == ' ')
|
||||
++wstr;
|
||||
if (*wstr == '+')
|
||||
++wstr;
|
||||
else if (*wstr == '-')
|
||||
{
|
||||
bMinus=TRUE;
|
||||
++wstr;
|
||||
}
|
||||
for (; *wstr != '\0' && *wstr >= '0' && *wstr <= '9'; ++wstr)
|
||||
nNumber=(nNumber * 10) + (*wstr - '0');
|
||||
if (bMinus == TRUE)
|
||||
nNumber=0 - nNumber;
|
||||
return nNumber;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xitoa64
|
||||
*
|
||||
*Converts int64 to string.
|
||||
*
|
||||
*[in] __int64 number -64-bit integer
|
||||
*[out] char *str -string number
|
||||
*[in] int width -minimum number of characters to the output
|
||||
*
|
||||
*Returns: a pointer to string
|
||||
*
|
||||
*Examples:
|
||||
* xi64toa(45, szResult, 0); //szResult == "45"
|
||||
* xi64toa(-45, szResult, 0); //szResult == "-45"
|
||||
* xi64toa(45, szResult, 4); //szResult == "0045"
|
||||
********************************************************************/
|
||||
#if defined xi64toa || defined ALLCONVFUNC
|
||||
#define xi64toa_INCLUDED
|
||||
#undef xi64toa
|
||||
char* xi64toa(__int64 number, char *str, int width)
|
||||
{
|
||||
char tmp[128]="";
|
||||
int a=0;
|
||||
int b=0;
|
||||
|
||||
if (number == 0)
|
||||
{
|
||||
str[0]='0';
|
||||
--width;
|
||||
b=1;
|
||||
}
|
||||
else if (number < 0)
|
||||
{
|
||||
str[0]='-';
|
||||
number=0 - number;
|
||||
--width;
|
||||
b=1;
|
||||
}
|
||||
for (tmp[a]='\0'; number != 0; ++a)
|
||||
{
|
||||
tmp[a]=(char)((number % 10) + '0');
|
||||
number=number / 10;
|
||||
}
|
||||
for (; width > a; ++a) tmp[a]='0';
|
||||
for (--a; a >= 0; --a, ++b) str[b]=tmp[a];
|
||||
|
||||
str[b]='\0';
|
||||
return str;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* xitoa64W
|
||||
*
|
||||
*Converts int64 to unicode string.
|
||||
*
|
||||
*[in] __int64 number -64-bit integer
|
||||
*[out] wchar_t *wstr -unicode string number
|
||||
*[in] int width -minimum number of characters to the output
|
||||
*
|
||||
*Returns: a pointer to unicode string
|
||||
*
|
||||
*Examples:
|
||||
* xi64toaW(45, wszResult, 0); //wszResult == L"45"
|
||||
* xi64toaW(-45, wszResult, 0); //wszResult == L"-45"
|
||||
* xi64toaW(45, wszResult, 4); //wszResult == L"0045"
|
||||
********************************************************************/
|
||||
#if defined xi64toaW || defined ALLCONVFUNC
|
||||
#define xi64toaW_INCLUDED
|
||||
#undef xi64toaW
|
||||
wchar_t* xi64toaW(__int64 number, wchar_t *wstr, int width)
|
||||
{
|
||||
wchar_t wtmp[128]=L"";
|
||||
int a=0;
|
||||
int b=0;
|
||||
|
||||
if (number == 0)
|
||||
{
|
||||
wstr[0]='0';
|
||||
--width;
|
||||
b=1;
|
||||
}
|
||||
else if (number < 0)
|
||||
{
|
||||
wstr[0]='-';
|
||||
number=0 - number;
|
||||
--width;
|
||||
b=1;
|
||||
}
|
||||
for (wtmp[a]='\0'; number != 0; ++a)
|
||||
{
|
||||
wtmp[a]=(char)((number % 10) + '0');
|
||||
number=number / 10;
|
||||
}
|
||||
for (; width > a; ++a) wtmp[a]='0';
|
||||
for (--a; a >= 0; --a, ++b) wstr[b]=wtmp[a];
|
||||
|
||||
wstr[b]='\0';
|
||||
return wstr;
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* hex2dec
|
||||
*
|
||||
*Converts hex value to decimal.
|
||||
*
|
||||
*[in] char *hex -hex value
|
||||
*
|
||||
*Returns: integer
|
||||
* -1 wrong hex value
|
||||
*
|
||||
*Examples:
|
||||
* hex2dec("A1F") == 2591;
|
||||
********************************************************************/
|
||||
#if defined hex2dec || defined ALLCONVFUNC
|
||||
#define hex2dec_INCLUDED
|
||||
#undef hex2dec
|
||||
int hex2dec(char *hex)
|
||||
{
|
||||
int a;
|
||||
int b=0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
a=*hex++;
|
||||
if (a >= '0' && a <= '9') a-='0';
|
||||
else if (a >= 'a' && a <= 'f') a-='a'-10;
|
||||
else if (a >= 'A' && a <= 'F') a-='A'-10;
|
||||
else return -1;
|
||||
|
||||
if (*hex) b=(b + a) * 16;
|
||||
else return (b + a);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* hex2decW
|
||||
*
|
||||
*Converts unicode hex value to decimal.
|
||||
*
|
||||
*[in] wchar_t *whex -unicode hex value
|
||||
*
|
||||
*Returns: integer
|
||||
* -1 wrong hex value
|
||||
*
|
||||
*Examples:
|
||||
* hex2decW(L"A1F") == 2591;
|
||||
********************************************************************/
|
||||
#if defined hex2decW || defined ALLCONVFUNC
|
||||
#define hex2decW_INCLUDED
|
||||
#undef hex2decW
|
||||
int hex2decW(wchar_t *whex)
|
||||
{
|
||||
int a;
|
||||
int b=0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
a=*whex++;
|
||||
if (a >= '0' && a <= '9') a-='0';
|
||||
else if (a >= 'a' && a <= 'f') a-='a'-10;
|
||||
else if (a >= 'A' && a <= 'F') a-='A'-10;
|
||||
else return -1;
|
||||
|
||||
if (*whex) b=(b + a) * 16;
|
||||
else return (b + a);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* dec2hex [API: wsprintf(szResult, "%02x", 2591)]
|
||||
*
|
||||
*Converts decimal to hex value.
|
||||
*
|
||||
*[in] unsigned int dec -positive integer
|
||||
*[out] char *hex -hex value (output)
|
||||
*[in] BOOL lowercase -if TRUE hexadecimal value in lowercase
|
||||
* if FALSE in uppercase.
|
||||
*[in] unsigned int width -minimum number of characters to the output
|
||||
*
|
||||
*Examples:
|
||||
* dec2hex(2591, szResult, FALSE, 2); //szResult == "A1F"
|
||||
* dec2hex(10, szResult, TRUE, 2); //szResult == "0a"
|
||||
********************************************************************/
|
||||
#if defined dec2hex || defined ALLCONVFUNC
|
||||
#define dec2hex_INCLUDED
|
||||
#undef dec2hex
|
||||
void dec2hex(unsigned int dec, char *hex, BOOL lowercase, unsigned int width)
|
||||
{
|
||||
unsigned int a=dec;
|
||||
unsigned int b=0;
|
||||
unsigned int c=0;
|
||||
char d='1';
|
||||
if (a == 0) d='0';
|
||||
|
||||
while (a)
|
||||
{
|
||||
b=a % 16;
|
||||
a=a / 16;
|
||||
if (b < 10) hex[c++]=b + '0';
|
||||
else if (lowercase == TRUE) hex[c++]=b + 'a' - 10;
|
||||
else hex[c++]=b + 'A' - 10;
|
||||
}
|
||||
while (width > c) hex[c++]='0';
|
||||
hex[c]='\0';
|
||||
|
||||
if (d == '1')
|
||||
for (b=0, --c; b < c; d=hex[b], hex[b++]=hex[c], hex[c--]=d);
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* dec2hexW [API: wsprintfW(wszResult, L"%02x", 2591)]
|
||||
*
|
||||
*Converts decimal to unicode hex value.
|
||||
*
|
||||
*[in] unsigned int dec -positive integer
|
||||
*[out] wchar_t *whex -unicode hex value (output)
|
||||
*[in] BOOL lowercase -if TRUE hexadecimal value in lowercase
|
||||
* if FALSE in uppercase.
|
||||
*[in] unsigned int width -minimum number of characters to the output
|
||||
*
|
||||
*Examples:
|
||||
* dec2hexW(2591, wszResult, FALSE, 2); //wszResult == L"A1F"
|
||||
* dec2hexW(10, wszResult, TRUE, 2); //wszResult == L"0a"
|
||||
********************************************************************/
|
||||
#if defined dec2hexW || defined ALLCONVFUNC
|
||||
#define dec2hexW_INCLUDED
|
||||
#undef dec2hexW
|
||||
void dec2hexW(unsigned int dec, wchar_t *whex, BOOL lowercase, unsigned int width)
|
||||
{
|
||||
unsigned int a=dec;
|
||||
unsigned int b=0;
|
||||
unsigned int c=0;
|
||||
wchar_t d='1';
|
||||
if (a == 0) d='0';
|
||||
|
||||
while (a)
|
||||
{
|
||||
b=a % 16;
|
||||
a=a / 16;
|
||||
if (b < 10) whex[c++]=b + '0';
|
||||
else if (lowercase == TRUE) whex[c++]=b + 'a' - 10;
|
||||
else whex[c++]=b + 'A' - 10;
|
||||
}
|
||||
while (width > c) whex[c++]='0';
|
||||
whex[c]='\0';
|
||||
|
||||
if (d == '1')
|
||||
for (b=0, --c; b < c; d=whex[b], whex[b++]=whex[c], whex[c--]=d);
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* str2hex
|
||||
*
|
||||
*Converts string to hex values.
|
||||
*
|
||||
*[in] unsigned char *str -string
|
||||
*[out] char *hex -hex string
|
||||
*[in] BOOL lowercase -if TRUE hexadecimal value in lowercase
|
||||
* if FALSE in uppercase.
|
||||
*[in] unsigned int bytes -number of bytes in string
|
||||
*
|
||||
*Note:
|
||||
* str2hex uses dec2hex
|
||||
*
|
||||
*Examples:
|
||||
* str2hex((unsigned char *)"Some Text", szResult, TRUE, lstrlen("Some Text")); //szResult == "536f6d652054657874"
|
||||
********************************************************************/
|
||||
#if defined str2hex || defined ALLCONVFUNCS
|
||||
#define str2hex_INCLUDED
|
||||
#undef str2hex
|
||||
void str2hex(unsigned char *str, char *hex, BOOL lowercase, unsigned int bytes)
|
||||
{
|
||||
char a[16];
|
||||
unsigned int b=0;
|
||||
|
||||
for (hex[0]='\0'; b < bytes; ++b)
|
||||
{
|
||||
//wsprintf(a, "%02x", (unsigned int)str[b]);
|
||||
dec2hex((unsigned int)str[b], a, lowercase, 2);
|
||||
lstrcat(hex, a);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/********************************************************************
|
||||
*
|
||||
* hex2str
|
||||
*
|
||||
*Converts hex values to string.
|
||||
*
|
||||
*[in] char *hex -hex string
|
||||
*[out] char *str -string
|
||||
*
|
||||
*Examples:
|
||||
* hex2str("536f6d652054657874", szResult); //szResult == "Some Text"
|
||||
********************************************************************/
|
||||
#if defined hex2str || defined ALLCONVFUNCS
|
||||
#define hex2str_INCLUDED
|
||||
#undef hex2str
|
||||
void hex2str(char *hex, char *str)
|
||||
{
|
||||
char a[4];
|
||||
int b;
|
||||
|
||||
while (*hex)
|
||||
{
|
||||
a[0]=*hex;
|
||||
a[1]=*++hex;
|
||||
a[2]='\0';
|
||||
|
||||
if (*hex++)
|
||||
{
|
||||
if ((b=hex2dec(a)) > 0) *str++=b;
|
||||
else break;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
*str='\0';
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* *
|
||||
* Example *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <stdio.h>
|
||||
#include "ConvFunc.h"
|
||||
|
||||
//insert functions
|
||||
#define xatoi
|
||||
#define xitoa
|
||||
#include "ConvFunc.h"
|
||||
|
||||
void main()
|
||||
{
|
||||
char szResult[MAX_PATH]="43";
|
||||
char *pResult;
|
||||
int nError;
|
||||
|
||||
nError=xatoi(szResult);
|
||||
printf("nError={%d}\n", nError);
|
||||
|
||||
pResult=xitoa(45, szResult, 0);
|
||||
printf("szResult={%s}, pResult={%s}\n", szResult, pResult);
|
||||
}
|
||||
|
||||
*/
|
|
@ -0,0 +1,435 @@
|
|||
/*****************************************************************
|
||||
* nsProcess NSIS plugin v1.5 *
|
||||
* *
|
||||
* 2006 Shengalts Aleksander aka Instructor (Shengalts@mail.ru) *
|
||||
* *
|
||||
* Source function FIND_PROC_BY_NAME based *
|
||||
* upon the Ravi Kochhar (kochhar@physiology.wisc.edu) code *
|
||||
* Thanks iceman_k (FindProcDLL plugin) and *
|
||||
* DITMan (KillProcDLL plugin) for point me up *
|
||||
*****************************************************************/
|
||||
|
||||
#define UNICODE
|
||||
#define _UNICODE
|
||||
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h>
|
||||
#include <Tlhelp32.h>
|
||||
#include "ConvFunc.h"
|
||||
|
||||
/* Defines */
|
||||
#define NSIS_MAX_STRLEN 1024
|
||||
|
||||
#define SystemProcessInformation 5
|
||||
#define STATUS_SUCCESS 0x00000000L
|
||||
#define STATUS_INFO_LENGTH_MISMATCH 0xC0000004L
|
||||
|
||||
typedef struct _SYSTEM_THREAD_INFO {
|
||||
FILETIME ftCreationTime;
|
||||
DWORD dwUnknown1;
|
||||
DWORD dwStartAddress;
|
||||
DWORD dwOwningPID;
|
||||
DWORD dwThreadID;
|
||||
DWORD dwCurrentPriority;
|
||||
DWORD dwBasePriority;
|
||||
DWORD dwContextSwitches;
|
||||
DWORD dwThreadState;
|
||||
DWORD dwUnknown2;
|
||||
DWORD dwUnknown3;
|
||||
DWORD dwUnknown4;
|
||||
DWORD dwUnknown5;
|
||||
DWORD dwUnknown6;
|
||||
DWORD dwUnknown7;
|
||||
} SYSTEM_THREAD_INFO;
|
||||
|
||||
typedef struct _SYSTEM_PROCESS_INFO {
|
||||
DWORD dwOffset;
|
||||
DWORD dwThreadCount;
|
||||
DWORD dwUnkown1[6];
|
||||
FILETIME ftCreationTime;
|
||||
DWORD dwUnkown2;
|
||||
DWORD dwUnkown3;
|
||||
DWORD dwUnkown4;
|
||||
DWORD dwUnkown5;
|
||||
DWORD dwUnkown6;
|
||||
WCHAR *pszProcessName;
|
||||
DWORD dwBasePriority;
|
||||
DWORD dwProcessID;
|
||||
DWORD dwParentProcessID;
|
||||
DWORD dwHandleCount;
|
||||
DWORD dwUnkown7;
|
||||
DWORD dwUnkown8;
|
||||
DWORD dwVirtualBytesPeak;
|
||||
DWORD dwVirtualBytes;
|
||||
DWORD dwPageFaults;
|
||||
DWORD dwWorkingSetPeak;
|
||||
DWORD dwWorkingSet;
|
||||
DWORD dwUnkown9;
|
||||
DWORD dwPagedPool;
|
||||
DWORD dwUnkown10;
|
||||
DWORD dwNonPagedPool;
|
||||
DWORD dwPageFileBytesPeak;
|
||||
DWORD dwPageFileBytes;
|
||||
DWORD dwPrivateBytes;
|
||||
DWORD dwUnkown11;
|
||||
DWORD dwUnkown12;
|
||||
DWORD dwUnkown13;
|
||||
DWORD dwUnkown14;
|
||||
SYSTEM_THREAD_INFO ati[ANYSIZE_ARRAY];
|
||||
} SYSTEM_PROCESS_INFO;
|
||||
|
||||
|
||||
/* Include conversion functions */
|
||||
#ifdef UNICODE
|
||||
#define xatoiW
|
||||
#define xitoaW
|
||||
#else
|
||||
#define xatoi
|
||||
#define xitoa
|
||||
#endif
|
||||
#include "ConvFunc.h"
|
||||
|
||||
/* NSIS stack structure */
|
||||
typedef struct _stack_t {
|
||||
struct _stack_t *next;
|
||||
TCHAR text[1];
|
||||
} stack_t;
|
||||
|
||||
stack_t **g_stacktop;
|
||||
TCHAR *g_variables;
|
||||
unsigned int g_stringsize;
|
||||
|
||||
#define EXDLL_INIT() \
|
||||
{ \
|
||||
g_stacktop=stacktop; \
|
||||
g_variables=variables; \
|
||||
g_stringsize=string_size; \
|
||||
}
|
||||
|
||||
/* Global variables */
|
||||
TCHAR szBuf[NSIS_MAX_STRLEN];
|
||||
|
||||
/* Funtions prototypes and macros */
|
||||
int FIND_PROC_BY_NAME(TCHAR *szProcessName, BOOL bTerminate);
|
||||
int popinteger();
|
||||
void pushinteger(int integer);
|
||||
int popstring(TCHAR *str, int len);
|
||||
void pushstring(const TCHAR *str, int len);
|
||||
|
||||
|
||||
/* NSIS functions code */
|
||||
void __declspec(dllexport) _FindProcess(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
EXDLL_INIT();
|
||||
{
|
||||
int nError;
|
||||
|
||||
popstring(szBuf, NSIS_MAX_STRLEN);
|
||||
nError=FIND_PROC_BY_NAME(szBuf, FALSE);
|
||||
pushinteger(nError);
|
||||
}
|
||||
}
|
||||
|
||||
void __declspec(dllexport) _KillProcess(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
EXDLL_INIT();
|
||||
{
|
||||
int nError;
|
||||
|
||||
popstring(szBuf, NSIS_MAX_STRLEN);
|
||||
nError=FIND_PROC_BY_NAME(szBuf, TRUE);
|
||||
pushinteger(nError);
|
||||
}
|
||||
}
|
||||
|
||||
void __declspec(dllexport) _Unload(HWND hwndParent, int string_size,
|
||||
TCHAR *variables, stack_t **stacktop)
|
||||
{
|
||||
}
|
||||
|
||||
BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int FIND_PROC_BY_NAME(TCHAR *szProcessName, BOOL bTerminate)
|
||||
// Find the process "szProcessName" if it is currently running.
|
||||
// This works for Win95/98/ME and also WinNT/2000/XP.
|
||||
// The process name is case-insensitive, i.e. "notepad.exe" and "NOTEPAD.EXE"
|
||||
// will both work. If bTerminate is TRUE, then process will be terminated.
|
||||
//
|
||||
// Return codes are as follows:
|
||||
// 0 = Success
|
||||
// 601 = No permission to terminate process
|
||||
// 602 = Not all processes terminated successfully
|
||||
// 603 = Process was not currently running
|
||||
// 604 = Unable to identify system type
|
||||
// 605 = Unsupported OS
|
||||
// 606 = Unable to load NTDLL.DLL
|
||||
// 607 = Unable to get procedure address from NTDLL.DLL
|
||||
// 608 = NtQuerySystemInformation failed
|
||||
// 609 = Unable to load KERNEL32.DLL
|
||||
// 610 = Unable to get procedure address from KERNEL32.DLL
|
||||
// 611 = CreateToolhelp32Snapshot failed
|
||||
//
|
||||
// Change history:
|
||||
// created 06/23/2000 - Ravi Kochhar (kochhar@physiology.wisc.edu)
|
||||
// http://www.neurophys.wisc.edu/ravi/software/
|
||||
// modified 03/08/2002 - Ravi Kochhar (kochhar@physiology.wisc.edu)
|
||||
// - Borland-C compatible if BORLANDC is defined as
|
||||
// suggested by Bob Christensen
|
||||
// modified 03/10/2002 - Ravi Kochhar (kochhar@physiology.wisc.edu)
|
||||
// - Removed memory leaks as suggested by
|
||||
// Jonathan Richard-Brochu (handles to Proc and Snapshot
|
||||
// were not getting closed properly in some cases)
|
||||
// modified 14/11/2005 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
|
||||
// - Combine functions FIND_PROC_BY_NAME and KILL_PROC_BY_NAME
|
||||
// - Code has been optimized
|
||||
// - Now kill all processes with specified name (not only one)
|
||||
// - Cosmetic improvements
|
||||
// - Removed error 632 (Invalid process name)
|
||||
// - Changed error 602 (Unable to terminate process for some other reason)
|
||||
// - BORLANDC define not needed
|
||||
// modified 04/01/2006 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
|
||||
// - Removed CRT dependency
|
||||
// modified 21/04/2006 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
|
||||
// - Removed memory leak as suggested by {_trueparuex^}
|
||||
// (handle to hSnapShot was not getting closed properly in some cases)
|
||||
// modified 21/04/2006 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
|
||||
// - Removed memory leak as suggested by {_trueparuex^}
|
||||
// (handle to hSnapShot was not getting closed properly in some cases)
|
||||
// modified 19/07/2006 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
|
||||
// - Code for WinNT/2000/XP has been rewritten
|
||||
// - Changed error codes
|
||||
// modified 31/08/2006 - Shengalts Aleksander aka Instructor (Shengalts@mail.ru):
|
||||
// - Removed memory leak as suggested by Daniel Vanesse
|
||||
{
|
||||
#ifndef UNICODE
|
||||
char szName[MAX_PATH];
|
||||
#endif
|
||||
OSVERSIONINFO osvi;
|
||||
HMODULE hLib;
|
||||
HANDLE hProc;
|
||||
ULONG uError;
|
||||
BOOL bFound=FALSE;
|
||||
BOOL bSuccess=FALSE;
|
||||
BOOL bFailed=FALSE;
|
||||
|
||||
// First check what version of Windows we're in
|
||||
osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
|
||||
if (!GetVersionEx(&osvi)) return 604;
|
||||
|
||||
if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT &&
|
||||
osvi.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS)
|
||||
return 605;
|
||||
|
||||
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
|
||||
{
|
||||
// WinNT/2000/XP
|
||||
|
||||
SYSTEM_PROCESS_INFO *spi;
|
||||
SYSTEM_PROCESS_INFO *spiCount;
|
||||
DWORD dwSize=0x4000;
|
||||
DWORD dwData;
|
||||
ULONG (WINAPI *NtQuerySystemInformationPtr)(ULONG, PVOID, LONG, PULONG);
|
||||
|
||||
if (hLib=LoadLibraryA("NTDLL.DLL"))
|
||||
{
|
||||
NtQuerySystemInformationPtr=(ULONG(WINAPI *)(ULONG, PVOID, LONG, PULONG))GetProcAddress(hLib, "NtQuerySystemInformation");
|
||||
|
||||
if (NtQuerySystemInformationPtr)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
if (spi=LocalAlloc(LMEM_FIXED, dwSize))
|
||||
{
|
||||
uError=(*NtQuerySystemInformationPtr)(SystemProcessInformation, spi, dwSize, &dwData);
|
||||
|
||||
if (uError == STATUS_SUCCESS) break;
|
||||
|
||||
LocalFree(spi);
|
||||
|
||||
if (uError != STATUS_INFO_LENGTH_MISMATCH)
|
||||
{
|
||||
uError=608;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
uError=608;
|
||||
break;
|
||||
}
|
||||
dwSize*=2;
|
||||
}
|
||||
}
|
||||
else uError=607;
|
||||
|
||||
FreeLibrary(hLib);
|
||||
}
|
||||
else uError=606;
|
||||
|
||||
if (uError != STATUS_SUCCESS) return uError;
|
||||
|
||||
spiCount=spi;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (spiCount->pszProcessName)
|
||||
{
|
||||
#ifdef UNICODE
|
||||
if (!lstrcmpi(spiCount->pszProcessName, szProcessName))
|
||||
#else
|
||||
WideCharToMultiByte(CP_ACP, 0, spiCount->pszProcessName, -1, szName, MAX_PATH, NULL, NULL);
|
||||
|
||||
if (!lstrcmpi(szName, szProcessName))
|
||||
#endif
|
||||
{
|
||||
// Process found
|
||||
bFound=TRUE;
|
||||
|
||||
if (bTerminate == TRUE)
|
||||
{
|
||||
// Open for termination
|
||||
if (hProc=OpenProcess(PROCESS_TERMINATE, FALSE, spiCount->dwProcessID))
|
||||
{
|
||||
if (TerminateProcess(hProc, 0))
|
||||
bSuccess=TRUE;
|
||||
else
|
||||
bFailed=TRUE;
|
||||
CloseHandle(hProc);
|
||||
}
|
||||
}
|
||||
else break;
|
||||
}
|
||||
}
|
||||
if (spiCount->dwOffset == 0) break;
|
||||
spiCount=(SYSTEM_PROCESS_INFO *)((char *)spiCount + spiCount->dwOffset);
|
||||
}
|
||||
LocalFree(spi);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Win95/98/ME
|
||||
|
||||
PROCESSENTRY32 pe;
|
||||
TCHAR *pName;
|
||||
HANDLE hSnapShot;
|
||||
BOOL bResult;
|
||||
HANDLE (WINAPI *CreateToolhelp32SnapshotPtr)(DWORD, DWORD);
|
||||
BOOL (WINAPI *Process32FirstPtr)(HANDLE, LPPROCESSENTRY32);
|
||||
BOOL (WINAPI *Process32NextPtr)(HANDLE, LPPROCESSENTRY32);
|
||||
|
||||
if (hLib=LoadLibraryA("KERNEL32.DLL"))
|
||||
{
|
||||
CreateToolhelp32SnapshotPtr=(HANDLE(WINAPI *)(DWORD, DWORD)) GetProcAddress(hLib, "CreateToolhelp32Snapshot");
|
||||
Process32FirstPtr=(BOOL(WINAPI *)(HANDLE, LPPROCESSENTRY32)) GetProcAddress(hLib, "Process32First");
|
||||
Process32NextPtr=(BOOL(WINAPI *)(HANDLE, LPPROCESSENTRY32)) GetProcAddress(hLib, "Process32Next");
|
||||
|
||||
if (CreateToolhelp32SnapshotPtr && Process32NextPtr && Process32FirstPtr)
|
||||
{
|
||||
// Get a handle to a Toolhelp snapshot of all the systems processes.
|
||||
if ((hSnapShot=(*CreateToolhelp32SnapshotPtr)(TH32CS_SNAPPROCESS, 0)) != INVALID_HANDLE_VALUE)
|
||||
{
|
||||
// Get the first process' information.
|
||||
pe.dwSize=sizeof(PROCESSENTRY32);
|
||||
bResult=(*Process32FirstPtr)(hSnapShot, &pe);
|
||||
|
||||
// While there are processes, keep looping and checking.
|
||||
while (bResult)
|
||||
{
|
||||
//Get file name
|
||||
for (pName=pe.szExeFile + lstrlen(pe.szExeFile) - 1; *pName != '\\' && *pName != '\0'; --pName);
|
||||
|
||||
if (!lstrcmpi(++pName, szProcessName))
|
||||
{
|
||||
// Process found
|
||||
bFound=TRUE;
|
||||
|
||||
if (bTerminate == TRUE)
|
||||
{
|
||||
// Open for termination
|
||||
if (hProc=OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID))
|
||||
{
|
||||
if (TerminateProcess(hProc, 0))
|
||||
bSuccess=TRUE;
|
||||
else
|
||||
bFailed=TRUE;
|
||||
CloseHandle(hProc);
|
||||
}
|
||||
}
|
||||
else break;
|
||||
}
|
||||
//Keep looking
|
||||
bResult=(*Process32NextPtr)(hSnapShot, &pe);
|
||||
}
|
||||
CloseHandle(hSnapShot);
|
||||
}
|
||||
else uError=611;
|
||||
}
|
||||
else uError=610;
|
||||
|
||||
FreeLibrary(hLib);
|
||||
}
|
||||
else uError=609;
|
||||
}
|
||||
|
||||
if (bFound == FALSE) return 603;
|
||||
if (bTerminate == TRUE)
|
||||
{
|
||||
if (bSuccess == FALSE) return 601;
|
||||
if (bFailed == TRUE) return 602;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int popinteger()
|
||||
{
|
||||
TCHAR szInt[32];
|
||||
|
||||
popstring(szInt, 32);
|
||||
#ifdef UNICODE
|
||||
return xatoiW(szInt);
|
||||
#else
|
||||
return xatoi(szInt);
|
||||
#endif
|
||||
}
|
||||
|
||||
void pushinteger(int integer)
|
||||
{
|
||||
TCHAR szInt[32];
|
||||
|
||||
#ifdef UNICODE
|
||||
xitoaW(integer, szInt, 0);
|
||||
#else
|
||||
xitoa(integer, szInt, 0);
|
||||
#endif
|
||||
pushstring(szInt, 32);
|
||||
}
|
||||
|
||||
//Function: Removes the element from the top of the NSIS stack and puts it in the buffer
|
||||
int popstring(TCHAR *str, int len)
|
||||
{
|
||||
stack_t *th;
|
||||
|
||||
if (!g_stacktop || !*g_stacktop) return 1;
|
||||
th=(*g_stacktop);
|
||||
lstrcpyn(str, th->text, len);
|
||||
*g_stacktop=th->next;
|
||||
GlobalFree((HGLOBAL)th);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//Function: Adds an element to the top of the NSIS stack
|
||||
void pushstring(const TCHAR *str, int len)
|
||||
{
|
||||
stack_t *th;
|
||||
|
||||
if (!g_stacktop) return;
|
||||
th=(stack_t*)GlobalAlloc(GPTR, sizeof(stack_t) + len);
|
||||
lstrcpyn(th->text, str, len);
|
||||
th->next=*g_stacktop;
|
||||
*g_stacktop=th;
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
# Microsoft Developer Studio Project File - Name="nsProcess" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=nsProcess - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "nsProcess.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "nsProcess.mak" CFG="nsProcess - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "nsProcess - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE "nsProcess - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "nsProcess - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "nsProcess_EXPORTS" /YX /FD /c
|
||||
# ADD CPP /nologo /MT /W3 /GX /O1 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "nsProcess_EXPORTS" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib /nologo /entry:"DllMain" /dll /machine:I386 /nodefaultlib /out:"nsProcess.dll" /opt:nowin98
|
||||
# SUBTRACT LINK32 /pdb:none
|
||||
|
||||
!ELSEIF "$(CFG)" == "nsProcess - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "nsProcess_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "nsProcess_EXPORTS" /YX /FD /GZ /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib libcd.lib /nologo /dll /debug /machine:I386 /nodefaultlib /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "nsProcess - Win32 Release"
|
||||
# Name "nsProcess - Win32 Debug"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\nsProcess.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
|
@ -0,0 +1,29 @@
|
|||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "nsProcess"=.\nsProcess.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
Загрузка…
Ссылка в новой задаче