added quick tool for fetching dlls of mdmps
authorDavid Anderson <dvander@alliedmods.net>
Sat May 24 06:48:35 2008 +0000 (2008-05-24)
changeset 207282d3186b9fa4
parent 2071 12d07494066e
child 2073 b93797ad729d
added quick tool for fetching dlls of mdmps
tools/fetchdlls/fetchdlls.sln
tools/fetchdlls/fetchdlls.vcproj
tools/fetchdlls/main.cpp
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/tools/fetchdlls/fetchdlls.sln	Sat May 24 06:48:35 2008 +0000
     1.3 @@ -0,0 +1,20 @@
     1.4 +
     1.5 +Microsoft Visual Studio Solution File, Format Version 10.00
     1.6 +# Visual Studio 2008
     1.7 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fetchdlls", "fetchdlls.vcproj", "{3C1C562B-1080-445F-A632-EA9EC9793389}"
     1.8 +EndProject
     1.9 +Global
    1.10 +	GlobalSection(SolutionConfigurationPlatforms) = preSolution
    1.11 +		Debug|Win32 = Debug|Win32
    1.12 +		Release|Win32 = Release|Win32
    1.13 +	EndGlobalSection
    1.14 +	GlobalSection(ProjectConfigurationPlatforms) = postSolution
    1.15 +		{3C1C562B-1080-445F-A632-EA9EC9793389}.Debug|Win32.ActiveCfg = Debug|Win32
    1.16 +		{3C1C562B-1080-445F-A632-EA9EC9793389}.Debug|Win32.Build.0 = Debug|Win32
    1.17 +		{3C1C562B-1080-445F-A632-EA9EC9793389}.Release|Win32.ActiveCfg = Release|Win32
    1.18 +		{3C1C562B-1080-445F-A632-EA9EC9793389}.Release|Win32.Build.0 = Release|Win32
    1.19 +	EndGlobalSection
    1.20 +	GlobalSection(SolutionProperties) = preSolution
    1.21 +		HideSolutionNode = FALSE
    1.22 +	EndGlobalSection
    1.23 +EndGlobal
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/tools/fetchdlls/fetchdlls.vcproj	Sat May 24 06:48:35 2008 +0000
     2.3 @@ -0,0 +1,196 @@
     2.4 +<?xml version="1.0" encoding="Windows-1252"?>
     2.5 +<VisualStudioProject
     2.6 +	ProjectType="Visual C++"
     2.7 +	Version="9.00"
     2.8 +	Name="fetchdlls"
     2.9 +	ProjectGUID="{3C1C562B-1080-445F-A632-EA9EC9793389}"
    2.10 +	RootNamespace="fetchdlls"
    2.11 +	Keyword="Win32Proj"
    2.12 +	TargetFrameworkVersion="196613"
    2.13 +	>
    2.14 +	<Platforms>
    2.15 +		<Platform
    2.16 +			Name="Win32"
    2.17 +		/>
    2.18 +	</Platforms>
    2.19 +	<ToolFiles>
    2.20 +	</ToolFiles>
    2.21 +	<Configurations>
    2.22 +		<Configuration
    2.23 +			Name="Debug|Win32"
    2.24 +			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
    2.25 +			IntermediateDirectory="$(ConfigurationName)"
    2.26 +			ConfigurationType="1"
    2.27 +			UseOfATL="0"
    2.28 +			CharacterSet="2"
    2.29 +			>
    2.30 +			<Tool
    2.31 +				Name="VCPreBuildEventTool"
    2.32 +			/>
    2.33 +			<Tool
    2.34 +				Name="VCCustomBuildTool"
    2.35 +			/>
    2.36 +			<Tool
    2.37 +				Name="VCXMLDataGeneratorTool"
    2.38 +			/>
    2.39 +			<Tool
    2.40 +				Name="VCWebServiceProxyGeneratorTool"
    2.41 +			/>
    2.42 +			<Tool
    2.43 +				Name="VCMIDLTool"
    2.44 +			/>
    2.45 +			<Tool
    2.46 +				Name="VCCLCompilerTool"
    2.47 +				Optimization="0"
    2.48 +				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
    2.49 +				MinimalRebuild="true"
    2.50 +				BasicRuntimeChecks="3"
    2.51 +				RuntimeLibrary="3"
    2.52 +				UsePrecompiledHeader="0"
    2.53 +				WarningLevel="3"
    2.54 +				DebugInformationFormat="4"
    2.55 +			/>
    2.56 +			<Tool
    2.57 +				Name="VCManagedResourceCompilerTool"
    2.58 +			/>
    2.59 +			<Tool
    2.60 +				Name="VCResourceCompilerTool"
    2.61 +			/>
    2.62 +			<Tool
    2.63 +				Name="VCPreLinkEventTool"
    2.64 +			/>
    2.65 +			<Tool
    2.66 +				Name="VCLinkerTool"
    2.67 +				AdditionalDependencies="dbghelp.lib"
    2.68 +				LinkIncremental="2"
    2.69 +				GenerateDebugInformation="true"
    2.70 +				SubSystem="1"
    2.71 +				TargetMachine="1"
    2.72 +			/>
    2.73 +			<Tool
    2.74 +				Name="VCALinkTool"
    2.75 +			/>
    2.76 +			<Tool
    2.77 +				Name="VCManifestTool"
    2.78 +			/>
    2.79 +			<Tool
    2.80 +				Name="VCXDCMakeTool"
    2.81 +			/>
    2.82 +			<Tool
    2.83 +				Name="VCBscMakeTool"
    2.84 +			/>
    2.85 +			<Tool
    2.86 +				Name="VCFxCopTool"
    2.87 +			/>
    2.88 +			<Tool
    2.89 +				Name="VCAppVerifierTool"
    2.90 +			/>
    2.91 +			<Tool
    2.92 +				Name="VCPostBuildEventTool"
    2.93 +			/>
    2.94 +		</Configuration>
    2.95 +		<Configuration
    2.96 +			Name="Release|Win32"
    2.97 +			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
    2.98 +			IntermediateDirectory="$(ConfigurationName)"
    2.99 +			ConfigurationType="1"
   2.100 +			CharacterSet="2"
   2.101 +			WholeProgramOptimization="1"
   2.102 +			>
   2.103 +			<Tool
   2.104 +				Name="VCPreBuildEventTool"
   2.105 +			/>
   2.106 +			<Tool
   2.107 +				Name="VCCustomBuildTool"
   2.108 +			/>
   2.109 +			<Tool
   2.110 +				Name="VCXMLDataGeneratorTool"
   2.111 +			/>
   2.112 +			<Tool
   2.113 +				Name="VCWebServiceProxyGeneratorTool"
   2.114 +			/>
   2.115 +			<Tool
   2.116 +				Name="VCMIDLTool"
   2.117 +			/>
   2.118 +			<Tool
   2.119 +				Name="VCCLCompilerTool"
   2.120 +				Optimization="2"
   2.121 +				EnableIntrinsicFunctions="true"
   2.122 +				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE"
   2.123 +				RuntimeLibrary="2"
   2.124 +				EnableFunctionLevelLinking="true"
   2.125 +				UsePrecompiledHeader="0"
   2.126 +				WarningLevel="3"
   2.127 +				DebugInformationFormat="3"
   2.128 +			/>
   2.129 +			<Tool
   2.130 +				Name="VCManagedResourceCompilerTool"
   2.131 +			/>
   2.132 +			<Tool
   2.133 +				Name="VCResourceCompilerTool"
   2.134 +			/>
   2.135 +			<Tool
   2.136 +				Name="VCPreLinkEventTool"
   2.137 +			/>
   2.138 +			<Tool
   2.139 +				Name="VCLinkerTool"
   2.140 +				AdditionalDependencies="dbghelp.lib"
   2.141 +				LinkIncremental="1"
   2.142 +				GenerateDebugInformation="true"
   2.143 +				SubSystem="1"
   2.144 +				OptimizeReferences="2"
   2.145 +				EnableCOMDATFolding="2"
   2.146 +				TargetMachine="1"
   2.147 +			/>
   2.148 +			<Tool
   2.149 +				Name="VCALinkTool"
   2.150 +			/>
   2.151 +			<Tool
   2.152 +				Name="VCManifestTool"
   2.153 +			/>
   2.154 +			<Tool
   2.155 +				Name="VCXDCMakeTool"
   2.156 +			/>
   2.157 +			<Tool
   2.158 +				Name="VCBscMakeTool"
   2.159 +			/>
   2.160 +			<Tool
   2.161 +				Name="VCFxCopTool"
   2.162 +			/>
   2.163 +			<Tool
   2.164 +				Name="VCAppVerifierTool"
   2.165 +			/>
   2.166 +			<Tool
   2.167 +				Name="VCPostBuildEventTool"
   2.168 +			/>
   2.169 +		</Configuration>
   2.170 +	</Configurations>
   2.171 +	<References>
   2.172 +	</References>
   2.173 +	<Files>
   2.174 +		<Filter
   2.175 +			Name="Source Files"
   2.176 +			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
   2.177 +			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
   2.178 +			>
   2.179 +			<File
   2.180 +				RelativePath=".\main.cpp"
   2.181 +				>
   2.182 +			</File>
   2.183 +		</Filter>
   2.184 +		<Filter
   2.185 +			Name="Header Files"
   2.186 +			Filter="h;hpp;hxx;hm;inl;inc;xsd"
   2.187 +			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
   2.188 +			>
   2.189 +		</Filter>
   2.190 +		<Filter
   2.191 +			Name="Resource Files"
   2.192 +			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
   2.193 +			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
   2.194 +			>
   2.195 +		</Filter>
   2.196 +	</Files>
   2.197 +	<Globals>
   2.198 +	</Globals>
   2.199 +</VisualStudioProject>
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/tools/fetchdlls/main.cpp	Sat May 24 06:48:35 2008 +0000
     3.3 @@ -0,0 +1,192 @@
     3.4 +#include <stdio.h>
     3.5 +#include <windows.h>
     3.6 +#include <DbgHelp.h>
     3.7 +
     3.8 +void mdmp_string(void *mdmp, RVA addr, char *buffer, size_t maxlength)
     3.9 +{
    3.10 +	int len;
    3.11 +	MINIDUMP_STRING *str;
    3.12 +
    3.13 +	str = (MINIDUMP_STRING *)((char *)mdmp + addr);
    3.14 +	len = WideCharToMultiByte(CP_UTF8, 
    3.15 +		0, 
    3.16 +		str->Buffer, 
    3.17 +		str->Length / sizeof(WCHAR), 
    3.18 +		buffer, 
    3.19 +		maxlength,
    3.20 +		NULL,
    3.21 +		NULL);
    3.22 +	buffer[len] = '\0';
    3.23 +}
    3.24 +
    3.25 +int find_revision(const char *version, MINIDUMP_MODULE *module, const char *name)
    3.26 +{
    3.27 +	FILE *fp;
    3.28 +	char msg[255];
    3.29 +	size_t i, len;
    3.30 +	char path[255];
    3.31 +	char buffer[3000];
    3.32 +	int last_revision;
    3.33 +
    3.34 +	len = _snprintf(path, sizeof(path), "%s", name);
    3.35 +	for (i = 0; i < len; i++)
    3.36 +	{
    3.37 +		if (path[i] == '\\')
    3.38 +		{
    3.39 +			path[i] = '/';
    3.40 +		}
    3.41 +	}
    3.42 +
    3.43 +	DeleteFile("_svnlog.txt");
    3.44 +	_snprintf(buffer, 
    3.45 +		sizeof(buffer),
    3.46 +		"svn log svn://svn.alliedmods.net/svnroot/Packages/sourcemod/sourcemod-%d.%d/windows/base/addons/sourcemod/%s > _svnlog.txt",
    3.47 +		(module->VersionInfo.dwFileVersionMS >> 16),
    3.48 +		(module->VersionInfo.dwFileVersionMS & 0xFFFF),
    3.49 +		path);
    3.50 +	system(buffer);
    3.51 +
    3.52 +	if ((fp = fopen("_svnlog.txt", "rt")) == NULL)
    3.53 +	{
    3.54 +		return -1;
    3.55 +	}
    3.56 +
    3.57 +	_snprintf(msg, 
    3.58 +		sizeof(msg), 
    3.59 +		"sourcemod-%s",
    3.60 +		version);
    3.61 +
    3.62 +	while (fgets(buffer, sizeof(buffer), fp) != NULL)
    3.63 +	{
    3.64 +		if (buffer[0] == 'r')
    3.65 +		{
    3.66 +			last_revision = atoi(&buffer[1]);
    3.67 +		}
    3.68 +		else if (strstr(buffer, msg) != NULL)
    3.69 +		{
    3.70 +			fclose(fp);
    3.71 +
    3.72 +			_snprintf(buffer,
    3.73 +				sizeof(buffer),
    3.74 +				"svn export -q -r %d svn://svn.alliedmods.net/svnroot/Packages/sourcemod/sourcemod-%d.%d/windows/base/addons/sourcemod/%s",
    3.75 +				last_revision,
    3.76 +				(module->VersionInfo.dwFileVersionMS >> 16),
    3.77 +				(module->VersionInfo.dwFileVersionMS & 0xFFFF),
    3.78 +				path);
    3.79 +			system(buffer);
    3.80 +
    3.81 +			return last_revision;
    3.82 +		}
    3.83 +	}
    3.84 +
    3.85 +	fclose(fp);
    3.86 +
    3.87 +	return -1;
    3.88 +}
    3.89 +
    3.90 +int main(int argc, char **argv)
    3.91 +{
    3.92 +	int rev;
    3.93 +	ULONG32 m;
    3.94 +	LPVOID mdmp;
    3.95 +	HANDLE hFile;
    3.96 +	const char *name;
    3.97 +	ULONG stream_size;
    3.98 +	char name_buf[255];
    3.99 +	HANDLE hFileMapping;
   3.100 +	MINIDUMP_MODULE *module;
   3.101 +	MINIDUMP_DIRECTORY *dir;
   3.102 +	MINIDUMP_MODULE_LIST *modules;
   3.103 +
   3.104 +	if (argc < 3)
   3.105 +	{
   3.106 +		fprintf(stderr, "Usage: <build> <mdmp>\n");
   3.107 +		exit(-1);
   3.108 +	}
   3.109 +
   3.110 +	if ((hFile = CreateFile(argv[2],
   3.111 +			GENERIC_READ,
   3.112 +			FILE_SHARE_READ,
   3.113 +			NULL,
   3.114 +			OPEN_EXISTING,
   3.115 +			FILE_ATTRIBUTE_NORMAL,
   3.116 +			NULL))
   3.117 +		== INVALID_HANDLE_VALUE)
   3.118 +	{
   3.119 +		fprintf(stderr, "Could not open file (error %d)\n", GetLastError());
   3.120 +		exit(-1);
   3.121 +	}
   3.122 +
   3.123 +	hFileMapping = CreateFileMapping(
   3.124 +		hFile,
   3.125 +		NULL,
   3.126 +		PAGE_READONLY,
   3.127 +		0,
   3.128 +		0,
   3.129 +		NULL);
   3.130 +	if (hFileMapping == NULL)
   3.131 +	{
   3.132 +		fprintf(stderr, "Could not open file mapping (error %d)\n", GetLastError());
   3.133 +		CloseHandle(hFile);
   3.134 +		exit(-1);
   3.135 +	}
   3.136 +
   3.137 +	mdmp = MapViewOfFile(hFileMapping,
   3.138 +		FILE_MAP_READ,
   3.139 +		0,
   3.140 +		0,
   3.141 +		0);
   3.142 +	if (mdmp == NULL)
   3.143 +	{
   3.144 +		fprintf(stderr, "Could not create map view (error %d)\n", GetLastError());
   3.145 +		CloseHandle(hFileMapping);
   3.146 +		CloseHandle(hFile);
   3.147 +		exit(-1);
   3.148 +	}
   3.149 +
   3.150 +	if (!MiniDumpReadDumpStream(mdmp,
   3.151 +			ModuleListStream,
   3.152 +			&dir,
   3.153 +			(void **)&modules,
   3.154 +			&stream_size))
   3.155 +	{
   3.156 +		fprintf(stderr, "Could not read the module list stream.\n");
   3.157 +		UnmapViewOfFile(mdmp);
   3.158 +		CloseHandle(hFileMapping);
   3.159 +		CloseHandle(hFile);
   3.160 +	}
   3.161 +
   3.162 +	for (m = 0; m < modules->NumberOfModules; m++)
   3.163 +	{
   3.164 +		module = &modules->Modules[m];
   3.165 +
   3.166 +		mdmp_string(mdmp, module->ModuleNameRva, name_buf, sizeof(name_buf));
   3.167 +
   3.168 +		if ((name = strstr(name_buf, "sourcemod\\")) != NULL)
   3.169 +		{
   3.170 +			name += 10;
   3.171 +			fprintf(stdout, 
   3.172 +				"looking for: %s (%d.%d.%d.%d of build %s)... ", 
   3.173 +				name, 
   3.174 +				(module->VersionInfo.dwFileVersionMS >> 16),
   3.175 +				(module->VersionInfo.dwFileVersionMS & 0xFFFF),
   3.176 +				(module->VersionInfo.dwFileVersionLS >> 16),
   3.177 +				(module->VersionInfo.dwFileVersionLS & 0xFFFF),
   3.178 +				argv[1]
   3.179 +				);
   3.180 +			fflush(stdout);
   3.181 +			if ((rev = find_revision(argv[1], module, name)) == -1)
   3.182 +			{
   3.183 +				fprintf(stdout, "not found :(\n");
   3.184 +				continue;
   3.185 +			}
   3.186 +			fprintf(stdout, "downloaded! (pkgrev %d)\n", rev);
   3.187 +		}
   3.188 +	}
   3.189 +
   3.190 +	UnmapViewOfFile(mdmp);
   3.191 +	CloseHandle(hFileMapping);
   3.192 +	CloseHandle(hFile);
   3.193 +
   3.194 +	return 0;
   3.195 +}