D.6 如何读取 REG_MULTI_SZ 值
优质
小牛编辑
133浏览
2023-12-01
我写这个脚本来帮助这个帖子里的 rpetges。它可以读取一个注册表 REG_MULTI_SZ 类型的键值并输出。当然不要忘了修改标有“修改这里”的地方。该注册表键必须为 REG_MULTI_SZ 类型,否则将显示错误。
OutFile "REG_MULTI_SZ Reader.exe" Name "REG_MULTI_SZ Reader" ShowInstDetails show !define HKEY_CLASSES_ROOT 0x80000000 !define HKEY_CURRENT_USER 0x80000001 !define HKEY_LOCAL_MACHINE 0x80000002 !define HKEY_USERS 0x80000003 !define HKEY_PERFORMANCE_DATA 0x80000004 !define HKEY_PERFORMANCE_TEXT 0x80000050 !define HKEY_PERFORMANCE_NLSTEXT 0x80000060 !define HKEY_CURRENT_CONFIG 0x80000005 !define HKEY_DYN_DATA 0x80000006 !define KEY_QUERY_VALUE 0x0001 !define KEY_ENUMERATE_SUB_KEYS 0x0008 !define REG_NONE 0 !define REG_SZ 1 !define REG_EXPAND_SZ 2 !define REG_BINARY 3 !define REG_DWORD 4 !define REG_DWORD_LITTLE_ENDIAN 4 !define REG_DWORD_BIG_ENDIAN 5 !define REG_LINK 6 !define REG_MULTI_SZ 7 !define RegOpenKeyEx "Advapi32::RegOpenKeyExA(i, t, i, i, i) i" !define RegQueryValueEx "Advapi32::RegQueryValueExA(i, t, i, i, i, i) i" !define RegCloseKey "Advapi32::RegCloseKeyA(i) i" ####### 编辑这里! !define ROOT_KEY ${HKEY_CURRENT_USER} !define SUB_KEY "Software\Joe Software" !define VALUE "Strings" ####### 停止编辑 Section "Read" StrCpy $0 "" StrCpy $1 "" StrCpy $2 "" StrCpy $3 "" SetPluginUnload alwaysoff ;插件调用设置为全部不卸载以提高速度 System::Call "*(i) i (0) .r0" System::Call "*(i) i (0) .r1" System::Call "*(i) i (0) .r2" System::Call "${RegOpenKeyEx}(${ROOT_KEY}, '${SUB_KEY}', \ 0, ${KEY_QUERY_VALUE}|${KEY_ENUMERATE_SUB_KEYS}, r0) .r3" StrCmp $3 0 goon MessageBox MB_OK|MB_ICONSTOP "不能打开注册表键! ($3)" Goto done goon: System::Call "*$0(&i4 .r4)" System::Call "${RegQueryValueEx}(r4, '${VALUE}', 0, r1, 0, r2) .r3" StrCmp $3 0 read MessageBox MB_OK|MB_ICONSTOP "不能查询注册表值! ($3)" Goto done read: System::Call "*$1(&i4 .r3)" StrCmp $3 ${REG_MULTI_SZ} multisz MessageBox MB_OK|MB_ICONSTOP "注册表值不是 SZ_MULTI_SZ! ($3)" Goto done multisz: System::Call "*$2(&i4 .r3)" StrCmp $3 0 0 multiszalloc MessageBox MB_OK|MB_ICONSTOP "注册表值为空! ($3)" Goto done multiszalloc: System::Free $1 System::Alloc $3 Pop $1 StrCmp $1 0 0 multiszget MessageBox MB_OK|MB_ICONSTOP "不能分配足够的内存! ($3)" Goto done multiszget: System::Call "${RegQueryValueEx}(r4, '${VALUE}', 0, 0, r1, r2) .r3" StrCmp $3 0 multiszprocess MessageBox MB_OK|MB_ICONSTOP "不能查询注册表值! ($3)[2]" Goto done multiszprocess: StrCpy $4 $1 loop: System::Call "*$4(&t${NSIS_MAX_STRLEN} .r3)" StrCmp $3 "" done DetailPrint $3 StrLen $5 $3 IntOp $4 $4 + $5 IntOp $4 $4 + 1 ;REG_MULTI_SZ 类型以一个 NULL 来分隔 Goto loop done: System::Free $2 System::Free $1 StrCmp $0 0 noClose System::Call "${RegCloseKey}(r0)" noClose: SetPluginUnload manual ;插件调用改为正常 System::Free $0 ;最后一次插件调用必须卸载 SectionEnd
written by KiCHiK