Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / image_writer_private / removable_storage_provider_win.cc
index ffac02d..e65f6e9 100644 (file)
@@ -7,6 +7,7 @@
 #include <setupapi.h>
 #include <winioctl.h>
 
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/scoped_handle.h"
@@ -34,7 +35,6 @@ bool AddDeviceInfo(HANDLE interface_enumerator,
     return false;
   }
 
-
   scoped_ptr<char[]> interface_detail_data_buffer(
       new char[interface_detail_data_size]);
 
@@ -121,17 +121,38 @@ bool AddDeviceInfo(HANDLE interface_enumerator,
   STORAGE_DEVICE_DESCRIPTOR* device_descriptor =
       reinterpret_cast<STORAGE_DEVICE_DESCRIPTOR*>(output_buf.get());
 
-  if (!device_descriptor->RemovableMedia) {
+  if (!device_descriptor->RemovableMedia &&
+      !(device_descriptor->BusType == BusTypeUsb)) {
+    // Reject non-removable and non-USB devices.
     // Return true to indicate success but not add anything to the device list.
     return true;
   }
 
+  // Create a drive identifier from the drive number.
+  STORAGE_DEVICE_NUMBER device_number = {0};
+  status = DeviceIoControl(
+      device_handle,                  // Device handle.
+      IOCTL_STORAGE_GET_DEVICE_NUMBER,// Flag to request device number.
+      NULL,                           // Query parameters, should be NULL.
+      0,                              // Query parameters size, should be 0.
+      &device_number,                 // output buffer.
+      sizeof(device_number),          // Size of buffer.
+      &bytes_returned,                // Number of bytes returned.
+      NULL);                          // Optional unused overlapped perameter.
+
+  if (status == FALSE) {
+    PLOG(ERROR) << "Storage device number query failed.";
+    return false;
+  }
+
+  std::string drive_id = "\\\\.\\PhysicalDrive";
+  drive_id.append(base::Uint64ToString(device_number.DeviceNumber));
+
   linked_ptr<api::image_writer_private::RemovableStorageDevice> device(
     new api::image_writer_private::RemovableStorageDevice());
   device->capacity = disk_capacity;
-
-  base::string16 device_path_16(interface_detail_data->DevicePath);
-  device->storage_unit_id = base::UTF16ToUTF8(device_path_16);
+  device->storage_unit_id = drive_id;
+  device->removable = device_descriptor->RemovableMedia == TRUE;
 
   if (device_descriptor->VendorIdOffset &&
       output_buf[device_descriptor->VendorIdOffset]) {