2 * Unit tests for Patch API functions
4 * Copyright (c) 2019 Conor McCarthy
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 * Without mspatchc.dll, the inability to create test patch files under Wine
23 * limits testing to the supplied small files.
26 #include "wine/test.h"
32 static BOOL (WINAPI
*pApplyPatchToFileA
)(LPCSTR
, LPCSTR
, LPCSTR
, ULONG
);
33 static BOOL (WINAPI
*pApplyPatchToFileByHandles
)(HANDLE
, HANDLE
, HANDLE
, ULONG
);
34 static BOOL (WINAPI
*pApplyPatchToFileExA
)(LPCSTR
, LPCSTR
, LPCSTR
, ULONG
, PPATCH_PROGRESS_CALLBACK
, PVOID
);
35 static BOOL (WINAPI
*pApplyPatchToFileByHandlesEx
)(HANDLE
, HANDLE
, HANDLE
, ULONG
, PPATCH_PROGRESS_CALLBACK
, PVOID
);
36 static BOOL (WINAPI
*pApplyPatchToFileByBuffers
)(PBYTE
, ULONG
, PBYTE
, ULONG
, PBYTE
*, ULONG
, ULONG
*, FILETIME
*, ULONG
, PPATCH_PROGRESS_CALLBACK
, PVOID
);
37 static BOOL (WINAPI
*pTestApplyPatchToFileA
)(LPCSTR
, LPCSTR
, ULONG
);
38 static BOOL (WINAPI
*pTestApplyPatchToFileByHandles
)(HANDLE
, HANDLE
, ULONG
);
39 static BOOL (WINAPI
*pTestApplyPatchToFileByBuffers
)(PBYTE
, ULONG
, PBYTE
, ULONG
, ULONG
*, ULONG
);
41 static DWORD (WINAPI
*pGetVersion
)(void) = NULL
;
42 static DWORD win_version
= 0x601;
44 static BOOL
init_function_pointers(void)
47 HMODULE mspatcha
= LoadLibraryA("mspatcha.dll");
50 win_skip("mspatcha.dll not found\n");
53 pApplyPatchToFileA
= (void *)GetProcAddress(mspatcha
, "ApplyPatchToFileA");
54 pApplyPatchToFileExA
= (void *)GetProcAddress(mspatcha
, "ApplyPatchToFileExA");
55 pApplyPatchToFileByHandles
= (void *)GetProcAddress(mspatcha
, "ApplyPatchToFileByHandles");
56 pApplyPatchToFileByBuffers
= (void *)GetProcAddress(mspatcha
, "ApplyPatchToFileByBuffers");
57 pApplyPatchToFileByHandlesEx
= (void *)GetProcAddress(mspatcha
, "ApplyPatchToFileByHandlesEx");
58 pTestApplyPatchToFileA
= (void *)GetProcAddress(mspatcha
, "TestApplyPatchToFileA");
59 pTestApplyPatchToFileByHandles
= (void *)GetProcAddress(mspatcha
, "TestApplyPatchToFileByHandles");
60 pTestApplyPatchToFileByBuffers
= (void *)GetProcAddress(mspatcha
, "TestApplyPatchToFileByBuffers");
62 kernel32
= GetModuleHandleA("kernel32.dll");
65 pGetVersion
= (void *)GetProcAddress(kernel32
, "GetVersion");
68 win_version
= pGetVersion() & 0xFFFF;
69 win_version
= ((win_version
& 0xFF) << 8) | (win_version
>> 8);
75 #define TWO_FILES_RANGES_SIZE 1023
77 /* BYTE* arguments to ApplyPatchToFileByBuffers() are not const even for input */
78 static BYTE old_two_files_ranges_0
[] = {
79 0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x38,0x49,0x3F,0x47,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x4E,0x3F,0x3D,0x35,
80 0x4D,0x32,0x31,0x51,0x30,0x35,0x37,0x52,0x33,0x38,0x3A,0x39,0x3A,0x30,0x35,0x37,0x32,0x36,0x34,0x31,0x3A,0x32,0x31,0x38,0x38,0x3C,0x3C,0x3B,0x4F,0x4E,0x30,0x41,
81 0x35,0x33,0x33,0x31,0x30,0x40,0x38,0x46,0x3F,0x32,0x31,0x3E,0x45,0x33,0x33,0x3B,0x31,0x31,0x35,0x38,0x57,0x38,0x37,0x39,0x33,0x30,0x35,0x33,0x48,0x36,0x37,0x32,
82 0x48,0x3B,0x47,0x3E,0x33,0x3E,0x30,0x37,0x31,0x35,0x3F,0x4B,0x47,0x39,0x35,0x53,0x32,0x34,0x30,0x37,0x30,0x48,0x30,0x34,0x53,0x36,0x33,0x31,0x31,0x34,0x40,0x35,
83 0x37,0x30,0x69,0x4A,0x3F,0x32,0x32,0x30,0x3A,0x39,0x40,0x54,0x31,0x32,0x30,0x3C,0x39,0xE8,0x30,0x34,0x32,0x39,0x4D,0x35,0x45,0x32,0x34,0x30,0x35,0x32,0x33,0x41,
84 0x33,0x30,0x64,0x30,0x46,0x3E,0x32,0x32,0x39,0x33,0x33,0x62,0x34,0x3D,0x38,0x3A,0x39,0x32,0x32,0x34,0x38,0x50,0x39,0x39,0x44,0x36,0x45,0x38,0x40,0x47,0x3F,0x4B,
85 0x3D,0x38,0x33,0x30,0x35,0x33,0x35,0x46,0x31,0x5B,0x4B,0x40,0x49,0x3F,0x3F,0x4B,0x3D,0x38,0x33,0x3D,0x70,0x34,0x42,0x32,0x61,0x36,0x4D,0x36,0x3F,0x30,0x35,0x36,
86 0x37,0x30,0x31,0x31,0x34,0x36,0x3C,0x32,0x3E,0x33,0x34,0x38,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x33,0x30,0x34,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,
87 0x33,0x4E,0x40,0x5B,0x33,0x38,0x49,0x3F,0x47,0x3C,0x32,0x40,0x38,0x4A,0x39,0x33,0x42,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0xE8,0xAA,0x01,0x00,0x00,0x49,0x3F,
88 0x47,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0xE8,0x8C,0x01,0x00,0x00,0x32,0x31,0x51,0x30,0x35,0x37,0x52,0x33,0x38,0x3A,0x39,0x3A,0x30,0x35,
89 0x37,0x32,0x36,0x34,0x31,0x3A,0x32,0x31,0x38,0x38,0x3C,0x3C,0x3B,0x4F,0x4E,0x30,0x41,0x35,0x33,0x33,0x31,0x30,0x40,0x38,0x46,0x3F,0x32,0x31,0x3E,0x45,0x33,0x33,
90 0x3B,0x31,0x31,0x35,0x38,0x57,0x38,0x37,0x33,0x30,0x35,0x33,0x48,0x36,0x37,0x32,0x48,0x3B,0x47,0x3E,0x33,0x3E,0x30,0x37,0x31,0x35,0x3F,0x4B,0x47,0x39,0x35,0x53,
91 0x32,0x34,0x30,0x37,0x30,0x48,0x30,0x34,0x53,0x36,0x4F,0x31,0x38,0x32,0x52,0x44,0x37,0x3D,0x4C,0x33,0x38,0x36,0x57,0x30,0x35,0x3C,0x32,0x33,0xE8,0x98,0xFE,0xFF,
92 0xFF,0x4D,0x31,0x31,0x33,0x32,0x36,0x32,0x32,0x31,0x39,0x35,0x5B,0x31,0x38,0x30,0x35,0x3C,0x3C,0x34,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,
93 0x38,0xE8,0x28,0x01,0x00,0x00,0x31,0x32,0x34,0x38,0x49,0x31,0x40,0x31,0x41,0x31,0x3F,0x36,0x30,0x3E,0x3B,0x36,0x3A,0x45,0x32,0x50,0x3C,0x45,0x3D,0x31,0x31,0x3C,
94 0x3A,0x3A,0x46,0x4A,0x3F,0x36,0x33,0x43,0x3C,0x3D,0x32,0x37,0x36,0x3B,0x3E,0x36,0x40,0x32,0x39,0x51,0x31,0x33,0x32,0x36,0x44,0x31,0x35,0x34,0x3A,0x32,0x37,0x3D,
95 0x33,0x48,0x45,0x31,0x31,0x30,0x3A,0x31,0x39,0x31,0x37,0x32,0x35,0x35,0x3B,0x35,0x35,0x48,0x38,0x33,0x61,0x40,0x36,0x33,0x36,0x39,0x30,0x30,0x3C,0x36,0x56,0x3D,
96 0xE8,0x12,0xFF,0xFF,0xFF,0x3C,0x3D,0x33,0x45,0xE8,0x32,0x3D,0x3F,0x37,0x35,0x37,0xE8,0x7E,0x00,0x00,0x00,0x34,0x31,0x30,0x34,0x31,0x30,0x32,0x30,0x41,0x35,0x31,
97 0x44,0x3C,0x31,0x3A,0x4F,0x42,0x34,0x34,0x47,0x41,0x36,0x41,0x32,0x32,0x35,0x3A,0x41,0x37,0x32,0x43,0x31,0x38,0x40,0x3D,0x34,0x33,0x35,0x30,0x3F,0x35,0x32,0x36,
98 0x31,0x35,0x30,0x33,0x49,0x41,0x33,0x37,0x44,0x35,0x3B,0x3C,0x32,0x33,0x4D,0x33,0x32,0xE8,0xE9,0xFF,0xFF,0xFF,0x33,0x38,0x49,0x3F,0x3C,0x32,0x33,0x4D,0x33,0x32,
99 0x38,0x3D,0x31,0x55,0x33,0x37,0x3C,0x30,0x3B,0x35,0x3D,0x4F,0x42,0x4F,0x33,0x33,0x3A,0x4D,0x35,0x34,0xE8,0x62,0xFF,0xFF,0xFF,0x31,0x33,0x5E,0x33,0x52,0x51,0x3E,
100 0x31,0x41,0x34,0x40,0x44,0x3F,0x30,0x52,0x33,0x35,0x36,0x3D,0x3F,0x37,0x41,0x44,0x33,0x39,0x34,0x39,0x30,0x33,0x31,0x37,0x41,0x46,0x3C,0x3A,0xE8,0x30,0x3C,0x3B,
101 0x48,0x36,0x32,0x33,0x33,0x36,0x3A,0x42,0x43,0x43,0x30,0x37,0x35,0x30,0x4B,0x46,0x4B,0x3C,0x54,0x36,0x3F,0x32,0x31,0x3D,0x3B,0x34,0x30,0x3E,0x32,0x34,0x4C,0x3F,
102 0x30,0x41,0x32,0x43,0x30,0x36,0x33,0x41,0x36,0x35,0x31,0x30,0x47,0x38,0x31,0x35,0xE8,0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0x32,0x52,0x32,0x32,0x50,0x39,0x3D,0x37,0x4E,
103 0x33,0x34,0x30,0x4E,0x3A,0x49,0x35,0x37,0x37,0x33,0x44,0x36,0x32,0x3A,0x50,0x3A,0x32,0x34,0x36,0x3D,0x36,0x34,0x3C,0x4C,0x32,0x45,0x38,0x39,0x33,0x33,0x35,0x33,
104 0x32,0x33,0x3D,0x38,0x38,0x32,0x37,0x32,0x42,0x32,0x36,0x40,0x57,0x34,0x33,0x33,0x4F,0x4D,0x42,0x39,0x34,0x30,0x3A,0x31,0x33,0x45,0x48,0x46,0x35,0x42,0x3D,0x38,
105 0x3B,0x33,0x34,0x33,0x3F,0x38,0x37,0x4B,0x36,0x33,0x30,0x43,0x42,0x38,0x31,0x4B,0x40,0x4D,0x3F,0x56,0x41,0x33,0x41,0x36,0x3A,0x31,0x4F,0x36,0x44,0x33,0x45,0x34,
106 0x4B,0x37,0x46,0x34,0x36,0x3F,0x30,0x3B,0x36,0x39,0x36,0x3B,0x34,0xE8,0x4D,0xFF,0xFF,0xFF,0x39,0x34,0x3D,0x38,0x3D,0x34,0x31,0x31,0x37,0x33,0x30,0x32,0x38,0x34,
107 0x38,0x39,0x35,0x33,0x30,0x34,0x4B,0xE8,0x37,0xFF,0xFF,0xFF,0x33,0x32,0x3A,0x31,0x3B,0x36,0x3A,0x44,0x31,0x57,0x33,0x3E,0x3E,0x33,0x3C,0x32,0x33,0x4D,0x33,0x32,
108 0x44,0x33,0x4E,0x40,0x5B,0x33,0x38,0x49,0x3F,0x47,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x4E,0x3F,0x3D,0x35,0x4D,0x32,0x31,0x51,0x30,0x35,
109 0x37,0x52,0x33,0x38,0x3A,0x39,0x3A,0x30,0x35,0x37,0x32,0x36,0x34,0x31,0x3A,0x32,0x31,0x38,0x38,0x3C,0x3C,0x3B,0x4F,0x4E,0x30,0x41,0x35,0x33,0x33,0x31,0x30,0x40,
110 0x38,0x46,0x3F,0x32,0x31,0x3E,0x45,0x33,0x33,0x3B,0x31,0x31,0x35,0x38,0x57,0x38,0x37,0x39,0x33,0x30,0x35,0x33,0x48,0x36,0x37,0x32,0x48,0x3B,0x47,0x3E };
112 static BYTE old_two_files_ranges_1
[] = {
113 0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x38,0x49,0x3F,0x47,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x4E,0x3F,0x3D,0x35,
114 0x4D,0x32,0x31,0x51,0x30,0x35,0x37,0x52,0x33,0x38,0x3A,0x39,0x3A,0x30,0x35,0x37,0x32,0x36,0x34,0x31,0x3A,0x32,0x31,0x38,0x38,0x3C,0x3C,0x3B,0x4F,0x4E,0x30,0x41,
115 0x35,0x33,0x33,0x31,0x30,0x40,0x38,0x46,0x3F,0x32,0x31,0x3E,0x45,0x33,0x33,0x3B,0x31,0x31,0x35,0x38,0x57,0x38,0x37,0x39,0x33,0x30,0x35,0x33,0x48,0x36,0x37,0x32,
116 0x48,0x3B,0x47,0x3E,0x33,0x3E,0x30,0x37,0x31,0x35,0x3F,0x4B,0x47,0x39,0x35,0x53,0x32,0x34,0x30,0x37,0x30,0x48,0x30,0x34,0x53,0x36,0x33,0x31,0x31,0x34,0x40,0x35,
117 0x37,0x30,0x69,0x4A,0x3F,0x32,0x32,0x30,0x3A,0x39,0x40,0x54,0x31,0x32,0x30,0x3C,0x39,0xE8,0x30,0x34,0x32,0x39,0x4D,0x35,0x45,0x32,0x34,0x30,0x35,0x32,0x33,0x41,
118 0x33,0x30,0x64,0x30,0x46,0x3E,0x32,0x32,0x39,0x33,0x33,0x62,0x34,0x3D,0x38,0x3A,0x39,0x32,0x32,0x34,0x38,0x50,0x39,0x39,0x44,0x36,0x45,0x38,0x40,0x47,0x3F,0x4B,
119 0x3D,0x38,0x33,0x30,0x35,0x33,0x35,0x46,0x31,0x5B,0x4B,0x40,0x49,0x3F,0x3F,0x4B,0x3D,0x38,0x33,0x3D,0x70,0x34,0x42,0x32,0x61,0x36,0x4D,0x36,0x3F,0x30,0x35,0x36,
120 0x37,0x30,0x31,0x31,0x34,0x36,0x3C,0x32,0x3E,0x33,0x34,0x38,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x33,0x30,0x34,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,
121 0x33,0x4E,0x40,0x5B,0x33,0x38,0x49,0x3F,0x47,0x3C,0x32,0x40,0x38,0x4A,0x39,0x33,0x42,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0xE8,0xAA,0x01,0x00,0x00,0x49,0x3F,
122 0x47,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0xE8,0x8C,0x01,0x00,0x00,0x32,0x31,0x51,0x30,0x35,0x37,0x52,0x33,0x38,0x3A,0x39,0x3A,0x30,0x35,
123 0x37,0x32,0x36,0x34,0x31,0x3A,0x32,0x31,0x38,0x38,0x3C,0x3C,0x3B,0x4F,0x4E,0x30,0x41,0x35,0x33,0x33,0x31,0x30,0x40,0x38,0x46,0x3F,0x32,0x31,0x3E,0x45,0x33,0x33,
124 0x3B,0x31,0x31,0x35,0x38,0x57,0x38,0x37,0x39,0x33,0x30,0x35,0x33,0x48,0x36,0x37,0x32,0x48,0x3B,0x47,0x3E,0x33,0x3E,0x30,0x37,0x31,0x35,0x3F,0x4B,0x47,0x39,0x35,
125 0x53,0x32,0x34,0x30,0x37,0x30,0x48,0x30,0x34,0x53,0x36,0x4F,0x31,0x38,0x32,0x52,0x44,0x37,0x3D,0x4C,0x33,0x38,0x36,0x57,0x30,0x35,0x3C,0x32,0x33,0xE8,0x98,0xFE,
126 0xFF,0xFF,0x4D,0x31,0x31,0x33,0x32,0x36,0x32,0x4A,0x32,0x31,0x39,0x35,0x5B,0x31,0x38,0x30,0x35,0x3C,0x3C,0x34,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,
127 0x5B,0x33,0x38,0xE8,0x28,0x01,0x00,0x00,0x31,0x32,0x34,0x38,0x49,0x31,0x40,0x31,0x41,0x31,0x3F,0x36,0x30,0x3E,0x3B,0x36,0x3A,0x45,0x32,0x50,0x3C,0x45,0x3D,0x31,
128 0x31,0x3C,0x3A,0x3A,0x46,0x4A,0x3F,0x36,0x33,0x43,0x3C,0x3D,0x32,0x37,0x36,0x3B,0x3E,0x36,0x40,0x32,0x39,0x51,0x31,0x33,0x32,0x36,0x44,0x31,0x35,0x34,0x3A,0x32,
129 0x37,0x3D,0x33,0x48,0x45,0x31,0x31,0x30,0x3A,0x31,0x39,0x31,0x37,0x32,0x35,0x35,0x3B,0x35,0x35,0x48,0x38,0x33,0x61,0x40,0x36,0x33,0x36,0x39,0x30,0x30,0x3C,0x36,
130 0x56,0x3D,0xE8,0x12,0xFF,0xFF,0xFF,0x3C,0x3D,0x33,0x45,0xE8,0x32,0x3D,0x3F,0x37,0x35,0x37,0xE8,0x7E,0x00,0x00,0x00,0x34,0x31,0x30,0x34,0x31,0x30,0x32,0x30,0x41,
131 0x35,0x31,0x44,0x3C,0x31,0x3A,0x4F,0x42,0x34,0x34,0x47,0x41,0x36,0x41,0x32,0x32,0x35,0x3A,0x41,0x37,0x32,0x43,0x31,0x38,0x40,0x3D,0x34,0x33,0x35,0x30,0x3F,0x35,
132 0x32,0x36,0x31,0x35,0x30,0x33,0x49,0x41,0x33,0x37,0x44,0x35,0x3B,0x3C,0x32,0x33,0x4D,0x33,0x32,0xE8,0xE9,0xFF,0xFF,0xFF,0x33,0x38,0x49,0x3F,0x3C,0x32,0x33,0x4D,
133 0x33,0x32,0x38,0x3D,0x31,0x55,0x33,0x37,0x3C,0x30,0x3B,0x35,0x3D,0x4F,0x42,0x4F,0x33,0x33,0x3A,0x4D,0x35,0x34,0xE8,0x62,0xFF,0xFF,0xFF,0x31,0x33,0x5E,0x33,0x52,
134 0x51,0x3E,0x31,0x41,0x34,0x40,0x44,0x3F,0x30,0x52,0x33,0x35,0x36,0x3D,0x3F,0x37,0x41,0x44,0x33,0x39,0x34,0x39,0x30,0x33,0x31,0x37,0x41,0x46,0x3C,0x3A,0xE8,0x30,
135 0x3C,0x3B,0x48,0x36,0x32,0x33,0x33,0x36,0x3A,0x42,0x43,0x43,0x30,0x37,0x35,0x30,0x4B,0x46,0x4B,0x3C,0x54,0x36,0x3F,0x32,0x31,0x3D,0x3B,0x34,0x30,0x3E,0x32,0x34,
136 0x4C,0x3F,0x30,0x41,0x32,0x43,0x30,0x36,0x33,0x41,0x36,0x35,0x31,0x30,0x47,0x38,0x31,0x35,0xE8,0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0x32,0x52,0x32,0x32,0x50,0x39,0x3D,
137 0x37,0x4E,0x33,0x34,0x30,0x4E,0x3A,0x49,0x35,0x37,0x37,0x33,0x44,0x36,0x32,0x3A,0x50,0x3A,0x32,0x34,0x36,0x3D,0x36,0x34,0x3C,0x4C,0x32,0x45,0x38,0x39,0x33,0x33,
138 0x35,0x33,0x32,0x33,0x3D,0x38,0x38,0x32,0x37,0x32,0x42,0x32,0x36,0x40,0x57,0x34,0x33,0x33,0x4F,0x4D,0x42,0x39,0x34,0x30,0x3A,0x31,0x33,0x45,0x48,0x46,0x35,0x42,
139 0x3D,0x38,0x3B,0x33,0x34,0x33,0x3F,0x38,0x37,0x4B,0x36,0x33,0x30,0x43,0x42,0x38,0x31,0x4B,0x40,0x4D,0x3F,0x56,0x41,0x33,0x41,0x36,0x3A,0x31,0x4F,0x36,0x44,0x33,
140 0x45,0x34,0x4B,0x37,0x46,0x34,0x36,0x3F,0x30,0x3B,0x36,0x39,0x36,0x3B,0x34,0xE8,0x4D,0xFF,0xFF,0xFF,0x39,0x34,0x3D,0x38,0x3D,0x34,0x31,0x31,0x37,0x33,0x30,0x32,
141 0x38,0x34,0x38,0x39,0x35,0x33,0x30,0x34,0x4B,0xE8,0x37,0xFF,0xFF,0xFF,0x33,0x32,0x3A,0x31,0x3B,0x36,0x3A,0x44,0x31,0x57,0x33,0x3E,0x3E,0x33,0x3C,0x32,0x33,0x4D,
142 0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x38,0x49,0x3F,0x47,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x4E,0x3F,0x3D,0x35,0x4D,0x32,0x31,0x51,
143 0x30,0x35,0x37,0x52,0x33,0x38,0x3A,0x39,0x3A,0x30,0x35,0x37,0x32,0x36,0x34,0x31,0x3A,0x32,0x31,0x38,0x38,0x3C,0x3C,0x3B,0x4F,0x4E,0x30,0x41,0x35,0x33,0x33,0x31,
144 0x30,0x40,0x38,0x46,0x3F,0x32,0x31,0x3E,0x45,0x33,0x33,0x3B,0x31,0x31,0x35,0x38,0x57,0x38,0x37,0x39,0x33,0x30,0x35,0x33,0x48,0x36,0x37,0x32,0x48,0x3B,0x47,0x3E };
146 static BYTE patch_two_files_ranges
[] = {
147 0x50,0x41,0x31,0x39,0x02,0x00,0xC4,0x00,0xC5,0xA5,0xBA,0x5C,0x7F,0x87,0xEC,0x96,0x45,0xA3,0x02,0xC1,0x0F,0x64,0x44,0xAC,0x14,0x1E,0x86,0x81,0x52,0x83,0x81,0x0E,
148 0x85,0x81,0x40,0x81,0x81,0x03,0x83,0x81,0x5F,0x88,0x81,0xF4,0x81,0x4C,0x81,0x81,0x16,0x84,0x81,0x7B,0x83,0x81,0x36,0x84,0x81,0x18,0x82,0x81,0x61,0x83,0x81,0x3D,
149 0x87,0x81,0x7C,0x8B,0x81,0x0C,0x81,0x81,0x02,0x89,0x81,0x63,0x83,0x81,0x5F,0x84,0x81,0x3D,0x86,0x81,0x14,0x14,0x83,0x80,0x81,0x34,0x84,0x80,0x81,0x13,0x81,0x80,
150 0x81,0x5A,0x88,0x80,0x81,0x39,0x81,0x80,0x81,0x22,0x81,0x80,0x81,0x09,0x81,0x80,0x81,0x5B,0x82,0x80,0x81,0x07,0x89,0x80,0x81,0x50,0x88,0x80,0x81,0x34,0x82,0x80,
151 0x81,0x60,0x84,0x80,0x81,0xE5,0x80,0x81,0x2A,0x86,0x80,0x81,0x00,0x81,0x80,0x81,0x12,0x83,0x80,0x81,0x4B,0x8C,0x80,0x81,0x05,0x82,0x80,0x81,0x6C,0x82,0x80,0x81,
152 0x01,0x82,0x80,0x81,0x80,0x06,0x81,0x81,0x64,0xB1,0x64,0x3C,0x14,0xA6,0x81,0x8C,0x81,0xA4,0x81,0xAB,0x81,0xAD,0x81,0xA3,0x81,0x83,0x81,0xA4,0x81,0xAE,0x81,0x96,
153 0x81,0xB0,0x81,0xA6,0x81,0xBE,0x81,0xB0,0x81,0x0F,0x81,0x81,0x85,0x81,0x83,0x81,0xA9,0x81,0xBB,0x81,0xB4,0x81,0x14,0x14,0x83,0x80,0x81,0x34,0x84,0x80,0x81,0x12,
154 0x81,0x81,0x81,0x58,0x88,0xC1,0x81,0x38,0x81,0x80,0x81,0x23,0x81,0xC1,0x81,0x08,0x81,0x80,0x81,0x5A,0x82,0xC1,0x81,0x05,0x89,0x81,0x81,0x4F,0x88,0x80,0x81,0x33,
155 0x82,0x81,0x81,0x60,0x84,0x81,0x81,0xE4,0x80,0x81,0x29,0x86,0x81,0x81,0x01,0x81,0x80,0x81,0x13,0x83,0xC1,0x81,0x4C,0x8C,0x80,0x81,0x06,0x82,0xC1,0x81,0x6D,0x82,
156 0x80,0x81,0x00,0x82,0x81,0x81,0x80,0x14,0x81,0x84,0x00,0x00,0x10,0xF1,0x3F,0x00,0x00,0x00,0x00,0x23,0x00,0x00,0x40,0x0E,0x04,0x4E,0xBF,0x18,0xD2,0x42,0x96,0xBF,
157 0xB1,0xFF,0xFF,0x95,0xFF,0x00,0x04,0x00,0x00,0x00,0x00,0x41,0x91,0x10,0x41,0x95,0x18,0x17,0xF4,0xE2,0xBB,0x33,0xE2,0x70,0x69,0x2D,0x54,0xA0,0xF5,0xFF,0xCE,0x10,
158 0x7C,0x00,0x00,0x00,0x00,0x32,0x00,0x04,0x50,0x18,0x50,0xD0,0x34,0x17,0xB8,0x05,0xAE,0x82,0xC0,0xE5,0x42,0xF0,0x5B,0xFF,0x6F,0x6F,0xEF,0x9D,0xFF,0x6A,0xF0,0x01,
159 0xE8,0xE5,0xD2,0x53,0x48,0x04,0x71,0xC0,0x86,0x1D,0x78,0x9E,0x71,0x3E,0x19,0xAC,0xDC,0x74,0x80,0x96,0x16,0xC1,0xE2,0xE3,0x14,0xA1,0xC3,0xAF,0x58,0xF8,0xDF,0x52,
160 0xAB,0xAD,0x5D,0xF5,0xB3,0x5E,0x9B,0x81,0x33,0x6C,0xE7,0x01,0x99,0x3E,0x33,0x92,0x00,0x00,0x10,0xF2,0x3F,0x00,0x00,0x00,0x00,0x22,0x05,0x00,0x05,0x0F,0x43,0x9E,
161 0xED,0x20,0xA2,0x51,0x44,0x88,0x4B,0xFE,0x5D,0xDB,0x63,0x63,0xFA,0x22,0x82,0x00,0x00,0x00,0x00,0x4A,0x00,0xC0,0xC0,0x0F,0x86,0xFE,0x42,0xFB,0x42,0x64,0x75,0x04,
162 0x2C,0x97,0xB8,0xE9,0x12,0x4B,0x5D,0x7C,0x7F,0x00,0x10,0x00,0x00,0x00,0x00,0x50,0x23,0x40,0x05,0x9A,0x29,0x98,0x36,0x08,0xBE,0x61,0xCF,0x15,0xA1,0x5D,0xF1,0xFF,
163 0xFE,0xF6,0x7F,0xEF,0xB8,0x0A,0x80,0x7F,0x25,0xBD,0x06,0x16,0x4F,0xF3,0x9A,0xEC,0xE3,0x22,0x76,0xC9,0xCE,0x64,0x48,0xDB,0xF9,0xC7,0x3B,0x95,0x91,0xDB,0xBA,0x7A,
164 0xF9,0xD4,0x0D,0x0A,0x0C,0x40,0x7C,0x56,0x1E,0x8A,0x4D,0x78,0x4D,0x47,0x3F,0x8F,0x0D,0xDB,0x67,0xEB,0x90,0x61,0x4D,0x1E,0x3B,0x79,0x88,0x9D,0xE8,0xB4,0x78,0x8F,
165 0xDC,0x00,0x80,0xCD,0xCA,0xAE,0x3C };
167 static BYTE patch_header_only
[] = {
168 0x50,0x41,0x31,0x39,0x02,0x00,0xC4,0x00,0xC5,0xA5,0xBA,0x5C,0x7F,0x87,0xEC,0x96,0x45,0xA3,0x02,0xC1,0x0F,0x64,0x44,0xAC,0x14,0x1E,0x86,0x81,0x52,0x83,0x81,0x0E,
169 0x85,0x81,0x40,0x81,0x81,0x03,0x83,0x81,0x5F,0x88,0x81,0xF4,0x81,0x4C,0x81,0x81,0x16,0x84,0x81,0x7B,0x83,0x81,0x36,0x84,0x81,0x18,0x82,0x81,0x61,0x83,0x81,0x3D,
170 0x87,0x81,0x7C,0x8B,0x81,0x0C,0x81,0x81,0x02,0x89,0x81,0x63,0x83,0x81,0x5F,0x84,0x81,0x3D,0x86,0x81,0x14,0x14,0x83,0x80,0x81,0x34,0x84,0x80,0x81,0x13,0x81,0x80,
171 0x81,0x5A,0x88,0x80,0x81,0x39,0x81,0x80,0x81,0x22,0x81,0x80,0x81,0x09,0x81,0x80,0x81,0x5B,0x82,0x80,0x81,0x07,0x89,0x80,0x81,0x50,0x88,0x80,0x81,0x34,0x82,0x80,
172 0x81,0x60,0x84,0x80,0x81,0xE5,0x80,0x81,0x2A,0x86,0x80,0x81,0x00,0x81,0x80,0x81,0x12,0x83,0x80,0x81,0x4B,0x8C,0x80,0x81,0x05,0x82,0x80,0x81,0x6C,0x82,0x80,0x81,
173 0x01,0x82,0x80,0x81,0x80,0x06,0x81,0x81,0x64,0xB1,0x64,0x3C,0x14,0xA6,0x81,0x8C,0x81,0xA4,0x81,0xAB,0x81,0xAD,0x81,0xA3,0x81,0x83,0x81,0xA4,0x81,0xAE,0x81,0x96,
174 0x81,0xB0,0x81,0xA6,0x81,0xBE,0x81,0xB0,0x81,0x0F,0x81,0x81,0x85,0x81,0x83,0x81,0xA9,0x81,0xBB,0x81,0xB4,0x81,0x14,0x14,0x83,0x80,0x81,0x34,0x84,0x80,0x81,0x12,
175 0x81,0x81,0x81,0x58,0x88,0xC1,0x81,0x38,0x81,0x80,0x81,0x23,0x81,0xC1,0x81,0x08,0x81,0x80,0x81,0x5A,0x82,0xC1,0x81,0x05,0x89,0x81,0x81,0x4F,0x88,0x80,0x81,0x33,
176 0x82,0x81,0x81,0x60,0x84,0x81,0x81,0xE4,0x80,0x81,0x29,0x86,0x81,0x81,0x01,0x81,0x80,0x81,0x13,0x83,0xC1,0x81,0x4C,0x8C,0x80,0x81,0x06,0x82,0xC1,0x81,0x6D,0x82,
177 0x80,0x81,0x00,0x82,0x81,0x81,0x80,0x14,0x81,0x83,0x6F,0xB5,0x1B };
179 static BYTE windows_output_0
[] = {
180 0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x38,0x49,0x3F,0x47,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x4E,0x3F,0x3D,0x35,
181 0x4D,0x32,0x31,0x51,0x30,0x35,0x37,0x52,0x33,0x38,0x3A,0x39,0x3A,0x30,0x35,0x37,0x32,0x36,0x34,0x31,0x3A,0x32,0x31,0x38,0x38,0x3C,0x3C,0x3B,0x4F,0x4E,0x30,0x41,
182 0x35,0x33,0x33,0x31,0x30,0x40,0x38,0x46,0x3F,0x32,0x31,0x3E,0x45,0x33,0x33,0x3B,0x31,0x31,0x35,0x38,0x57,0x38,0x37,0x39,0x33,0x30,0x35,0x33,0x48,0x36,0x37,0x32,
183 0x48,0x3B,0x47,0x3E,0x33,0x3E,0x30,0x37,0x31,0x35,0x3F,0x4B,0x47,0x39,0x35,0x53,0x32,0x34,0x30,0x37,0x30,0x48,0x30,0x34,0x53,0x36,0x33,0x31,0x31,0x34,0x40,0x35,
184 0x37,0x30,0x69,0x4A,0x3F,0x32,0x32,0x30,0x3A,0x39,0x40,0x54,0x31,0x32,0x30,0x3C,0x39,0xE8,0x30,0x34,0x32,0x39,0x4D,0x35,0x45,0x32,0x34,0x30,0x35,0x32,0x33,0x41,
185 0x33,0x30,0x64,0x30,0x46,0x3E,0x32,0x32,0x39,0x33,0x33,0x62,0x34,0x3D,0x38,0x3A,0x39,0x32,0x32,0x34,0x38,0x50,0x39,0x39,0x44,0x36,0x45,0x38,0x40,0x47,0x3F,0x4B,
186 0x3D,0x38,0x33,0x30,0x35,0x33,0x35,0x46,0x31,0x5B,0x4B,0x40,0x49,0x3F,0x3F,0x4B,0x3D,0x38,0x33,0x3D,0x70,0x34,0x42,0x32,0x61,0x36,0x4D,0x36,0x3F,0x30,0x35,0x36,
187 0x37,0x30,0x31,0x31,0x34,0x36,0x3C,0x32,0x3E,0x33,0x34,0x38,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x33,0x30,0x34,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,
188 0x33,0x4E,0x40,0x5B,0x33,0x38,0x49,0x3F,0x47,0x3C,0x32,0x40,0x38,0x4A,0x39,0x33,0x42,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0xE8,0xAA,0x01,0x00,0x00,0x49,0x3F,
189 0x47,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0xE8,0x8C,0x01,0x00,0x00,0x32,0x31,0x51,0x30,0x35,0x37,0x52,0x33,0x38,0x3A,0x39,0x3A,0x30,0x35,
190 0x37,0x32,0x36,0x34,0x31,0x3A,0x32,0x31,0x38,0x38,0x3C,0x3C,0x3B,0x4F,0x4E,0x30,0x41,0x35,0x33,0x33,0x31,0x30,0x40,0x38,0x46,0x3F,0x32,0x31,0x3E,0x45,0x33,0x33,
191 0x3B,0x31,0x31,0x35,0x38,0x57,0x38,0x37,0x39,0x33,0x30,0x33,0x33,0x48,0x36,0x37,0x32,0x48,0x3B,0x47,0x3E,0x33,0x3E,0x30,0x37,0x31,0x35,0x3F,0x4B,0x47,0x39,0x35,
192 0x53,0x32,0x34,0x30,0x37,0x30,0x48,0x30,0x34,0x53,0x36,0x4F,0x31,0x38,0x32,0x52,0x44,0x37,0x3D,0x4C,0x33,0x38,0x36,0x57,0x30,0x35,0x3C,0x32,0x33,0xE8,0x98,0xFE,
193 0xFF,0xFF,0x4D,0x31,0x31,0x33,0x32,0x36,0x32,0x32,0x31,0x39,0x35,0x5B,0x31,0x38,0x30,0x35,0x3C,0x3C,0x34,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x33,
194 0x33,0x38,0xE8,0x28,0x01,0x00,0x00,0x31,0x32,0x34,0x38,0x49,0x31,0x40,0x31,0x41,0x31,0x3F,0x36,0x30,0x3E,0x3B,0x36,0x3A,0x45,0x32,0x50,0x3C,0x45,0x3D,0x31,0x31,
195 0x3C,0x3A,0x3A,0x46,0x4A,0x3F,0x36,0x33,0x43,0x3C,0x3D,0x32,0x37,0x36,0x3B,0x3E,0x36,0x40,0x32,0x39,0x51,0x31,0x33,0x32,0x36,0x44,0x31,0x35,0x34,0x3A,0x32,0x37,
196 0x3D,0x33,0x48,0x45,0x31,0x31,0x30,0x3A,0x31,0x31,0x31,0x37,0x32,0x35,0x35,0x3B,0x35,0x35,0x48,0x38,0x33,0x61,0x40,0x36,0x33,0x36,0x39,0x30,0x30,0x3C,0x36,0x56,
197 0x3D,0xE8,0x12,0xFF,0xFF,0xFF,0x3C,0x33,0x33,0x45,0xE8,0x32,0x3D,0x3F,0x37,0x35,0x37,0xE8,0x7E,0x00,0x00,0x00,0x34,0x31,0x30,0x34,0x31,0x30,0x32,0x30,0x41,0x35,
198 0x31,0x44,0x3C,0x31,0x3A,0x4F,0x42,0x34,0x34,0x47,0x41,0x36,0x41,0x32,0x32,0x35,0x3A,0x41,0x37,0x32,0x43,0x31,0x38,0x40,0x3D,0x34,0x33,0x35,0x30,0x35,0x35,0x32,
199 0x36,0x31,0x35,0x30,0x33,0x49,0x41,0x33,0x44,0x44,0x35,0x3B,0x3C,0x32,0x33,0x4D,0x33,0x32,0xE8,0xE9,0xFF,0xFF,0xFF,0x33,0x38,0x49,0x3F,0x3C,0x32,0x33,0x4D,0x33,
200 0x32,0x38,0x3D,0x31,0x55,0x33,0x37,0x3C,0x30,0x3B,0x35,0x3D,0x4F,0x42,0x4F,0x33,0x33,0x3A,0x4D,0x35,0x34,0xE8,0x62,0xFF,0xFF,0xFF,0x31,0x33,0x5E,0x33,0x52,0x51,
201 0x3E,0x31,0x41,0x34,0x40,0x44,0x3F,0x30,0x52,0x33,0x35,0x36,0x3D,0x3F,0x37,0x41,0x44,0x33,0x39,0x34,0x39,0x30,0x33,0x31,0x37,0x41,0x46,0x3C,0x3A,0xE8,0x30,0x3C,
202 0x3B,0x48,0x36,0x32,0x33,0x33,0x36,0x3A,0x42,0x43,0x43,0x30,0x37,0x35,0x30,0x4B,0x46,0x4B,0x3C,0x54,0x36,0x3F,0x32,0x31,0x3D,0x3B,0x34,0x30,0x3E,0x32,0x34,0x4C,
203 0x3F,0x30,0x41,0x32,0x43,0x30,0x36,0x33,0x41,0x36,0x35,0x31,0x30,0x47,0x38,0x31,0x35,0xE8,0x89,0xFF,0xFF,0xFF,0xFF,0xFF,0x32,0x52,0x32,0x32,0x50,0x39,0x3D,0x37,
204 0x4E,0x33,0x34,0x30,0x4E,0x3A,0x49,0x35,0x37,0x37,0x33,0x44,0x36,0x32,0x3A,0x50,0x3A,0x32,0x34,0x36,0x3D,0x36,0x34,0x3C,0x4C,0x45,0x45,0x38,0x39,0x33,0x33,0x35,
205 0x33,0x32,0x33,0x3D,0x38,0x38,0x32,0x37,0x32,0x42,0x32,0x36,0x40,0x57,0x34,0x33,0x33,0x4F,0x4D,0x42,0x39,0x34,0x30,0x3A,0x31,0x33,0x45,0x46,0x46,0x35,0x42,0x3D,
206 0x38,0x3B,0x33,0x34,0x33,0x3F,0x38,0x37,0x4B,0x36,0x33,0x30,0x43,0x42,0x38,0x31,0x4B,0x40,0x4D,0x3F,0x56,0x41,0x33,0x41,0x36,0x3A,0x31,0x4F,0x36,0x44,0x33,0x45,
207 0x34,0x4B,0x37,0x46,0x34,0x36,0x3F,0x30,0x3B,0x36,0x39,0x36,0x3B,0x34,0xE8,0x4D,0xFF,0xFF,0xFF,0x39,0x34,0x3D,0x38,0x3D,0x34,0x31,0x31,0x37,0x33,0x30,0x32,0x38,
208 0x34,0x38,0x39,0x35,0x33,0x30,0x34,0x4B,0xE8,0x37,0xFF,0xFF,0xFF,0x33,0x32,0x3A,0x31,0x3B,0x36,0x3A,0x44,0x31,0x57,0x33,0x3E,0x3E,0x33,0x3C,0x32,0x33,0x4D,0x33,
209 0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x38,0x49,0x3F,0x47,0x3C,0x32,0x33,0x4D,0x33,0x32,0x44,0x33,0x4E,0x40,0x5B,0x33,0x4E,0x3F,0x3D,0x35,0x4D,0x32,0x31,0x51,0x30,
210 0x35,0x37,0x52,0x33,0x38,0x3A,0x39,0x3A,0x30,0x35,0x37,0x32,0x36,0x34,0x31,0x3A,0x32,0x31,0x38,0x38,0x3C,0x3C,0x3B,0x4F,0x4E,0x30,0x41,0x35,0x33,0x33,0x31,0x30,
211 0x40,0x38,0x46,0x3F,0x32,0x31,0x3E,0x45,0x33,0x33,0x3B,0x31,0x31,0x35,0x38,0x57,0x38,0x37,0x39,0x33,0x30,0x35,0x33,0x48,0x36,0x37,0x32,0x48,0x3B,0x47,0x3E };
213 #define BLOCKTYPE2_NO_TIMESTAMP_SIZE 1024
215 static BYTE old_blocktype2_no_timestamp
[] = {
216 0x0E,0x52,0xCE,0x03,0xD9,0xFC,0xA7,0x06,0xF4,0x1D,0xC5,0x05,0x14,0x54,0xFD,0x06,0xA1,0xC2,0xDE,0x07,0x14,0x54,0xFD,0x06,0xB0,0xAC,0x7A,0x00,0x0E,0x52,0xCE,0x03,
217 0x0E,0x52,0xCE,0x03,0x82,0x7E,0xBA,0x04,0xE5,0x00,0x7B,0x00,0x0E,0x52,0xCE,0x03,0x0E,0x52,0xCE,0x03,0x0E,0x52,0xCE,0x03,0x0E,0x52,0xCE,0x03,0xAF,0x95,0x59,0x00,
218 0x0A,0x28,0x93,0x06,0x0E,0x52,0xCE,0x03,0x46,0x94,0x38,0x03,0xAD,0xBD,0xCC,0x03,0x97,0xB3,0xAD,0x02,0x0E,0x52,0xCE,0x03,0x56,0xD1,0x32,0x00,0xD6,0xDC,0xA3,0x04,
219 0x05,0x9C,0xBE,0x05,0x88,0x25,0x30,0x01,0x63,0x74,0x09,0x01,0x75,0x27,0xD0,0x07,0x80,0x03,0x3F,0x01,0xF9,0xD4,0x98,0x06,0x14,0x1A,0x6E,0x06,0x0E,0x52,0xCE,0x03,
220 0x0E,0x52,0xCE,0x03,0xE3,0x9C,0x04,0x02,0xC6,0x36,0x2C,0x01,0x0E,0x52,0xCE,0x03,0xA5,0x44,0xC0,0x03,0x0F,0xD2,0x8F,0x01,0x21,0x39,0x89,0x02,0x4A,0xFB,0x56,0x01,
221 0xF7,0x34,0x60,0x03,0xB2,0x08,0x7A,0x03,0x16,0x0A,0x07,0x07,0xB5,0xD5,0xC5,0x02,0x01,0x5A,0x3F,0x06,0x0E,0x52,0xCE,0x03,0xF7,0x0A,0xEC,0x06,0x07,0x5A,0xC5,0x01,
222 0x14,0x54,0xFD,0x06,0x79,0x63,0x08,0x03,0x74,0x8A,0xE0,0x04,0x1C,0x0E,0x41,0x02,0x84,0xCE,0xA9,0x07,0x8B,0x5A,0x9E,0x02,0x87,0xB6,0xDB,0x07,0xD0,0xBF,0x77,0x04,
223 0xD3,0xB6,0x15,0x01,0xA5,0x44,0xC0,0x03,0xEE,0xBC,0x96,0x05,0x1A,0x99,0xA1,0x07,0x05,0x9C,0xBE,0x05,0x18,0x36,0xEF,0x03,0xD5,0x29,0x71,0x01,0x89,0xDC,0xD3,0x01,
224 0x26,0xFB,0x79,0x06,0x75,0xCB,0x98,0x03,0x84,0xC7,0x4F,0x03,0x06,0x02,0x65,0x03,0x94,0xCA,0x63,0x03,0x35,0x52,0x88,0x07,0xC6,0xCC,0xFC,0x02,0xA2,0x8E,0xB1,0x01,
225 0x9B,0xDB,0x34,0x06,0xB4,0x2D,0x3C,0x07,0x20,0xBF,0x0E,0x05,0x84,0xC7,0x4F,0x03,0xFA,0x91,0x5B,0x03,0xAD,0xBD,0xCC,0x03,0xC8,0xA3,0xAE,0x01,0x8F,0x99,0x0B,0x01,
226 0x48,0xA8,0xF2,0x03,0xDC,0x54,0xFC,0x07,0xDA,0xAB,0x04,0x02,0x46,0x80,0x24,0x06,0x8F,0x4E,0x16,0x05,0xB9,0xA9,0x30,0x01,0x74,0x72,0xA1,0x05,0x34,0x67,0x4C,0x01,
227 0xB1,0x56,0xA4,0x00,0x0A,0x28,0x93,0x06,0x31,0xCA,0x54,0x04,0x14,0x54,0xFD,0x06,0x5A,0xCA,0x57,0x03,0x85,0x6C,0x93,0x04,0x97,0xC3,0x42,0x06,0x0A,0x28,0x93,0x06,
228 0x21,0x39,0x89,0x02,0x89,0x5E,0xFB,0x06,0xFD,0x6D,0x46,0x00,0x54,0x23,0x25,0x05,0x0E,0x52,0xCE,0x03,0x5A,0xDB,0xFA,0x01,0x0E,0x52,0xCE,0x03,0x81,0xE4,0x1E,0x01,
229 0x9B,0x21,0x30,0x04,0x09,0x53,0xAC,0x05,0xF1,0xA9,0x2D,0x07,0xDD,0x4D,0x30,0x06,0xFF,0x38,0xBD,0x02,0xAD,0xAA,0xDB,0x03,0xEC,0xAE,0x4E,0x01,0x40,0x19,0x44,0x02,
230 0x35,0x52,0x88,0x07,0x4A,0x85,0xEF,0x02,0x80,0x03,0x3F,0x01,0xDB,0x5A,0x88,0x07,0x36,0x77,0x4F,0x07,0x9B,0x21,0x30,0x04,0x1D,0x52,0x4F,0x02,0xA5,0x97,0xFB,0x00,
231 0x2F,0xC8,0x67,0x01,0x32,0x96,0xB0,0x06,0x35,0x52,0x88,0x07,0x4E,0x46,0x30,0x06,0xE9,0x98,0x28,0x05,0xF8,0x0D,0xD9,0x01,0x0E,0x52,0xCE,0x03,0x6F,0x7C,0x24,0x07,
232 0x1A,0x99,0xA1,0x07,0x11,0x2D,0x22,0x04,0x15,0xA4,0xB7,0x05,0x77,0xD9,0xA0,0x06,0xB8,0x56,0x63,0x02,0xD8,0xB3,0xE2,0x05,0x9F,0xE5,0x87,0x02,0x2D,0x97,0x69,0x03,
233 0xE9,0x98,0x28,0x05,0xDC,0x08,0xA4,0x02,0x0A,0x28,0x93,0x06,0x5F,0xF4,0x6C,0x03,0xC4,0xC3,0xBC,0x01,0xA5,0x44,0xC0,0x03,0xA1,0x0C,0xFE,0x05,0x3C,0x05,0x75,0x07,
234 0x76,0x91,0xA1,0x06,0x42,0x63,0x1F,0x04,0x36,0xCE,0x65,0x04,0xB0,0x0A,0x67,0x02,0xB2,0x5D,0xE4,0x02,0x87,0x78,0x84,0x06,0xFD,0xF4,0x8D,0x05,0x6E,0x25,0xA3,0x06,
235 0xD8,0xE0,0x0C,0x01,0x12,0x7F,0xAD,0x04,0xD8,0x18,0x1C,0x02,0xFD,0xC6,0x99,0x01,0x41,0xCC,0x03,0x07,0xAF,0xBC,0xCB,0x03,0x8C,0x2E,0xF9,0x07,0x0A,0x28,0x93,0x06,
236 0xCB,0xA6,0xAC,0x01,0x87,0x78,0x84,0x06,0x88,0x6C,0x61,0x02,0xA8,0x31,0x66,0x03,0x05,0xFD,0xD0,0x07,0x14,0x54,0xFD,0x06,0x70,0x1D,0x18,0x06,0x87,0x78,0x84,0x06,
237 0x0E,0x52,0xCE,0x03,0x2A,0x24,0xF0,0x02,0x18,0xDB,0x54,0x04,0x8F,0xCF,0x4B,0x03,0xD1,0x44,0xCA,0x02,0x2E,0xEB,0x35,0x07,0xCF,0xBA,0xA5,0x01,0x70,0x6D,0x49,0x01,
238 0x4D,0x1B,0xA7,0x01,0x96,0x88,0x0C,0x06,0x20,0x75,0x29,0x00,0x98,0xB9,0x56,0x04,0x5C,0x45,0x03,0x00,0x07,0xE5,0xAC,0x00,0x09,0x12,0x6A,0x02,0x9E,0xFB,0xC2,0x02,
239 0x43,0x70,0x56,0x02,0xDA,0x0C,0x6E,0x04,0x1F,0xD4,0xBB,0x05,0x98,0xB6,0xC2,0x03,0x71,0x8B,0x0C,0x04,0x23,0x99,0x84,0x06,0x07,0xAE,0xC5,0x04,0x04,0xE5,0x61,0x00,
240 0xDE,0xE5,0xC1,0x02,0x6F,0x79,0x37,0x01,0xA8,0xA6,0x74,0x07,0xF9,0xCD,0xD7,0x03,0x6E,0x39,0xFE,0x02,0x87,0x78,0x80,0x03,0x14,0xA8,0x7C,0x05,0xEC,0x42,0xB0,0x03,
241 0x9F,0xE5,0x87,0x02,0xA5,0x44,0xC0,0x03,0xD8,0x41,0x5C,0x06,0xAB,0x8E,0xD2,0x05,0xA7,0x33,0x9A,0x01,0x62,0x03,0x5C,0x07,0xD5,0x27,0x82,0x07,0xEF,0x85,0xD2,0x03,
242 0xA5,0x84,0x92,0x05,0x8D,0x30,0xE3,0x03,0x8A,0xC2,0x51,0x04,0x57,0x8C,0x27,0x01,0xF9,0xD4,0x98,0x06,0x62,0xB1,0xAB,0x06,0x27,0x5F,0x4B,0x00,0xBB,0xD0,0x92,0x04,
243 0x5F,0x4B,0x14,0x06,0x8D,0x03,0x68,0x06,0x4C,0x5F,0x17,0x00,0x2D,0x57,0xF5,0x00,0x03,0xF9,0xE9,0x05,0x0E,0x52,0xCE,0x03,0xC2,0xC3,0x24,0x06,0x86,0x4A,0x94,0x01,
244 0x00,0xE2,0xE0,0x01,0x27,0x30,0xBE,0x00,0x3A,0xA8,0xC6,0x00,0xEF,0x85,0xD2,0x03,0x31,0x58,0x7E,0x01,0xB1,0x03,0x02,0x04,0x0E,0x52,0xCE,0x03,0xE5,0xA7,0x59,0x01,
245 0x56,0xB7,0x19,0x01,0x87,0x78,0x84,0x06,0x06,0x7A,0x52,0x02,0x85,0x6C,0x93,0x04,0x87,0xDB,0x40,0x04,0x1A,0xCF,0xBF,0x06,0xAB,0x8E,0xD2,0x05,0xD0,0x9F,0xD3,0x03,
246 0xC8,0xC7,0xF8,0x01,0x2F,0x13,0x04,0x06,0xE9,0x98,0x28,0x05,0x1E,0x06,0x61,0x07,0x9F,0xE5,0x87,0x02,0x17,0x0D,0xDB,0x03,0xFA,0x91,0x5B,0x03,0x36,0xA6,0xA5,0x03,
247 0x9B,0x1A,0xC2,0x03,0x8B,0xD9,0x3F,0x04,0x7F,0x5B,0x6C,0x01,0xAA,0x08,0x58,0x04,0xF3,0x03,0x33,0x02,0xD5,0x29,0x71,0x01,0x37,0x32,0x48,0x3B,0x47,0x3E,0x3E,0xCC };
249 static BYTE patch_blocktype2_no_timestamp
[] = {
250 0x50,0x41,0x31,0x39,0x01,0x00,0x44,0x00,0x00,0x88,0xEA,0x93,0x4F,0x32,0x01,0x80,0x40,0xBF,0x4B,0x5E,0x00,0x00,0x80,0x00,0x84,0xFE,0x01,0x00,0x20,0x00,0x40,0x00,
251 0x08,0x00,0x81,0x00,0x00,0x24,0x03,0x00,0x66,0x50,0x00,0xEF,0x0B,0xFB,0xFE,0xFB,0xEE,0x11,0x71,0x65,0x4E,0xE6,0xD8,0x87,0x0A,0x24,0x25,0xCC,0xE6,0xED,0x36,0x37,
252 0x38,0x5A,0x78,0xAF,0x4B,0xF0,0x12,0x25,0xA1,0x4A,0xE1,0x45,0x9C,0x1A,0x5D,0xC0,0xAB,0x16,0xDE,0xB4,0x35,0x8E,0xCB,0xC8,0xDB,0x78,0xDB,0xCA,0x5B,0x5D,0x85,0xAA,
253 0xD4,0x28,0x45,0x90,0x8A,0xAA,0x50,0x21,0x57,0x00,0x00,0x03,0x00,0x46,0x43,0x00,0x60,0x02,0x45,0x4C,0x99,0x65,0xDC,0xD0,0xA7,0xCD,0xB7,0xC2,0x4B,0x4B,0xBC,0x8D,
254 0xC0,0x2B,0x9C,0xB3,0xC4,0xBC,0x85,0xC0,0x4D,0xC4,0x8B,0x20,0xDD,0x14,0xDE,0x85,0xB0,0x19,0xFF,0x34,0xF5,0x27,0x5A,0xEE,0xBF,0x00,0x04,0x00,0x00,0x00,0x00,0x0C,
255 0x01,0x08,0x10,0xFC,0x38,0xC7,0x60,0xBF,0x5F,0xFC,0x7E,0xF0,0x84,0xF4,0x09,0x4A,0xF2,0x26,0x9D,0x1F,0x1A,0x1D,0xC7,0x7A,0x53,0x32,0x6C,0x40,0xAF,0xB1,0x1A,0xED,
256 0x3F,0xD0,0x13,0xB7,0xF3,0xDB,0xB9,0x5C,0xA4,0xF3,0x44,0xE7,0x66,0x44,0x98,0x9E,0xF4,0xBC,0x13,0x7C,0xBD,0xE0,0x42,0x53,0x87,0x74,0x2D,0x00,0xDB,0xDF,0xEA,0xE9,
257 0x46,0xE8,0xC1,0x1D,0x78,0x92,0xCA,0xFB,0x2F,0x82,0xD8,0x66,0x48,0x39,0xF3,0x66,0xC7,0xBC,0xEA,0xD8,0x67,0xDB,0x77,0x4A,0xAE,0x0C,0x47,0x21,0x1B,0xE8,0x44,0x28,
258 0xEB,0x5E,0xA4,0x0E,0xC7,0x83,0x28,0xFB,0x8A,0x03,0x0D,0x27,0x53,0x15,0xEE,0xC6,0x94,0xB5,0x46,0xE3,0x58,0xFE,0x26,0x09,0xCF,0x75,0xD8,0x3A,0x1E,0x79,0x47,0xA3,
259 0x91,0xB2,0xD7,0x36,0xB6,0x97,0x07,0xC0,0xE0,0x03,0xB8,0x49,0x0E,0x4D,0xC3,0x33,0xBA,0xBE,0x5C,0xEB,0xC7,0xEC,0xCD,0x69,0x9F,0xB8,0x41,0x8A,0x78,0x26,0x85,0x8A,
260 0x90,0xBF,0xB8,0x46,0x2D,0x3C,0x72,0x34,0xDC,0x6D,0x33,0x68,0x55,0x13,0x67,0x32,0x1C,0xD2,0x90,0x7C,0xA4,0x54,0xD2,0x14,0x8A,0x58,0xB8,0xCF,0x1F,0xF8,0x5A,0x38,
261 0xC8,0xD6,0xD5,0x20,0x34,0xEE,0x43,0xEC,0x5F,0x24,0xD1,0x1F,0x71,0xB3,0x72,0x0F,0x2E,0x22,0xD3,0xEE,0x9C,0x95,0x7E,0x2C,0x81,0x60,0x05,0x9F,0x13,0xA0,0x84,0xF0,
262 0xE4,0x00,0x2B,0x84,0x96,0x3D,0xF8,0x60,0xF0,0xAE,0xE8,0x3A,0x81,0xEB,0xF9,0x7E,0xB7,0x8F,0x2A,0x88,0x7F,0xBA,0x43,0xE0,0xD2,0x6F,0x17,0xFD,0xE7,0x9E,0x6C,0x94,
263 0xF2,0x63,0x3F,0xA2,0xAD,0xE7,0x9E,0x12,0xB5,0xF3,0x2D,0x53,0x4A,0x09,0x65,0x2C,0x84,0x4F,0x0E,0xA6,0x0E,0xE8,0xC3,0x2B,0x01,0x4E,0x28,0xF9,0xDB,0x89,0x8E,0xE7,
264 0x17,0x58,0x81,0xDF,0x04,0x05,0xD4,0x8A,0xEB,0xC7,0xB2,0xE3,0xF1,0x8A,0xF0,0x16,0x06,0xA8,0x48,0x03,0x96,0x3F,0xD4,0xE4,0xCF,0x61,0xC8,0x81,0x43,0xE9,0x7F,0xA9,
265 0x7C,0xCA,0xCA,0xEE,0x67,0xAB,0x50,0x3C,0xAF,0xFF,0xE2,0x85,0x29,0xE4,0xA9,0x21,0x31,0xC7,0xCD,0xFE,0xCE,0xA9,0xB8,0xB7,0xBB,0xCD,0x6B,0xFF,0x16,0x64,0xDD,0xD4,
266 0xBA,0x56,0xEC,0x93,0xBE,0xDF,0x92,0xBF,0xE6,0xD4,0x83,0xF5,0xC7,0x7A,0x98,0x33,0x7E,0x77,0x1E,0x18,0x1C,0x47,0x03,0x40,0x4B,0x36,0x5E,0xC3,0x06 };
268 #define NULL_INPUT_UNCOMPRESSED_SIZE 65
270 static BYTE patch_null_input_uncompressed
[] = {
271 0x50,0x41,0x31,0x39,0x01,0x00,0xC4,0x00,0xC5,0xA5,0xBA,0x5C,0xC1,0x48,0x7F,0x15,0x2D,0x01,0x41,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xD4,0x52,0x00,0x00,0x30,
272 0x10,0x04,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xF0,0x9B,0x50,0x8E,0xD9,0x89,0x50,0x0D,0x9C,0xD6,0x8A,0xF9,0x6E,0xB9,0xEF,0xEE,0x0F,0x9C,
273 0xA6,0xE1,0x16,0x54,0x80,0x55,0x8B,0x97,0x65,0x8D,0x02,0xA1,0x85,0xEA,0x51,0x08,0xD6,0xE6,0x0B,0x19,0x01,0xF5,0x7F,0x9D,0x63,0x71,0x58,0x28,0x33,0x70,0xA8,0x93,
274 0xF8,0x62,0x5E,0x56,0x11,0x47,0x60,0x22,0x9E,0x76,0x26,0x8C,0xFC,0x41,0x97,0x00,0x0E,0x73,0xBF,0xE4 };
276 #define UNNECESSARY_SIZE 65
278 static BYTE old_unnecessary
[] = {
279 0xF0,0x9B,0x50,0x8E,0xD9,0x89,0x50,0x0D,0x9C,0xD6,0x8A,0xF9,0x6E,0xB9,0xEF,0xEE,0x0F,0x9C,0xA6,0xE1,0x16,0x54,0x80,0x55,0x8B,0x97,0x65,0x8D,0x02,0xA1,0x85,0xEA,
280 0x51,0x08,0xD6,0xE6,0x0B,0x19,0x01,0xF5,0x7F,0x9D,0x63,0x71,0x58,0x28,0x33,0x70,0xA8,0x93,0xF8,0x62,0x5E,0x56,0x11,0x47,0x60,0x22,0x9E,0x76,0x26,0x8C,0xFC,0x41,
283 static BYTE patch_unnecessary
[] = {
284 0x50,0x41,0x31,0x39,0x01,0x00,0xC4,0x00,0xC5,0xA5,0xBA,0x5C,0xC1,0x48,0x7F,0x15,0x2D,0x01,0x80,0x48,0x7F,0x15,0x2D,0x00,0x00,0x80,0x80,0x90,0x68,0xE9,0x14 };
293 static char old_two_files_ranges_0_tmp
[MAX_PATH
];
294 static char patch_two_files_ranges_tmp
[MAX_PATH
];
295 static char patch_header_only_tmp
[MAX_PATH
];
296 static char old_blocktype2_no_timestamp_tmp
[MAX_PATH
];
297 static char patch_null_input_uncompressed_tmp
[MAX_PATH
];
299 static char output_file_temp
[MAX_PATH
];
301 static struct file_def test_files
[] = {
302 {old_two_files_ranges_0
, sizeof(old_two_files_ranges_0
), old_two_files_ranges_0_tmp
},
303 {patch_two_files_ranges
, sizeof(patch_two_files_ranges
), patch_two_files_ranges_tmp
},
304 {patch_header_only
, sizeof(patch_header_only
), patch_header_only_tmp
},
305 {old_blocktype2_no_timestamp
, sizeof(old_blocktype2_no_timestamp
), old_blocktype2_no_timestamp_tmp
},
306 {patch_null_input_uncompressed
, sizeof(patch_null_input_uncompressed
), patch_null_input_uncompressed_tmp
},
310 static BOOL CALLBACK
progress(void *context
, ULONG current
, ULONG max
)
312 *(ULONG
*)context
= current
* 100 / (max
+ !max
);
316 static BOOL CALLBACK
progress_cancel(void *context
, ULONG current
, ULONG max
)
318 *(ULONG
*)context
= current
* 100 / (max
+ !max
);
322 static BOOL
create_temp_file(const BYTE
*buf
, size_t size
, const char *temppath
, char *tempname
)
328 GetTempFileNameA(temppath
, "pat", 0, tempname
);
329 hndl
= CreateFileA(tempname
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, 0, NULL
);
330 if (hndl
== INVALID_HANDLE_VALUE
)
332 b
= WriteFile(hndl
, buf
, size
, &written
, NULL
);
334 return b
&& written
== size
;
337 static void delete_test_files(void)
340 for (i
= 0; test_files
[i
].buf
!= NULL
; ++i
)
341 DeleteFileA(test_files
[i
].name
);
344 static BOOL
setup_test_files(void)
346 char temppath
[MAX_PATH
];
348 GetTempPathA(MAX_PATH
, temppath
);
349 for (i
= 0; test_files
[i
].buf
!= NULL
; ++i
) {
350 if (!create_temp_file(test_files
[i
].buf
, test_files
[i
].size
, temppath
, test_files
[i
].name
))
352 skip("Failed to create/write temporary test files\n");
357 GetTempFileNameA(temppath
, "pat", 0, output_file_temp
);
361 static void compare_file(const char *name
, const BYTE
*buf
, size_t size
)
364 HANDLE hndl
= CreateFileA(name
, GENERIC_READ
, 0, NULL
, OPEN_EXISTING
, 0, NULL
);
365 ok(hndl
!= INVALID_HANDLE_VALUE
, "Expected test result file opened, got INVALID_HANDLE_VALUE\n");
366 if (hndl
!= INVALID_HANDLE_VALUE
)
369 for (i
= 0; i
< size
; ++i
)
373 BOOL b
= ReadFile(hndl
, &c
, 1, &nread
, NULL
);
374 ok(b
, "Unexpected end of file during comparison\n");
377 ok(c
== buf
[i
], "Character mismatch at offset %u: 0x%02X vs 0x%02X\n", (int)i
, c
, buf
[i
]);
381 fpos
= SetFilePointer(hndl
, 0, NULL
, FILE_END
);
382 ok(fpos
== size
, "Output size larger than expected\n");
387 static BOOL
file_closed(const char *name
)
389 /* This will test for handle closure on Windows and any other system with sharing restrictions */
390 HANDLE hndl
= CreateFileA(name
, GENERIC_READ
, 0, NULL
, OPEN_EXISTING
, 0, NULL
);
391 if (hndl
!= INVALID_HANDLE_VALUE
)
399 static void test_ApplyPatchToFile(void)
404 /* XP fails with ERROR_PATH_NOT_FOUND */
405 if (win_version
< 0x600)
407 skip("NULL parameter not supported in XP\n");
412 SetLastError(0xdeadbeef);
413 ok(pApplyPatchToFileA(patch_null_input_uncompressed_tmp
, NULL
, output_file_temp
, APPLY_OPTION_FAIL_IF_EXACT
),
414 "ApplyPatchToFileA: expected TRUE\n");
415 err
= GetLastError();
416 ok(err
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got 0x%X\n", err
);
419 /* dual input patch - first file */
420 SetLastError(0xdeadbeef);
421 ok(pApplyPatchToFileA(patch_two_files_ranges_tmp
, old_two_files_ranges_0_tmp
, output_file_temp
, APPLY_OPTION_FAIL_IF_EXACT
),
422 "ApplyPatchToFileA: expected TRUE\n");
423 err
= GetLastError();
424 ok(err
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got 0x%X\n", err
);
425 /* ensure that ranges were applied properly by comparing with the result from Windows */
426 compare_file(output_file_temp
, windows_output_0
, sizeof(windows_output_0
));
427 /* handles were closed */
428 ok(file_closed(patch_two_files_ranges_tmp
), "File handle was not closed: %s\n", patch_two_files_ranges_tmp
);
429 ok(file_closed(old_two_files_ranges_0_tmp
), "File handle was not closed: %s\n", old_two_files_ranges_0_tmp
);
430 ok(file_closed(output_file_temp
), "File handle was not closed: %s\n", output_file_temp
);
432 /* old file passed where none required */
433 DeleteFileA(output_file_temp
);
434 SetLastError(0xdeadbeef);
435 ok(!pApplyPatchToFileA(patch_null_input_uncompressed_tmp
, old_two_files_ranges_0_tmp
, output_file_temp
, 0),
436 "ApplyPatchToFileA: expected FALSE\n");
437 err
= GetLastError();
438 /* error code is unstable across Windows versions and architectures (bug) */
439 ok(err
== ERROR_PATCH_WRONG_FILE
|| err
== ERROR_SUCCESS
,
440 "Expected ERROR_SUCCESS or ERROR_PATCH_WRONG_FILE, got 0x%X\n", err
);
441 /* output deleted on failure */
442 ok(GetFileAttributesA(output_file_temp
) == INVALID_FILE_ATTRIBUTES
, "Output file should not exist\n");
443 /* handles were closed */
444 ok(file_closed(patch_null_input_uncompressed_tmp
), "File handle was not closed: %s\n", patch_null_input_uncompressed_tmp
);
445 ok(file_closed(old_two_files_ranges_0_tmp
), "File handle was not closed: %s\n", old_two_files_ranges_0_tmp
);
447 /* wrong old file for patch */
448 DeleteFileA(output_file_temp
);
449 SetLastError(0xdeadbeef);
450 ok(!pApplyPatchToFileA(patch_two_files_ranges_tmp
, patch_null_input_uncompressed_tmp
, output_file_temp
, 0),
451 "ApplyPatchToFileA: expected FALSE\n");
452 err
= GetLastError();
453 /* error code is unstable across Windows versions and architectures (bug) */
454 ok(err
== ERROR_PATCH_WRONG_FILE
|| err
== ERROR_SUCCESS
,
455 "Expected ERROR_SUCCESS or ERROR_PATCH_WRONG_FILE, got 0x%X\n", err
);
456 /* output deleted on failure */
457 ok(GetFileAttributesA(output_file_temp
) == INVALID_FILE_ATTRIBUTES
, "Output file should not exist\n");
459 /* missing patch file */
460 SetLastError(0xdeadbeef);
461 ok(!pApplyPatchToFileA("snarfalargle", old_two_files_ranges_0_tmp
, output_file_temp
, 0), "ApplyPatchToFileA: expected FALSE\n");
462 err
= GetLastError();
463 ok(err
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got 0x%X\n", err
);
464 ok(file_closed(old_two_files_ranges_0_tmp
), "File handle was not closed: %s\n", old_two_files_ranges_0_tmp
);
465 ok(GetFileAttributesA(output_file_temp
) == INVALID_FILE_ATTRIBUTES
, "Output file should not exist\n");
467 /* missing old file */
468 SetLastError(0xdeadbeef);
469 ok(!pApplyPatchToFileA(patch_two_files_ranges_tmp
, "elbernoffle", output_file_temp
, 0), "ApplyPatchToFileA: expected FALSE\n");
470 err
= GetLastError();
471 ok(err
== ERROR_FILE_NOT_FOUND
, "Expected ERROR_FILE_NOT_FOUND, got 0x%X\n", err
);
472 ok(file_closed(patch_two_files_ranges_tmp
), "File handle was not closed: %s\n", patch_two_files_ranges_tmp
);
473 ok(GetFileAttributesA(output_file_temp
) == INVALID_FILE_ATTRIBUTES
, "Output file should not exist\n");
475 /* bad output file */
476 SetLastError(0xdeadbeef);
477 ok(!pApplyPatchToFileA(patch_two_files_ranges_tmp
, old_two_files_ranges_0_tmp
, "up\\down\\left\\right", 0),
478 "ApplyPatchToFileA: expected FALSE\n");
479 err
= GetLastError();
480 ok(err
== ERROR_PATH_NOT_FOUND
, "Expected ERROR_PATH_NOT_FOUND, got 0x%X\n", err
);
481 ok(file_closed(patch_two_files_ranges_tmp
), "File handle was not closed: %s\n", patch_two_files_ranges_tmp
);
482 ok(file_closed(old_two_files_ranges_0_tmp
), "File handle was not closed: %s\n", old_two_files_ranges_0_tmp
);
484 if (!pApplyPatchToFileExA
)
487 /* progress function in ApplyPatchToFileExA */
488 SetLastError(0xdeadbeef);
489 current
= 0xdeadbeef;
490 ok(pApplyPatchToFileExA(patch_two_files_ranges_tmp
, old_two_files_ranges_0_tmp
, output_file_temp
, APPLY_OPTION_FAIL_IF_EXACT
,
491 progress
, ¤t
), "ApplyPatchToFileExA: expected TRUE\n");
492 err
= GetLastError();
493 ok(err
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got 0x%X\n", err
);
494 ok(current
<= 100, "Expected 0-100, got 0xdeadbeef\n");
496 /* cancellation in ApplyPatchToFileExA */
497 SetLastError(0xdeadbeef);
498 current
= 0xdeadbeef;
499 ok(!pApplyPatchToFileExA(patch_two_files_ranges_tmp
, old_two_files_ranges_0_tmp
, output_file_temp
, APPLY_OPTION_FAIL_IF_EXACT
,
500 progress_cancel
, ¤t
), "ApplyPatchToFileExA: expected FALSE\n");
501 err
= GetLastError();
502 /* the file is so small that cancellation occurs on completion and sometimes Windows reports success */
503 ok(err
== ERROR_CANCELLED
|| err
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS or ERROR_CANCELLED, got 0x%X\n", err
);
504 ok(current
<= 100, "Expected 0-100, got 0xdeadbeef\n");
507 static void test_ApplyPatchToFileByHandles(void)
509 HANDLE patch_hndl
= INVALID_HANDLE_VALUE
;
510 HANDLE old_hndl
= INVALID_HANDLE_VALUE
;
511 HANDLE new_hndl
= INVALID_HANDLE_VALUE
;
517 if (!pApplyPatchToFileByHandles
)
520 patch_hndl
= CreateFileA(patch_two_files_ranges_tmp
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, 0, NULL
);
521 if (patch_hndl
== INVALID_HANDLE_VALUE
)
523 skip("Failed to open patch file %s: %u\n", patch_two_files_ranges_tmp
, GetLastError());
527 old_hndl
= CreateFileA(old_two_files_ranges_0_tmp
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, 0, NULL
);
528 if (old_hndl
== INVALID_HANDLE_VALUE
)
530 skip("Failed to open old file %s: %u\n", old_two_files_ranges_0_tmp
, GetLastError());
534 new_hndl
= CreateFileA(output_file_temp
, GENERIC_READ
| GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, 0, NULL
);
535 if (new_hndl
== INVALID_HANDLE_VALUE
)
537 skip("Failed to open new file %s: %u\n", output_file_temp
, GetLastError());
541 SetLastError(0xdeadbeef);
542 ok(pApplyPatchToFileByHandles(patch_hndl
, old_hndl
, new_hndl
, APPLY_OPTION_FAIL_IF_EXACT
),
543 "ApplyPatchToFileByHandles: expected TRUE\n");
544 err
= GetLastError();
545 ok(err
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got 0x%X\n", err
);
546 w
= SetFilePointer(patch_hndl
, 0, NULL
, FILE_CURRENT
);
547 ok(w
== 0, "Expected file pointer 0, got %u\n", w
);
548 w
= SetFilePointer(old_hndl
, 0, NULL
, FILE_CURRENT
);
549 ok(w
== 0, "Expected file pointer 0, got %u\n", w
);
550 w
= SetFilePointer(new_hndl
, 0, NULL
, FILE_CURRENT
);
551 ok(w
== sizeof(windows_output_0
), "Expected file pointer %u, got %u\n", (unsigned)sizeof(windows_output_0
), w
);
552 size
= SetFilePointer(new_hndl
, 0, NULL
, FILE_END
);
553 ok(size
== sizeof(windows_output_0
), "Expected file size %u, got %u\n",(unsigned)sizeof(windows_output_0
), size
);
555 /* lengthen and check for truncation */
556 WriteFile(new_hndl
, "", 1, &w
, 0);
557 SetLastError(0xdeadbeef);
558 ok(pApplyPatchToFileByHandles(patch_hndl
, old_hndl
, new_hndl
, APPLY_OPTION_FAIL_IF_EXACT
),
559 "ApplyPatchToFileByHandles: expected TRUE\n");
560 err
= GetLastError();
561 ok(err
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got 0x%X\n", err
);
562 w
= SetFilePointer(new_hndl
, 0, NULL
, FILE_END
);
563 ok(w
== size
, "Expected file size %u, got %u\n", size
, w
);
565 if (!pTestApplyPatchToFileByHandles
)
568 SetLastError(0xdeadbeef);
569 ok(pTestApplyPatchToFileByHandles(patch_hndl
, old_hndl
, APPLY_OPTION_FAIL_IF_EXACT
),
570 "TestApplyPatchToFileByHandles: expected TRUE\n");
571 err
= GetLastError();
572 ok(err
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got 0x%X\n", err
);
574 if (!pApplyPatchToFileByHandlesEx
)
578 SetLastError(0xdeadbeef);
579 current
= 0xdeadbeef;
580 ok(pApplyPatchToFileByHandlesEx(patch_hndl
, old_hndl
, new_hndl
, APPLY_OPTION_FAIL_IF_EXACT
, progress
, ¤t
),
581 "ApplyPatchToFileByHandlesEx: expected TRUE\n");
582 err
= GetLastError();
583 ok(err
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got 0x%X\n", err
);
584 ok(current
<= 100, "Expected 0-100, got 0xdeadbeef\n");
585 w
= SetFilePointer(new_hndl
, 0, NULL
, FILE_END
);
586 ok(w
== size
, "Expected file size %u, got %u\n", size
, w
);
588 /* progress cancelled */
589 SetLastError(0xdeadbeef);
590 current
= 0xdeadbeef;
591 ok(!pApplyPatchToFileByHandlesEx(patch_hndl
, old_hndl
, new_hndl
, APPLY_OPTION_FAIL_IF_EXACT
,
592 progress_cancel
, ¤t
), "ApplyPatchToFileByHandlesEx: expected FALSE\n");
593 err
= GetLastError();
594 ok(err
== ERROR_CANCELLED
|| err
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS or ERROR_CANCELLED, got 0x%X\n", err
);
595 ok(current
<= 100, "Expected 0-100, got 0xdeadbeef\n");
598 if (new_hndl
!= INVALID_HANDLE_VALUE
)
599 CloseHandle(new_hndl
);
600 if (old_hndl
!= INVALID_HANDLE_VALUE
)
601 CloseHandle(old_hndl
);
602 if (patch_hndl
!= INVALID_HANDLE_VALUE
)
603 CloseHandle(patch_hndl
);
606 static void test_ApplyPatchToFileByBuffers(void)
608 BYTE
*new_buf
= NULL
;
610 FILETIME new_time
= { 0, 0 };
611 ULONG current
= 0xdeadbeef;
612 BYTE target_buf
[sizeof(old_two_files_ranges_1
)];
613 BYTE corrupt_buf
[sizeof(patch_blocktype2_no_timestamp
)];
616 if (!pApplyPatchToFileByBuffers
)
619 /* output buffer allocated by api */
620 SetLastError(0xdeadbeef);
621 ok(pApplyPatchToFileByBuffers(patch_two_files_ranges
, sizeof(patch_two_files_ranges
),
622 old_two_files_ranges_0
, sizeof(old_two_files_ranges_0
), &new_buf
, 0, &new_size
, &new_time
, 0, progress
, ¤t
),
623 "ApplyPatchToFileByBuffers: expected TRUE\n");
624 err
= GetLastError();
625 ok(err
== 0xdeadbeef || err
== ERROR_SUCCESS
, "Expected 0xdeadbeef or ERROR_SUCCESS, got 0x%X\n", err
);
626 ok(new_buf
!= NULL
, "Expected buffer returned, got NULL\n");
627 ok(new_size
== sizeof(windows_output_0
), "Expected size %u, got %u\n", (unsigned)sizeof(windows_output_0
), new_size
);
629 ok(memcmp(new_buf
, windows_output_0
, new_size
) == 0, "Expected data equal, got not equal\n");
630 ok(current
<= 100, "Expected progress 0-100, got 0xdeadbeef\n");
633 ok(VirtualFree(new_buf
, 0, MEM_RELEASE
),
634 "ApplyPatchToFileByBuffers output buffer should be allocaed with VirtualAlloc\n");
636 /* buffer supplied by caller */
637 new_buf
= target_buf
;
639 new_time
.dwHighDateTime
= 0;
640 SetLastError(0xdeadbeef);
641 ok(pApplyPatchToFileByBuffers(patch_blocktype2_no_timestamp
, sizeof(patch_blocktype2_no_timestamp
),
642 old_blocktype2_no_timestamp
, sizeof(old_blocktype2_no_timestamp
), &new_buf
, sizeof(target_buf
), &new_size
,
643 &new_time
, 0, NULL
, NULL
), "ApplyPatchToFileByBuffers: expected TRUE\n");
644 err
= GetLastError();
645 ok(err
== 0xdeadbeef || err
== ERROR_SUCCESS
, "Expected 0xdeadbeef or ERROR_SUCCESS, got 0x%X\n", err
);
646 ok(new_buf
== target_buf
, "Buffer pre-allocated; pointer should not be modified\n");
647 ok(new_size
== BLOCKTYPE2_NO_TIMESTAMP_SIZE
, "Expected size %u, got %u\n", BLOCKTYPE2_NO_TIMESTAMP_SIZE
, new_size
);
648 ok(new_time
.dwHighDateTime
== 0, "Expected datetime 0, got nonzero\n");
651 new_buf
= target_buf
;
653 new_time
.dwHighDateTime
= 0;
654 SetLastError(0xdeadbeef);
655 ok(pApplyPatchToFileByBuffers(patch_null_input_uncompressed
, sizeof(patch_null_input_uncompressed
),
656 NULL
, 0, &new_buf
, sizeof(target_buf
), &new_size
, &new_time
, 0, NULL
, NULL
),
657 "ApplyPatchToFileByBuffers: expected TRUE\n");
658 err
= GetLastError();
659 ok(err
== 0xdeadbeef || err
== ERROR_SUCCESS
, "Expected 0xdeadbeef or ERROR_SUCCESS, got 0x%X\n", err
);
660 ok(new_size
== NULL_INPUT_UNCOMPRESSED_SIZE
, "Expected size %u, got %u\n", NULL_INPUT_UNCOMPRESSED_SIZE
, new_size
);
661 ok(new_time
.dwHighDateTime
!= 0, "Expected nonzero, got 0\n");
664 SetLastError(0xdeadbeef);
665 ok(!pApplyPatchToFileByBuffers(patch_null_input_uncompressed
, sizeof(patch_null_input_uncompressed
),
666 NULL
, 0, NULL
, 0, &new_size
, &new_time
, 0, NULL
, NULL
), "ApplyPatchToFileByBuffers: expected FALSE\n");
667 err
= GetLastError();
668 ok(err
== ERROR_INVALID_PARAMETER
, "Expected ERROR_INVALID_PARAMETER, got 0x%X\n", err
);
670 /* null output test only */
671 new_time
.dwHighDateTime
= 0;
672 SetLastError(0xdeadbeef);
673 ok(pApplyPatchToFileByBuffers(patch_null_input_uncompressed
, sizeof(patch_null_input_uncompressed
),
674 NULL
, 0, NULL
, 0, NULL
, &new_time
, APPLY_OPTION_TEST_ONLY
, NULL
, NULL
),
675 "ApplyPatchToFileByBuffers: expected TRUE\n");
676 err
= GetLastError();
677 ok(err
== 0xdeadbeef || err
== ERROR_SUCCESS
, "Expected 0xdeadbeef or ERROR_SUCCESS, got 0x%X\n", err
);
678 ok(new_time
.dwHighDateTime
!= 0, "Expected nonzero, got 0\n");
680 /* null old file test only */
682 SetLastError(0xdeadbeef);
683 ok(pApplyPatchToFileByBuffers(patch_null_input_uncompressed
, sizeof(patch_null_input_uncompressed
),
684 NULL
, 0, NULL
, 0, &new_size
, NULL
, APPLY_OPTION_TEST_ONLY
, NULL
, NULL
),
685 "ApplyPatchToFileByBuffers: expected TRUE\n");
686 err
= GetLastError();
687 ok(err
== 0xdeadbeef || err
== ERROR_SUCCESS
, "Expected 0xdeadbeef or ERROR_SUCCESS, got 0x%X\n", err
);
688 ok(new_size
== NULL_INPUT_UNCOMPRESSED_SIZE
, "Expected size %u, got %u\n", NULL_INPUT_UNCOMPRESSED_SIZE
, new_size
);
690 /* alternate old file */
691 new_buf
= target_buf
;
693 SetLastError(0xdeadbeef);
694 ok(pApplyPatchToFileByBuffers(patch_two_files_ranges
, sizeof(patch_two_files_ranges
),
695 old_two_files_ranges_1
, sizeof(old_two_files_ranges_1
), &new_buf
, sizeof(target_buf
), &new_size
,
696 NULL
, 0, NULL
, NULL
), "ApplyPatchToFileByBuffers: expected TRUE\n");
697 err
= GetLastError();
698 ok(new_size
== TWO_FILES_RANGES_SIZE
, "Expected size %u, got %u\n", TWO_FILES_RANGES_SIZE
, new_size
);
699 ok(err
== 0xdeadbeef || err
== ERROR_SUCCESS
, "Expected 0xdeadbeef or ERROR_SUCCESS, got 0x%X\n", err
);
702 new_buf
= target_buf
;
703 SetLastError(0xdeadbeef);
704 ok(!pApplyPatchToFileByBuffers(patch_two_files_ranges
, sizeof(patch_two_files_ranges
),
705 old_blocktype2_no_timestamp
, sizeof(old_blocktype2_no_timestamp
), &new_buf
, sizeof(target_buf
),
706 NULL
, &new_time
, 0, NULL
, NULL
), "ApplyPatchToFileByBuffers: expected FALSE\n");
707 err
= GetLastError();
708 ok(err
== ERROR_PATCH_WRONG_FILE
, "Expected ERROR_PATCH_WRONG_FILE, got 0x%X\n", err
);
710 memcpy(corrupt_buf
, patch_blocktype2_no_timestamp
, sizeof(corrupt_buf
));
712 /* patch truncated */
713 new_buf
= target_buf
;
714 SetLastError(0xdeadbeef);
715 ok(!pApplyPatchToFileByBuffers(corrupt_buf
, sizeof(corrupt_buf
) - 1,
716 old_blocktype2_no_timestamp
, sizeof(old_blocktype2_no_timestamp
), &new_buf
, sizeof(target_buf
),
717 NULL
, &new_time
, 0, NULL
, NULL
), "ApplyPatchToFileByBuffers: expected FALSE\n");
718 err
= GetLastError();
719 ok(err
== ERROR_PATCH_CORRUPT
, "Expected ERROR_PATCH_CORRUPT, got 0x%X\n", err
);
721 corrupt_buf
[sizeof(corrupt_buf
) / 2] ^= 0xFF;
724 new_buf
= target_buf
;
725 SetLastError(0xdeadbeef);
726 ok(!pApplyPatchToFileByBuffers(corrupt_buf
, sizeof(corrupt_buf
),
727 old_blocktype2_no_timestamp
, sizeof(old_blocktype2_no_timestamp
), &new_buf
, sizeof(target_buf
),
728 NULL
, &new_time
, 0, NULL
, NULL
), "ApplyPatchToFileByBuffers: expected FALSE\n");
729 err
= GetLastError();
730 ok(err
== ERROR_PATCH_CORRUPT
, "Expected ERROR_PATCH_CORRUPT, got 0x%X\n", err
);
732 /* patch created from identical files */
733 new_buf
= target_buf
;
734 SetLastError(0xdeadbeef);
735 ok(pApplyPatchToFileByBuffers(patch_unnecessary
, sizeof(patch_unnecessary
),
736 old_unnecessary
, sizeof(old_unnecessary
), &new_buf
, sizeof(target_buf
), NULL
, &new_time
, 0, NULL
, NULL
),
737 "ApplyPatchToFileByBuffers: expected TRUE\n");
738 err
= GetLastError();
739 ok(err
== 0xdeadbeef || err
== ERROR_SUCCESS
, "Expected 0xdeadbeef or ERROR_SUCCESS, got 0x%X\n", err
);
741 /* patch created from identical files and APPLY_OPTION_FAIL_IF_EXACT */
742 new_buf
= target_buf
;
743 SetLastError(0xdeadbeef);
744 ok(!pApplyPatchToFileByBuffers(patch_unnecessary
, sizeof(patch_unnecessary
),
745 old_unnecessary
, sizeof(old_unnecessary
), &new_buf
, sizeof(target_buf
), NULL
, &new_time
,
746 APPLY_OPTION_FAIL_IF_EXACT
, NULL
, NULL
), "ApplyPatchToFileByBuffers: expected FALSE\n");
747 err
= GetLastError();
748 ok(err
== ERROR_PATCH_NOT_NECESSARY
, "Expected ERROR_PATCH_NOT_NECESSARY, got 0x%X\n", err
);
750 if (!pTestApplyPatchToFileByBuffers
)
755 SetLastError(0xdeadbeef);
756 ok(pTestApplyPatchToFileByBuffers(patch_blocktype2_no_timestamp
, sizeof(patch_blocktype2_no_timestamp
),
757 old_blocktype2_no_timestamp
, sizeof(old_blocktype2_no_timestamp
), &new_size
, 0),
758 "TestApplyPatchToFileByBuffers: expected TRUE\n");
759 err
= GetLastError();
760 ok(err
== 0xdeadbeef || err
== ERROR_SUCCESS
, "Expected 0xdeadbeef or ERROR_SUCCESS, got 0x%X\n", err
);
761 ok(new_size
== BLOCKTYPE2_NO_TIMESTAMP_SIZE
, "Expected size %u, got %u\n", BLOCKTYPE2_NO_TIMESTAMP_SIZE
, new_size
);
763 /* header test, no size returned */
764 SetLastError(0xdeadbeef);
765 ok(pTestApplyPatchToFileByBuffers(patch_blocktype2_no_timestamp
, sizeof(patch_blocktype2_no_timestamp
),
766 old_blocktype2_no_timestamp
, sizeof(old_blocktype2_no_timestamp
), NULL
, 0),
767 "TestApplyPatchToFileByBuffers: expected TRUE\n");
768 err
= GetLastError();
769 ok(err
== 0xdeadbeef || err
== ERROR_SUCCESS
, "Expected 0xdeadbeef or ERROR_SUCCESS, got 0x%X\n", err
);
772 static void test_TestApplyPatchToFile(void)
776 if (!pTestApplyPatchToFileByBuffers
)
779 /* These test files created in Win10 crash native TestApplyPatchToFileA() in Vista or earlier every
780 * time on all of the test servers, even though ApplyPatchToFileA() succeeds on the same files. */
781 if (win_version
< 0x601)
783 skip("Windows version is less than 6.1\n");
787 /* correct old file */
788 SetLastError(0xdeadbeef);
789 ok(pTestApplyPatchToFileA(patch_header_only_tmp
, old_two_files_ranges_0_tmp
, 0), "TestApplyPatchToFileA: expected TRUE\n");
790 err
= GetLastError();
791 ok(err
== ERROR_SUCCESS
, "Expected ERROR_SUCCESS, got 0x%X\n", err
);
794 SetLastError(0xdeadbeef);
795 ok(!pTestApplyPatchToFileA(patch_header_only_tmp
, old_blocktype2_no_timestamp_tmp
, 0), "TestApplyPatchToFileA: expected FALSE\n");
796 err
= GetLastError();
797 ok(err
== ERROR_PATCH_WRONG_FILE
, "Expected ERROR_PATCH_WRONG_FILE, got 0x%X\n", err
);
800 START_TEST(apply_patch
)
802 if (!init_function_pointers())
805 if (!setup_test_files())
808 test_ApplyPatchToFile();
809 test_ApplyPatchToFileByBuffers();
810 test_ApplyPatchToFileByHandles();
811 test_TestApplyPatchToFile();