#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;
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