diff --git a/bochs/Makefile.in b/bochs/Makefile.in
index 550065ed9..f31ef4761 100644
--- a/bochs/Makefile.in
+++ b/bochs/Makefile.in
@@ -249,7 +249,7 @@ bxcommit@EXE@: misc/bxcommit.o
 	@LINK_CONSOLE@ misc/bxcommit.o
 
 bximage_new@EXE@: misc/bximage_new.o misc/hdimage.o misc/vmware3.o misc/vmware4.o misc/vpc-img.o
-	@LINK_CONSOLE@ misc/bximage_new.o misc/hdimage.o misc/vmware3.o misc/vmware4.o misc/vpc-img.o
+	@LINK_CONSOLE@ $(BXIMAGE_LINK_OPTS) misc/bximage_new.o misc/hdimage.o misc/vmware3.o misc/vmware4.o misc/vpc-img.o
 
 niclist@EXE@: misc/niclist.o
 	@LINK_CONSOLE@ misc/niclist.o
diff --git a/bochs/misc/bximage_new.cc b/bochs/misc/bximage_new.cc
index 76547f36c..30064fcc0 100644
--- a/bochs/misc/bximage_new.cc
+++ b/bochs/misc/bximage_new.cc
@@ -355,7 +355,46 @@ void create_flat_image(const char *filename, Bit64u size)
 #ifdef WIN32
 void create_flat_image_win32(const char *filename, Bit64u size)
 {
-  // TODO
+  HANDLE hFile;
+  LARGE_INTEGER pos;
+  DWORD dwCount, errCode;
+  USHORT mode;
+  char buffer[1024];
+
+  hFile = CreateFile(filename, GENERIC_WRITE|GENERIC_READ, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
+  if (hFile == INVALID_HANDLE_VALUE) {
+    // attempt to print an error
+#ifdef HAVE_PERROR
+    sprintf(buffer, "while opening '%s' for writing", filename);
+    perror(buffer);
+#endif
+    fatal("ERROR: Could not write disk image");
+  }
+
+  SetLastError(NO_ERROR);
+  mode = COMPRESSION_FORMAT_DEFAULT;
+  dwCount = 0;
+  memset(buffer, 0, 512);
+  WriteFile(hFile, buffer, 512, &dwCount, NULL); // set the first sector to 0, Win98 doesn't zero out the file
+                                                 // if there is a write at/over the end
+  DeviceIoControl(hFile, FSCTL_SET_COMPRESSION, &mode, sizeof(mode), NULL, 0, &dwCount, NULL);
+  pos.u.LowPart = (unsigned long)((size - 512));
+  pos.u.HighPart = (unsigned long)((size - 512) >> 32);
+  pos.u.LowPart = SetFilePointer(hFile, pos.u.LowPart, &pos.u.HighPart, FILE_BEGIN);
+  memset(buffer, 0, 512);
+  if ((pos.u.LowPart == 0xffffffff && GetLastError() != NO_ERROR) ||
+      !WriteFile(hFile, buffer, 512, &dwCount, NULL) || (dwCount != 512)) {
+    errCode = GetLastError();
+    CloseHandle(hFile);
+    if (errCode == ERROR_DISK_FULL) {
+      fatal("\nERROR: Not enough space on disk for image!");
+    } else {
+      sprintf(buffer, "\nERROR: Disk image creation failed with error code %i!", errCode);
+      fatal(buffer);
+    }
+  }
+
+  CloseHandle(hFile);
 }
 #endif
 
@@ -428,11 +467,11 @@ void create_hard_disk_image(const char *filename, int imgmode, Bit64u size)
 {
   switch (imgmode) {
     case BX_HDIMAGE_MODE_FLAT:
-//#ifndef WIN32
+#ifndef WIN32
       create_flat_image(filename, size);
-//#else
-//      create_flat_image_win32(filename, size);
-//#endif
+#else
+      create_flat_image_win32(filename, size);
+#endif
       break;
 
     case BX_HDIMAGE_MODE_GROWING: