From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1GAhfo-00048L-PE for qemu-devel@nongnu.org; Wed, 09 Aug 2006 02:36:12 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1GAhfn-00046d-1z for qemu-devel@nongnu.org; Wed, 09 Aug 2006 02:36:12 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GAhfm-00046Y-Up for qemu-devel@nongnu.org; Wed, 09 Aug 2006 02:36:10 -0400 Received: from [211.5.2.83] (helo=nm01omta01f.dion.ne.jp) by monty-python.gnu.org with smtp (Exim 4.52) id 1GAhkP-0003kt-4X for qemu-devel@nongnu.org; Wed, 09 Aug 2006 02:40:58 -0400 Message-ID: <000a01c6bb7e$172d0e60$0464a8c0@athlon> From: "Kazu" References: <002b01c6b9df$3a53e4e0$0464a8c0@athlon> <44D7871D.2000202@bellard.org> Subject: Re: [Qemu-devel] Raw CD-ROM and hard disk for win32 Date: Wed, 9 Aug 2006 15:36:05 +0900 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0007_01C6BBC9.86DDEEF0" Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This is a multi-part message in MIME format. ------=_NextPart_000_0007_01C6BBC9.86DDEEF0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit Sent: Tuesday, August 08, 2006 3:31 AM Fabrice Bellard wrote: > Hi, > > I find it strange that there is no win32 API to know the size of a > CD-ROM. Maybe a CD-ROM specific IOCTL exists ? > Yes, it does. An attached patch gets a size of raw CD-ROM and raw hard disk. > About the windows device patch detection, I would like a more precise > test than "len == 5". Testing if the filename begins with "\\.\" would > be better. Supporting also the syntax "/dev/cdrom" would be good too. > It is necessary to set drive letter to use CD-ROM. When -cdrom /dev/cdrom is set, the first CD-ROM drive is used in the patch. Regards, Kazu ------=_NextPart_000_0007_01C6BBC9.86DDEEF0 Content-Type: application/octet-stream; name="qemu-20060809-cdrom.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="qemu-20060809-cdrom.patch" Index: block-raw.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /sources/qemu/qemu/block-raw.c,v=0A= retrieving revision 1.6=0A= diff -u -r1.6 block-raw.c=0A= --- block-raw.c 7 Aug 2006 02:38:06 -0000 1.6=0A= +++ block-raw.c 9 Aug 2006 04:50:55 -0000=0A= @@ -761,14 +761,53 @@=0A= return 0;=0A= }=0A= =0A= +static int64_t get_size(BlockDriverState *bs, HANDLE hfile, const char = *filename)=0A= +{=0A= + int64_t size;=0A= + BOOL status;=0A= + ULARGE_INTEGER available, total, total_free; =0A= + char *drive_letter;=0A= + DISK_GEOMETRY dg;=0A= + DWORD count;=0A= +=0A= + if (bdrv_get_type_hint(bs) =3D=3D BDRV_TYPE_CDROM &&=0A= + (strstart(filename, "//", NULL) || strstart(filename, "\\\\", = NULL))) {=0A= + drive_letter =3D (char *)filename + 4;=0A= + status =3D GetDiskFreeSpaceEx(drive_letter, &available, &total, = &total_free);=0A= + if (status !=3D FALSE){=0A= + return total.QuadPart;=0A= + } else {=0A= + return -1;=0A= + }=0A= + } else if (bdrv_get_type_hint(bs) =3D=3D BDRV_TYPE_HD &&=0A= + (strstart(filename, "//", NULL) || strstart(filename, = "\\\\", NULL))) {=0A= + status =3D DeviceIoControl(hfile, IOCTL_DISK_GET_DRIVE_GEOMETRY,=0A= + NULL, 0, &dg, sizeof(dg), &count, = NULL);=0A= + if (status !=3D FALSE) {=0A= + size =3D dg.Cylinders.QuadPart * dg.TracksPerCylinder=0A= + * dg.SectorsPerTrack * dg.BytesPerSector;=0A= + return size;=0A= + } else {=0A= + return -1;=0A= + }=0A= + }=0A= + return -1;=0A= +}=0A= +=0A= static int64_t raw_getlength(BlockDriverState *bs)=0A= {=0A= BDRVRawState *s =3D bs->opaque;=0A= LARGE_INTEGER l;=0A= + int64_t size;=0A= =0A= l.LowPart =3D GetFileSize(s->hfile, &l.HighPart);=0A= - if (l.LowPart =3D=3D 0xffffffffUL && GetLastError() !=3D NO_ERROR)=0A= - return -EIO;=0A= + if (l.LowPart =3D=3D 0xffffffffUL && GetLastError() !=3D NO_ERROR) {=0A= + size =3D get_size(bs, s->hfile, bs->filename);=0A= + if (size =3D=3D -1)=0A= + return -EIO;=0A= + else=0A= + return size;=0A= + }=0A= return l.QuadPart;=0A= }=0A= =0A= Index: block.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /sources/qemu/qemu/block.c,v=0A= retrieving revision 1.33=0A= diff -u -r1.33 block.c=0A= --- block.c 7 Aug 2006 19:10:16 -0000 1.33=0A= +++ block.c 9 Aug 2006 04:50:57 -0000=0A= @@ -198,6 +198,11 @@=0A= /* specific win32 case for driver letters */=0A= return &bdrv_raw;=0A= }=0A= + if (len =3D=3D 5 &&=0A= + (strstart(filename, "//./", NULL) || strstart(filename, = "\\\\.\\", NULL))) {=0A= + /* win32 drive. CD-ROM etc. */=0A= + return &bdrv_raw;=0A= + }=0A= #endif =0A= memcpy(protocol, filename, len);=0A= protocol[len] =3D '\0';=0A= @@ -225,7 +230,11 @@=0A= return drv;=0A= if (strstart(filename, "/dev/", NULL))=0A= return &bdrv_raw;=0A= - =0A= +#ifdef _WIN32=0A= + if (strstart(filename, "//./", NULL) || strstart(filename, = "\\\\.\\", NULL))=0A= + return &bdrv_raw;=0A= +#endif=0A= +=0A= ret =3D bdrv_file_open(&bs, filename, BDRV_O_RDONLY);=0A= if (ret < 0)=0A= return NULL;=0A= @@ -265,6 +274,28 @@=0A= return 0;=0A= }=0A= =0A= +#ifdef _WIN32=0A= +static int find_cdrom(BlockDriverState *bs, char *cdrom_name)=0A= +{=0A= + char drives[256], *pdrv =3D drives;=0A= + UINT type;=0A= +=0A= + ZeroMemory(drives, 256);=0A= + GetLogicalDriveStrings(sizeof(drives), drives);=0A= + while(pdrv[0] !=3D '\0') {=0A= + type =3D GetDriveType(pdrv);=0A= + switch(type) {=0A= + case DRIVE_CDROM:=0A= + sprintf(cdrom_name, "\\\\.\\%c:", pdrv[0]);=0A= + return 0;=0A= + break;=0A= + }=0A= + pdrv +=3D lstrlen(pdrv) + 1;=0A= + }=0A= + return -1;=0A= +}=0A= +#endif=0A= + =0A= int bdrv_open(BlockDriverState *bs, const char *filename, int flags)=0A= {=0A= return bdrv_open2(bs, filename, flags, NULL);=0A= @@ -309,14 +340,28 @@=0A= bs->is_temporary =3D 1;=0A= }=0A= =0A= +#ifdef _WIN32=0A= + /* convert /dev/cdrom to raw CD-ROM name */=0A= + if (strstart(filename, "/dev/cdrom", NULL)) {=0A= + int ret;=0A= + char cdrom_name[256];=0A= + ret =3D find_cdrom(bs, cdrom_name);=0A= + if (ret =3D=3D -1)=0A= + return -1;=0A= + pstrcpy(bs->filename, sizeof(bs->filename), cdrom_name);=0A= + } else {=0A= + pstrcpy(bs->filename, sizeof(bs->filename), filename);=0A= + }=0A= +#else=0A= pstrcpy(bs->filename, sizeof(bs->filename), filename);=0A= +#endif=0A= if (flags & BDRV_O_FILE) {=0A= - drv =3D find_protocol(filename);=0A= + drv =3D find_protocol(bs->filename);=0A= if (!drv)=0A= return -ENOENT;=0A= } else {=0A= if (!drv) {=0A= - drv =3D find_image_format(filename);=0A= + drv =3D find_image_format(bs->filename);=0A= if (!drv)=0A= return -1;=0A= }=0A= @@ -331,9 +376,9 @@=0A= open_flags =3D BDRV_O_RDWR;=0A= else=0A= open_flags =3D flags & ~(BDRV_O_FILE | BDRV_O_SNAPSHOT);=0A= - ret =3D drv->bdrv_open(bs, filename, open_flags);=0A= + ret =3D drv->bdrv_open(bs, bs->filename, open_flags);=0A= if (ret =3D=3D -EACCES && !(flags & BDRV_O_FILE)) {=0A= - ret =3D drv->bdrv_open(bs, filename, BDRV_O_RDONLY);=0A= + ret =3D drv->bdrv_open(bs, bs->filename, BDRV_O_RDONLY);=0A= bs->read_only =3D 1;=0A= }=0A= if (ret < 0) {=0A= ------=_NextPart_000_0007_01C6BBC9.86DDEEF0--