tools/fetchdlls/main.cpp
author David Anderson <dvander@alliedmods.net>
Sat May 24 06:48:35 2008 +0000 (2008-05-24)
changeset 2072 82d3186b9fa4
permissions -rw-r--r--
added quick tool for fetching dlls of mdmps
dvander@2072
     1
#include <stdio.h>
dvander@2072
     2
#include <windows.h>
dvander@2072
     3
#include <DbgHelp.h>
dvander@2072
     4
dvander@2072
     5
void mdmp_string(void *mdmp, RVA addr, char *buffer, size_t maxlength)
dvander@2072
     6
{
dvander@2072
     7
	int len;
dvander@2072
     8
	MINIDUMP_STRING *str;
dvander@2072
     9
dvander@2072
    10
	str = (MINIDUMP_STRING *)((char *)mdmp + addr);
dvander@2072
    11
	len = WideCharToMultiByte(CP_UTF8, 
dvander@2072
    12
		0, 
dvander@2072
    13
		str->Buffer, 
dvander@2072
    14
		str->Length / sizeof(WCHAR), 
dvander@2072
    15
		buffer, 
dvander@2072
    16
		maxlength,
dvander@2072
    17
		NULL,
dvander@2072
    18
		NULL);
dvander@2072
    19
	buffer[len] = '\0';
dvander@2072
    20
}
dvander@2072
    21
dvander@2072
    22
int find_revision(const char *version, MINIDUMP_MODULE *module, const char *name)
dvander@2072
    23
{
dvander@2072
    24
	FILE *fp;
dvander@2072
    25
	char msg[255];
dvander@2072
    26
	size_t i, len;
dvander@2072
    27
	char path[255];
dvander@2072
    28
	char buffer[3000];
dvander@2072
    29
	int last_revision;
dvander@2072
    30
dvander@2072
    31
	len = _snprintf(path, sizeof(path), "%s", name);
dvander@2072
    32
	for (i = 0; i < len; i++)
dvander@2072
    33
	{
dvander@2072
    34
		if (path[i] == '\\')
dvander@2072
    35
		{
dvander@2072
    36
			path[i] = '/';
dvander@2072
    37
		}
dvander@2072
    38
	}
dvander@2072
    39
dvander@2072
    40
	DeleteFile("_svnlog.txt");
dvander@2072
    41
	_snprintf(buffer, 
dvander@2072
    42
		sizeof(buffer),
dvander@2072
    43
		"svn log svn://svn.alliedmods.net/svnroot/Packages/sourcemod/sourcemod-%d.%d/windows/base/addons/sourcemod/%s > _svnlog.txt",
dvander@2072
    44
		(module->VersionInfo.dwFileVersionMS >> 16),
dvander@2072
    45
		(module->VersionInfo.dwFileVersionMS & 0xFFFF),
dvander@2072
    46
		path);
dvander@2072
    47
	system(buffer);
dvander@2072
    48
dvander@2072
    49
	if ((fp = fopen("_svnlog.txt", "rt")) == NULL)
dvander@2072
    50
	{
dvander@2072
    51
		return -1;
dvander@2072
    52
	}
dvander@2072
    53
dvander@2072
    54
	_snprintf(msg, 
dvander@2072
    55
		sizeof(msg), 
dvander@2072
    56
		"sourcemod-%s",
dvander@2072
    57
		version);
dvander@2072
    58
dvander@2072
    59
	while (fgets(buffer, sizeof(buffer), fp) != NULL)
dvander@2072
    60
	{
dvander@2072
    61
		if (buffer[0] == 'r')
dvander@2072
    62
		{
dvander@2072
    63
			last_revision = atoi(&buffer[1]);
dvander@2072
    64
		}
dvander@2072
    65
		else if (strstr(buffer, msg) != NULL)
dvander@2072
    66
		{
dvander@2072
    67
			fclose(fp);
dvander@2072
    68
dvander@2072
    69
			_snprintf(buffer,
dvander@2072
    70
				sizeof(buffer),
dvander@2072
    71
				"svn export -q -r %d svn://svn.alliedmods.net/svnroot/Packages/sourcemod/sourcemod-%d.%d/windows/base/addons/sourcemod/%s",
dvander@2072
    72
				last_revision,
dvander@2072
    73
				(module->VersionInfo.dwFileVersionMS >> 16),
dvander@2072
    74
				(module->VersionInfo.dwFileVersionMS & 0xFFFF),
dvander@2072
    75
				path);
dvander@2072
    76
			system(buffer);
dvander@2072
    77
dvander@2072
    78
			return last_revision;
dvander@2072
    79
		}
dvander@2072
    80
	}
dvander@2072
    81
dvander@2072
    82
	fclose(fp);
dvander@2072
    83
dvander@2072
    84
	return -1;
dvander@2072
    85
}
dvander@2072
    86
dvander@2072
    87
int main(int argc, char **argv)
dvander@2072
    88
{
dvander@2072
    89
	int rev;
dvander@2072
    90
	ULONG32 m;
dvander@2072
    91
	LPVOID mdmp;
dvander@2072
    92
	HANDLE hFile;
dvander@2072
    93
	const char *name;
dvander@2072
    94
	ULONG stream_size;
dvander@2072
    95
	char name_buf[255];
dvander@2072
    96
	HANDLE hFileMapping;
dvander@2072
    97
	MINIDUMP_MODULE *module;
dvander@2072
    98
	MINIDUMP_DIRECTORY *dir;
dvander@2072
    99
	MINIDUMP_MODULE_LIST *modules;
dvander@2072
   100
dvander@2072
   101
	if (argc < 3)
dvander@2072
   102
	{
dvander@2072
   103
		fprintf(stderr, "Usage: <build> <mdmp>\n");
dvander@2072
   104
		exit(-1);
dvander@2072
   105
	}
dvander@2072
   106
dvander@2072
   107
	if ((hFile = CreateFile(argv[2],
dvander@2072
   108
			GENERIC_READ,
dvander@2072
   109
			FILE_SHARE_READ,
dvander@2072
   110
			NULL,
dvander@2072
   111
			OPEN_EXISTING,
dvander@2072
   112
			FILE_ATTRIBUTE_NORMAL,
dvander@2072
   113
			NULL))
dvander@2072
   114
		== INVALID_HANDLE_VALUE)
dvander@2072
   115
	{
dvander@2072
   116
		fprintf(stderr, "Could not open file (error %d)\n", GetLastError());
dvander@2072
   117
		exit(-1);
dvander@2072
   118
	}
dvander@2072
   119
dvander@2072
   120
	hFileMapping = CreateFileMapping(
dvander@2072
   121
		hFile,
dvander@2072
   122
		NULL,
dvander@2072
   123
		PAGE_READONLY,
dvander@2072
   124
		0,
dvander@2072
   125
		0,
dvander@2072
   126
		NULL);
dvander@2072
   127
	if (hFileMapping == NULL)
dvander@2072
   128
	{
dvander@2072
   129
		fprintf(stderr, "Could not open file mapping (error %d)\n", GetLastError());
dvander@2072
   130
		CloseHandle(hFile);
dvander@2072
   131
		exit(-1);
dvander@2072
   132
	}
dvander@2072
   133
dvander@2072
   134
	mdmp = MapViewOfFile(hFileMapping,
dvander@2072
   135
		FILE_MAP_READ,
dvander@2072
   136
		0,
dvander@2072
   137
		0,
dvander@2072
   138
		0);
dvander@2072
   139
	if (mdmp == NULL)
dvander@2072
   140
	{
dvander@2072
   141
		fprintf(stderr, "Could not create map view (error %d)\n", GetLastError());
dvander@2072
   142
		CloseHandle(hFileMapping);
dvander@2072
   143
		CloseHandle(hFile);
dvander@2072
   144
		exit(-1);
dvander@2072
   145
	}
dvander@2072
   146
dvander@2072
   147
	if (!MiniDumpReadDumpStream(mdmp,
dvander@2072
   148
			ModuleListStream,
dvander@2072
   149
			&dir,
dvander@2072
   150
			(void **)&modules,
dvander@2072
   151
			&stream_size))
dvander@2072
   152
	{
dvander@2072
   153
		fprintf(stderr, "Could not read the module list stream.\n");
dvander@2072
   154
		UnmapViewOfFile(mdmp);
dvander@2072
   155
		CloseHandle(hFileMapping);
dvander@2072
   156
		CloseHandle(hFile);
dvander@2072
   157
	}
dvander@2072
   158
dvander@2072
   159
	for (m = 0; m < modules->NumberOfModules; m++)
dvander@2072
   160
	{
dvander@2072
   161
		module = &modules->Modules[m];
dvander@2072
   162
dvander@2072
   163
		mdmp_string(mdmp, module->ModuleNameRva, name_buf, sizeof(name_buf));
dvander@2072
   164
dvander@2072
   165
		if ((name = strstr(name_buf, "sourcemod\\")) != NULL)
dvander@2072
   166
		{
dvander@2072
   167
			name += 10;
dvander@2072
   168
			fprintf(stdout, 
dvander@2072
   169
				"looking for: %s (%d.%d.%d.%d of build %s)... ", 
dvander@2072
   170
				name, 
dvander@2072
   171
				(module->VersionInfo.dwFileVersionMS >> 16),
dvander@2072
   172
				(module->VersionInfo.dwFileVersionMS & 0xFFFF),
dvander@2072
   173
				(module->VersionInfo.dwFileVersionLS >> 16),
dvander@2072
   174
				(module->VersionInfo.dwFileVersionLS & 0xFFFF),
dvander@2072
   175
				argv[1]
dvander@2072
   176
				);
dvander@2072
   177
			fflush(stdout);
dvander@2072
   178
			if ((rev = find_revision(argv[1], module, name)) == -1)
dvander@2072
   179
			{
dvander@2072
   180
				fprintf(stdout, "not found :(\n");
dvander@2072
   181
				continue;
dvander@2072
   182
			}
dvander@2072
   183
			fprintf(stdout, "downloaded! (pkgrev %d)\n", rev);
dvander@2072
   184
		}
dvander@2072
   185
	}
dvander@2072
   186
dvander@2072
   187
	UnmapViewOfFile(mdmp);
dvander@2072
   188
	CloseHandle(hFileMapping);
dvander@2072
   189
	CloseHandle(hFile);
dvander@2072
   190
dvander@2072
   191
	return 0;
dvander@2072
   192
}