BOOL CDebugMgr::FindSymbol(const char* szMap, DWORD dwSection, DWORD dwOffset, char* szSymbol, char* szObject) { HANDLE hFile = CreateFile(szMap, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if ( INVALID_HANDLE_VALUE == hFile ) return FALSE; BOOL bReturn = FALSE; DWORD cBytesRead = 0; DWORD cBytesToRead = GetFileSize(hFile, NULL); char* szBuffer = debug_newa(char, cBytesToRead); char* pchBuffer = szBuffer; ReadFile(hFile, szBuffer, cBytesToRead, &cBytesRead, NULL); if ( cBytesToRead != cBytesRead ) { bReturn = FALSE; goto Done; } pchBuffer = _strstr(pchBuffer, "Lib:Object", szBuffer+cBytesToRead); pchBuffer = _strchr(pchBuffer, '\n', szBuffer+cBytesToRead)+1; pchBuffer = _strchr(pchBuffer, '\n', szBuffer+cBytesToRead)+1; while ( *pchBuffer != '\n' ) { pchBuffer = _strchr(pchBuffer, ' ', szBuffer+cBytesToRead)+1; // Parse in the 000x:0000xxxx section:offset char szSection[16]; lstrcpyn(szSection, pchBuffer, 5); char szOffset[16]; lstrcpyn(szOffset, pchBuffer+6, 8); // If we're in the right section and passed the offset, return the last symbol we read if ( _str2dword(szSection) == dwSection && _str2dword(szOffset) > dwOffset ) { bReturn = TRUE; goto Done; } // Get the symbol pchBuffer = pchBuffer + 20; char* pchSymbolEnd = _strchr(pchBuffer, ' ', szBuffer+cBytesToRead); lstrcpyn(szSymbol, pchBuffer, pchSymbolEnd - pchBuffer + 1); // Get the object char* pchEnd; pchBuffer = _strchr(pchBuffer, '.', szBuffer+cBytesToRead)+1; pchEnd = pchBuffer-1; while ( *(pchBuffer-1) != ' ' && *(pchBuffer-1) != ':' ) { pchBuffer--; } if ( *(pchBuffer-1) == ':' ) { pchEnd = pchBuffer-1; while ( *(pchBuffer-1) != ' ' ) { pchBuffer--; } } lstrcpyn(szObject, pchBuffer, pchEnd - pchBuffer + 1); // Next line pchBuffer = _strchr(pchBuffer, '\n', szBuffer+cBytesToRead)+1; } Done: CloseHandle(hFile); delete szBuffer; return bReturn; }
BOOL CDebugMgr::FindSourceLine(const char* szMap, const char* szObject, DWORD dwSection, DWORD dwOffset, char* szSource, char* szLine) { szSource[0] = 0; szLine[0] = 0; HANDLE hFile = CreateFile(szMap, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if ( INVALID_HANDLE_VALUE == hFile ) return FALSE; BOOL bReturn = FALSE; DWORD cBytesRead = 0; DWORD cBytesToRead = GetFileSize(hFile, NULL); DWORD dwNearestSLOffset = 0xFFFFFFFF; char* szBuffer = debug_newa(char, cBytesToRead); char* pchBuffer = szBuffer; ReadFile(hFile, szBuffer, cBytesToRead, &cBytesRead, NULL); if ( cBytesToRead != cBytesRead ) { bReturn = FALSE; goto Done; } // Find start of line numbers pchBuffer = _strstr(pchBuffer, "Line numbers for ", szBuffer+cBytesToRead); while ( pchBuffer ) { pchBuffer = _strchr(pchBuffer, '(', szBuffer+cBytesToRead)-1; // Find the end of the object name while ( *pchBuffer != '.' ) { pchBuffer--; } char* pchEnd = pchBuffer; // Find the beginning of the object name while ( *(pchBuffer-1) != '\\' ) { pchBuffer--; } char szSLObject[256]; lstrcpyn(szSLObject, pchBuffer, pchEnd - pchBuffer + 1); // We've got our object name, does it match? if ( !lstrcmpi(szObject, szSLObject) ) { pchBuffer = _strchr(pchBuffer, '(', szBuffer+cBytesToRead) + 1; pchEnd = _strchr(pchBuffer, ')', szBuffer+cBytesToRead); char szSLSource[256]; lstrcpyn(szSLSource, pchBuffer, pchEnd - pchBuffer + 1); // Now go to the line info pchBuffer = _strchr(pchBuffer, '\n', szBuffer+cBytesToRead)+1; BOOL bReadingLines = TRUE; while ( bReadingLines ) { if ( !pchBuffer ) { goto Done; } while ( *pchBuffer == ' ' || *pchBuffer == '\r' || *pchBuffer == '\n' && (pchBuffer < szBuffer+cBytesToRead) ) { if ( (pchBuffer >= szBuffer+cBytesToRead) ) { bReadingLines = FALSE; break; } pchBuffer++; } if ( *pchBuffer == 'L' ) { bReadingLines = FALSE; } if ( !bReadingLines ) break; pchEnd = _strchr(pchBuffer, ' '); char szSLLine[256]; lstrcpyn(szSLLine, pchBuffer, pchEnd - pchBuffer + 1); pchEnd = _strchr(pchBuffer, ':'); pchBuffer = pchEnd-4; char szSLSection[16]; DWORD dwSLSection; lstrcpyn(szSLSection, pchBuffer, pchEnd - pchBuffer + 1); dwSLSection = _str2dword(szSLSection); pchBuffer = pchEnd+1; pchEnd = _strchr(pchBuffer, ' '); char* pchEnd2 = _strchr(pchBuffer, '\r', szBuffer+cBytesToRead); if ( pchEnd > pchEnd2 ) { pchEnd = pchEnd2; } char szSLOffset[16]; DWORD dwSLOffset; lstrcpyn(szSLOffset, pchBuffer, pchEnd - pchBuffer + 1); dwSLOffset = _str2dword(szSLOffset); // It's got to be in the same section if ( dwSection == dwSLSection ) { // If this offset is above the desired one, and closer than the closest one we've seen so far, // then it is our new potential source/line match if ( dwSLOffset <= dwOffset && (dwOffset - dwSLOffset) < (dwOffset - dwNearestSLOffset) ) { dwNearestSLOffset = dwSLOffset; lstrcpy(szSource, szSLSource); lstrcpy(szLine, szSLLine); bReturn = TRUE; } else if ( dwSLOffset > dwOffset ) { // Offset will never decrease, so just skip to next source/line section bReadingLines = FALSE; } } else if ( dwSLSection > dwSection ) { // Section will never decrease, so just skip to next source/line section bReadingLines = FALSE; } pchBuffer = pchEnd; } } // Get next source/line entry if ( pchBuffer ) { pchBuffer = _strstr(pchBuffer, "Line numbers for ", szBuffer+cBytesToRead); } } Done: CloseHandle(hFile); delete szBuffer; return bReturn; }
int my_some_f(char *s, int x){ char *f; f=_strstr(s, DNG_EXT_FROM); if (f) _memcpy(f, DNG_EXT_TO, sizeof(DNG_EXT_TO)-1); return default_some_f(s, x); }