jwapatchapi.pas 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  1. {******************************************************************************}
  2. { }
  3. { Creating and applying patches to filesAPI interface Unit for Object Pascal }
  4. { }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft }
  6. { Corporation. All Rights Reserved. }
  7. { }
  8. { The original file is: patchapi.h, released August 2001. The original Pascal }
  9. { code is: PatchApi.pas, released December 2001. The initial developer of the }
  10. { Pascal code is Marcel van Brakel (brakelm att chello dott nl). }
  11. { }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001 }
  13. { Marcel van Brakel. All Rights Reserved. }
  14. { }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
  16. { }
  17. { You may retrieve the latest version of this file at the Project JEDI }
  18. { APILIB home page, located at http://jedi-apilib.sourceforge.net }
  19. { }
  20. { The contents of this file are used with permission, subject to the Mozilla }
  21. { Public License Version 1.1 (the "License"); you may not use this file except }
  22. { in compliance with the License. You may obtain a copy of the License at }
  23. { http://www.mozilla.org/MPL/MPL-1.1.html }
  24. { }
  25. { Software distributed under the License is distributed on an "AS IS" basis, }
  26. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  27. { the specific language governing rights and limitations under the License. }
  28. { }
  29. { Alternatively, the contents of this file may be used under the terms of the }
  30. { GNU Lesser General Public License (the "LGPL License"), in which case the }
  31. { provisions of the LGPL License are applicable instead of those above. }
  32. { If you wish to allow use of your version of this file only under the terms }
  33. { of the LGPL License and not to allow others to use your version of this file }
  34. { under the MPL, indicate your decision by deleting the provisions above and }
  35. { replace them with the notice and other provisions required by the LGPL }
  36. { License. If you do not delete the provisions above, a recipient may use }
  37. { your version of this file under either the MPL or the LGPL License. }
  38. { }
  39. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  40. { }
  41. {******************************************************************************}
  42. unit JwaPatchApi;
  43. {$WEAKPACKAGEUNIT}
  44. {$HPPEMIT ''}
  45. {$HPPEMIT '#include "patchapi.h"'}
  46. {$HPPEMIT ''}
  47. {$I jediapilib.inc}
  48. interface
  49. uses
  50. JwaWinType;
  51. //
  52. // The following constants can be combined and used as the OptionFlags
  53. // parameter in the patch creation apis.
  54. //
  55. const
  56. PATCH_OPTION_USE_BEST = $00000000; // auto choose best (slower)
  57. {$EXTERNALSYM PATCH_OPTION_USE_BEST}
  58. PATCH_OPTION_USE_LZX_BEST = $00000003; // auto choose best of LZX
  59. {$EXTERNALSYM PATCH_OPTION_USE_LZX_BEST}
  60. PATCH_OPTION_USE_LZX_A = $00000001; // normal
  61. {$EXTERNALSYM PATCH_OPTION_USE_LZX_A}
  62. PATCH_OPTION_USE_LZX_B = $00000002; // better on some x86 binaries
  63. {$EXTERNALSYM PATCH_OPTION_USE_LZX_B}
  64. PATCH_OPTION_USE_LZX_LARGE = $00000004; // better support for files >8MB
  65. {$EXTERNALSYM PATCH_OPTION_USE_LZX_LARGE}
  66. PATCH_OPTION_NO_BINDFIX = $00010000; // PE bound imports
  67. {$EXTERNALSYM PATCH_OPTION_NO_BINDFIX}
  68. PATCH_OPTION_NO_LOCKFIX = $00020000; // PE smashed locks
  69. {$EXTERNALSYM PATCH_OPTION_NO_LOCKFIX}
  70. PATCH_OPTION_NO_REBASE = $00040000; // PE rebased image
  71. {$EXTERNALSYM PATCH_OPTION_NO_REBASE}
  72. PATCH_OPTION_FAIL_IF_SAME_FILE = $00080000; // don't create if same
  73. {$EXTERNALSYM PATCH_OPTION_FAIL_IF_SAME_FILE}
  74. PATCH_OPTION_FAIL_IF_BIGGER = $00100000; // fail if patch is larger than simply compressing new file (slower)
  75. {$EXTERNALSYM PATCH_OPTION_FAIL_IF_BIGGER}
  76. PATCH_OPTION_NO_CHECKSUM = $00200000; // PE checksum zero
  77. {$EXTERNALSYM PATCH_OPTION_NO_CHECKSUM}
  78. PATCH_OPTION_NO_RESTIMEFIX = $00400000; // PE resource timestamps
  79. {$EXTERNALSYM PATCH_OPTION_NO_RESTIMEFIX}
  80. PATCH_OPTION_NO_TIMESTAMP = $00800000; // don't store new file timestamp in patch
  81. {$EXTERNALSYM PATCH_OPTION_NO_TIMESTAMP}
  82. PATCH_OPTION_SIGNATURE_MD5 = $01000000; // use MD5 instead of CRC32
  83. {$EXTERNALSYM PATCH_OPTION_SIGNATURE_MD5}
  84. PATCH_OPTION_RESERVED1 = DWORD($80000000); // (used internally)
  85. {$EXTERNALSYM PATCH_OPTION_RESERVED1}
  86. PATCH_OPTION_VALID_FLAGS = DWORD($80FF0007);
  87. {$EXTERNALSYM PATCH_OPTION_VALID_FLAGS}
  88. PATCH_SYMBOL_NO_IMAGEHLP = $00000001; // don't use imagehlp.dll
  89. {$EXTERNALSYM PATCH_SYMBOL_NO_IMAGEHLP}
  90. PATCH_SYMBOL_NO_FAILURES = $00000002; // don't fail patch due to imagehlp failures
  91. {$EXTERNALSYM PATCH_SYMBOL_NO_FAILURES}
  92. PATCH_SYMBOL_UNDECORATED_TOO = $00000004; // after matching decorated symbols, try to match remaining by undecorated names
  93. {$EXTERNALSYM PATCH_SYMBOL_UNDECORATED_TOO}
  94. PATCH_SYMBOL_RESERVED1 = DWORD($80000000); // (used internally)
  95. {$EXTERNALSYM PATCH_SYMBOL_RESERVED1}
  96. //
  97. // The following constants can be combined and used as the ApplyOptionFlags
  98. // parameter in the patch apply and test apis.
  99. //
  100. APPLY_OPTION_FAIL_IF_EXACT = $00000001; // don't copy new file
  101. {$EXTERNALSYM APPLY_OPTION_FAIL_IF_EXACT}
  102. APPLY_OPTION_FAIL_IF_CLOSE = $00000002; // differ by rebase, bind
  103. {$EXTERNALSYM APPLY_OPTION_FAIL_IF_CLOSE}
  104. APPLY_OPTION_TEST_ONLY = $00000004; // don't create new file
  105. {$EXTERNALSYM APPLY_OPTION_TEST_ONLY}
  106. APPLY_OPTION_VALID_FLAGS = $00000007;
  107. {$EXTERNALSYM APPLY_OPTION_VALID_FLAGS}
  108. //
  109. // In addition to standard Win32 error codes, the following error codes may
  110. // be returned via GetLastError() when one of the patch APIs fails.
  111. //
  112. ERROR_PATCH_ENCODE_FAILURE = DWORD($C00E3101); // create
  113. {$EXTERNALSYM ERROR_PATCH_ENCODE_FAILURE}
  114. ERROR_PATCH_INVALID_OPTIONS = DWORD($C00E3102); // create
  115. {$EXTERNALSYM ERROR_PATCH_INVALID_OPTIONS}
  116. ERROR_PATCH_SAME_FILE = DWORD($C00E3103); // create
  117. {$EXTERNALSYM ERROR_PATCH_SAME_FILE}
  118. ERROR_PATCH_RETAIN_RANGES_DIFFER = DWORD($C00E3104); // create
  119. {$EXTERNALSYM ERROR_PATCH_RETAIN_RANGES_DIFFER}
  120. ERROR_PATCH_BIGGER_THAN_COMPRESSED = DWORD($C00E3105); // create
  121. {$EXTERNALSYM ERROR_PATCH_BIGGER_THAN_COMPRESSED}
  122. ERROR_PATCH_IMAGEHLP_FAILURE = DWORD($C00E3106); // create
  123. {$EXTERNALSYM ERROR_PATCH_IMAGEHLP_FAILURE}
  124. ERROR_PATCH_DECODE_FAILURE = DWORD($C00E4101); // apply
  125. {$EXTERNALSYM ERROR_PATCH_DECODE_FAILURE}
  126. ERROR_PATCH_CORRUPT = DWORD($C00E4102); // apply
  127. {$EXTERNALSYM ERROR_PATCH_CORRUPT}
  128. ERROR_PATCH_NEWER_FORMAT = DWORD($C00E4103); // apply
  129. {$EXTERNALSYM ERROR_PATCH_NEWER_FORMAT}
  130. ERROR_PATCH_WRONG_FILE = DWORD($C00E4104); // apply
  131. {$EXTERNALSYM ERROR_PATCH_WRONG_FILE}
  132. ERROR_PATCH_NOT_NECESSARY = DWORD($C00E4105); // apply
  133. {$EXTERNALSYM ERROR_PATCH_NOT_NECESSARY}
  134. ERROR_PATCH_NOT_AVAILABLE = DWORD($C00E4106); // apply
  135. {$EXTERNALSYM ERROR_PATCH_NOT_AVAILABLE}
  136. type
  137. PATCH_PROGRESS_CALLBACK = function(CallbackContext: PVOID; CurrentPosition, MaximumPosition: ULONG): BOOL; stdcall;
  138. {$EXTERNALSYM PATCH_PROGRESS_CALLBACK}
  139. TPatchProgressCallback = PATCH_PROGRESS_CALLBACK;
  140. PPATCH_PROGRESS_CALLBACK = ^PATCH_PROGRESS_CALLBACK;
  141. {$EXTERNALSYM PPATCH_PROGRESS_CALLBACK}
  142. PPatchProgressCallback = PPATCH_PROGRESS_CALLBACK;
  143. PATCH_SYMLOAD_CALLBACK = function(WhichFile: ULONG; SymbolFileName: LPCSTR; SymType, SymbolFileCheckSum,
  144. SymbolFileTimeDate, ImageFileCheckSum, ImageFileTimeDate: ULONG; CallbackContext: PVOID): BOOL; stdcall;
  145. {$EXTERNALSYM PATCH_SYMLOAD_CALLBACK}
  146. TPatchSymLoadCallback = PATCH_SYMLOAD_CALLBACK;
  147. PPATCH_SYMLOAD_CALLBACK = ^PATCH_SYMLOAD_CALLBACK;
  148. {$EXTERNALSYM PPATCH_SYMLOAD_CALLBACK}
  149. PPatchSymLoadCallback = PPATCH_SYMLOAD_CALLBACK;
  150. PPATCH_IGNORE_RANGE = ^PATCH_IGNORE_RANGE;
  151. {$EXTERNALSYM PPATCH_IGNORE_RANGE}
  152. _PATCH_IGNORE_RANGE = record
  153. OffsetInOldFile: ULONG;
  154. LengthInBytes: ULONG;
  155. end;
  156. {$EXTERNALSYM _PATCH_IGNORE_RANGE}
  157. PATCH_IGNORE_RANGE = _PATCH_IGNORE_RANGE;
  158. {$EXTERNALSYM PATCH_IGNORE_RANGE}
  159. TPatchIgnoreRange = PATCH_IGNORE_RANGE;
  160. PPatchIgnoreRange = PPATCH_IGNORE_RANGE;
  161. PPATCH_RETAIN_RANGE = ^PATCH_RETAIN_RANGE;
  162. {$EXTERNALSYM PPATCH_RETAIN_RANGE}
  163. _PATCH_RETAIN_RANGE = record
  164. OffsetInOldFile: ULONG;
  165. LengthInBytes: ULONG;
  166. OffsetInNewFile: ULONG;
  167. end;
  168. {$EXTERNALSYM _PATCH_RETAIN_RANGE}
  169. PATCH_RETAIN_RANGE = _PATCH_RETAIN_RANGE;
  170. {$EXTERNALSYM PATCH_RETAIN_RANGE}
  171. TPatchRetainRange = PATCH_RETAIN_RANGE;
  172. PPatchRetainRange = PPATCH_RETAIN_RANGE;
  173. PPATCH_OLD_FILE_INFO_A = ^PATCH_OLD_FILE_INFO_A;
  174. {$EXTERNALSYM PPATCH_OLD_FILE_INFO_A}
  175. _PATCH_OLD_FILE_INFO_A = record
  176. SizeOfThisStruct: ULONG;
  177. OldFileName: LPCSTR;
  178. IgnoreRangeCount: ULONG; // maximum 255
  179. IgnoreRangeArray: PPATCH_IGNORE_RANGE;
  180. RetainRangeCount: ULONG; // maximum 255
  181. RetainRangeArray: PPATCH_RETAIN_RANGE;
  182. end;
  183. {$EXTERNALSYM _PATCH_OLD_FILE_INFO_A}
  184. PATCH_OLD_FILE_INFO_A = _PATCH_OLD_FILE_INFO_A;
  185. {$EXTERNALSYM PATCH_OLD_FILE_INFO_A}
  186. TPatchOldFileInfoA = PATCH_OLD_FILE_INFO_A;
  187. PPatchOldFileInfoA = PPATCH_OLD_FILE_INFO_A;
  188. PPATCH_OLD_FILE_INFO_W = ^PATCH_OLD_FILE_INFO_W;
  189. {$EXTERNALSYM PPATCH_OLD_FILE_INFO_W}
  190. _PATCH_OLD_FILE_INFO_W = record
  191. SizeOfThisStruct: ULONG;
  192. OldFileName: LPCWSTR;
  193. IgnoreRangeCount: ULONG; // maximum 255
  194. IgnoreRangeArray: PPATCH_IGNORE_RANGE;
  195. RetainRangeCount: ULONG; // maximum 255
  196. RetainRangeArray: PPATCH_RETAIN_RANGE;
  197. end;
  198. {$EXTERNALSYM _PATCH_OLD_FILE_INFO_W}
  199. PATCH_OLD_FILE_INFO_W = _PATCH_OLD_FILE_INFO_W;
  200. {$EXTERNALSYM PATCH_OLD_FILE_INFO_W}
  201. TPatchOldFileInfoW = PATCH_OLD_FILE_INFO_W;
  202. PPatchOldFileInfoW = PPATCH_OLD_FILE_INFO_W;
  203. PPATCH_OLD_FILE_INFO_H = ^PATCH_OLD_FILE_INFO_H;
  204. {$EXTERNALSYM PPATCH_OLD_FILE_INFO_H}
  205. _PATCH_OLD_FILE_INFO_H = record
  206. SizeOfThisStruct: ULONG;
  207. OldFileHandle: HANDLE;
  208. IgnoreRangeCount: ULONG; // maximum 255
  209. IgnoreRangeArray: PPATCH_IGNORE_RANGE;
  210. RetainRangeCount: ULONG; // maximum 255
  211. RetainRangeArray: PPATCH_RETAIN_RANGE;
  212. end;
  213. {$EXTERNALSYM _PATCH_OLD_FILE_INFO_H}
  214. PATCH_OLD_FILE_INFO_H = _PATCH_OLD_FILE_INFO_H;
  215. {$EXTERNALSYM PATCH_OLD_FILE_INFO_H}
  216. TPatchOldFileInfoH = PATCH_OLD_FILE_INFO_H;
  217. PPatchOldFileInfoH = PPATCH_OLD_FILE_INFO_H;
  218. PPATCH_OLD_FILE_INFO = ^PATCH_OLD_FILE_INFO;
  219. {$EXTERNALSYM PPATCH_OLD_FILE_INFO}
  220. _PATCH_OLD_FILE_INFO = record
  221. SizeOfThisStruct: ULONG;
  222. Union: record
  223. case Integer of
  224. 0: (OldFileNameA: LPCSTR);
  225. 1: (OldFileNameW: LPCWSTR);
  226. 2: (OldFileHandle: HANDLE);
  227. end;
  228. IgnoreRangeCount: ULONG; // maximum 255
  229. IgnoreRangeArray: PPATCH_IGNORE_RANGE;
  230. RetainRangeCount: ULONG; // maximum 255
  231. RetainRangeArray: PPATCH_RETAIN_RANGE;
  232. end;
  233. {$EXTERNALSYM _PATCH_OLD_FILE_INFO}
  234. PATCH_OLD_FILE_INFO = _PATCH_OLD_FILE_INFO;
  235. {$EXTERNALSYM PATCH_OLD_FILE_INFO}
  236. TPatchOldFileInfo = PATCH_OLD_FILE_INFO;
  237. PPatchOldFileInfo = PPATCH_OLD_FILE_INFO;
  238. PPATCH_OPTION_DATA = ^PATCH_OPTION_DATA;
  239. {$EXTERNALSYM PPATCH_OPTION_DATA}
  240. _PATCH_OPTION_DATA = record
  241. SizeOfThisStruct: ULONG;
  242. SymbolOptionFlags: ULONG; // PATCH_SYMBOL_xxx flags
  243. NewFileSymbolPath: LPCSTR; // always ANSI, never Unicode
  244. OldFileSymbolPathArray: ^LPCSTR; // array[ OldFileCount ]
  245. ExtendedOptionFlags: ULONG;
  246. SymLoadCallback: PATCH_SYMLOAD_CALLBACK;
  247. SymLoadContext: PVOID;
  248. end;
  249. {$EXTERNALSYM _PATCH_OPTION_DATA}
  250. PATCH_OPTION_DATA = _PATCH_OPTION_DATA;
  251. {$EXTERNALSYM PATCH_OPTION_DATA}
  252. TPatchOptionData = PATCH_OPTION_DATA;
  253. PPatchOptionData = PPATCH_OPTION_DATA;
  254. //
  255. // Note that PATCH_OPTION_DATA contains LPCSTR paths, and no LPCWSTR (Unicode)
  256. // path argument is available, even when used with one of the Unicode APIs
  257. // such as CreatePatchFileW. This is because the underlying system services
  258. // for symbol file handling (IMAGEHLP.DLL) only support ANSI file/path names.
  259. //
  260. //
  261. // A note about PATCH_RETAIN_RANGE specifiers with multiple old files:
  262. //
  263. // Each old version file must have the same RetainRangeCount, and the same
  264. // retain range LengthInBytes and OffsetInNewFile values in the same order.
  265. // Only the OffsetInOldFile values can differ between old files for retain
  266. // ranges.
  267. //
  268. //
  269. // The following prototypes are interface for creating patches from files.
  270. //
  271. function CreatePatchFileA(OldFileName: LPCSTR; NewFileName: LPCSTR; PatchFileName: LPCSTR; OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
  272. {$EXTERNALSYM CreatePatchFileA}
  273. function CreatePatchFileW(OldFileName: LPCWSTR; NewFileName: LPCWSTR; PatchFileName: LPCWSTR; OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
  274. {$EXTERNALSYM CreatePatchFileW}
  275. function CreatePatchFileByHandles(OldFileHandle: HANDLE; NewFileHandle: HANDLE; PatchFileHandle: HANDLE; OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
  276. {$EXTERNALSYM CreatePatchFileByHandles}
  277. function CreatePatchFileExA(OldFileCount: ULONG; OldFileInfoArray: PPATCH_OLD_FILE_INFO_A; NewFileName: LPCSTR; PatchFileName: LPCSTR;
  278. OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
  279. {$EXTERNALSYM CreatePatchFileExA}
  280. function CreatePatchFileExW(OldFileCount: ULONG; OldFileInfoArray: PPATCH_OLD_FILE_INFO_W; NewFileName: LPCWSTR; PatchFileName: LPCWSTR;
  281. OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
  282. {$EXTERNALSYM CreatePatchFileExW}
  283. function CreatePatchFileByHandlesEx(OldFileCount: ULONG; OldFileInfoArray: PPATCH_OLD_FILE_INFO_H; NewFileHandle: HANDLE;
  284. PatchFileHandle: HANDLE; OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
  285. {$EXTERNALSYM CreatePatchFileByHandlesEx}
  286. function ExtractPatchHeaderToFileA(PatchFileName: LPCSTR; PatchHeaderFileName: LPCSTR): BOOL; stdcall;
  287. {$EXTERNALSYM ExtractPatchHeaderToFileA}
  288. function ExtractPatchHeaderToFileW(PatchFileName: LPCWSTR; PatchHeaderFileName: LPCWSTR): BOOL; stdcall;
  289. {$EXTERNALSYM ExtractPatchHeaderToFileW}
  290. function ExtractPatchHeaderToFileByHandles(PatchFileHandle: HANDLE; PatchHeaderFileHandle: HANDLE): BOOL; stdcall;
  291. {$EXTERNALSYM ExtractPatchHeaderToFileByHandles}
  292. //
  293. // The following prototypes are interface for creating new file from old file
  294. // and patch file. Note that it is possible for the TestApply API to succeed
  295. // but the actual Apply to fail since the TestApply only verifies that the
  296. // old file has the correct CRC without actually applying the patch. The
  297. // TestApply API only requires the patch header portion of the patch file,
  298. // but its CRC must be fixed up.
  299. //
  300. function TestApplyPatchToFileA(PatchFileName: LPCSTR; OldFileName: LPCSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
  301. {$EXTERNALSYM TestApplyPatchToFileA}
  302. function TestApplyPatchToFileW(PatchFileName: LPCWSTR; OldFileName: LPCWSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
  303. {$EXTERNALSYM TestApplyPatchToFileW}
  304. function TestApplyPatchToFileByHandles(PatchFileHandle: HANDLE; OldFileHandle: HANDLE; ApplyOptionFlags: ULONG): BOOL; stdcall;
  305. {$EXTERNALSYM TestApplyPatchToFileByHandles}
  306. function ApplyPatchToFileA(PatchFileName: LPCSTR; OldFileName: LPCSTR; NewFileName: LPCSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
  307. {$EXTERNALSYM ApplyPatchToFileA}
  308. function ApplyPatchToFileW(PatchFileName: LPCWSTR; OldFileName: LPCWSTR; NewFileName: LPCWSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
  309. {$EXTERNALSYM ApplyPatchToFileW}
  310. function ApplyPatchToFileByHandles(PatchFileHandle: HANDLE; OldFileHandle: HANDLE; NewFileHandle: HANDLE; ApplyOptionFlags: ULONG): BOOL; stdcall;
  311. {$EXTERNALSYM ApplyPatchToFileByHandles}
  312. function ApplyPatchToFileExA(PatchFileName: LPCSTR; OldFileName: LPCSTR; NewFileName: LPCSTR; ApplyOptionFlags: ULONG;
  313. ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
  314. {$EXTERNALSYM ApplyPatchToFileExA}
  315. function ApplyPatchToFileExW(PatchFileName: LPCWSTR; OldFileName: LPCWSTR; NewFileName: LPCWSTR; ApplyOptionFlags: ULONG;
  316. ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
  317. {$EXTERNALSYM ApplyPatchToFileExW}
  318. function ApplyPatchToFileByHandlesEx(PatchFileHandle: HANDLE; OldFileHandle: HANDLE; NewFileHandle: HANDLE;
  319. ApplyOptionFlags: ULONG; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
  320. {$EXTERNALSYM ApplyPatchToFileByHandlesEx}
  321. //
  322. // The following prototypes provide a unique patch "signature" for a given
  323. // file. Consider the case where you have a new foo.dll and the machines
  324. // to be updated with the new foo.dll may have one of three different old
  325. // foo.dll files. Rather than creating a single large patch file that can
  326. // update any of the three older foo.dll files, three separate smaller patch
  327. // files can be created and "named" according to the patch signature of the
  328. // old file. Then the patch applyer application can determine at runtime
  329. // which of the three foo.dll patch files is necessary given the specific
  330. // foo.dll to be updated. If patch files are being downloaded over a slow
  331. // network connection (Internet over a modem), this signature scheme provides
  332. // a mechanism for choosing the correct single patch file to download at
  333. // application time thus decreasing total bytes necessary to download.
  334. //
  335. function GetFilePatchSignatureA(FileName: LPCSTR; OptionFlags: ULONG; OptionData: PVOID; IgnoreRangeCount: ULONG; IgnoreRangeArray: PPATCH_IGNORE_RANGE;
  336. RetainRangeCount: ULONG; RetainRangeArray: PPATCH_RETAIN_RANGE; SignatureBufferSize: ULONG; SignatureBuffer: PVOID): BOOL; stdcall;
  337. {$EXTERNALSYM GetFilePatchSignatureA}
  338. function GetFilePatchSignatureW(FileName: LPCWSTR; OptionFlags: ULONG; OptionData: PVOID; IgnoreRangeCount: ULONG; IgnoreRangeArray: PPATCH_IGNORE_RANGE;
  339. RetainRangeCount: ULONG; RetainRangeArray: PPATCH_RETAIN_RANGE; SignatureBufferSizeInBytes: ULONG; SignatureBuffer: PVOID): BOOL; stdcall;
  340. {$EXTERNALSYM GetFilePatchSignatureW}
  341. function GetFilePatchSignatureByHandle(FileHandle: HANDLE; OptionFlags: ULONG; OptionData: PVOID; IgnoreRangeCount: ULONG; IgnoreRangeArray: PPATCH_IGNORE_RANGE;
  342. RetainRangeCount: ULONG; RetainRangeArray: PPATCH_RETAIN_RANGE; SignatureBufferSize: ULONG; SignatureBuffer: PVOID): BOOL; stdcall;
  343. {$EXTERNALSYM GetFilePatchSignatureByHandle}
  344. //
  345. // Depending on whether UNICODE is defined, map the generic API names to the
  346. // appropriate Unicode or Ansi APIs.
  347. //
  348. function CreatePatchFile(OldFileName: LPCTSTR; NewFileName: LPCTSTR; PatchFileName: LPCTSTR; OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
  349. {$EXTERNALSYM CreatePatchFile}
  350. function CreatePatchFileEx(OldFileCount: ULONG; OldFileInfoArray: PPATCH_OLD_FILE_INFO; NewFileName: LPCTSTR; PatchFileName: LPCTSTR;
  351. OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
  352. {$EXTERNALSYM CreatePatchFileEx}
  353. function ExtractPatchHeaderToFile(PatchFileName: LPCTSTR; PatchHeaderFileName: LPCTSTR): BOOL; stdcall;
  354. {$EXTERNALSYM ExtractPatchHeaderToFile}
  355. function TestApplyPatchToFile(PatchFileName: LPCTSTR; OldFileName: LPCTSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
  356. {$EXTERNALSYM TestApplyPatchToFile}
  357. function ApplyPatchToFile(PatchFileName: LPCTSTR; OldFileName: LPCTSTR; NewFileName: LPCTSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
  358. {$EXTERNALSYM ApplyPatchToFile}
  359. function ApplyPatchToFileEx(PatchFileName: LPCTSTR; OldFileName: LPCTSTR; NewFileName: LPCTSTR; ApplyOptionFlags: ULONG; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
  360. {$EXTERNALSYM ApplyPatchToFileEx}
  361. function GetFilePatchSignature(FileName: LPCTSTR; OptionFlags: ULONG; OptionData: PVOID; IgnoreRangeCount: ULONG; IgnoreRangeArray: PPATCH_IGNORE_RANGE;
  362. RetainRangeCount: ULONG; RetainRangeArray: PPATCH_RETAIN_RANGE; SignatureBufferSizeInBytes: ULONG; SignatureBuffer: PVOID): BOOL; stdcall;
  363. {$EXTERNALSYM GetFilePatchSignature}
  364. implementation
  365. const
  366. patchapi = 'mspatcha.dll';
  367. {$IFDEF UNICODE}
  368. AWSuffix = 'W';
  369. {$ELSE}
  370. AWSuffix = 'A';
  371. {$ENDIF UNICODE}
  372. {$IFDEF DYNAMIC_LINK}
  373. var
  374. _CreatePatchFileA: Pointer;
  375. function CreatePatchFileA;
  376. begin
  377. GetProcedureAddress(_CreatePatchFileA, patchapi, 'CreatePatchFileA');
  378. asm
  379. MOV ESP, EBP
  380. POP EBP
  381. JMP [_CreatePatchFileA]
  382. end;
  383. end;
  384. var
  385. _CreatePatchFileW: Pointer;
  386. function CreatePatchFileW;
  387. begin
  388. GetProcedureAddress(_CreatePatchFileW, patchapi, 'CreatePatchFileW');
  389. asm
  390. MOV ESP, EBP
  391. POP EBP
  392. JMP [_CreatePatchFileW]
  393. end;
  394. end;
  395. var
  396. _CreatePatchFileByHandles: Pointer;
  397. function CreatePatchFileByHandles;
  398. begin
  399. GetProcedureAddress(_CreatePatchFileByHandles, patchapi, 'CreatePatchFileByHandles');
  400. asm
  401. MOV ESP, EBP
  402. POP EBP
  403. JMP [_CreatePatchFileByHandles]
  404. end;
  405. end;
  406. var
  407. _CreatePatchFileExA: Pointer;
  408. function CreatePatchFileExA;
  409. begin
  410. GetProcedureAddress(_CreatePatchFileExA, patchapi, 'CreatePatchFileExA');
  411. asm
  412. MOV ESP, EBP
  413. POP EBP
  414. JMP [_CreatePatchFileExA]
  415. end;
  416. end;
  417. var
  418. _CreatePatchFileExW: Pointer;
  419. function CreatePatchFileExW;
  420. begin
  421. GetProcedureAddress(_CreatePatchFileExW, patchapi, 'CreatePatchFileExW');
  422. asm
  423. MOV ESP, EBP
  424. POP EBP
  425. JMP [_CreatePatchFileExW]
  426. end;
  427. end;
  428. var
  429. _CreatePatchFileByHandlesEx: Pointer;
  430. function CreatePatchFileByHandlesEx;
  431. begin
  432. GetProcedureAddress(_CreatePatchFileByHandlesEx, patchapi, 'CreatePatchFileByHandlesEx');
  433. asm
  434. MOV ESP, EBP
  435. POP EBP
  436. JMP [_CreatePatchFileByHandlesEx]
  437. end;
  438. end;
  439. var
  440. _ExtractPatchHeaderToFileA: Pointer;
  441. function ExtractPatchHeaderToFileA;
  442. begin
  443. GetProcedureAddress(_ExtractPatchHeaderToFileA, patchapi, 'ExtractPatchHeaderToFileA');
  444. asm
  445. MOV ESP, EBP
  446. POP EBP
  447. JMP [_ExtractPatchHeaderToFileA]
  448. end;
  449. end;
  450. var
  451. _ExtractPatchHeaderToFileW: Pointer;
  452. function ExtractPatchHeaderToFileW;
  453. begin
  454. GetProcedureAddress(_ExtractPatchHeaderToFileW, patchapi, 'ExtractPatchHeaderToFileW');
  455. asm
  456. MOV ESP, EBP
  457. POP EBP
  458. JMP [_ExtractPatchHeaderToFileW]
  459. end;
  460. end;
  461. var
  462. _ExtrPatchHdrToFileByHandles: Pointer;
  463. function ExtractPatchHeaderToFileByHandles;
  464. begin
  465. GetProcedureAddress(_ExtrPatchHdrToFileByHandles, patchapi, 'ExtractPatchHeaderToFileByHandles');
  466. asm
  467. MOV ESP, EBP
  468. POP EBP
  469. JMP [_ExtrPatchHdrToFileByHandles]
  470. end;
  471. end;
  472. var
  473. _TestApplyPatchToFileA: Pointer;
  474. function TestApplyPatchToFileA;
  475. begin
  476. GetProcedureAddress(_TestApplyPatchToFileA, patchapi, 'TestApplyPatchToFileA');
  477. asm
  478. MOV ESP, EBP
  479. POP EBP
  480. JMP [_TestApplyPatchToFileA]
  481. end;
  482. end;
  483. var
  484. _TestApplyPatchToFileW: Pointer;
  485. function TestApplyPatchToFileW;
  486. begin
  487. GetProcedureAddress(_TestApplyPatchToFileW, patchapi, 'TestApplyPatchToFileW');
  488. asm
  489. MOV ESP, EBP
  490. POP EBP
  491. JMP [_TestApplyPatchToFileW]
  492. end;
  493. end;
  494. var
  495. _TestApplyPatchToFileByHandles: Pointer;
  496. function TestApplyPatchToFileByHandles;
  497. begin
  498. GetProcedureAddress(_TestApplyPatchToFileByHandles, patchapi, 'TestApplyPatchToFileByHandles');
  499. asm
  500. MOV ESP, EBP
  501. POP EBP
  502. JMP [_TestApplyPatchToFileByHandles]
  503. end;
  504. end;
  505. var
  506. _ApplyPatchToFileA: Pointer;
  507. function ApplyPatchToFileA;
  508. begin
  509. GetProcedureAddress(_ApplyPatchToFileA, patchapi, 'ApplyPatchToFileA');
  510. asm
  511. MOV ESP, EBP
  512. POP EBP
  513. JMP [_ApplyPatchToFileA]
  514. end;
  515. end;
  516. var
  517. _ApplyPatchToFileW: Pointer;
  518. function ApplyPatchToFileW;
  519. begin
  520. GetProcedureAddress(_ApplyPatchToFileW, patchapi, 'ApplyPatchToFileW');
  521. asm
  522. MOV ESP, EBP
  523. POP EBP
  524. JMP [_ApplyPatchToFileW]
  525. end;
  526. end;
  527. var
  528. _ApplyPatchToFileByHandles: Pointer;
  529. function ApplyPatchToFileByHandles;
  530. begin
  531. GetProcedureAddress(_ApplyPatchToFileByHandles, patchapi, 'ApplyPatchToFileByHandles');
  532. asm
  533. MOV ESP, EBP
  534. POP EBP
  535. JMP [_ApplyPatchToFileByHandles]
  536. end;
  537. end;
  538. var
  539. _ApplyPatchToFileExA: Pointer;
  540. function ApplyPatchToFileExA;
  541. begin
  542. GetProcedureAddress(_ApplyPatchToFileExA, patchapi, 'ApplyPatchToFileExA');
  543. asm
  544. MOV ESP, EBP
  545. POP EBP
  546. JMP [_ApplyPatchToFileExA]
  547. end;
  548. end;
  549. var
  550. _ApplyPatchToFileExW: Pointer;
  551. function ApplyPatchToFileExW;
  552. begin
  553. GetProcedureAddress(_ApplyPatchToFileExW, patchapi, 'ApplyPatchToFileExW');
  554. asm
  555. MOV ESP, EBP
  556. POP EBP
  557. JMP [_ApplyPatchToFileExW]
  558. end;
  559. end;
  560. var
  561. _ApplyPatchToFileByHandlesEx: Pointer;
  562. function ApplyPatchToFileByHandlesEx;
  563. begin
  564. GetProcedureAddress(_ApplyPatchToFileByHandlesEx, patchapi, 'ApplyPatchToFileByHandlesEx');
  565. asm
  566. MOV ESP, EBP
  567. POP EBP
  568. JMP [_ApplyPatchToFileByHandlesEx]
  569. end;
  570. end;
  571. var
  572. _GetFilePatchSignatureA: Pointer;
  573. function GetFilePatchSignatureA;
  574. begin
  575. GetProcedureAddress(_GetFilePatchSignatureA, patchapi, 'GetFilePatchSignatureA');
  576. asm
  577. MOV ESP, EBP
  578. POP EBP
  579. JMP [_GetFilePatchSignatureA]
  580. end;
  581. end;
  582. var
  583. _GetFilePatchSignatureW: Pointer;
  584. function GetFilePatchSignatureW;
  585. begin
  586. GetProcedureAddress(_GetFilePatchSignatureW, patchapi, 'GetFilePatchSignatureW');
  587. asm
  588. MOV ESP, EBP
  589. POP EBP
  590. JMP [_GetFilePatchSignatureW]
  591. end;
  592. end;
  593. var
  594. _GetFilePatchSignatureByHandle: Pointer;
  595. function GetFilePatchSignatureByHandle;
  596. begin
  597. GetProcedureAddress(_GetFilePatchSignatureByHandle, patchapi, 'GetFilePatchSignatureByHandle');
  598. asm
  599. MOV ESP, EBP
  600. POP EBP
  601. JMP [_GetFilePatchSignatureByHandle]
  602. end;
  603. end;
  604. var
  605. _CreatePatchFile: Pointer;
  606. function CreatePatchFile;
  607. begin
  608. GetProcedureAddress(_CreatePatchFile, patchapi, 'CreatePatchFile' + AWSuffix);
  609. asm
  610. MOV ESP, EBP
  611. POP EBP
  612. JMP [_CreatePatchFile]
  613. end;
  614. end;
  615. var
  616. _CreatePatchFileEx: Pointer;
  617. function CreatePatchFileEx;
  618. begin
  619. GetProcedureAddress(_CreatePatchFileEx, patchapi, 'CreatePatchFileEx' + AWSuffix);
  620. asm
  621. MOV ESP, EBP
  622. POP EBP
  623. JMP [_CreatePatchFileEx]
  624. end;
  625. end;
  626. var
  627. _ExtractPatchHeaderToFile: Pointer;
  628. function ExtractPatchHeaderToFile;
  629. begin
  630. GetProcedureAddress(_ExtractPatchHeaderToFile, patchapi, 'ExtractPatchHeaderToFile' + AWSuffix);
  631. asm
  632. MOV ESP, EBP
  633. POP EBP
  634. JMP [_ExtractPatchHeaderToFile]
  635. end;
  636. end;
  637. var
  638. _TestApplyPatchToFile: Pointer;
  639. function TestApplyPatchToFile;
  640. begin
  641. GetProcedureAddress(_TestApplyPatchToFile, patchapi, 'TestApplyPatchToFile' + AWSuffix);
  642. asm
  643. MOV ESP, EBP
  644. POP EBP
  645. JMP [_TestApplyPatchToFile]
  646. end;
  647. end;
  648. var
  649. _ApplyPatchToFile: Pointer;
  650. function ApplyPatchToFile;
  651. begin
  652. GetProcedureAddress(_ApplyPatchToFile, patchapi, 'ApplyPatchToFile' + AWSuffix);
  653. asm
  654. MOV ESP, EBP
  655. POP EBP
  656. JMP [_ApplyPatchToFile]
  657. end;
  658. end;
  659. var
  660. _ApplyPatchToFileEx: Pointer;
  661. function ApplyPatchToFileEx;
  662. begin
  663. GetProcedureAddress(_ApplyPatchToFileEx, patchapi, 'ApplyPatchToFileEx' + AWSuffix);
  664. asm
  665. MOV ESP, EBP
  666. POP EBP
  667. JMP [_ApplyPatchToFileEx]
  668. end;
  669. end;
  670. var
  671. _GetFilePatchSignature: Pointer;
  672. function GetFilePatchSignature;
  673. begin
  674. GetProcedureAddress(_GetFilePatchSignature, patchapi, 'GetFilePatchSignature' + AWSuffix);
  675. asm
  676. MOV ESP, EBP
  677. POP EBP
  678. JMP [_GetFilePatchSignature]
  679. end;
  680. end;
  681. {$ELSE}
  682. function CreatePatchFileA; external patchapi name 'CreatePatchFileA';
  683. function CreatePatchFileW; external patchapi name 'CreatePatchFileW';
  684. function CreatePatchFileByHandles; external patchapi name 'CreatePatchFileByHandles';
  685. function CreatePatchFileExA; external patchapi name 'CreatePatchFileExA';
  686. function CreatePatchFileExW; external patchapi name 'CreatePatchFileExW';
  687. function CreatePatchFileByHandlesEx; external patchapi name 'CreatePatchFileByHandlesEx';
  688. function ExtractPatchHeaderToFileA; external patchapi name 'ExtractPatchHeaderToFileA';
  689. function ExtractPatchHeaderToFileW; external patchapi name 'ExtractPatchHeaderToFileW';
  690. function ExtractPatchHeaderToFileByHandles; external patchapi name 'ExtractPatchHeaderToFileByHandles';
  691. function TestApplyPatchToFileA; external patchapi name 'TestApplyPatchToFileA';
  692. function TestApplyPatchToFileW; external patchapi name 'TestApplyPatchToFileW';
  693. function TestApplyPatchToFileByHandles; external patchapi name 'TestApplyPatchToFileByHandles';
  694. function ApplyPatchToFileA; external patchapi name 'ApplyPatchToFileA';
  695. function ApplyPatchToFileW; external patchapi name 'ApplyPatchToFileW';
  696. function ApplyPatchToFileByHandles; external patchapi name 'ApplyPatchToFileByHandles';
  697. function ApplyPatchToFileExA; external patchapi name 'ApplyPatchToFileExA';
  698. function ApplyPatchToFileExW; external patchapi name 'ApplyPatchToFileExW';
  699. function ApplyPatchToFileByHandlesEx; external patchapi name 'ApplyPatchToFileByHandlesEx';
  700. function GetFilePatchSignatureA; external patchapi name 'GetFilePatchSignatureA';
  701. function GetFilePatchSignatureW; external patchapi name 'GetFilePatchSignatureW';
  702. function GetFilePatchSignatureByHandle; external patchapi name 'GetFilePatchSignatureByHandle';
  703. function CreatePatchFile; external patchapi name 'CreatePatchFile' + AWSuffix;
  704. function CreatePatchFileEx; external patchapi name 'CreatePatchFileEx' + AWSuffix;
  705. function ExtractPatchHeaderToFile; external patchapi name 'ExtractPatchHeaderToFile' + AWSuffix;
  706. function TestApplyPatchToFile; external patchapi name 'TestApplyPatchToFile' + AWSuffix;
  707. function ApplyPatchToFile; external patchapi name 'ApplyPatchToFile' + AWSuffix;
  708. function ApplyPatchToFileEx; external patchapi name 'ApplyPatchToFileEx' + AWSuffix;
  709. function GetFilePatchSignature; external patchapi name 'GetFilePatchSignature' + AWSuffix;
  710. {$ENDIF DYNAMIC_LINK}
  711. end.