annotate src/unexnt.c @ 5697:40fbceabaafd

menubar-items.el (default-menubar): Reorganize. Add PROBLEMS to toplevel. New "More about XEmacs" submenu for NEWS, licensing, etc. New "Recent History" menu for messages, lossage, etc. Get rid of ugly and unexpressive ellipses.
author Stephen J. Turnbull <stephen@xemacs.org>
date Mon, 24 Dec 2012 03:08:33 +0900
parents 308d34e9f07d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 558
diff changeset
1 /* unexec for XEmacs on Windows NT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1994 Free Software Foundation, Inc.
5050
6f2158fa75ed Fix quick-build, use asserts() in place of ABORT()
Ben Wing <ben@xemacs.org>
parents: 4854
diff changeset
3 Copyright (C) 2002, 2010 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5050
diff changeset
7 XEmacs is free software: you can redistribute it and/or modify it
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5050
diff changeset
9 Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5050
diff changeset
10 option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5050
diff changeset
18 along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 Geoff Voelker (voelker@cs.washington.edu) 8-12-94 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 /* Adapted for XEmacs by David Hobley <david@spook-le0.cia.com.au> */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
23 /* This file has been Mule-ized, Ben Wing, 4-13-02. */
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
24
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 /* The linkers that come with MSVC >= 4.0 merge .bss into .data and reorder
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 * uninitialised data so that the .data section looks like:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 * crt0 initialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 * emacs initialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 * <my_edata>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 * library initialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 * <start of bss part of .data>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 * emacs static uninitialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 * library static uninitialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 * emacs global uninitialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 * <my_ebss>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 * library global uninitialised data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 * This means that we can't use the normal my_ebss in lastfile.c trick to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 * differentiate between unitialised data that belongs to emacs and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 * uninitialised data that belongs to system libraries. This is bad because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 * we do want to initialise the emacs data, but we don't want to initialise
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 * the system library data.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 * To solve this problem using MSVC >= 5.0 we use a pragma directive to tell
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 * the compiler to put emacs's data (both initialised and uninitialised) in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 * a separate section in the executable, and we only dump that section. This
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 * means that all files that define initialized data must include config.h
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 * to pick up the pragma. We don't try to make any part of that section
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 * read-only.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 * This pragma directive isn't supported by the MSVC 4.x compiler. Instead,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 * we dump crt0 initialised data and library static uninitialised data in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 * addition to the emacs data. This is wrong, but we appear to be able to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 * get away with it. A proper fix might involve the introduction of a static
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 * version of my_ebss in lastfile.c and a new firstfile.c file. jhar */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 #include <config.h>
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
59 #include "lisp.h"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
60
558
ed498ef2108b [xemacs-hg @ 2001-05-23 09:59:33 by ben]
ben
parents: 442
diff changeset
61 #include "sysfile.h"
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
62 #include "syswindows.h"
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
63
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 /* From IMAGEHLP.H which is not installed by default by MSVC < 5 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 /* The IMAGEHLP.DLL library is not distributed by default with Windows95 */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
66 typedef PIMAGE_NT_HEADERS
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
67 (__stdcall * pfnCheckSumMappedFile_t) (LPVOID BaseAddress, DWORD FileLength,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
68 LPDWORD HeaderSum, LPDWORD CheckSum);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
69
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 extern BOOL ctrl_c_handler (unsigned long type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
75 /* Sync with FSF Emacs 19.34.6
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
76 note: struct file_data is now defined in nt.h */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 enum {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 HEAP_UNINITIALIZED = 1,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 HEAP_UNLOADED,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 HEAP_LOADED
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 /* Basically, our "initialized" flag. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 int heap_state = HEAP_UNINITIALIZED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 /* So we can find our heap in the file to recreate it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 unsigned long heap_index_in_executable = UNINIT_LONG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 void get_section_info (file_data *p_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 void copy_executable_and_dump_data_section (file_data *, file_data *);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 void dump_bss_and_heap (file_data *p_infile, file_data *p_outfile);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 /* Cached info about the .data section in the executable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 PUCHAR data_start_va = UNINIT_PTR;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 DWORD data_start_file = UNINIT_LONG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 DWORD data_size = UNINIT_LONG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 /* Cached info about the .bss section in the executable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 PUCHAR bss_start = UNINIT_PTR;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 DWORD bss_size = UNINIT_LONG;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 /* Startup code for running on NT. When we are running as the dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 version, we need to bootstrap our heap and .bss section into our
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 address space before we can actually hand off control to the startup
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 code supplied by NT (primarily because that code relies upon malloc ()). */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
107
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
108 /* **********************
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 867
diff changeset
109 Hackers please remember, this _start() thingy is *not* called either
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 867
diff changeset
110 when dumping portably, or when running from temacs! Do not put
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
111 significant XEmacs initialization here!
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
112 ********************** */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
113
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 867
diff changeset
114 EXTERN_C void mainCRTStartup (void);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 867
diff changeset
115
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 867
diff changeset
116 EXTERN_C int _start (void);
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 867
diff changeset
117
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 867
diff changeset
118 int
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 _start (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 /* Cache system info, e.g., the NT page size. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 cache_system_info ();
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
123 /* Set OS type, so that tchar stuff below works */
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
124 init_win32_very_early ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 /* If we're a dumped version of emacs then we need to recreate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 our heap and play tricks with our .bss section. Do this before
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 start up. (WARNING: Do not put any code before this section
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 that relies upon malloc () and runs in the dumped version. It
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 won't work.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 if (heap_state == HEAP_UNLOADED)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 {
4854
95c4ced5c07c fix compile problems
Ben Wing <ben@xemacs.org>
parents: 2500
diff changeset
133 Extbyte executable_path[PATH_MAX_TCHAR];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
135 /* Don't use mswindows_get_module_file_name() because it uses
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
136 xmalloc() */
2421
ab71ad6ff3dd [xemacs-hg @ 2004-12-06 03:50:53 by ben]
ben
parents: 2367
diff changeset
137 if (qxeGetModuleFileName (NULL, executable_path, _MAX_PATH) == 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
142 /* #### This is super-bogus. When I rename xemacs.exe,
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
143 the renamed file still loads its heap from xemacs.exe --kkm */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
144 #if 0
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
145 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
146 Extbyte *p;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
147
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
148 /* To allow profiling, make sure executable_path names the .exe
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
149 file, not the file created by the profiler */
2421
ab71ad6ff3dd [xemacs-hg @ 2004-12-06 03:50:53 by ben]
ben
parents: 2367
diff changeset
150 p = qxetcsrchr (executable_path, '\\');
ab71ad6ff3dd [xemacs-hg @ 2004-12-06 03:50:53 by ben]
ben
parents: 2367
diff changeset
151 qxetcscpy (p + 1, XETEXT (PATH_PROGNAME ".exe"));
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
152 }
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
153 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 recreate_heap (executable_path);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 heap_state = HEAP_LOADED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
159 /* #### This is bogus, too. _fmode is set to different values
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
160 when we run `xemacs' and `temacs run-emacs'. The sooner we
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
161 hit and fix all the weirdities this causes us, the better --kkm */
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
162 #if 0
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 /* The default behavior is to treat files as binary and patch up
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
164 text files appropriately. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 _fmode = O_BINARY;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 428
diff changeset
166 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 /* This prevents ctrl-c's in shells running while we're suspended from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 having us exit. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 SetConsoleCtrlHandler ((PHANDLER_ROUTINE) ctrl_c_handler, TRUE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 mainCRTStartup ();
1204
e22b0213b713 [xemacs-hg @ 2003-01-12 11:07:58 by michaels]
michaels
parents: 867
diff changeset
175 return 0; /* not reached? */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 /* Dump out .data and .bss sections into a new executable. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
179 int
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1204
diff changeset
180 unexec (Ibyte *new_name, Ibyte *old_name, unsigned int UNUSED (start_data),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1204
diff changeset
181 unsigned int UNUSED (start_bss), unsigned int UNUSED (entry_address))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 file_data in_file, out_file;
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 814
diff changeset
184 Ibyte *out_filename = alloca_ibytes (qxestrlen (new_name) + 10);
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 814
diff changeset
185 Ibyte *in_filename = alloca_ibytes (qxestrlen (old_name) + 10);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 unsigned long size;
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 814
diff changeset
187 Ibyte *ptr;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
188 HINSTANCE hImagehelp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 /* Make sure that the input and output filenames have the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 ".exe" extension...patch them up if they don't. */
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
192 qxestrcpy (in_filename, old_name);
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
193 ptr = in_filename + qxestrlen (in_filename) - 4;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
194 if (qxestrcmp_ascii (ptr, ".exe"))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
195 qxestrcat_ascii (in_filename, ".exe");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
197 qxestrcpy (out_filename, new_name);
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
198 ptr = out_filename + qxestrlen (out_filename) - 4;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
199 if (qxestrcmp_ascii (ptr, ".exe"))
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
200 qxestrcat_ascii (out_filename, ".exe");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
202 stdout_out ("Dumping from %s\n", in_filename);
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
203 stdout_out (" to %s\n", out_filename);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 /* We need to round off our heap to NT's allocation unit (64KB). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 round_heap (get_allocation_unit ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 /* Open the undumped executable file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 if (!open_input_file (&in_file, in_filename))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
211 stdout_out ("Failed to open %s (%d)...bailing.\n",
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
212 in_filename, GetLastError ());
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 /* Get the interesting section info, like start and size of .bss... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 get_section_info (&in_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 /* The size of the dumped executable is the size of the original
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 executable plus the size of the heap and the size of the .bss section. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 heap_index_in_executable = (unsigned long)
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
222 round_to_next ((Rawbyte *) in_file.size, get_allocation_unit ());
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 size = heap_index_in_executable + get_committed_heap_size () + bss_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 if (!open_output_file (&out_file, out_filename, size))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
226 stdout_out ("Failed to open %s (%d)...bailing.\n",
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
227 out_filename, GetLastError ());
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 /* Set the flag (before dumping). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 heap_state = HEAP_UNLOADED;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 copy_executable_and_dump_data_section (&in_file, &out_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 dump_bss_and_heap (&in_file, &out_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 /* Patch up header fields; profiler is picky about this. */
812
f846c2ef930d [xemacs-hg @ 2002-04-13 20:31:27 by jhar]
jhar
parents: 771
diff changeset
238 hImagehelp = LoadLibraryA ("imagehlp.dll");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 if (hImagehelp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 PIMAGE_DOS_HEADER dos_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 PIMAGE_NT_HEADERS nt_header;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
243
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 DWORD headersum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 DWORD checksum;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
246 pfnCheckSumMappedFile_t pfnCheckSumMappedFile;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 dos_header = (PIMAGE_DOS_HEADER) out_file.file_base;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
249 nt_header = (PIMAGE_NT_HEADERS) ((Rawbyte *) dos_header +
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
250 dos_header->e_lfanew);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 nt_header->OptionalHeader.CheckSum = 0;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
253 #if 0
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
254 nt_header->FileHeader.TimeDateStamp = time (NULL);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
255 dos_header->e_cp = size / 512;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
256 nt_header->OptionalHeader.SizeOfImage = size;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
257 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
259 pfnCheckSumMappedFile =
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
260 (pfnCheckSumMappedFile_t) GetProcAddress (hImagehelp,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
261 "CheckSumMappedFile");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 if (pfnCheckSumMappedFile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
264 #if 0
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
265 nt_header->FileHeader.TimeDateStamp = time (NULL);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
266 #endif
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 pfnCheckSumMappedFile (out_file.file_base,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 out_file.size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 &headersum,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 &checksum);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 nt_header->OptionalHeader.CheckSum = checksum;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 FreeLibrary (hImagehelp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 close_file_data (&in_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 close_file_data (&out_file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
279 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 /* Routines to manipulate NT executable file sections. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 #ifndef DUMP_SEPARATE_SECTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 get_bss_info_from_map_file (file_data *p_infile, PUCHAR *p_bss_start,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 DWORD *p_bss_size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 int n, start, len;
867
804517e16990 [xemacs-hg @ 2002-06-05 09:54:39 by ben]
ben
parents: 814
diff changeset
290 Ibyte *map_filename = alloca_ibytes (qxestrlen (p_infile->name) + 10);
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
291 Extbyte buffer[256];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 FILE *map;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 /* Overwrite the .exe extension on the executable file name with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 the .map extension. */
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
296 qxestrcpy (map_filename, p_infile->name);
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
297 n = qxestrlen (map_filename) - 3;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
298 qxestrcpy (&map_filename[n], "map");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
300 map = qxe_fopen (map_filename, "r");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 if (!map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
303 stdout_out ("Failed to open map file %s, error %d...bailing out.\n",
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
304 map_filename, GetLastError ());
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 exit (-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 while (fgets (buffer, sizeof (buffer), map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 if (!(strstr (buffer, ".bss") && strstr (buffer, "DATA")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 n = sscanf (buffer, " %*d:%x %x", &start, &len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 if (n != 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
315 /* printf with external data, stdout_out with internal */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 printf ("Failed to scan the .bss section line:\n%s", buffer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 exit (-1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 *p_bss_start = (PUCHAR) start;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 *p_bss_size = (DWORD) len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 /* Flip through the executable and cache the info necessary for dumping. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 get_section_info (file_data *p_infile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 PIMAGE_DOS_HEADER dos_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 PIMAGE_NT_HEADERS nt_header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 PIMAGE_SECTION_HEADER section, data_section;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
333 Rawbyte *ptr;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 dos_header = (PIMAGE_DOS_HEADER) p_infile->file_base;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
339 stdout_out ("Unknown EXE header in %s...bailing.\n", p_infile->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 nt_header = (PIMAGE_NT_HEADERS) (((unsigned long) dos_header) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 dos_header->e_lfanew);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 if (nt_header == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
346 stdout_out ("Failed to find IMAGE_NT_HEADER in %s...bailing.\n",
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
347 p_infile->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 /* Check the NT header signature ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 if (nt_header->Signature != IMAGE_NT_SIGNATURE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
354 stdout_out ("Invalid IMAGE_NT_SIGNATURE 0x%x in %s...bailing.\n",
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
355 nt_header->Signature, p_infile->name);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 /* Flip through the sections for .data and .bss ... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 section = (PIMAGE_SECTION_HEADER) IMAGE_FIRST_SECTION (nt_header);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 #ifndef DUMP_SEPARATE_SECTION
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
363 if (!qxestrcmp_ascii (section->Name, ".bss"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 extern int my_ebss; /* From lastfile.c */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
367 ptr = (Rawbyte *) nt_header->OptionalHeader.ImageBase +
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 section->VirtualAddress;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 bss_start = ptr;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
370 bss_size = (Rawbyte*) &my_ebss - (Rawbyte*) bss_start;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
373 if (!qxestrcmp_ascii (section->Name, ".data"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 #else
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
375 if (!qxestrcmp_ascii (section->Name, "xdata"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
378 extern Rawbyte my_edata[]; /* From lastfile.c */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 /* The .data section. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 data_section = section;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
382 ptr = (Rawbyte *) nt_header->OptionalHeader.ImageBase +
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 section->VirtualAddress;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 data_start_va = ptr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 data_start_file = section->PointerToRawData;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 #ifndef DUMP_SEPARATE_SECTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 /* Write only the part of the section that contains emacs data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 data_size = my_edata - data_start_va;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 /* Write back the full section. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 data_size = section->SizeOfRawData;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 /* This code doesn't know how to grow the raw size of a section. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 if (section->SizeOfRawData < section->Misc.VirtualSize)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 {
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
397 stdout_out ("The emacs data section is smaller than expected"
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
398 "...bailing.\n");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 exit (1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 section++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 #ifndef DUMP_SEPARATE_SECTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 if (bss_start == UNINIT_PTR)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 /* Starting with MSVC 4.0, the .bss section has been eliminated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 and appended virtually to the end of the .data section. Our
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 only hint about where the .bss section starts in the address
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 comes from the SizeOfRawData field in the .data section
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 header. Unfortunately, this field is only approximate, as it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 is a rounded number and is typically rounded just beyond the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 start of the .bss section. To find the start and size of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 .bss section exactly, we have to peek into the map file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 extern int my_ebss;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 get_bss_info_from_map_file (p_infile, &ptr, &bss_size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 bss_start = ptr + nt_header->OptionalHeader.ImageBase
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 + data_section->VirtualAddress;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
422 bss_size = (Rawbyte *) &my_ebss - (Rawbyte *) bss_start;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 bss_size = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 /* The dump routines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 #ifdef DEBUG_XEMACS
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
433 /* printf with external data, stdout_out with internal */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 #define DUMP_MSG(x) printf x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 #define DUMP_MSG(x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 copy_executable_and_dump_data_section (file_data *p_infile,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 file_data *p_outfile)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
443 Rawbyte *data_file, *data_va;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 unsigned long size, index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 /* Get a pointer to where the raw data should go in the executable file. */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
447 data_file = (Rawbyte *) p_outfile->file_base + data_start_file;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 /* Get a pointer to the raw data in our address space. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 data_va = data_start_va;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 size = (DWORD) data_file - (DWORD) p_outfile->file_base;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 DUMP_MSG (("Copying executable up to data section...\n"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 DUMP_MSG (("\t0x%08x Offset in input file.\n", 0));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 DUMP_MSG (("\t0x%08x Offset in output file.\n", 0));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 DUMP_MSG (("\t0x%08x Size in bytes.\n", size));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 memcpy (p_outfile->file_base, p_infile->file_base, size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 size = data_size;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 DUMP_MSG (("Dumping data section...\n"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 DUMP_MSG (("\t0x%08x Address in process.\n", data_va));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 DUMP_MSG (("\t0x%08x Offset in output file.\n",
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
463 (Rawbyte *) data_file -
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
464 (Rawbyte *) p_outfile->file_base));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 DUMP_MSG (("\t0x%08x Size in bytes.\n", size));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 memcpy (data_file, data_va, size);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 index = (DWORD) data_file + size - (DWORD) p_outfile->file_base;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 size = p_infile->size - index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 DUMP_MSG (("Copying rest of executable...\n"));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 DUMP_MSG (("\t0x%08x Offset in input file.\n", index));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 DUMP_MSG (("\t0x%08x Offset in output file.\n", index));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 DUMP_MSG (("\t0x%08x Size in bytes.\n", size));
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
474 memcpy ((Rawbyte *) p_outfile->file_base + index,
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
475 (Rawbyte *) p_infile->file_base + index, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 static void
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 1204
diff changeset
479 dump_bss_and_heap (file_data *UNUSED (p_infile), file_data *p_outfile)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
481 Rawbyte *heap_data;
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
482 unsigned long size, index;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
484 DUMP_MSG (("Dumping heap onto end of executable...\n"));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
486 index = heap_index_in_executable;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
487 size = get_committed_heap_size ();
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
488 heap_data = get_heap_start ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
490 DUMP_MSG (("\t0x%08x Heap start in process.\n", heap_data));
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
491 DUMP_MSG (("\t0x%08x Heap offset in executable.\n", index));
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
492 DUMP_MSG (("\t0x%08x Heap size in bytes.\n", size));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
494 memcpy ((PUCHAR) p_outfile->file_base + index, heap_data, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 #ifndef DUMP_SEPARATE_SECTION
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
497 DUMP_MSG (("Dumping bss onto end of executable...\n"));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
499 index += size;
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
500 size = bss_size;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
502 DUMP_MSG (("\t0x%08x BSS start in process.\n", bss_start));
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
503 DUMP_MSG (("\t0x%08x BSS offset in executable.\n", index));
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
504 DUMP_MSG (("\t0x%08x BSS size in bytes.\n", size));
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
505 memcpy ((Rawbyte *) p_outfile->file_base + index, bss_start, size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 #undef DUMP_MSG
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 /* Reload and remap routines. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 /* Load the dumped .bss section into the .bss area of our address space. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 /* Already done if the .bss was part of a separate emacs data section */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 void
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
517 read_in_bss (Extbyte *filename)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 #ifndef DUMP_SEPARATE_SECTION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 HANDLE file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 unsigned long index, n_read;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
523 file = qxeCreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL,
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
524 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
5050
6f2158fa75ed Fix quick-build, use asserts() in place of ABORT()
Ben Wing <ben@xemacs.org>
parents: 4854
diff changeset
525 assert (file != INVALID_HANDLE_VALUE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 /* Seek to where the .bss section is tucked away after the heap... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 index = heap_index_in_executable + get_committed_heap_size ();
5050
6f2158fa75ed Fix quick-build, use asserts() in place of ABORT()
Ben Wing <ben@xemacs.org>
parents: 4854
diff changeset
529 if (SetFilePointer (file, index, NULL, FILE_BEGIN) == 0xFFFFFFFF)
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2421
diff changeset
530 ABORT ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 /* Ok, read in the saved .bss section and initialize all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 uninitialized variables. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 if (!ReadFile (file, bss_start, bss_size, &n_read, NULL))
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2421
diff changeset
535 ABORT ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 CloseHandle (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 /* Map the heap dumped into the executable file into our address space. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 void
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
543 map_in_heap (Extbyte *filename)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 HANDLE file;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 HANDLE file_mapping;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 void *file_base;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 unsigned long size, upper_size, n_read;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
550 file = qxeCreateFile (filename, GENERIC_READ, FILE_SHARE_READ, NULL,
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
551 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
5050
6f2158fa75ed Fix quick-build, use asserts() in place of ABORT()
Ben Wing <ben@xemacs.org>
parents: 4854
diff changeset
552 assert (file != INVALID_HANDLE_VALUE);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 size = GetFileSize (file, &upper_size);
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
555 file_mapping = qxeCreateFileMapping (file, NULL, PAGE_WRITECOPY,
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 812
diff changeset
556 0, size, NULL);
5050
6f2158fa75ed Fix quick-build, use asserts() in place of ABORT()
Ben Wing <ben@xemacs.org>
parents: 4854
diff changeset
557 assert (file_mapping);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 size = get_committed_heap_size ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 file_base = MapViewOfFileEx (file_mapping, FILE_MAP_COPY, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 heap_index_in_executable, size,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 get_heap_start ());
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 if (file_base != 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 /* If we don't succeed with the mapping, then copy from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 data into the heap. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 CloseHandle (file_mapping);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 if (VirtualAlloc (get_heap_start (), get_committed_heap_size (),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE) == NULL)
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2421
diff changeset
575 ABORT ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 /* Seek to the location of the heap data in the executable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 if (SetFilePointer (file, heap_index_in_executable,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 NULL, FILE_BEGIN) == 0xFFFFFFFF)
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2421
diff changeset
580 ABORT ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 /* Read in the data. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 if (!ReadFile (file, get_heap_start (),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 get_committed_heap_size (), &n_read, NULL))
2500
3d8143fc88e1 [xemacs-hg @ 2005-01-24 23:33:30 by ben]
ben
parents: 2421
diff changeset
585 ABORT ();
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 CloseHandle (file);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 }