private List<string> _serialNumber = new List<string>();
private void matchDriveLetterWithSerial()
{
string[] diskArray;
string driveNumber;
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");
foreach (ManagementObject item in searcher.Get())
{
string _driveletter = getValueInQuotes(item["Dependent"].ToString());
diskArray = getValueInQuotes(item["Antecedent"].ToString()).Split(',');
driveNumber = diskArray[0].Remove(0, 6).Trim();
var disks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
foreach (ManagementObject disk in disks.Get())
{
if (disk["Name"].ToString() == ("\\\\.\\PHYSICALDRIVE" + driveNumber) &&
disk["interfaceType"].ToString() =="USB")
{
_serialNumber.Add(parseSerialFromDeviceID(disk["PNPDeviceID"].ToString()));
Console.Write(disk["SerialNumber"].ToString());
Console.Write(_driveletter);
}
}
}
}
private static string getValueInQuotes(string invalue)
{
var posFoundStart = invalue.IndexOf("\"");
var posFoundEnd = invalue.IndexOf("\"", posFoundStart + 1);
string posValue = invalue.Substring(posFoundStart + 1, posFoundEnd - (posFoundStart + 1));
return posValue;
}
private static string parseSerialFromDeviceID(string deviceid)
{
var splitDeviceId = deviceid.Split('\\');
var arrayLen = splitDeviceId.Length - 1;
var serialArray = splitDeviceId[arrayLen].Split('&');
var serial = serialArray[0];
return serial;
}
[DllImport("kernel32.dll",SetLastError = true,CharSet = CharSet.Auto)]
private static extern IntPtr CreateFile(
string lpFileName,
uint dwDesireAccess,
uint dwShareMode,
IntPtr SecurityAttributes,
uint dwCreateionDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile
);
[DllImport("kernel32.dll")]
private static extern int GetVolumeInformation(
string lpRootPathName,
string lpVolumeNameBuffer,
int nVolumeNameSize,
ref int lpVolumeSerialNumber,
int lpMaximumComponentLength,
int lpFileSystemFlags,
string lpFileSystemNameBuffer,
int nFileSystemNameSize
);
[DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
private static extern bool DeviceIoControl(
IntPtr hDevice,
uint dwIoControlCode,
IntPtr lpInBuffer,
uint nInBufferSize,
IntPtr lpOutBuffer,
uint nOutBufferSize,
out uint lpBytesReturned,
IntPtr lpOverlapped
);
[DllImport("CfgMgr32.dll", SetLastError = true)]
private static extern int CM_Enable_DevNode(ref IntPtr hDevice, int ulFlags);
[DllImport("CfgMgr32.dll", SetLastError = true)]
private static extern int CM_Disable_DevNode(ref IntPtr hDevice,int ulFlags);
public const uint GENERIC_READ = 0x80000000;
public const int GENERIC_WRITE = 0x40000000;
public const int FILE_SHARE_READ = 0x1;
public const int FILE_SHARE_WRITE = 0x2;
public const int IOCTL_STORAGE_EJECT_MEDIA = 0x2d4808;
//删除U盘
private bool RemoveUsbDevice(string drvID)
{
//设备驱动的设备路径形式固定为"\\.\\DeviceName",如"\\.\I"
string fileName = @"\\.\" + drvID.Remove(2);
IntPtr handle = CreateFile(fileName,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,IntPtr.Zero,0x03,0,IntPtr.Zero);
uint byteReturned;
bool result = DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, IntPtr.Zero, 0, IntPtr.Zero, 0, out byteReturned, IntPtr.Zero);
return result;
}
//定义常量
public const int WM_DEVICECHANGE = 0x219;
public const int DBT_DEVICEARRIVAL = 0x8000;
public const int DBT_CONFIGCHANGECANCELED = 0x0019;
public const int DBT_CONFIGCHANGED = 0x0018;
public const int DBT_CUSTOMEVENT = 0x8006;
public const int DBT_DEVICEQUERYREMOVE = 0x8001;
public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;
public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
public const int DBT_DEVICEREMOVEPENDING = 0x8003;
public const int DBT_DEVICETYPESPECIFIC = 0x8005;
public const int DBT_DEVNODES_CHANGED = 0x0007;
public const int DBT_QUERYCHANGECONFIG = 0x0017;
public const int DBT_USERDEFINED = 0xFFFF;
protected override void WndProc(ref Message m)
{
try
{
if (m.Msg == WM_DEVICECHANGE)
{
switch (m.WParam.ToInt32())
{
case WM_DEVICECHANGE:
break;
case DBT_DEVICEARRIVAL:
DriveInfo[] s = DriveInfo.GetDrives();
foreach (DriveInfo drive in s)
{
if (drive.DriveType == DriveType.Removable)
{
string tempSal = HDVal(drive.Name.ToString());
this.richTextBox1.AppendText("U盘已插入,盘符是" + drive.Name.ToString() + " " + tempSal + "\r\n");
if (checkBox1.Checked == true)
{
_serialNumber.Add(tempSal);
}
else
{
if (!_serialNumber.Exists(e => e==tempSal))
{
bool result = RemoveUsbDevice(drive.Name.ToString());
if (result)
{
//CM_Disable_DevNode(ref handle, 0x02);
//CM_Enable_DevNode(ref handle, 0);
}
}
}
break;
}
}
break;
case DBT_CONFIGCHANGECANCELED:
//MessageBox.Show("2");
break;
case DBT_CONFIGCHANGED:
//MessageBox.Show("3");
break;
case DBT_CUSTOMEVENT:
//MessageBox.Show("4");
break;
case DBT_DEVICEQUERYREMOVE:
//MessageBox.Show("5");
break;
case DBT_DEVICEQUERYREMOVEFAILED:
//MessageBox.Show("6");
break;
case DBT_DEVICEREMOVECOMPLETE:
this.richTextBox1.AppendText("U盘已卸载" + "\r\n");
break;
case DBT_DEVICEREMOVEPENDING:
//MessageBox.Show("7");
break;
case DBT_DEVICETYPESPECIFIC:
//MessageBox.Show("8");
break;
case DBT_DEVNODES_CHANGED:
//MessageBox.Show("9");
break;
case DBT_QUERYCHANGECONFIG:
//MessageBox.Show("10");
break;
case DBT_USERDEFINED:
//MessageBox.Show("11");
break;
default:
break;
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
base.WndProc(ref m);
}
private string HDVal(string drvID)
{
const int MAX_FILENAME_LEN = 256;
int retVal = 0;
int a = 0;
int b = 0;
string str1 = null;
string str2 = null;
int i = GetVolumeInformation(
drvID,
str1,
MAX_FILENAME_LEN,
ref retVal,
a,
b,
str2,
MAX_FILENAME_LEN
);
return retVal.ToString();
}