Example #1
0
UINT GenerateWpsPinCode(
	IN	PRTMP_ADAPTER	pAd,
    IN  BOOLEAN         bFromApcli,	
	IN	UCHAR			apidx)
{
	UCHAR	macAddr[MAC_ADDR_LEN];
	UINT 	iPin;
	UINT	checksum;

	NdisZeroMemory(macAddr, MAC_ADDR_LEN);

#ifdef CONFIG_AP_SUPPORT
	IF_DEV_CONFIG_OPMODE_ON_AP(pAd)
	{
#ifdef APCLI_SUPPORT
	    if (bFromApcli)
	        NdisMoveMemory(&macAddr[0], pAd->ApCfg.ApCliTab[apidx].wdev.if_addr, MAC_ADDR_LEN);
	    else
#endif /* APCLI_SUPPORT */
		NdisMoveMemory(&macAddr[0], pAd->ApCfg.MBSSID[apidx].wdev.if_addr, MAC_ADDR_LEN);
	}
#endif /* CONFIG_AP_SUPPORT */

	iPin = macAddr[3] * 256 * 256 + macAddr[4] * 256 + macAddr[5];

	iPin = iPin % 10000000;

	
	checksum = ComputeChecksum( iPin );
	iPin = iPin*10 + checksum;

	return iPin;
}
UINT GenerateWpsPinCode(
	IN	PRTMP_ADAPTER	pAd,
    IN  BOOLEAN         bFromApcli,	
	IN	UCHAR			apidx)
{
	UCHAR	macAddr[MAC_ADDR_LEN];
	UINT 	iPin;
	UINT	checksum;

	NdisZeroMemory(macAddr, MAC_ADDR_LEN);

#ifdef CONFIG_STA_SUPPORT
	IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
		NdisMoveMemory(&macAddr[0], pAd->CurrentAddress, MAC_ADDR_LEN);
#endif /* CONFIG_STA_SUPPORT */

	iPin = macAddr[3] * 256 * 256 + macAddr[4] * 256 + macAddr[5];

	iPin = iPin % 10000000;

	
	checksum = ComputeChecksum( iPin );
	iPin = iPin*10 + checksum;

	return iPin;
}
Example #3
0
void link_mcu_restart(void) {
  ComputeChecksum(link_mcu_from_fbw_msg);
  link_mcu_from_fbw_msg.checksum = crc;

  // wait for the next transaction
  spi_slave_wait(&(LINK_MCU_SPI_DEV));
}
Example #4
0
bool IsCorrupted(struct pkt packet)
{
  if (packet.checksum == ComputeChecksum(packet))
    return (false);
  else
    return (true);
}
BOOL CDataIndex::UpdateChecksum(LPCTSTR DataFileName)
{
	BOOL retcode = FALSE;

	// build index filename
	CFileSpec fs(DataFileName);
	fs.SetExt(".ldx");

	// build cell starts filename
	CFileSpec ifs(DataFileName);
	ifs.SetExt(".ldi");

	// update the checksum for the index file
	FILE* f = fopen(fs.GetFullSpec(), "rb+");
	if (f) {
		if (ReadHeader(f)) {
			// make sure we have a valid data index file
			if (strcmp(m_Header.Signature, "LDAindex") == 0) {
				m_Header.Checksum = ComputeChecksum(DataFileName);
				m_Header.Version = 1.1f;

				WriteHeader(f);
				fclose(f);

				retcode = TRUE;
			}
		}
	}

	// update the checksum for the starts file
	if (retcode) {
		f = fopen(ifs.GetFullSpec(), "rb+");
		if (f) {
			if (ReadHeader(f)) {
				if (strcmp(m_Header.Signature, "LDAstarts") == 0) {
					m_Header.Checksum = ComputeChecksum(DataFileName);
					m_Header.Version = 1.1f;

					WriteHeader(f);
					fclose(f);
				}
			}
		}
	}

	return(retcode);
}
void NmeaConverter_pi::SendNMEASentence(wxString sentence)
{
    sentence.Trim();
    wxString Checksum = ComputeChecksum(sentence);
    sentence = sentence.Append(wxT("*"));
    sentence = sentence.Append(Checksum);
    sentence = sentence.Append(wxT("\r\n"));
    PushNMEABuffer(sentence);
}
Example #7
0
void SENTENCE::Finish( void )
{
//   ASSERT_VALID( this );

   unsigned char checksum = ComputeChecksum();

   wxString temp_string;

   temp_string.Printf(_T("*%02X%c%c"), (int) checksum, CARRIAGE_RETURN, LINE_FEED );
   Sentence += temp_string;
}
// -----------------------------------------------------------------------------
// CTransactionIDGenerator::AddSystemInfo
// -----------------------------------------------------------------------------
//
void CTransactionIDGenerator::AddSystemInfo( TDes8& aBuf ) const
    {
    TInt biggestBlock = 0;
    TInt totalAvailable = User::Available( biggestBlock );
    TInt value = biggestBlock + totalAvailable - User::CountAllocCells();
    ComputeChecksum( aBuf, &value, sizeof( value ) );

    TTimeIntervalSeconds inactivity = User::InactivityTime();
    if ( inactivity.Int() > 0 )
        {
        TUint8 byteVal = static_cast<TUint8>( inactivity.Int() & 0xff );
        aBuf.Append( &byteVal, sizeof( byteVal ) );
        }
    }
uint32 CRegProtocol::NewPIN()
{
	uint32 pwd;
	char devPwd[32];

	RAND_bytes((unsigned char *) & pwd, 4);
    sprintf( devPwd, "%08u", pwd );

	// Compute the checksum
	devPwd[7] = '\0'; // null out the 8th byte
	uint32 val = strtoul( devPwd, NULL, 10 );
	uint32 checksum = ComputeChecksum( val );
	val = val*10 + checksum;
	return val;
}
Example #10
0
void link_mcu_event_task( void ) {
  if (link_mcu_trans.status == SPITransSuccess) {
    /* Got a message on SPI. */
    link_mcu_trans.status = SPITransDone;
    /* A message has been received */
    ComputeChecksum(link_mcu_from_fbw_msg);
    if (link_mcu_from_fbw_msg.checksum == crc)
      inter_mcu_received_fbw = TRUE;
    else
      link_mcu_nb_err++;
  }
  if (link_mcu_trans.status == SPITransFailed) {
    link_mcu_trans.status = SPITransDone;
    link_mcu_received = TRUE;
    link_mcu_nb_err++;
  }
}
Example #11
0
/* called from layer 3, when a packet arrives for layer 4 at B*/
void B_input(struct pkt packet)
{
  struct pkt sendpkt;
  int i;

  /* if not corrupted and received packet is in order */
  if  ( (!IsCorrupted(packet))  && (packet.seqnum == expectedseqnum) ) {
    if (TRACE > 0)
      printf("----B: packet %d is correctly received, send ACK!\n",packet.seqnum);
    packets_received++;

    /* deliver to receiving application */
    tolayer5(B, packet.payload);

    /* send an ACK for the received packet */
    sendpkt.acknum = expectedseqnum;

    /* update state variables */
    expectedseqnum = (expectedseqnum + 1) % SEQSPACE;        
  }
  else {
    /* packet is corrupted or out of order resend last ACK */
    if (TRACE > 0) 
      printf("----B: packet corrupted or not expected sequence number, resend ACK!\n");
    if (expectedseqnum == 0)
      sendpkt.acknum = SEQSPACE - 1;
    else
      sendpkt.acknum = expectedseqnum - 1;
  }

  /* create packet */
  sendpkt.seqnum = B_nextseqnum;
  B_nextseqnum = (B_nextseqnum + 1) % 2;
    
  /* we don't have any data to send.  fill payload with 0's */
  for ( i=0; i<20 ; i++ ) 
    sendpkt.payload[i] = '0';  

  /* computer checksum */
  sendpkt.checksum = ComputeChecksum(sendpkt); 

  /* send out packet */
  tolayer3 (B, sendpkt);
}
// ---------------------------------------------------------------------------
// CTransactionIDGenerator::BuildInputDataL
// ---------------------------------------------------------------------------
//
HBufC8* CTransactionIDGenerator::BuildInputDataLC( TAny* aObject,
                                                   TInt aObjectSize )
    {
    const TInt KAmountOfRandomNbrsToFill = 10;

    //Size of the input data buffer. It contains the following items:
    //
    //item                        item's size
    //----                        -----------
    //iCounter                       sizeof( iCounter )
    //aObject's state              aObjectSize    
    //checksum of this               sizeof( TUint16 )
    //clock info                  sizeof( TInt64 ) + sizeof( TUint )
    //system info                  sizeof( TUint16 ) + sizeof( TUint8 )
    //KAmountOfRandomNbrsToFill
    //random integer values     KAmountOfRandomNbrsToFill * sizeof( TInt )
    TInt dataSize = sizeof( iCounter ) + aObjectSize +
                    sizeof( TUint16 ) + sizeof( TInt64 ) + sizeof( TUint ) +
                    sizeof( TUint16 ) + sizeof( TUint8 ) +
                    KAmountOfRandomNbrsToFill * sizeof( TInt );
    HBufC8* buf = HBufC8::NewLC( dataSize );

    TPtr8 ptr = buf->Des();

    ptr.Append( reinterpret_cast<const TUint8*>( &iCounter ),
                sizeof( iCounter ) );
    ptr.Append( reinterpret_cast<const TUint8*>( aObject ), aObjectSize );
    
    ComputeChecksum( ptr, this, sizeof( this ) );

    AddClockInfo( ptr );
    AddSystemInfo( ptr );    

    TInt random = 0;
    TInt randomNumberSize = sizeof( random );
    while ( ptr.Size() <= ( ptr.MaxSize() - randomNumberSize ) )
        {
        random = Math::Rand( iSeed );
        ptr.Append( reinterpret_cast<const TUint8*>( &random ),
                    sizeof( random ) );
        }

    return buf;
    }
bool NmeaConverter_pi::nmeaIsValid( wxString &sentence)
{
    bool r = false;
    wxString s = sentence;
    wxString checksum; 
    if ( s.Mid( s.Length() -3,1 ) == _("*") )
    {
        checksum = s.Right(2);        
        s = s.Left( s.Length() -3 );
        if ( ComputeChecksum( s ) == checksum )
        {            
            r = true;
        }
    }
    else
        r = true; // if no checksum available then result is also true
    sentence = s;
    return r;
}
Example #14
0
/* called from layer 5 (application layer), passed the message to be sent to other side */
void A_output(struct msg message)
{
  struct pkt sendpkt;
  int i;

  /* if not blocked waiting on ACK */
  if ( windowcount < WINDOWSIZE) {
    if (TRACE > 1)
      printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");

    /* create packet */
    sendpkt.seqnum = A_nextseqnum;
    sendpkt.acknum = NOTINUSE;
    for ( i=0; i<20 ; i++ ) 
      sendpkt.payload[i] = message.data[i];
    sendpkt.checksum = ComputeChecksum(sendpkt); 

    /* put packet in window buffer */
    /* windowlast will always be 0 for alternating bit; but not for GoBackN */
    windowlast = (windowlast + 1) % WINDOWSIZE; 
    buffer[windowlast] = sendpkt;
    windowcount++;

    /* send out packet */
    if (TRACE > 0)
      printf("Sending packet %d to layer 3\n", sendpkt.seqnum);
    tolayer3 (A, sendpkt);

    /* start timer if first packet in window */
    if (windowcount == 1)
      starttimer(A,RTT);

    /* get next sequence number, wrap back to 0 */
    A_nextseqnum = (A_nextseqnum + 1) % SEQSPACE;  
  }
  /* if blocked,  window is full */
  else {
    if (TRACE > 0)
      printf("----A: New message arrives, send window is full\n");
    window_full++;
  }
}
Example #15
0
/****************************************************************************
 Function
  AssemblePacket
 Description
	Creates a packet for XBee using data from parameter.

****************************************************************************/
static bool AssemblePacket(uint8_t *transmitData, uint8_t SizeOfData, uint16_t destAddress) {
	
	*outgoingMessage = 0x7E;
	*(outgoingMessage+1) = 0x00;
	*(outgoingMessage+2) = SizeOfData+5;
	*(outgoingMessage+3) = TX_API_IDENTIFIER;
	*(outgoingMessage+4) = frameID;
	*(outgoingMessage+5) = destAddress>>8;
	*(outgoingMessage+6) = destAddress;
	*(outgoingMessage+7) = 0x00;
	
	for(int i = 0; i < SizeOfData; i++){
		*(outgoingMessage+8+i) = *(transmitData + i);		
	}
	
	uint8_t checkSum = ComputeChecksum(outgoingMessage, SizeOfData + 8);
	printf("\r\nChecksum = %d", checkSum);
	*(outgoingMessage+SizeOfData+8) = checkSum;
	
	return true;
}	
Example #16
0
File: acpi.cpp Project: Marlinc/0ad
static bool ValidateTable(const AcpiTable* table, const char* signature = 0)
{
	if(!table)
		return false;

	// caller knowns the signature; make sure it matches
	if(signature)
	{
		if(memcmp(table->signature, signature, 4) != 0)
			return false;
	}
	// no specific signature is called for, just validate the characters.
	else
	{
		for(size_t i = 0; i < 4; i++)
		{
			const char c = table->signature[i];
			// "ASF!" and "____" have been encountered
			if(!isalpha(c) && c != '_' && c != '!')
				return false;
		}
	}

	// must be at least as large as the common header
	if(table->size < sizeof(AcpiTable))
		return false;

	// checksum of table must be 0
	// .. AMIBIOS OEMB table has an incorrect checksum (off-by-one),
	// so don't complain about any OEM tables (ignored anyway).
	const bool isOemTable = (memcmp(table->signature, "OEM", 3) == 0);
	if(!isOemTable)
	{
		if(ComputeChecksum((PCV_u8)table, table->size) != 0)
			return false;
	}

	return true;
}
Example #17
0
uint8_t CheckForErrors(uint8_t *inputMessage, uint8_t sizeOfMessage){
	
	// See if we had a checksum error
	uint8_t checkSum = ComputeChecksum(inputMessage,sizeOfMessage-1); // Pass packet (w/o checksum) to compute checksum
	printf("Checksum : %d", checkSum);
	if(checkSum != *(inputMessage + sizeOfMessage - 1)){ // -1 acconts for checksum being at index size-1 (array starts at 0 index)
		return CHECKSUM_FAILURE;		
	}
	
	// See if we're looking at a transmit result message
	if(*(inputMessage + API_IDENTIFIER) == TX_RESULT_API){
		if(*(inputMessage + TRANSMIT_RESULT_STATUS) == STATUS_SUCCESS){
			return TX_SUCCESS;
		}else if(*(inputMessage + TRANSMIT_RESULT_STATUS) == STATUS_NO_ACK){
			return NO_ACK_FAILURE;
		}else if(*(inputMessage + TRANSMIT_RESULT_STATUS) == STATUS_CCA_FAILURE){
			return CCA_FAILURE;
		}
	}
	// Return a success if a receive packet made it this far
	return RX_SUCCESS;
}
Example #18
0
NMEA0183_BOOLEAN SENTENCE::IsChecksumBad( int checksum_field_number ) const
{
//   ASSERT_VALID( this );

   /*
   ** Checksums are optional, return TRUE if an existing checksum is known to be bad
   */

   wxString checksum_in_sentence = Field( checksum_field_number );

   if ( checksum_in_sentence == _T("") )
   {
      return( Unknown0183 );
   }

   if ( ComputeChecksum() != HexValue( checksum_in_sentence ) )
   {
      return( NTrue );
   }

   return( NFalse );
}
unsigned int CSoundCombiner::CheckSumWork( IFileSystem *filesystem, CUtlVector< CombinerEntry >& info )
{
	if ( info.Count() <= 0 )
	{
		Warning( "CSoundCombiner::CheckSumWork:  work item count is zero\n" );
		return 0;
	}

	if ( !VerifyFilesExist( filesystem, info ) )
	{
		return 0;
	}

	if ( !CreateWorkList( filesystem, info ) )
	{
		return 0;
	}

	// Checkum work items
	unsigned int checksum = ComputeChecksum();

	return checksum;
}
Example #20
0
void link_mcu_send(void) {

  ComputeChecksum(link_mcu_from_ap_msg);
  link_mcu_from_ap_msg.checksum = crc;
  spi_submit(&(LINK_MCU_SPI_DEV), &link_mcu_trans);
}
Example #21
0
EFI_STATUS
	Main(
	VOID
	)
{
	EFI_ACPI_SUPPORT_PROTOCOL *AcpiSupportProtocol;
	EFI_LEGACY_BIOS_PROTOCOL *LegacyBiosProtocol;
	UINT64 Handel = 0;
	UINTN DataSize = 0;
	EFI_TPL OldTpl;
	EFI_STATUS Status = EFI_UNSUPPORTED;
	Rsdp20Tbl_t *RsdpTable = 0;
	Rsdp20Tbl_t *LegacyRsdpTable = 0;
	RsdtTbl_t *RsdtTable = 0;
	XsdtTbl_t *XsdtTable = 0;
	SlicTbl_t *SlicTable = 0;
	AcpiTbl_t *AcpiTable = 0;
	VOID *LegacyAddress = 0;
	UINT8 SlpString[0x20] = { 0 };
	UINTN i = 0;

	//=========================================================================//
	// code starts                                                             //
	//=========================================================================//

	SlicTable = (SlicTbl_t *)SLIC;

	//=========================================================================//
	// add Marker and Public Key to empty SLIC                                 //
	//=========================================================================//

	DataSize = sizeof(Marker_t);
	if (RS->GetVariable(OaMarkerName, &OaMarkerGuid, 0, &DataSize, &SlicTable->Marker) != EFI_SUCCESS ||
		DataSize != sizeof(Marker_t)) {
			return EFI_NOT_FOUND;
	}
	DataSize = sizeof(PublicKey_t);
	if (RS->GetVariable(OaPublicKeyName, &OaPublicKeyGuid, 0, &DataSize, &SlicTable->PublicKey) != EFI_SUCCESS ||
		DataSize != sizeof(PublicKey_t)) {
			return EFI_NOT_FOUND;
	}

	//=========================================================================//
	// copy OemId, OemTableId from Marker to SLIC ACPI header                  //
	//=========================================================================//

	BS->CopyMem(SlicTable->Header.OemId, SlicTable->Marker.OemId, 6);
	BS->CopyMem(SlicTable->Header.OemTableId, SlicTable->Marker.OemTableId, 8);

	//=========================================================================//
	// add SLIC to ACPI tables                                                 //
	//=========================================================================//

	if(BS->LocateProtocol(&AcpiProtocolGuid, NULL, (VOID **) &AcpiSupportProtocol) == EFI_SUCCESS) {
		Status = AcpiSupportProtocol->SetAcpiTable(AcpiSupportProtocol, (VOID *)SLIC, TRUE,
			EFI_ACPI_TABLE_VERSION_1_0B|EFI_ACPI_TABLE_VERSION_2_0|EFI_ACPI_TABLE_VERSION_3_0, &Handel);
	}

	if (Status != EFI_SUCCESS) {
		return Status;
	}

#if SLP_INJECT == 1

	//=========================================================================//
	// add SLP 1.0 string to legacy region                                     //
	//=========================================================================//

	DataSize = sizeof(SlpString);
	if (RS->GetVariable(OaSlpName, &OaSlpGuid, 0, &DataSize, SlpString) == EFI_SUCCESS) {
		if (BS->LocateProtocol(&LegacyBiosGuid, NULL, (VOID **)&LegacyBiosProtocol) == EFI_SUCCESS) {
			if (LegacyBiosProtocol->GetLegacyRegion(LegacyBiosProtocol, sizeof(SlpString), 1, 2, &LegacyAddress) == EFI_SUCCESS) {
				Status = LegacyBiosProtocol->CopyLegacyRegion(LegacyBiosProtocol, DataSize, LegacyAddress, SlpString);
			}
		}
	}
#endif

	//=========================================================================//
	// find ACPI tables                                                        //
	//=========================================================================//

	OldTpl = BS->RaiseTPL(TPL_HIGH_LEVEL);
	Status = GetSystemConfigurationTable (&EfiAcpi20TableGuid, (VOID **)&RsdpTable);
	if (EFI_ERROR (Status)) {
		Status = GetSystemConfigurationTable (&EfiAcpiTableGuid, (VOID **)&RsdpTable);
	}
	if (Status == EFI_SUCCESS) {
		if (RsdpTable->Revision == 0) {
			RsdtTable = (RsdtTbl_t *) RsdpTable->RSDTAddress;
		}
		else if (RsdpTable->Revision == 2) {
			RsdtTable = (RsdtTbl_t *) RsdpTable->RSDTAddress;
			XsdtTable = (XsdtTbl_t *) RsdpTable->XSDTAddress;
		}
		else {
			return EFI_UNSUPPORTED;
		}
	}
	else {
		return EFI_NOT_FOUND;
	}

	//=========================================================================//
	// copy SLIC OemId, OemTableId to RSDP, RSDT, XSDT                         //
	//=========================================================================//

#if PATCH_TABLES == 1
	DataSize = (RsdtTable->Header.Length - sizeof(AcpiHeader_t)) << 2;
	for(i = 0 ; i < DataSize; i++) {
		AcpiTable = (AcpiTbl_t *) RsdtTable->Entry[i];
		if (AcpiTable != NULL) {
			if (CompareMem(AcpiTable->Header.OemId, RsdtTable->Header.OemId, 6) == 0 &&
				CompareMem(AcpiTable->Header.OemTableId, RsdtTable->Header.OemTableId, 8) == 0) {
					BS->CopyMem(AcpiTable->Header.OemId, SlicTable->Header.OemId, 6);
					BS->CopyMem(AcpiTable->Header.OemTableId, SlicTable->Header.OemTableId, 8);
					AcpiTable->Header.Checksum = 0;
					AcpiTable->Header.Checksum = ComputeChecksum((UINT8 *) AcpiTable, AcpiTable->Header.Length);
			}
		}
	}
#endif

	BS->CopyMem(RsdtTable->Header.OemId, SlicTable->Header.OemId, 6);
	BS->CopyMem(RsdtTable->Header.OemTableId, SlicTable->Header.OemTableId, 8);
	RsdtTable->Header.Checksum = 0;
	RsdtTable->Header.Checksum = ComputeChecksum((UINT8 *) RsdtTable, RsdtTable->Header.Length);
	BS->CopyMem(RsdpTable->OemId, SlicTable->Header.OemId, 6);
	RsdpTable->Checksum = 0;
	RsdpTable->Checksum = ComputeChecksum((UINT8 *) RsdpTable, 0x14);
	if(RsdpTable->Revision == 2) {

#if PATCH_TABLES == 1
		DataSize = (XsdtTable->Header.Length - sizeof(AcpiHeader_t)) << 3;
		for(i = 0 ; i < DataSize; i++) {
			AcpiTable = (AcpiTbl_t *) (XsdtTable->Entry[i] & 0xFFFFFFFF);
			if (AcpiTable != NULL) {
				if (CompareMem(AcpiTable->Header.OemId, XsdtTable->Header.OemId, 6) == 0 &&
					CompareMem(AcpiTable->Header.OemTableId, XsdtTable->Header.OemTableId, 8) == 0) {
						BS->CopyMem(AcpiTable->Header.OemId, SlicTable->Header.OemId, 6);
						BS->CopyMem(AcpiTable->Header.OemTableId, SlicTable->Header.OemTableId, 8);
						AcpiTable->Header.Checksum = 0;
						AcpiTable->Header.Checksum = ComputeChecksum((UINT8 *) AcpiTable, AcpiTable->Header.Length);
				}
			}
		}
#endif

		RsdpTable->ExtendedChecksum = 0;
		RsdpTable->ExtendedChecksum = ComputeChecksum((UINT8 *) RsdpTable, RsdpTable->Length);
		BS->CopyMem(XsdtTable->Header.OemId, SlicTable->Header.OemId, 6);
		BS->CopyMem(XsdtTable->Header.OemTableId, SlicTable->Header.OemTableId, 8);
		XsdtTable->Header.Checksum = 0;
		XsdtTable->Header.Checksum = ComputeChecksum((UINT8 *) XsdtTable, XsdtTable->Header.Length);
	}

	//=========================================================================//
	// copy OemId to RSDP in legacy region                                     //
	//=========================================================================//

	LegacyRsdpTable = (Rsdp20Tbl_t *) FindAcpiRsdPtr();
	if (LegacyRsdpTable != NULL && LegacyUnlock() == EFI_SUCCESS)
	{
		BS->CopyMem(LegacyRsdpTable->OemId, SlicTable->Header.OemId, 6);
		LegacyRsdpTable->RSDTAddress = RsdpTable->RSDTAddress;
		LegacyRsdpTable->Checksum = 0;
		LegacyRsdpTable->Checksum = ComputeChecksum((UINT8 *) LegacyRsdpTable, 0x14);
		if(LegacyRsdpTable->Revision == 2) {
			LegacyRsdpTable->XSDTAddress = RsdpTable->XSDTAddress;
			LegacyRsdpTable->ExtendedChecksum = 0;
			LegacyRsdpTable->ExtendedChecksum = ComputeChecksum((UINT8 *) LegacyRsdpTable, LegacyRsdpTable->Length);
		}
		LegacyLock();
	}
	BS->RestoreTPL(OldTpl);
	return Status;
}
BOOL CDataIndex::CreateIndex(LPCTSTR DataFileName, int Format, int Width, int Height, int NumberOfPoints, double MinX, double MaxX, double MinY, double MaxY, double MinZ, double MaxZ, BOOL Optimize)
{
	if (m_HaveStarts) {
		delete [] m_CellStarts;
		m_HaveStarts = FALSE;
	}

	// create index for the given data file
	m_DataFileName = _T(DataFileName);

	// build index filename
	CFileSpec fs(DataFileName);
	fs.SetExt(".ldx");

	// populate header values
	strcpy(m_Header.Signature, "LDAindex");
	m_Header.Version = 1.1f;
	m_Header.Checksum = ComputeChecksum(DataFileName);
	m_Header.Format = Format;
	m_Header.MinX = 9999999999.0;
	m_Header.MinY = 9999999999.0;
	m_Header.MinZ = 9999999999.0;
	m_Header.MaxX = -9999999999.0;
	m_Header.MaxY = -9999999999.0;
	m_Header.MaxZ = -9999999999.0;
	m_Header.GridCellsAcross = Width;
	m_Header.GridCellsUp = Height;
	m_Header.TotalPointsIndexed = 0;

	// open data file
	CLidarData dat(DataFileName);
	LIDARRETURN pt;
	if (dat.IsValid()) {
		// create index file and write header
		m_FileHandle = fopen(fs.GetFullSpec(), "wb+");
		if (m_FileHandle) {
			if (WriteHeader()) {
				if (MinX + MaxX + MinY + MaxY + MinZ + MaxZ == 0.0) {
					// scan data file for min/max values
					while (dat.ReadNextRecord(&pt)) {
						m_Header.MinX = std::min(m_Header.MinX, pt.X);
						m_Header.MinY = std::min(m_Header.MinY, pt.Y);
						m_Header.MinZ = std::min(m_Header.MinZ, double(pt.Elevation));
						m_Header.MaxX = std::max(m_Header.MaxX, pt.X);
						m_Header.MaxY = std::max(m_Header.MaxY, pt.Y);
						m_Header.MaxZ = std::max(m_Header.MaxZ, double(pt.Elevation));

						m_Header.TotalPointsIndexed ++;
					}
					dat.Rewind();
				}
				else {
					// use values passed in
					m_Header.MinX = MinX;
					m_Header.MinY = MinY;
					m_Header.MinZ = MinZ;
					m_Header.MaxX = MaxX;
					m_Header.MaxY = MaxY;
					m_Header.MaxZ = MaxZ;


					m_Header.TotalPointsIndexed = NumberOfPoints;
				}

				// add 0.1 to max values to make sure we have a range that works for cell calculation
				// removed addition of 0.1 to header max values 3/21/2006
//				m_Header.MaxX += 0.1;
//				m_Header.MaxY += 0.1;
//				m_Header.MaxZ += 0.1;

				// modified cell size calculation to add 0.1 to max data values 3/21/2006
				double cellw = ((m_Header.MaxX + 0.1) - m_Header.MinX) / (double) m_Header.GridCellsAcross;
				double cellh = ((m_Header.MaxY + 0.1) - m_Header.MinY) / (double) m_Header.GridCellsUp;

				// read data file lines and build index
				int ptnum = 0;
				long offset = dat.GetPosition();
				while (dat.ReadNextRecord(&pt)) {
					ptnum ++;

					m_Point.Offset = offset;
					m_Point.Column = (unsigned char) ((pt.X - m_Header.MinX) / cellw);
					m_Point.Row = (unsigned char) ((pt.Y - m_Header.MinY) / cellh);
//						m_Point.PointNumber = ptnum;

					WritePoint();
					offset = dat.GetPosition();
				}

				// rewrite the header to get min/max values and number of points
				WriteHeader();

				// improve the index
				if (m_Header.TotalPointsIndexed && Optimize) {
					// allocate space for entire index
					INDEXENTRY* list = new INDEXENTRY[m_Header.TotalPointsIndexed];
					if (list) {
						// rewind to start of index entries
						fseek(m_FileHandle, 128, SEEK_SET);

						for (int i = 0; i < m_Header.TotalPointsIndexed; i ++) {
							ReadPoint();
							list[i].Column = m_Point.Column;
							list[i].Row = m_Point.Row;
							list[i].Offset = m_Point.Offset;
						}

						// sort list
						qsort(list, m_Header.TotalPointsIndexed, sizeof(INDEXENTRY), CompareIndexEntries);

						// re-write
						// rewind to start of index entries
						fseek(m_FileHandle, 128, SEEK_SET);

						for (int i = 0; i < m_Header.TotalPointsIndexed; i ++) {
							m_Point.Column = list[i].Column;
							m_Point.Row = list[i].Row;
							m_Point.Offset = list[i].Offset;
							WritePoint();
						}

						// create cell starting point file
						int colrow;
						m_CellStarts = new long[m_Header.GridCellsAcross * m_Header.GridCellsUp];
						if (m_CellStarts) {
							// initialize starting points
							for (int i = 0; i < m_Header.GridCellsAcross * m_Header.GridCellsUp; i ++)
								m_CellStarts[i] = -1;

							for (int i = 0; i < m_Header.TotalPointsIndexed; i ++) {
								colrow = list[i].Column * m_Header.GridCellsUp + list[i].Row;
								if (m_CellStarts[colrow] < 0)
									m_CellStarts[colrow] = i;
							}

							// write file
							CFileSpec ifs(fs.GetFullSpec());
							ifs.SetExt(".ldi");

							FILE* f = fopen(ifs.GetFullSpec(), "wb");
							if (f) {
								// use same header as index with slightly different signature
								strcpy(m_Header.Signature, "LDAstarts");
								fwrite(&m_Header, sizeof(header), 1, f);

								// seek to end of header area
								fseek(f, 128, SEEK_SET);

								// write starting points
								fwrite(m_CellStarts, sizeof(long), m_Header.GridCellsAcross * m_Header.GridCellsUp, f);

								fclose(f);

								// reset header to correct signature
								strcpy(m_Header.Signature, "LDAindex");
							}

							m_HaveStarts = TRUE;
						}

						delete [] list;
					}
				}
				fclose(m_FileHandle);

				// reopen in read mode and go to start of points
				m_FileHandle = fopen(fs.GetFullSpec(), "rb");
				fseek(m_FileHandle, 128, SEEK_SET);

				m_Valid = TRUE;
			}
		}
		dat.Close();
	}
	else {
		m_Valid = FALSE;
	}
	return(m_Valid);
}
BOOL CDataIndex::VerifyChecksum(LPCTSTR DataFileName, int UseOldMethod)
{
	// test checksum to see if data file has changed since index was created
	return(m_Header.Checksum == ComputeChecksum(DataFileName, UseOldMethod));
}