15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* iowin32.c -- IO base function header for compress/uncompress .zip
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     Version 1.1, February 14h, 2010
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         Modifications for Zip64 support
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     For more info read MiniZip_info.txt
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "zlib.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ioapi.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "iowin32.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef INVALID_HANDLE_VALUE
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INVALID_HANDLE_VALUE (0xFFFFFFFF)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef INVALID_SET_FILE_POINTER
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INVALID_SET_FILE_POINTER ((DWORD)-1)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)voidpf  ZCALLBACK win32_open_file_func  OF((voidpf opaque, const char* filename, int mode));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uLong   ZCALLBACK win32_read_file_func  OF((voidpf opaque, voidpf stream, void* buf, uLong size));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uLong   ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ZPOS64_T ZCALLBACK win32_tell64_file_func  OF((voidpf opaque, voidpf stream));
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)long    ZCALLBACK win32_seek64_file_func  OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int     ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int     ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream));
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hf;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int error;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} WIN32FILE_IOWIN;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void win32_translate_open_mode(int mode,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      DWORD* lpdwDesiredAccess,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      DWORD* lpdwCreationDisposition,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      DWORD* lpdwShareMode,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      DWORD* lpdwFlagsAndAttributes)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *lpdwDesiredAccess = GENERIC_READ;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *lpdwCreationDisposition = OPEN_EXISTING;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *lpdwShareMode = FILE_SHARE_READ;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *lpdwCreationDisposition = OPEN_EXISTING;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *lpdwCreationDisposition = CREATE_ALWAYS;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static voidpf win32_build_iowin(HANDLE hFile)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    voidpf ret=NULL;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        WIN32FILE_IOWIN w32fiow;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        w32fiow.hf = hFile;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        w32fiow.error = 0;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = malloc(sizeof(WIN32FILE_IOWIN));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (ret==NULL)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            CloseHandle(hFile);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *((WIN32FILE_IOWIN*)ret) = w32fiow;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* mode_fopen = NULL;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hFile = NULL;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((filename!=NULL) && (dwDesiredAccess != 0))
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return win32_build_iowin(hFile);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* mode_fopen = NULL;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hFile = NULL;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((filename!=NULL) && (dwDesiredAccess != 0))
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return win32_build_iowin(hFile);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* mode_fopen = NULL;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hFile = NULL;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((filename!=NULL) && (dwDesiredAccess != 0))
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return win32_build_iowin(hFile);
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* mode_fopen = NULL;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hFile = NULL;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((filename!=NULL) && (dwDesiredAccess != 0))
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return win32_build_iowin(hFile);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong ret=0;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hFile = NULL;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stream!=NULL)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hFile != NULL)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!ReadFile(hFile, buf, size, &ret, NULL))
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DWORD dwErr = GetLastError();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (dwErr == ERROR_HANDLE_EOF)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                dwErr = 0;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uLong ret=0;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hFile = NULL;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stream!=NULL)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hFile != NULL)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!WriteFile(hFile, buf, size, &ret, NULL))
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DWORD dwErr = GetLastError();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            if (dwErr == ERROR_HANDLE_EOF)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                dwErr = 0;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    long ret=-1;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hFile = NULL;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stream!=NULL)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hFile != NULL)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DWORD dwSet = SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (dwSet == INVALID_SET_FILE_POINTER)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DWORD dwErr = GetLastError();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = -1;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret=(long)dwSet;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ZPOS64_T ret= (ZPOS64_T)-1;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hFile = NULL;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stream!=NULL)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = ((WIN32FILE_IOWIN*)stream)->hf;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hFile)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LARGE_INTEGER li;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        li.QuadPart = 0;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        li.u.LowPart = SetFilePointer(hFile, li.u.LowPart, &li.u.HighPart, FILE_CURRENT);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if ( (li.LowPart == 0xFFFFFFFF) && (GetLastError() != NO_ERROR))
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DWORD dwErr = GetLastError();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = (ZPOS64_T)-1;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret=li.QuadPart;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD dwMoveMethod=0xFFFFFFFF;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hFile = NULL;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    long ret=-1;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stream!=NULL)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (origin)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ZLIB_FILEFUNC_SEEK_CUR :
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dwMoveMethod = FILE_CURRENT;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ZLIB_FILEFUNC_SEEK_END :
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dwMoveMethod = FILE_END;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ZLIB_FILEFUNC_SEEK_SET :
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        dwMoveMethod = FILE_BEGIN;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default: return -1;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hFile != NULL)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DWORD dwSet = SetFilePointer(hFile, offset, NULL, dwMoveMethod);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (dwSet == INVALID_SET_FILE_POINTER)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DWORD dwErr = GetLastError();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = -1;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret=0;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DWORD dwMoveMethod=0xFFFFFFFF;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HANDLE hFile = NULL;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    long ret=-1;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stream!=NULL)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = ((WIN32FILE_IOWIN*)stream)->hf;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (origin)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ZLIB_FILEFUNC_SEEK_CUR :
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            dwMoveMethod = FILE_CURRENT;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ZLIB_FILEFUNC_SEEK_END :
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            dwMoveMethod = FILE_END;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        case ZLIB_FILEFUNC_SEEK_SET :
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            dwMoveMethod = FILE_BEGIN;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            break;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default: return -1;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (hFile)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        LARGE_INTEGER* li = (LARGE_INTEGER*)&offset;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DWORD dwSet = SetFilePointer(hFile, li->u.LowPart, &li->u.HighPart, dwMoveMethod);
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (dwSet == INVALID_SET_FILE_POINTER)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DWORD dwErr = GetLastError();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret = -1;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        else
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret=0;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret=-1;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stream!=NULL)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        HANDLE hFile;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (hFile != NULL)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        {
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            CloseHandle(hFile);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ret=0;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        free(stream);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int ret=-1;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (stream!=NULL)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ret = ((WIN32FILE_IOWIN*)stream) -> error;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zopen_file = win32_open_file_func;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zread_file = win32_read_file_func;
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->ztell_file = win32_tell_file_func;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zseek_file = win32_seek_file_func;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zclose_file = win32_close_file_func;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zerror_file = win32_error_file_func;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->opaque = NULL;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zopen64_file = win32_open64_file_func;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zread_file = win32_read_file_func;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zclose_file = win32_close_file_func;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zerror_file = win32_error_file_func;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->opaque = NULL;
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zread_file = win32_read_file_func;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zclose_file = win32_close_file_func;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zerror_file = win32_error_file_func;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->opaque = NULL;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zread_file = win32_read_file_func;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zwrite_file = win32_write_file_func;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zclose_file = win32_close_file_func;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->zerror_file = win32_error_file_func;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pzlib_filefunc_def->opaque = NULL;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
390