bool NetPlayServer::CompressBufferIntoPacket(const std::vector<u8>& in_buffer, sf::Packet& packet) { const sf::Uint64 size = in_buffer.size(); packet << size; if (size == 0) return true; std::vector<u8> out_buffer(NETPLAY_LZO_OUT_LEN); std::vector<u8> wrkmem(LZO1X_1_MEM_COMPRESS); lzo_uint i = 0; while (true) { lzo_uint32 cur_len = 0; // number of bytes to read lzo_uint out_len = 0; // number of bytes to write if ((i + NETPLAY_LZO_IN_LEN) >= size) { cur_len = static_cast<lzo_uint32>(size - i); } else { cur_len = NETPLAY_LZO_IN_LEN; } if (cur_len <= 0) break; // end of buffer if (lzo1x_1_compress(&in_buffer[i], cur_len, out_buffer.data(), &out_len, wrkmem.data()) != LZO_E_OK) { PanicAlertT("Internal LZO Error - compression failed"); return false; } // The size of the data to write is 'out_len' packet << static_cast<u32>(out_len); for (size_t j = 0; j < out_len; j++) { packet << out_buffer[j]; } if (cur_len != NETPLAY_LZO_IN_LEN) break; i += cur_len; } // Mark end of data packet << static_cast<u32>(0); return true; }
FileTreeItem::FileTreeItem(const QFileInfo &fileInfo, QMimeType mimeType, FileTreeItem *parent) : itemData(5), parentItem(parent), fileInfo(fileInfo), mimeType(mimeType), checked(false) { lzo_init(); if (!fileInfo.isDir()) { QFile file(fileInfo.absoluteFilePath()); file.open(QFile::ReadOnly); compressedData.resize(file.size() + (file.size() / 16) + 64 + 3); QVector<unsigned char> blob(file.size()); QVector<unsigned char> wrkmem(LZO1X_999_MEM_COMPRESS, Qt::Uninitialized); file.read((char*) blob.data(), file.size()); size_t out_len = compressedData.size(); //lzo1x_999_compress((const lzo_bytep) blob.data(), blob.size(), (lzo_bytep) compressedData.data(), &out_len, wrkmem.data()); compressedData.resize(out_len); } }
void PackWcle::decodeFixups() { upx_byte *p = oimage + soimage; iimage.dealloc(); MemBuffer tmpbuf; unsigned fixupn = unoptimizeReloc32(&p,oimage,&tmpbuf,1); MemBuffer wrkmem(8*fixupn+8); unsigned ic,jc,o,r; for (ic=0; ic<fixupn; ic++) { jc=get_le32(tmpbuf+4*ic); set_le32(wrkmem+ic*8,jc); o = soobject_table; r = get_le32(oimage+jc); virt2rela(oobject_table,&o,&r); set_le32(wrkmem+ic*8+4,OOT(o-1,my_base_address)); set_le32(oimage+jc,r); } set_le32(wrkmem+ic*8,0xFFFFFFFF); // end of 32-bit offset fixups tmpbuf.dealloc(); // selector fixups and self-relative fixups const upx_byte *selector_fixups = p; const upx_byte *selfrel_fixups = p; while (*selfrel_fixups != 0xC3) selfrel_fixups += 9; selfrel_fixups++; unsigned selectlen = ptr_diff(selfrel_fixups, selector_fixups)/9; ofixups = New(upx_byte, fixupn*9+1000+selectlen*5); upx_bytep fp = ofixups; for (ic = 1, jc = 0; ic <= opages; ic++) { // self relative fixups while ((r = get_le32(selfrel_fixups))/mps == ic-1) { fp[0] = 8; set_le16(fp+2,r & (mps-1)); o = 4+get_le32(oimage+r); set_le32(oimage+r,0); r += o; o = soobject_table; virt2rela(oobject_table,&o,&r); fp[4] = (unsigned char) o; set_le32(fp+5,r); fp[1] = (unsigned char) (r > 0xFFFF ? 0x10 : 0); fp += fp[1] ? 9 : 7; selfrel_fixups += 4; dputc('r',stdout); } // selector fixups while (selectlen && (r = get_le32(selector_fixups+5))/mps == ic-1) { fp[0] = 2; fp[1] = 0; set_le16(fp+2,r & (mps-1)); unsigned x = selector_fixups[1] > 0xD0 ? oh.init_ss_object : oh.init_cs_object; fp[4] = (unsigned char) x; fp += 5; selector_fixups += 9; selectlen--; dputc('s',stdout); } // 32 bit offset fixups while (get_le32(wrkmem+4*jc) < ic*mps) { if (jc > 1 && ((get_le32(wrkmem+4*(jc-2))+3) & (mps-1)) < 3) // cross page fixup? { r = get_le32(oimage+get_le32(wrkmem+4*(jc-2))); fp[0] = 7; fp[1] = (unsigned char) (r > 0xFFFF ? 0x10 : 0); set_le16(fp+2,get_le32(wrkmem+4*(jc-2)) | ~3); set_le32(fp+5,r); o = soobject_table; r = get_le32(wrkmem+4*(jc-1)); virt2rela(oobject_table,&o,&r); fp[4] = (unsigned char) o; fp += fp[1] ? 9 : 7; dputc('0',stdout); } o = soobject_table; r = get_le32(wrkmem+4*(jc+1)); virt2rela(oobject_table,&o,&r); r = get_le32(oimage+get_le32(wrkmem+4*jc)); fp[0] = 7; fp[1] = (unsigned char) (r > 0xFFFF ? 0x10 : 0); set_le16(fp+2,get_le32(wrkmem+4*jc) & (mps-1)); fp[4] = (unsigned char) o; set_le32(fp+5,r); fp += fp[1] ? 9 : 7; jc += 2; } set_le32(ofpage_table+ic,ptr_diff(fp,ofixups)); } for (ic=0; ic < FIXUP_EXTRA; ic++) *fp++ = 0; sofixups = ptr_diff(fp, ofixups); }
bool NetPlayServer::CompressFileIntoPacket(const std::string& file_path, sf::Packet& packet) { File::IOFile file(file_path, "rb"); if (!file) { PanicAlertT("Failed to open file \"%s\".", file_path.c_str()); return false; } const sf::Uint64 size = file.GetSize(); packet << size; if (size == 0) return true; std::vector<u8> in_buffer(NETPLAY_LZO_IN_LEN); std::vector<u8> out_buffer(NETPLAY_LZO_OUT_LEN); std::vector<u8> wrkmem(LZO1X_1_MEM_COMPRESS); lzo_uint i = 0; while (true) { lzo_uint32 cur_len = 0; // number of bytes to read lzo_uint out_len = 0; // number of bytes to write if ((i + NETPLAY_LZO_IN_LEN) >= size) { cur_len = static_cast<lzo_uint32>(size - i); } else { cur_len = NETPLAY_LZO_IN_LEN; } if (cur_len <= 0) break; // EOF if (!file.ReadBytes(in_buffer.data(), cur_len)) { PanicAlertT("Error reading file: %s", file_path.c_str()); return false; } if (lzo1x_1_compress(in_buffer.data(), cur_len, out_buffer.data(), &out_len, wrkmem.data()) != LZO_E_OK) { PanicAlertT("Internal LZO Error - compression failed"); return false; } // The size of the data to write is 'out_len' packet << static_cast<u32>(out_len); for (size_t j = 0; j < out_len; j++) { packet << out_buffer[j]; } if (cur_len != NETPLAY_LZO_IN_LEN) break; i += cur_len; } // Mark end of data packet << static_cast<u32>(0); return true; }