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