12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /* Bra.h -- Branch converters for executables
- 2013-01-18 : Igor Pavlov : Public domain */
- #ifndef __BRA_H
- #define __BRA_H
- #include "7zTypes.h"
- EXTERN_C_BEGIN
- /*
- These functions convert relative addresses to absolute addresses
- in CALL instructions to increase the compression ratio.
-
- In:
- data - data buffer
- size - size of data
- ip - current virtual Instruction Pinter (IP) value
- state - state variable for x86 converter
- encoding - 0 (for decoding), 1 (for encoding)
-
- Out:
- state - state variable for x86 converter
- Returns:
- The number of processed bytes. If you call these functions with multiple calls,
- you must start next call with first byte after block of processed bytes.
-
- Type Endian Alignment LookAhead
-
- x86 little 1 4
- ARMT little 2 2
- ARM little 4 0
- PPC big 4 0
- SPARC big 4 0
- IA64 little 16 0
- size must be >= Alignment + LookAhead, if it's not last block.
- If (size < Alignment + LookAhead), converter returns 0.
- Example:
- UInt32 ip = 0;
- for ()
- {
- ; size must be >= Alignment + LookAhead, if it's not last block
- SizeT processed = Convert(data, size, ip, 1);
- data += processed;
- size -= processed;
- ip += processed;
- }
- */
- #define x86_Convert_Init(state) { state = 0; }
- SizeT x86_Convert(Byte *data, SizeT size, UInt32 ip, UInt32 *state, int encoding);
- SizeT ARM_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
- SizeT ARMT_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
- SizeT PPC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
- SizeT SPARC_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
- SizeT IA64_Convert(Byte *data, SizeT size, UInt32 ip, int encoding);
- EXTERN_C_END
- #endif
|