void CJS_GlobalData::LoadGlobalPersistentVariables() { uint8_t* pBuffer = nullptr; int32_t nLength = 0; LoadFileBuffer(m_sFilePath.c_str(), pBuffer, nLength); CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY)); if (pBuffer) { uint8_t* p = pBuffer; uint16_t wType = *((uint16_t*)p); p += sizeof(uint16_t); if (wType == (uint16_t)(('X' << 8) | 'F')) { uint16_t wVersion = *((uint16_t*)p); p += sizeof(uint16_t); ASSERT(wVersion <= 2); uint32_t dwCount = *((uint32_t*)p); p += sizeof(uint32_t); uint32_t dwSize = *((uint32_t*)p); p += sizeof(uint32_t); if (dwSize == nLength - sizeof(uint16_t) * 2 - sizeof(uint32_t) * 2) { for (int32_t i = 0, sz = dwCount; i < sz; i++) { if (p > pBuffer + nLength) break; uint32_t dwNameLen = *((uint32_t*)p); p += sizeof(uint32_t); if (p + dwNameLen > pBuffer + nLength) break; CFX_ByteString sEntry = CFX_ByteString(p, dwNameLen); p += sizeof(char) * dwNameLen; JS_GlobalDataType wDataType = static_cast<JS_GlobalDataType>(*((uint16_t*)p)); p += sizeof(uint16_t); switch (wDataType) { case JS_GlobalDataType::NUMBER: { double dData = 0; switch (wVersion) { case 1: { uint32_t dwData = *((uint32_t*)p); p += sizeof(uint32_t); dData = dwData; } break; case 2: { dData = *((double*)p); p += sizeof(double); } break; } SetGlobalVariableNumber(sEntry, dData); SetGlobalVariablePersistent(sEntry, true); } break; case JS_GlobalDataType::BOOLEAN: { uint16_t wData = *((uint16_t*)p); p += sizeof(uint16_t); SetGlobalVariableBoolean(sEntry, (bool)(wData == 1)); SetGlobalVariablePersistent(sEntry, true); } break; case JS_GlobalDataType::STRING: { uint32_t dwLength = *((uint32_t*)p); p += sizeof(uint32_t); if (p + dwLength > pBuffer + nLength) break; SetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength)); SetGlobalVariablePersistent(sEntry, true); p += sizeof(char) * dwLength; } break; case JS_GlobalDataType::NULLOBJ: { SetGlobalVariableNull(sEntry); SetGlobalVariablePersistent(sEntry, true); } case JS_GlobalDataType::OBJECT: break; } } } } FX_Free(pBuffer); } }
void CJS_GlobalData::LoadGlobalPersistentVariables() { uint8_t* pBuffer = NULL; int32_t nLength = 0; LoadFileBuffer(m_sFilePath.c_str(), pBuffer, nLength); CRYPT_ArcFourCryptBlock(pBuffer, nLength, JS_RC4KEY, sizeof(JS_RC4KEY)); if (pBuffer) { uint8_t* p = pBuffer; FX_WORD wType = *((FX_WORD*)p); p += sizeof(FX_WORD); // FX_WORD wTemp = (FX_WORD)(('X' << 8) | 'F'); if (wType == (FX_WORD)(('X' << 8) | 'F')) { FX_WORD wVersion = *((FX_WORD*)p); p += sizeof(FX_WORD); ASSERT(wVersion <= 2); FX_DWORD dwCount = *((FX_DWORD*)p); p += sizeof(FX_DWORD); FX_DWORD dwSize = *((FX_DWORD*)p); p += sizeof(FX_DWORD); if (dwSize == nLength - sizeof(FX_WORD) * 2 - sizeof(FX_DWORD) * 2) { for (int32_t i = 0, sz = dwCount; i < sz; i++) { if (p > pBuffer + nLength) break; FX_DWORD dwNameLen = *((FX_DWORD*)p); p += sizeof(FX_DWORD); if (p + dwNameLen > pBuffer + nLength) break; CFX_ByteString sEntry = CFX_ByteString(p, dwNameLen); p += sizeof(char) * dwNameLen; FX_WORD wDataType = *((FX_WORD*)p); p += sizeof(FX_WORD); switch (wDataType) { case JS_GLOBALDATA_TYPE_NUMBER: { double dData = 0; switch (wVersion) { case 1: { FX_DWORD dwData = *((FX_DWORD*)p); p += sizeof(FX_DWORD); dData = dwData; } break; case 2: { dData = *((double*)p); p += sizeof(double); } break; } SetGlobalVariableNumber(sEntry, dData); SetGlobalVariablePersistent(sEntry, TRUE); } break; case JS_GLOBALDATA_TYPE_BOOLEAN: { FX_WORD wData = *((FX_WORD*)p); p += sizeof(FX_WORD); SetGlobalVariableBoolean(sEntry, (bool)(wData == 1)); SetGlobalVariablePersistent(sEntry, TRUE); } break; case JS_GLOBALDATA_TYPE_STRING: { FX_DWORD dwLength = *((FX_DWORD*)p); p += sizeof(FX_DWORD); if (p + dwLength > pBuffer + nLength) break; SetGlobalVariableString(sEntry, CFX_ByteString(p, dwLength)); SetGlobalVariablePersistent(sEntry, TRUE); p += sizeof(char) * dwLength; } break; case JS_GLOBALDATA_TYPE_NULL: { SetGlobalVariableNull(sEntry); SetGlobalVariablePersistent(sEntry, TRUE); } } } } } FX_Free(pBuffer); } }