コード例 #1
0
ファイル: DebugMgr.cpp プロジェクト: Arc0re/lithtech
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;
}
コード例 #2
0
ファイル: DebugMgr.cpp プロジェクト: Arc0re/lithtech
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;
}
コード例 #3
0
ファイル: wrappers.c プロジェクト: emlyn/chdk
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);
}