diff --git a/Source/exehead/exec.c b/Source/exehead/exec.c index c52d8190..5b8399c4 100644 --- a/Source/exehead/exec.c +++ b/Source/exehead/exec.c @@ -1129,6 +1129,7 @@ static int NSISCALL ExecuteEntry(entry *entry_) case EW_DELREG: { long res=!ERROR_SUCCESS; + const char *rkn=RegKeyHandleToName((HKEY)parm1); if (!parm4) { HKEY hKey=myRegOpenKey(KEY_SET_VALUE); @@ -1136,14 +1137,14 @@ static int NSISCALL ExecuteEntry(entry *entry_) { char *buf3=GetStringFromParm(0x33); res = RegDeleteValue(hKey,buf3); - log_printf4("DeleteRegValue: %d\\%s\\%s",parm1,buf2,buf3); + log_printf4("DeleteRegValue: \"%s\\%s\" \"%s\"",rkn,buf2,buf3); RegCloseKey(hKey); } } else { char *buf2=GetStringFromParm(0x22); - log_printf3("DeleteRegKey: %d\\%s",parm1,buf2); + log_printf3("DeleteRegKey: \"%s\\%s\"",rkn,buf2); res = myRegDeleteKeyEx(GetRegRootKey(parm1),buf2,parm4&2); } if (res != ERROR_SUCCESS) @@ -1158,6 +1159,8 @@ static int NSISCALL ExecuteEntry(entry *entry_) int rtype=parm5; char *buf0=GetStringFromParm(0x02); char *buf1=GetStringFromParm(0x11); + const char *rkn=RegKeyHandleToName(rootkey); + exec_error++; if (RegCreateKeyEx(rootkey,buf1,0,0,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,0,&hKey,0) == ERROR_SUCCESS) { @@ -1167,25 +1170,35 @@ static int NSISCALL ExecuteEntry(entry *entry_) { GetStringFromParm(0x23); size = mystrlen((char *) data) + 1; - log_printf5("WriteRegStr: set %d\\%s\\%s to %s",rootkey,buf1,buf0,data); + if (rtype == REG_SZ) + { + log_printf5("WriteRegStr: \"%s\\%s\" \"%s\"=\"%s\"",rkn,buf1,buf0,data); + } + else + { + log_printf5("WriteRegExpandStr: \"%s\\%s\" \"%s\"=\"%s\"",rkn,buf1,buf0,data); + } } if (type == REG_DWORD) { *(LPDWORD) data = GetIntFromParm(3); size = sizeof(DWORD); - log_printf5("WriteRegDWORD: set %d\\%s\\%s to %d",rootkey,buf1,buf0,*(LPDWORD)data); + log_printf5("WriteRegDWORD: \"%s\\%s\" \"%s\"=\"%08x\"",rkn,buf1,buf0,*(LPDWORD) data); } if (type == REG_BINARY) { + char binbuf[128]; + // use buf2, buf3 and buf4 size = GetCompressedDataFromDataBlockToMemory(parm3, data, 3 * NSIS_MAX_STRLEN); - log_printf5("WriteRegBin: set %d\\%s\\%s with %d bytes",rootkey,buf1,buf0,size); + LogData2Hex(binbuf, sizeof(binbuf), data, size); + log_printf5("WriteRegBin: \"%s\\%s\" \"%s\"=\"%s\"",rkn,buf1,buf0,binbuf); } if (size >= 0 && RegSetValueEx(hKey,buf0,0,rtype,data,size) == ERROR_SUCCESS) exec_error--; RegCloseKey(hKey); } - else { log_printf3("WriteReg: error creating key %d\\%s",rootkey,buf1); } + else { log_printf3("WriteReg: error creating key \"%s\\%s\"",buf3,buf1); } } break; case EW_READREGSTR: // read registry string diff --git a/Source/exehead/util.c b/Source/exehead/util.c index f209ee89..039f5b99 100644 --- a/Source/exehead/util.c +++ b/Source/exehead/util.c @@ -760,6 +760,53 @@ void NSISCALL log_write(int close) } #endif//!NSIS_CONFIG_LOG_ODS +const char * _RegKeyHandleToName(HKEY hKey) +{ + if (hKey == HKEY_CLASSES_ROOT) + return "HKEY_CLASSES_ROOT"; + else if (hKey == HKEY_CURRENT_USER) + return "HKEY_CURRENT_USER"; + else if (hKey == HKEY_LOCAL_MACHINE) + return "HKEY_LOCAL_MACHINE"; + else if (hKey == HKEY_USERS) + return "HKEY_USERS"; + else if (hKey == HKEY_PERFORMANCE_DATA) + return "HKEY_PERFORMANCE_DATA"; + else if (hKey == HKEY_CURRENT_CONFIG) + return "HKEY_CURRENT_CONFIG"; + else if (hKey == HKEY_DYN_DATA) + return "HKEY_DYN_DATA"; + else + return "invalid registry key"; +} + +void _LogData2Hex(char *buf, size_t buflen, unsigned char *data, size_t datalen) +{ + char *p = buf; + + size_t i; + + int dots = 0; + size_t bufbytes = buflen / 3; // 2 hex digits, one space/null + + if (datalen > bufbytes) + { + bufbytes--; + dots = 1; + } + else + bufbytes = datalen; + + for (i = 0; i < bufbytes; i++) + { + wsprintf(p, "%02x%c", data[i], (i == bufbytes - 1) ? '\0' : ' '); + p += 3; + } + + if (dots) + mystrcat(buf, "..."); +} + void log_printf(char *format, ...) { va_list val; diff --git a/Source/exehead/util.h b/Source/exehead/util.h index 8315cd57..ba0811a5 100644 --- a/Source/exehead/util.h +++ b/Source/exehead/util.h @@ -30,6 +30,8 @@ int NSISCALL my_GetDialogItemText(UINT idx, char *val); #ifdef NSIS_CONFIG_LOG extern char log_text[NSIS_MAX_STRLEN*4]; void NSISCALL log_write(int close); +const char * _RegKeyHandleToName(HKEY hKey); +void _LogData2Hex(char *buf, size_t buflen, unsigned char *data, size_t datalen); void log_printf(char *format, ...); #define log_printf2(x1,x2) log_printf(x1,x2); #define log_printf3(x1,x2,x3) log_printf(x1,x2,x3); @@ -38,6 +40,8 @@ void log_printf(char *format, ...); #define log_printf6(x1,x2,x3,x4,x5,x6) log_printf(x1,x2,x3,x4,x5,x6); #define log_printf7(x1,x2,x3,x4,x5,x6,x7) log_printf(x1,x2,x3,x4,x5,x6,x7); #define log_printf8(x1,x2,x3,x4,x5,x6,x7,x8) log_printf(x1,x2,x3,x4,x5,x6,x7,x8); +#define RegKeyHandleToName(x1) _RegKeyHandleToName(x1); +#define LogData2Hex(x1,x2,x3,x4) _LogData2Hex(x1,x2,x3,x4); extern int log_dolog; extern char g_log_file[1024]; #else @@ -49,6 +53,8 @@ extern char g_log_file[1024]; #define log_printf6(x1,x2,x3,x4,x5,x6) #define log_printf7(x1,x2,x3,x4,x5,x6,x7) #define log_printf8(x1,x2,x3,x4,x5,x6,x7,x8) +#define RegKeyHandleToName(x1) NULL +#define LogData2Hex(x1,x2,x3,x4) #endif HANDLE NSISCALL myCreateProcess(char *cmd, char *dir);