diff options
author | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-01-07 22:43:30 +0000 |
---|---|---|
committer | bellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-01-07 22:43:30 +0000 |
commit | 01781963983206feac8c6be5ded68c3ee244c4ad (patch) | |
tree | 230f66d686cd3b35918a1dcff9ec8eba1c3218c6 | |
parent | 18607dcb7ce42da3e36f1c9bf6c77f28ebf293c8 (diff) |
win32: physical drive support (initial patch by kazu)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2311 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r-- | block-raw.c | 16 | ||||
-rw-r--r-- | qemu-doc.texi | 19 |
2 files changed, 30 insertions, 5 deletions
diff --git a/block-raw.c b/block-raw.c index 8cf198854a..2b6f441bad 100644 --- a/block-raw.c +++ b/block-raw.c @@ -838,6 +838,7 @@ BlockDriver bdrv_host_device = { #define FTYPE_FILE 0 #define FTYPE_CD 1 +#define FTYPE_HARDDISK 2 typedef struct BDRVRawState { HANDLE hfile; @@ -1098,6 +1099,9 @@ static int64_t raw_getlength(BlockDriverState *bs) BDRVRawState *s = bs->opaque; LARGE_INTEGER l; ULARGE_INTEGER available, total, total_free; + DISK_GEOMETRY dg; + DWORD count; + BOOL status; switch(s->type) { case FTYPE_FILE: @@ -1110,6 +1114,14 @@ static int64_t raw_getlength(BlockDriverState *bs) return -EIO; l.QuadPart = total.QuadPart; break; + case FTYPE_HARDDISK: + status = DeviceIoControl(s->hfile, IOCTL_DISK_GET_DRIVE_GEOMETRY, + NULL, 0, &dg, sizeof(dg), &count, NULL); + if (status != FALSE) { + l.QuadPart = dg.Cylinders.QuadPart * dg.TracksPerCylinder + * dg.SectorsPerTrack * dg.BytesPerSector; + } + break; default: return -EIO; } @@ -1216,6 +1228,8 @@ static int find_device_type(BlockDriverState *bs, const char *filename) if (strstart(filename, "\\\\.\\", &p) || strstart(filename, "//./", &p)) { + if (stristart(p, "PhysicalDrive", NULL)) + return FTYPE_HARDDISK; snprintf(s->drive_path, sizeof(s->drive_path), "%c:\\", p[0]); type = GetDriveType(s->drive_path); if (type == DRIVE_CDROM) @@ -1248,7 +1262,7 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) } } s->type = find_device_type(bs, filename); - + if ((flags & BDRV_O_ACCESS) == O_RDWR) { access_flags = GENERIC_READ | GENERIC_WRITE; } else { diff --git a/qemu-doc.texi b/qemu-doc.texi index 655e151490..0423ef0654 100644 --- a/qemu-doc.texi +++ b/qemu-doc.texi @@ -1079,14 +1079,25 @@ line option or modify the device permissions accordingly). @subsubsection Windows -On Windows you can use any host drives as QEMU drive. The prefered -syntax is the driver letter (e.g. @file{d:}). The alternate syntax -@file{\\.\d:} is supported. @file{/dev/cdrom} is supported as an alias -to the first CDROM drive. +@table @code +@item CD +The prefered syntax is the drive letter (e.g. @file{d:}). The +alternate syntax @file{\\.\d:} is supported. @file{/dev/cdrom} is +supported as an alias to the first CDROM drive. Currently there is no specific code to handle removable medias, so it is better to use the @code{change} or @code{eject} monitor commands to change or eject media. +@item Hard disks +Hard disks can be used with the syntax: @file{\\.\PhysicalDriveN} +where @var{N} is the drive number (0 is the first hard disk). + +WARNING: unless you know what you do, it is better to only make +READ-ONLY accesses to the hard disk otherwise you may corrupt your +host data (use the @option{-snapshot} command line so that the +modifications are written in a temporary file). +@end table + @subsubsection Mac OS X |