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