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;
    }
}
posted @ 2009-06-26 18:19  debugzhu  阅读(1538)  评论(0编辑  收藏  举报