예제 #1
0
파일: modify.c 프로젝트: howard5888/wineT
/***********************************************************************
 *		CheckSumMappedFile (IMAGEHLP.@)
 */
PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile(
  LPVOID BaseAddress, DWORD FileLength,
  LPDWORD HeaderSum, LPDWORD CheckSum)
{
  PIMAGE_NT_HEADERS Header;
  DWORD CalcSum;
  DWORD HdrSum;

  FIXME("(%p, %ld, %p, %p): stub\n",
    BaseAddress, FileLength, HeaderSum, CheckSum
  );

  CalcSum = (DWORD)CalcCheckSum(0,
				BaseAddress,
				(FileLength + 1) / sizeof(WORD));

  Header = RtlImageNtHeader(BaseAddress);
  HdrSum = Header->OptionalHeader.CheckSum;

  /* Subtract image checksum from calculated checksum. */
  /* fix low word of checksum */
  if (LOWORD(CalcSum) >= LOWORD(HdrSum))
  {
    CalcSum -= LOWORD(HdrSum);
  }
  else
  {
    CalcSum = ((LOWORD(CalcSum) - LOWORD(HdrSum)) & 0xFFFF) - 1;
  }

   /* fix high word of checksum */
  if (LOWORD(CalcSum) >= HIWORD(HdrSum))
  {
    CalcSum -= HIWORD(HdrSum);
  }
  else
  {
    CalcSum = ((LOWORD(CalcSum) - HIWORD(HdrSum)) & 0xFFFF) - 1;
  }

  /* add file length */
  CalcSum += FileLength;

  *CheckSum = CalcSum;
  *HeaderSum = Header->OptionalHeader.CheckSum;

  return Header;
}
예제 #2
0
파일: comm_kcm.c 프로젝트: gandy555/MTM_V4
//방범설정요청(isSecurityOn: TRUE=방범설정, FALSE=방범해제)
void CWallPadKcm::RequestSecuritySet(BOOL isSecurityOn)
{
	KCM_PACKET packet = {0,};

	if( (m_packet.opcode != KCM_OP_SECURITY_ON) && (m_packet.opcode != KCM_OP_SECURITY_OFF) )
	{
		m_nRetry = 0;
	}

	if(m_nRetry < 3)
	{
		packet.preamble		= KCM_PRE;
		packet.hd			= KCM_HD;
		packet.cc			= KCM_CC_ACK_IS | m_nRetry++;
		packet.pcnt			= 0;
		packet.adh			= KCM_DEV_WALLPAD;			//0x01
		packet.adl			= 0;
		packet.ash			= KCM_DEV_USS;				//0x54
		packet.asl			= 0;
		packet.opcode		= (isSecurityOn) ? KCM_OP_SECURITY_ON : KCM_OP_SECURITY_OFF;	//ON=0x11, OFF=0x12
		packet.data[0]		= (isSecurityOn) ? 2 : 0;	//D0: U보안			0=사용안함, 1=U보안사용대기, 2=사용
		packet.data[1]		= (isSecurityOn) ? 1 : 0;	//D1: 가스차단여부	0=차단안함, 1=차단
		packet.data[2]		= (isSecurityOn) ? 1 : 0;	//D2: 전등차단여부	0=차단안함, 1=차단
		packet.data[3]		= (isSecurityOn) ? 3 : 3;	//D3: 난방차단여부	0=차단안함, 1=난방OFF, 2=외출
		packet.data[4]		= (isSecurityOn) ? 3 : 3;	//D4: 대기전력차단	0=차단안함, 1=차단
		packet.data[5]		= (isSecurityOn) ? 1 : 0;	//D5: 엘리베이터호출	0=호출안함, 1=차단
		packet.fcc			= CalcCheckSum((UCHAR *)&packet.hd, 16);
		packet.eot			= KCM_EOT;

		if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0)
		{
			g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer");
		}
	}
	else
	{
		m_nRetry = 0;
		g_timer.KillTimer(RESPONSE_TIMER);
		g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT);
	}
}
예제 #3
0
//주차위치정보요청
void CWallPadKcm::RequestParkingInfo()
{
	KCM_PACKET packet = {0,};

	/* gandy 2015-03-30 */
	//if( (m_packet.opcode != KCM_OP_BATCH_REQ) && !CHK_FLAG(m_packet.data[0], KCM_BATCH_REQ_PARKING) )
	if (m_packet.opcode != KCM_OP_PARKING_INFO_REQ)
	{
		m_nRetry = 0;
	}

	if(m_nRetry < 3)
	{
		packet.preamble		= KCM_PRE;
		packet.hd			= KCM_HD;
		packet.cc			= KCM_CC_ACK_IS | m_nRetry++;
		packet.pcnt			= 0;
		packet.adh			= KCM_DEV_WALLPAD;			//0x01
		packet.adl			= 0;
		packet.ash			= KCM_DEV_MTM;				//0x53
		packet.asl			= 0;
		//packet.opcode		= KCM_OP_BATCH_REQ;			//0x00
		packet.opcode		= KCM_OP_PARKING_INFO_REQ;			//0x00
		//packet.data[0]		= KCM_BATCH_REQ_PARKING;	//0x02
		packet.data[0]		= 0;
		packet.fcc			= CalcCheckSum((UCHAR *)&packet.hd, 16);
		packet.eot			= KCM_EOT;

		if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0)
		{
			g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer");
		}
	}
	else
	{
		m_nRetry = 0;
		g_timer.KillTimer(RESPONSE_TIMER);
		g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT);
	}
}
예제 #4
0
파일: comm_kcm.c 프로젝트: gandy555/MTM_V4
//일괄소등요청(isAllOff: TRUE=소등, FALSE=소등해제)
void CWallPadKcm::RequestLightSet(BOOL isAllOff)
{
	KCM_PACKET packet = {0,};

	if(m_packet.opcode != KCM_OP_ALL_OFF_REQ)
	{
		m_nRetry = 0;
	}

	if(m_nRetry < 3)
	{
		packet.preamble		= KCM_PRE;
		packet.hd			= KCM_HD;
		packet.cc			= KCM_CC_ACK_IS | m_nRetry++;
		packet.pcnt			= 0;
		packet.adh			= KCM_DEV_LIGHT;			//0x0E
		packet.adl			= 0xff;						//전등 전체
		packet.ash			= KCM_DEV_USS;				//0x54
		packet.asl			= 0;
		packet.opcode		= KCM_OP_ALL_OFF_REQ;		//0x00
		if(isAllOff)
			memset(packet.data, 0x00, KCM_DATA_SIZE);
		else
			memset(packet.data, 0xff, KCM_DATA_SIZE);
		packet.fcc			= CalcCheckSum((UCHAR *)&packet.hd, 16);
		packet.eot			= KCM_EOT;

		if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0)
		{
			g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer");
		}
	}
	else
	{
		m_nRetry = 0;
		g_timer.KillTimer(RESPONSE_TIMER);
		g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT);
	}
}
예제 #5
0
파일: comm_kcm.c 프로젝트: gandy555/MTM_V4
//엘레베이터 호출
void CWallPadKcm::RequestElevatorCall()
{
	KCM_PACKET packet = {0,};

	if(m_packet.opcode != KCM_OP_ELEVATOR_CALL)
	{
		m_nRetry = 0;
	}

	if(m_nRetry < 3)
	{
		packet.preamble		= KCM_PRE;
		packet.hd			= KCM_HD;
		packet.cc			= KCM_CC_ACK_IS | m_nRetry++;
		packet.pcnt			= 0;
		packet.adh			= KCM_DEV_ELEVATOR;			//0x44
		packet.adl			= 0;
		packet.ash			= KCM_DEV_USS;				//0x54
		packet.asl			= 0;
		packet.opcode		= KCM_OP_ELEVATOR_CALL;		//0x01
		packet.data[0]		= 0;
		packet.fcc			= CalcCheckSum((UCHAR *)&packet.hd, 16);
		packet.eot			= KCM_EOT;

		if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0)
		{
			g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer");
		}
	}
	else
	{
		m_nRetry = 0;
		g_timer.KillTimer(RESPONSE_TIMER);
		g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT);
	}
}
예제 #6
0
파일: comm_kcm.c 프로젝트: gandy555/MTM_V4
void CWallPadKcm::RequestWeatherInfo()
{
	KCM_PACKET packet = {0,};

#ifndef WEATHER_REQ_APPLY	//이전방식, 일괄요청사용
	if( (m_packet.opcode != KCM_OP_BATCH_REQ) && !CHK_FLAG(m_packet.data[0], KCM_BATCH_REQ_ALL) )
	{
		m_nRetry = 0;
	}

	if(m_nRetry < 3)
	{
		packet.preamble		= KCM_PRE;
		packet.hd			= KCM_HD;
		packet.cc			= KCM_CC_ACK_IS | m_nRetry++;
		packet.pcnt			= 0;
		packet.adh			= KCM_DEV_WALLPAD;			//0x01
		packet.adl			= 0;
		packet.ash			= KCM_DEV_MTM;				//0x53
		packet.asl			= 0;
		packet.opcode		= KCM_OP_BATCH_REQ;			//0x00
		packet.data[0]		= KCM_BATCH_REQ_ALL;		//날씨,주차,현관문 일괄요청
		packet.fcc			= CalcCheckSum((UCHAR *)&packet.hd, 16);
		packet.eot			= KCM_EOT;

		if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0)
		{
			g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer");
		}
	}
	else
	{
		m_nRetry = 0;
		g_timer.KillTimer(RESPONSE_TIMER);
		g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT);
	}
#else
	if( m_packet.opcode != KCM_OP_WEATHER_REQ )
	{
		m_nRetry = 0;
	}

	if(m_nRetry < 3)
	{
		packet.preamble		= KCM_PRE;
		packet.hd			= KCM_HD;
		packet.cc			= KCM_CC_ACK_IS | m_nRetry++;
		packet.pcnt			= 0;
		packet.adh			= KCM_DEV_WALLPAD;			//0x01
		packet.adl			= 0;
		packet.ash			= KCM_DEV_MTM;				//0x53
		packet.asl			= 0;
		packet.opcode		= KCM_OP_WEATHER_REQ;		//0x31
		packet.fcc			= CalcCheckSum((UCHAR *)&packet.hd, 16);
		packet.eot			= KCM_EOT;

		if(Write((UCHAR*)&packet, sizeof(KCM_PACKET)) > 0)
		{
			g_timer.SetTimer(RESPONSE_TIMER, 1, NULL, "Response Timer");
		}
	}
	else
	{
		m_nRetry = 0;
		g_timer.KillTimer(RESPONSE_TIMER);
		g_message.SendMessage(MSG_TIMER_EVENT, RETRY_TIMEOUT);
	}
#endif
}
예제 #7
0
/***********************************************************************
 *		CheckSumMappedFile (IMAGEHLP.@)
 */
PIMAGE_NT_HEADERS WINAPI CheckSumMappedFile(
  LPVOID BaseAddress, DWORD FileLength,
  LPDWORD HeaderSum, LPDWORD CheckSum)
{
  IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *) BaseAddress;
  PIMAGE_NT_HEADERS32 Header32;
  PIMAGE_NT_HEADERS64 Header64;
  DWORD *ChecksumFile;
  DWORD CalcSum;
  DWORD HdrSum;

  TRACE("(%p, %d, %p, %p)\n",
    BaseAddress, FileLength, HeaderSum, CheckSum
  );

  CalcSum = (DWORD)CalcCheckSum(0,
				BaseAddress,
				(FileLength + 1) / sizeof(WORD));

  if (dos->e_magic != IMAGE_DOS_SIGNATURE)
    return NULL;

  Header32 = (IMAGE_NT_HEADERS32 *)((char *)dos + dos->e_lfanew);

  if (Header32->Signature != IMAGE_NT_SIGNATURE)
    return NULL;

  if (Header32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC)
    ChecksumFile = &Header32->OptionalHeader.CheckSum;
  else if (Header32->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
  {
    Header64 = (IMAGE_NT_HEADERS64 *)Header32;
    ChecksumFile = &Header64->OptionalHeader.CheckSum;
  }
  else
    return NULL;

  HdrSum = *ChecksumFile;

  /* Subtract image checksum from calculated checksum. */
  /* fix low word of checksum */
  if (LOWORD(CalcSum) >= LOWORD(HdrSum))
  {
    CalcSum -= LOWORD(HdrSum);
  }
  else
  {
    CalcSum = ((LOWORD(CalcSum) - LOWORD(HdrSum)) & 0xFFFF) - 1;
  }

   /* fix high word of checksum */
  if (LOWORD(CalcSum) >= HIWORD(HdrSum))
  {
    CalcSum -= HIWORD(HdrSum);
  }
  else
  {
    CalcSum = ((LOWORD(CalcSum) - HIWORD(HdrSum)) & 0xFFFF) - 1;
  }

  /* add file length */
  CalcSum += FileLength;

  *CheckSum = CalcSum;
  *HeaderSum = *ChecksumFile;

  return (PIMAGE_NT_HEADERS) Header32;
}
예제 #8
0
//-----------------------------------------------------------------------------
// 描述: 计算校验和值,并赋给 nCheckSum
//-----------------------------------------------------------------------------
void CUdpPacketHeader::UpdateCheckSum()
{
    nCheckSum = CalcCheckSum();
}
예제 #9
0
//-----------------------------------------------------------------------------
// 描述: 检查校验和值是否正确
//-----------------------------------------------------------------------------
bool CUdpPacketHeader::CheckSumIsValid() const
{
    return nCheckSum == CalcCheckSum();
}
예제 #10
0
void I2C2_StatusCallback(I2C2_SLAVE_DRIVER_STATUS i2c_bus_state) {
  static uint8_t deviceID = 0, ptr = 0, PktSz = 0, chksum = 0;
  static uint8_t slaveWriteType = SLAVE_NORMAL_DATA;
  static bool headNow = false;
  uint8_t data;


  switch (i2c_bus_state) {
    case I2C2_SLAVE_WRITE_REQUEST:
      // the master will be sending the eeprom address next
      slaveWriteType = SLAVE_DATA_ADDRESS;
      break;

    case I2C2_SLAVE_WRITE_COMPLETED:

      switch (slaveWriteType) {
        case SLAVE_DATA_ADDRESS:
          deviceID = I2C2_slaveWriteData;
          headNow = true;
          ptr = 0;
          break;

        case SLAVE_NORMAL_DATA:
        default:
          if (headNow) {
            headNow = false;
            data = I2C2_slaveWriteData;
            PktSz = data >> 4;
            chksum = data & 0xF;
            break;
          }
          if (!CmdQ[deviceID].free) {
            SendError(deviceID, ERR_DEVICE_BUSY);
            break;
          }
          CmdQ[deviceID].packet[ptr++] = I2C2_slaveWriteData;
          if (PktSz == ptr) {
            if (!VerifyCheckSum(CmdQ[deviceID].packet, ptr, chksum)) {
              SendError(deviceID, ERR_CHECKSUM_FAILURE);
              break;
            }
            CmdQ[deviceID].size = ptr;
            CmdQ[deviceID].free = false;
          }
          break;
      } // end switch(slaveWriteType)

      slaveWriteType = SLAVE_NORMAL_DATA;
      break;

    case I2C2_SLAVE_READ_REQUEST:
      PktSz = SendQ[deviceID].size;
      // If free, nothing to send.
      if (SendQ[deviceID].free || ptr >= PktSz) {
        SSP2BUF = 0;
        break;
      }
      if (headSnd) {
        headSnd = false;
        chksum = CalcCheckSum(SendQ[deviceID].packet, PktSz); // 4 bit checksum.
        uint8_t header = PktSz << 4 | (chksum & 0xF);
        SSP2BUF = header;
        break;
      }
      SSP2BUF = SendQ[deviceID].packet[ptr++];
      if (PktSz == ptr) {
        SendQ[deviceID].free = true;
        headSnd = true;
      }
      break;

    case I2C2_SLAVE_READ_COMPLETED:
    default:;

  } // end switch(i2c_bus_state)
}
예제 #11
0
static char *SendRecvCommand(char cid, char *par, int psz) {

CmdDesc *cmdsc;
int i, bi, cm, tmo, ibinc, wexit;
char chr, cks;

   tcflush(amp, TCIOFLUSH);

   for (cm=0; cm<COMMANDS; cm++) {
      cmdsc = &(cmdtb[cm]);
      if (cid == cmdsc->Id) {

	 Pkt.Head = STX;
	 Pkt.Tail = ETX;

	 Pkt.DeviceId[0] = Id[0];
	 Pkt.DeviceId[1] = Id[1];

	 Pkt.CmdId = cid;

	 if (par) Pkt.Payload = par;
	 else     Pkt.Payload = NULL;

	 Pkt.Checksum = CalcCheckSum(PktGeneric,&Pkt,psz);

	 Serialize(&Pkt,psz);
	 OBufSize = GetBufSize(OBuf,OBUF_SIZE);
	 EscapeOBuf();

	 if (OBufSize != write(amp,OBuf,OBufSize)) {
	    fprintf(stderr,"libamp:Error:Cant write to amp\n");
	    perror("write");
	 }
	 //tcflush(amp, TCOFLUSH);
	 tcdrain(amp);

	 if (slow) usleep(slow);

	 tmo = 0; IBufSize = 0; wexit = 0;
	 do {

	    usleep(100000); // It slow give it 100 ms between reads (10^5 us)

	    ibinc = read(amp,&IBuf[IBufSize],(IBUF_SIZE - IBufSize));
	    if (ibinc > 0) {
	       IBufSize += ibinc;
	       wexit++;
	    } else if (wexit) break;

	    if (tmo++ > 20) {
	       fprintf(stderr,"libamp:Error:Amplifier has not responed after 2 seconds\n");
	       perror("read");

	       amp = AmpRecover();
	       if (amp == 0) {
		  fprintf(stderr,"libamp:Error:Can't recover from amplifier error\n");
		  perror("open");
	       }
	       return NULL;
	    }

	 } while ((errno == EAGAIN) && (IBufSize < IBUF_SIZE)); // Wait for data

	 IBufSize = GetBufSize(IBuf,IBufSize);

	 UnEscapeIBuf();

	 bi = 0;

	 Pkt.Head        = IBuf[bi++];
	 Pkt.DeviceId[0] = IBuf[bi++];
	 Pkt.DeviceId[1] = IBuf[bi++];
	 Pkt.CmdId       = IBuf[bi++];
	 Pkt.ModleId[0]  = IBuf[bi++];
	 Pkt.ModleId[1]  = IBuf[bi++];

	 bzero((void *) Payload, PAYLOAD_SIZE);
	 for (i=0; bi<IBufSize-2; bi++) Payload[i++] = IBuf[bi];
	 PayloadSize = i;

	 cks = IBuf[IBufSize-2];
	 chr = IBuf[IBufSize-1];

	 if (i) Pkt.Payload = Payload;
	 else   Pkt.Payload = NULL;

	 Pkt.Checksum = cks;
	 cks = CalcCheckSum(PktReply,&Pkt,i);
	 if (cks != Pkt.Checksum) {
	    printf("Reply:Checksum error\n");
	 }

	 Pkt.Tail = chr;
	 if (chr != ETX) {
	    printf("libamp:Reply:Not terminated by ETX\n");
	 }
	 return Payload;
      }
   }
   return NULL;
}
예제 #12
0
void PowerDownClockCopy(void)
{
    memcpy((uint8 *)&CalcPpmDateTime.dateTime, (uint8 *)&G_CurDateTime.dateTime, sizeof(CalcPpmDateTime.dateTime));
	CalcCheckSum(CalcPpmDateTime);	
}