jwapatchapi.pas 30 KB

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