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