USBDevice *usb_msd_init(const char *filename) { MSDState *s; BlockDriverState *bdrv; s = qemu_mallocz(sizeof(MSDState)); if (!s) return NULL; bdrv = bdrv_new("usb"); if (bdrv_open(bdrv, filename, 0) < 0) goto fail; if (qemu_key_check(bdrv, filename)) goto fail; s->bs = bdrv; s->dev.speed = USB_SPEED_FULL; s->dev.handle_packet = usb_generic_handle_packet; s->dev.handle_reset = usb_msd_handle_reset; s->dev.handle_control = usb_msd_handle_control; s->dev.handle_data = usb_msd_handle_data; s->dev.handle_destroy = usb_msd_handle_destroy; snprintf(s->dev.devname, sizeof(s->dev.devname), "QEMU USB MSD(%.16s)", filename); s->scsi_dev = scsi_disk_init(bdrv, 0, usb_msd_command_complete, s); usb_msd_handle_reset((USBDevice *)s); return (USBDevice *)s; fail: qemu_free(s); return NULL; }
static int usb_msd_initfn(USBDevice *dev) { MSDState *s = DO_UPCAST(MSDState, dev, dev); if (!s->dinfo || !s->dinfo->bdrv) { qemu_error("usb-msd: drive property not set\n"); return -1; } s->dev.speed = USB_SPEED_HIGH; scsi_bus_new(&s->bus, &s->dev.qdev, 0, 1, usb_msd_command_complete); s->scsi_dev = scsi_bus_legacy_add_drive(&s->bus, s->dinfo, 0); s->bus.qbus.allow_hotplug = 0; usb_msd_handle_reset(dev); if (bdrv_key_required(s->dinfo->bdrv)) { if (s->dev.qdev.hotplugged) { monitor_read_bdrv_key_start(cur_mon, s->dinfo->bdrv, usb_msd_password_cb, s); s->dev.auto_attach = 0; } else { autostart = 0; } } return 0; }
USBDevice *usb_msd_init(const char *filename, BlockDriverState **pbs) { MSDState *s; BlockDriverState *bdrv; BlockDriver *drv = NULL; const char *p1; char fmt[32]; p1 = strchr(filename, ':'); if (p1++) { const char *p2; if (strstart(filename, "format=", &p2)) { int len = MIN(p1 - p2, sizeof(fmt)); pstrcpy(fmt, len, p2); drv = bdrv_find_format(fmt); if (!drv) { printf("invalid format %s\n", fmt); return NULL; } } else if (*filename != ':') { printf("unrecognized USB mass-storage option %s\n", filename); return NULL; } filename = p1; } if (!*filename) { printf("block device specification needed\n"); return NULL; } s = qemu_mallocz(sizeof(MSDState)); bdrv = bdrv_new("usb"); if (bdrv_open2(bdrv, filename, 0, drv) < 0) goto fail; s->bs = bdrv; *pbs = bdrv; s->dev.speed = USB_SPEED_FULL; s->dev.handle_packet = usb_generic_handle_packet; s->dev.handle_reset = usb_msd_handle_reset; s->dev.handle_control = usb_msd_handle_control; s->dev.handle_data = usb_msd_handle_data; s->dev.handle_destroy = usb_msd_handle_destroy; snprintf(s->dev.devname, sizeof(s->dev.devname), "QEMU USB MSD(%.16s)", filename); s->scsi_dev = scsi_disk_init(bdrv, 0, usb_msd_command_complete, s); usb_msd_handle_reset((USBDevice *)s); return (USBDevice *)s; fail: qemu_free(s); return NULL; }
USBDevice *usb_msd_init(const TCHAR *filename) { MSDState *s; s = (MSDState*)qemu_mallocz(sizeof(MSDState)); if (!s) return NULL; s->hfile = NULL; s->hfile = wfopen(filename, TEXT("r+b")); if (!s->hfile) { fprintf(stderr, "usb-msd: Could not open image file\n"); return NULL; } s->last_cmd = -1; s->dev.speed = USB_SPEED_FULL; s->dev.handle_packet = usb_generic_handle_packet; s->dev.handle_reset = usb_msd_handle_reset; s->dev.handle_control = usb_msd_handle_control; s->dev.handle_data = usb_msd_handle_data; s->dev.handle_destroy = usb_msd_handle_destroy; sprintf(s->dev.devname, "QEMU USB MSD(%.16s)", filename); usb_msd_handle_reset((USBDevice *)s); return (USBDevice *)s; }
USBDevice *MsdDevice::CreateDevice(int port) { MSDState *s = (MSDState *)qemu_mallocz(sizeof(MSDState)); if (!s) return NULL; //CONFIGVARIANT varApi(N_DEVICE_API, CONFIG_TYPE_CHAR); //LoadSetting(port, DEVICENAME, varApi); std::string api = *MsdDevice::APIs().begin(); CONFIGVARIANT var(N_CONFIG_PATH, CONFIG_TYPE_TCHAR); if(!LoadSetting(port, api, var)) { fprintf(stderr, "usb-msd: Could not load settings\n"); return NULL; } s->hfile = wfopen(var.tstrValue.c_str(), TEXT("r+b")); if (!s->hfile) { fprintf(stderr, "usb-msd: Could not open image file\n"); return NULL; } s->last_cmd = -1; s->dev.speed = USB_SPEED_FULL; s->dev.handle_packet = usb_generic_handle_packet; s->dev.handle_reset = usb_msd_handle_reset; s->dev.handle_control = usb_msd_handle_control; s->dev.handle_data = usb_msd_handle_data; s->dev.handle_destroy = usb_msd_handle_destroy; sprintf(s->dev.devname, "QEMU USB MSD(%.16s)", ""/*filename*/); usb_msd_handle_reset((USBDevice *)s); return (USBDevice *)s; }