2
0

Setup.ScriptFunc.pas 110 KB

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