Fossil SCM

fossil-scm / compat / zlib / contrib / minizip / iowin32.c
Blame History Raw 448 lines
1
/* iowin32.c -- IO base function header for compress/uncompress .zip
2
part of the MiniZip project - ( https://www.winimage.com/zLibDll/minizip.html )
3
4
Copyright (C) 1998-2026 Gilles Vollant (minizip) ( https://www.winimage.com/zLibDll/minizip.html )
5
6
Modifications for Zip64 support
7
Copyright (C) 2009-2010 Mathias Svensson ( https://result42.com )
8
9
For more info read MiniZip_info.txt
10
11
*/
12
13
#include <stdlib.h>
14
15
#include "zlib.h"
16
#include "ioapi.h"
17
#include "iowin32.h"
18
19
#ifndef INVALID_HANDLE_VALUE
20
#define INVALID_HANDLE_VALUE (0xFFFFFFFF)
21
#endif
22
23
#ifndef INVALID_SET_FILE_POINTER
24
#define INVALID_SET_FILE_POINTER ((DWORD)-1)
25
#endif
26
27
28
/* see Include/shared/winapifamily.h in the Windows Kit */
29
#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
30
31
#if !defined(WINAPI_FAMILY_ONE_PARTITION)
32
#define WINAPI_FAMILY_ONE_PARTITION(PartitionSet, Partition) ((WINAPI_FAMILY & PartitionSet) == Partition)
33
#endif
34
35
#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP)
36
#define IOWIN32_USING_WINRT_API 1
37
#endif
38
#endif
39
40
typedef struct
41
{
42
HANDLE hf;
43
int error;
44
} WIN32FILE_IOWIN;
45
46
47
static void win32_translate_open_mode(int mode,
48
DWORD* lpdwDesiredAccess,
49
DWORD* lpdwCreationDisposition,
50
DWORD* lpdwShareMode,
51
DWORD* lpdwFlagsAndAttributes) {
52
*lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0;
53
54
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
55
{
56
*lpdwDesiredAccess = GENERIC_READ;
57
*lpdwCreationDisposition = OPEN_EXISTING;
58
*lpdwShareMode = FILE_SHARE_READ;
59
}
60
else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
61
{
62
*lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
63
*lpdwCreationDisposition = OPEN_EXISTING;
64
}
65
else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
66
{
67
*lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
68
*lpdwCreationDisposition = CREATE_ALWAYS;
69
}
70
}
71
72
static voidpf win32_build_iowin(HANDLE hFile) {
73
voidpf ret=NULL;
74
75
if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
76
{
77
WIN32FILE_IOWIN w32fiow;
78
w32fiow.hf = hFile;
79
w32fiow.error = 0;
80
ret = malloc(sizeof(WIN32FILE_IOWIN));
81
82
if (ret==NULL)
83
CloseHandle(hFile);
84
else
85
*((WIN32FILE_IOWIN*)ret) = w32fiow;
86
}
87
return ret;
88
}
89
90
voidpf ZCALLBACK win32_open64_file_func(voidpf opaque, const void* filename, int mode) {
91
(void)opaque;
92
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
93
HANDLE hFile = NULL;
94
95
win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
96
97
#ifdef IOWIN32_USING_WINRT_API
98
#ifdef UNICODE
99
if ((filename!=NULL) && (dwDesiredAccess != 0))
100
hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
101
#else
102
if ((filename!=NULL) && (dwDesiredAccess != 0))
103
{
104
WCHAR filenameW[FILENAME_MAX + 0x200 + 1];
105
MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200);
106
hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
107
}
108
#endif
109
#else
110
if ((filename!=NULL) && (dwDesiredAccess != 0))
111
hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
112
#endif
113
114
return win32_build_iowin(hFile);
115
}
116
117
118
voidpf ZCALLBACK win32_open64_file_funcA(voidpf opaque, const void* filename, int mode) {
119
(void)opaque;
120
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
121
HANDLE hFile = NULL;
122
123
win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
124
125
#ifdef IOWIN32_USING_WINRT_API
126
if ((filename!=NULL) && (dwDesiredAccess != 0))
127
{
128
WCHAR filenameW[FILENAME_MAX + 0x200 + 1];
129
MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200);
130
hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
131
}
132
#else
133
if ((filename!=NULL) && (dwDesiredAccess != 0))
134
hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
135
#endif
136
137
return win32_build_iowin(hFile);
138
}
139
140
141
voidpf ZCALLBACK win32_open64_file_funcW(voidpf opaque, const void* filename, int mode) {
142
(void)opaque;
143
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
144
HANDLE hFile = NULL;
145
146
win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
147
148
#ifdef IOWIN32_USING_WINRT_API
149
if ((filename!=NULL) && (dwDesiredAccess != 0))
150
hFile = CreateFile2((LPCWSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition,NULL);
151
#else
152
if ((filename!=NULL) && (dwDesiredAccess != 0))
153
hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
154
#endif
155
156
return win32_build_iowin(hFile);
157
}
158
159
160
voidpf ZCALLBACK win32_open_file_func(voidpf opaque, const char* filename, int mode) {
161
(void)opaque;
162
DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
163
HANDLE hFile = NULL;
164
165
win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
166
167
#ifdef IOWIN32_USING_WINRT_API
168
#ifdef UNICODE
169
if ((filename!=NULL) && (dwDesiredAccess != 0))
170
hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
171
#else
172
if ((filename!=NULL) && (dwDesiredAccess != 0))
173
{
174
WCHAR filenameW[FILENAME_MAX + 0x200 + 1];
175
MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200);
176
hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
177
}
178
#endif
179
#else
180
if ((filename!=NULL) && (dwDesiredAccess != 0))
181
hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
182
#endif
183
184
return win32_build_iowin(hFile);
185
}
186
187
188
uLong ZCALLBACK win32_read_file_func(voidpf opaque, voidpf stream, void* buf,uLong size) {
189
(void)opaque;
190
uLong ret=0;
191
HANDLE hFile = NULL;
192
if (stream!=NULL)
193
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
194
195
if (hFile != NULL)
196
{
197
if (!ReadFile(hFile, buf, size, &ret, NULL))
198
{
199
DWORD dwErr = GetLastError();
200
if (dwErr == ERROR_HANDLE_EOF)
201
dwErr = 0;
202
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
203
}
204
}
205
206
return ret;
207
}
208
209
210
uLong ZCALLBACK win32_write_file_func(voidpf opaque, voidpf stream, const void* buf, uLong size) {
211
(void)opaque;
212
uLong ret=0;
213
HANDLE hFile = NULL;
214
if (stream!=NULL)
215
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
216
217
if (hFile != NULL)
218
{
219
if (!WriteFile(hFile, buf, size, &ret, NULL))
220
{
221
DWORD dwErr = GetLastError();
222
if (dwErr == ERROR_HANDLE_EOF)
223
dwErr = 0;
224
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
225
}
226
}
227
228
return ret;
229
}
230
231
static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) {
232
#ifdef IOWIN32_USING_WINRT_API
233
return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod);
234
#else
235
LONG lHigh = pos.HighPart;
236
DWORD dwNewPos = SetFilePointer(hFile, pos.LowPart, &lHigh, dwMoveMethod);
237
BOOL fOk = TRUE;
238
if (dwNewPos == 0xFFFFFFFF)
239
if (GetLastError() != NO_ERROR)
240
fOk = FALSE;
241
if ((newPos != NULL) && (fOk))
242
{
243
newPos->LowPart = dwNewPos;
244
newPos->HighPart = lHigh;
245
}
246
return fOk;
247
#endif
248
}
249
250
long ZCALLBACK win32_tell_file_func(voidpf opaque, voidpf stream) {
251
(void)opaque;
252
long ret=-1;
253
HANDLE hFile = NULL;
254
if (stream!=NULL)
255
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
256
if (hFile != NULL)
257
{
258
LARGE_INTEGER pos;
259
pos.QuadPart = 0;
260
261
if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT))
262
{
263
DWORD dwErr = GetLastError();
264
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
265
ret = -1;
266
}
267
else
268
ret=(long)pos.LowPart;
269
}
270
return ret;
271
}
272
273
ZPOS64_T ZCALLBACK win32_tell64_file_func(voidpf opaque, voidpf stream) {
274
(void)opaque;
275
ZPOS64_T ret= (ZPOS64_T)-1;
276
HANDLE hFile = NULL;
277
if (stream!=NULL)
278
hFile = ((WIN32FILE_IOWIN*)stream)->hf;
279
280
if (hFile)
281
{
282
LARGE_INTEGER pos;
283
pos.QuadPart = 0;
284
285
if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT))
286
{
287
DWORD dwErr = GetLastError();
288
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
289
ret = (ZPOS64_T)-1;
290
}
291
else
292
ret=pos.QuadPart;
293
}
294
return ret;
295
}
296
297
298
long ZCALLBACK win32_seek_file_func(voidpf opaque, voidpf stream, uLong offset, int origin) {
299
(void)opaque;
300
DWORD dwMoveMethod=0xFFFFFFFF;
301
HANDLE hFile = NULL;
302
303
long ret=-1;
304
if (stream!=NULL)
305
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
306
switch (origin)
307
{
308
case ZLIB_FILEFUNC_SEEK_CUR :
309
dwMoveMethod = FILE_CURRENT;
310
break;
311
case ZLIB_FILEFUNC_SEEK_END :
312
dwMoveMethod = FILE_END;
313
break;
314
case ZLIB_FILEFUNC_SEEK_SET :
315
dwMoveMethod = FILE_BEGIN;
316
break;
317
default: return -1;
318
}
319
320
if (hFile != NULL)
321
{
322
LARGE_INTEGER pos;
323
pos.QuadPart = offset;
324
if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod))
325
{
326
DWORD dwErr = GetLastError();
327
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
328
ret = -1;
329
}
330
else
331
ret=0;
332
}
333
return ret;
334
}
335
336
long ZCALLBACK win32_seek64_file_func(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) {
337
(void)opaque;
338
DWORD dwMoveMethod=0xFFFFFFFF;
339
HANDLE hFile = NULL;
340
long ret=-1;
341
342
if (stream!=NULL)
343
hFile = ((WIN32FILE_IOWIN*)stream)->hf;
344
345
switch (origin)
346
{
347
case ZLIB_FILEFUNC_SEEK_CUR :
348
dwMoveMethod = FILE_CURRENT;
349
break;
350
case ZLIB_FILEFUNC_SEEK_END :
351
dwMoveMethod = FILE_END;
352
break;
353
case ZLIB_FILEFUNC_SEEK_SET :
354
dwMoveMethod = FILE_BEGIN;
355
break;
356
default: return -1;
357
}
358
359
if (hFile)
360
{
361
LARGE_INTEGER pos;
362
pos.QuadPart = offset;
363
if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod))
364
{
365
DWORD dwErr = GetLastError();
366
((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
367
ret = -1;
368
}
369
else
370
ret=0;
371
}
372
return ret;
373
}
374
375
int ZCALLBACK win32_close_file_func(voidpf opaque, voidpf stream) {
376
(void)opaque;
377
int ret=-1;
378
379
if (stream!=NULL)
380
{
381
HANDLE hFile;
382
hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
383
if (hFile != NULL)
384
{
385
CloseHandle(hFile);
386
ret=0;
387
}
388
free(stream);
389
}
390
return ret;
391
}
392
393
int ZCALLBACK win32_error_file_func(voidpf opaque, voidpf stream) {
394
(void)opaque;
395
int ret=-1;
396
if (stream!=NULL)
397
{
398
ret = ((WIN32FILE_IOWIN*)stream) -> error;
399
}
400
return ret;
401
}
402
403
void fill_win32_filefunc(zlib_filefunc_def* pzlib_filefunc_def) {
404
pzlib_filefunc_def->zopen_file = win32_open_file_func;
405
pzlib_filefunc_def->zread_file = win32_read_file_func;
406
pzlib_filefunc_def->zwrite_file = win32_write_file_func;
407
pzlib_filefunc_def->ztell_file = win32_tell_file_func;
408
pzlib_filefunc_def->zseek_file = win32_seek_file_func;
409
pzlib_filefunc_def->zclose_file = win32_close_file_func;
410
pzlib_filefunc_def->zerror_file = win32_error_file_func;
411
pzlib_filefunc_def->opaque = NULL;
412
}
413
414
void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) {
415
pzlib_filefunc_def->zopen64_file = win32_open64_file_func;
416
pzlib_filefunc_def->zread_file = win32_read_file_func;
417
pzlib_filefunc_def->zwrite_file = win32_write_file_func;
418
pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
419
pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
420
pzlib_filefunc_def->zclose_file = win32_close_file_func;
421
pzlib_filefunc_def->zerror_file = win32_error_file_func;
422
pzlib_filefunc_def->opaque = NULL;
423
}
424
425
426
void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) {
427
pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA;
428
pzlib_filefunc_def->zread_file = win32_read_file_func;
429
pzlib_filefunc_def->zwrite_file = win32_write_file_func;
430
pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
431
pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
432
pzlib_filefunc_def->zclose_file = win32_close_file_func;
433
pzlib_filefunc_def->zerror_file = win32_error_file_func;
434
pzlib_filefunc_def->opaque = NULL;
435
}
436
437
438
void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) {
439
pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW;
440
pzlib_filefunc_def->zread_file = win32_read_file_func;
441
pzlib_filefunc_def->zwrite_file = win32_write_file_func;
442
pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
443
pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
444
pzlib_filefunc_def->zclose_file = win32_close_file_func;
445
pzlib_filefunc_def->zerror_file = win32_error_file_func;
446
pzlib_filefunc_def->opaque = NULL;
447
}
448

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button