release 5 by brainsucker:

1. u flag - unload dll after procedure call.
2. some changes to asm to turn on Whole Program Optimization.
3. Dll shrinked for 1 kb.


git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2899 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2003-09-11 20:31:04 +00:00
parent 6488174f47
commit 9186fcc291
6 changed files with 127 additions and 23 deletions

View file

@ -5,6 +5,7 @@
#include "Plugin.h"
#include "Buffers.h"
#include "System.h"
#include <crtdbg.h>
// Parse Section Type
#define PST_PROC 0
@ -17,7 +18,7 @@
#define PCD_PARAMS 2
#define PCD_DONE 3 // Just Continue
int ParamSizeByType[7] = {0, // PAT_VOID (Size will be equal to 1)
const int ParamSizeByType[7] = {0, // PAT_VOID (Size will be equal to 1)
1, // PAT_INT
2, // PAT_LONG
1, // PAT_STRING
@ -26,15 +27,15 @@ int ParamSizeByType[7] = {0, // PAT_VOID (Size will be equal to 1)
0}; // PAT_CALLBACK (Size will be equal to 1)
int z1, z2; // I've made them static for easier use at callback procs
int LastStackPlace = 0;
int LastStackReal = 0;
DWORD LastError = 0;
SystemProc *LastProc = NULL;
int CallbackIndex = 0;
int LastStackPlace;
int LastStackReal;
DWORD LastError;
volatile SystemProc *LastProc;
int CallbackIndex;
HINSTANCE g_hInstance;
// Return to callback caller with stack restore
char retexpr[3] = {0xC2, 0x00, 0x00};
char retexpr[4];
HANDLE retaddr;
char *GetResultStr(SystemProc *proc)
@ -62,12 +63,18 @@ void WriteToLog(char *buffer)
DWORD written;
char timebuffer[128];
GetTickCount();
if (logfile == NULL) return;
SetFilePointer(logfile, 0, 0, FILE_END);
wsprintf(timebuffer, "%04d %04d.%03d ", (++logop)%10000, (GetTickCount() / 1000) % 10000,
GetTickCount() % 1000);
_RPT0(_CRT_WARN, timebuffer);
_RPT0(_CRT_WARN, buffer);
WriteFile(logfile, timebuffer, lstrlen(timebuffer), &written, NULL);
WriteFile(logfile, buffer, lstrlen(buffer), &written, NULL);
// FlushFileBuffers(logfile);
@ -218,6 +225,12 @@ PLUGINFUNCTION(Call)
// Deallocate params if not callback
ParamsDeAllocate(proc);
// if not callback - check for unload library option
if ((proc->Options & POPT_UNLOAD)
&& (proc->ProcType == PT_PROC)
&& (proc->Dll != NULL))
FreeLibrary(proc->Dll); // and unload it :)
// In case of POPT_ERROR - first pop will be proc error
if ((proc->Options & POPT_ERROR) != 0) pushint(LastError);
}
@ -572,6 +585,9 @@ SystemProc *PrepareProc(BOOL NeedForCall)
case 'e':
temp2 = POPT_ERROR;
break;
case 'u':
temp2 = POPT_UNLOAD;
break;
}
// New Options
@ -864,7 +880,7 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc)
SYSTEM_LOG_ADD("\t\tCall:\n");
SYSTEM_EVENT("\t\t\tBefore call ")
if ((CallbackIndex > 0) && ((proc->Options & POPT_GENSTACK) == 0))
if (CallbackIndex && (!(proc->Options & POPT_GENSTACK)))
{
_asm
{
@ -909,7 +925,12 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc)
// Save proc
proc->Clone = LastProc;
LastProc = proc;
_asm
{
mov eax, proc
mov LastProc, eax
}
//LastProc = proc;
SYSTEM_EVENT("\n\t\t\tNear call ")
SYSTEM_LOG_POST;
@ -927,7 +948,7 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc)
SYSTEM_LOG_ADD(LastProc->ProcName);
SYSTEM_EVENT("\n\t\t\tShort-After call ")
if ((CallbackIndex > 0) && ((LastProc->Options & POPT_GENSTACK) == 0))
if ((CallbackIndex) && (!(LastProc->Options & POPT_GENSTACK)))
{
_asm
{
@ -939,7 +960,12 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc)
}
// Restore proc
proc = LastProc;
_asm
{
mov eax, LastProc
mov proc, eax
}
// proc = LastProc;
LastProc = proc->Clone;
// In case of cdecl convention we should clear stack
@ -1103,11 +1129,22 @@ SystemProc __declspec(naked) *CallBack(SystemProc *proc)
push esi
}
// MessageBox(NULL, "cool1", "Cool", MB_OK);
SYSTEM_LOG_ADD("\t\tReturn from callback:\n");
SYSTEM_EVENT("\t\t\tBefore call-back ");
SYSTEM_LOG_POST;
z1 = proc->Params[0].Value;
z2 = proc->Params[0]._value;
//z1 = proc->Params[0].Value;
//z2 = proc->Params[0]._value;
//z1 = &(proc->Params[0].Value);
_asm
{
mov eax, proc
add eax, SYSTEM_ZERO_PARAM_VALUE_OFFSET
push [eax]
push [eax+4]
}
// Adjust return statement
if ((proc->Options & POPT_CDECL) == 0) retexpr[1] = proc->ArgsSize;
@ -1119,11 +1156,13 @@ SystemProc __declspec(naked) *CallBack(SystemProc *proc)
// Remove unneeded callback proc
GlobalFree((HANDLE) proc);
// MessageBox(NULL, "cool2", "Cool", MB_OK);
_asm
{
// Prepare return
mov eax, z1
mov edx, z2
// mov eax, z1
//mov edx, z2
// Restore temporary stack and return
@ -1138,11 +1177,17 @@ SystemProc __declspec(naked) *CallBack(SystemProc *proc)
pop ebp
}
#ifdef SYSTEM_LOG_DEBUG
SYSTEM_EVENT("\n\t\t\tSh-Before call-back");
SYSTEM_LOG_POST;
SYSTEM_LOG_POST;
#endif
// Fake return from Callback
// Fake return from Callback
_asm {
// callback proc result
pop edx
pop eax
// Restore registers
pop esi
pop edi
@ -1267,6 +1312,18 @@ void CallStruct(SystemProc *proc)
BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
g_hInstance=hInst;
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
// initialize some variables
LastStackPlace = 0;
LastStackReal = 0;
LastError = 0;
LastProc = NULL;
CallbackIndex = 0;
retexpr[0] = 0xC2;
retexpr[2] = 0x00;
}
return TRUE;
}

View file

@ -48,13 +48,18 @@
#define POPT_NEVERREDEF 0x8 // Never redefine
#define POPT_GENSTACK 0x10 // Use general stack (non temporary for callback)
#define POPT_ERROR 0x20 // Call GetLastError after proc and push it to stack
#define POPT_CLONE 0x40 // This is clone callback
#define POPT_UNLOAD 0x40 // unload dll after call
#define POPT_CLONE 0x80 // This is clone callback
// Our single proc parameter
typedef struct
{
int Type;
int Option; // -1 -> Pointer, 1-... -> Special+1
// if you'll change ProcParameter or SystemProc structure - update this value
#define SYSTEM_ZERO_PARAM_VALUE_OFFSET 0x820
int Value; // it can hold any 4 byte value
int _value; // value buffer for structures > 4 bytes (I hope 8 bytes will be enough)
int Size; // Value real size (should be either 1 or 2 (the number of pushes))
@ -76,6 +81,7 @@ typedef struct tag_SystemProc
HANDLE Proc;
int Options;
int ParamCount;
// if you'll change ProcParameter or SystemProc structure - update SYSTEM_ZERO_PARAM_VALUE_OFFSET value
ProcParameter Params[100]; // I hope nobody will use more than 100 params
// Callback specific
@ -85,7 +91,7 @@ typedef struct tag_SystemProc
SystemProc *Clone;
} SystemProc;
extern int ParamSizeByType[]; // Size of every parameter type (*4 bytes)
extern const int ParamSizeByType[]; // Size of every parameter type (*4 bytes)
extern HANDLE CreateCallback(SystemProc *cbproc);
extern SystemProc *PrepareProc(BOOL NeedForCall);

View file

@ -68,7 +68,7 @@
IntermediateDirectory="Release"
ConfigurationType="2"
CharacterSet="2"
WholeProgramOptimization="FALSE">
WholeProgramOptimization="TRUE">
<Tool
Name="VCCLCompilerTool"
Optimization="1"
@ -97,9 +97,10 @@
OutputFile="d:\Program FIles\NSIS\Plugins\System.dll"
LinkIncremental="1"
IgnoreAllDefaultLibraries="TRUE"
GenerateDebugInformation="FALSE"
GenerateDebugInformation="TRUE"
GenerateMapFile="TRUE"
MapExports="TRUE"
MapLines="TRUE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"

View file

@ -115,10 +115,10 @@ enumex: ; End of drives or user cancel
; Logo
File /oname=spltmp.bmp "${NSISDIR}\Contrib\Makensisw\logo.bmp"
; File /oname=spltmp.wav "${WINDIR}\media\Windows XP Startup.wav"
; File /oname=spltmp.wav "d:\Windows\Media\tada.wav"
; I. systemSplash variant
!insertmacro smSystemSplash 500 "$TEMP\spltmp"
!insertmacro smSystemSplash 2000 "$TEMP\spltmp"
; II. Splash Plugin variant
; splash::show 2000 $TEMP\spltmp

View file

@ -166,6 +166,8 @@ redefined either by GET or CALL. This options is never inherited to childs.
s - use general Stack. Whenever the first callback defined the system
starts using the temporary stacks for function calls.
e - call GetLastError() after procedure end and push result on stack,
u - unload DLL after call (using FreeLibrary, so you'll be able to
do something with it, delete for example).
----------------------------------
Callback:

View file

@ -0,0 +1,38 @@
release 2.
1. Syntax, with inline input
2. Int64 full support (conversion/operations/comparison)
3. Structures support
4. Callbacks support, including multilevel callbacks
5. Some useful rountines (Alloc, Free, Copy)
6. CDecl and StdCall calling conventions
release 3, 22 march 2003.
1. Custom Message Boxes (with icons etc) -> bug in case of GetModuleHandle and
call to FreeLibrary (sysfunc.nsh)
2. GetFileSysTime -> No SystemTimeToTzSpecificLocalTime at win9x bug,
changed to use FileTimeToLocalFileTime (sysfunc.nsh)
3. Incorrect automatic structure size (&l) bug, value actually never filled
into the structure (strange -> winxp takes no care of the structure size
members, such as cbSize, and win98 does...) (system.c)
4. Changed Secondary Stack Allocation behavior - now we just leave 65kb of the
stack NSIS give to us to the NSIS itself, and use the other part as the stack
for our calls. (system.c)
5. Secondary Stack Optimization - in case of no more pending callback procs -
"free" the secondary stack pointer. (system.c)
6. PlaySound("", 0, 0) plays the default windows sound at win9x, so changed to
PlaySound(NULL, 0, 0) for effective sound stopping after splash (sysfunc.nsh).
release 4, 3 september 2003.
1. Division by zero fatal error at Int64Op killed.
2. bool type removed (use int instead).
3. GUID (g) and LPWSTR (w) types added.
4. Memory cleanup after using t (string), g (guid) and w (unicode string) added.
5. Automatic A-letter at proc name discovery.
6. COM optimized: new proc specification "x->y", where x is interface ptr, and
y is vtable member index. For such procs Interface pointer passed as first arg
automaticaly.
release 5, 11 september 2003.
1. u flag - unload dll after procedure call.
2. some changes to asm to turn on Whole Program Optimization.
3. Dll shrinked for 1 kb.