diff src/w32heap.c @ 19708:16e69fbdbf0f

(os_subtype): New variable. (cache_system_info): Set os_subtype. (recreate_heap): Update system information after loading heap. Don't use data_seg pragma here. (_heap_init, _heap_term) [_MSC_VER >= 1000]: New functions that override CRT routines.
author Geoff Voelker <voelker@cs.washington.edu>
date Wed, 03 Sep 1997 00:51:32 +0000
parents bcc706aedcea
children 2595beed0362
line wrap: on
line diff
--- a/src/w32heap.c	Wed Sep 03 00:47:47 1997 +0000
+++ b/src/w32heap.c	Wed Sep 03 00:51:32 1997 +0000
@@ -41,6 +41,9 @@
 int w32_major_version;
 int w32_minor_version;
 
+/* Distinguish between Windows NT and Windows 95.  */
+int os_subtype;
+
 /* Cache information describing the NT system for later use.  */
 void
 cache_system_info (void)
@@ -61,6 +64,11 @@
   w32_major_version = version.info.major;
   w32_minor_version = version.info.minor;
 
+  if (version.info.platform & 0x8000)
+    os_subtype = OS_WIN95;
+  else
+    os_subtype = OS_NT;
+
   /* Cache page size, allocation unit, processor type, etc.  */
   GetSystemInfo (&sysinfo_cache);
   syspage_mask = sysinfo_cache.dwPageSize - 1;
@@ -85,10 +93,6 @@
   return (unsigned char *) (tmp * align);
 }
 
-/* Force zero initialized variables to be placed in the .data segment;
-   MSVC 5.0 otherwise places them in .bss, which breaks the dumping code.  */
-#pragma data_seg(".data")
-
 /* Info for keeping track of our heap.  */
 unsigned char *data_region_base = NULL;
 unsigned char *data_region_end = NULL;
@@ -278,6 +282,9 @@
      any funny interactions between file I/O and file mapping.  */
   read_in_bss (executable_path);
   map_in_heap (executable_path);
+
+  /* Update system version information to match current system.  */
+  cache_system_info ();
 }
 
 /* Round the heap up to the given alignment.  */
@@ -293,3 +300,26 @@
   if (need_to_alloc) 
     sbrk (need_to_alloc);
 }
+
+#if (_MSC_VER >= 1000)
+
+/* MSVC 4.2 invokes these functions from mainCRTStartup to initialize
+   a heap via HeapCreate.  They are normally defined by the runtime,
+   but we override them here so that the unnecessary HeapCreate call
+   is not performed.  */
+
+int __cdecl
+_heap_init (void)
+{
+  /* Stepping through the assembly indicates that mainCRTStartup is
+     expecting a nonzero success return value.  */
+  return 1;
+}
+
+void __cdecl
+_heap_term (void)
+{
+  return;
+}
+
+#endif