Setup.ScriptFunc.pas 98 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870
  1. unit Setup.ScriptFunc;
  2. {
  3. Inno Setup
  4. Copyright (C) 1997-2025 Jordan Russell
  5. Portions by Martijn Laan
  6. For conditions of distribution and use, see LICENSE.TXT.
  7. Script support functions (run time - used by Setup)
  8. }
  9. interface
  10. uses
  11. uPSRuntime;
  12. procedure ScriptFuncLibraryRegister_R(ScriptInterpreter: TPSExec);
  13. implementation
  14. uses
  15. Windows,
  16. Forms, SysUtils, Classes, Graphics, ActiveX, Generics.Collections,
  17. uPSUtils, PathFunc, BrowseFunc, MD5, SHA1, SHA256, BitmapImage, PSStackHelper,
  18. Shared.Struct, Setup.ScriptDlg, Setup.MainFunc, Shared.CommonFunc.Vcl,
  19. Shared.CommonFunc, Shared.FileClass, SetupLdrAndSetup.RedirFunc,
  20. Setup.Install, SetupLdrAndSetup.InstFunc, Setup.InstFunc, Setup.InstFunc.Ole,
  21. SetupLdrAndSetup.Messages, Shared.SetupMessageIDs, Setup.NewDiskForm,
  22. Setup.WizardForm, Shared.VerInfoFunc, Shared.SetupTypes,
  23. Shared.Int64Em, Setup.LoggingFunc, Setup.SetupForm, Setup.RegDLL, Setup.Helper,
  24. Setup.SpawnClient, Setup.DotNetFunc, Setup.MainForm,
  25. Shared.DotNetVersion, Setup.MsiFunc, Compression.SevenZipDecoder,
  26. Setup.DebugClient, Shared.ScriptFunc, Setup.ScriptFunc.HelperFunc;
  27. type
  28. TScriptFunc = reference to procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal);
  29. TScriptFuncTyp = (sfNormal, sfNoUninstall, sfOnlyUninstall);
  30. TScriptFuncEx = record
  31. OrgName: AnsiString;
  32. ScriptFunc: TScriptFunc;
  33. Typ: TScriptFuncTyp;
  34. constructor Create(const AOrgName: AnsiString; const AScriptFunc: TScriptFunc; const ATyp: TScriptFuncTyp);
  35. procedure Run(const Caller: TPSExec; const Stack: TPSStack);
  36. end;
  37. TScriptFuncs = TDictionary<AnsiString, TScriptFuncEx>;
  38. var
  39. ScriptFuncs: TScriptFuncs;
  40. constructor TScriptFuncEx.Create(const AOrgName: AnsiString; const AScriptFunc: TScriptFunc; const ATyp: TScriptFuncTyp);
  41. begin
  42. OrgName := AOrgName;
  43. ScriptFunc := AScriptFunc;
  44. Typ := ATyp;
  45. end;
  46. procedure TScriptFuncEx.Run(const Caller: TPSExec; const Stack: TPSStack);
  47. begin
  48. if (Typ = sfNoUninstall) and IsUninstaller then
  49. NoUninstallFuncError(OrgName)
  50. else if (Typ = sfOnlyUninstall) and not IsUninstaller then
  51. OnlyUninstallFuncError(OrgName)
  52. else
  53. ScriptFunc(Caller, OrgName, Stack, Stack.Count-1);
  54. end;
  55. { Called by ROPS }
  56. function ScriptFuncPSProc(Caller: TPSExec; Proc: TPSExternalProcRec; Global, Stack: TPSStack): Boolean;
  57. begin
  58. var ScriptFuncEx: TScriptFuncEx;
  59. Result := ScriptFuncs.TryGetValue(Proc.Name, ScriptFuncEx);
  60. if Result then
  61. ScriptFuncEx.Run(Caller, Stack);
  62. end;
  63. procedure ScriptFuncLibraryRegister_R(ScriptInterpreter: TPSExec);
  64. {$IFDEF DEBUG}
  65. var
  66. Count: Integer;
  67. {$ENDIF}
  68. procedure RegisterScriptFunc(const Name: AnsiString; const ScriptFuncTyp: TScriptFuncTyp; const ScriptFunc: TScriptFunc); overload;
  69. begin
  70. var ScriptFuncEx: TScriptFuncEx;
  71. ScriptFuncs.Add(FastUpperCase(Name), TScriptFuncEx.Create(Name, ScriptFunc, ScriptFuncTyp));
  72. ScriptInterpreter.RegisterFunctionName(Name, ScriptFuncPSProc, nil, nil);
  73. {$IFDEF DEBUG}
  74. Inc(Count);
  75. {$ENDIF}
  76. end;
  77. procedure RegisterScriptFunc(const Names: array of AnsiString; const ScriptFuncTyp: TScriptFuncTyp; const ScriptFunc: TScriptFunc); overload;
  78. begin
  79. for var Name in Names do
  80. RegisterScriptFunc(Name, ScriptFuncTyp, ScriptFunc);
  81. end;
  82. procedure RegisterScriptFunc(const Name: AnsiString; const ScriptFunc: TScriptFunc); overload;
  83. begin
  84. RegisterScriptFunc(Name, sfNormal, ScriptFunc);
  85. end;
  86. procedure RegisterScriptFunc(const Names: array of AnsiString; const ScriptFunc: TScriptFunc); overload;
  87. begin
  88. for var Name in Names do
  89. RegisterScriptFunc(Name, ScriptFunc);
  90. end;
  91. procedure RegisterScriptDlgScriptFuncs;
  92. begin
  93. RegisterScriptFunc('PageFromID', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  94. begin
  95. Stack.SetClass(PStart, GetWizardForm.PageFromID(Stack.GetInt(PStart-1)));
  96. end);
  97. RegisterScriptFunc('PageIndexFromID', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  98. begin
  99. Stack.SetInt(PStart, GetWizardForm.PageIndexFromID(Stack.GetInt(PStart-1)));
  100. end);
  101. RegisterScriptFunc('CreateCustomPage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  102. begin
  103. var NewPage := TWizardPage.Create(GetWizardForm);
  104. try
  105. NewPage.Caption := Stack.GetString(PStart-2);
  106. NewPage.Description := Stack.GetString(PStart-3);
  107. GetWizardForm.AddPage(NewPage, Stack.GetInt(PStart-1));
  108. except
  109. NewPage.Free;
  110. raise;
  111. end;
  112. Stack.SetClass(PStart, NewPage);
  113. end);
  114. RegisterScriptFunc('CreateInputQueryPage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  115. begin
  116. var NewInputQueryPage := TInputQueryWizardPage.Create(GetWizardForm);
  117. try
  118. NewInputQueryPage.Caption := Stack.GetString(PStart-2);
  119. NewInputQueryPage.Description := Stack.GetString(PStart-3);
  120. GetWizardForm.AddPage(NewInputQueryPage, Stack.GetInt(PStart-1));
  121. NewInputQueryPage.Initialize(Stack.GetString(PStart-4));
  122. except
  123. NewInputQueryPage.Free;
  124. raise;
  125. end;
  126. Stack.SetClass(PStart, NewInputQueryPage);
  127. end);
  128. RegisterScriptFunc('CreateInputOptionPage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  129. begin
  130. var NewInputOptionPage := TInputOptionWizardPage.Create(GetWizardForm);
  131. try
  132. NewInputOptionPage.Caption := Stack.GetString(PStart-2);
  133. NewInputOptionPage.Description := Stack.GetString(PStart-3);
  134. GetWizardForm.AddPage(NewInputOptionPage, Stack.GetInt(PStart-1));
  135. NewInputOptionPage.Initialize(Stack.GetString(PStart-4),
  136. Stack.GetBool(PStart-5), Stack.GetBool(PStart-6));
  137. except
  138. NewInputOptionPage.Free;
  139. raise;
  140. end;
  141. Stack.SetClass(PStart, NewInputOptionPage);
  142. end);
  143. RegisterScriptFunc('CreateInputDirPage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  144. begin
  145. var NewInputDirPage := TInputDirWizardPage.Create(GetWizardForm);
  146. try
  147. NewInputDirPage.Caption := Stack.GetString(PStart-2);
  148. NewInputDirPage.Description := Stack.GetString(PStart-3);
  149. GetWizardForm.AddPage(NewInputDirPage, Stack.GetInt(PStart-1));
  150. NewInputDirPage.Initialize(Stack.GetString(PStart-4), Stack.GetBool(PStart-5),
  151. Stack.GetString(PStart-6));
  152. except
  153. NewInputDirPage.Free;
  154. raise;
  155. end;
  156. Stack.SetClass(PStart, NewInputDirPage);
  157. end);
  158. RegisterScriptFunc('CreateInputFilePage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  159. begin
  160. var NewInputFilePage := TInputFileWizardPage.Create(GetWizardForm);
  161. try
  162. NewInputFilePage.Caption := Stack.GetString(PStart-2);
  163. NewInputFilePage.Description := Stack.GetString(PStart-3);
  164. GetWizardForm.AddPage(NewInputFilePage, Stack.GetInt(PStart-1));
  165. NewInputFilePage.Initialize(Stack.GetString(PStart-4));
  166. except
  167. NewInputFilePage.Free;
  168. raise;
  169. end;
  170. Stack.SetClass(PStart, NewInputFilePage);
  171. end);
  172. RegisterScriptFunc('CreateOutputMsgPage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  173. begin
  174. var NewOutputMsgPage := TOutputMsgWizardPage.Create(GetWizardForm);
  175. try
  176. NewOutputMsgPage.Caption := Stack.GetString(PStart-2);
  177. NewOutputMsgPage.Description := Stack.GetString(PStart-3);
  178. GetWizardForm.AddPage(NewOutputMsgPage, Stack.GetInt(PStart-1));
  179. NewOutputMsgPage.Initialize(Stack.GetString(PStart-4));
  180. except
  181. NewOutputMsgPage.Free;
  182. raise;
  183. end;
  184. Stack.SetClass(PStart, NewOutputMsgPage);
  185. end);
  186. RegisterScriptFunc('CreateOutputMsgMemoPage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  187. begin
  188. var NewOutputMsgMemoPage := TOutputMsgMemoWizardPage.Create(GetWizardForm);
  189. try
  190. NewOutputMsgMemoPage.Caption := Stack.GetString(PStart-2);
  191. NewOutputMsgMemoPage.Description := Stack.GetString(PStart-3);
  192. GetWizardForm.AddPage(NewOutputMsgMemoPage, Stack.GetInt(PStart-1));
  193. NewOutputMsgMemoPage.Initialize(Stack.GetString(PStart-4),
  194. Stack.GetAnsiString(PStart-5));
  195. except
  196. NewOutputMsgMemoPage.Free;
  197. raise;
  198. end;
  199. Stack.SetClass(PStart, NewOutputMsgMemoPage);
  200. end);
  201. RegisterScriptFunc('CreateOutputProgressPage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  202. begin
  203. var NewOutputProgressPage := TOutputProgressWizardPage.Create(GetWizardForm);
  204. try
  205. NewOutputProgressPage.Caption := Stack.GetString(PStart-1);
  206. NewOutputProgressPage.Description := Stack.GetString(PStart-2);
  207. GetWizardForm.AddPage(NewOutputProgressPage, -1);
  208. NewOutputProgressPage.Initialize;
  209. except
  210. NewOutputProgressPage.Free;
  211. raise;
  212. end;
  213. Stack.SetClass(PStart, NewOutputProgressPage);
  214. end);
  215. RegisterScriptFunc('CreateOutputMarqueeProgressPage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  216. begin
  217. var NewOutputMarqueeProgressPage := TOutputMarqueeProgressWizardPage.Create(GetWizardForm);
  218. try
  219. NewOutputMarqueeProgressPage.Caption := Stack.GetString(PStart-1);
  220. NewOutputMarqueeProgressPage.Description := Stack.GetString(PStart-2);
  221. GetWizardForm.AddPage(NewOutputMarqueeProgressPage, -1);
  222. NewOutputMarqueeProgressPage.Initialize;
  223. except
  224. NewOutputMarqueeProgressPage.Free;
  225. raise;
  226. end;
  227. Stack.SetClass(PStart, NewOutputMarqueeProgressPage);
  228. end);
  229. RegisterScriptFunc('CreateDownloadPage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  230. begin;
  231. var NewDownloadPage := TDownloadWizardPage.Create(GetWizardForm);
  232. try
  233. NewDownloadPage.Caption := Stack.GetString(PStart-1);
  234. NewDownloadPage.Description := Stack.GetString(PStart-2);
  235. GetWizardForm.AddPage(NewDownloadPage, -1);
  236. NewDownloadPage.Initialize;
  237. NewDownloadPage.OnDownloadProgress := TOnDownloadProgress(Stack.GetProc(PStart-3, Caller));
  238. except
  239. NewDownloadPage.Free;
  240. raise;
  241. end;
  242. Stack.SetClass(PStart, NewDownloadPage);
  243. end);
  244. RegisterScriptFunc('CreateExtractionPage', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  245. begin
  246. var NewExtractionPage := TExtractionWizardPage.Create(GetWizardForm);
  247. try
  248. NewExtractionPage.Caption := Stack.GetString(PStart-1);
  249. NewExtractionPage.Description := Stack.GetString(PStart-2);
  250. GetWizardForm.AddPage(NewExtractionPage, -1);
  251. NewExtractionPage.Initialize;
  252. NewExtractionPage.OnExtractionProgress := TOnExtractionProgress(Stack.GetProc(PStart-3, Caller));
  253. except
  254. NewExtractionPage.Free;
  255. raise;
  256. end;
  257. Stack.SetClass(PStart, NewExtractionPage);
  258. end);
  259. RegisterScriptFunc('SCALEX', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  260. begin
  261. InitializeScaleBaseUnits;
  262. Stack.SetInt(PStart, MulDiv(Stack.GetInt(PStart-1), ScaleBaseUnitX, OrigBaseUnitX));
  263. end);
  264. RegisterScriptFunc('SCALEY', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  265. begin
  266. InitializeScaleBaseUnits;
  267. Stack.SetInt(PStart, MulDiv(Stack.GetInt(PStart-1), ScaleBaseUnitY, OrigBaseUnitY));
  268. end);
  269. RegisterScriptFunc('CREATECUSTOMFORM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  270. begin
  271. var NewSetupForm := TSetupForm.CreateNew(nil);
  272. try
  273. NewSetupForm.PopupMode := pmAuto;
  274. NewSetupForm.AutoScroll := False;
  275. NewSetupForm.BorderStyle := bsDialog;
  276. NewSetupForm.InitializeFont;
  277. except
  278. NewSetupForm.Free;
  279. raise;
  280. end;
  281. Stack.SetClass(PStart, NewSetupForm);
  282. end);
  283. end;
  284. procedure RegisterNewDiskFormScriptFuncs;
  285. begin
  286. RegisterScriptFunc('SELECTDISK', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  287. begin
  288. var S := Stack.GetString(PStart-3);
  289. Stack.SetBool(PStart, SelectDisk(Stack.GetInt(PStart-1), Stack.GetString(PStart-2), S));
  290. Stack.SetString(PStart-3, S);
  291. end);
  292. end;
  293. procedure RegisterBrowseFuncScriptFuncs;
  294. begin
  295. RegisterScriptFunc('BROWSEFORFOLDER', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  296. begin
  297. var S := Stack.GetString(PStart-2);
  298. Stack.SetBool(PStart, BrowseForFolder(Stack.GetString(PStart-1), S, GetOwnerWndForMessageBox, Stack.GetBool(PStart-3)));
  299. Stack.SetString(PStart-2, S);
  300. end);
  301. RegisterScriptFunc('GETOPENFILENAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  302. begin
  303. var S := Stack.GetString(PStart-2);
  304. Stack.SetBool(PStart, NewGetOpenFileName(Stack.GetString(PStart-1), S, Stack.GetString(PStart-3), Stack.GetString(PStart-4), Stack.GetString(PStart-5), GetOwnerWndForMessageBox));
  305. Stack.SetString(PStart-2, S);
  306. end);
  307. RegisterScriptFunc('GETOPENFILENAMEMULTI', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  308. begin
  309. Stack.SetBool(PStart, NewGetOpenFileNameMulti(Stack.GetString(PStart-1), TStrings(Stack.GetClass(PStart-2)), Stack.GetString(PStart-3), Stack.GetString(PStart-4), Stack.GetString(PStart-5), GetOwnerWndForMessageBox));
  310. end);
  311. RegisterScriptFunc('GETSAVEFILENAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  312. begin
  313. var S := Stack.GetString(PStart-2);
  314. Stack.SetBool(PStart, NewGetSaveFileName(Stack.GetString(PStart-1), S, Stack.GetString(PStart-3), Stack.GetString(PStart-4), Stack.GetString(PStart-5), GetOwnerWndForMessageBox));
  315. Stack.SetString(PStart-2, S);
  316. end);
  317. end;
  318. procedure RegisterCommonFuncVclScriptFuncs;
  319. begin
  320. RegisterScriptFunc('MINIMIZEPATHNAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  321. begin
  322. Stack.SetString(PStart, MinimizePathName(Stack.GetString(PStart-1), TFont(Stack.GetClass(PStart-2)), Stack.GetInt(PStart-3)));
  323. end);
  324. end;
  325. procedure RegisterCommonFuncScriptFuncs;
  326. begin
  327. RegisterScriptFunc('FILEEXISTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  328. begin
  329. Stack.SetBool(PStart, NewFileExistsRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
  330. end);
  331. RegisterScriptFunc('DIREXISTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  332. begin
  333. Stack.SetBool(PStart, DirExistsRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
  334. end);
  335. RegisterScriptFunc('FILEORDIREXISTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  336. begin
  337. Stack.SetBool(PStart, FileOrDirExistsRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
  338. end);
  339. RegisterScriptFunc('GETINISTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  340. begin
  341. Stack.SetString(PStart, GetIniString(Stack.GetString(PStart-1), Stack.GetString(PStart-2), Stack.GetString(PStart-3), Stack.GetString(PStart-4)));
  342. end);
  343. RegisterScriptFunc('GETINIINT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  344. begin
  345. Stack.SetInt(PStart, GetIniInt(Stack.GetString(PStart-1), Stack.GetString(PStart-2), Stack.GetInt(PStart-3), Stack.GetInt(PStart-4), Stack.GetInt(PStart-5), Stack.GetString(PStart-6)));
  346. end);
  347. RegisterScriptFunc('GETINIBOOL', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  348. begin
  349. Stack.SetBool(PStart, GetIniBool(Stack.GetString(PStart-1), Stack.GetString(PStart-2), Stack.GetBool(PStart-3), Stack.GetString(PStart-4)));
  350. end);
  351. RegisterScriptFunc('INIKEYEXISTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  352. begin
  353. Stack.SetBool(PStart, IniKeyExists(Stack.GetString(PStart-1), Stack.GetString(PStart-2), Stack.GetString(PStart-3)));
  354. end);
  355. RegisterScriptFunc('ISINISECTIONEMPTY', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  356. begin
  357. Stack.SetBool(PStart, IsIniSectionEmpty(Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
  358. end);
  359. RegisterScriptFunc('SETINISTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  360. begin
  361. Stack.SetBool(PStart, SetIniString(Stack.GetString(PStart-1), Stack.GetString(PStart-2), Stack.GetString(PStart-3), Stack.GetString(PStart-4)));
  362. end);
  363. RegisterScriptFunc('SETINIINT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  364. begin
  365. Stack.SetBool(PStart, SetIniInt(Stack.GetString(PStart-1), Stack.GetString(PStart-2), Stack.GetInt(PStart-3), Stack.GetString(PStart-4)));
  366. end);
  367. RegisterScriptFunc('SETINIBOOL', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  368. begin
  369. Stack.SetBool(PStart, SetIniBool(Stack.GetString(PStart-1), Stack.GetString(PStart-2), Stack.GetBool(PStart-3), Stack.GetString(PStart-4)));
  370. end);
  371. RegisterScriptFunc('DELETEINIENTRY', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  372. begin
  373. DeleteIniEntry(Stack.GetString(PStart), Stack.GetString(PStart-1), Stack.GetString(PStart-2));
  374. end);
  375. RegisterScriptFunc('DELETEINISECTION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  376. begin
  377. DeleteIniSection(Stack.GetString(PStart), Stack.GetString(PStart-1));
  378. end);
  379. RegisterScriptFunc('GETENV', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  380. begin
  381. Stack.SetString(PStart, GetEnv(Stack.GetString(PStart-1)));
  382. end);
  383. RegisterScriptFunc('GETCMDTAIL', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  384. begin
  385. Stack.SetString(PStart, GetCmdTail);
  386. end);
  387. RegisterScriptFunc('PARAMCOUNT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  388. begin
  389. if NewParamsForCode.Count = 0 then
  390. InternalError('NewParamsForCode not set');
  391. Stack.SetInt(PStart, NewParamsForCode.Count-1);
  392. end);
  393. RegisterScriptFunc('PARAMSTR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  394. begin
  395. var I := Stack.GetInt(PStart-1);
  396. if (I >= 0) and (I < NewParamsForCode.Count) then
  397. Stack.SetString(PStart, NewParamsForCode[I])
  398. else
  399. Stack.SetString(PStart, '');
  400. end);
  401. RegisterScriptFunc('ADDBACKSLASH', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  402. begin
  403. Stack.SetString(PStart, AddBackslash(Stack.GetString(PStart-1)));
  404. end);
  405. RegisterScriptFunc('REMOVEBACKSLASH', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  406. begin
  407. Stack.SetString(PStart, RemoveBackslash(Stack.GetString(PStart-1)));
  408. end);
  409. RegisterScriptFunc('REMOVEBACKSLASHUNLESSROOT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  410. begin
  411. Stack.SetString(PStart, RemoveBackslashUnlessRoot(Stack.GetString(PStart-1)));
  412. end);
  413. RegisterScriptFunc('ADDQUOTES', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  414. begin
  415. Stack.SetString(PStart, AddQuotes(Stack.GetString(PStart-1)));
  416. end);
  417. RegisterScriptFunc('REMOVEQUOTES', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  418. begin
  419. Stack.SetString(PStart, RemoveQuotes(Stack.GetString(PStart-1)));
  420. end);
  421. RegisterScriptFunc('GETSHORTNAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  422. begin
  423. Stack.SetString(PStart, GetShortNameRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
  424. end);
  425. RegisterScriptFunc('GETWINDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  426. begin
  427. Stack.SetString(PStart, GetWinDir);
  428. end);
  429. RegisterScriptFunc('GETSYSTEMDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  430. begin
  431. Stack.SetString(PStart, GetSystemDir);
  432. end);
  433. RegisterScriptFunc('GETSYSWOW64DIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  434. begin
  435. Stack.SetString(PStart, GetSysWow64Dir);
  436. end);
  437. RegisterScriptFunc('GETSYSNATIVEDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  438. begin
  439. Stack.SetString(PStart, GetSysNativeDir(IsWin64));
  440. end);
  441. RegisterScriptFunc('GETTEMPDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  442. begin
  443. Stack.SetString(PStart, GetTempDir);
  444. end);
  445. RegisterScriptFunc('STRINGCHANGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  446. begin
  447. var S := Stack.GetString(PStart-1);
  448. Stack.SetInt(PStart, StringChange(S, Stack.GetString(PStart-2), Stack.GetString(PStart-3)));
  449. Stack.SetString(PStart-1, S);
  450. end);
  451. RegisterScriptFunc('STRINGCHANGEEX', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  452. begin
  453. var S := Stack.GetString(PStart-1);
  454. Stack.SetInt(PStart, StringChangeEx(S, Stack.GetString(PStart-2), Stack.GetString(PStart-3), Stack.GetBool(PStart-4)));
  455. Stack.SetString(PStart-1, S);
  456. end);
  457. RegisterScriptFunc('USINGWINNT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  458. begin
  459. Stack.SetBool(PStart, True);
  460. end);
  461. RegisterScriptFunc(['COPYFILE', 'FILECOPY'], procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  462. begin
  463. var ExistingFilename := Stack.GetString(PStart-1);
  464. if not IsProtectedSrcExe(ExistingFilename) then
  465. Stack.SetBool(PStart, CopyFileRedir(ScriptFuncDisableFsRedir,
  466. ExistingFilename, Stack.GetString(PStart-2), Stack.GetBool(PStart-3)))
  467. else
  468. Stack.SetBool(PStart, False);
  469. end);
  470. RegisterScriptFunc('CONVERTPERCENTSTR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  471. begin
  472. var S := Stack.GetString(PStart-1);
  473. Stack.SetBool(PStart, ConvertPercentStr(S));
  474. Stack.SetString(PStart-1, S);
  475. end);
  476. RegisterScriptFunc('REGKEYEXISTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  477. begin
  478. var RegView: TRegView;
  479. var RootKey: HKEY;
  480. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  481. var SubKeyName := Stack.GetString(PStart-2);
  482. var K: HKEY;
  483. if RegOpenKeyExView(RegView, RootKey, PChar(SubKeyName), 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin
  484. Stack.SetBool(PStart, True);
  485. RegCloseKey(K);
  486. end else
  487. Stack.SetBool(PStart, False);
  488. end);
  489. RegisterScriptFunc('REGVALUEEXISTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  490. begin
  491. var RegView: TRegView;
  492. var RootKey: HKEY;
  493. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  494. var SubKeyName := Stack.GetString(PStart-2);
  495. var K: HKEY;
  496. if RegOpenKeyExView(RegView, RootKey, PChar(SubKeyName), 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin
  497. var ValueName := Stack.GetString(PStart-3);
  498. Stack.SetBool(PStart, RegValueExists(K, PChar(ValueName)));
  499. RegCloseKey(K);
  500. end else
  501. Stack.SetBool(PStart, False);
  502. end);
  503. RegisterScriptFunc('REGDELETEKEYINCLUDINGSUBKEYS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  504. begin
  505. var RegView: TRegView;
  506. var RootKey: HKEY;
  507. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  508. var SubKey := Stack.GetString(PStart-2);
  509. Stack.SetBool(PStart, RegDeleteKeyIncludingSubkeys(RegView, RootKey, PChar(SubKey)) = ERROR_SUCCESS);
  510. end);
  511. RegisterScriptFunc('REGDELETEKEYIFEMPTY', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  512. begin
  513. var RegView: TRegView;
  514. var RootKey: HKEY;
  515. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  516. var SubKeyName := Stack.GetString(PStart-2);
  517. Stack.SetBool(PStart, RegDeleteKeyIfEmpty(RegView, RootKey, PChar(SubKeyName)) = ERROR_SUCCESS);
  518. end);
  519. RegisterScriptFunc('REGDELETEVALUE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  520. begin
  521. var RegView: TRegView;
  522. var RootKey: HKEY;
  523. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  524. var SubKeyName := Stack.GetString(PStart-2);
  525. var K: HKEY;
  526. if RegOpenKeyExView(RegView, RootKey, PChar(SubKeyName), 0, KEY_SET_VALUE, K) = ERROR_SUCCESS then begin
  527. var ValueName := Stack.GetString(PStart-3);
  528. Stack.SetBool(PStart, RegDeleteValue(K, PChar(ValueName)) = ERROR_SUCCESS);
  529. RegCloseKey(K);
  530. end else
  531. Stack.SetBool(PStart, False);
  532. end);
  533. RegisterScriptFunc('REGGETSUBKEYNAMES', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  534. begin
  535. var RegView: TRegView;
  536. var RootKey: HKEY;
  537. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  538. Stack.SetBool(PStart, GetSubkeyOrValueNames(RegView, RootKey,
  539. Stack.GetString(PStart-2), Stack, PStart-3, True));
  540. end);
  541. RegisterScriptFunc('REGGETVALUENAMES', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  542. begin
  543. var RegView: TRegView;
  544. var RootKey: HKEY;
  545. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  546. Stack.SetBool(PStart, GetSubkeyOrValueNames(RegView, RootKey,
  547. Stack.GetString(PStart-2), Stack, PStart-3, False));
  548. end);
  549. RegisterScriptFunc('REGQUERYSTRINGVALUE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  550. begin
  551. var RegView: TRegView;
  552. var RootKey: HKEY;
  553. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  554. var SubKeyName := Stack.GetString(PStart-2);
  555. var K: HKEY;
  556. if RegOpenKeyExView(RegView, RootKey, PChar(SubKeyName), 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin
  557. var ValueName := Stack.GetString(PStart-3);
  558. var S := Stack.GetString(PStart-4);
  559. Stack.SetBool(PStart, RegQueryStringValue(K, PChar(ValueName), S));
  560. Stack.SetString(PStart-4, S);
  561. RegCloseKey(K);
  562. end else
  563. Stack.SetBool(PStart, False);
  564. end);
  565. RegisterScriptFunc('REGQUERYMULTISTRINGVALUE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  566. begin
  567. var RegView: TRegView;
  568. var RootKey: HKEY;
  569. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  570. var SubKeyName := Stack.GetString(PStart-2);
  571. var K: HKEY;
  572. if RegOpenKeyExView(RegView, RootKey, PChar(SubKeyName), 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin
  573. var ValueName := Stack.GetString(PStart-3);
  574. var S := Stack.GetString(PStart-4);
  575. Stack.SetBool(PStart, RegQueryMultiStringValue(K, PChar(ValueName), S));
  576. Stack.SetString(PStart-4, S);
  577. RegCloseKey(K);
  578. end else
  579. Stack.SetBool(PStart, False);
  580. end);
  581. RegisterScriptFunc('REGQUERYDWORDVALUE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  582. begin
  583. var RegView: TRegView;
  584. var RootKey: HKEY;
  585. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  586. var SubKeyName := Stack.GetString(PStart-2);
  587. var K: HKEY;
  588. if RegOpenKeyExView(RegView, RootKey, PChar(SubKeyName), 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin
  589. var ValueName := Stack.GetString(PStart-3);
  590. var Typ, Data: DWORD;
  591. var Size: DWORD := SizeOf(Data);
  592. if (RegQueryValueEx(K, PChar(ValueName), nil, @Typ, @Data, @Size) = ERROR_SUCCESS) and (Typ = REG_DWORD) then begin
  593. Stack.SetInt(PStart-4, Data);
  594. Stack.SetBool(PStart, True);
  595. end else
  596. Stack.SetBool(PStart, False);
  597. RegCloseKey(K);
  598. end else
  599. Stack.SetBool(PStart, False);
  600. end);
  601. RegisterScriptFunc('REGQUERYBINARYVALUE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  602. begin
  603. var RegView: TRegView;
  604. var RootKey: HKEY;
  605. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  606. var SubKeyName := Stack.GetString(PStart-2);
  607. var K: HKEY;
  608. if RegOpenKeyExView(RegView, RootKey, PChar(SubKeyName), 0, KEY_QUERY_VALUE, K) = ERROR_SUCCESS then begin
  609. var ValueName := Stack.GetString(PStart-3);
  610. var Typ, Size: DWORD;
  611. if RegQueryValueEx(K, PChar(ValueName), nil, @Typ, nil, @Size) = ERROR_SUCCESS then begin
  612. var Data: AnsiString;
  613. SetLength(Data, Size);
  614. if RegQueryValueEx(K, PChar(ValueName), nil, @Typ, @Data[1], @Size) = ERROR_SUCCESS then begin
  615. Stack.SetAnsiString(PStart-4, Data);
  616. Stack.SetBool(PStart, True);
  617. end else
  618. Stack.SetBool(PStart, False);
  619. end else
  620. Stack.SetBool(PStart, False);
  621. RegCloseKey(K);
  622. end else
  623. Stack.SetBool(PStart, False);
  624. end);
  625. RegisterScriptFunc('REGWRITESTRINGVALUE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  626. begin
  627. var RegView: TRegView;
  628. var RootKey: HKEY;
  629. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  630. var SubKeyName := Stack.GetString(PStart-2);
  631. var K: HKEY;
  632. if RegCreateKeyExView(RegView, RootKey, PChar(SubKeyName), 0, nil, REG_OPTION_NON_VOLATILE, KEY_QUERY_VALUE or KEY_SET_VALUE, nil, K, nil) = ERROR_SUCCESS then begin
  633. var ValueName := Stack.GetString(PStart-3);
  634. var Data := Stack.GetString(PStart-4);
  635. var Typ, ExistingTyp: DWORD;
  636. if (RegQueryValueEx(K, PChar(ValueName), nil, @ExistingTyp, nil, nil) = ERROR_SUCCESS) and (ExistingTyp = REG_EXPAND_SZ) then
  637. Typ := REG_EXPAND_SZ
  638. else
  639. Typ := REG_SZ;
  640. if RegSetValueEx(K, PChar(ValueName), 0, Typ, PChar(Data), (Length(Data)+1)*SizeOf(Data[1])) = ERROR_SUCCESS then
  641. Stack.SetBool(PStart, True)
  642. else
  643. Stack.SetBool(PStart, False);
  644. RegCloseKey(K);
  645. end else
  646. Stack.SetBool(PStart, False);
  647. end);
  648. RegisterScriptFunc('REGWRITEEXPANDSTRINGVALUE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  649. begin
  650. var RegView: TRegView;
  651. var RootKey: HKEY;
  652. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  653. var SubKeyName := Stack.GetString(PStart-2);
  654. var K: HKEY;
  655. if RegCreateKeyExView(RegView, RootKey, PChar(SubKeyName), 0, nil, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, nil, K, nil) = ERROR_SUCCESS then begin
  656. var ValueName := Stack.GetString(PStart-3);
  657. var Data := Stack.GetString(PStart-4);
  658. if RegSetValueEx(K, PChar(ValueName), 0, REG_EXPAND_SZ, PChar(Data), (Length(Data)+1)*SizeOf(Data[1])) = ERROR_SUCCESS then
  659. Stack.SetBool(PStart, True)
  660. else
  661. Stack.SetBool(PStart, False);
  662. RegCloseKey(K);
  663. end else
  664. Stack.SetBool(PStart, False);
  665. end);
  666. RegisterScriptFunc('REGWRITEMULTISTRINGVALUE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  667. begin
  668. var RegView: TRegView;
  669. var RootKey: HKEY;
  670. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  671. var SubKeyName := Stack.GetString(PStart-2);
  672. var K: HKEY;
  673. if RegCreateKeyExView(RegView, RootKey, PChar(SubKeyName), 0, nil, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, nil, K, nil) = ERROR_SUCCESS then begin
  674. var ValueName := Stack.GetString(PStart-3);
  675. var Data := Stack.GetString(PStart-4);
  676. { Multi-string data requires two null terminators: one after the last
  677. string, and one to mark the end.
  678. Delphi's String type is implicitly null-terminated, so only one null
  679. needs to be added to the end. }
  680. if (Data <> '') and (Data[Length(Data)] <> #0) then
  681. Data := Data + #0;
  682. if RegSetValueEx(K, PChar(ValueName), 0, REG_MULTI_SZ, PChar(Data), (Length(Data)+1)*SizeOf(Data[1])) = ERROR_SUCCESS then
  683. Stack.SetBool(PStart, True)
  684. else
  685. Stack.SetBool(PStart, False);
  686. RegCloseKey(K);
  687. end else
  688. Stack.SetBool(PStart, False);
  689. end);
  690. RegisterScriptFunc('REGWRITEDWORDVALUE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  691. begin
  692. var RegView: TRegView;
  693. var RootKey: HKEY;
  694. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  695. var SubKeyName := Stack.GetString(PStart-2);
  696. var K: HKEY;
  697. if RegCreateKeyExView(RegView, RootKey, PChar(SubKeyName), 0, nil, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, nil, K, nil) = ERROR_SUCCESS then begin
  698. var ValueName := Stack.GetString(PStart-3);
  699. var Data: DWORD := Stack.GetInt(PStart-4);
  700. if RegSetValueEx(K, PChar(ValueName), 0, REG_DWORD, @Data, SizeOf(Data)) = ERROR_SUCCESS then
  701. Stack.SetBool(PStart, True)
  702. else
  703. Stack.SetBool(PStart, False);
  704. RegCloseKey(K);
  705. end else
  706. Stack.SetBool(PStart, False);
  707. end);
  708. RegisterScriptFunc('REGWRITEBINARYVALUE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  709. begin
  710. var RegView: TRegView;
  711. var RootKey: HKEY;
  712. CrackCodeRootKey(Stack.GetInt(PStart-1), RegView, RootKey);
  713. var SubKeyName := Stack.GetString(PStart-2);
  714. var K: HKEY;
  715. if RegCreateKeyExView(RegView, RootKey, PChar(SubKeyName), 0, nil, REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, nil, K, nil) = ERROR_SUCCESS then begin
  716. var ValueName := Stack.GetString(PStart-3);
  717. var Data := Stack.GetAnsiString(PStart-4);
  718. if RegSetValueEx(K, PChar(ValueName), 0, REG_BINARY, @Data[1], Length(Data)) = ERROR_SUCCESS then
  719. Stack.SetBool(PStart, True)
  720. else
  721. Stack.SetBool(PStart, False);
  722. RegCloseKey(K);
  723. end else
  724. Stack.SetBool(PStart, False);
  725. end);
  726. RegisterScriptFunc(['ISADMIN', 'ISADMINLOGGEDON'], procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  727. begin
  728. Stack.SetBool(PStart, IsAdmin);
  729. end);
  730. RegisterScriptFunc('ISPOWERUSERLOGGEDON', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  731. begin
  732. Stack.SetBool(PStart, IsPowerUserLoggedOn);
  733. end);
  734. RegisterScriptFUnc('ISADMININSTALLMODE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  735. begin
  736. Stack.SetBool(PStart, IsAdminInstallMode);
  737. end);
  738. RegisterScriptFunc('FONTEXISTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  739. begin
  740. Stack.SetBool(PStart, FontExists(Stack.GetString(PStart-1)));
  741. end);
  742. RegisterScriptFunc('GETUILANGUAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  743. begin
  744. Stack.SetInt(PStart, GetUILanguage);
  745. end);
  746. RegisterScriptFunc('ADDPERIOD', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  747. begin
  748. Stack.SetString(PStart, AddPeriod(Stack.GetString(PStart-1)));
  749. end);
  750. RegisterScriptFunc('CHARLENGTH', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  751. begin
  752. Stack.SetInt(PStart, PathCharLength(Stack.GetString(PStart-1), Stack.GetInt(PStart-2)));
  753. end);
  754. RegisterScriptFunc('SETNTFSCOMPRESSION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  755. begin
  756. Stack.SetBool(PStart, SetNTFSCompressionRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetBool(PStart-2)));
  757. end);
  758. RegisterScriptFunc('ISWILDCARD', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  759. begin
  760. Stack.SetBool(PStart, IsWildcard(Stack.GetString(PStart-1)));
  761. end);
  762. RegisterScriptFunc('WILDCARDMATCH', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  763. begin
  764. var S := Stack.GetString(PStart-1);
  765. var N := Stack.GetString(PStart-2);
  766. Stack.SetBool(PStart, WildcardMatch(PChar(S), PChar(N)));
  767. end);
  768. end;
  769. procedure RegisterInstallScriptFuncs;
  770. begin
  771. RegisterScriptFunc('ExtractTemporaryFile', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  772. begin
  773. ExtractTemporaryFile(Stack.GetString(PStart));
  774. end);
  775. RegisterScriptFunc('ExtractTemporaryFiles', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  776. begin
  777. Stack.SetInt(PStart, ExtractTemporaryFiles(Stack.GetString(PStart-1)));
  778. end);
  779. RegisterScriptFunc('DownloadTemporaryFile', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  780. begin
  781. Stack.SetInt64(PStart, DownloadTemporaryFile(Stack.GetString(PStart-1), Stack.GetString(PStart-2), Stack.GetString(PStart-3), TOnDownloadProgress(Stack.GetProc(PStart-4, Caller))));
  782. end);
  783. RegisterScriptFunc('SetDownloadCredentials', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  784. begin
  785. SetDownloadCredentials(Stack.GetString(PStart),Stack.GetString(PStart-1));
  786. end);
  787. RegisterScriptFunc('DownloadTemporaryFileSize', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  788. begin
  789. Stack.SetInt64(PStart, DownloadTemporaryFileSize(Stack.GetString(PStart-1)));
  790. end);
  791. RegisterScriptFunc('DownloadTemporaryFileDate', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  792. begin
  793. Stack.SetString(PStart, DownloadTemporaryFileDate(Stack.GetString(PStart-1)));
  794. end);
  795. end;
  796. procedure RegisterInstFuncScriptFuncs;
  797. begin
  798. RegisterScriptFunc('CHECKFORMUTEXES', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  799. begin
  800. Stack.SetBool(PStart, CheckForMutexes(Stack.GetString(PStart-1)));
  801. end);
  802. RegisterScriptFunc('DECREMENTSHAREDCOUNT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  803. begin
  804. if Stack.GetBool(PStart-1) then begin
  805. if not IsWin64 then
  806. InternalError('Cannot access 64-bit registry keys on this version of Windows');
  807. Stack.SetBool(PStart, DecrementSharedCount(rv64Bit, Stack.GetString(PStart-2)));
  808. end
  809. else
  810. Stack.SetBool(PStart, DecrementSharedCount(rv32Bit, Stack.GetString(PStart-2)));
  811. end);
  812. RegisterScriptFunc('DELAYDELETEFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  813. begin
  814. DelayDeleteFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetInt(PStart-1), 250, 250);
  815. end);
  816. RegisterScriptFunc('DELTREE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  817. begin
  818. Stack.SetBool(PStart, DelTree(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetBool(PStart-2), Stack.GetBool(PStart-3), Stack.GetBool(PStart-4), False, nil, nil, nil));
  819. end);
  820. RegisterScriptFunc('GENERATEUNIQUENAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  821. begin
  822. Stack.SetString(PStart, GenerateUniqueName(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
  823. end);
  824. RegisterScriptFunc('GETCOMPUTERNAMESTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  825. begin
  826. Stack.SetString(PStart, GetComputerNameString);
  827. end);
  828. RegisterScriptFunc('GETMD5OFFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  829. begin
  830. Stack.SetString(PStart, MD5DigestToString(GetMD5OfFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
  831. end);
  832. RegisterScriptFunc('GETMD5OFSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  833. begin
  834. Stack.SetString(PStart, MD5DigestToString(GetMD5OfAnsiString(Stack.GetAnsiString(PStart-1))));
  835. end);
  836. RegisterScriptFunc('GETMD5OFUNICODESTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  837. begin
  838. Stack.SetString(PStart, MD5DigestToString(GetMD5OfUnicodeString(Stack.GetString(PStart-1))));
  839. end);
  840. RegisterScriptFunc('GETSHA1OFFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  841. begin
  842. Stack.SetString(PStart, SHA1DigestToString(GetSHA1OfFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
  843. end);
  844. RegisterScriptFunc('GETSHA1OFSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  845. begin
  846. Stack.SetString(PStart, SHA1DigestToString(GetSHA1OfAnsiString(Stack.GetAnsiString(PStart-1))));
  847. end);
  848. RegisterScriptFunc('GETSHA1OFUNICODESTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  849. begin
  850. Stack.SetString(PStart, SHA1DigestToString(GetSHA1OfUnicodeString(Stack.GetString(PStart-1))));
  851. end);
  852. RegisterScriptFunc('GETSHA256OFFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  853. begin
  854. Stack.SetString(PStart, SHA256DigestToString(GetSHA256OfFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1))));
  855. end);
  856. RegisterScriptFunc('GETSHA256OFSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  857. begin
  858. Stack.SetString(PStart, SHA256DigestToString(GetSHA256OfAnsiString(Stack.GetAnsiString(PStart-1))));
  859. end);
  860. RegisterScriptFunc('GETSHA256OFUNICODESTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  861. begin
  862. Stack.SetString(PStart, SHA256DigestToString(GetSHA256OfUnicodeString(Stack.GetString(PStart-1))));
  863. end);
  864. RegisterScriptFunc('GETSPACEONDISK', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  865. begin
  866. var FreeBytes, TotalBytes: Integer64;
  867. if GetSpaceOnDisk(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
  868. if Stack.GetBool(PStart-2) then begin
  869. Div64(FreeBytes, 1024*1024);
  870. Div64(TotalBytes, 1024*1024);
  871. end;
  872. { Cap at 2 GB, as [Code] doesn't support 64-bit integers }
  873. if (FreeBytes.Hi <> 0) or (FreeBytes.Lo and $80000000 <> 0) then
  874. FreeBytes.Lo := $7FFFFFFF;
  875. if (TotalBytes.Hi <> 0) or (TotalBytes.Lo and $80000000 <> 0) then
  876. TotalBytes.Lo := $7FFFFFFF;
  877. Stack.SetUInt(PStart-3, FreeBytes.Lo);
  878. Stack.SetUInt(PStart-4, TotalBytes.Lo);
  879. Stack.SetBool(PStart, True);
  880. end else
  881. Stack.SetBool(PStart, False);
  882. end);
  883. RegisterScriptFunc('GETSPACEONDISK64', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  884. begin
  885. var FreeBytes, TotalBytes: Integer64;
  886. if GetSpaceOnDisk(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), FreeBytes, TotalBytes) then begin
  887. Stack.SetInt64(PStart-2, Int64(FreeBytes.Hi) shl 32 + FreeBytes.Lo);
  888. Stack.SetInt64(PStart-3, Int64(TotalBytes.Hi) shl 32 + TotalBytes.Lo);
  889. Stack.SetBool(PStart, True);
  890. end else
  891. Stack.SetBool(PStart, False);
  892. end);
  893. RegisterScriptFunc('GETUSERNAMESTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  894. begin
  895. Stack.SetString(PStart, GetUserNameString);
  896. end);
  897. RegisterScriptFunc('INCREMENTSHAREDCOUNT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  898. begin
  899. if Stack.GetBool(PStart) then begin
  900. if not IsWin64 then
  901. InternalError('Cannot access 64-bit registry keys on this version of Windows');
  902. IncrementSharedCount(rv64Bit, Stack.GetString(PStart-1), Stack.GetBool(PStart-2));
  903. end
  904. else
  905. IncrementSharedCount(rv32Bit, Stack.GetString(PStart-1), Stack.GetBool(PStart-2));
  906. end);
  907. RegisterScriptFunc(['Exec', 'ExecAsOriginalUser', 'ExecAndLogOutput', 'ExecAndCaptureOutput'], procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  908. begin
  909. var RunAsOriginalUser := OrgName = 'ExecAsOriginalUser';
  910. if IsUninstaller and RunAsOriginalUser then
  911. NoUninstallFuncError(OrgName);
  912. var Method: TMethod; { Must stay alive until OutputReader is freed }
  913. var OutputReader: TCreateProcessOutputReader := nil;
  914. try
  915. if OrgName = 'ExecAndLogOutput' then begin
  916. Method := Stack.GetProc(PStart-7, Caller);
  917. if Method.Code <> nil then
  918. OutputReader := TCreateProcessOutputReader.Create(ExecAndLogOutputLogCustom, NativeInt(@Method))
  919. else if GetLogActive then
  920. OutputReader := TCreateProcessOutputReader.Create(ExecAndLogOutputLog, 0);
  921. end else if OrgName = 'ExecAndCaptureOutput' then
  922. OutputReader := TCreateProcessOutputReader.Create(ExecAndLogOutputLog, 0, omCapture);
  923. var ExecWait := TExecWait(Stack.GetInt(PStart-5));
  924. if (OutputReader <> nil) and (ExecWait <> ewWaitUntilTerminated) then
  925. InternalError(Format('Must call "%s" function with Wait = ewWaitUntilTerminated', [OrgName]));
  926. var Filename := Stack.GetString(PStart-1);
  927. if not IsProtectedSrcExe(Filename) then begin
  928. { Disable windows so the user can't utilize our UI during the InstExec
  929. call }
  930. var WindowDisabler := TWindowDisabler.Create;
  931. var ResultCode: Integer;
  932. try
  933. Stack.SetBool(PStart, InstExecEx(RunAsOriginalUser,
  934. ScriptFuncDisableFsRedir, Filename, Stack.GetString(PStart-2),
  935. Stack.GetString(PStart-3), ExecWait,
  936. Stack.GetInt(PStart-4), ProcessMessagesProc, OutputReader, ResultCode));
  937. finally
  938. WindowDisabler.Free;
  939. end;
  940. Stack.SetInt(PStart-6, ResultCode);
  941. if OrgName = 'ExecAndCaptureOutput' then begin
  942. { Set the three TExecOutput fields }
  943. Stack.SetArray(PStart-7, OutputReader.CaptureOutList, 0);
  944. Stack.SetArray(PStart-7, OutputReader.CaptureErrList, 1);
  945. Stack.SetInt(PStart-7, OutputReader.CaptureError.ToInteger, 2);
  946. end;
  947. end else begin
  948. Stack.SetBool(PStart, False);
  949. Stack.SetInt(PStart-6, ERROR_ACCESS_DENIED);
  950. end;
  951. finally
  952. OutputReader.Free;
  953. end;
  954. end);
  955. RegisterScriptFunc(['ShellExec', 'ShellExecAsOriginalUser'], procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  956. begin
  957. var RunAsOriginalUser := OrgName = 'ShellExecAsOriginalUser';
  958. if IsUninstaller and RunAsOriginalUser then
  959. NoUninstallFuncError(OrgName);
  960. var Filename := Stack.GetString(PStart-2);
  961. if not IsProtectedSrcExe(Filename) then begin
  962. { Disable windows so the user can't utilize our UI during the
  963. InstShellExec call }
  964. var WindowDisabler := TWindowDisabler.Create;
  965. var ErrorCode: Integer;
  966. try
  967. Stack.SetBool(PStart, InstShellExecEx(RunAsOriginalUser,
  968. Stack.GetString(PStart-1), Filename, Stack.GetString(PStart-3),
  969. Stack.GetString(PStart-4), TExecWait(Stack.GetInt(PStart-6)),
  970. Stack.GetInt(PStart-5), ProcessMessagesProc, ErrorCode));
  971. finally
  972. WindowDisabler.Free;
  973. end;
  974. Stack.SetInt(PStart-7, ErrorCode);
  975. end else begin
  976. Stack.SetBool(PStart, False);
  977. Stack.SetInt(PStart-7, ERROR_ACCESS_DENIED);
  978. end;
  979. end);
  980. RegisterScriptFunc('ISPROTECTEDSYSTEMFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  981. begin
  982. Stack.SetBool(PStart, IsProtectedSystemFile(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
  983. end);
  984. RegisterScriptFunc('MAKEPENDINGFILERENAMEOPERATIONSCHECKSUM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  985. begin
  986. Stack.SetString(PStart, SHA256DigestToString(MakePendingFileRenameOperationsChecksum));
  987. end);
  988. RegisterScriptFunc('MODIFYPIFFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  989. begin
  990. Stack.SetBool(PStart, ModifyPifFile(Stack.GetString(PStart-1), Stack.GetBool(PStart-2)));
  991. end);
  992. RegisterScriptFunc('REGISTERSERVER', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  993. begin
  994. RegisterServer(False, Stack.GetBool(PStart), Stack.GetString(PStart-1), Stack.GetBool(PStart-2));
  995. end);
  996. RegisterScriptFunc('UNREGISTERSERVER', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  997. begin
  998. try
  999. RegisterServer(True, Stack.GetBool(PStart-1), Stack.GetString(PStart-2), Stack.GetBool(PStart-3));
  1000. Stack.SetBool(PStart, True);
  1001. except
  1002. Stack.SetBool(PStart, False);
  1003. end;
  1004. end);
  1005. RegisterScriptFunc('UNREGISTERFONT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1006. begin
  1007. UnregisterFont(Stack.GetString(PStart), Stack.GetString(PStart-1), Stack.GetBool(PStart-2));
  1008. end);
  1009. RegisterScriptFunc('RESTARTREPLACE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1010. begin
  1011. RestartReplace(ScriptFuncDisableFsRedir, Stack.GetString(PStart), Stack.GetString(PStart-1));
  1012. end);
  1013. RegisterScriptFunc('FORCEDIRECTORIES', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1014. begin
  1015. Stack.SetBool(PStart, ForceDirectories(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
  1016. end);
  1017. end;
  1018. procedure RegisterInstFuncOleScriptFuncs;
  1019. begin
  1020. RegisterScriptFunc('CREATESHELLLINK', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1021. begin
  1022. Stack.SetString(PStart, CreateShellLink(Stack.GetString(PStart-1),
  1023. Stack.GetString(PStart-2), Stack.GetString(PStart-3),
  1024. Stack.GetString(PStart-4), Stack.GetString(PStart-5),
  1025. Stack.GetString(PStart-6), Stack.GetInt(PStart-7),
  1026. Stack.GetInt(PStart-8), 0, '', nil, False, False));
  1027. end);
  1028. RegisterScriptFunc('REGISTERTYPELIBRARY', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1029. begin
  1030. if Stack.GetBool(PStart) then
  1031. HelperRegisterTypeLibrary(False, Stack.GetString(PStart-1))
  1032. else
  1033. RegisterTypeLibrary(Stack.GetString(PStart-1));
  1034. end);
  1035. RegisterScriptFunc('UNREGISTERTYPELIBRARY', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1036. begin
  1037. try
  1038. if Stack.GetBool(PStart-1) then
  1039. HelperRegisterTypeLibrary(True, Stack.GetString(PStart-2))
  1040. else
  1041. UnregisterTypeLibrary(Stack.GetString(PStart-2));
  1042. Stack.SetBool(PStart, True);
  1043. except
  1044. Stack.SetBool(PStart, False);
  1045. end;
  1046. end);
  1047. RegisterScriptFunc('UNPINSHELLLINK', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1048. begin
  1049. Stack.SetBool(PStart, UnpinShellLink(Stack.GetString(PStart-1)));
  1050. end);
  1051. end;
  1052. procedure RegisterMainFuncScriptFuncs;
  1053. begin
  1054. RegisterScriptFunc('ACTIVELANGUAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1055. begin
  1056. Stack.SetString(PStart, ExpandConst('{language}'));
  1057. end);
  1058. RegisterScriptFunc('EXPANDCONSTANT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1059. begin
  1060. Stack.SetString(PStart, ExpandConst(Stack.GetString(PStart-1)));
  1061. end);
  1062. RegisterScriptFunc('EXPANDCONSTANTEX', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1063. begin
  1064. Stack.SetString(PStart, ExpandConstEx(Stack.GetString(PStart-1), [Stack.GetString(PStart-2), Stack.GetString(PStart-3)]));
  1065. end);
  1066. RegisterScriptFunc('EXITSETUPMSGBOX', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1067. begin
  1068. Stack.SetBool(PStart, ExitSetupMsgBox);
  1069. end);
  1070. RegisterScriptFunc('GETSHELLFOLDERBYCSIDL', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1071. begin
  1072. Stack.SetString(PStart, GetShellFolderByCSIDL(Stack.GetInt(PStart-1), Stack.GetBool(PStart-2)));
  1073. end);
  1074. RegisterScriptFunc('INSTALLONTHISVERSION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1075. begin
  1076. var MinVersion, OnlyBelowVersion: TSetupVersionData;
  1077. if not StrToSetupVersionData(Stack.GetString(PStart-1), MinVersion) then
  1078. InternalError(Format('%s: Invalid MinVersion string', [OrgName]))
  1079. else if not StrToSetupVersionData(Stack.GetString(PStart-2), OnlyBelowVersion) then
  1080. InternalError(Format('%s: Invalid OnlyBelowVersion string', [OrgName]))
  1081. else
  1082. Stack.SetBool(PStart, (InstallOnThisVersion(MinVersion, OnlyBelowVersion) = irInstall));
  1083. end);
  1084. RegisterScriptFunc('GETWINDOWSVERSION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1085. begin
  1086. Stack.SetUInt(PStart, WindowsVersion);
  1087. end);
  1088. RegisterScriptFunc('GETWINDOWSVERSIONSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1089. begin
  1090. Stack.SetString(PStart, Format('%u.%.2u.%u', [WindowsVersion shr 24,
  1091. (WindowsVersion shr 16) and $FF, WindowsVersion and $FFFF]));
  1092. end);
  1093. RegisterScriptFunc(['MsgBox', 'SuppressibleMsgBox'], procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1094. begin
  1095. var Suppressible: Boolean;
  1096. var Default: Integer;
  1097. if OrgName = 'MsgBox' then begin
  1098. Suppressible := False;
  1099. Default := 0;
  1100. end else begin
  1101. Suppressible := True;
  1102. Default := Stack.GetInt(PStart-4);
  1103. end;
  1104. Stack.SetInt(PStart, LoggedMsgBox(Stack.GetString(PStart-1), GetMsgBoxCaption, TMsgBoxType(Stack.GetInt(PStart-2)), Stack.GetInt(PStart-3), Suppressible, Default));
  1105. end);
  1106. RegisterScriptFunc(['TaskDialogMsgBox', 'SuppressibleTaskDialogMsgBox'], procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1107. begin
  1108. var Suppressible: Boolean;
  1109. var Default: Integer;
  1110. if OrgName = 'TaskDialogMsgBox' then begin
  1111. Suppressible := False;
  1112. Default := 0;
  1113. end else begin
  1114. Suppressible := True;
  1115. Default := Stack.GetInt(PStart-7);
  1116. end;
  1117. var ButtonLabels := Stack.GetStringArray(PStart-5);
  1118. Stack.SetInt(PStart, LoggedTaskDialogMsgBox('', Stack.GetString(PStart-1), Stack.GetString(PStart-2), GetMsgBoxCaption, TMsgBoxType(Stack.GetInt(PStart-3)), Stack.GetInt(PStart-4), ButtonLabels, Stack.GetInt(PStart-6), Suppressible, Default));
  1119. end);
  1120. RegisterScriptFunc('ISWIN64', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1121. begin
  1122. Stack.SetBool(PStart, IsWin64);
  1123. end);
  1124. RegisterScriptFunc('IS64BITINSTALLMODE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1125. begin
  1126. Stack.SetBool(PStart, Is64BitInstallMode);
  1127. end);
  1128. RegisterScriptFunc('PROCESSORARCHITECTURE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1129. begin
  1130. Stack.SetInt(PStart, Integer(ProcessorArchitecture));
  1131. end);
  1132. RegisterScriptFunc(['IsArm32Compatible', 'IsArm64', 'IsX64', 'IsX64OS', 'IsX64Compatible', 'IsX86', 'IsX86OS', 'IsX86Compatible'], procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1133. begin
  1134. var ArchitectureIdentifier := LowerCase(Copy(String(OrgName), 3, MaxInt));
  1135. Stack.SetBool(PStart, EvalArchitectureIdentifier(ArchitectureIdentifier));
  1136. end);
  1137. RegisterScriptFunc('CUSTOMMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1138. begin
  1139. Stack.SetString(PStart, CustomMessage(Stack.GetString(PStart-1)));
  1140. end);
  1141. RegisterScriptFunc('RMSESSIONSTARTED', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1142. begin
  1143. Stack.SetBool(PStart, RmSessionStarted);
  1144. end);
  1145. RegisterScriptFunc('REGISTEREXTRACLOSEAPPLICATIONSRESOURCE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1146. begin
  1147. Stack.SetBool(PStart, CodeRegisterExtraCloseApplicationsResource(Stack.GetBool(PStart-1), Stack.GetString(PStart-2)));
  1148. end);
  1149. RegisterScriptFunc('GETWIZARDFORM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1150. begin
  1151. Stack.SetClass(PStart, GetWizardForm);
  1152. end);
  1153. RegisterScriptFunc(['WizardIsComponentSelected', 'IsComponentSelected', 'WizardIsTaskSelected', 'IsTaskSelected'], sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1154. begin
  1155. var StringList := TStringList.Create;
  1156. try
  1157. var Components := (OrgName = 'WizardIsComponentSelected') or (OrgName = 'IsComponentSelected');
  1158. if Components then
  1159. GetWizardForm.GetSelectedComponents(StringList, False, False)
  1160. else
  1161. GetWizardForm.GetSelectedTasks(StringList, False, False, False);
  1162. var S := Stack.GetString(PStart-1);
  1163. StringChange(S, '/', '\');
  1164. if Components then
  1165. Stack.SetBool(PStart, ShouldProcessEntry(StringList, nil, S, '', '', ''))
  1166. else
  1167. Stack.SetBool(PStart, ShouldProcessEntry(nil, StringList, '', S, '', ''));
  1168. finally
  1169. StringList.Free;
  1170. end;
  1171. end);
  1172. end;
  1173. procedure RegisterMessagesScriptFuncs;
  1174. begin
  1175. RegisterScriptFunc('SETUPMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1176. begin
  1177. Stack.SetString(PStart, SetupMessages[TSetupMessageID(Stack.GetInt(PStart-1))]);
  1178. end);
  1179. end;
  1180. procedure RegisterSystemScriptFuncs;
  1181. begin
  1182. RegisterScriptFunc('RANDOM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1183. begin
  1184. Stack.SetInt(PStart, Random(Stack.GetInt(PStart-1)));
  1185. end);
  1186. RegisterScriptFunc('FILESIZE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1187. begin
  1188. try
  1189. var F := TFileRedir.Create(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), fdOpenExisting, faRead, fsReadWrite);
  1190. try
  1191. Stack.SetInt(PStart-2, F.CappedSize);
  1192. Stack.SetBool(PStart, True);
  1193. finally
  1194. F.Free;
  1195. end;
  1196. except
  1197. Stack.SetBool(PStart, False);
  1198. end;
  1199. end);
  1200. RegisterScriptFunc('FILESIZE64', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1201. begin
  1202. try
  1203. var F := TFileRedir.Create(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), fdOpenExisting, faRead, fsReadWrite);
  1204. try
  1205. var TmpFileSize := F.Size; { Make sure we access F.Size only once }
  1206. Stack.SetInt64(PStart-2, Int64(TmpFileSize.Hi) shl 32 + TmpFileSize.Lo);
  1207. Stack.SetBool(PStart, True);
  1208. finally
  1209. F.Free;
  1210. end;
  1211. except
  1212. Stack.SetBool(PStart, False);
  1213. end;
  1214. end);
  1215. RegisterScriptFunc('SET8087CW', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1216. begin
  1217. Set8087CW(Stack.GetInt(PStart));
  1218. end);
  1219. RegisterScriptFunc('GET8087CW', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1220. begin
  1221. Stack.SetInt(PStart, Get8087CW);
  1222. end);
  1223. RegisterScriptFunc('UTF8ENCODE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1224. begin
  1225. Stack.SetAnsiString(PStart, Utf8Encode(Stack.GetString(PStart-1)));
  1226. end);
  1227. RegisterScriptFunc('UTF8DECODE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1228. begin
  1229. Stack.SetString(PStart, UTF8ToString(Stack.GetAnsiString(PStart-1)));
  1230. end);
  1231. end;
  1232. procedure RegisterSysUtilsScriptFuncs;
  1233. begin
  1234. RegisterScriptFunc('BEEP', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1235. begin
  1236. Beep;
  1237. end);
  1238. RegisterScriptFunc('TRIMLEFT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1239. begin
  1240. Stack.SetString(PStart, TrimLeft(Stack.GetString(PStart-1)));
  1241. end);
  1242. RegisterScriptFunc('TRIMRIGHT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1243. begin
  1244. Stack.SetString(PStart, TrimRight(Stack.GetString(PStart-1)));
  1245. end);
  1246. RegisterScriptFunc('GETCURRENTDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1247. begin
  1248. Stack.SetString(PStart, GetCurrentDir);
  1249. end);
  1250. RegisterScriptFunc('SETCURRENTDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1251. begin
  1252. Stack.SetBool(PStart, SetCurrentDir(Stack.GetString(PStart-1)));
  1253. end);
  1254. RegisterScriptFunc('EXPANDFILENAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1255. begin
  1256. Stack.SetString(PStart, PathExpand(Stack.GetString(PStart-1)));
  1257. end);
  1258. RegisterScriptFunc('EXPANDUNCFILENAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1259. begin
  1260. Stack.SetString(PStart, ExpandUNCFileName(Stack.GetString(PStart-1)));
  1261. end);
  1262. RegisterScriptFunc('EXTRACTRELATIVEPATH', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1263. begin
  1264. Stack.SetString(PStart, NewExtractRelativePath(Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
  1265. end);
  1266. RegisterScriptFunc('EXTRACTFILEDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1267. begin
  1268. Stack.SetString(PStart, PathExtractDir(Stack.GetString(PStart-1)));
  1269. end);
  1270. RegisterScriptFunc('EXTRACTFILEDRIVE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1271. begin
  1272. Stack.SetString(PStart, PathExtractDrive(Stack.GetString(PStart-1)));
  1273. end);
  1274. RegisterScriptFunc('EXTRACTFILEEXT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1275. begin
  1276. Stack.SetString(PStart, PathExtractExt(Stack.GetString(PStart-1)));
  1277. end);
  1278. RegisterScriptFunc('EXTRACTFILENAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1279. begin
  1280. Stack.SetString(PStart, PathExtractName(Stack.GetString(PStart-1)));
  1281. end);
  1282. RegisterScriptFunc('EXTRACTFILEPATH', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1283. begin
  1284. Stack.SetString(PStart, PathExtractPath(Stack.GetString(PStart-1)));
  1285. end);
  1286. RegisterScriptFunc('CHANGEFILEEXT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1287. begin
  1288. Stack.SetString(PStart, PathChangeExt(Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
  1289. end);
  1290. RegisterScriptFunc('FILESEARCH', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1291. begin
  1292. Stack.SetString(PStart, NewFileSearch(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
  1293. end);
  1294. RegisterScriptFunc('RENAMEFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1295. begin
  1296. var OldName := Stack.GetString(PStart-1);
  1297. if not IsProtectedSrcExe(OldName) then
  1298. Stack.SetBool(PStart, MoveFileRedir(ScriptFuncDisableFsRedir, OldName, Stack.GetString(PStart-2)))
  1299. else
  1300. Stack.SetBool(PStart, False);
  1301. end);
  1302. RegisterScriptFunc('DELETEFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1303. begin
  1304. Stack.SetBool(PStart, DeleteFileRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
  1305. end);
  1306. RegisterScriptFunc('CREATEDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1307. begin
  1308. Stack.SetBool(PStart, CreateDirectoryRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
  1309. end);
  1310. RegisterScriptFunc('REMOVEDIR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1311. begin
  1312. Stack.SetBool(PStart, RemoveDirectoryRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1)));
  1313. end);
  1314. RegisterScriptFunc('COMPARESTR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1315. begin
  1316. Stack.SetInt(PStart, CompareStr(Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
  1317. end);
  1318. RegisterScriptFunc('COMPARETEXT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1319. begin
  1320. Stack.SetInt(PStart, CompareText(Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
  1321. end);
  1322. RegisterScriptFunc('SAMESTR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1323. begin
  1324. Stack.SetBool(PStart, CompareStr(Stack.GetString(PStart-1), Stack.GetString(PStart-2)) = 0);
  1325. end);
  1326. RegisterScriptFunc('SAMETEXT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1327. begin
  1328. Stack.SetBool(PStart, CompareText(Stack.GetString(PStart-1), Stack.GetString(PStart-2)) = 0);
  1329. end);
  1330. RegisterScriptFunc('GETDATETIMESTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1331. begin
  1332. var OldDateSeparator := FormatSettings.DateSeparator;
  1333. var OldTimeSeparator := FormatSettings.TimeSeparator;
  1334. try
  1335. var NewDateSeparator := Stack.GetChar(PStart-2);
  1336. var NewTimeSeparator := Stack.GetChar(PStart-3);
  1337. if NewDateSeparator <> #0 then
  1338. FormatSettings.DateSeparator := NewDateSeparator;
  1339. if NewTimeSeparator <> #0 then
  1340. FormatSettings.TimeSeparator := NewTimeSeparator;
  1341. Stack.SetString(PStart, FormatDateTime(Stack.GetString(PStart-1), Now));
  1342. finally
  1343. FormatSettings.TimeSeparator := OldTimeSeparator;
  1344. FormatSettings.DateSeparator := OldDateSeparator;
  1345. end;
  1346. end);
  1347. RegisterScriptFunc('SYSERRORMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1348. begin
  1349. Stack.SetString(PStart, Win32ErrorString(Stack.GetInt(PStart-1)));
  1350. end);
  1351. end;
  1352. procedure RegisterVerInfoFuncScriptFuncs;
  1353. begin
  1354. RegisterScriptFunc('GETVERSIONNUMBERS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1355. begin
  1356. var VersionNumbers: TFileVersionNumbers;
  1357. if GetVersionNumbersRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), VersionNumbers) then begin
  1358. Stack.SetInt(PStart-2, VersionNumbers.MS);
  1359. Stack.SetInt(PStart-3, VersionNumbers.LS);
  1360. Stack.SetBool(PStart, True);
  1361. end else
  1362. Stack.SetBool(PStart, False);
  1363. end);
  1364. RegisterScriptFunc('GETVERSIONCOMPONENTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1365. begin
  1366. var VersionNumbers: TFileVersionNumbers;
  1367. if GetVersionNumbersRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), VersionNumbers) then begin
  1368. Stack.SetUInt(PStart-2, VersionNumbers.MS shr 16);
  1369. Stack.SetUInt(PStart-3, VersionNumbers.MS and $FFFF);
  1370. Stack.SetUInt(PStart-4, VersionNumbers.LS shr 16);
  1371. Stack.SetUInt(PStart-5, VersionNumbers.LS and $FFFF);
  1372. Stack.SetBool(PStart, True);
  1373. end else
  1374. Stack.SetBool(PStart, False);
  1375. end);
  1376. RegisterScriptFunc('GETVERSIONNUMBERSSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1377. begin
  1378. var VersionNumbers: TFileVersionNumbers;
  1379. if GetVersionNumbersRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), VersionNumbers) then begin
  1380. Stack.SetString(PStart-2, Format('%u.%u.%u.%u', [VersionNumbers.MS shr 16,
  1381. VersionNumbers.MS and $FFFF, VersionNumbers.LS shr 16, VersionNumbers.LS and $FFFF]));
  1382. Stack.SetBool(PStart, True);
  1383. end else
  1384. Stack.SetBool(PStart, False);
  1385. end);
  1386. RegisterScriptFunc('GETPACKEDVERSION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1387. begin
  1388. var VersionNumbers: TFileVersionNumbers;
  1389. if GetVersionNumbersRedir(ScriptFuncDisableFsRedir, Stack.GetString(PStart-1), VersionNumbers) then begin
  1390. Stack.SetInt64(PStart-2, (Int64(VersionNumbers.MS) shl 32) or VersionNumbers.LS);
  1391. Stack.SetBool(PStart, True);
  1392. end else
  1393. Stack.SetBool(PStart, False);
  1394. end);
  1395. RegisterScriptFunc('PACKVERSIONNUMBERS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1396. begin
  1397. Stack.SetInt64(PStart, Int64((UInt64(Stack.GetUInt(PStart-1)) shl 32) or Stack.GetUInt(PStart-2)));
  1398. end);
  1399. RegisterScriptFunc('PACKVERSIONCOMPONENTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1400. begin
  1401. var VersionNumbers: TFileVersionNumbers;
  1402. VersionNumbers.MS := (Stack.GetUInt(PStart-1) shl 16) or (Stack.GetUInt(PStart-2) and $FFFF);
  1403. VersionNumbers.LS := (Stack.GetUInt(PStart-3) shl 16) or (Stack.GetUInt(PStart-4) and $FFFF);
  1404. Stack.SetInt64(PStart, Int64((UInt64(VersionNumbers.MS) shl 32) or VersionNumbers.LS));
  1405. end);
  1406. RegisterScriptFunc('COMPAREPACKEDVERSION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1407. begin
  1408. Stack.SetInt(PStart, Compare64(Integer64(Stack.GetInt64(PStart-1)), Integer64(Stack.GetInt64(PStart-2))));
  1409. end);
  1410. RegisterScriptFunc('SAMEPACKEDVERSION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1411. begin
  1412. Stack.SetBool(PStart, Compare64(Integer64(Stack.GetInt64(PStart-1)), Integer64(Stack.GetInt64(PStart-2))) = 0);
  1413. end);
  1414. RegisterScriptFunc('UNPACKVERSIONNUMBERS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1415. begin
  1416. var VersionNumbers: TFileVersionNumbers;
  1417. VersionNumbers.MS := UInt64(Stack.GetInt64(PStart)) shr 32;
  1418. VersionNumbers.LS := UInt64(Stack.GetInt64(PStart)) and $FFFFFFFF;
  1419. Stack.SetUInt(PStart-1, VersionNumbers.MS);
  1420. Stack.SetUInt(PStart-2, VersionNumbers.LS);
  1421. end);
  1422. RegisterScriptFunc('UNPACKVERSIONCOMPONENTS', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1423. begin
  1424. var VersionNumbers: TFileVersionNumbers;
  1425. VersionNumbers.MS := UInt64(Stack.GetInt64(PStart)) shr 32;
  1426. VersionNumbers.LS := UInt64(Stack.GetInt64(PStart)) and $FFFFFFFF;
  1427. Stack.SetUInt(PStart-1, VersionNumbers.MS shr 16);
  1428. Stack.SetUInt(PStart-2, VersionNumbers.MS and $FFFF);
  1429. Stack.SetUInt(PStart-3, VersionNumbers.LS shr 16);
  1430. Stack.SetUInt(PStart-4, VersionNumbers.LS and $FFFF);
  1431. end);
  1432. RegisterScriptFunc('VERSIONTOSTR', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1433. begin
  1434. var VersionNumbers: TFileVersionNumbers;
  1435. VersionNumbers.MS := UInt64(Stack.GetInt64(PStart-1)) shr 32;
  1436. VersionNumbers.LS := UInt64(Stack.GetInt64(PStart-1)) and $FFFFFFFF;
  1437. Stack.SetString(PStart, Format('%u.%u.%u.%u', [VersionNumbers.MS shr 16,
  1438. VersionNumbers.MS and $FFFF, VersionNumbers.LS shr 16, VersionNumbers.LS and $FFFF]));
  1439. end);
  1440. RegisterScriptFunc('STRTOVERSION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1441. begin
  1442. var VersionNumbers: TFileVersionNumbers;
  1443. if StrToVersionNumbers(Stack.GetString(PStart-1), VersionNumbers) then begin
  1444. Stack.SetInt64(PStart-2, (Int64(VersionNumbers.MS) shl 32) or VersionNumbers.LS);
  1445. Stack.SetBool(PStart, True);
  1446. end else
  1447. Stack.SetBool(PStart, False);
  1448. end);
  1449. end;
  1450. type
  1451. TDllProc = function(const Param1, Param2: Longint): Longint; stdcall;
  1452. procedure RegisterWindowsScriptFuncs;
  1453. begin
  1454. RegisterScriptFunc('SLEEP', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1455. begin
  1456. Sleep(Stack.GetInt(PStart));
  1457. end);
  1458. RegisterScriptFunc('FINDWINDOWBYCLASSNAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1459. begin
  1460. Stack.SetInt(PStart, FindWindow(PChar(Stack.GetString(PStart-1)), nil));
  1461. end);
  1462. RegisterScriptFunc('FINDWINDOWBYWINDOWNAME', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1463. begin
  1464. Stack.SetInt(PStart, FindWindow(nil, PChar(Stack.GetString(PStart-1))));
  1465. end);
  1466. RegisterScriptFunc('SENDMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1467. begin
  1468. Stack.SetInt(PStart, SendMessage(Stack.GetInt(PStart-1), Stack.GetInt(PStart-2), Stack.GetInt(PStart-3), Stack.GetInt(PStart-4)));
  1469. end);
  1470. RegisterScriptFunc('POSTMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1471. begin
  1472. Stack.SetBool(PStart, PostMessage(Stack.GetInt(PStart-1), Stack.GetInt(PStart-2), Stack.GetInt(PStart-3), Stack.GetInt(PStart-4)));
  1473. end);
  1474. RegisterScriptFunc('SENDNOTIFYMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1475. begin
  1476. Stack.SetBool(PStart, SendNotifyMessage(Stack.GetInt(PStart-1), Stack.GetInt(PStart-2), Stack.GetInt(PStart-3), Stack.GetInt(PStart-4)));
  1477. end);
  1478. RegisterScriptFunc('REGISTERWINDOWMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1479. begin
  1480. Stack.SetInt(PStart, RegisterWindowMessage(PChar(Stack.GetString(PStart-1))));
  1481. end);
  1482. RegisterScriptFunc('SENDBROADCASTMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1483. begin
  1484. Stack.SetInt(PStart, SendMessage(HWND_BROADCAST, Stack.GetInt(PStart-1), Stack.GetInt(PStart-2), Stack.GetInt(PStart-3)));
  1485. end);
  1486. RegisterScriptFunc('POSTBROADCASTMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1487. begin
  1488. Stack.SetBool(PStart, PostMessage(HWND_BROADCAST, Stack.GetInt(PStart-1), Stack.GetInt(PStart-2), Stack.GetInt(PStart-3)));
  1489. end);
  1490. RegisterScriptFunc('SENDBROADCASTNOTIFYMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1491. begin
  1492. Stack.SetBool(PStart, SendNotifyMessage(HWND_BROADCAST, Stack.GetInt(PStart-1), Stack.GetInt(PStart-2), Stack.GetInt(PStart-3)));
  1493. end);
  1494. RegisterScriptFunc('LOADDLL', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1495. begin
  1496. var DllHandle := SafeLoadLibrary(Stack.GetString(PStart-1), SEM_NOOPENFILEERRORBOX);
  1497. if DllHandle <> 0 then
  1498. Stack.SetInt(PStart-2, 0)
  1499. else
  1500. Stack.SetInt(PStart-2, GetLastError);
  1501. Stack.SetInt(PStart, DllHandle);
  1502. end);
  1503. RegisterScriptFunc('CALLDLLPROC', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1504. begin
  1505. var DllProc: TDllProc;
  1506. @DllProc := GetProcAddress(Stack.GetInt(PStart-1), PChar(Stack.GetString(PStart-2)));
  1507. if Assigned(DllProc) then begin
  1508. Stack.SetInt(PStart-5, DllProc(Stack.GetInt(PStart-3), Stack.GetInt(PStart-4)));
  1509. Stack.SetBool(PStart, True);
  1510. end else
  1511. Stack.SetBool(PStart, False);
  1512. end);
  1513. RegisterScriptFunc('FREEDLL', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1514. begin
  1515. Stack.SetBool(PStart, FreeLibrary(Stack.GetInt(PStart-1)));
  1516. end);
  1517. RegisterScriptFunc('CREATEMUTEX', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1518. begin
  1519. Windows.CreateMutex(nil, False, PChar(Stack.GetString(PStart)));
  1520. end);
  1521. RegisterScriptFunc('OEMTOCHARBUFF', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1522. begin
  1523. var S := Stack.GetAnsiString(PStart);
  1524. OemToCharBuffA(PAnsiChar(S), PAnsiChar(S), Length(S));
  1525. Stack.SetAnsiString(PStart, S);
  1526. end);
  1527. RegisterScriptFunc('CHARTOOEMBUFF', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1528. begin
  1529. var S := Stack.GetAnsiString(PStart);
  1530. CharToOemBuffA(PAnsiChar(S), PAnsiChar(S), Length(S));
  1531. Stack.SetAnsiString(PStart, S);
  1532. end);
  1533. end;
  1534. procedure RegisterActiveXScriptFuncs;
  1535. begin
  1536. RegisterScriptFunc('COFREEUNUSEDLIBRARIES', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1537. begin
  1538. CoFreeUnusedLibraries;
  1539. end);
  1540. end;
  1541. procedure RegisterLoggingFuncScriptFuncs;
  1542. begin
  1543. RegisterScriptFunc('LOG', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1544. begin
  1545. Log(Stack.GetString(PStart));
  1546. end);
  1547. end;
  1548. procedure RegisterOtherScriptFuncs;
  1549. begin
  1550. RegisterScriptFunc('BRINGTOFRONTANDRESTORE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1551. begin
  1552. { Must be in this order to work around VCL bug }
  1553. Application.Restore;
  1554. Application.BringToFront;
  1555. end);
  1556. RegisterScriptFunc('WizardDirValue', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1557. begin
  1558. Stack.SetString(PStart, RemoveBackslashUnlessRoot(GetWizardForm.DirEdit.Text));
  1559. end);
  1560. RegisterScriptFunc('WizardGroupValue', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1561. begin
  1562. Stack.SetString(PStart, RemoveBackslashUnlessRoot(GetWizardForm.GroupEdit.Text));
  1563. end);
  1564. RegisterScriptFunc('WizardNoIcons', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1565. begin
  1566. Stack.SetBool(PStart, GetWizardForm.NoIconsCheck.Checked);
  1567. end);
  1568. RegisterScriptFunc('WizardSetupType', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1569. begin
  1570. var TypeEntry := GetWizardForm.GetSetupType;
  1571. if TypeEntry <> nil then begin
  1572. if Stack.GetBool(PStart-1) then
  1573. Stack.SetString(PStart, TypeEntry.Description)
  1574. else
  1575. Stack.SetString(PStart, TypeEntry.Name);
  1576. end
  1577. else
  1578. Stack.SetString(PStart, '');
  1579. end);
  1580. RegisterScriptFunc(['WizardSelectedComponents', 'WizardSelectedTasks'], sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1581. begin
  1582. var StringList := TStringList.Create;
  1583. try
  1584. if OrgName = 'WizardSelectedComponents' then
  1585. GetWizardForm.GetSelectedComponents(StringList, Stack.GetBool(PStart-1), False)
  1586. else
  1587. GetWizardForm.GetSelectedTasks(StringList, Stack.GetBool(PStart-1), False, False);
  1588. Stack.SetString(PStart, StringsToCommaString(StringList));
  1589. finally
  1590. StringList.Free;
  1591. end;
  1592. end);
  1593. RegisterScriptFunc(['WizardSelectComponents', 'WizardSelectTasks'], sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1594. begin
  1595. var StringList := TStringList.Create;
  1596. try
  1597. var S := Stack.GetString(PStart);
  1598. StringChange(S, '/', '\');
  1599. SetStringsFromCommaString(StringList, S);
  1600. if OrgName = 'WizardSelectComponents' then
  1601. GetWizardForm.SelectComponents(StringList)
  1602. else
  1603. GetWizardForm.SelectTasks(StringList);
  1604. finally
  1605. StringList.Free;
  1606. end;
  1607. end);
  1608. RegisterScriptFunc('WizardSilent', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1609. begin
  1610. Stack.SetBool(PStart, InstallMode <> imNormal);
  1611. end);
  1612. RegisterScriptFunc('ISUNINSTALLER', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1613. begin
  1614. Stack.SetBool(PStart, IsUninstaller);
  1615. end);
  1616. RegisterScriptFunc('UninstallSilent', sfOnlyUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1617. begin
  1618. Stack.SetBool(PStart, UninstallSilent);
  1619. end);
  1620. RegisterScriptFunc('CurrentFilename', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1621. begin
  1622. if CheckOrInstallCurrentFilename <> '' then
  1623. Stack.SetString(PStart, CheckOrInstallCurrentFilename)
  1624. else
  1625. InternalError(Format('An attempt was made to call the "%s" function from outside a "Check", "BeforeInstall" or "AfterInstall" event function belonging to a "[Files]" entry', [OrgName]));
  1626. end);
  1627. RegisterScriptFunc('CurrentSourceFilename', sfNoUninstall, procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1628. begin
  1629. if CheckOrInstallCurrentSourceFilename <> '' then
  1630. Stack.SetString(PStart, CheckOrInstallCurrentSourceFilename)
  1631. else
  1632. InternalError(Format('An attempt was made to call the "%s" function from outside a "Check", "BeforeInstall" or "AfterInstall" event function belonging to a "[Files]" entry with flag "external"', [OrgName]));
  1633. end);
  1634. RegisterScriptFunc('CASTSTRINGTOINTEGER', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1635. begin
  1636. Stack.SetInt(PStart, Integer(PChar(Stack.GetString(PStart-1))));
  1637. end);
  1638. RegisterScriptFunc('CASTINTEGERTOSTRING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1639. begin
  1640. Stack.SetString(PStart, String(PChar(Stack.GetInt(PStart-1))));
  1641. end);
  1642. RegisterScriptFunc('ABORT', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1643. begin
  1644. Abort;
  1645. end);
  1646. RegisterScriptFunc('GETEXCEPTIONMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1647. begin
  1648. Stack.SetString(PStart, GetExceptionMessage(Caller));
  1649. end);
  1650. RegisterScriptFunc('RAISEEXCEPTION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1651. begin
  1652. raise Exception.Create(Stack.GetString(PStart));
  1653. end);
  1654. RegisterScriptFunc('SHOWEXCEPTIONMESSAGE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1655. begin
  1656. TMainForm.ShowExceptionMsg(AddPeriod(GetExceptionMessage(Caller)));
  1657. end);
  1658. RegisterScriptFunc('TERMINATED', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1659. begin
  1660. Stack.SetBool(PStart, Application.Terminated);
  1661. end);
  1662. RegisterScriptFunc('GETPREVIOUSDATA', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1663. begin
  1664. if IsUninstaller then
  1665. Stack.SetString(PStart, GetCodePreviousData(UninstallExpandedAppId, Stack.GetString(PStart-1), Stack.GetString(PStart-2)))
  1666. else
  1667. Stack.SetString(PStart, GetCodePreviousData(ExpandConst(SetupHeader.AppId), Stack.GetString(PStart-1), Stack.GetString(PStart-2)));
  1668. end);
  1669. RegisterScriptFunc('SETPREVIOUSDATA', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1670. begin
  1671. Stack.SetBool(PStart, SetCodePreviousData(Stack.GetInt(PStart-1), Stack.GetString(PStart-2), Stack.GetString(PStart-3)));
  1672. end);
  1673. RegisterScriptFunc('LOADSTRINGFROMFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1674. begin
  1675. var S := Stack.GetAnsiString(PStart-2);
  1676. Stack.SetBool(PStart, LoadStringFromFile(Stack.GetString(PStart-1), S, fsRead));
  1677. Stack.SetAnsiString(PStart-2, S);
  1678. end);
  1679. RegisterScriptFunc('LOADSTRINGFROMLOCKEDFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1680. begin
  1681. var S := Stack.GetAnsiString(PStart-2);
  1682. Stack.SetBool(PStart, LoadStringFromFile(Stack.GetString(PStart-1), S, fsReadWrite));
  1683. Stack.SetAnsiString(PStart-2, S);
  1684. end);
  1685. RegisterScriptFunc('LOADSTRINGSFROMFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1686. begin
  1687. Stack.SetBool(PStart, LoadStringsFromFile(Stack.GetString(PStart-1), Stack, PStart-2, fsRead));
  1688. end);
  1689. RegisterScriptFunc('LOADSTRINGSFROMLOCKEDFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1690. begin
  1691. Stack.SetBool(PStart, LoadStringsFromFile(Stack.GetString(PStart-1), Stack, PStart-2, fsReadWrite));
  1692. end);
  1693. RegisterScriptFunc('SAVESTRINGTOFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1694. begin
  1695. Stack.SetBool(PStart, SaveStringToFile(Stack.GetString(PStart-1), Stack.GetAnsiString(PStart-2), Stack.GetBool(PStart-3)));
  1696. end);
  1697. RegisterScriptFunc('SAVESTRINGSTOFILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1698. begin
  1699. Stack.SetBool(PStart, SaveStringsToFile(Stack.GetString(PStart-1), Stack, PStart-2, Stack.GetBool(PStart-3), False, False));
  1700. end);
  1701. RegisterScriptFunc('SAVESTRINGSTOUTF8FILE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1702. begin
  1703. Stack.SetBool(PStart, SaveStringsToFile(Stack.GetString(PStart-1), Stack, PStart-2, Stack.GetBool(PStart-3), True, False));
  1704. end);
  1705. RegisterScriptFunc('SAVESTRINGSTOUTF8FILEWITHOUTBOM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1706. begin
  1707. Stack.SetBool(PStart, SaveStringsToFile(Stack.GetString(PStart-1), Stack, PStart-2, Stack.GetBool(PStart-3), True, True));
  1708. end);
  1709. RegisterScriptFunc('ENABLEFSREDIRECTION', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1710. begin
  1711. Stack.SetBool(PStart, not ScriptFuncDisableFsRedir);
  1712. if Stack.GetBool(PStart-1) then
  1713. ScriptFuncDisableFsRedir := False
  1714. else begin
  1715. if not IsWin64 then
  1716. InternalError('Cannot disable FS redirection on this version of Windows');
  1717. ScriptFuncDisableFsRedir := True;
  1718. end;
  1719. end);
  1720. RegisterScriptFunc('GETUNINSTALLPROGRESSFORM', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1721. begin
  1722. Stack.SetClass(PStart, GetUninstallProgressForm);
  1723. end);
  1724. RegisterScriptFunc('CREATECALLBACK', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1725. begin
  1726. Stack.SetInt(PStart, CreateCallback(Caller, Stack.Items[PStart-1]));
  1727. end);
  1728. RegisterScriptFunc('ISDOTNETINSTALLED', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1729. begin
  1730. Stack.SetBool(PStart, IsDotNetInstalled(InstallDefaultRegView, TDotNetVersion(Stack.GetInt(PStart-1)), Stack.GetInt(PStart-2)));
  1731. end);
  1732. RegisterScriptFunc('ISMSIPRODUCTINSTALLED', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1733. begin
  1734. var ErrorCode: Cardinal;
  1735. Stack.SetBool(PStart, IsMsiProductInstalled(Stack.GetString(PStart-1), Stack.GetInt64(PStart-2), ErrorCode));
  1736. if ErrorCode <> 0 then
  1737. raise Exception.Create(Win32ErrorString(ErrorCode));
  1738. end);
  1739. RegisterScriptFunc('INITIALIZEBITMAPIMAGEFROMICON', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1740. begin
  1741. var AscendingTrySizes := Stack.GetIntArray(PStart-4);
  1742. Stack.SetBool(PStart, TBitmapImage(Stack.GetClass(PStart-1)).InitializeFromIcon(0, PChar(Stack.GetString(PStart-2)), Stack.GetInt(PStart-3), AscendingTrySizes));
  1743. end);
  1744. RegisterScriptFunc('EXTRACT7ZIPARCHIVE', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1745. begin
  1746. Extract7ZipArchive(Stack.GetString(PStart), Stack.GetString(PStart-1), Stack.GetBool(PStart-2), TOnExtractionProgress(Stack.GetProc(PStart-3, Caller)));
  1747. end);
  1748. RegisterScriptFunc('DEBUGGING', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1749. begin
  1750. Stack.SetBool(PStart, Debugging);
  1751. end);
  1752. RegisterScriptFunc('StringJoin', procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1753. begin
  1754. var Values := Stack.GetStringArray(PStart-2);
  1755. Stack.SetString(PStart, String.Join(Stack.GetString(PStart-1), Values));
  1756. end);
  1757. RegisterScriptFunc(['StringSplit', 'StringSplitEx'], procedure(const Caller: TPSExec; const OrgName: AnsiString; const Stack: TPSStack; const PStart: Cardinal)
  1758. begin
  1759. var Separators := Stack.GetStringArray(PStart-2);
  1760. var Parts: TArray<String>;
  1761. if OrgName = 'StringSplitEx' then begin
  1762. var Quote := Stack.GetChar(PStart-3);
  1763. Parts := Stack.GetString(PStart-1).Split(Separators, Quote, Quote, TStringSplitOptions(Stack.GetInt(PStart-4)))
  1764. end else
  1765. Parts := Stack.GetString(PStart-1).Split(Separators, TStringSplitOptions(Stack.GetInt(PStart-3)));
  1766. Stack.SetArray(PStart, Parts);
  1767. end);
  1768. end;
  1769. procedure RegisterDelphiFunction(ProcPtr: Pointer; const Name: AnsiString);
  1770. begin
  1771. ScriptInterpreter.RegisterDelphiFunction(ProcPtr, Name, cdRegister);
  1772. {$IFDEF DEBUG}
  1773. Inc(Count);
  1774. {$ENDIF}
  1775. end;
  1776. begin
  1777. if ScriptFuncs <> nil then
  1778. ScriptFuncs.Free;
  1779. ScriptFuncs := TScriptFuncs.Create;
  1780. { The following should register all tables in ScriptFuncTables }
  1781. {$IFDEF DEBUG}
  1782. Count := 0;
  1783. {$ENDIF}
  1784. RegisterScriptDlgScriptFuncs;
  1785. RegisterNewDiskFormScriptFuncs;
  1786. RegisterBrowseFuncScriptFuncs;
  1787. RegisterCommonFuncVclScriptFuncs;
  1788. RegisterCommonFuncScriptFuncs;
  1789. RegisterInstallScriptFuncs;
  1790. RegisterInstFuncScriptFuncs;
  1791. RegisterInstFuncOleScriptFuncs;
  1792. RegisterMainFuncScriptFuncs;
  1793. RegisterMessagesScriptFuncs;
  1794. RegisterSystemScriptFuncs;
  1795. RegisterSysUtilsScriptFuncs;
  1796. RegisterVerInfoFuncScriptFuncs;
  1797. RegisterWindowsScriptFuncs;
  1798. RegisterActiveXScriptFuncs;
  1799. RegisterLoggingFuncScriptFuncs;
  1800. RegisterOtherScriptFuncs;
  1801. {$IFDEF DEBUG}
  1802. for var ScriptFuncTable in ScriptFuncTables do
  1803. for var ScriptFunc in ScriptFuncTable do
  1804. Dec(Count);
  1805. if Count <> 0 then
  1806. raise Exception.Create('Count <> 0');
  1807. {$ENDIF}
  1808. { The following should register all functions in ScriptDelphiFuncTable }
  1809. {$IFDEF DEBUG}
  1810. Count := 0;
  1811. {$ENDIF}
  1812. RegisterDelphiFunction(@FindFirstHelper, 'FindFirst');
  1813. RegisterDelphiFunction(@FindNextHelper, 'FindNext');
  1814. RegisterDelphiFunction(@FindCloseHelper, 'FindClose');
  1815. RegisterDelphiFunction(@FmtMessageHelper, 'FmtMessage');
  1816. RegisterDelphiFunction(@Format, 'Format');
  1817. RegisterDelphiFunction(@GetWindowsVersionExHelper, 'GetWindowsVersionEx');
  1818. {$IFDEF DEBUG}
  1819. if Count <> Length(DelphiScriptFuncTable) then
  1820. raise Exception.Create('Count <> Length(DelphiScriptFuncTable)');
  1821. {$ENDIF}
  1822. end;
  1823. initialization
  1824. finalization
  1825. ScriptFuncs.Free;
  1826. end.