X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=instimg;a=blobdiff_plain;f=src%2Frawdisk.c;fp=src%2Frawdisk.c;h=ba861dc601ada682099a8827296f5059ade80e7e;hp=559f61f40247015778dd7efdd02459ae0ad2fa36;hb=4f2abaf24d97f5d6fc253cca51ec87a8a95ab048;hpb=b1499ac7c1fce954a3f79e9a059466de3554e8d6 diff --git a/src/rawdisk.c b/src/rawdisk.c index 559f61f..ba861dc 100644 --- a/src/rawdisk.c +++ b/src/rawdisk.c @@ -1,16 +1,21 @@ #include #include #include +#include #include #include #include #include #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