diff --git a/Source/exehead/exec.c b/Source/exehead/exec.c index bbac021d..fe5ffae6 100644 --- a/Source/exehead/exec.c +++ b/Source/exehead/exec.c @@ -139,19 +139,22 @@ static int NSISCALL ExecuteEntry(entry *entry_) char *buf3 = bufs[3]; char *buf4 = bufs[4]; - int parm0 = (parms = entry_->offsets)[0]; // the ordering of these makes a size diff (4 bytes) -Justin + int parm0 = entry_->offsets[0]; char *var0 = g_usrvars[parm0]; - int parm1 = parms[1]; + int parm1 = entry_->offsets[1]; char *var1 = g_usrvars[parm1]; - int parm2 = parms[2]; + int parm2 = entry_->offsets[2]; char *var2 = g_usrvars[parm2]; - int parm3 = parms[3]; + int parm3 = entry_->offsets[3]; char *var3 = g_usrvars[parm3]; - int parm4 = parms[4]; + int parm4 = entry_->offsets[4]; //char *var4 = g_usrvars[parm4]; // not used yet - int parm5 = parms[5]; + int parm5 = entry_->offsets[5]; //char *var5 = g_usrvars[parm5]; // not used yet int which = entry_->which; + + parms = entry_->offsets; + switch (which) { case EW_NOP: @@ -272,9 +275,7 @@ static int NSISCALL ExecuteEntry(entry *entry_) log_printf3("IfFileExists: file \"%s\" does not exist, jumping %d",buf0,parm2); } return parm2; - case EW_IFERRORS: - if (g_flags.exec_error) return parm0; - return parm1; + case EW_IFERRORS: return entry_->offsets[!g_flags.exec_error]; #ifdef NSIS_SUPPORT_RENAME case EW_RENAME: { @@ -391,7 +392,7 @@ static int NSISCALL ExecuteEntry(entry *entry_) overwriteflag=1; // if it doesn't exist, fall back to no overwrites (since it shouldn't matter anyway) if (ffd) { - overwriteflag=(CompareFileTime(&ffd->ftLastWriteTime,(FILETIME*)(parms+3)) >= 0); // if first one is newer, then don't overwrite + overwriteflag=(CompareFileTime(&ffd->ftLastWriteTime,(FILETIME*)(entry_->offsets+3)) >= 0); // if first one is newer, then don't overwrite } } hOut=myOpenFile(buf0,GENERIC_WRITE,(overwriteflag==1)?CREATE_NEW:CREATE_ALWAYS); @@ -433,7 +434,7 @@ static int NSISCALL ExecuteEntry(entry *entry_) log_printf3("File: wrote %d to \"%s\"",ret,buf0); if (parm3 != 0xffffffff || parm4 != 0xffffffff) - SetFileTime(hOut,(FILETIME*)(parms+3),NULL,(FILETIME*)(parms+3)); + SetFileTime(hOut,(FILETIME*)(entry_->offsets+3),NULL,(FILETIME*)(entry_->offsets+3)); CloseHandle(hOut); @@ -634,11 +635,10 @@ static int NSISCALL ExecuteEntry(entry *entry_) case 4: v|=v2; break; case 5: v&=v2; break; case 6: v^=v2; break; - case 7: v=~v; break; - case 8: v=!v; break; - case 9: v=v||v2; break; - case 10: v=v&&v2; break; - case 11: if (v2) v%=v2; else { v=0; g_flags.exec_error++; } break; + case 7: v=!v; break; + case 8: v=v||v2; break; + case 9: v=v&&v2; break; + case 10: if (v2) v%=v2; else { v=0; g_flags.exec_error++; } break; } myitoa(p,v); } @@ -746,13 +746,16 @@ static int NSISCALL ExecuteEntry(entry *entry_) ); return 0; case EW_SETBKCOLOR: + { DeleteObject( (HGDIOBJ)SetWindowLong( - (HWND)process_string_fromparm_toint(0), + (HWND)process_string_fromparm_toint(3), GWL_USERDATA, - parm1==-1?parm1:(LONG)CreateSolidBrush(parm1) + // three times 4 bytes (UINT, COLORREF [=DWORD], LONG) + parm1==-1?parm1:(int)CreateBrushIndirect((LPLOGBRUSH)entry_->offsets) ) ); + } return 0; case EW_SETBRANDINGIMAGE: { @@ -1097,7 +1100,7 @@ static int NSISCALL ExecuteEntry(entry *entry_) return 0; } break; - case EW_IFREBOOTFLAG: return parms[!g_flags.exec_reboot]; + case EW_IFREBOOTFLAG: return entry_->offsets[!g_flags.exec_reboot]; #endif//NSIS_SUPPORT_REBOOT #ifdef NSIS_SUPPORT_INIFILES case EW_WRITEINI: @@ -1536,4 +1539,4 @@ static int NSISCALL ExecuteEntry(entry *entry_) } my_MessageBox(LANG_STR(LANG_INSTCORRUPTED),MB_OK|MB_ICONSTOP); return EXEC_ERROR; -} +} \ No newline at end of file diff --git a/Source/exehead/util.c b/Source/exehead/util.c index 1fa083e1..d3b52f2c 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -325,14 +325,14 @@ void NSISCALL myitoa(char *s, int d) { wsprintf(s,"%d",d); } int NSISCALL myatoi(char *s) { unsigned int v=0; - int sign=0; // sign of positive + int sign=1; // sign of positive char m=10; // base of 0 char t='9'; // cap top of numbers at 9 if (*s == '-') { s++; //skip over - - sign++; // sign flip + sign=-1; // sign flip } if (*s == '0') @@ -359,8 +359,7 @@ int NSISCALL myatoi(char *s) v*=m; v+=c; } - if (sign) return -(int) v; - return (int)v; + return ((int)v)*sign; } // Straight copies of selected shell functions. Calling local functions diff --git a/Source/script.cpp b/Source/script.cpp index 68f0dbda..e0ad7585 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -2889,9 +2889,15 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char return add_entry(&ent); case TOK_SETBKCOLOR: ent.which=EW_SETBKCOLOR; - ent.offsets[0]=add_string(line.gettoken_str(1)); - ent.offsets[1]=line.gettoken_int(2); - SCRIPT_MSG("SetBkColor: handle=%s color=%s\n",line.gettoken_str(1),line.gettoken_str(2)); + if (!stricmp(line.gettoken_str(2),"transparent")) + ent.offsets[0]=BS_NULL; + else { + ent.offsets[0]=BS_SOLID; + ent.offsets[1]=line.gettoken_int(2); + } + ent.offsets[2]=0; + ent.offsets[3]=add_string(line.gettoken_str(1)); + SCRIPT_MSG("SetBkColor: hwnd=%s color=%s\n",line.gettoken_str(1),line.gettoken_str(2)); return add_entry(&ent); case TOK_CREATEFONT: ent.which=EW_CREATEFONT; @@ -3562,10 +3568,14 @@ int CEXEBuild::doCommand(int which_token, LineParser &line, FILE *fp, const char case TOK_INTOP: ent.which=EW_INTOP; ent.offsets[0]=line.gettoken_enum(1,usrvars); - ent.offsets[3]=line.gettoken_enum(3,"+\0-\0*\0/\0|\0&\0^\0~\0!\0||\0&&\0%\0"); - if (ent.offsets[0] < 0 || ent.offsets[3]<0 || ((ent.offsets[3] == 7 || ent.offsets[3]==8) && line.getnumtokens()>4)) PRINTHELP() + ent.offsets[3]=line.gettoken_enum(3,"+\0-\0*\0/\0|\0&\0^\0!\0||\0&&\0%\0~\0"); + if (ent.offsets[0] < 0 || ent.offsets[3]<0 || ((ent.offsets[3] == 7 || ent.offsets[3]==11) && line.getnumtokens()>4)) PRINTHELP() ent.offsets[1]=add_string(line.gettoken_str(2)); - if (ent.offsets[3] != 7 && ent.offsets[3] != 8) ent.offsets[2]=add_string(line.gettoken_str(4)); + if (ent.offsets[3] != 7 && ent.offsets[3] != 11) ent.offsets[2]=add_string(line.gettoken_str(4)); + if (ent.offsets[3] == 11) { + ent.offsets[3]=6; + ent.offsets[2]=add_string("0xFFFFFFFF"); + } SCRIPT_MSG("IntOp: %s=%s%s%s\n",line.gettoken_str(1),line.gettoken_str(2),line.gettoken_str(3),line.gettoken_str(4)); return add_entry(&ent); case TOK_INTFMT: