BranchX86.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* BranchX86.c */
  2. #include "BranchX86.h"
  3. #define Test86MSByte(b) ((b) == 0 || (b) == 0xFF)
  4. const Byte kMaskToAllowedStatus[8] = {1, 1, 1, 0, 1, 0, 0, 0};
  5. const Byte kMaskToBitNumber[8] = {0, 1, 2, 2, 3, 3, 3, 3};
  6. SizeT x86_Convert(Byte *buffer, SizeT endPos, UInt32 nowPos, UInt32 *prevMaskMix, int encoding)
  7. {
  8. SizeT bufferPos = 0, prevPosT;
  9. UInt32 prevMask = *prevMaskMix & 0x7;
  10. if (endPos < 5)
  11. return 0;
  12. nowPos += 5;
  13. prevPosT = (SizeT)0 - 1;
  14. for(;;)
  15. {
  16. Byte *p = buffer + bufferPos;
  17. Byte *limit = buffer + endPos - 4;
  18. for (; p < limit; p++)
  19. if ((*p & 0xFE) == 0xE8)
  20. break;
  21. bufferPos = (SizeT)(p - buffer);
  22. if (p >= limit)
  23. break;
  24. prevPosT = bufferPos - prevPosT;
  25. if (prevPosT > 3)
  26. prevMask = 0;
  27. else
  28. {
  29. prevMask = (prevMask << ((int)prevPosT - 1)) & 0x7;
  30. if (prevMask != 0)
  31. {
  32. Byte b = p[4 - kMaskToBitNumber[prevMask]];
  33. if (!kMaskToAllowedStatus[prevMask] || Test86MSByte(b))
  34. {
  35. prevPosT = bufferPos;
  36. prevMask = ((prevMask << 1) & 0x7) | 1;
  37. bufferPos++;
  38. continue;
  39. }
  40. }
  41. }
  42. prevPosT = bufferPos;
  43. if (Test86MSByte(p[4]))
  44. {
  45. UInt32 src = ((UInt32)p[4] << 24) | ((UInt32)p[3] << 16) | ((UInt32)p[2] << 8) | ((UInt32)p[1]);
  46. UInt32 dest;
  47. for (;;)
  48. {
  49. Byte b;
  50. int index;
  51. if (encoding)
  52. dest = (nowPos + (UInt32)bufferPos) + src;
  53. else
  54. dest = src - (nowPos + (UInt32)bufferPos);
  55. if (prevMask == 0)
  56. break;
  57. index = kMaskToBitNumber[prevMask] * 8;
  58. b = (Byte)(dest >> (24 - index));
  59. if (!Test86MSByte(b))
  60. break;
  61. src = dest ^ ((1 << (32 - index)) - 1);
  62. }
  63. p[4] = (Byte)(~(((dest >> 24) & 1) - 1));
  64. p[3] = (Byte)(dest >> 16);
  65. p[2] = (Byte)(dest >> 8);
  66. p[1] = (Byte)dest;
  67. bufferPos += 5;
  68. }
  69. else
  70. {
  71. prevMask = ((prevMask << 1) & 0x7) | 1;
  72. bufferPos++;
  73. }
  74. }
  75. prevPosT = bufferPos - prevPosT;
  76. *prevMaskMix = ((prevPosT > 3) ? 0 : ((prevMask << ((int)prevPosT - 1)) & 0x7));
  77. return bufferPos;
  78. }