From 0ef7fcd98b7413140e9d4d02b5a8d0ce9dd8b27a Mon Sep 17 00:00:00 2001 From: kichik Date: Mon, 24 Nov 2003 13:11:35 +0000 Subject: [PATCH] Uninstaller data offset is saved as EW_WRITEUNINSTALLER's parameters. A step forward to multiple uninstallers and smaller exehead. git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@3192 212acab6-be3b-0410-9dea-997c60f758d6 --- Source/build.cpp | 22 +++++++++++++++++++--- Source/exehead/exec.c | 5 ++--- Source/exehead/fileform.h | 7 +------ Source/script.cpp | 2 -- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/Source/build.cpp b/Source/build.cpp index b226ebaa..048dce5b 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -2754,8 +2754,24 @@ int CEXEBuild::uninstall_generate() if (icon_offset == 0) return PS_ERROR; - build_header.uninstdata_offset=build_datablock.getlen(); - build_header.uninsticon_size=unicondata_size; + entry *ent = (entry *) build_entries.get(); + if (!ent) + return PS_ERROR; + int ents = build_header.blocks[NB_ENTRIES].num; + int uns = uninstaller_writes_used; + int uninstdata_offset = build_datablock.getlen(); + while (ents--) + { + if (ent->which == EW_WRITEUNINSTALLER) + { + ent->offsets[1] = uninstdata_offset; + ent->offsets[2] = unicondata_size; + uns--; + if (!uns) + break; + } + ent++; + } if (add_db_data((char *)m_unicon_data,unicondata_size) < 0) return PS_ERROR; @@ -2920,7 +2936,7 @@ int CEXEBuild::uninstall_generate() uninstall_size_full=fh.length_of_all_following_data+unicondata_size; // compressed size - uninstall_size=build_datablock.getlen()-build_header.uninstdata_offset; + uninstall_size=build_datablock.getlen()-uninstdata_offset; SCRIPT_MSG("Done!\n"); } diff --git a/Source/exehead/exec.c b/Source/exehead/exec.c index 10b74236..cce19002 100644 --- a/Source/exehead/exec.c +++ b/Source/exehead/exec.c @@ -1436,10 +1436,9 @@ static int NSISCALL ExecuteEntry(entry *entry_) ReadSelfFile((char*)filebuf,filehdrsize); { unsigned char* seeker; - unsigned char* unicon_data = seeker = (unsigned char*)my_GlobalAlloc(g_header->uninsticon_size); + unsigned char* unicon_data = seeker = (unsigned char*)my_GlobalAlloc(parm2); if (unicon_data) { - GetCompressedDataFromDataBlockToMemory(g_header->uninstdata_offset, - unicon_data,g_header->uninsticon_size); + GetCompressedDataFromDataBlockToMemory(parm1,unicon_data,parm2); while (*seeker) { struct icondata { DWORD dwSize; diff --git a/Source/exehead/fileform.h b/Source/exehead/fileform.h index 04fe480c..d40fcaab 100644 --- a/Source/exehead/fileform.h +++ b/Source/exehead/fileform.h @@ -159,7 +159,7 @@ enum #endif #ifdef NSIS_CONFIG_UNINSTALL_SUPPORT - EW_WRITEUNINSTALLER, // WriteUninstaller: 1 [name] + EW_WRITEUNINSTALLER, // WriteUninstaller: 3 [name, offset, icon_size] #endif #ifdef NSIS_CONFIG_LOG @@ -304,11 +304,6 @@ typedef struct int install_directory_ptr; // default install dir. int install_directory_auto_append; // auto append part - -#ifdef NSIS_CONFIG_UNINSTALL_SUPPORT - int uninstdata_offset; // -1 if no uninst data. - int uninsticon_size; -#endif } header; // used for section->flags diff --git a/Source/script.cpp b/Source/script.cpp index 288e7738..41320205 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -2579,8 +2579,6 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) uninstaller_writes_used++; ent.which=EW_WRITEUNINSTALLER; ent.offsets[0]=add_string(line.gettoken_str(1)); - ent.offsets[1]=0; // uninstall section 0 - ent.offsets[2]=0; if (!ent.offsets[0]) PRINTHELP() SCRIPT_MSG("WriteUninstaller: \"%s\"\n",line.gettoken_str(1));