13 static GUID guid_iface_disk = {0x53f56307, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b}};
15 #ifndef IOCTL_DISK_UPDATE_PROPERTIES
16 #define IOCTL_DISK_UPDATE_PROPERTIES CTL_CODE(IOCTL_DISK_BASE,0x0050,METHOD_BUFFERED,FILE_ANY_ACCESS)
19 int rawdisk_detect(struct rawdisk_device *disks, int max_disks)
21 int devidx, ifidx, count;
23 SP_DEVINFO_DATA devdata;
24 SP_DEVICE_INTERFACE_DATA devif;
25 SP_DEVICE_INTERFACE_DETAIL_DATA_A *devdetail;
29 if((devset = SetupDiGetClassDevs(&guid_iface_disk, 0, 0,
30 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)) == INVALID_HANDLE_VALUE) {
31 fprintf(stderr, "failed to enumerate devices\n");
38 memset(&devdata, 0, sizeof devdata);
39 devdata.cbSize = sizeof devdata;
40 if(!SetupDiEnumDeviceInfo(devset, devidx, &devdata)) {
41 if(GetLastError() == ERROR_NO_MORE_ITEMS) break;
46 regtype = SPDRP_PHYSICAL_DEVICE_OBJECT_NAME;
47 SetupDiGetDeviceRegistryProperty(devset, &devdata, SPDRP_FRIENDLYNAME,
48 ®type, (unsigned char*)devname, sizeof devname, &size);
53 memset(&devif, 0, sizeof devif);
54 devif.cbSize = sizeof devif;
55 if(!SetupDiEnumDeviceInterfaces(devset, &devdata, &guid_iface_disk, ifidx, &devif)) {
56 if(GetLastError() == ERROR_NO_MORE_ITEMS) break;
61 SetupDiGetDeviceInterfaceDetail(devset, &devif, 0, 0, &size, 0);
62 if(!(devdetail = malloc(size))) {
63 fprintf(stderr, "failed to allocate device interface detail buffer (size: %lu)\n", (unsigned long)size);
66 devdetail->cbSize = sizeof *devdetail;
67 SetupDiGetDeviceInterfaceDetail(devset, &devif, devdetail, size, 0, 0);
70 if(count < max_disks) {
71 disks[count].path = strdup(devdetail->DevicePath);
72 disks[count].name = strdup(devname);
73 if(!disks[count].path || !disks[count].name) {
74 fprintf(stderr, "failed to allocate device strings\n");
92 sprintf(buf, "\\\\?\\fake\\disk\\%d", i);
93 disks[count].path = strdup(buf);
94 sprintf(buf, "FAKE_DISK_%d", i);
95 disks[count].name = strdup(buf);
104 int rawdisk_eject(HANDLE hdev)
107 return DeviceIoControl(hdev, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, &sz, 0) == 0 ? -1 : 0;
110 int rawdisk_load(HANDLE hdev)
113 return DeviceIoControl(hdev, IOCTL_STORAGE_LOAD_MEDIA, 0, 0, 0, 0, &sz, 0) == 0 ? -1 : 0;
116 void rawdisk_refresh(HANDLE hdev)
121 /* try to rock the boat so hopefully windows will re-read the disk and it'll show up */
122 DeviceIoControl(hdev, IOCTL_DISK_UPDATE_PROPERTIES, 0, 0, 0, 0, &sz, 0);
124 sz = sizeof(DRIVE_LAYOUT_INFORMATION) + sizeof(PARTITION_INFORMATION) * 32;
127 DeviceIoControl(hdev, IOCTL_DISK_GET_DRIVE_LAYOUT, 0, 0, buf, sz, &sz, 0);