1 /* iowin32.c -- IO base function header for compress/uncompress .zip
2 Version 1.1, February 14h, 2010
3 part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
5 Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
7 Modifications for Zip64 support
8 Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
10 For more info read MiniZip_info.txt
20 #ifndef INVALID_HANDLE_VALUE
21 #define INVALID_HANDLE_VALUE (0xFFFFFFFF)
24 #ifndef INVALID_SET_FILE_POINTER
25 #define INVALID_SET_FILE_POINTER ((DWORD)-1)
29 // see Include/shared/winapifamily.h in the Windows Kit
30 #if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
32 #if !defined(WINAPI_FAMILY_ONE_PARTITION)
33 #define WINAPI_FAMILY_ONE_PARTITION(PartitionSet, Partition) ((WINAPI_FAMILY & PartitionSet) == Partition)
36 #if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP)
37 #define IOWIN32_USING_WINRT_API 1
48 static void win32_translate_open_mode(int mode,
49 DWORD* lpdwDesiredAccess,
50 DWORD* lpdwCreationDisposition,
52 DWORD* lpdwFlagsAndAttributes) {
53 *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0;
55 if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
57 *lpdwDesiredAccess = GENERIC_READ;
58 *lpdwCreationDisposition = OPEN_EXISTING;
59 *lpdwShareMode = FILE_SHARE_READ;
61 else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
63 *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
64 *lpdwCreationDisposition = OPEN_EXISTING;
66 else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
68 *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
69 *lpdwCreationDisposition = CREATE_ALWAYS;
73 static voidpf win32_build_iowin(HANDLE hFile) {
76 if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
78 WIN32FILE_IOWIN w32fiow;
81 ret = malloc(sizeof(WIN32FILE_IOWIN));
86 *((WIN32FILE_IOWIN*)ret) = w32fiow;
91 voidpf ZCALLBACK win32_open64_file_func(voidpf opaque, const void* filename, int mode) {
92 const char* mode_fopen = NULL;
93 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
96 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
98 #ifdef IOWIN32_USING_WINRT_API
100 if ((filename!=NULL) && (dwDesiredAccess != 0))
101 hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
103 if ((filename!=NULL) && (dwDesiredAccess != 0))
105 WCHAR filenameW[FILENAME_MAX + 0x200 + 1];
106 MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200);
107 hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
111 if ((filename!=NULL) && (dwDesiredAccess != 0))
112 hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
115 return win32_build_iowin(hFile);
119 voidpf ZCALLBACK win32_open64_file_funcA(voidpf opaque, const void* filename, int mode) {
120 const char* mode_fopen = NULL;
121 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
124 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
126 #ifdef IOWIN32_USING_WINRT_API
127 if ((filename!=NULL) && (dwDesiredAccess != 0))
129 WCHAR filenameW[FILENAME_MAX + 0x200 + 1];
130 MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200);
131 hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
134 if ((filename!=NULL) && (dwDesiredAccess != 0))
135 hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
138 return win32_build_iowin(hFile);
142 voidpf ZCALLBACK win32_open64_file_funcW(voidpf opaque, const void* filename, int mode) {
143 const char* mode_fopen = NULL;
144 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
147 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
149 #ifdef IOWIN32_USING_WINRT_API
150 if ((filename!=NULL) && (dwDesiredAccess != 0))
151 hFile = CreateFile2((LPCWSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition,NULL);
153 if ((filename!=NULL) && (dwDesiredAccess != 0))
154 hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
157 return win32_build_iowin(hFile);
161 voidpf ZCALLBACK win32_open_file_func(voidpf opaque, const char* filename, int mode) {
162 const char* mode_fopen = NULL;
163 DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
166 win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
168 #ifdef IOWIN32_USING_WINRT_API
170 if ((filename!=NULL) && (dwDesiredAccess != 0))
171 hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
173 if ((filename!=NULL) && (dwDesiredAccess != 0))
175 WCHAR filenameW[FILENAME_MAX + 0x200 + 1];
176 MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200);
177 hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
181 if ((filename!=NULL) && (dwDesiredAccess != 0))
182 hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
185 return win32_build_iowin(hFile);
189 uLong ZCALLBACK win32_read_file_func(voidpf opaque, voidpf stream, void* buf,uLong size) {
193 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
197 if (!ReadFile(hFile, buf, size, &ret, NULL))
199 DWORD dwErr = GetLastError();
200 if (dwErr == ERROR_HANDLE_EOF)
202 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
210 uLong ZCALLBACK win32_write_file_func(voidpf opaque, voidpf stream, const void* buf, uLong size) {
214 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
218 if (!WriteFile(hFile, buf, size, &ret, NULL))
220 DWORD dwErr = GetLastError();
221 if (dwErr == ERROR_HANDLE_EOF)
223 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
230 static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod) {
231 #ifdef IOWIN32_USING_WINRT_API
232 return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod);
234 LONG lHigh = pos.HighPart;
235 DWORD dwNewPos = SetFilePointer(hFile, pos.LowPart, &lHigh, dwMoveMethod);
237 if (dwNewPos == 0xFFFFFFFF)
238 if (GetLastError() != NO_ERROR)
240 if ((newPos != NULL) && (fOk))
242 newPos->LowPart = dwNewPos;
243 newPos->HighPart = lHigh;
249 long ZCALLBACK win32_tell_file_func(voidpf opaque, voidpf stream) {
253 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
259 if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT))
261 DWORD dwErr = GetLastError();
262 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
266 ret=(long)pos.LowPart;
271 ZPOS64_T ZCALLBACK win32_tell64_file_func(voidpf opaque, voidpf stream) {
272 ZPOS64_T ret= (ZPOS64_T)-1;
275 hFile = ((WIN32FILE_IOWIN*)stream)->hf;
282 if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT))
284 DWORD dwErr = GetLastError();
285 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
295 long ZCALLBACK win32_seek_file_func(voidpf opaque, voidpf stream, uLong offset, int origin) {
296 DWORD dwMoveMethod=0xFFFFFFFF;
301 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
304 case ZLIB_FILEFUNC_SEEK_CUR :
305 dwMoveMethod = FILE_CURRENT;
307 case ZLIB_FILEFUNC_SEEK_END :
308 dwMoveMethod = FILE_END;
310 case ZLIB_FILEFUNC_SEEK_SET :
311 dwMoveMethod = FILE_BEGIN;
319 pos.QuadPart = offset;
320 if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod))
322 DWORD dwErr = GetLastError();
323 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
332 long ZCALLBACK win32_seek64_file_func(voidpf opaque, voidpf stream, ZPOS64_T offset, int origin) {
333 DWORD dwMoveMethod=0xFFFFFFFF;
338 hFile = ((WIN32FILE_IOWIN*)stream)->hf;
342 case ZLIB_FILEFUNC_SEEK_CUR :
343 dwMoveMethod = FILE_CURRENT;
345 case ZLIB_FILEFUNC_SEEK_END :
346 dwMoveMethod = FILE_END;
348 case ZLIB_FILEFUNC_SEEK_SET :
349 dwMoveMethod = FILE_BEGIN;
357 pos.QuadPart = offset;
358 if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod))
360 DWORD dwErr = GetLastError();
361 ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
370 int ZCALLBACK win32_close_file_func(voidpf opaque, voidpf stream) {
376 hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
387 int ZCALLBACK win32_error_file_func(voidpf opaque, voidpf stream) {
391 ret = ((WIN32FILE_IOWIN*)stream) -> error;
396 void fill_win32_filefunc(zlib_filefunc_def* pzlib_filefunc_def) {
397 pzlib_filefunc_def->zopen_file = win32_open_file_func;
398 pzlib_filefunc_def->zread_file = win32_read_file_func;
399 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
400 pzlib_filefunc_def->ztell_file = win32_tell_file_func;
401 pzlib_filefunc_def->zseek_file = win32_seek_file_func;
402 pzlib_filefunc_def->zclose_file = win32_close_file_func;
403 pzlib_filefunc_def->zerror_file = win32_error_file_func;
404 pzlib_filefunc_def->opaque = NULL;
407 void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def) {
408 pzlib_filefunc_def->zopen64_file = win32_open64_file_func;
409 pzlib_filefunc_def->zread_file = win32_read_file_func;
410 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
411 pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
412 pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
413 pzlib_filefunc_def->zclose_file = win32_close_file_func;
414 pzlib_filefunc_def->zerror_file = win32_error_file_func;
415 pzlib_filefunc_def->opaque = NULL;
419 void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def) {
420 pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA;
421 pzlib_filefunc_def->zread_file = win32_read_file_func;
422 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
423 pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
424 pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
425 pzlib_filefunc_def->zclose_file = win32_close_file_func;
426 pzlib_filefunc_def->zerror_file = win32_error_file_func;
427 pzlib_filefunc_def->opaque = NULL;
431 void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def) {
432 pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW;
433 pzlib_filefunc_def->zread_file = win32_read_file_func;
434 pzlib_filefunc_def->zwrite_file = win32_write_file_func;
435 pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
436 pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
437 pzlib_filefunc_def->zclose_file = win32_close_file_func;
438 pzlib_filefunc_def->zerror_file = win32_error_file_func;
439 pzlib_filefunc_def->opaque = NULL;