Commit 436e15b827be64cf29b2154863af39f71e5ea7d9
1 parent
550be127
win32 fixes (initial patch by kazu)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2078 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
30 additions
and
20 deletions
block-raw.c
@@ -518,7 +518,6 @@ BlockDriver bdrv_raw = { | @@ -518,7 +518,6 @@ BlockDriver bdrv_raw = { | ||
518 | #else /* _WIN32 */ | 518 | #else /* _WIN32 */ |
519 | 519 | ||
520 | /* XXX: use another file ? */ | 520 | /* XXX: use another file ? */ |
521 | -#include <windows.h> | ||
522 | #include <winioctl.h> | 521 | #include <winioctl.h> |
523 | 522 | ||
524 | typedef struct BDRVRawState { | 523 | typedef struct BDRVRawState { |
@@ -600,12 +599,14 @@ static int raw_pread(BlockDriverState *bs, int64_t offset, | @@ -600,12 +599,14 @@ static int raw_pread(BlockDriverState *bs, int64_t offset, | ||
600 | memset(&ov, 0, sizeof(ov)); | 599 | memset(&ov, 0, sizeof(ov)); |
601 | ov.Offset = offset; | 600 | ov.Offset = offset; |
602 | ov.OffsetHigh = offset >> 32; | 601 | ov.OffsetHigh = offset >> 32; |
603 | - ret = ReadFile(s->hfile, buf, count, NULL, &ov); | ||
604 | - if (!ret) | ||
605 | - return -EIO; | ||
606 | - ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE); | ||
607 | - if (!ret) | ||
608 | - return -EIO; | 602 | + ret = ReadFile(s->hfile, buf, count, &ret_count, &ov); |
603 | + if (!ret) { | ||
604 | + ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE); | ||
605 | + if (!ret) | ||
606 | + return -EIO; | ||
607 | + else | ||
608 | + return ret_count; | ||
609 | + } | ||
609 | return ret_count; | 610 | return ret_count; |
610 | } | 611 | } |
611 | 612 | ||
@@ -620,30 +621,31 @@ static int raw_pwrite(BlockDriverState *bs, int64_t offset, | @@ -620,30 +621,31 @@ static int raw_pwrite(BlockDriverState *bs, int64_t offset, | ||
620 | memset(&ov, 0, sizeof(ov)); | 621 | memset(&ov, 0, sizeof(ov)); |
621 | ov.Offset = offset; | 622 | ov.Offset = offset; |
622 | ov.OffsetHigh = offset >> 32; | 623 | ov.OffsetHigh = offset >> 32; |
623 | - ret = WriteFile(s->hfile, buf, count, NULL, &ov); | ||
624 | - if (!ret) | ||
625 | - return -EIO; | ||
626 | - ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE); | ||
627 | - if (!ret) | ||
628 | - return -EIO; | 624 | + ret = WriteFile(s->hfile, buf, count, &ret_count, &ov); |
625 | + if (!ret) { | ||
626 | + ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE); | ||
627 | + if (!ret) | ||
628 | + return -EIO; | ||
629 | + else | ||
630 | + return ret_count; | ||
631 | + } | ||
629 | return ret_count; | 632 | return ret_count; |
630 | } | 633 | } |
631 | 634 | ||
632 | static int raw_aio_new(BlockDriverAIOCB *acb) | 635 | static int raw_aio_new(BlockDriverAIOCB *acb) |
633 | { | 636 | { |
634 | RawAIOCB *acb1; | 637 | RawAIOCB *acb1; |
635 | - BDRVRawState *s = acb->bs->opaque; | ||
636 | 638 | ||
637 | acb1 = qemu_mallocz(sizeof(RawAIOCB)); | 639 | acb1 = qemu_mallocz(sizeof(RawAIOCB)); |
638 | if (!acb1) | 640 | if (!acb1) |
639 | return -ENOMEM; | 641 | return -ENOMEM; |
640 | acb->opaque = acb1; | 642 | acb->opaque = acb1; |
641 | - s->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); | ||
642 | - if (!s->hEvent) | 643 | + acb1->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); |
644 | + if (!acb1->hEvent) | ||
643 | return -ENOMEM; | 645 | return -ENOMEM; |
644 | return 0; | 646 | return 0; |
645 | } | 647 | } |
646 | - | 648 | +#ifndef QEMU_TOOL |
647 | static void raw_aio_cb(void *opaque) | 649 | static void raw_aio_cb(void *opaque) |
648 | { | 650 | { |
649 | BlockDriverAIOCB *acb = opaque; | 651 | BlockDriverAIOCB *acb = opaque; |
@@ -660,7 +662,7 @@ static void raw_aio_cb(void *opaque) | @@ -660,7 +662,7 @@ static void raw_aio_cb(void *opaque) | ||
660 | acb->cb(acb->cb_opaque, 0); | 662 | acb->cb(acb->cb_opaque, 0); |
661 | } | 663 | } |
662 | } | 664 | } |
663 | - | 665 | +#endif |
664 | static int raw_aio_read(BlockDriverAIOCB *acb, int64_t sector_num, | 666 | static int raw_aio_read(BlockDriverAIOCB *acb, int64_t sector_num, |
665 | uint8_t *buf, int nb_sectors) | 667 | uint8_t *buf, int nb_sectors) |
666 | { | 668 | { |
@@ -676,7 +678,9 @@ static int raw_aio_read(BlockDriverAIOCB *acb, int64_t sector_num, | @@ -676,7 +678,9 @@ static int raw_aio_read(BlockDriverAIOCB *acb, int64_t sector_num, | ||
676 | acb1->ov.OffsetHigh = offset >> 32; | 678 | acb1->ov.OffsetHigh = offset >> 32; |
677 | acb1->ov.hEvent = acb1->hEvent; | 679 | acb1->ov.hEvent = acb1->hEvent; |
678 | acb1->count = nb_sectors * 512; | 680 | acb1->count = nb_sectors * 512; |
681 | +#ifndef QEMU_TOOL | ||
679 | qemu_add_wait_object(acb1->ov.hEvent, raw_aio_cb, acb); | 682 | qemu_add_wait_object(acb1->ov.hEvent, raw_aio_cb, acb); |
683 | +#endif | ||
680 | ret = ReadFile(s->hfile, buf, acb1->count, NULL, &acb1->ov); | 684 | ret = ReadFile(s->hfile, buf, acb1->count, NULL, &acb1->ov); |
681 | if (!ret) | 685 | if (!ret) |
682 | return -EIO; | 686 | return -EIO; |
@@ -698,7 +702,9 @@ static int raw_aio_write(BlockDriverAIOCB *acb, int64_t sector_num, | @@ -698,7 +702,9 @@ static int raw_aio_write(BlockDriverAIOCB *acb, int64_t sector_num, | ||
698 | acb1->ov.OffsetHigh = offset >> 32; | 702 | acb1->ov.OffsetHigh = offset >> 32; |
699 | acb1->ov.hEvent = acb1->hEvent; | 703 | acb1->ov.hEvent = acb1->hEvent; |
700 | acb1->count = nb_sectors * 512; | 704 | acb1->count = nb_sectors * 512; |
705 | +#ifndef QEMU_TOOL | ||
701 | qemu_add_wait_object(acb1->ov.hEvent, raw_aio_cb, acb); | 706 | qemu_add_wait_object(acb1->ov.hEvent, raw_aio_cb, acb); |
707 | +#endif | ||
702 | ret = ReadFile(s->hfile, buf, acb1->count, NULL, &acb1->ov); | 708 | ret = ReadFile(s->hfile, buf, acb1->count, NULL, &acb1->ov); |
703 | if (!ret) | 709 | if (!ret) |
704 | return -EIO; | 710 | return -EIO; |
@@ -709,9 +715,11 @@ static void raw_aio_cancel(BlockDriverAIOCB *acb) | @@ -709,9 +715,11 @@ static void raw_aio_cancel(BlockDriverAIOCB *acb) | ||
709 | { | 715 | { |
710 | BlockDriverState *bs = acb->bs; | 716 | BlockDriverState *bs = acb->bs; |
711 | BDRVRawState *s = bs->opaque; | 717 | BDRVRawState *s = bs->opaque; |
718 | +#ifndef QEMU_TOOL | ||
712 | RawAIOCB *acb1 = acb->opaque; | 719 | RawAIOCB *acb1 = acb->opaque; |
713 | 720 | ||
714 | qemu_del_wait_object(acb1->ov.hEvent, raw_aio_cb, acb); | 721 | qemu_del_wait_object(acb1->ov.hEvent, raw_aio_cb, acb); |
722 | +#endif | ||
715 | /* XXX: if more than one async I/O it is not correct */ | 723 | /* XXX: if more than one async I/O it is not correct */ |
716 | CancelIo(s->hfile); | 724 | CancelIo(s->hfile); |
717 | } | 725 | } |
@@ -753,8 +761,10 @@ static int64_t raw_getlength(BlockDriverState *bs) | @@ -753,8 +761,10 @@ static int64_t raw_getlength(BlockDriverState *bs) | ||
753 | { | 761 | { |
754 | BDRVRawState *s = bs->opaque; | 762 | BDRVRawState *s = bs->opaque; |
755 | LARGE_INTEGER l; | 763 | LARGE_INTEGER l; |
756 | - if (!GetFileSizeEx(s->hfile, &l)) | ||
757 | - return -EIO; | 764 | + |
765 | + l.LowPart = GetFileSize(s->hfile, &l.HighPart); | ||
766 | + if (l.LowPart == 0xffffffffUL && GetLastError() != NO_ERROR) | ||
767 | + return -EIO; | ||
758 | return l.QuadPart; | 768 | return l.QuadPart; |
759 | } | 769 | } |
760 | 770 |