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