mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[enum] added capacity data
* also factorized some of the enum calls
This commit is contained in:
parent
648bc0c5d0
commit
4bf87001ec
3 changed files with 111 additions and 37 deletions
BIN
resource.h
BIN
resource.h
Binary file not shown.
145
usbdos.c
145
usbdos.c
|
@ -28,6 +28,10 @@
|
|||
#include <setupapi.h>
|
||||
// TODO: MinGW32 requires <ddk/ntddscsi.h>
|
||||
#include <ntddscsi.h>
|
||||
// http://doc.sch130.nsc.ru/www.sysinternals.com/ntw2k/source/fmifs.shtml
|
||||
// http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/fmifs/
|
||||
//#include <fmifs.h>
|
||||
// http://git.kernel.org/?p=fs/ext2/e2fsprogs.git;a=blob;f=misc/badblocks.c
|
||||
|
||||
#include "msapi_utf8.h"
|
||||
#include "resource.h"
|
||||
|
@ -37,7 +41,7 @@
|
|||
* Globals
|
||||
*/
|
||||
static HINSTANCE main_instance;
|
||||
static HWND hDeviceList;
|
||||
static HWND hDeviceList, hCapacity;
|
||||
|
||||
#ifdef USBDOS_DEBUG
|
||||
static void _uprintf(const char *format, ...)
|
||||
|
@ -96,59 +100,136 @@ static char err_string[256];
|
|||
}
|
||||
|
||||
/*
|
||||
* Returns the drive letter (0 if error) and fills the drive label
|
||||
* Opens a drive return both the handle and the drive letter
|
||||
*/
|
||||
char GetDriveInfo(DWORD num, char** label)
|
||||
static BOOL GetDriveHandle(DWORD num, HANDLE* hDrive, char* DriveLetter)
|
||||
{
|
||||
BOOL r;
|
||||
DWORD size;
|
||||
HANDLE hDrive;
|
||||
STORAGE_DEVICE_NUMBER sdn = {0};
|
||||
static char volume_label[MAX_PATH];
|
||||
static char drives[26*2];
|
||||
static char drives[26*4]; /* "D:\", "E:\", etc. */
|
||||
char *drive = drives;
|
||||
char drive_name[] = "\\\\.\\#:";
|
||||
|
||||
*label = "NO_LABEL";
|
||||
|
||||
size = GetLogicalDriveStringsA(sizeof(drives), drives);
|
||||
if (size == 0) {
|
||||
uprintf("GetLogicalDriveStrings failed: %s\n", WindowsErrorString(0));
|
||||
return 0;
|
||||
return FALSE;
|
||||
}
|
||||
if (size > sizeof(drives)) {
|
||||
uprintf("GetLogicalDriveStrings: buffer too small (required %d vs %d)\n", size, sizeof(drives));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*hDrive = INVALID_HANDLE_VALUE;
|
||||
for ( ;*drive; drive += safe_strlen(drive)+1) {
|
||||
if (*drive < 'C') {
|
||||
continue;
|
||||
}
|
||||
safe_sprintf(drive_name, sizeof(drive_name), "\\\\.\\%c:", drive[0]);
|
||||
hDrive = CreateFileA(drive_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
|
||||
*hDrive = CreateFileA(drive_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
|
||||
if (hDrive == INVALID_HANDLE_VALUE) {
|
||||
uprintf("Could not open drive %c: %s\n", WindowsErrorString(0));
|
||||
continue;
|
||||
}
|
||||
|
||||
r = DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL,
|
||||
r = DeviceIoControl(*hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL,
|
||||
0, &sdn, sizeof(sdn), &size, NULL);
|
||||
if ((!r) || (size <= 0)) {
|
||||
uprintf("IOCTL_STORAGE_GET_DEVICE_NUMBER failed: %s\n", WindowsErrorString(0));
|
||||
CloseHandle(hDrive);
|
||||
return 0;
|
||||
uprintf("IOCTL_STORAGE_GET_DEVICE_NUMBER 1 failed: %s\n", WindowsErrorString(0));
|
||||
safe_closehandle(*hDrive);
|
||||
break;
|
||||
}
|
||||
if (sdn.DeviceNumber == num)
|
||||
break;
|
||||
CloseHandle(hDrive);
|
||||
}
|
||||
|
||||
if (*drive && GetVolumeInformationA(drive, volume_label, sizeof(volume_label), NULL, NULL, NULL, NULL, 0)) {
|
||||
*label = volume_label;
|
||||
if (DriveLetter != NULL) {
|
||||
*DriveLetter = *drive;
|
||||
}
|
||||
|
||||
return *drive;
|
||||
return (*hDrive != INVALID_HANDLE_VALUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the drive letter and volume label
|
||||
*/
|
||||
static BOOL GetDriveLabel(DWORD num, char* letter, char** label)
|
||||
{
|
||||
HANDLE hDrive;
|
||||
char DrivePath[] = "#:\\";
|
||||
char volume_label[MAX_PATH];
|
||||
|
||||
*label = "NO_LABEL";
|
||||
|
||||
if (!GetDriveHandle(num, &hDrive, DrivePath))
|
||||
return FALSE;
|
||||
safe_closehandle(hDrive);
|
||||
|
||||
if (!GetVolumeInformationA(DrivePath, volume_label, sizeof(volume_label), NULL, NULL, NULL, NULL, 0)) {
|
||||
uprintf("GetVolumeInformation failed: %s\n", WindowsErrorString(0));
|
||||
return FALSE;
|
||||
}
|
||||
*label = volume_label;
|
||||
*letter = DrivePath[0];
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the drive letter and volume label
|
||||
*/
|
||||
static BOOL GetDriveInfo(DWORD num, LONGLONG* DriveSize)
|
||||
{
|
||||
BOOL r;
|
||||
HANDLE hDrive;
|
||||
DWORD size;
|
||||
BYTE geometry[128];
|
||||
|
||||
*DriveSize = 0;
|
||||
|
||||
if (!GetDriveHandle(num, &hDrive, NULL))
|
||||
return FALSE;
|
||||
|
||||
r = DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
|
||||
NULL, 0, geometry, sizeof(geometry), &size, NULL );
|
||||
if (!r || size <= 0) {
|
||||
uprintf("IOCTL_DISK_GET_DRIVE_GEOMETRY_EX failed: %s\n", WindowsErrorString(0));
|
||||
safe_closehandle(hDrive);
|
||||
return FALSE;
|
||||
}
|
||||
*DriveSize = ((PDISK_GEOMETRY_EX)geometry)->DiskSize.QuadPart;
|
||||
|
||||
safe_closehandle(hDrive);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL PopulateProperties(int index)
|
||||
{
|
||||
double HumanReadableSize;
|
||||
LONGLONG DiskSize;
|
||||
DWORD DeviceNumber;
|
||||
char capacity[64];
|
||||
char* suffix[] = { "KB", "MB", "GB", "TB", "PB"};
|
||||
int i;
|
||||
|
||||
DeviceNumber = (DWORD)ComboBox_GetItemData(hDeviceList, index);
|
||||
if (!GetDriveInfo(DeviceNumber, &DiskSize))
|
||||
return FALSE;
|
||||
|
||||
HumanReadableSize = (double)DiskSize;
|
||||
for (i=0; i<ARRAYSIZE(suffix); i++) {
|
||||
HumanReadableSize /= 1024.0;
|
||||
if (HumanReadableSize < 512.0) {
|
||||
safe_sprintf(capacity, sizeof(capacity), "%0.2f %s", HumanReadableSize, suffix[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
IGNORE_RETVAL(ComboBox_ResetContent(hCapacity));
|
||||
IGNORE_RETVAL(ComboBox_AddStringU(hCapacity, capacity));
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hCapacity, 0));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -161,9 +242,7 @@ static BOOL GetUSBDevices(void)
|
|||
SP_DEVINFO_DATA dev_info_data;
|
||||
SP_DEVICE_INTERFACE_DATA devint_data;
|
||||
PSP_DEVICE_INTERFACE_DETAIL_DATA_A devint_detail_data;
|
||||
STORAGE_DEVICE_NUMBER storage_device;
|
||||
BYTE geometry[128];
|
||||
LONGLONG disk_size;
|
||||
STORAGE_DEVICE_NUMBER device_number;
|
||||
DWORD size, i, j, datatype;
|
||||
HANDLE hDrive;
|
||||
char drive_letter;
|
||||
|
@ -234,31 +313,22 @@ static BOOL GetUSBDevices(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
memset(&storage_device, 0, sizeof(storage_device));
|
||||
memset(&device_number, 0, sizeof(device_number));
|
||||
r = DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER,
|
||||
NULL, 0, &storage_device, sizeof(storage_device), &size, NULL );
|
||||
NULL, 0, &device_number, sizeof(device_number), &size, NULL );
|
||||
if (!r || size <= 0) {
|
||||
uprintf("IOCTL_STORAGE_GET_DEVICE_NUMBER failed: %s\n", WindowsErrorString(0));
|
||||
uprintf("IOCTL_STORAGE_GET_DEVICE_NUMBER 2 failed: %s\n", WindowsErrorString(0));
|
||||
continue;
|
||||
}
|
||||
|
||||
r = DeviceIoControl(hDrive, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
|
||||
NULL, 0, geometry, sizeof(geometry),
|
||||
&size, NULL );
|
||||
if (!r || size <= 0) {
|
||||
uprintf("IOCTL_DISK_GET_DRIVE_GEOMETRY_EX failed: %s\n", WindowsErrorString(0));
|
||||
continue;
|
||||
}
|
||||
disk_size = ((PDISK_GEOMETRY_EX)geometry)->DiskSize.QuadPart / 1024 / 1024;
|
||||
|
||||
drive_letter = GetDriveInfo(storage_device.DeviceNumber, &label);
|
||||
if (drive_letter) {
|
||||
safe_sprintf(entry, sizeof(entry), "%s (%I64i MB) (%c:)\n", label, disk_size, drive_letter);
|
||||
IGNORE_RETVAL(ComboBox_AddStringU(hDeviceList, entry));
|
||||
if (GetDriveLabel(device_number.DeviceNumber, &drive_letter, &label)) {
|
||||
safe_sprintf(entry, sizeof(entry), "%s (%c:)\n", label, drive_letter);
|
||||
IGNORE_RETVAL(ComboBox_SetItemData(hDeviceList, ComboBox_AddStringU(hDeviceList, entry), device_number.DeviceNumber));
|
||||
}
|
||||
}
|
||||
}
|
||||
IGNORE_RETVAL(ComboBox_SetCurSel(hDeviceList, 0));
|
||||
PopulateProperties(0);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -277,6 +347,7 @@ static INT_PTR CALLBACK MainCallback(HWND hDlg, UINT message, WPARAM wParam, LPA
|
|||
|
||||
case WM_INITDIALOG:
|
||||
hDeviceList = GetDlgItem(hDlg, IDC_DEVICE);
|
||||
hCapacity = GetDlgItem(hDlg, IDC_CAPACITY);
|
||||
GetUSBDevices();
|
||||
return (INT_PTR)TRUE;
|
||||
|
||||
|
|
3
usbdos.h
3
usbdos.h
|
@ -22,6 +22,9 @@
|
|||
|
||||
#define APP_VERSION "USBDOS v0.1.0.1"
|
||||
#define IGNORE_RETVAL(expr) do { (void)(expr); } while(0)
|
||||
#ifndef ARRAYSIZE
|
||||
#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0]))
|
||||
#endif
|
||||
|
||||
#define safe_free(p) do {free((void*)p); p = NULL;} while(0)
|
||||
#define safe_closehandle(h) do {if (h != INVALID_HANDLE_VALUE) {CloseHandle(h); h = INVALID_HANDLE_VALUE;}} while(0)
|
||||
|
|
Loading…
Reference in a new issue