148 |
|
|
149 |
file = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL, |
file = CreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL, |
150 |
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); |
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); |
151 |
if (file == INVALID_HANDLE_VALUE) |
if (file == INVALID_HANDLE_VALUE) |
152 |
return FALSE; |
return FALSE; |
153 |
|
|
154 |
size = GetFileSize (file, &upper_size); |
size = GetFileSize (file, &upper_size); |
155 |
file_mapping = CreateFileMapping (file, NULL, PAGE_READONLY, |
file_mapping = CreateFileMapping (file, NULL, PAGE_READONLY, |
156 |
0, size, NULL); |
0, size, NULL); |
157 |
if (!file_mapping) |
if (!file_mapping) |
158 |
return FALSE; |
return FALSE; |
159 |
|
|
160 |
file_base = MapViewOfFile (file_mapping, FILE_MAP_READ, 0, 0, size); |
file_base = MapViewOfFile (file_mapping, FILE_MAP_READ, 0, 0, size); |
161 |
if (file_base == 0) |
if (file_base == 0) |
162 |
return FALSE; |
return FALSE; |
163 |
|
|
164 |
p_file->name = filename; |
p_file->name = filename; |
179 |
|
|
180 |
file = CreateFile (filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, |
file = CreateFile (filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, |
181 |
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); |
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); |
182 |
if (file == INVALID_HANDLE_VALUE) |
if (file == INVALID_HANDLE_VALUE) |
183 |
return FALSE; |
return FALSE; |
184 |
|
|
185 |
file_mapping = CreateFileMapping (file, NULL, PAGE_READWRITE, |
file_mapping = CreateFileMapping (file, NULL, PAGE_READWRITE, |
186 |
0, size, NULL); |
0, size, NULL); |
187 |
if (!file_mapping) |
if (!file_mapping) |
188 |
return FALSE; |
return FALSE; |
189 |
|
|
190 |
file_base = MapViewOfFile (file_mapping, FILE_MAP_WRITE, 0, 0, size); |
file_base = MapViewOfFile (file_mapping, FILE_MAP_WRITE, 0, 0, size); |
191 |
if (file_base == 0) |
if (file_base == 0) |
192 |
return FALSE; |
return FALSE; |
193 |
|
|
194 |
p_file->name = filename; |
p_file->name = filename; |
195 |
p_file->size = size; |
p_file->size = size; |
196 |
p_file->file = file; |
p_file->file = file; |
345 |
PIMAGE_NT_HEADERS nt_header; |
PIMAGE_NT_HEADERS nt_header; |
346 |
PIMAGE_SECTION_HEADER section; |
PIMAGE_SECTION_HEADER section; |
347 |
int overlap; |
int overlap; |
348 |
|
|
349 |
dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base; |
dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base; |
350 |
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) |
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) |
351 |
{ |
{ |
352 |
printf ("Unknown EXE header in %s...bailing.\n", p_infile->name); |
printf ("Unknown EXE header in %s...bailing.\n", p_infile->name); |
353 |
exit (1); |
exit (1); |
354 |
} |
} |
355 |
nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) + |
nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) + |
356 |
dos_header->e_lfanew); |
dos_header->e_lfanew); |
357 |
if (nt_header == NULL) |
if (nt_header == NULL) |
358 |
{ |
{ |
359 |
printf ("Failed to find IMAGE_NT_HEADER in %s...bailing.\n", |
printf ("Failed to find IMAGE_NT_HEADER in %s...bailing.\n", |
360 |
p_infile->name); |
p_infile->name); |
361 |
exit (1); |
exit (1); |
362 |
} |
} |
363 |
|
|
364 |
/* Check the NT header signature ... */ |
/* Check the NT header signature ... */ |
365 |
if (nt_header->Signature != IMAGE_NT_SIGNATURE) |
if (nt_header->Signature != IMAGE_NT_SIGNATURE) |
366 |
{ |
{ |
367 |
printf ("Invalid IMAGE_NT_SIGNATURE 0x%x in %s...bailing.\n", |
printf ("Invalid IMAGE_NT_SIGNATURE 0x%x in %s...bailing.\n", |
368 |
nt_header->Signature, p_infile->name); |
nt_header->Signature, p_infile->name); |
482 |
/* The dump routines. */ |
/* The dump routines. */ |
483 |
|
|
484 |
void |
void |
485 |
copy_executable_and_dump_data (file_data *p_infile, |
copy_executable_and_dump_data (file_data *p_infile, |
486 |
file_data *p_outfile) |
file_data *p_outfile) |
487 |
{ |
{ |
488 |
unsigned char *dst, *dst_save; |
unsigned char *dst, *dst_save; |
537 |
Note that dst is updated implicitly by each COPY_CHUNK. */ |
Note that dst is updated implicitly by each COPY_CHUNK. */ |
538 |
|
|
539 |
dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base; |
dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base; |
540 |
nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) + |
nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) + |
541 |
dos_header->e_lfanew); |
dos_header->e_lfanew); |
542 |
section = IMAGE_FIRST_SECTION (nt_header); |
section = IMAGE_FIRST_SECTION (nt_header); |
543 |
|
|
544 |
dst = (unsigned char *) p_outfile->file_base; |
dst = (unsigned char *) p_outfile->file_base; |
545 |
|
|
546 |
COPY_CHUNK ("Copying DOS header...", dos_header, |
COPY_CHUNK ("Copying DOS header...", dos_header, |
736 |
if ((q = strrchr (new_name, '/')) == NULL) |
if ((q = strrchr (new_name, '/')) == NULL) |
737 |
abort (); |
abort (); |
738 |
strcpy (p, q); |
strcpy (p, q); |
739 |
|
|
740 |
/* Make sure that the output filename has the ".exe" extension...patch |
/* Make sure that the output filename has the ".exe" extension...patch |
741 |
it up if not. */ |
it up if not. */ |
742 |
p = out_filename + strlen (out_filename) - 4; |
p = out_filename + strlen (out_filename) - 4; |
752 |
/* Open the undumped executable file. */ |
/* Open the undumped executable file. */ |
753 |
if (!open_input_file (&in_file, in_filename)) |
if (!open_input_file (&in_file, in_filename)) |
754 |
{ |
{ |
755 |
printf ("Failed to open %s (%d)...bailing.\n", |
printf ("Failed to open %s (%d)...bailing.\n", |
756 |
in_filename, GetLastError ()); |
in_filename, GetLastError ()); |
757 |
exit (1); |
exit (1); |
758 |
} |
} |
768 |
extra_bss_size_static; |
extra_bss_size_static; |
769 |
if (!open_output_file (&out_file, out_filename, size)) |
if (!open_output_file (&out_file, out_filename, size)) |
770 |
{ |
{ |
771 |
printf ("Failed to open %s (%d)...bailing.\n", |
printf ("Failed to open %s (%d)...bailing.\n", |
772 |
out_filename, GetLastError ()); |
out_filename, GetLastError ()); |
773 |
exit (1); |
exit (1); |
774 |
} |
} |