Rizin
unix-like reverse engineering framework and cli tools
testzlib.c
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <windows.h>
4 
5 #include "zlib.h"
6 
7 
8 void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
9 {
10  R->HighPart = A.HighPart - B.HighPart;
11  if (A.LowPart >= B.LowPart)
12  R->LowPart = A.LowPart - B.LowPart;
13  else
14  {
15  R->LowPart = A.LowPart - B.LowPart;
16  R->HighPart --;
17  }
18 }
19 
20 #ifdef _M_X64
21 // see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
22 unsigned __int64 __rdtsc(void);
23 void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
24 {
25  // printf("rdtsc = %I64x\n",__rdtsc());
26  pbeginTime64->QuadPart=__rdtsc();
27 }
28 
29 LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
30 {
31  LARGE_INTEGER LIres;
32  unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
33  LIres.QuadPart=res;
34  // printf("rdtsc = %I64x\n",__rdtsc());
35  return LIres;
36 }
37 #else
38 #ifdef _M_IX86
39 void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
40 {
41  DWORD dwEdx,dwEax;
42  _asm
43  {
44  rdtsc
45  mov dwEax,eax
46  mov dwEdx,edx
47  }
48  pbeginTime64->LowPart=dwEax;
49  pbeginTime64->HighPart=dwEdx;
50 }
51 
52 void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
53 {
54  myGetRDTSC32(pbeginTime64);
55 }
56 
57 LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
58 {
59  LARGE_INTEGER LIres,endTime64;
60  myGetRDTSC32(&endTime64);
61 
62  LIres.LowPart=LIres.HighPart=0;
63  MyDoMinus64(&LIres,endTime64,beginTime64);
64  return LIres;
65 }
66 #else
67 void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
68 {
69 }
70 
71 void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
72 {
73 }
74 
75 LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
76 {
77  LARGE_INTEGER lr;
78  lr.QuadPart=0;
79  return lr;
80 }
81 #endif
82 #endif
83 
84 void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
85 {
86  if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
87  {
88  pbeginTime64->LowPart = GetTickCount();
89  pbeginTime64->HighPart = 0;
90  }
91 }
92 
93 DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
94 {
95  LARGE_INTEGER endTime64,ticksPerSecond,ticks;
96  DWORDLONG ticksShifted,tickSecShifted;
97  DWORD dwLog=16+0;
98  DWORD dwRet;
99  if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
100  dwRet = (GetTickCount() - beginTime64.LowPart)*1;
101  else
102  {
103  MyDoMinus64(&ticks,endTime64,beginTime64);
104  QueryPerformanceFrequency(&ticksPerSecond);
105 
106 
107  {
108  ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
109  tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
110 
111  }
112 
113  dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
114  dwRet *=1;
115  }
116  return dwRet;
117 }
118 
119 int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
120 {
121  FILE* stream;
122  unsigned char* ptr;
123  int retVal=1;
124  stream=fopen(filename, "rb");
125  if (stream==NULL)
126  return 0;
127 
128  fseek(stream,0,SEEK_END);
129 
130  *plFileSize=ftell(stream);
131  fseek(stream,0,SEEK_SET);
132  ptr=malloc((*plFileSize)+1);
133  if (ptr==NULL)
134  retVal=0;
135  else
136  {
137  if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
138  retVal=0;
139  }
140  fclose(stream);
141  *pFilePtr=ptr;
142  return retVal;
143 }
144 
145 int main(int argc, char *argv[])
146 {
147  int BlockSizeCompress=0x8000;
148  int BlockSizeUncompress=0x8000;
149  int cprLevel=Z_DEFAULT_COMPRESSION ;
150  long lFileSize;
151  unsigned char* FilePtr;
152  long lBufferSizeCpr;
153  long lBufferSizeUncpr;
154  long lCompressedSize=0;
155  unsigned char* CprPtr;
156  unsigned char* UncprPtr;
157  long lSizeCpr,lSizeUncpr;
158  DWORD dwGetTick,dwMsecQP;
159  LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
160 
161  if (argc<=1)
162  {
163  printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
164  return 0;
165  }
166 
167  if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
168  {
169  printf("error reading %s\n",argv[1]);
170  return 1;
171  }
172  else printf("file %s read, %u bytes\n",argv[1],lFileSize);
173 
174  if (argc>=3)
175  BlockSizeCompress=atol(argv[2]);
176 
177  if (argc>=4)
178  BlockSizeUncompress=atol(argv[3]);
179 
180  if (argc>=5)
181  cprLevel=(int)atol(argv[4]);
182 
183  lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
184  lBufferSizeUncpr = lBufferSizeCpr;
185 
186  CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
187 
188  BeginCountPerfCounter(&li_qp,TRUE);
189  dwGetTick=GetTickCount();
190  BeginCountRdtsc(&li_rdtsc);
191  {
192  z_stream zcpr;
193  int ret=Z_OK;
194  long lOrigToDo = lFileSize;
195  long lOrigDone = 0;
196  int step=0;
197  memset(&zcpr,0,sizeof(z_stream));
198  deflateInit(&zcpr,cprLevel);
199 
200  zcpr.next_in = FilePtr;
201  zcpr.next_out = CprPtr;
202 
203 
204  do
205  {
206  long all_read_before = zcpr.total_in;
207  zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
208  zcpr.avail_out = BlockSizeCompress;
209  ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
210  lOrigDone += (zcpr.total_in-all_read_before);
211  lOrigToDo -= (zcpr.total_in-all_read_before);
212  step++;
213  } while (ret==Z_OK);
214 
215  lSizeCpr=zcpr.total_out;
216  deflateEnd(&zcpr);
217  dwGetTick=GetTickCount()-dwGetTick;
218  dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
219  dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
220  printf("total compress size = %u, in %u step\n",lSizeCpr,step);
221  printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
222  printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
223  printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
224  }
225 
226  CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
227  UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
228 
229  BeginCountPerfCounter(&li_qp,TRUE);
230  dwGetTick=GetTickCount();
231  BeginCountRdtsc(&li_rdtsc);
232  {
233  z_stream zcpr;
234  int ret=Z_OK;
235  long lOrigToDo = lSizeCpr;
236  long lOrigDone = 0;
237  int step=0;
238  memset(&zcpr,0,sizeof(z_stream));
239  inflateInit(&zcpr);
240 
241  zcpr.next_in = CprPtr;
242  zcpr.next_out = UncprPtr;
243 
244 
245  do
246  {
247  long all_read_before = zcpr.total_in;
248  zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
249  zcpr.avail_out = BlockSizeUncompress;
250  ret=inflate(&zcpr,Z_SYNC_FLUSH);
251  lOrigDone += (zcpr.total_in-all_read_before);
252  lOrigToDo -= (zcpr.total_in-all_read_before);
253  step++;
254  } while (ret==Z_OK);
255 
256  lSizeUncpr=zcpr.total_out;
257  inflateEnd(&zcpr);
258  dwGetTick=GetTickCount()-dwGetTick;
259  dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
260  dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
261  printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
262  printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
263  printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
264  printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
265  }
266 
267  if (lSizeUncpr==lFileSize)
268  {
269  if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
270  printf("compare ok\n");
271 
272  }
273 
274  return 0;
275 }
#define A(x)
Definition: arc.h:165
#define R(x, b, m)
Definition: arc.h:168
#define B(x)
Definition: arc.h:166
static RzILOpEffect * mov(cs_insn *insn, bool is_thumb)
Definition: arm_il32.c:351
#define NULL
Definition: cris-opc.c:27
_Use_decl_annotations_ int __cdecl printf(const char *const _Format,...)
Definition: cs_driver.c:93
int ZEXPORT deflateEnd(z_streamp strm)
Definition: deflate.c:1119
int ZEXPORT deflate(z_streamp strm, int flush)
Definition: deflate.c:804
static states step(struct re_guts *, sopno, sopno, states, int, states)
Definition: engine.c:888
int ZEXPORT inflate(z_streamp strm, int flush)
Definition: inflate.c:623
int ZEXPORT inflateEnd(z_streamp strm)
Definition: inflate.c:1301
const char * filename
Definition: ioapi.h:137
voidpf stream
Definition: ioapi.h:138
return memset(p, 0, total)
void * realloc(void *ptr, size_t size)
Definition: malloc.c:144
void * malloc(size_t size)
Definition: malloc.c:123
static static fork const void static count static fd const char const char static newpath char char argv
Definition: sflib.h:40
#define TRUE
Definition: mybfd.h:103
string FILE
Definition: benchmark.py:21
#define min(a, b)
Definition: qsort.h:83
static int
Definition: sfsocketcall.h:114
uInt avail_in
Definition: zlib.h:88
uInt avail_out
Definition: zlib.h:92
z_const Bytef * next_in
Definition: zlib.h:87
uLong total_in
Definition: zlib.h:89
uLong total_out
Definition: zlib.h:93
Bytef * next_out
Definition: zlib.h:91
int main(int argc, char *argv[])
Definition: testzlib.c:145
void myGetRDTSC32(LARGE_INTEGER *pbeginTime64)
Definition: testzlib.c:67
void BeginCountRdtsc(LARGE_INTEGER *pbeginTime64)
Definition: testzlib.c:71
void MyDoMinus64(LARGE_INTEGER *R, LARGE_INTEGER A, LARGE_INTEGER B)
Definition: testzlib.c:8
DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64, BOOL fComputeTimeQueryPerf)
Definition: testzlib.c:93
void BeginCountPerfCounter(LARGE_INTEGER *pbeginTime64, BOOL fComputeTimeQueryPerf)
Definition: testzlib.c:84
int ReadFileMemory(const char *filename, long *plFileSize, unsigned char **pFilePtr)
Definition: testzlib.c:119
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64, BOOL fComputeTimeQueryPerf)
Definition: testzlib.c:75
DWORD
eax
Definition: x86-32-avx.s.cs:79
#define SEEK_SET
Definition: zip.c:88
#define SEEK_END
Definition: zip.c:84
#define Z_FINISH
Definition: zlib.h:172
#define Z_OK
Definition: zlib.h:177
#define Z_SYNC_FLUSH
Definition: zlib.h:170
#define inflateInit(strm)
Definition: zlib.h:1812
#define deflateInit(strm, level)
Definition: zlib.h:1810
#define Z_DEFAULT_COMPRESSION
Definition: zlib.h:193