Exemplo n.º 1
0
    bool AVMPI_getFunctionNameFromPC(uintptr_t pc, char *buffer, size_t bufferSize)
    {
#ifdef UNDER_CE
        (void)pc;
        (void)buffer;
        (void)bufferSize;
        return false;
#else

        if(!InitDbgHelp())
            return false;

        // gleaned from IMAGEHLP_SYMBOL64 docs
        IMAGEHLP_SYMBOL64 *pSym = (IMAGEHLP_SYMBOL64 *) alloca(sizeof(IMAGEHLP_SYMBOL64) + MaxNameLength);
        pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
        pSym->MaxNameLength = MaxNameLength;

        DWORD64 offsetFromSymbol;
        if(!g_DbgHelpDll.m_SymGetSymFromAddr64 ||
            !(*g_DbgHelpDll.m_SymGetSymFromAddr64)(GetCurrentProcess(), pc, &offsetFromSymbol, pSym)) {
                return false;
        }

        StringCchPrintfA(buffer, bufferSize, "%s", pSym->Name);
        //printf("%s\n", pSym->Name);
        return true;

#endif //UNDER_CE
    }
Exemplo n.º 2
0
	bool GetLoadedModules(char *&buf, size_t &size)
	{
		EnumBuf e;
		e.bufPtr = buf;
		e.size = 0;
		
		if(buf)
		{
			buf[0] = 'W';
			buf[1] = 'N';
			buf[2] = '3';
			buf[3] = '2';
			buf[4] = 'C';
			buf[5] = 'A';
			buf[6] = 'L';
			buf[7] = 'L';

			e.bufPtr += 8;
		}
		
		e.size += 8;

		bool inited = InitDbgHelp();

		if(inited)
			dynSymEnumerateModules64W(GetCurrentProcess(), &EnumModule, &e);

		size = e.size;

		return true;
	}
Exemplo n.º 3
0
Win32Callstack::Win32Callstack()
{
	bool ret = InitDbgHelp();

	if(ret && renderdocBase != NULL)
		Collect();
}
Exemplo n.º 4
0
    bool AVMPI_getFileAndLineInfoFromPC(uintptr_t pc, char *filenameBuffer, size_t bufferSize, uint32_t* lineNumber)
    {
#ifdef UNDER_CE
        (void)pc;
        (void)lineNumber;
        (void)filenameBuffer;
        (void)bufferSize;

        return false;
#else
        if(!InitDbgHelp())
            return false;

        // gleaned from IMAGEHLP_SYMBOL64 docs
        IMAGEHLP_SYMBOL64 *pSym = (IMAGEHLP_SYMBOL64 *) alloca(sizeof(IMAGEHLP_SYMBOL64) + MaxNameLength);
        pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
        pSym->MaxNameLength = MaxNameLength;

        DWORD64 offsetFromSymbol;
        if(!g_DbgHelpDll.m_SymGetSymFromAddr64 ||
            !(*g_DbgHelpDll.m_SymGetSymFromAddr64)(GetCurrentProcess(), pc, &offsetFromSymbol, pSym)) {
                return false;
        }

        // get line
        IMAGEHLP_LINE64 line;
        VMPI_memset(&line, 0, sizeof(IMAGEHLP_LINE64));
        line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
        DWORD offsetFromLine;
        if(!g_DbgHelpDll.m_SymGetLineFromAddr64 ||
            !(*g_DbgHelpDll.m_SymGetLineFromAddr64)(GetCurrentProcess(), pc, &offsetFromLine, &line)) {
                return false;
        }


        // success!
        char *fileName = line.FileName + VMPI_strlen(line.FileName);

        // skip everything up to last slash
        while(fileName > line.FileName && *fileName != '\\')
            fileName--;
        fileName++;

        StringCchPrintfA(filenameBuffer, bufferSize, "%s", fileName);
        *lineNumber = line.LineNumber;

        return true;
#endif // UNDER_CE
    }
Exemplo n.º 5
0
int main(int argc, char* argv[])
{
    HRESULT hr;
    CHAR szSpecFile[MAX_PATH];
    PSTR pszSpecFile;
    PEXPORT_DATA pExportData;
    HMODULE hmod;

    /* Check parameters */
    if ((argc < 2) || !strcmp(argv[1], "/?"))
    {
        printf("syntax: createspec <image file> [<spec file>]\n");
        return 0;
    }

    /* Check if we have a spec file name */
    if (argc > 2)
    {
        pszSpecFile = argv[2];
    }
    else
    {
        /* Create spec file name from image file name */
        PSTR pszStart = strrchr(argv[1], '\\');
        if (pszStart == 0)
            pszStart = argv[1];

        strcpy_s(szSpecFile, sizeof(szSpecFile), pszStart);
        strcat_s(szSpecFile, sizeof(szSpecFile), ".spec");
        pszSpecFile = szSpecFile;
    }

    /* Initialize dbghelp.dll */
    if (!InitDbgHelp())
    {
        error("Failed to init dbghelp!\n"
              "Make sure you have dbghelp.dll and symsrv.dll in the same folder.\n");
        return E_FAIL;
    }

    /* Load the file including symbols */
    printf("Loading symbols for '%s', please wait...\n", argv[1]);
    hmod = LoadModuleWithSymbols(argv[1]);
    if (hmod == NULL)
    {
        error("Failed to load module '%s'!", argv[1]);
        return E_FAIL;
    }

    /* Get the exports */
    hr = GetExportsFromFile(hmod, &pExportData);
    if (!SUCCEEDED(hr))
    {
        error("Failed to get exports: %lx\n", hr);
        return hr;
    }

    /* Get additional info from symbols */
    hr = ParseImageSymbols(hmod, pExportData);
    if (!SUCCEEDED(hr))
    {
        error("Failed to get symbol information: hr=%lx\n", hr);
    }

    /* Write the spec file */
    hr = CreateSpecFile(pszSpecFile, pExportData);

    printf("Spec file '%s' was successfully written.\n", szSpecFile);

    return hr;
}