fix vba read and other

This commit is contained in:
Elena.Subbotina
2022-06-20 18:06:19 +03:00
parent c4e6dea3a3
commit ac64868d4c
4 changed files with 26 additions and 12 deletions

View File

@ -435,7 +435,7 @@ namespace VBA
virtual void load(CVbaFileStreamPtr stream);
_UINT32 TextOffset;
_UINT32 TextOffset = 0xffffffff;
};
typedef boost::shared_ptr<MODULEOFFSET> MODULEOFFSETPtr;
//-----------------------------------------------------------------------------

View File

@ -132,6 +132,11 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset)
return;
}
dataSize -= 1;
if (offset > dataSize)
{
return; //error;
}
stream->seek(stream->tell() + offset);
dataSize -= offset;
@ -140,23 +145,24 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset)
stream->read(data, dataSize);
unsigned char *dataCur = data;
size_t dataPos = 0;
while (dataPos + 2 < dataSize)
while (dataCur - data < dataSize - 2)
{
std::vector<unsigned char> arrChunk;
_UINT16 header = *((_UINT32*)dataCur); dataCur += 2;
bool bCompressed = ((header & CHUNK_COMPRESSED) != 0);
_UINT16 chunkSize = (header & CHUNK_LENMASK);
_UINT16 chunkSize = (header & CHUNK_LENMASK) + 1;
bool bUnknown = false;
if ((header & CHUNK_SIGMASK) != CHUNK_SIG)
{
bCompressed = true;
chunkSize = 4094; //по факту
bUnknown = true;
}
POLE::uint64 target = (dataCur - data) + chunkSize;
unsigned char *dataNext = dataCur + chunkSize;
if (bCompressed)
{
unsigned char nBitCount = 4;
@ -203,8 +209,7 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset)
}
else
{
arrChunk.emplace_back();
arrChunk.back() = *dataCur; dataCur++;
arrChunk.push_back(*dataCur); dataCur++;
++chunkPos;
}
}
@ -215,7 +220,8 @@ CVbaFileStream::CVbaFileStream(POLE::Stream* stream, _UINT32 offset)
arrChunk.resize(chunkSize);
memcpy(arrChunk.data(), dataCur, chunkSize); dataCur += chunkSize;
}
dataPos = target;
dataCur = dataNext;
arrChunks.insert(arrChunks.end(), arrChunk.begin(), arrChunk.end());
}
}

View File

@ -103,6 +103,9 @@ const std::wstring CVbaReader::convert()
{
for (size_t i = 0; i < DirStreamObject->ModulesRecord->modules.size(); ++i)
{
if (!DirStreamObject->ModulesRecord->modules[i])
continue;
CP_XML_NODE(L"Module")
{
if (DirStreamObject->ModulesRecord->modules[i]->StreamNameRecord)
@ -121,7 +124,10 @@ const std::wstring CVbaReader::convert()
DirStreamObject->ModulesRecord->modules[i]->StreamNameRecord->StreamNameUnicode.value);
_UINT32 offset = DirStreamObject->ModulesRecord->modules[i]->OffsetRecord ?
DirStreamObject->ModulesRecord->modules[i]->OffsetRecord->TextOffset : 0;//skip cache
DirStreamObject->ModulesRecord->modules[i]->OffsetRecord->TextOffset : 0xffffffff;//skip cache
if (offset == 0xffffffff)
continue; // error record
CVbaFileStreamPtr strmModule = vbaProject_file_->getNamedStream(streamName, offset);
strmModule->CodePage = code_page_;