#include #include "D2Helpers.h" void ReadCurrentLevel(HANDLE d2Hnd) { DWORD read; DWORD addr; DWORD addr2; DWORD addr3; DWORD addr4; DWORD addr5; BYTE LevelArray[532]; ROOMTILE roomTile; ReadProcessMemory(d2Hnd, (LPCVOID) (DLLBASE_D2CLIENT + 0x11c1e0), &addr, sizeof(addr), NULL); printf("Pointer to Level struct is: %X.\n", addr); ReadProcessMemory(d2Hnd, (LPCVOID) (addr + 0x2c), &addr2, 4, &read); printf("Read %i bytes.\n", read); ReadProcessMemory(d2Hnd, (LPCVOID)(addr2 + 0x1c), &addr3, 4, &read); printf("Read %i bytes.\n", read); ReadProcessMemory(d2Hnd, (LPCVOID)(addr3 + 0x38), &addr4, 4, &read); printf("Read %i bytes.\n", read); ReadProcessMemory(d2Hnd, (LPCVOID)(addr4 + 0x1c), &addr5, 4, &read); printf("Read %i bytes : %X\n", read, addr5); ReadProcessMemory(d2Hnd, (LPCVOID)addr5, LevelArray, sizeof(LevelArray), &read); printf("Read %i bytes.\n", read); LEVEL* currentLevel = (LEVEL*)LevelArray; printf("Level Structure:\n _1: %u\n xPos: %u\nyPos: %u\nSizeX: %u\nSizeY: %u\nLevelNo: %u\n", currentLevel->_1, currentLevel->dwPosX, currentLevel->dwPosY, currentLevel->dwSizeX, currentLevel->dwSizeY, currentLevel->dwLevelNo); BYTE Room2Array[239]; ReadProcessMemory(d2Hnd, (LPCVOID)currentLevel->pRoom2First, Room2Array, sizeof(Room2Array), &read); printf("Read %i bytes.\n", read); ROOM2* room2 = (ROOM2*)Room2Array; printf("xPos: %u, yPos: %u\n", room2->dwPosX, room2->dwPosY); printf("PreSetType: %u\n", room2->dwPresetType); BYTE RoomTile[16]; ReadProcessMemory(d2Hnd, (LPCVOID)room2->pRoomTiles, RoomTile, sizeof(RoomTile), &read); printf("Read %i bytes.\n", read); ROOMTILE* roomtile = (ROOMTILE*)RoomTile; printf("RoomTile structure:\n_1 = %u\npRoom2 = %u\npNext = %u\nnNum = %u\n", roomtile->_1, roomtile->pRoom2, roomtile->pNext, roomtile->nNum); //Room1 Info isn't all that useful most of the time. /* BYTE Room1Array[128]; ReadProcessMemory(d2Hnd, (LPCVOID)room2->pRoom1, Room1Array, sizeof(Room1Array), &read); printf("Read %i bytes.\n", read); ROOM1* room1 = (ROOM1*)Room1Array; printf("XStart: %u, YStart: %u\nXSize: %u, YSize: %u\n", room1->dwXStart, room1->dwYStart, room1->dwXSize, room1->dwYSize); */ } void ReadControls(HANDLE d2Hnd) { DWORD read; DWORD* addr; BYTE ControlArray[0x264]; ReadProcessMemory(d2Hnd, (LPCVOID)(DLLBASE_D2WIN + 0x20488), &addr, sizeof(addr), &read); printf("Read %i bytes.\n", read); CONTROL* control = ReadControl(d2Hnd, addr); printf("Control Info:\nType: %u\nxPos: %u\n yPos: %u\nControl Text: %s\n", control->dwType, control->dwPosX, control->dwPosY, control->wText); for (int i = 0; control->pNext != 0; i++) { control = ReadControl(d2Hnd, control->pNext); printf("Control Info:\nType: %u\nxPos: %u\n yPos: %u\n", control->dwType, control->dwPosX, control->dwPosY); for (int i = 0; control->wText[i] != 0; i++) { printf("%c", control->wText[i]); } printf("\n"); } } CONTROL* ReadControl(HANDLE d2Hnd, DWORD* pControl) { DWORD read; BYTE ControlArray[0x264]; ReadProcessMemory(d2Hnd, (LPCVOID)(pControl), ControlArray, sizeof(ControlArray), &read); printf("Read %i bytes.\n", read); return (CONTROL*)ControlArray; }