forked from Noice2k/NsisDecompiler
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLZMA.cpp
88 lines (74 loc) · 2.06 KB
/
LZMA.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "stdafx.h"
#include "LZMA.h"
#include "lzma/LzmaDec.h"
#include "lzma/LzmaLib.c"
/************************************************************************/
/* */
/************************************************************************/
CLZMA::CLZMA(void)
{
}
/************************************************************************/
/* */
/************************************************************************/
CLZMA::~CLZMA(void)
{
}
#define IBUFSIZE 16384
#define OBUFSIZE 32768
/************************************************************************/
// extract buffer
/************************************************************************/
bool CLZMA::Inflate(byte* inbuff,size_t ilength,std::vector<byte> *out_vect)
{
SRes result = 0;
// lzma decoder state
CLzmaDec _state;
ELzmaStatus status;
// simple check;
if (ilength < LZMA_PROPS_SIZE+1) return false;
out_vect->resize(0);
/* header: 5 bytes of LZMA properties*/
unsigned char lheader[LZMA_PROPS_SIZE ];
memcpy(lheader,inbuff,LZMA_PROPS_SIZE);
ilength -= (LZMA_PROPS_SIZE);
inbuff += (LZMA_PROPS_SIZE);
// init header
LzmaDec_Construct(&_state);
result = LzmaDec_Allocate(&_state, lheader, LZMA_PROPS_SIZE, &g_Alloc);
if (0 != result ) return false;
LzmaDec_Init(&_state);
int sss = OBUFSIZE;
byte buff[OBUFSIZE];
SizeT oprocessed = OBUFSIZE;
SizeT iprocessed = ilength;
ELzmaFinishMode finishMode = LZMA_FINISH_ANY;
//SizeT currentproc
while (true)
{
result = LzmaDec_DecodeToBuf(&_state, buff, &oprocessed,inbuff, &iprocessed, finishMode, &status);
for (unsigned i = 0x00;i< oprocessed; i++)
{
out_vect->push_back(buff[i]);
}
ilength-= iprocessed;
inbuff += iprocessed;
iprocessed = ilength;
oprocessed = OBUFSIZE;
if (ilength == 0)
{
break;;
}
if (result != 0)
{
int i =0;
break;
}
if (status == LZMA_STATUS_FINISHED_WITH_MARK)
{
break;
}
}
LzmaDec_Free(&_state, &g_Alloc);
return true;
}