annotate src/zlib-1.2.7/contrib/minizip/iowin32.c @ 169:223a55898ab9 tip default

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