#else /* _WIN32 */
/* XXX: use another file ? */
-#include <windows.h>
#include <winioctl.h>
typedef struct BDRVRawState {
memset(&ov, 0, sizeof(ov));
ov.Offset = offset;
ov.OffsetHigh = offset >> 32;
- ret = ReadFile(s->hfile, buf, count, NULL, &ov);
- if (!ret)
- return -EIO;
- ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE);
- if (!ret)
- return -EIO;
+ ret = ReadFile(s->hfile, buf, count, &ret_count, &ov);
+ if (!ret) {
+ ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE);
+ if (!ret)
+ return -EIO;
+ else
+ return ret_count;
+ }
return ret_count;
}
memset(&ov, 0, sizeof(ov));
ov.Offset = offset;
ov.OffsetHigh = offset >> 32;
- ret = WriteFile(s->hfile, buf, count, NULL, &ov);
- if (!ret)
- return -EIO;
- ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE);
- if (!ret)
- return -EIO;
+ ret = WriteFile(s->hfile, buf, count, &ret_count, &ov);
+ if (!ret) {
+ ret = GetOverlappedResult(s->hfile, &ov, &ret_count, TRUE);
+ if (!ret)
+ return -EIO;
+ else
+ return ret_count;
+ }
return ret_count;
}
static int raw_aio_new(BlockDriverAIOCB *acb)
{
RawAIOCB *acb1;
- BDRVRawState *s = acb->bs->opaque;
acb1 = qemu_mallocz(sizeof(RawAIOCB));
if (!acb1)
return -ENOMEM;
acb->opaque = acb1;
- s->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
- if (!s->hEvent)
+ acb1->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+ if (!acb1->hEvent)
return -ENOMEM;
return 0;
}
-
+#ifndef QEMU_TOOL
static void raw_aio_cb(void *opaque)
{
BlockDriverAIOCB *acb = opaque;
acb->cb(acb->cb_opaque, 0);
}
}
-
+#endif
static int raw_aio_read(BlockDriverAIOCB *acb, int64_t sector_num,
uint8_t *buf, int nb_sectors)
{
acb1->ov.OffsetHigh = offset >> 32;
acb1->ov.hEvent = acb1->hEvent;
acb1->count = nb_sectors * 512;
+#ifndef QEMU_TOOL
qemu_add_wait_object(acb1->ov.hEvent, raw_aio_cb, acb);
+#endif
ret = ReadFile(s->hfile, buf, acb1->count, NULL, &acb1->ov);
if (!ret)
return -EIO;
acb1->ov.OffsetHigh = offset >> 32;
acb1->ov.hEvent = acb1->hEvent;
acb1->count = nb_sectors * 512;
+#ifndef QEMU_TOOL
qemu_add_wait_object(acb1->ov.hEvent, raw_aio_cb, acb);
+#endif
ret = ReadFile(s->hfile, buf, acb1->count, NULL, &acb1->ov);
if (!ret)
return -EIO;
{
BlockDriverState *bs = acb->bs;
BDRVRawState *s = bs->opaque;
+#ifndef QEMU_TOOL
RawAIOCB *acb1 = acb->opaque;
qemu_del_wait_object(acb1->ov.hEvent, raw_aio_cb, acb);
+#endif
/* XXX: if more than one async I/O it is not correct */
CancelIo(s->hfile);
}
{
BDRVRawState *s = bs->opaque;
LARGE_INTEGER l;
- if (!GetFileSizeEx(s->hfile, &l))
- return -EIO;
+
+ l.LowPart = GetFileSize(s->hfile, &l.HighPart);
+ if (l.LowPart == 0xffffffffUL && GetLastError() != NO_ERROR)
+ return -EIO;
return l.QuadPart;
}