📄 jwapatchapi.pas
字号:
function ApplyPatchToFileA(PatchFileName: LPCSTR; OldFileName: LPCSTR; NewFileName: LPCSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
{$EXTERNALSYM ApplyPatchToFileA}
function ApplyPatchToFileW(PatchFileName: LPCWSTR; OldFileName: LPCWSTR; NewFileName: LPCWSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
{$EXTERNALSYM ApplyPatchToFileW}
function ApplyPatchToFileByHandles(PatchFileHandle: HANDLE; OldFileHandle: HANDLE; NewFileHandle: HANDLE; ApplyOptionFlags: ULONG): BOOL; stdcall;
{$EXTERNALSYM ApplyPatchToFileByHandles}
function ApplyPatchToFileExA(PatchFileName: LPCSTR; OldFileName: LPCSTR; NewFileName: LPCSTR; ApplyOptionFlags: ULONG;
ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
{$EXTERNALSYM ApplyPatchToFileExA}
function ApplyPatchToFileExW(PatchFileName: LPCWSTR; OldFileName: LPCWSTR; NewFileName: LPCWSTR; ApplyOptionFlags: ULONG;
ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
{$EXTERNALSYM ApplyPatchToFileExW}
function ApplyPatchToFileByHandlesEx(PatchFileHandle: HANDLE; OldFileHandle: HANDLE; NewFileHandle: HANDLE;
ApplyOptionFlags: ULONG; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
{$EXTERNALSYM ApplyPatchToFileByHandlesEx}
//
// The following prototypes provide a unique patch "signature" for a given
// file. Consider the case where you have a new foo.dll and the machines
// to be updated with the new foo.dll may have one of three different old
// foo.dll files. Rather than creating a single large patch file that can
// update any of the three older foo.dll files, three separate smaller patch
// files can be created and "named" according to the patch signature of the
// old file. Then the patch applyer application can determine at runtime
// which of the three foo.dll patch files is necessary given the specific
// foo.dll to be updated. If patch files are being downloaded over a slow
// network connection (Internet over a modem), this signature scheme provides
// a mechanism for choosing the correct single patch file to download at
// application time thus decreasing total bytes necessary to download.
//
function GetFilePatchSignatureA(FileName: LPCSTR; OptionFlags: ULONG; OptionData: PVOID; IgnoreRangeCount: ULONG; IgnoreRangeArray: PPATCH_IGNORE_RANGE;
RetainRangeCount: ULONG; RetainRangeArray: PPATCH_RETAIN_RANGE; SignatureBufferSize: ULONG; SignatureBuffer: PVOID): BOOL; stdcall;
{$EXTERNALSYM GetFilePatchSignatureA}
function GetFilePatchSignatureW(FileName: LPCWSTR; OptionFlags: ULONG; OptionData: PVOID; IgnoreRangeCount: ULONG; IgnoreRangeArray: PPATCH_IGNORE_RANGE;
RetainRangeCount: ULONG; RetainRangeArray: PPATCH_RETAIN_RANGE; SignatureBufferSizeInBytes: ULONG; SignatureBuffer: PVOID): BOOL; stdcall;
{$EXTERNALSYM GetFilePatchSignatureW}
function GetFilePatchSignatureByHandle(FileHandle: HANDLE; OptionFlags: ULONG; OptionData: PVOID; IgnoreRangeCount: ULONG; IgnoreRangeArray: PPATCH_IGNORE_RANGE;
RetainRangeCount: ULONG; RetainRangeArray: PPATCH_RETAIN_RANGE; SignatureBufferSize: ULONG; SignatureBuffer: PVOID): BOOL; stdcall;
{$EXTERNALSYM GetFilePatchSignatureByHandle}
//
// Depending on whether UNICODE is defined, map the generic API names to the
// appropriate Unicode or Ansi APIs.
//
{$IFDEF UNICODE}
function CreatePatchFile(OldFileName: LPCWSTR; NewFileName: LPCWSTR; PatchFileName: LPCWSTR; OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
{$EXTERNALSYM CreatePatchFile}
function CreatePatchFileEx(OldFileCount: ULONG; OldFileInfoArray: PPATCH_OLD_FILE_INFO_W; NewFileName: LPCWSTR; PatchFileName: LPCWSTR;
OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
{$EXTERNALSYM CreatePatchFileEx}
function ExtractPatchHeaderToFile(PatchFileName: LPCWSTR; PatchHeaderFileName: LPCWSTR): BOOL; stdcall;
{$EXTERNALSYM ExtractPatchHeaderToFile}
function TestApplyPatchToFile(PatchFileName: LPCWSTR; OldFileName: LPCWSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
{$EXTERNALSYM TestApplyPatchToFile}
function ApplyPatchToFile(PatchFileName: LPCWSTR; OldFileName: LPCWSTR; NewFileName: LPCWSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
{$EXTERNALSYM ApplyPatchToFile}
function ApplyPatchToFileEx(PatchFileName: LPCWSTR; OldFileName: LPCWSTR; NewFileName: LPCWSTR; ApplyOptionFlags: ULONG; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
{$EXTERNALSYM ApplyPatchToFileEx}
function GetFilePatchSignature(FileName: LPCWSTR; OptionFlags: ULONG; OptionData: PVOID; IgnoreRangeCount: ULONG; IgnoreRangeArray: PPATCH_IGNORE_RANGE;
RetainRangeCount: ULONG; RetainRangeArray: PPATCH_RETAIN_RANGE; SignatureBufferSizeInBytes: ULONG; SignatureBuffer: PVOID): BOOL; stdcall;
{$EXTERNALSYM GetFilePatchSignature}
{$ELSE}
function CreatePatchFile(OldFileName: LPCSTR; NewFileName: LPCSTR; PatchFileName: LPCSTR; OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA): BOOL; stdcall;
{$EXTERNALSYM CreatePatchFile}
function CreatePatchFileEx(OldFileCount: ULONG; OldFileInfoArray: PPATCH_OLD_FILE_INFO_A; NewFileName: LPCSTR; PatchFileName: LPCSTR;
OptionFlags: ULONG; OptionData: PPATCH_OPTION_DATA; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
{$EXTERNALSYM CreatePatchFileEx}
function ExtractPatchHeaderToFile(PatchFileName: LPCSTR; PatchHeaderFileName: LPCSTR): BOOL; stdcall;
{$EXTERNALSYM ExtractPatchHeaderToFile}
function TestApplyPatchToFile(PatchFileName: LPCSTR; OldFileName: LPCSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
{$EXTERNALSYM TestApplyPatchToFile}
function ApplyPatchToFile(PatchFileName: LPCSTR; OldFileName: LPCSTR; NewFileName: LPCSTR; ApplyOptionFlags: ULONG): BOOL; stdcall;
{$EXTERNALSYM ApplyPatchToFile}
function ApplyPatchToFileEx(PatchFileName: LPCSTR; OldFileName: LPCSTR; NewFileName: LPCSTR; ApplyOptionFlags: ULONG; ProgressCallback: PATCH_PROGRESS_CALLBACK; CallbackContext: PVOID): BOOL; stdcall;
{$EXTERNALSYM ApplyPatchToFileEx}
function GetFilePatchSignature(FileName: LPCSTR; OptionFlags: ULONG; OptionData: PVOID; IgnoreRangeCount: ULONG; IgnoreRangeArray: PPATCH_IGNORE_RANGE;
RetainRangeCount: ULONG; RetainRangeArray: PPATCH_RETAIN_RANGE; SignatureBufferSize: ULONG; SignatureBuffer: PVOID): BOOL; stdcall;
{$EXTERNALSYM GetFilePatchSignature}
{$ENDIF}
implementation
const
patchapi = 'patchapi.dll'; // todo verify
{$IFDEF DYNAMIC_LINK}
var
_CreatePatchFileA: Pointer;
function CreatePatchFileA;
begin
GetProcedureAddress(_CreatePatchFileA, patchapi, 'CreatePatchFileA');
asm
mov esp, ebp
pop ebp
jmp [_CreatePatchFileA]
end;
end;
{$ELSE}
function CreatePatchFileA; external patchapi name 'CreatePatchFileA';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_CreatePatchFileW: Pointer;
function CreatePatchFileW;
begin
GetProcedureAddress(_CreatePatchFileW, patchapi, 'CreatePatchFileW');
asm
mov esp, ebp
pop ebp
jmp [_CreatePatchFileW]
end;
end;
{$ELSE}
function CreatePatchFileW; external patchapi name 'CreatePatchFileW';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_CreatePatchFileByHandles: Pointer;
function CreatePatchFileByHandles;
begin
GetProcedureAddress(_CreatePatchFileByHandles, patchapi, 'CreatePatchFileByHandles');
asm
mov esp, ebp
pop ebp
jmp [_CreatePatchFileByHandles]
end;
end;
{$ELSE}
function CreatePatchFileByHandles; external patchapi name 'CreatePatchFileByHandles';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_CreatePatchFileExA: Pointer;
function CreatePatchFileExA;
begin
GetProcedureAddress(_CreatePatchFileExA, patchapi, 'CreatePatchFileExA');
asm
mov esp, ebp
pop ebp
jmp [_CreatePatchFileExA]
end;
end;
{$ELSE}
function CreatePatchFileExA; external patchapi name 'CreatePatchFileExA';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_CreatePatchFileExW: Pointer;
function CreatePatchFileExW;
begin
GetProcedureAddress(_CreatePatchFileExW, patchapi, 'CreatePatchFileExW');
asm
mov esp, ebp
pop ebp
jmp [_CreatePatchFileExW]
end;
end;
{$ELSE}
function CreatePatchFileExW; external patchapi name 'CreatePatchFileExW';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_CreatePatchFileByHandlesEx: Pointer;
function CreatePatchFileByHandlesEx;
begin
GetProcedureAddress(_CreatePatchFileByHandlesEx, patchapi, 'CreatePatchFileByHandlesEx');
asm
mov esp, ebp
pop ebp
jmp [_CreatePatchFileByHandlesEx]
end;
end;
{$ELSE}
function CreatePatchFileByHandlesEx; external patchapi name 'CreatePatchFileByHandlesEx';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_ExtractPatchHeaderToFileA: Pointer;
function ExtractPatchHeaderToFileA;
begin
GetProcedureAddress(_ExtractPatchHeaderToFileA, patchapi, 'ExtractPatchHeaderToFileA');
asm
mov esp, ebp
pop ebp
jmp [_ExtractPatchHeaderToFileA]
end;
end;
{$ELSE}
function ExtractPatchHeaderToFileA; external patchapi name 'ExtractPatchHeaderToFileA';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_ExtractPatchHeaderToFileW: Pointer;
function ExtractPatchHeaderToFileW;
begin
GetProcedureAddress(_ExtractPatchHeaderToFileW, patchapi, 'ExtractPatchHeaderToFileW');
asm
mov esp, ebp
pop ebp
jmp [_ExtractPatchHeaderToFileW]
end;
end;
{$ELSE}
function ExtractPatchHeaderToFileW; external patchapi name 'ExtractPatchHeaderToFileW';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_ExtrPatchHdrToFileByHandles: Pointer;
function ExtractPatchHeaderToFileByHandles;
begin
GetProcedureAddress(_ExtrPatchHdrToFileByHandles, patchapi, 'ExtractPatchHeaderToFileByHandles');
asm
mov esp, ebp
pop ebp
jmp [_ExtrPatchHdrToFileByHandles]
end;
end;
{$ELSE}
function ExtractPatchHeaderToFileByHandles; external patchapi name 'ExtractPatchHeaderToFileByHandles';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_TestApplyPatchToFileA: Pointer;
function TestApplyPatchToFileA;
begin
GetProcedureAddress(_TestApplyPatchToFileA, patchapi, 'TestApplyPatchToFileA');
asm
mov esp, ebp
pop ebp
jmp [_TestApplyPatchToFileA]
end;
end;
{$ELSE}
function TestApplyPatchToFileA; external patchapi name 'TestApplyPatchToFileA';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_TestApplyPatchToFileW: Pointer;
function TestApplyPatchToFileW;
begin
GetProcedureAddress(_TestApplyPatchToFileW, patchapi, 'TestApplyPatchToFileW');
asm
mov esp, ebp
pop ebp
jmp [_TestApplyPatchToFileW]
end;
end;
{$ELSE}
function TestApplyPatchToFileW; external patchapi name 'TestApplyPatchToFileW';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_TestApplyPatchToFileByHandles: Pointer;
function TestApplyPatchToFileByHandles;
begin
GetProcedureAddress(_TestApplyPatchToFileByHandles, patchapi, 'TestApplyPatchToFileByHandles');
asm
mov esp, ebp
pop ebp
jmp [_TestApplyPatchToFileByHandles]
end;
end;
{$ELSE}
function TestApplyPatchToFileByHandles; external patchapi name 'TestApplyPatchToFileByHandles';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_ApplyPatchToFileA: Pointer;
function ApplyPatchToFileA;
begin
GetProcedureAddress(_ApplyPatchToFileA, patchapi, 'ApplyPatchToFileA');
asm
mov esp, ebp
pop ebp
jmp [_ApplyPatchToFileA]
end;
end;
{$ELSE}
function ApplyPatchToFileA; external patchapi name 'ApplyPatchToFileA';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_ApplyPatchToFileW: Pointer;
function ApplyPatchToFileW;
begin
GetProcedureAddress(_ApplyPatchToFileW, patchapi, 'ApplyPatchToFileW');
asm
mov esp, ebp
pop ebp
jmp [_ApplyPatchToFileW]
end;
end;
{$ELSE}
function ApplyPatchToFileW; external patchapi name 'ApplyPatchToFileW';
{$ENDIF DYNAMIC_LINK}
{$IFDEF DYNAMIC_LINK}
var
_ApplyPatchToFileByHandles: Pointer;
function ApplyPatchToFileByHandles;
begin
GetProcedureAddress(_ApplyPatchToFileByHandles, patchapi, 'ApplyPatchToFileByHandles');
asm
mov esp, ebp
pop ebp
jmp [_ApplyPatchToFileByHandles]
end;
end;
{$ELSE}
function ApplyPatchToFileByHandles; external patchapi name 'ApplyPatchToFileByHandles';
{$ENDIF DYNAMIC_LINK}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -