diff --git a/racket/src/cs/c/boot.c b/racket/src/cs/c/boot.c
index ffe8dea8dd..39540d4e65 100644
--- a/racket/src/cs/c/boot.c
+++ b/racket/src/cs/c/boot.c
@@ -96,7 +96,8 @@ void racket_boot(int argc, char **argv, char *exec_file, char *run_file,
char *coldir, char *configdir, /* wchar_t * */void *dlldir,
int pos1, int pos2, int pos3,
int cs_compiled_subdir, int is_gui,
- int wm_is_gracket, char *gracket_guid)
+ int wm_is_gracket, char *gracket_guid,
+ void *dll_open, void *dll_find_object)
/* exe argument already stripped from argv */
{
#if !defined(RACKET_USE_FRAMEWORK) || !defined(RACKET_AS_BOOT)
@@ -109,6 +110,8 @@ void racket_boot(int argc, char **argv, char *exec_file, char *run_file,
#ifdef WIN32
if (dlldir)
rktio_set_dll_path((wchar_t *)dlldir);
+ if (dll_open)
+ rktio_set_dll_procs(dll_open, dll_find_object);
#endif
Sscheme_init(NULL);
diff --git a/racket/src/cs/c/boot.h b/racket/src/cs/c/boot.h
index 7fda935e66..47f656e680 100644
--- a/racket/src/cs/c/boot.h
+++ b/racket/src/cs/c/boot.h
@@ -3,11 +3,13 @@ BOOT_EXTERN void racket_boot(int argc, char **argv, char *exec_file, char *run_f
char *coldir, char *configdir, /* wchar_t * */void *dlldir,
int pos1, int pos2, int pos3,
int cs_compiled_subdir, int is_gui,
- int wm_is_gracket, char *gracket_guid);
+ int wm_is_gracket, char *gracket_guid,
+ void *ddll_open, void *dll_find_object);
typedef void (*racket_boot_t)(int argc, char **argv, char *exec_file, char *run_file,
char* boot_exe, long segment_offset,
char *coldir, char *configdir, /* wchar_t * */void *dlldir,
int pos1, int pos2, int pos3,
int cs_compiled_subdir, int is_gui,
- int wm_is_gracket, char *gracket_guid);
+ int wm_is_gracket, char *gracket_guid,
+ void *ddll_open, void *dll_find_object);
diff --git a/racket/src/cs/c/main.c b/racket/src/cs/c/main.c
index 45b714ce3d..292f1fddaa 100644
--- a/racket/src/cs/c/main.c
+++ b/racket/src/cs/c/main.c
@@ -29,6 +29,22 @@ static int scheme_utf8_encode(unsigned int *path, int zero_offset, int len,
#include "../../start/config.inc"
+#ifdef WIN32
+typedef void *(*scheme_dll_open_proc)(const char *name, int as_global);
+typedef void *(*scheme_dll_find_object_proc)(void *h, const char *name);
+static scheme_dll_open_proc embedded_dll_open;
+static scheme_dll_find_object_proc scheme_dll_find_object;
+static void scheme_set_dll_procs(scheme_dll_open_proc open, scheme_dll_find_object_proc find)
+{
+ embedded_dll_open = open;
+ scheme_dll_find_object = find;
+}
+# include "../../start/embedded_dll.inc"
+#else
+# define embedded_dll_open NULL
+# define scheme_dll_find_object NULL
+#endif
+
char *boot_file_data = "BooT FilE OffsetS:xxxxyyyyyzzzz";
static int boot_file_offset = 18;
@@ -296,8 +312,8 @@ static int bytes_main(int argc, char **argv,
long segment_offset;
#ifdef WIN32
wchar_t *dll_path;
- HMODULE dll;
racket_boot_t racket_boot_p;
+ long boot_rsrc_offset = 0;
#endif
do_pre_filter_cmdline_arguments(&argc, &argv);
@@ -308,10 +324,21 @@ static int bytes_main(int argc, char **argv,
}
#ifdef WIN32
-# define racket_boot racket_boot_p
- dll_path = load_delayed_dll_x(NULL, "libracketcsxxxxxxx.dll", &dll);
+ parse_embedded_dlls();
+ register_embedded_dll_hooks();
+ if (embedded_dll_open) {
+ void *dll;
+ dll = embedded_dll_open("libracketcsxxxxxxx.dll", 1);
+ boot_rsrc_offset = in_memory_get_offset("libracketcsxxxxxxx.dll");
+ racket_boot_p = (racket_boot_t)scheme_dll_find_object(dll, "racket_boot");
+ dll_path = get_self_executable_path();
+ } else {
+ HMODULE dll;
+ dll_path = load_delayed_dll_x(NULL, "libracketcsxxxxxxx.dll", &dll);
+ racket_boot_p = (racket_boot_t)GetProcAddress(dll, "racket_boot");
+ }
boot_exe = string_to_utf8(dll_path);
- racket_boot_p = (racket_boot_t)GetProcAddress(dll, "racket_boot");
+# define racket_boot racket_boot_p
#else
boot_exe = get_self_path(exec_file);
#endif
@@ -331,7 +358,7 @@ static int bytes_main(int argc, char **argv,
boot_offset = find_boot_section(boot_exe);
#endif
#ifdef WIN32
- boot_offset = find_resource_offset(dll_path, 259);
+ boot_offset = find_resource_offset(dll_path, 259, boot_rsrc_offset);
#endif
pos1 += boot_offset;
@@ -343,7 +370,8 @@ static int bytes_main(int argc, char **argv,
extract_coldir(), extract_configdir(), extract_dlldir(),
pos1, pos2, pos3,
CS_COMPILED_SUBDIR, RACKET_IS_GUI,
- wm_is_gracket, gracket_guid);
+ wm_is_gracket, gracket_guid,
+ embedded_dll_open, scheme_dll_find_object);
return 0;
}
diff --git a/racket/src/start/config.inc b/racket/src/start/config.inc
index eccd2530de..3d10d19b76 100644
--- a/racket/src/start/config.inc
+++ b/racket/src/start/config.inc
@@ -162,12 +162,12 @@ wchar_t *get_self_executable_path() XFORM_SKIP_PROC
return path;
}
-static DWORD find_by_id(HANDLE fd, DWORD rsrcs, DWORD pos, int id) XFORM_SKIP_PROC
+static DWORD find_by_id(HANDLE fd, DWORD rsrcs, DWORD pos, int id, long delta) XFORM_SKIP_PROC
{
DWORD got, val;
WORD name_count, id_count;
- SetFilePointer(fd, pos + 12, 0, FILE_BEGIN);
+ SetFilePointer(fd, pos + 12 + delta, 0, FILE_BEGIN);
ReadFile(fd, &name_count, 2, &got, NULL);
ReadFile(fd, &id_count, 2, &got, NULL);
@@ -185,7 +185,7 @@ static DWORD find_by_id(HANDLE fd, DWORD rsrcs, DWORD pos, int id) XFORM_SKIP_PR
return 0;
}
-static long find_resource_offset(wchar_t *path, int id) XFORM_SKIP_PROC
+static long find_resource_offset(wchar_t *path, int id, long delta) XFORM_SKIP_PROC
{
/* Find the resource of type `id` */
HANDLE fd;
@@ -196,7 +196,6 @@ static long find_resource_offset(wchar_t *path, int id) XFORM_SKIP_PROC
OPEN_EXISTING,
0,
NULL);
- free(path);
if (fd == INVALID_HANDLE_VALUE)
return 0;
@@ -205,16 +204,16 @@ static long find_resource_offset(wchar_t *path, int id) XFORM_SKIP_PROC
WORD num_sections, head_size;
char name[8];
- SetFilePointer(fd, 60, 0, FILE_BEGIN);
+ SetFilePointer(fd, 60+delta, 0, FILE_BEGIN);
ReadFile(fd, &val, 4, &got, NULL);
- SetFilePointer(fd, val+4+2, 0, FILE_BEGIN); /* Skip "PE\0\0" tag and machine */
+ SetFilePointer(fd, val+4+2+delta, 0, FILE_BEGIN); /* Skip "PE\0\0" tag and machine */
ReadFile(fd, &num_sections, 2, &got, NULL);
SetFilePointer(fd, 12, 0, FILE_CURRENT); /* time stamp + symbol table */
ReadFile(fd, &head_size, 2, &got, NULL);
sec_pos = val+4+20+head_size;
while (num_sections--) {
- SetFilePointer(fd, sec_pos, 0, FILE_BEGIN);
+ SetFilePointer(fd, sec_pos+delta, 0, FILE_BEGIN);
ReadFile(fd, &name, 8, &got, NULL);
if ((name[0] == '.')
&& (name[1] == 'r')
@@ -226,24 +225,24 @@ static long find_resource_offset(wchar_t *path, int id) XFORM_SKIP_PROC
ReadFile(fd, &virtual_addr, 4, &got, NULL);
SetFilePointer(fd, 4, 0, FILE_CURRENT); /* skip file size */
ReadFile(fd, &rsrcs, 4, &got, NULL);
- SetFilePointer(fd, rsrcs, 0, FILE_BEGIN);
+ SetFilePointer(fd, rsrcs+delta, 0, FILE_BEGIN);
/* We're at the resource table; step through 3 layers */
- pos = find_by_id(fd, rsrcs, rsrcs, id);
+ pos = find_by_id(fd, rsrcs, rsrcs, id, delta);
if (pos) {
- pos = find_by_id(fd, rsrcs, pos, 1);
+ pos = find_by_id(fd, rsrcs, pos, 1, delta);
if (pos) {
- pos = find_by_id(fd, rsrcs, pos, 1033);
+ pos = find_by_id(fd, rsrcs, pos, 1033, delta);
if (pos) {
/* pos is the reource data entry */
- SetFilePointer(fd, pos, 0, FILE_BEGIN);
+ SetFilePointer(fd, pos+delta, 0, FILE_BEGIN);
ReadFile(fd, &val, 4, &got, NULL);
pos = val - virtual_addr + rsrcs;
CloseHandle(fd);
- return pos;
+ return pos+delta;
}
}
}
@@ -261,7 +260,7 @@ static long find_resource_offset(wchar_t *path, int id) XFORM_SKIP_PROC
static long get_segment_offset() XFORM_SKIP_PROC
{
- return find_resource_offset(get_self_executable_path(), 257);
+ return find_resource_offset(get_self_executable_path(), 257, 0);
}
#endif
diff --git a/racket/src/start/embedded_dll.inc b/racket/src/start/embedded_dll.inc
index 579285f58c..0ef5ea02f4 100644
--- a/racket/src/start/embedded_dll.inc
+++ b/racket/src/start/embedded_dll.inc
@@ -38,7 +38,7 @@ static void parse_embedded_dlls()
{
long rsrc_pos;
- rsrc_pos = find_resource_offset(get_self_executable_path(), 258);
+ rsrc_pos = find_resource_offset(get_self_executable_path(), 258, 0);
if (rsrc_pos) {
HANDLE fd = open_self();
@@ -140,6 +140,19 @@ static void *in_memory_find_object(void *h, const char *name)
}
}
+static long in_memory_get_offset(const char *name)
+{
+ int i;
+
+ for (i = 0; embedded_dlls[i].name; i++) {
+ if (!_stricmp(embedded_dlls[i].name, name)) {
+ return embedded_dlls[i].pos;
+ }
+ }
+
+ return 0;
+}
+
static void register_embedded_dll_hooks()
{
if (embedded_dlls) {
diff --git a/racket/src/worksp/cs/Makefile b/racket/src/worksp/cs/Makefile
index 03545841c7..211431e217 100644
--- a/racket/src/worksp/cs/Makefile
+++ b/racket/src/worksp/cs/Makefile
@@ -4,9 +4,10 @@ INCS = /I.. /I..\..\rktio /I..\librktio /I$(SCHEME_DIR)\$(MACHINE)\boot\$(MACHIN
RKTIO_LIB = ..\..\build\librktio.lib
BASE_WIN32_LIBS = WS2_32.lib Shell32.lib User32.lib
WIN32_LIBS = $(BASE_WIN32_LIBS) RpCrt4.lib Ole32.lib Advapi32.lib
+SCHEME_LIB_FULL = $(SCHEME_DIR)\$(MACHINE)\boot\$(MACHINE)\$(SCHEME_LIB)
LIBS = $(RKTIO_LIB) \
- $(SCHEME_DIR)\$(MACHINE)\boot\$(MACHINE)\$(SCHEME_LIB) \
+ $(SCHEME_LIB_FULL) \
$(WIN32_LIBS)
DEST_DLL = ..\..\build\raw_libracketcs.dll
@@ -17,27 +18,30 @@ CSDIR = ..\..\cs\c
MAIN_DEPS = ..\..\start\config.inc \
..\..\start\parse_cmdl.inc \
..\..\start\delayed.inc \
- ..\..\start\win_single.inc
+ ..\..\start\win_single.inc \
+ ..\..\start\embedded_dll.inc
-FLAGS = /DWIN32
+MEMMOD = ..\..\start\MemoryModule.c
+
+FLAGS = /DWIN32 /Ox /MT
COMP_SUBDIR = /DCS_COMPILED_SUBDIR=1
all: $(DEST) $(GDEST)
-$(DEST_DLL): $(CSDIR)\boot.c libracket.res $(RKTIO_LIB)
- cl /LD /DLL /Fe$(DEST_DLL) /Ox /MT $(FLAGS) $(INCS) $(CSDIR)\boot.c libracket.res $(LIBS)
+$(DEST_DLL): $(CSDIR)\boot.c libracket.res $(RKTIO_LIB) $(SCHEME_LIB_FULL)
+ cl /LD /DLL /Fe$(DEST_DLL) $(FLAGS) $(INCS) $(CSDIR)\boot.c libracket.res $(LIBS)
libracket.res: libracket.rc
rc /l 0x409 /folibracket.res libracket.rc
-$(DEST): $(CSDIR)\main.c $(MAIN_DEPS) $(DEST_DLL) racket.res
- cl /Fe$(DEST) /Ox /MT $(COMP_SUBDIR) $(FLAGS) $(INCS) $(CSDIR)\main.c racket.res $(WIN32_LIBS)
+$(DEST): $(CSDIR)\main.c $(MAIN_DEPS) $(MEMMOD) $(DEST_DLL) racket.res
+ cl /Fe$(DEST) $(COMP_SUBDIR) $(FLAGS) $(INCS) $(CSDIR)\main.c $(MEMMOD) racket.res $(WIN32_LIBS)
racket.res: ../racket/racket.rc ../racket/racket.ico
rc /l 0x409 /foracket.res ../racket/racket.rc
$(GDEST): $(CSDIR)\grmain.c $(CSDIR)\main.c $(MAIN_DEPS) $(DEST_DLL) gracket.res
- cl /Fe$(GDEST) /Ox /MT $(COMP_SUBDIR) $(FLAGS) $(INCS) $(CSDIR)\grmain.c gracket.res $(WIN32_LIBS)
+ cl /Fe$(GDEST) $(COMP_SUBDIR) $(FLAGS) $(INCS) $(CSDIR)\grmain.c $(MEMMOD) gracket.res $(WIN32_LIBS)
gracket.res: ../gracket/gracket.rc ../gracket/gracket.ico
rc /l 0x409 /fogracket.res ../gracket/gracket.rc
diff --git a/racket/src/worksp/cs/vc140.pdb b/racket/src/worksp/cs/vc140.pdb
new file mode 100644
index 0000000000..cdb4f3ed6d
Binary files /dev/null and b/racket/src/worksp/cs/vc140.pdb differ
diff --git a/racket/src/worksp/csbuild.rkt b/racket/src/worksp/csbuild.rkt
index f10859adc8..55fe9d7a2d 100644
--- a/racket/src/worksp/csbuild.rkt
+++ b/racket/src/worksp/csbuild.rkt
@@ -103,7 +103,8 @@
(prep-chez-scheme scheme-dir machine)
(parameterize ([current-directory (build-path scheme-dir machine "c")])
- (system*! "nmake" (format "Makefile.~a" machine)))
+ (system*! "nmake"
+ (format "Makefile.~a" machine)))
;; ----------------------------------------
diff --git a/racket/src/worksp/mrstart/mrstart.vcxproj b/racket/src/worksp/mrstart/mrstart.vcxproj
index 79741c1ab9..4ad488c5c9 100644
--- a/racket/src/worksp/mrstart/mrstart.vcxproj
+++ b/racket/src/worksp/mrstart/mrstart.vcxproj
@@ -38,6 +38,7 @@
<_ProjectFileVersion>10.0.40219.1
+ MrStart
..\..\..\lib\
$(Platform)\$(Configuration)\
false
diff --git a/racket/src/worksp/mzstart/mzstart.vcxproj b/racket/src/worksp/mzstart/mzstart.vcxproj
index e235374916..4a56b5f954 100644
--- a/racket/src/worksp/mzstart/mzstart.vcxproj
+++ b/racket/src/worksp/mzstart/mzstart.vcxproj
@@ -38,6 +38,7 @@
<_ProjectFileVersion>10.0.40219.1
+ MzStart
..\..\..\lib\
$(Platform)\$(Configuration)\
false