zlib解压(在未知解压后大小情况)
#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include "zlib/zlib.h"
/*
作者:zhujian198
邮件:zhujian198@gmail.com
描叙:zlib解压
主要是为了做内存泄漏测试检测而写,顺便做个笔记
*/
int inflate_UnCompress(char * source,int len,char **dest,DWORD * dwDest)
{
int nResult = 0;
z_stream zstrm = {0};
BYTE out[0x8000] = {0};
DWORD dwHave = 0;
int totalsize = 0;
zstrm.zalloc = Z_NULL;
zstrm.zfree = Z_NULL;
zstrm.opaque = Z_NULL;
zstrm.avail_in = 0;
zstrm.next_in = Z_NULL;
nResult = inflateInit(&zstrm);
if (nResult != Z_OK)
goto Exit0;
zstrm.avail_in = len;
zstrm.next_in = (Bytef *)source;
do
{
zstrm.avail_out = 0x8000;
zstrm.next_out = out;
nResult = inflate(&zstrm,Z_NO_FLUSH);
if (nResult == Z_STREAM_ERROR)
{
inflateEnd(&zstrm);
goto Exit0;
}
switch(nResult)
{
case Z_NEED_DICT:
nResult = Z_DATA_ERROR;
case Z_DATA_ERROR:
case Z_MEM_ERROR:
inflateEnd(&zstrm);
goto Exit0;
}
dwHave = 0x8000 - zstrm.avail_out;
totalsize += dwHave;
*dest = (char *)realloc(*dest,totalsize);
if (*dest == NULL)
{
break;
}
memcpy(*dest + totalsize - dwHave,out,dwHave);
} while (zstrm.avail_out == 0);
(void)inflateEnd(&zstrm);
Exit0:
if (nResult == Z_STREAM_END)
{
*dwDest = totalsize;
}
else
{
*dwDest = 0;
}
return (nResult == Z_STREAM_END ? Z_OK : Z_DATA_ERROR);
}
void main()
{
char * Buffer = NULL;
HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD dwFileSize = 0;
BYTE *byInBuffer = NULL;
DWORD dwNumBytes = 0;
DWORD dwOutSize = 0;
int nRes = 0;
HANDLE houtFile = INVALID_HANDLE_VALUE;
hFile = CreateFile("123.bin",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
printf("打开文件失败\n");
goto Exit0;
}
dwFileSize = GetFileSize(hFile,NULL);
if (dwFileSize == 0)
{
printf("文件大小为零\n");
goto Exit0;
}
byInBuffer = new BYTE[dwFileSize];
memset(byInBuffer,0,dwFileSize);
if (byInBuffer == NULL)
{
printf("内存申请失败\n");
goto Exit0;
}
ReadFile(hFile,byInBuffer,dwFileSize,&dwNumBytes,NULL);
if (dwNumBytes != dwFileSize)
{
printf("读取文件失败\n");
goto Exit0;
}
nRes = inflate_UnCompress((char *)byInBuffer,dwFileSize,&Buffer,&dwOutSize);
if (nRes != Z_OK)
goto Exit0;
if (dwOutSize == 0)
goto Exit0;
houtFile = CreateFile("out.exe",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
NULL,
NULL);
if (INVALID_HANDLE_VALUE == houtFile)
{
printf("创建文件失败!\n");
goto Exit0;
}
WriteFile(houtFile,Buffer,dwOutSize,&dwNumBytes,NULL);
if (dwOutSize != dwNumBytes)
{
printf("写入文件失败\n");
goto Exit0;
}
Exit0:
if (byInBuffer)
{
delete[] byInBuffer;
byInBuffer = NULL;
}
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
if (houtFile != INVALID_HANDLE_VALUE)
{
CloseHandle(houtFile);
houtFile = INVALID_HANDLE_VALUE;
}
if (Buffer)
{
free(Buffer);
Buffer = NULL;
}
}
#include <Windows.h>
#include <stdlib.h>
#include "zlib/zlib.h"
/*
作者:zhujian198
邮件:zhujian198@gmail.com
描叙:zlib解压
主要是为了做内存泄漏测试检测而写,顺便做个笔记
*/
int inflate_UnCompress(char * source,int len,char **dest,DWORD * dwDest)
{
int nResult = 0;
z_stream zstrm = {0};
BYTE out[0x8000] = {0};
DWORD dwHave = 0;
int totalsize = 0;
zstrm.zalloc = Z_NULL;
zstrm.zfree = Z_NULL;
zstrm.opaque = Z_NULL;
zstrm.avail_in = 0;
zstrm.next_in = Z_NULL;
nResult = inflateInit(&zstrm);
if (nResult != Z_OK)
goto Exit0;
zstrm.avail_in = len;
zstrm.next_in = (Bytef *)source;
do
{
zstrm.avail_out = 0x8000;
zstrm.next_out = out;
nResult = inflate(&zstrm,Z_NO_FLUSH);
if (nResult == Z_STREAM_ERROR)
{
inflateEnd(&zstrm);
goto Exit0;
}
switch(nResult)
{
case Z_NEED_DICT:
nResult = Z_DATA_ERROR;
case Z_DATA_ERROR:
case Z_MEM_ERROR:
inflateEnd(&zstrm);
goto Exit0;
}
dwHave = 0x8000 - zstrm.avail_out;
totalsize += dwHave;
*dest = (char *)realloc(*dest,totalsize);
if (*dest == NULL)
{
break;
}
memcpy(*dest + totalsize - dwHave,out,dwHave);
} while (zstrm.avail_out == 0);
(void)inflateEnd(&zstrm);
Exit0:
if (nResult == Z_STREAM_END)
{
*dwDest = totalsize;
}
else
{
*dwDest = 0;
}
return (nResult == Z_STREAM_END ? Z_OK : Z_DATA_ERROR);
}
void main()
{
char * Buffer = NULL;
HANDLE hFile = INVALID_HANDLE_VALUE;
DWORD dwFileSize = 0;
BYTE *byInBuffer = NULL;
DWORD dwNumBytes = 0;
DWORD dwOutSize = 0;
int nRes = 0;
HANDLE houtFile = INVALID_HANDLE_VALUE;
hFile = CreateFile("123.bin",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
printf("打开文件失败\n");
goto Exit0;
}
dwFileSize = GetFileSize(hFile,NULL);
if (dwFileSize == 0)
{
printf("文件大小为零\n");
goto Exit0;
}
byInBuffer = new BYTE[dwFileSize];
memset(byInBuffer,0,dwFileSize);
if (byInBuffer == NULL)
{
printf("内存申请失败\n");
goto Exit0;
}
ReadFile(hFile,byInBuffer,dwFileSize,&dwNumBytes,NULL);
if (dwNumBytes != dwFileSize)
{
printf("读取文件失败\n");
goto Exit0;
}
nRes = inflate_UnCompress((char *)byInBuffer,dwFileSize,&Buffer,&dwOutSize);
if (nRes != Z_OK)
goto Exit0;
if (dwOutSize == 0)
goto Exit0;
houtFile = CreateFile("out.exe",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
NULL,
NULL);
if (INVALID_HANDLE_VALUE == houtFile)
{
printf("创建文件失败!\n");
goto Exit0;
}
WriteFile(houtFile,Buffer,dwOutSize,&dwNumBytes,NULL);
if (dwOutSize != dwNumBytes)
{
printf("写入文件失败\n");
goto Exit0;
}
Exit0:
if (byInBuffer)
{
delete[] byInBuffer;
byInBuffer = NULL;
}
if (hFile != INVALID_HANDLE_VALUE)
{
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
}
if (houtFile != INVALID_HANDLE_VALUE)
{
CloseHandle(houtFile);
houtFile = INVALID_HANDLE_VALUE;
}
if (Buffer)
{
free(Buffer);
Buffer = NULL;
}
}