Clone of PhatAC @ https://github.com/floaterxk/PhatAC

crc.cpp 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #include "StdAfx.h"
  2. #include "crc.h"
  3. DWORD GetMagicNumber(BYTE *pbBuf, WORD wSize, BOOL fIncludeSize)
  4. {
  5. DWORD dwCS = 0;
  6. int i;
  7. //if ( fIncludeSize )
  8. dwCS += wSize << 16;
  9. for (i = 0; i < (wSize >> 2); ++i)
  10. dwCS += ((DWORD *)pbBuf)[i];
  11. int iShift = 3;
  12. for (i = (i << 2); i < wSize; ++i)
  13. {
  14. dwCS += pbBuf[i] << (iShift * 8);
  15. --iShift;
  16. }
  17. return dwCS;
  18. }
  19. DWORD CalcTransportCRC(DWORD *pdwWoot)
  20. {
  21. DWORD dwOrg = pdwWoot[2];
  22. DWORD dwCrc = 0;
  23. pdwWoot[2] = 0xBADD70DD;
  24. dwCrc += GetMagicNumber((BYTE *)pdwWoot, 20, TRUE);
  25. pdwWoot[2] = dwOrg;
  26. return dwCrc;
  27. }
  28. DWORD GenericCRC(BlobPacket_s *p)
  29. {
  30. DWORD dwCrc1, dwCrc2, *pdwCrc;
  31. pdwCrc = &p->header.dwCRC;
  32. *pdwCrc = 0xBADD70DD;
  33. dwCrc1 = CalcTransportCRC((DWORD *)p);
  34. dwCrc2 = GetMagicNumber(p->data, p->header.wSize, FALSE);
  35. *pdwCrc = dwCrc1 + dwCrc2;
  36. return (dwCrc1 + dwCrc2);
  37. }
  38. DWORD BlobCRC(BlobPacket_s *p, DWORD dwXOR)
  39. {
  40. BYTE *pbPayload = p->data;
  41. BYTE *pbPayloadEnd = p->data + p->header.wSize;
  42. DWORD dwFlags = p->header.dwFlags;
  43. DWORD dwHeaderCRC = CalcTransportCRC((DWORD *)p);
  44. DWORD dwPayloadCRC = 0;
  45. if (dwFlags & BT_TIMEUPDATE)
  46. {
  47. dwPayloadCRC += GetMagicNumber(pbPayload, sizeof(double), TRUE);
  48. pbPayload += sizeof(double);
  49. }
  50. if (dwFlags & BT_ECHOREQUEST)
  51. {
  52. dwPayloadCRC += GetMagicNumber(pbPayload, 4, TRUE);
  53. pbPayload += 4;
  54. }
  55. if (dwFlags & BT_ECHORESPONSE)
  56. {
  57. dwPayloadCRC += GetMagicNumber(pbPayload, 8, TRUE);
  58. pbPayload += 8;
  59. }
  60. if (dwFlags & BT_FLOW)
  61. {
  62. dwPayloadCRC += GetMagicNumber(pbPayload, 6, TRUE);
  63. pbPayload += 6;
  64. }
  65. if (dwFlags & BT_FRAGMENTS)
  66. {
  67. while (pbPayload < pbPayloadEnd)
  68. {
  69. WORD wLength = reinterpret_cast<FragHeader_s *>(pbPayload)->wSize;
  70. dwPayloadCRC += GetMagicNumber(pbPayload, sizeof(FragHeader_s), TRUE) + GetMagicNumber(pbPayload + sizeof(FragHeader_s), wLength - sizeof(FragHeader_s), TRUE);
  71. pbPayload += wLength;
  72. }
  73. }
  74. DWORD dwFinalCRC = dwHeaderCRC + (dwPayloadCRC ^ dwXOR);
  75. return dwFinalCRC;
  76. }