5128eecc9f 2011-02-23 kinaba: #ifndef AFX_ZIPTOOL_H__4C5F3720_4483_11D4_8D96_88668194683D__INCLUDED_ 5128eecc9f 2011-02-23 kinaba: #define AFX_ZIPTOOL_H__4C5F3720_4483_11D4_8D96_88668194683D__INCLUDED_ 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // Zip Archive Extraction ... ( XacRett #39 SubSet ) 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // ローカルヘッダ 5128eecc9f 2011-02-23 kinaba: struct ZipLocalHeader 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: // 'P' 'K' 03 04 5128eecc9f 2011-02-23 kinaba: WORD ver; // version_needed_to_extract 5128eecc9f 2011-02-23 kinaba: WORD flg; // general_purpose_bit_flag 5128eecc9f 2011-02-23 kinaba: WORD mhd; // compression_method 5128eecc9f 2011-02-23 kinaba: WORD tim; // last_modified_file_time 5128eecc9f 2011-02-23 kinaba: WORD dat; // last_modified_file_date 5128eecc9f 2011-02-23 kinaba: DWORD crc; // crc32 5128eecc9f 2011-02-23 kinaba: DWORD csz; // compressed-size 5128eecc9f 2011-02-23 kinaba: DWORD usz; // uncompressed-size 5128eecc9f 2011-02-23 kinaba: WORD fnl; // filename-len 5128eecc9f 2011-02-23 kinaba: WORD exl; // extra_field_length 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: char fnm[MAX_PATH]; 5128eecc9f 2011-02-23 kinaba: // BYTE ext[]; 5128eecc9f 2011-02-23 kinaba: }; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // 圧縮メソッドの種類 5128eecc9f 2011-02-23 kinaba: enum ZipMethod 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: Stored, // 0 5128eecc9f 2011-02-23 kinaba: Shrunk, // 1 5128eecc9f 2011-02-23 kinaba: Reduced1, // 2-5 5128eecc9f 2011-02-23 kinaba: Reduced2, 5128eecc9f 2011-02-23 kinaba: Reduced3, 5128eecc9f 2011-02-23 kinaba: Reduced4, 5128eecc9f 2011-02-23 kinaba: Imploded, // 6 5128eecc9f 2011-02-23 kinaba: Tokenized, // 7 ( not supported ) 5128eecc9f 2011-02-23 kinaba: Deflated, // 8 5128eecc9f 2011-02-23 kinaba: EnhDeflated,// 9 ( not supported ) 5128eecc9f 2011-02-23 kinaba: DclImploded,//10 ( not supported ) 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: Err=178 // this value is used by xacrett (^^; 5128eecc9f 2011-02-23 kinaba: }; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: class CZipTool 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: public: 5128eecc9f 2011-02-23 kinaba: //-- 外向きインターフェイス -------------- 5128eecc9f 2011-02-23 kinaba: bool Extract( const char* aname, const char* dll, kiPath& dll_rel_path ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: private: //-- Zip内部処理用 ----------------------- 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // CRC 5128eecc9f 2011-02-23 kinaba: DWORD crc32( DWORD crc, const BYTE* dat, int len ); 5128eecc9f 2011-02-23 kinaba: // ファイルIO 5128eecc9f 2011-02-23 kinaba: FILE *zip,*out; 5128eecc9f 2011-02-23 kinaba: void zipwrite( BYTE* dat, int len ) 5128eecc9f 2011-02-23 kinaba: { fwrite( dat, 1, len, out ); } 5128eecc9f 2011-02-23 kinaba: int zipread( BYTE* dat, int len ) 5128eecc9f 2011-02-23 kinaba: { return fread( dat, 1, len, zip ); } 5128eecc9f 2011-02-23 kinaba: // bit-reader 5128eecc9f 2011-02-23 kinaba: unsigned long bitbuf; 5128eecc9f 2011-02-23 kinaba: int bits_left; 5128eecc9f 2011-02-23 kinaba: bool bits_eof; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void initbits() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: bits_eof=false, bits_left=0, bitbuf=0; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: int getbits( int n ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( n <= bits_left ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: int c = (int)(bitbuf & ((1<<n)-1)); 5128eecc9f 2011-02-23 kinaba: bitbuf >>= n; 5128eecc9f 2011-02-23 kinaba: bits_left -= n; 5128eecc9f 2011-02-23 kinaba: return c; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: return fillbits( n ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: int fillbits( int n ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: BYTE next; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( !zipread( &next,1 ) ) 5128eecc9f 2011-02-23 kinaba: bits_eof = true; 5128eecc9f 2011-02-23 kinaba: else 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: bitbuf |= (next<<bits_left); 5128eecc9f 2011-02-23 kinaba: bits_left += 8; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: if( zipread( &next,1 ) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: bitbuf |= (next<<bits_left); 5128eecc9f 2011-02-23 kinaba: bits_left += 8; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int c = (int)(bitbuf & ((1<<n)-1)); 5128eecc9f 2011-02-23 kinaba: bitbuf >>= n; 5128eecc9f 2011-02-23 kinaba: bits_left -= n; 5128eecc9f 2011-02-23 kinaba: return c; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // 展開アルゴリズム 5128eecc9f 2011-02-23 kinaba: void Unstore( DWORD usz, DWORD csz ); 5128eecc9f 2011-02-23 kinaba: void Inflate( DWORD usz, DWORD csz ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // ヘッダ処理 5128eecc9f 2011-02-23 kinaba: // 面倒なのでCentralDirectory系は一切無視! 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // 現在のファイル位置からヘッダとして読む 5128eecc9f 2011-02-23 kinaba: bool read_header( ZipLocalHeader* hdr ); 5128eecc9f 2011-02-23 kinaba: // ヘッダ位置を探し出して読む 5128eecc9f 2011-02-23 kinaba: bool doHeader( ZipLocalHeader* hdr ); 5128eecc9f 2011-02-23 kinaba: }; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #endif