rtoss - Blame information for rev 342

Subversion Repositories:
Rev:
Rev Author Line No. Line
280 roytam 1 #include "windows.h"
2 #include "ProcessHandler.h"
3 #include "VisualBoyHandler.h"
4  
5 #ifndef lstrncmp
6 #ifndef UNICODE
7 #define lstrncmp strncmp
8 #else
9 #define lstrncmp wcsncmp
10 #endif
11 #endif
12  
13 ///////////////////////////////////////////////////////////////////////////////////////////////////
14 DWORD_PTR CVisualBoyHandler::CheckPtrStruct(LPCVOID lpBuffer, DWORD_PTR dwSize)
15 {
16         DWORD_PTR       dwOffset;
17         BOOL            bFound = FALSE;
18  
19         dwSize -= sizeof(VBA_PtrStruct);
20         for(dwOffset = 0; dwOffset <= dwSize; dwOffset += sizeof(DWORD))
21         {
22                 CONST VBA_PtrStruct *pps =
23                         reinterpret_cast<CONST VBA_PtrStruct *>(reinterpret_cast<LPCBYTE>(lpBuffer) + dwOffset);
24  
25                 if(     pps->peBIOS.dwSize              == 0x00003FFF &&
26                         pps->peWRAM.dwSize              == 0x0003FFFF &&
27                         pps->peIRAM.dwSize              == 0x00007FFF &&
28         //              pps->peIO.dwSize                == 0x000003FF &&        // doesn't follow GBA Specification
29                         pps->pePalette.dwSize   == 0x000003FF &&
30         //              pps->peVRAM.dwSize              == 0x0001FFFF &&        // doesn't follow GBA Specification
31                         pps->peOAM.dwSize               == 0x000003FF &&
32                         pps->peROM.dwSize               >= 0x01FFFFFF)
33                 {
34                         bFound = TRUE;
35                         break;
36                 }
37         }
38  
39         return bFound ? dwOffset : (-1);
40 }
41  
42 ///////////////////////////////////////////////////////////////////////////////////////////////////
43 #define SEARCH_START    0x00500000
44 #define SEARCH_RANGE    0x00080000      // 512KB
45 #define SEARCH_GUARD    0x00000100
46 #define SEARCH_COUNT    8                       // 8 x 512KB
47  
48 CVisualBoyHandler::CVisualBoyHandler(VOID)
49 {
50         m_dwAddressOfPtrStruct = NULL;
51 }
52  
53 CVisualBoyHandler::~CVisualBoyHandler(VOID)
54 {
55 }
56  
57 BOOL CVisualBoyHandler::SearchForPtrStruct(VOID)
58 {
59         BOOL            bResult = IsValid();
60         DWORD_PTR       dwCount, dwStartAddress, dwBufferSize, dwOffset;
61  
62         if(bResult && m_dwAddressOfPtrStruct == NULL)
63         {
64                 LPBYTE  pbBuffer = new BYTE[SEARCH_RANGE + SEARCH_GUARD];
65                 if(pbBuffer != NULL)
66                 {
67                         for(dwCount = 0; dwCount < SEARCH_COUNT; ++dwCount)
68                         {
69                                 // steamlessly searching
70                                 if(dwCount == 0)
71                                 {
72                                         dwStartAddress = SEARCH_START + dwCount * SEARCH_RANGE;
73                                         dwBufferSize = SEARCH_RANGE;
74                                 }
75                                 else
76                                 {
77                                         dwStartAddress = SEARCH_START + dwCount * SEARCH_RANGE - SEARCH_GUARD;
78                                         dwBufferSize = SEARCH_RANGE + SEARCH_GUARD;
79                                 }
80  
81                                 bResult = CProcessHandler::Read(dwStartAddress, dwBufferSize, pbBuffer);
82  
83                                 if(bResult)
84                                 {
85                                         dwOffset = CheckPtrStruct(pbBuffer, dwBufferSize);
86                                         if(dwOffset < dwBufferSize)
87                                         {
88                                                 m_dwAddressOfPtrStruct = dwStartAddress + dwOffset;
89                                                 break;
90                                         }
91                                 }
92                         }
93  
94                         delete []pbBuffer;
95                 }
96         }
97  
98         if(bResult && m_dwAddressOfPtrStruct != NULL)
99         {
100                 bResult = CProcessHandler::Read(m_dwAddressOfPtrStruct, sizeof(m_PtrStruct), &m_PtrStruct);
101         }
102  
103         if(!bResult || m_dwAddressOfPtrStruct == NULL)
104         {
105                 Close();
106                 m_dwAddressOfPtrStruct = NULL;
107         }
108  
109         return bResult;
110 }
111  
112 BOOL CALLBACK CVisualBoyHandler::EnumVBAWindowProc(HWND hWnd, LPARAM lParam)
113 {
114         static CONST TCHAR      szName[] = TEXT("VisualBoyAdvance");
115         static CONST DWORD      cchNameLength = sizeof(szName) / sizeof(szName[0]);
116  
117         static CONST TCHAR      szNameSpeed[] = TEXT("VisualBoyAdvance-nnn%");
118         static CONST DWORD      cchNameSpeedLength = sizeof(szNameSpeed) / sizeof(szNameSpeed[0]);
119  
120         TCHAR   szWindowName[cchNameSpeedLength];
121         DWORD   cchWindowName;
122         BOOL    bContinue = TRUE;
123  
124         cchWindowName = GetWindowText(hWnd, szWindowName, cchNameSpeedLength);
125  
126         if(cchWindowName >= cchNameLength - 1)
127         {
128                 if(lstrncmp(szWindowName, szName, cchNameLength - 1) == 0)
129                 {
130                         if(cchWindowName >= cchNameLength)
131                         {
132                                 if(szWindowName[cchNameLength - 1] == TEXT('-'))
133                                 {
134                                         bContinue = FALSE;
135                                 }
136                         }
137                         else
138                         {
139                                 bContinue = FALSE;
140                         }
141                 }
282 roytam 142                 /* VBA-M */
143                 else if(lstrncmp(szWindowName+1, szName, cchNameLength - 1) == 0)
144                 {
145                         if(cchWindowName >= cchNameLength)
146                         {
147                                 if(szWindowName[cchNameLength] == TEXT('-'))
148                                 {
149                                         bContinue = FALSE;
150                                 }
151                         }
152                         else
153                         {
154                                 bContinue = FALSE;
155                         }
156                 }
280 roytam 157         }
158  
159         if(bContinue == FALSE)
160         {
161                 *reinterpret_cast<HWND *>(lParam) = hWnd;
162         }
163  
164         return bContinue;
165 }
166  
167 BOOL CVisualBoyHandler::Attach(VOID)
168 {
169         BOOL    bResult;
170         HWND    hWnd = NULL;
171  
172         m_dwAddressOfPtrStruct = NULL;
173         bResult = EnumWindows(EnumVBAWindowProc, reinterpret_cast<LPARAM>(&hWnd));
174  
175         if(hWnd == NULL)
176         {
177                 bResult = FALSE;
178         }
179         else
180         {
181                 bResult = CProcessHandler::AttachByWindowHandle(hWnd);
182         }
183  
184         if(bResult)
185         {
186                 bResult = SearchForPtrStruct();
187         }
188  
189         return bResult;
190 }
191  
192 BOOL CVisualBoyHandler::RefreshAddressList(VOID)
193 {
194         BOOL    bResult = IsValid();
195  
196         if(!bResult)
197         {
198                 bResult = Attach();
199         }
200         else
201         {
202                 bResult = SearchForPtrStruct();
203         }
204  
205         return bResult;
206 }
207  
208 BOOL CVisualBoyHandler::Read(DWORD_PTR dwBaseAddr, DWORD_PTR dwSize, LPVOID lpBuffer)
209 {
210         CONST VBA_PtrEntry *ppe = reinterpret_cast<CONST VBA_PtrEntry *>(&m_PtrStruct);
211         DWORD_PTR       dwIndex = (dwBaseAddr & 0x0F000000) >> 24;
342 roytam 212         DWORD_PTR       dwOffset = dwBaseAddr & 0x00FFFFFF;
280 roytam 213  
214         if(dwOffset + dwSize <= ppe[dwIndex].dwSize)
215         {
216                 return CProcessHandler::Read(ppe[dwIndex].dwPointer + dwOffset, dwSize, lpBuffer);
217         }
218         else
219         {
220                 return FALSE;
221         }
222 }
223  
224 BOOL CVisualBoyHandler::ReadRom(DWORD_PTR dwBaseAddr, DWORD_PTR dwSize, LPVOID lpBuffer)
225 {
226         CONST VBA_PtrEntry *ppe = reinterpret_cast<CONST VBA_PtrEntry *>(&m_PtrStruct);
227         DWORD_PTR       dwIndex = 0x08000000 >> 24;     // rom
341 roytam 228         DWORD_PTR       dwOffset = dwBaseAddr & 0x01FFFFFF;
280 roytam 229  
230         if(dwOffset + dwSize <= ppe[dwIndex].dwSize)
231         {
232                 return CProcessHandler::Read(ppe[dwIndex].dwPointer + dwOffset, dwSize, lpBuffer);
233         }
234         else
235         {
236                 return FALSE;
237         }
238 }
239  
240 BOOL CVisualBoyHandler::Write(DWORD_PTR dwBaseAddr, DWORD_PTR dwSize, LPCVOID lpBuffer)
241 {
242         CONST VBA_PtrEntry *ppe = reinterpret_cast<CONST VBA_PtrEntry *>(&m_PtrStruct);
243         DWORD_PTR       dwIndex = (dwBaseAddr & 0x0F000000) >> 24;
342 roytam 244         DWORD_PTR       dwOffset = dwBaseAddr & 0x00FFFFFF;
280 roytam 245  
246         if(dwOffset + dwSize <= ppe[dwIndex].dwSize)
247         {
248                 return CProcessHandler::Write(ppe[dwIndex].dwPointer + dwOffset, dwSize, lpBuffer);
249         }
250         else
251         {
252                 return FALSE;
253         }
254 }
255  
256 BOOL CVisualBoyHandler::PtrRead(DWORD_PTR dwPtrOfBaseAddr, DWORD_PTR dwOffset, DWORD_PTR dwSize, LPVOID lpBuffer)
257 {
258         DWORD   dwBaseAddr;
259         BOOL    bResult;
260  
261         bResult = Read(dwPtrOfBaseAddr, sizeof(dwBaseAddr), &dwBaseAddr);
262         if(bResult)
263         {
264                 bResult = Read(dwBaseAddr + dwOffset, dwSize, lpBuffer);
265         }
266  
267         return bResult;
268 }
269  
270 BOOL CVisualBoyHandler::PtrWrite(DWORD_PTR dwPtrOfBaseAddr, DWORD_PTR dwOffset, DWORD_PTR dwSize, LPCVOID lpBuffer)
271 {
272         DWORD   dwBaseAddr;
273         BOOL    bResult;
274  
275         bResult = Read(dwPtrOfBaseAddr, sizeof(dwBaseAddr), &dwBaseAddr);
276         if(bResult)
277         {
278                 bResult = Write(dwBaseAddr + dwOffset, dwSize, lpBuffer);
279         }
280  
281         return bResult;
282 }