bool getMemory(void* dest, int* len, uint16_t inAddress, int readLength) { PDWriter* writer = s_session->currentWriter; PDWrite_eventBegin(writer, PDEventType_getMemory); PDWrite_u64(writer, "address_start", inAddress); PDWrite_u64(writer, "size", (uint32_t)readLength); PDWrite_eventEnd(writer); PDBinaryWriter_finalize(writer); Session_update(s_session); PDReader* reader = s_session->reader; PDBinaryReader_initStream(reader, PDBinaryWriter_getData(s_session->currentWriter), PDBinaryWriter_getSize(s_session->currentWriter)); uint32_t event; while ((event = PDRead_getEvent(reader)) != 0) { uint8_t* data; uint64_t dataSize; uint64_t address; if (event != PDEventType_setMemory) continue; assert_true(PDRead_findU64(reader, &address, "address", 0) & PDReadStatus_ok); assert_true((PDRead_findData(reader, (void**)&data, &dataSize, "data", 0) & PDReadStatus_typeMask) == PDReadType_data); memcpy(dest, data, dataSize); *len = (int)dataSize; return true; } return false; }
static void updateMemory(HexMemoryData* userData, PDReader* reader) { void* data; uint64_t size = 0; //printf("%s(%d) update memory\n", __FILE__, __LINE__); if (PDRead_findData(reader, &data, &size, "data", 0) == PDReadStatus_notFound) return; printf("%s(%d) update memory\n", __FILE__, __LINE__); free(userData->data); userData->data = (unsigned char*)malloc((size_t)size); memcpy(userData->data, data, (size_t)size); printf("updating data %p %d\n", userData->data, (int)size); userData->dataSize = (int)size; userData->data = (unsigned char*)data; }