|
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 |
} |