aboutsummaryrefslogtreecommitdiff
path: root/block-raw.c
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2007-01-07 22:43:30 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2007-01-07 22:43:30 +0000
commit01781963983206feac8c6be5ded68c3ee244c4ad (patch)
tree230f66d686cd3b35918a1dcff9ec8eba1c3218c6 /block-raw.c
parent18607dcb7ce42da3e36f1c9bf6c77f28ebf293c8 (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
Diffstat (limited to 'block-raw.c')
-rw-r--r--block-raw.c16
1 files changed, 15 insertions, 1 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 {