comparison src/unexnt.c @ 400:a86b2b5e0111 r21-2-30

Import from CVS: tag r21-2-30
author cvs
date Mon, 13 Aug 2007 11:14:34 +0200
parents 74fd4e045ea6
children 501cfd01ee6d
comparison
equal deleted inserted replaced
399:376370fb5946 400:a86b2b5e0111
61 #include <fcntl.h> 61 #include <fcntl.h>
62 #include <windows.h> 62 #include <windows.h>
63 63
64 /* From IMAGEHLP.H which is not installed by default by MSVC < 5 */ 64 /* From IMAGEHLP.H which is not installed by default by MSVC < 5 */
65 /* The IMAGEHLP.DLL library is not distributed by default with Windows95 */ 65 /* The IMAGEHLP.DLL library is not distributed by default with Windows95 */
66 PIMAGE_NT_HEADERS 66 typedef PIMAGE_NT_HEADERS
67 (__stdcall * pfnCheckSumMappedFile) (LPVOID BaseAddress, DWORD FileLength, 67 (__stdcall * pfnCheckSumMappedFile_t) (LPVOID BaseAddress, DWORD FileLength,
68 LPDWORD HeaderSum, LPDWORD CheckSum); 68 LPDWORD HeaderSum, LPDWORD CheckSum);
69
69 70
70 #if 0 71 #if 0
71 extern BOOL ctrl_c_handler (unsigned long type); 72 extern BOOL ctrl_c_handler (unsigned long type);
72 #endif 73 #endif
73 74
188 { 189 {
189 file_data in_file, out_file; 190 file_data in_file, out_file;
190 char out_filename[MAX_PATH], in_filename[MAX_PATH]; 191 char out_filename[MAX_PATH], in_filename[MAX_PATH];
191 unsigned long size; 192 unsigned long size;
192 char *ptr; 193 char *ptr;
193 HANDLE hImagehelp; 194 HINSTANCE hImagehelp;
194 195
195 /* Make sure that the input and output filenames have the 196 /* Make sure that the input and output filenames have the
196 ".exe" extension...patch them up if they don't. */ 197 ".exe" extension...patch them up if they don't. */
197 strcpy (in_filename, old_name); 198 strcpy (in_filename, old_name);
198 ptr = in_filename + strlen (in_filename) - 4; 199 ptr = in_filename + strlen (in_filename) - 4;
243 hImagehelp = LoadLibrary ("imagehlp.dll"); 244 hImagehelp = LoadLibrary ("imagehlp.dll");
244 if (hImagehelp) 245 if (hImagehelp)
245 { 246 {
246 PIMAGE_DOS_HEADER dos_header; 247 PIMAGE_DOS_HEADER dos_header;
247 PIMAGE_NT_HEADERS nt_header; 248 PIMAGE_NT_HEADERS nt_header;
249
248 DWORD headersum; 250 DWORD headersum;
249 DWORD checksum; 251 DWORD checksum;
252 pfnCheckSumMappedFile_t pfnCheckSumMappedFile;
250 253
251 dos_header = (PIMAGE_DOS_HEADER) out_file.file_base; 254 dos_header = (PIMAGE_DOS_HEADER) out_file.file_base;
252 nt_header = (PIMAGE_NT_HEADERS) ((char *) dos_header + dos_header->e_lfanew); 255 nt_header = (PIMAGE_NT_HEADERS) ((char *) dos_header + dos_header->e_lfanew);
253 256
254 nt_header->OptionalHeader.CheckSum = 0; 257 nt_header->OptionalHeader.CheckSum = 0;
255 // nt_header->FileHeader.TimeDateStamp = time (NULL); 258 #if 0
256 // dos_header->e_cp = size / 512; 259 nt_header->FileHeader.TimeDateStamp = time (NULL);
257 // nt_header->OptionalHeader.SizeOfImage = size; 260 dos_header->e_cp = size / 512;
258 261 nt_header->OptionalHeader.SizeOfImage = size;
259 pfnCheckSumMappedFile = (void *) GetProcAddress (hImagehelp, "CheckSumMappedFile"); 262 #endif
263
264 pfnCheckSumMappedFile =
265 (pfnCheckSumMappedFile_t) GetProcAddress (hImagehelp,
266 "CheckSumMappedFile");
260 if (pfnCheckSumMappedFile) 267 if (pfnCheckSumMappedFile)
261 { 268 {
262 // nt_header->FileHeader.TimeDateStamp = time (NULL); 269 #if 0
270 nt_header->FileHeader.TimeDateStamp = time (NULL);
271 #endif
263 pfnCheckSumMappedFile (out_file.file_base, 272 pfnCheckSumMappedFile (out_file.file_base,
264 out_file.size, 273 out_file.size,
265 &headersum, 274 &headersum,
266 &checksum); 275 &checksum);
267 nt_header->OptionalHeader.CheckSum = checksum; 276 nt_header->OptionalHeader.CheckSum = checksum;
293 0, size, NULL); 302 0, size, NULL);
294 if (!file_mapping) 303 if (!file_mapping)
295 return FALSE; 304 return FALSE;
296 305
297 file_base = MapViewOfFile (file_mapping, FILE_MAP_WRITE, 0, 0, size); 306 file_base = MapViewOfFile (file_mapping, FILE_MAP_WRITE, 0, 0, size);
298 if (file_base == 0) 307 if (file_base == NULL)
299 return FALSE; 308 return FALSE;
300 309
301 p_file->name = filename; 310 p_file->name = filename;
302 p_file->size = size; 311 p_file->size = size;
303 p_file->file = file; 312 p_file->file = file;
304 p_file->file_mapping = file_mapping; 313 p_file->file_mapping = file_mapping;
305 p_file->file_base = file_base; 314 p_file->file_base = (char*) file_base;
306 315
307 return TRUE; 316 return TRUE;
308 } 317 }
309 318
310 /* Routines to manipulate NT executable file sections. */ 319 /* Routines to manipulate NT executable file sections. */
484 493
485 size = data_size; 494 size = data_size;
486 DUMP_MSG (("Dumping data section...\n")); 495 DUMP_MSG (("Dumping data section...\n"));
487 DUMP_MSG (("\t0x%08x Address in process.\n", data_va)); 496 DUMP_MSG (("\t0x%08x Address in process.\n", data_va));
488 DUMP_MSG (("\t0x%08x Offset in output file.\n", 497 DUMP_MSG (("\t0x%08x Offset in output file.\n",
489 data_file - p_outfile->file_base)); 498 (char*)data_file - p_outfile->file_base));
490 DUMP_MSG (("\t0x%08x Size in bytes.\n", size)); 499 DUMP_MSG (("\t0x%08x Size in bytes.\n", size));
491 memcpy (data_file, data_va, size); 500 memcpy (data_file, data_va, size);
492 501
493 index = (DWORD) data_file + size - (DWORD) p_outfile->file_base; 502 index = (DWORD) data_file + size - (DWORD) p_outfile->file_base;
494 size = p_infile->size - index; 503 size = p_infile->size - index;