mirror of https://github.com/xemu-project/xemu.git
win32: physical drive support (initial patch by kazu)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2311 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
18607dcb7c
commit
0178196398
16
block-raw.c
16
block-raw.c
|
@ -838,6 +838,7 @@ BlockDriver bdrv_host_device = {
|
||||||
|
|
||||||
#define FTYPE_FILE 0
|
#define FTYPE_FILE 0
|
||||||
#define FTYPE_CD 1
|
#define FTYPE_CD 1
|
||||||
|
#define FTYPE_HARDDISK 2
|
||||||
|
|
||||||
typedef struct BDRVRawState {
|
typedef struct BDRVRawState {
|
||||||
HANDLE hfile;
|
HANDLE hfile;
|
||||||
|
@ -1098,6 +1099,9 @@ static int64_t raw_getlength(BlockDriverState *bs)
|
||||||
BDRVRawState *s = bs->opaque;
|
BDRVRawState *s = bs->opaque;
|
||||||
LARGE_INTEGER l;
|
LARGE_INTEGER l;
|
||||||
ULARGE_INTEGER available, total, total_free;
|
ULARGE_INTEGER available, total, total_free;
|
||||||
|
DISK_GEOMETRY dg;
|
||||||
|
DWORD count;
|
||||||
|
BOOL status;
|
||||||
|
|
||||||
switch(s->type) {
|
switch(s->type) {
|
||||||
case FTYPE_FILE:
|
case FTYPE_FILE:
|
||||||
|
@ -1110,6 +1114,14 @@ static int64_t raw_getlength(BlockDriverState *bs)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
l.QuadPart = total.QuadPart;
|
l.QuadPart = total.QuadPart;
|
||||||
break;
|
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:
|
default:
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
@ -1216,6 +1228,8 @@ static int find_device_type(BlockDriverState *bs, const char *filename)
|
||||||
|
|
||||||
if (strstart(filename, "\\\\.\\", &p) ||
|
if (strstart(filename, "\\\\.\\", &p) ||
|
||||||
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]);
|
snprintf(s->drive_path, sizeof(s->drive_path), "%c:\\", p[0]);
|
||||||
type = GetDriveType(s->drive_path);
|
type = GetDriveType(s->drive_path);
|
||||||
if (type == DRIVE_CDROM)
|
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);
|
s->type = find_device_type(bs, filename);
|
||||||
|
|
||||||
if ((flags & BDRV_O_ACCESS) == O_RDWR) {
|
if ((flags & BDRV_O_ACCESS) == O_RDWR) {
|
||||||
access_flags = GENERIC_READ | GENERIC_WRITE;
|
access_flags = GENERIC_READ | GENERIC_WRITE;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1079,14 +1079,25 @@ line option or modify the device permissions accordingly).
|
||||||
|
|
||||||
@subsubsection Windows
|
@subsubsection Windows
|
||||||
|
|
||||||
On Windows you can use any host drives as QEMU drive. The prefered
|
@table @code
|
||||||
syntax is the driver letter (e.g. @file{d:}). The alternate syntax
|
@item CD
|
||||||
@file{\\.\d:} is supported. @file{/dev/cdrom} is supported as an alias
|
The prefered syntax is the drive letter (e.g. @file{d:}). The
|
||||||
to the first CDROM drive.
|
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
|
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
|
is better to use the @code{change} or @code{eject} monitor commands to
|
||||||
change or eject media.
|
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
|
@subsubsection Mac OS X
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue