tools/fetchdlls/main.cpp
changeset 2072 82d3186b9fa4
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/tools/fetchdlls/main.cpp	Sat May 24 06:48:35 2008 +0000
     1.3 @@ -0,0 +1,192 @@
     1.4 +#include <stdio.h>
     1.5 +#include <windows.h>
     1.6 +#include <DbgHelp.h>
     1.7 +
     1.8 +void mdmp_string(void *mdmp, RVA addr, char *buffer, size_t maxlength)
     1.9 +{
    1.10 +	int len;
    1.11 +	MINIDUMP_STRING *str;
    1.12 +
    1.13 +	str = (MINIDUMP_STRING *)((char *)mdmp + addr);
    1.14 +	len = WideCharToMultiByte(CP_UTF8, 
    1.15 +		0, 
    1.16 +		str->Buffer, 
    1.17 +		str->Length / sizeof(WCHAR), 
    1.18 +		buffer, 
    1.19 +		maxlength,
    1.20 +		NULL,
    1.21 +		NULL);
    1.22 +	buffer[len] = '\0';
    1.23 +}
    1.24 +
    1.25 +int find_revision(const char *version, MINIDUMP_MODULE *module, const char *name)
    1.26 +{
    1.27 +	FILE *fp;
    1.28 +	char msg[255];
    1.29 +	size_t i, len;
    1.30 +	char path[255];
    1.31 +	char buffer[3000];
    1.32 +	int last_revision;
    1.33 +
    1.34 +	len = _snprintf(path, sizeof(path), "%s", name);
    1.35 +	for (i = 0; i < len; i++)
    1.36 +	{
    1.37 +		if (path[i] == '\\')
    1.38 +		{
    1.39 +			path[i] = '/';
    1.40 +		}
    1.41 +	}
    1.42 +
    1.43 +	DeleteFile("_svnlog.txt");
    1.44 +	_snprintf(buffer, 
    1.45 +		sizeof(buffer),
    1.46 +		"svn log svn://svn.alliedmods.net/svnroot/Packages/sourcemod/sourcemod-%d.%d/windows/base/addons/sourcemod/%s > _svnlog.txt",
    1.47 +		(module->VersionInfo.dwFileVersionMS >> 16),
    1.48 +		(module->VersionInfo.dwFileVersionMS & 0xFFFF),
    1.49 +		path);
    1.50 +	system(buffer);
    1.51 +
    1.52 +	if ((fp = fopen("_svnlog.txt", "rt")) == NULL)
    1.53 +	{
    1.54 +		return -1;
    1.55 +	}
    1.56 +
    1.57 +	_snprintf(msg, 
    1.58 +		sizeof(msg), 
    1.59 +		"sourcemod-%s",
    1.60 +		version);
    1.61 +
    1.62 +	while (fgets(buffer, sizeof(buffer), fp) != NULL)
    1.63 +	{
    1.64 +		if (buffer[0] == 'r')
    1.65 +		{
    1.66 +			last_revision = atoi(&buffer[1]);
    1.67 +		}
    1.68 +		else if (strstr(buffer, msg) != NULL)
    1.69 +		{
    1.70 +			fclose(fp);
    1.71 +
    1.72 +			_snprintf(buffer,
    1.73 +				sizeof(buffer),
    1.74 +				"svn export -q -r %d svn://svn.alliedmods.net/svnroot/Packages/sourcemod/sourcemod-%d.%d/windows/base/addons/sourcemod/%s",
    1.75 +				last_revision,
    1.76 +				(module->VersionInfo.dwFileVersionMS >> 16),
    1.77 +				(module->VersionInfo.dwFileVersionMS & 0xFFFF),
    1.78 +				path);
    1.79 +			system(buffer);
    1.80 +
    1.81 +			return last_revision;
    1.82 +		}
    1.83 +	}
    1.84 +
    1.85 +	fclose(fp);
    1.86 +
    1.87 +	return -1;
    1.88 +}
    1.89 +
    1.90 +int main(int argc, char **argv)
    1.91 +{
    1.92 +	int rev;
    1.93 +	ULONG32 m;
    1.94 +	LPVOID mdmp;
    1.95 +	HANDLE hFile;
    1.96 +	const char *name;
    1.97 +	ULONG stream_size;
    1.98 +	char name_buf[255];
    1.99 +	HANDLE hFileMapping;
   1.100 +	MINIDUMP_MODULE *module;
   1.101 +	MINIDUMP_DIRECTORY *dir;
   1.102 +	MINIDUMP_MODULE_LIST *modules;
   1.103 +
   1.104 +	if (argc < 3)
   1.105 +	{
   1.106 +		fprintf(stderr, "Usage: <build> <mdmp>\n");
   1.107 +		exit(-1);
   1.108 +	}
   1.109 +
   1.110 +	if ((hFile = CreateFile(argv[2],
   1.111 +			GENERIC_READ,
   1.112 +			FILE_SHARE_READ,
   1.113 +			NULL,
   1.114 +			OPEN_EXISTING,
   1.115 +			FILE_ATTRIBUTE_NORMAL,
   1.116 +			NULL))
   1.117 +		== INVALID_HANDLE_VALUE)
   1.118 +	{
   1.119 +		fprintf(stderr, "Could not open file (error %d)\n", GetLastError());
   1.120 +		exit(-1);
   1.121 +	}
   1.122 +
   1.123 +	hFileMapping = CreateFileMapping(
   1.124 +		hFile,
   1.125 +		NULL,
   1.126 +		PAGE_READONLY,
   1.127 +		0,
   1.128 +		0,
   1.129 +		NULL);
   1.130 +	if (hFileMapping == NULL)
   1.131 +	{
   1.132 +		fprintf(stderr, "Could not open file mapping (error %d)\n", GetLastError());
   1.133 +		CloseHandle(hFile);
   1.134 +		exit(-1);
   1.135 +	}
   1.136 +
   1.137 +	mdmp = MapViewOfFile(hFileMapping,
   1.138 +		FILE_MAP_READ,
   1.139 +		0,
   1.140 +		0,
   1.141 +		0);
   1.142 +	if (mdmp == NULL)
   1.143 +	{
   1.144 +		fprintf(stderr, "Could not create map view (error %d)\n", GetLastError());
   1.145 +		CloseHandle(hFileMapping);
   1.146 +		CloseHandle(hFile);
   1.147 +		exit(-1);
   1.148 +	}
   1.149 +
   1.150 +	if (!MiniDumpReadDumpStream(mdmp,
   1.151 +			ModuleListStream,
   1.152 +			&dir,
   1.153 +			(void **)&modules,
   1.154 +			&stream_size))
   1.155 +	{
   1.156 +		fprintf(stderr, "Could not read the module list stream.\n");
   1.157 +		UnmapViewOfFile(mdmp);
   1.158 +		CloseHandle(hFileMapping);
   1.159 +		CloseHandle(hFile);
   1.160 +	}
   1.161 +
   1.162 +	for (m = 0; m < modules->NumberOfModules; m++)
   1.163 +	{
   1.164 +		module = &modules->Modules[m];
   1.165 +
   1.166 +		mdmp_string(mdmp, module->ModuleNameRva, name_buf, sizeof(name_buf));
   1.167 +
   1.168 +		if ((name = strstr(name_buf, "sourcemod\\")) != NULL)
   1.169 +		{
   1.170 +			name += 10;
   1.171 +			fprintf(stdout, 
   1.172 +				"looking for: %s (%d.%d.%d.%d of build %s)... ", 
   1.173 +				name, 
   1.174 +				(module->VersionInfo.dwFileVersionMS >> 16),
   1.175 +				(module->VersionInfo.dwFileVersionMS & 0xFFFF),
   1.176 +				(module->VersionInfo.dwFileVersionLS >> 16),
   1.177 +				(module->VersionInfo.dwFileVersionLS & 0xFFFF),
   1.178 +				argv[1]
   1.179 +				);
   1.180 +			fflush(stdout);
   1.181 +			if ((rev = find_revision(argv[1], module, name)) == -1)
   1.182 +			{
   1.183 +				fprintf(stdout, "not found :(\n");
   1.184 +				continue;
   1.185 +			}
   1.186 +			fprintf(stdout, "downloaded! (pkgrev %d)\n", rev);
   1.187 +		}
   1.188 +	}
   1.189 +
   1.190 +	UnmapViewOfFile(mdmp);
   1.191 +	CloseHandle(hFileMapping);
   1.192 +	CloseHandle(hFile);
   1.193 +
   1.194 +	return 0;
   1.195 +}