From: "Kazu" <kazoo@r3.dion.ne.jp>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] Real hard disk drive for Win2k/XP host
Date: Wed, 14 Sep 2005 12:41:39 +0900 [thread overview]
Message-ID: <005a01c5b8de$373f1a20$0464a8c0@athlon> (raw)
[-- Attachment #1: Type: text/plain, Size: 1192 bytes --]
Hi,
This patch supports a real hard disk drive by \\.\PhysicalDriveN
(N=0,1,2,...) on Windows 2000/XP host. Windows 98/Me are not supported.
You can also use slash like //./PhysicalDriveN. You can see a number in
Administration Tools in Control Panel. This is not case-sensitive. It is
necessary to have an administrative priviledge.This can be used like this.
> qemu.exe -L .\bios -hda win2k.img -hdb \\.\PhysicalDrive0
This patch also adds a size information about CD-ROM.
It is safe to use it as a read-only. Making a file from guest OS to real
hard
disk isn't recognized immediately. Rebooting a host OS recognized the file.
Making a directory from guest OS breaks a host's file system.
There is a case that changes of files in a host OS isn't recognized by a
guest OS. Shut down the guest OS, move the file to another directory and
boot the guest OS. Then the file is recognized.
Windows 98/Me doesn't recognize NTFS file system. When you use Windows XP on
NTFS, Windows 98/Me guest can't see host files.
If you don't have a multi-boot environment, don't boot from your system hard
disk.
>qemu.exe -L .\bios -hda \\.\PhysicalDrive0
It will break your host OS.
Regards,
Kazu
[-- Attachment #2: qemu-0.7.2-hd.patch --]
[-- Type: application/octet-stream, Size: 2672 bytes --]
diff -ur qemu-0.7.2.orig/block.c qemu-0.7.2/block.c
--- qemu-0.7.2.orig/block.c Mon Sep 5 02:11:31 2005
+++ qemu-0.7.2/block.c Sun Sep 11 17:16:15 2005
@@ -546,6 +546,44 @@
return 1; /* maybe */
}
+#ifdef _WIN32
+static int64_t get_size(BlockDriverState *bs, const char *filename, int fd)
+{
+ int64_t size;
+ BOOL status;
+ ULARGE_INTEGER available, total, total_free;
+ char *drive_letter;
+ HANDLE hHd;
+ DISK_GEOMETRY dg;
+ DWORD count;
+
+ if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM &&
+ (strstart(filename, "//", NULL) || strstart(filename, "\\\\", NULL))) {
+ drive_letter = (char *)filename + 4;
+ status = GetDiskFreeSpaceEx(drive_letter, &available, &total, &total_free);
+ if (status != FALSE){
+ return total.QuadPart;
+ } else {
+ return -1;
+ }
+ } else if (bdrv_get_type_hint(bs) == BDRV_TYPE_HD &&
+ (strstart(filename, "//", NULL) || strstart(filename, "\\\\", NULL))) {
+ hHd = (HANDLE)_get_osfhandle(fd);
+ status = DeviceIoControl(hHd, IOCTL_DISK_GET_DRIVE_GEOMETRY,
+ NULL, 0, &dg, sizeof(dg), &count, NULL);
+ if (status != FALSE) {
+ size = dg.Cylinders.QuadPart * dg.TracksPerCylinder
+ * dg.SectorsPerTrack * dg.BytesPerSector;
+ return size;
+ } else {
+ return -1;
+ }
+ }
+ size = lseek(fd, 0, SEEK_END);
+ return size;
+}
+#endif
+
static int raw_open(BlockDriverState *bs, const char *filename)
{
BDRVRawState *s = bs->opaque;
@@ -576,8 +614,7 @@
#ifdef _WIN32
/* On Windows hosts it can happen that we're unable to get file size
for CD-ROM raw device (it's inherent limitation of the CDFS driver). */
- if (size == -1)
- size = LONG_LONG_MAX;
+ size = get_size(bs, filename, fd);
#endif
bs->total_sectors = size / 512;
s->fd = fd;
diff -ur qemu-0.7.2.orig/vl.c qemu-0.7.2/vl.c
--- qemu-0.7.2.orig/vl.c Mon Sep 5 02:11:31 2005
+++ qemu-0.7.2/vl.c Sun Sep 11 17:16:15 2005
@@ -61,8 +61,6 @@
#ifdef _WIN32
#include <malloc.h>
#include <sys/timeb.h>
-#include <windows.h>
-#define getopt_long_only getopt_long
#define memalign(align, size) malloc(size)
#endif
diff -ur qemu-0.7.2.orig/vl.h qemu-0.7.2/vl.h
--- qemu-0.7.2.orig/vl.h Mon Sep 5 02:11:31 2005
+++ qemu-0.7.2/vl.h Sun Sep 11 17:16:15 2005
@@ -47,6 +47,8 @@
#endif
#ifdef _WIN32
+#include <windows.h>
+#include <winioctl.h>
#define lseek _lseeki64
#define ENOTSUP 4096
/* XXX: find 64 bit version */
next reply other threads:[~2005-09-14 4:03 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-14 3:41 Kazu [this message]
2005-09-14 15:39 ` [Qemu-devel] Real hard disk drive for Win2k/XP host Jim C. Brown
2005-09-14 23:07 ` Kazu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='005a01c5b8de$373f1a20$0464a8c0@athlon' \
--to=kazoo@r3.dion.ne.jp \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.