Source code for latest fixes (brainsucker)
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2378 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
90d227e095
commit
8cc035ffe3
2 changed files with 149 additions and 3 deletions
|
@ -45,10 +45,97 @@ char *GetResultStr(SystemProc *proc)
|
|||
return buf;
|
||||
}
|
||||
|
||||
#ifdef SYSTEM_LOG_DEBUG
|
||||
|
||||
// System log debuggin turned on
|
||||
#define SYSTEM_EVENT(a) { _asm { mov logespsave, esp }; LogEvent(a); }
|
||||
#define SYSTEM_LOG_ADD(a) { lstrcat(syslogbuf, a); }
|
||||
#define SYSTEM_LOG_POST { lstrcat(syslogbuf, "\n"); WriteToLog(syslogbuf); *syslogbuf = 0; }
|
||||
|
||||
HANDLE logfile = NULL;
|
||||
char syslogbuf[4096] = "";
|
||||
int logop = 0, logespsave;
|
||||
|
||||
void WriteToLog(char *buffer)
|
||||
{
|
||||
DWORD written;
|
||||
char timebuffer[128];
|
||||
|
||||
if (logfile == NULL) return;
|
||||
|
||||
SetFilePointer(logfile, 0, 0, FILE_END);
|
||||
|
||||
wsprintf(timebuffer, "%04d %04d.%03d ", (++logop)%10000, (GetTickCount() / 1000) % 10000,
|
||||
GetTickCount() % 1000);
|
||||
WriteFile(logfile, timebuffer, lstrlen(timebuffer), &written, NULL);
|
||||
WriteFile(logfile, buffer, lstrlen(buffer), &written, NULL);
|
||||
// FlushFileBuffers(logfile);
|
||||
}
|
||||
|
||||
void LogEvent(char *a)
|
||||
{
|
||||
char buffer[1024];
|
||||
wsprintf(buffer, "%s ESP = 0x%08X Stack = 0x%08X Real = 0x%08X", a,
|
||||
logespsave, LastStackPlace, LastStackReal);
|
||||
SYSTEM_LOG_ADD(buffer);
|
||||
}
|
||||
|
||||
PLUGINFUNCTION(Debug)
|
||||
{
|
||||
char *o1;
|
||||
o1 = popstring();
|
||||
|
||||
if (logfile == NULL)
|
||||
if (lstrlen(o1) > 0)
|
||||
{
|
||||
SYSTEMTIME t;
|
||||
char buffer[1024], buftime[1024], bufdate[1024];
|
||||
|
||||
// Init debugging
|
||||
logfile = CreateFile(o1, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
|
||||
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
SetFilePointer(logfile, 0, 0, FILE_END);
|
||||
|
||||
logop = 0;
|
||||
GetLocalTime(&t);
|
||||
GetTimeFormat(LOCALE_SYSTEM_DEFAULT, LOCALE_NOUSEROVERRIDE, &t, NULL, buftime, 1024);
|
||||
GetDateFormat(LOCALE_SYSTEM_DEFAULT, LOCALE_NOUSEROVERRIDE, &t, NULL, bufdate, 1024);
|
||||
wsprintf(buffer, "System, %s %s [build "__TIME__" "__DATE__"]\n", buftime, bufdate);
|
||||
WriteToLog(buffer);
|
||||
} else ;
|
||||
else
|
||||
if (lstrlen(o1) > 0)
|
||||
{
|
||||
// Log in to log file
|
||||
WriteToLog(o1);
|
||||
} else
|
||||
{
|
||||
// Stop debugging
|
||||
WriteToLog("Debug stopped.\n\n\n");
|
||||
CloseHandle(logfile);
|
||||
logfile = NULL;
|
||||
}
|
||||
} PLUGINFUNCTIONEND
|
||||
|
||||
#else
|
||||
|
||||
// System log debugging turned off
|
||||
#define SYSTEM_EVENT(a)
|
||||
#define SYSTEM_LOG_ADD(a)
|
||||
#define SYSTEM_LOG_POST
|
||||
|
||||
#endif
|
||||
|
||||
PLUGINFUNCTION(Get)
|
||||
{
|
||||
SystemProc *proc = PrepareProc(FALSE);
|
||||
SYSTEM_LOG_ADD("Get ");
|
||||
SYSTEM_LOG_ADD(proc->DllName);
|
||||
SYSTEM_LOG_ADD("::");
|
||||
SYSTEM_LOG_ADD(proc->ProcName);
|
||||
SYSTEM_LOG_ADD("\n");
|
||||
SYSTEM_LOG_POST;
|
||||
if ((proc->Options & POPT_ALWRETURN) != 0)
|
||||
{
|
||||
// Always return flag set -> return separate proc and result
|
||||
|
@ -73,6 +160,11 @@ PLUGINFUNCTION(Call)
|
|||
{
|
||||
// Prepare input
|
||||
SystemProc *proc = PrepareProc(TRUE);
|
||||
SYSTEM_LOG_ADD("Call ");
|
||||
SYSTEM_LOG_ADD(proc->DllName);
|
||||
SYSTEM_LOG_ADD("::");
|
||||
SYSTEM_LOG_ADD(proc->ProcName);
|
||||
SYSTEM_LOG_ADD("\n");
|
||||
if (proc->ProcResult != PR_CALLBACK)
|
||||
ParamAllocate(proc);
|
||||
ParamsIn(proc);
|
||||
|
@ -583,6 +675,15 @@ void ParamsIn(SystemProc *proc)
|
|||
}
|
||||
GlobalFree(realbuf);
|
||||
|
||||
#ifdef SYSTEM_LOG_DEBUG
|
||||
{
|
||||
char buf[1024];
|
||||
wsprintf(buf, "\t\t\tParam In %d: type %d value 0x%08X value2 0x%08X\n", i,
|
||||
proc->Params[i].Type, proc->Params[i].Value, proc->Params[i]._value);
|
||||
SYSTEM_LOG_ADD(buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (i == proc->ParamCount) i = 0;
|
||||
else i++;
|
||||
}
|
||||
|
@ -631,7 +732,12 @@ void ParamsOut(SystemProc *proc)
|
|||
myitoa64(*((__int64*) place), realbuf);
|
||||
break;
|
||||
case PAT_STRING:
|
||||
lstrcpy(realbuf,*((char**) place));
|
||||
{
|
||||
int num = lstrlen(*((char**) place));
|
||||
if (num >= g_stringsize) num = g_stringsize-1;
|
||||
lstrcpyn(realbuf,*((char**) place), num+1);
|
||||
realbuf[num] = 0;
|
||||
}
|
||||
break;
|
||||
case PAT_BOOLEAN:
|
||||
lstrcpy(realbuf,(*((int*) place))?("true"):("false"));
|
||||
|
@ -672,6 +778,9 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc)
|
|||
push esi
|
||||
}
|
||||
|
||||
SYSTEM_LOG_ADD("\t\tCall:\n");
|
||||
SYSTEM_EVENT("\t\t\tBefore call ")
|
||||
|
||||
if ((CallbackIndex > 0) && ((proc->Options & POPT_GENSTACK) == 0))
|
||||
{
|
||||
_asm
|
||||
|
@ -719,6 +828,9 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc)
|
|||
proc->Clone = LastProc;
|
||||
LastProc = proc;
|
||||
|
||||
SYSTEM_EVENT("\n\t\t\tNear call ")
|
||||
SYSTEM_LOG_POST;
|
||||
|
||||
_asm
|
||||
{
|
||||
// Call
|
||||
|
@ -728,6 +840,10 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc)
|
|||
mov z2, edx
|
||||
}
|
||||
|
||||
SYSTEM_LOG_ADD("Back from ");
|
||||
SYSTEM_LOG_ADD(LastProc->ProcName);
|
||||
SYSTEM_EVENT("\n\t\t\tShort-After call ")
|
||||
|
||||
if ((CallbackIndex > 0) && ((LastProc->Options & POPT_GENSTACK) == 0))
|
||||
{
|
||||
_asm
|
||||
|
@ -773,6 +889,16 @@ SystemProc __declspec(naked) *CallProc(SystemProc *proc)
|
|||
// Proc result: OK
|
||||
proc->ProcResult = PR_OK;
|
||||
|
||||
SYSTEM_EVENT("\n\t\t\tAfter call ")
|
||||
#ifdef SYSTEM_LOG_DEBUG
|
||||
{
|
||||
char buf[1024];
|
||||
wsprintf(buf, "\n\t\t\tReturn 0x%08X 0x%08X", z1, z2);
|
||||
SYSTEM_LOG_ADD(buf);
|
||||
}
|
||||
#endif
|
||||
SYSTEM_LOG_POST;
|
||||
|
||||
_asm
|
||||
{
|
||||
// Return
|
||||
|
@ -813,6 +939,11 @@ SystemProc __declspec(naked) *RealCallBack()
|
|||
mov proc, eax
|
||||
}
|
||||
|
||||
SYSTEM_LOG_ADD("Called callback from ");
|
||||
SYSTEM_LOG_ADD(LastProc->ProcName);
|
||||
SYSTEM_EVENT("\n\t\t\tShort-After call ")
|
||||
SYSTEM_LOG_POST;
|
||||
|
||||
// Find last unused clone
|
||||
while ((proc->Clone != NULL)) proc = proc->Clone;
|
||||
// 2. Create new clone
|
||||
|
@ -849,7 +980,10 @@ SystemProc __declspec(naked) *RealCallBack()
|
|||
mov esp, LastStackReal
|
||||
pop ebp
|
||||
// pop LastStackReal
|
||||
}
|
||||
|
||||
_asm
|
||||
{
|
||||
// Fake return from System::Call
|
||||
|
||||
// Restore registers
|
||||
|
@ -880,6 +1014,9 @@ SystemProc __declspec(naked) *CallBack(SystemProc *proc)
|
|||
push esi
|
||||
}
|
||||
|
||||
SYSTEM_LOG_ADD("\t\tReturn from callback:\n");
|
||||
SYSTEM_EVENT("\t\t\tBefore call-back ");
|
||||
|
||||
z1 = proc->Params[0].Value;
|
||||
z2 = proc->Params[0]._value;
|
||||
|
||||
|
@ -910,9 +1047,13 @@ SystemProc __declspec(naked) *CallBack(SystemProc *proc)
|
|||
mov esp, LastStackPlace
|
||||
// pop LastStackPlace
|
||||
pop ebp
|
||||
}
|
||||
|
||||
// Fake return from Callback
|
||||
SYSTEM_EVENT("\n\t\t\tSh-Before call-back");
|
||||
SYSTEM_LOG_POST;
|
||||
|
||||
// Fake return from Callback
|
||||
_asm {
|
||||
// Restore registers
|
||||
pop esi
|
||||
pop edi
|
||||
|
@ -953,13 +1094,15 @@ void CallStruct(SystemProc *proc)
|
|||
int i, structsize = 0, size = 0;
|
||||
char *st, *ptr;
|
||||
|
||||
SYSTEM_LOG_ADD("\t\tStruct...");
|
||||
|
||||
// Calculate the structure size
|
||||
for (i = 1; i <= proc->ParamCount; i++)
|
||||
if (proc->Params[i].Option < 1)
|
||||
structsize += proc->Params[i].Size * 4;
|
||||
else
|
||||
structsize += proc->Params[i].Option-1;
|
||||
|
||||
|
||||
// Struct exists?
|
||||
if (proc->Proc == NULL)
|
||||
// No. Allocate struct memory
|
||||
|
@ -1020,6 +1163,8 @@ void CallStruct(SystemProc *proc)
|
|||
st += size;
|
||||
}
|
||||
|
||||
SYSTEM_LOG_POST;
|
||||
|
||||
// Proc virtual return - pointer to memory struct
|
||||
proc->Params[0].Value = (int) proc->Proc;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue