Commit 01781963983206feac8c6be5ded68c3ee244c4ad
1 parent
18607dcb
win32: physical drive support (initial patch by kazu)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2311 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
30 additions
and
5 deletions
block-raw.c
@@ -838,6 +838,7 @@ BlockDriver bdrv_host_device = { | @@ -838,6 +838,7 @@ BlockDriver bdrv_host_device = { | ||
838 | 838 | ||
839 | #define FTYPE_FILE 0 | 839 | #define FTYPE_FILE 0 |
840 | #define FTYPE_CD 1 | 840 | #define FTYPE_CD 1 |
841 | +#define FTYPE_HARDDISK 2 | ||
841 | 842 | ||
842 | typedef struct BDRVRawState { | 843 | typedef struct BDRVRawState { |
843 | HANDLE hfile; | 844 | HANDLE hfile; |
@@ -1098,6 +1099,9 @@ static int64_t raw_getlength(BlockDriverState *bs) | @@ -1098,6 +1099,9 @@ static int64_t raw_getlength(BlockDriverState *bs) | ||
1098 | BDRVRawState *s = bs->opaque; | 1099 | BDRVRawState *s = bs->opaque; |
1099 | LARGE_INTEGER l; | 1100 | LARGE_INTEGER l; |
1100 | ULARGE_INTEGER available, total, total_free; | 1101 | ULARGE_INTEGER available, total, total_free; |
1102 | + DISK_GEOMETRY dg; | ||
1103 | + DWORD count; | ||
1104 | + BOOL status; | ||
1101 | 1105 | ||
1102 | switch(s->type) { | 1106 | switch(s->type) { |
1103 | case FTYPE_FILE: | 1107 | case FTYPE_FILE: |
@@ -1110,6 +1114,14 @@ static int64_t raw_getlength(BlockDriverState *bs) | @@ -1110,6 +1114,14 @@ static int64_t raw_getlength(BlockDriverState *bs) | ||
1110 | return -EIO; | 1114 | return -EIO; |
1111 | l.QuadPart = total.QuadPart; | 1115 | l.QuadPart = total.QuadPart; |
1112 | break; | 1116 | break; |
1117 | + case FTYPE_HARDDISK: | ||
1118 | + status = DeviceIoControl(s->hfile, IOCTL_DISK_GET_DRIVE_GEOMETRY, | ||
1119 | + NULL, 0, &dg, sizeof(dg), &count, NULL); | ||
1120 | + if (status != FALSE) { | ||
1121 | + l.QuadPart = dg.Cylinders.QuadPart * dg.TracksPerCylinder | ||
1122 | + * dg.SectorsPerTrack * dg.BytesPerSector; | ||
1123 | + } | ||
1124 | + break; | ||
1113 | default: | 1125 | default: |
1114 | return -EIO; | 1126 | return -EIO; |
1115 | } | 1127 | } |
@@ -1216,6 +1228,8 @@ static int find_device_type(BlockDriverState *bs, const char *filename) | @@ -1216,6 +1228,8 @@ static int find_device_type(BlockDriverState *bs, const char *filename) | ||
1216 | 1228 | ||
1217 | if (strstart(filename, "\\\\.\\", &p) || | 1229 | if (strstart(filename, "\\\\.\\", &p) || |
1218 | strstart(filename, "//./", &p)) { | 1230 | strstart(filename, "//./", &p)) { |
1231 | + if (stristart(p, "PhysicalDrive", NULL)) | ||
1232 | + return FTYPE_HARDDISK; | ||
1219 | snprintf(s->drive_path, sizeof(s->drive_path), "%c:\\", p[0]); | 1233 | snprintf(s->drive_path, sizeof(s->drive_path), "%c:\\", p[0]); |
1220 | type = GetDriveType(s->drive_path); | 1234 | type = GetDriveType(s->drive_path); |
1221 | if (type == DRIVE_CDROM) | 1235 | if (type == DRIVE_CDROM) |
@@ -1248,7 +1262,7 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) | @@ -1248,7 +1262,7 @@ static int hdev_open(BlockDriverState *bs, const char *filename, int flags) | ||
1248 | } | 1262 | } |
1249 | } | 1263 | } |
1250 | s->type = find_device_type(bs, filename); | 1264 | s->type = find_device_type(bs, filename); |
1251 | - | 1265 | + |
1252 | if ((flags & BDRV_O_ACCESS) == O_RDWR) { | 1266 | if ((flags & BDRV_O_ACCESS) == O_RDWR) { |
1253 | access_flags = GENERIC_READ | GENERIC_WRITE; | 1267 | access_flags = GENERIC_READ | GENERIC_WRITE; |
1254 | } else { | 1268 | } else { |
qemu-doc.texi
@@ -1079,14 +1079,25 @@ line option or modify the device permissions accordingly). | @@ -1079,14 +1079,25 @@ line option or modify the device permissions accordingly). | ||
1079 | 1079 | ||
1080 | @subsubsection Windows | 1080 | @subsubsection Windows |
1081 | 1081 | ||
1082 | -On Windows you can use any host drives as QEMU drive. The prefered | ||
1083 | -syntax is the driver letter (e.g. @file{d:}). The alternate syntax | ||
1084 | -@file{\\.\d:} is supported. @file{/dev/cdrom} is supported as an alias | ||
1085 | -to the first CDROM drive. | 1082 | +@table @code |
1083 | +@item CD | ||
1084 | +The prefered syntax is the drive letter (e.g. @file{d:}). The | ||
1085 | +alternate syntax @file{\\.\d:} is supported. @file{/dev/cdrom} is | ||
1086 | +supported as an alias to the first CDROM drive. | ||
1086 | 1087 | ||
1087 | Currently there is no specific code to handle removable medias, so it | 1088 | Currently there is no specific code to handle removable medias, so it |
1088 | is better to use the @code{change} or @code{eject} monitor commands to | 1089 | is better to use the @code{change} or @code{eject} monitor commands to |
1089 | change or eject media. | 1090 | change or eject media. |
1091 | +@item Hard disks | ||
1092 | +Hard disks can be used with the syntax: @file{\\.\PhysicalDriveN} | ||
1093 | +where @var{N} is the drive number (0 is the first hard disk). | ||
1094 | + | ||
1095 | +WARNING: unless you know what you do, it is better to only make | ||
1096 | +READ-ONLY accesses to the hard disk otherwise you may corrupt your | ||
1097 | +host data (use the @option{-snapshot} command line so that the | ||
1098 | +modifications are written in a temporary file). | ||
1099 | +@end table | ||
1100 | + | ||
1090 | 1101 | ||
1091 | @subsubsection Mac OS X | 1102 | @subsubsection Mac OS X |
1092 | 1103 |