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