--HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%402177
		
			
				
	
	
		
			193 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <stdio.h>
 | 
						|
#include <windows.h>
 | 
						|
#include <DbgHelp.h>
 | 
						|
 | 
						|
void mdmp_string(void *mdmp, RVA addr, char *buffer, size_t maxlength)
 | 
						|
{
 | 
						|
	int len;
 | 
						|
	MINIDUMP_STRING *str;
 | 
						|
 | 
						|
	str = (MINIDUMP_STRING *)((char *)mdmp + addr);
 | 
						|
	len = WideCharToMultiByte(CP_UTF8, 
 | 
						|
		0, 
 | 
						|
		str->Buffer, 
 | 
						|
		str->Length / sizeof(WCHAR), 
 | 
						|
		buffer, 
 | 
						|
		maxlength,
 | 
						|
		NULL,
 | 
						|
		NULL);
 | 
						|
	buffer[len] = '\0';
 | 
						|
}
 | 
						|
 | 
						|
int find_revision(const char *version, MINIDUMP_MODULE *module, const char *name)
 | 
						|
{
 | 
						|
	FILE *fp;
 | 
						|
	char msg[255];
 | 
						|
	size_t i, len;
 | 
						|
	char path[255];
 | 
						|
	char buffer[3000];
 | 
						|
	int last_revision;
 | 
						|
 | 
						|
	len = _snprintf(path, sizeof(path), "%s", name);
 | 
						|
	for (i = 0; i < len; i++)
 | 
						|
	{
 | 
						|
		if (path[i] == '\\')
 | 
						|
		{
 | 
						|
			path[i] = '/';
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	DeleteFile("_svnlog.txt");
 | 
						|
	_snprintf(buffer, 
 | 
						|
		sizeof(buffer),
 | 
						|
		"svn log svn://svn.alliedmods.net/svnroot/Packages/sourcemod/sourcemod-%d.%d/windows/base/addons/sourcemod/%s > _svnlog.txt",
 | 
						|
		(module->VersionInfo.dwFileVersionMS >> 16),
 | 
						|
		(module->VersionInfo.dwFileVersionMS & 0xFFFF),
 | 
						|
		path);
 | 
						|
	system(buffer);
 | 
						|
 | 
						|
	if ((fp = fopen("_svnlog.txt", "rt")) == NULL)
 | 
						|
	{
 | 
						|
		return -1;
 | 
						|
	}
 | 
						|
 | 
						|
	_snprintf(msg, 
 | 
						|
		sizeof(msg), 
 | 
						|
		"sourcemod-%s",
 | 
						|
		version);
 | 
						|
 | 
						|
	while (fgets(buffer, sizeof(buffer), fp) != NULL)
 | 
						|
	{
 | 
						|
		if (buffer[0] == 'r')
 | 
						|
		{
 | 
						|
			last_revision = atoi(&buffer[1]);
 | 
						|
		}
 | 
						|
		else if (strstr(buffer, msg) != NULL)
 | 
						|
		{
 | 
						|
			fclose(fp);
 | 
						|
 | 
						|
			_snprintf(buffer,
 | 
						|
				sizeof(buffer),
 | 
						|
				"svn export -q -r %d svn://svn.alliedmods.net/svnroot/Packages/sourcemod/sourcemod-%d.%d/windows/base/addons/sourcemod/%s",
 | 
						|
				last_revision,
 | 
						|
				(module->VersionInfo.dwFileVersionMS >> 16),
 | 
						|
				(module->VersionInfo.dwFileVersionMS & 0xFFFF),
 | 
						|
				path);
 | 
						|
			system(buffer);
 | 
						|
 | 
						|
			return last_revision;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	fclose(fp);
 | 
						|
 | 
						|
	return -1;
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char **argv)
 | 
						|
{
 | 
						|
	int rev;
 | 
						|
	ULONG32 m;
 | 
						|
	LPVOID mdmp;
 | 
						|
	HANDLE hFile;
 | 
						|
	const char *name;
 | 
						|
	ULONG stream_size;
 | 
						|
	char name_buf[255];
 | 
						|
	HANDLE hFileMapping;
 | 
						|
	MINIDUMP_MODULE *module;
 | 
						|
	MINIDUMP_DIRECTORY *dir;
 | 
						|
	MINIDUMP_MODULE_LIST *modules;
 | 
						|
 | 
						|
	if (argc < 3)
 | 
						|
	{
 | 
						|
		fprintf(stderr, "Usage: <build> <mdmp>\n");
 | 
						|
		exit(-1);
 | 
						|
	}
 | 
						|
 | 
						|
	if ((hFile = CreateFile(argv[2],
 | 
						|
			GENERIC_READ,
 | 
						|
			FILE_SHARE_READ,
 | 
						|
			NULL,
 | 
						|
			OPEN_EXISTING,
 | 
						|
			FILE_ATTRIBUTE_NORMAL,
 | 
						|
			NULL))
 | 
						|
		== INVALID_HANDLE_VALUE)
 | 
						|
	{
 | 
						|
		fprintf(stderr, "Could not open file (error %d)\n", GetLastError());
 | 
						|
		exit(-1);
 | 
						|
	}
 | 
						|
 | 
						|
	hFileMapping = CreateFileMapping(
 | 
						|
		hFile,
 | 
						|
		NULL,
 | 
						|
		PAGE_READONLY,
 | 
						|
		0,
 | 
						|
		0,
 | 
						|
		NULL);
 | 
						|
	if (hFileMapping == NULL)
 | 
						|
	{
 | 
						|
		fprintf(stderr, "Could not open file mapping (error %d)\n", GetLastError());
 | 
						|
		CloseHandle(hFile);
 | 
						|
		exit(-1);
 | 
						|
	}
 | 
						|
 | 
						|
	mdmp = MapViewOfFile(hFileMapping,
 | 
						|
		FILE_MAP_READ,
 | 
						|
		0,
 | 
						|
		0,
 | 
						|
		0);
 | 
						|
	if (mdmp == NULL)
 | 
						|
	{
 | 
						|
		fprintf(stderr, "Could not create map view (error %d)\n", GetLastError());
 | 
						|
		CloseHandle(hFileMapping);
 | 
						|
		CloseHandle(hFile);
 | 
						|
		exit(-1);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!MiniDumpReadDumpStream(mdmp,
 | 
						|
			ModuleListStream,
 | 
						|
			&dir,
 | 
						|
			(void **)&modules,
 | 
						|
			&stream_size))
 | 
						|
	{
 | 
						|
		fprintf(stderr, "Could not read the module list stream.\n");
 | 
						|
		UnmapViewOfFile(mdmp);
 | 
						|
		CloseHandle(hFileMapping);
 | 
						|
		CloseHandle(hFile);
 | 
						|
	}
 | 
						|
 | 
						|
	for (m = 0; m < modules->NumberOfModules; m++)
 | 
						|
	{
 | 
						|
		module = &modules->Modules[m];
 | 
						|
 | 
						|
		mdmp_string(mdmp, module->ModuleNameRva, name_buf, sizeof(name_buf));
 | 
						|
 | 
						|
		if ((name = strstr(name_buf, "sourcemod\\")) != NULL)
 | 
						|
		{
 | 
						|
			name += 10;
 | 
						|
			fprintf(stdout, 
 | 
						|
				"looking for: %s (%d.%d.%d.%d of build %s)... ", 
 | 
						|
				name, 
 | 
						|
				(module->VersionInfo.dwFileVersionMS >> 16),
 | 
						|
				(module->VersionInfo.dwFileVersionMS & 0xFFFF),
 | 
						|
				(module->VersionInfo.dwFileVersionLS >> 16),
 | 
						|
				(module->VersionInfo.dwFileVersionLS & 0xFFFF),
 | 
						|
				argv[1]
 | 
						|
				);
 | 
						|
			fflush(stdout);
 | 
						|
			if ((rev = find_revision(argv[1], module, name)) == -1)
 | 
						|
			{
 | 
						|
				fprintf(stdout, "not found :(\n");
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			fprintf(stdout, "downloaded! (pkgrev %d)\n", rev);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	UnmapViewOfFile(mdmp);
 | 
						|
	CloseHandle(hFileMapping);
 | 
						|
	CloseHandle(hFile);
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 |