Clone of Akilla's acserver @ https://github.com/deregtd/ACServer

CRCs.h 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. // CRCs.h
  2. // Declaration of classes related to CRCs
  3. class SubTableEntry4
  4. {
  5. public:
  6. int m_nCounter;
  7. DWORD *m_pXORTable,
  8. *m_pUnkTable;
  9. DWORD m_dwArg0, m_dwArg1, m_dwArg2;
  10. SubTableEntry4 ()
  11. : m_pXORTable ( new DWORD[ 256 ] ),
  12. m_pUnkTable ( new DWORD[ 256 ] )
  13. {
  14. }
  15. };
  16. class SubTableEntry3
  17. : public SubTableEntry4
  18. {
  19. public:
  20. virtual ~SubTableEntry3 ()
  21. {
  22. }
  23. virtual void FillOutTables2 ( SubTableEntry4 *pST4, bool bUseKeys )
  24. {
  25. DWORD xor0 = 0x9E3779B9,
  26. xor1 = xor0,
  27. xor2 = xor1,
  28. xor3 = xor2,
  29. xor4 = xor3,
  30. xor5 = xor4,
  31. xor6 = xor5,
  32. xor7 = xor6,
  33. *pUnkTable = pST4->m_pUnkTable,
  34. *pXORTable = pST4->m_pXORTable;
  35. if ( !bUseKeys )
  36. {
  37. pST4->m_dwArg0 = 0;
  38. pST4->m_dwArg1 = 0;
  39. pST4->m_dwArg2 = 0;
  40. }
  41. for ( int local_counter = 0; local_counter < 4; ++ local_counter )
  42. XOR_LOOP1 ( xor0, xor1, xor2, xor3, xor4, xor5, xor6, xor7 );
  43. if ( bUseKeys )
  44. {
  45. for ( local_counter = 0; local_counter < 256; local_counter += 8 )
  46. {
  47. xor7 += pXORTable[ local_counter ];
  48. xor6 += pXORTable[ local_counter + 1 ];
  49. xor5 += pXORTable[ local_counter + 2 ];
  50. xor4 += pXORTable[ local_counter + 3 ];
  51. xor3 += pXORTable[ local_counter + 4 ];
  52. xor2 += pXORTable[ local_counter + 5 ];
  53. xor1 += pXORTable[ local_counter + 6 ];
  54. xor0 += pXORTable[ local_counter + 7 ];
  55. XOR_LOOP1 ( xor0, xor1, xor2, xor3, xor4, xor5, xor6, xor7 );
  56. pUnkTable[ local_counter ] = xor7;
  57. pUnkTable[ local_counter + 1 ] = xor6;
  58. pUnkTable[ local_counter + 2 ] = xor5;
  59. pUnkTable[ local_counter + 3 ] = xor4;
  60. pUnkTable[ local_counter + 4 ] = xor3;
  61. pUnkTable[ local_counter + 5 ] = xor2;
  62. pUnkTable[ local_counter + 6 ] = xor1;
  63. pUnkTable[ local_counter + 7 ] = xor0;
  64. }
  65. for ( local_counter = 0; local_counter < 256; local_counter += 8 )
  66. {
  67. xor7 += pUnkTable[ local_counter ];
  68. xor6 += pUnkTable[ local_counter + 1 ];
  69. xor5 += pUnkTable[ local_counter + 2 ];
  70. xor4 += pUnkTable[ local_counter + 3 ];
  71. xor3 += pUnkTable[ local_counter + 4 ];
  72. xor2 += pUnkTable[ local_counter + 5 ];
  73. xor1 += pUnkTable[ local_counter + 6 ];
  74. xor0 += pUnkTable[ local_counter + 7 ];
  75. XOR_LOOP1 ( xor0, xor1, xor2, xor3, xor4, xor5, xor6, xor7 );
  76. pUnkTable[ local_counter ] = xor7;
  77. pUnkTable[ local_counter + 1 ] = xor6;
  78. pUnkTable[ local_counter + 2 ] = xor5;
  79. pUnkTable[ local_counter + 3 ] = xor4;
  80. pUnkTable[ local_counter + 4 ] = xor3;
  81. pUnkTable[ local_counter + 5 ] = xor2;
  82. pUnkTable[ local_counter + 6 ] = xor1;
  83. pUnkTable[ local_counter + 7 ] = xor0;
  84. }
  85. }
  86. else
  87. {
  88. for ( local_counter = 0; local_counter < 256; local_counter += 8 )
  89. {
  90. XOR_LOOP1 ( xor0, xor1, xor2, xor3, xor4, xor5, xor6, xor7 );
  91. pUnkTable[ local_counter ] = xor7;
  92. pUnkTable[ local_counter + 1 ] = xor6;
  93. pUnkTable[ local_counter + 2 ] = xor5;
  94. pUnkTable[ local_counter + 3 ] = xor4;
  95. pUnkTable[ local_counter + 4 ] = xor3;
  96. pUnkTable[ local_counter + 5 ] = xor2;
  97. pUnkTable[ local_counter + 6 ] = xor1;
  98. pUnkTable[ local_counter + 7 ] = xor0;
  99. }
  100. }
  101. FinalInit ();
  102. m_nCounter = 256;
  103. }
  104. virtual void FillOutTables ( int arg0, int arg1, int arg2, DWORD *init_vals )
  105. {
  106. int temp_int;
  107. for ( int local_counter = 0; local_counter < 256; ++ local_counter )
  108. {
  109. if ( init_vals != NULL )
  110. temp_int = init_vals[ local_counter ];
  111. else
  112. temp_int = 0;
  113. m_pXORTable[ local_counter ] = temp_int;
  114. }
  115. m_dwArg0 = arg0;
  116. m_dwArg1 = arg1;
  117. m_dwArg2 = arg2;
  118. FillOutTables2 ( this, true )
  119. }
  120. DWORD Crazy_XOR1 ( DWORD *pTable, DWORD dwIndex )
  121. {
  122. return pTable[ dwIndex & 0xFF ];
  123. }
  124. DWORD Crazy_XOR0 ( DWORD inputval, DWORD &xor0, DWORD &xor1, DWORD *&xor2, DWORD &xor3, DWORD &xor4, DWORD &xor5
  125. DWORD &xor6, DWORD &xor7 )
  126. {
  127. xor3 = xor6;
  128. xor0 = xor0 ^ inputval + xor4;
  129. xor4 += 4;
  130. xor7 = xor1 + xor0 + Crazy_XOR1 ( xor2, xor6 );
  131. *xor2 = xor7;
  132. }
  133. virtual void FinalInit ()
  134. {
  135. }
  136. virtual void XOR_LOOP1 ( DWORD &xor0, DWORD &xor1, DWORD &xor2, DWORD &xor3, DWORD &xor4,
  137. DWORD &xor5, DWORD &xor6, DWORD &xor7 )
  138. {
  139. }
  140. };