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