it werks!
[instimg] / src / rawdisk.c
index 559f61f..ba861dc 100644 (file)
@@ -1,16 +1,21 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <malloc.h>
 #include <windows.h>
 #include <setupapi.h>
 #include <devguid.h>
 #include <winioctl.h>
 #include "rawdisk.h"
 
-/*#define DBG_FAKE_DISKS*/
+#undef DBG_FAKE_DISKS
 
 static GUID guid_iface_disk = {0x53f56307, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b}};
 
+#ifndef IOCTL_DISK_UPDATE_PROPERTIES
+#define IOCTL_DISK_UPDATE_PROPERTIES CTL_CODE(IOCTL_DISK_BASE,0x0050,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#endif
+
 int rawdisk_detect(struct rawdisk_device *disks, int max_disks)
 {
        int devidx, ifidx, count;
@@ -95,3 +100,29 @@ int rawdisk_detect(struct rawdisk_device *disks, int max_disks)
 
        return count;
 }
+
+int rawdisk_eject(HANDLE hdev)
+{
+       DWORD sz;
+       return DeviceIoControl(hdev, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, &sz, 0) == 0 ? -1 : 0;
+}
+
+int rawdisk_load(HANDLE hdev)
+{
+       DWORD sz;
+       return DeviceIoControl(hdev, IOCTL_STORAGE_LOAD_MEDIA, 0, 0, 0, 0, &sz, 0) == 0 ? -1 : 0;
+}
+
+void rawdisk_refresh(HANDLE hdev)
+{
+       DWORD sz;
+       char *buf;
+
+       /* try to rock the boat so hopefully windows will re-read the disk and it'll show up */
+       DeviceIoControl(hdev, IOCTL_DISK_UPDATE_PROPERTIES, 0, 0, 0, 0, &sz, 0);
+
+       sz = sizeof(DRIVE_LAYOUT_INFORMATION) + sizeof(PARTITION_INFORMATION) * 32;
+       buf = alloca(sz);
+
+       DeviceIoControl(hdev, IOCTL_DISK_GET_DRIVE_LAYOUT, 0, 0, buf, sz, &sz, 0);
+}
\ No newline at end of file