static u_int ieee802_11_print(struct smartconfig *sc, const u_char * p, u_int length, u_int orig_caplen, uint16_t channel) { uint16_t fc; fc = EXTRACT_LE_16BITS(p); uint32_t fcs = *(uint32_t *) (p + length - 4); uint32_t crc = getcrc32(p, length - 4); if (fcs == crc) { if (FC_TYPE(fc) == T_DATA) { data_header_print(sc, fc, p, channel); } } return 0; }
bool CExeFile::readData(const char episode, const std::string& datadirectory) { crc32_init(); std::string filename = datadirectory + "/keen" + itoa(episode) + ".exe"; std::ifstream File; OpenGameFileR(File, filename, std::ios::binary); if(!File) { // try another filename (Used in Episode 4-6) filename = datadirectory + "/keen" + itoa(episode) + "e.exe"; OpenGameFileR(File, filename, std::ios::binary); } if(!File) { // try another filename (Used in Episode 4-6) for demo versions filename = datadirectory + "/k" + itoa(episode) + "demo.exe"; OpenGameFileR(File, filename, std::ios::binary); } if(!File) return false; m_filename = filename; m_episode = episode; m_datadirectory = datadirectory; if( m_datadirectory != "") if(*(m_datadirectory.end()-1) != '/') m_datadirectory += "/"; File.seekg(0,std::ios::end); m_datasize = File.tellg(); File.seekg(0,std::ios::beg); SAFE_DELETE_ARRAY(m_data); unsigned char* m_data_temp = new unsigned char[m_datasize]; File.read((char*)m_data_temp, m_datasize); File.close(); Cunlzexe UnLZEXE; std::vector<unsigned char> decdata; if(UnLZEXE.decompress(m_data_temp, decdata)) { m_datasize = decdata.size(); m_data = new unsigned char[m_datasize]; m_headersize = UnLZEXE.HeaderSize(); memcpy(m_data, &decdata[0], m_datasize); } else { m_data = new unsigned char[m_datasize]; memcpy(m_data, m_data_temp,m_datasize); } m_headerdata = m_data; m_headersize = UnLZEXE.HeaderSize(); if(!m_headersize) m_headersize = 512; m_rawdata = m_data + m_headersize; const size_t offset_map[] = { /*Dummy:*/ 0x0, /*Keen 1:*/ 0x13050, /*Keen 2:*/ 0x17780, /*Keen 3:*/ 0x19820, /*Keen 4:*/ 0x2EE70, /*Keen 5:*/ 0x30340, /*Keen 6:*/ 0x30D30, /*Keen D:*/ 0x23A70 }; m_data_segment = m_rawdata+offset_map[m_episode]; delete[] m_data_temp; m_crc = getcrc32( m_data, m_datasize ); g_pLogFile->ftextOut( "EXE processed with size of %d and crc of %X\n", m_datasize, m_crc ); return true; }