2010-12-06 6 views
2

У меня есть проект о USB disk.i, который удалось извлечь диск USB в моем коде. Но тогда я хочу знать, как его перезагрузить? Может ли кто-нибудь дать мне какое-то предложение. лучше пример! ThxКак перезагрузить USB-диск в C#?

ответ

1

Я решил этот вопрос таким образом, поток мой код:

win32.cs

using System; 

используя System.Collections.Generic; с использованием System.Text; с использованием System.Runtime.InteropServices;

пространств имен SystemDevices { [StructLayout (LayoutKind.Sequential)] общественного структура SP_BROADCAST_HANDLE { общественного INT dbch_size; public int dbch_devicetype; public int dbch_reserved; public IntPtr dbch_handle; public IntPtr dbch_hdevnotify; public Guid dbch_eventguid; public long dbch_nameoffset; открытый байт dbch_data; открытый байт dbch_data1; }

[StructLayout(LayoutKind.Sequential)] 
public class DEV_BROADCAST_DEVICEINTERFACE 
{ 
    public int dbcc_size; 
    public int dbcc_devicetype; 
    public int dbcc_reserved; 
} 

[StructLayout(LayoutKind.Sequential)] 
public class SP_DEVINFO_DATA 
{ 
    public int cbSize; 
    public Guid classGuid; 
    public int devInst; 
    public IntPtr reserved; 
}; 

[StructLayout(LayoutKind.Sequential)] 
public class SP_DEVINSTALL_PARAMS 
{ 
    public int cbSize; 
    public int Flags; 
    public int FlagsEx; 
    public IntPtr hwndParent; 
    public IntPtr InstallMsgHandler; 
    public IntPtr InstallMsgHandlerContext; 
    public IntPtr FileQueue; 
    public IntPtr ClassInstallReserved; 
    public int Reserved; 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public string DriverPath; 
}; 

[StructLayout(LayoutKind.Sequential)] 
public class SP_PROPCHANGE_PARAMS 
{ 
    public SP_CLASSINSTALL_HEADER ClassInstallHeader = new SP_CLASSINSTALL_HEADER(); 
    public int StateChange; 
    public int Scope; 
    public int HwProfile; 
}; 

[StructLayout(LayoutKind.Sequential)] 
public class SP_CLASSINSTALL_HEADER 
{ 
    public int cbSize; 
    public int InstallFunction; 
}; 

public class Win32 
{ 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    public static extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, DEV_BROADCAST_DEVICEINTERFACE NotificationFilter, UInt32 Flags); 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    public static extern UInt32 UnregisterDeviceNotification(IntPtr hHandle); 

    [DllImport("setupapi.dll", SetLastError = true)] 
    public static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, 
     [MarshalAs(UnmanagedType.LPStr)]String Enumerator, IntPtr hwndParent, Int32 Flags); 

    [DllImport("setupapi.dll")] 
    public static extern IntPtr SetupDiGetClassDevsEx(ref Guid ClassGuid, 
     [MarshalAs(UnmanagedType.LPStr)]String Enumerator, 
     IntPtr hwndParent, Int32 Flags, IntPtr DeviceInfoSet, 
     [MarshalAs(UnmanagedType.LPStr)]String MachineName, 
     IntPtr Reserved); 

    [DllImport("setupapi.dll", SetLastError = true)] 
    public static extern Int32 SetupDiDestroyDeviceInfoList(IntPtr lpInfoSet); 

    [DllImport("setupapi.dll", SetLastError = true)] 
    public static extern Boolean SetupDiEnumDeviceInfo(IntPtr lpInfoSet, Int32 dwIndex, SP_DEVINFO_DATA devInfoData); 

    [DllImport("setupapi.dll", SetLastError = true)] 
    public static extern Boolean SetupDiGetDeviceRegistryProperty(IntPtr lpInfoSet, SP_DEVINFO_DATA DeviceInfoData, UInt32 Property, 
     UInt32 PropertyRegDataType, StringBuilder PropertyBuffer, UInt32 PropertyBufferSize, IntPtr RequiredSize); 

    [DllImport("setupapi.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    public static extern Boolean SetupDiSetClassInstallParams(IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SP_PROPCHANGE_PARAMS ClassInstallParams, int ClassInstallParamsSize); 

    [DllImport("setupapi.dll", CharSet = CharSet.Auto)] 
    public static extern Boolean SetupDiCallClassInstaller(UInt32 InstallFunction, IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData); 

    [DllImport("setupapi.dll", CharSet = CharSet.Auto)] 
    public static extern Boolean SetupDiClassNameFromGuid(ref Guid ClassGuid, StringBuilder className, Int32 ClassNameSize, ref Int32 RequiredSize); 

    [DllImport("setupapi.dll", CharSet = CharSet.Auto)] 
    public static extern Boolean SetupDiGetClassDescription(ref Guid ClassGuid, StringBuilder classDescription, Int32 ClassDescriptionSize, ref Int32 RequiredSize); 

    [DllImport("setupapi.dll", CharSet = CharSet.Auto)] 
    public static extern Boolean SetupDiGetDeviceInstanceId(IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, StringBuilder DeviceInstanceId, Int32 DeviceInstanceIdSize, ref Int32 RequiredSize); 

    public const int DIGCF_ALLCLASSES = (0x00000004); 
    public const int DIGCF_PRESENT = (0x00000002); 
    public const int INVALID_HANDLE_VALUE = -1; 
    public const int SPDRP_DEVICEDESC = (0x00000000); 
    public const int MAX_DEV_LEN = 200; 
    public const int DEVICE_NOTIFY_WINDOW_HANDLE = (0x00000000); 
    public const int DEVICE_NOTIFY_SERVICE_HANDLE = (0x00000001); 
    public const int DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = (0x00000004); 
    public const int DBT_DEVTYP_DEVICEINTERFACE = (0x00000005); 
    public const int DBT_DEVNODES_CHANGED = (0x0007); 
    public const int WM_DEVICECHANGE = (0x0219); 
    public const int DIF_PROPERTYCHANGE = (0x00000012); 
    public const int DICS_FLAG_GLOBAL = (0x00000001); 
    public const int DICS_FLAG_CONFIGSPECIFIC = (0x00000002); 
    public const int DICS_ENABLE = (0x00000001); 
    public const int DICS_DISABLE = (0x00000002); 

    public static bool StateChange(bool Enable, int SelectedItem, IntPtr DevInfo) 
    { 
     bool result = false; 
     SP_DEVINFO_DATA devInfoData = new SP_DEVINFO_DATA(); ; 
     devInfoData.cbSize = Marshal.SizeOf(typeof(SP_DEVINFO_DATA)); 
     if (true == SetupDiEnumDeviceInfo(DevInfo, SelectedItem, devInfoData)) 
     { 
      SP_PROPCHANGE_PARAMS pcp = new SP_PROPCHANGE_PARAMS(); ; 
      pcp.ClassInstallHeader.cbSize = Marshal.SizeOf(typeof(SP_CLASSINSTALL_HEADER)); 
      pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; 
      pcp.Scope = DICS_FLAG_GLOBAL; 
      pcp.StateChange = (Enable ? DICS_ENABLE : DICS_DISABLE); 
      if (true == SetupDiSetClassInstallParams(DevInfo, devInfoData, pcp, Marshal.SizeOf(pcp))) 
      { 
       if (true == SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, DevInfo, devInfoData)) 
       { 
        result = true; 
       } 
      } 
     } 
     return result; 
    } 

    public static String GetClassNameFromGuid(Guid guid) 
    { 
     String result = String.Empty; 
     StringBuilder className = new StringBuilder(); 
     Int32 iRequiredSize = 0; 
     Int32 iSize = 0; 
     bool b = SetupDiClassNameFromGuid(ref guid, className, iSize, ref iRequiredSize); 

     className = new StringBuilder(iRequiredSize); 
     iSize = iRequiredSize; 

     b = SetupDiClassNameFromGuid(ref guid, className, iSize, ref iRequiredSize); 
     if (true == b) 
     { 
      result = className.ToString(); 
     } 
     return result; 
    } 
    public static String GetClassDescriptionFromGuid(Guid guid) 
    { 
     String result = String.Empty; 
     StringBuilder classDesc = new StringBuilder(0); 
     Int32 iRequiredSize = 0; 
     Int32 iSize = 0; 
     bool b = SetupDiGetClassDescription(ref guid, classDesc, iSize, ref iRequiredSize); 

     classDesc = new StringBuilder(iRequiredSize); 
     iSize = iRequiredSize; 

     b = SetupDiGetClassDescription(ref guid, classDesc, iSize, ref iRequiredSize); 
     if (true == b) 
     { 
      result = classDesc.ToString(); 
     } 
     return result; 
    } 

    public static String GetDeviceInstanceId(IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData) 
    { 
     String result = String.Empty; 
     StringBuilder id = new StringBuilder(0); 
     Int32 iRequiredSize = 0; 
     Int32 iSize = 0; 
     bool b = SetupDiGetDeviceInstanceId(DeviceInfoSet, DeviceInfoData, id, iSize, ref iRequiredSize); 

     id = new StringBuilder(iRequiredSize); 
     iSize = iRequiredSize; 

     b = SetupDiGetDeviceInstanceId(DeviceInfoSet, DeviceInfoData, id, iSize, ref iRequiredSize); 
     if (true == b) 
     { 
      result = id.ToString(); 
     } 
     return result; 
    } 
} 

}

в win32.cs есть некоторая функция управления аппаратными средствами.

Функция StateChange (bool Enable, int SelectedItem, IntPtr DevInfo) используется для управления запуском или остановкой оборудования. есть три Parameters.when Включить правда, эта функция делает аппаратные средства чьего идентификатор запуск SelectedItem, если ложно stop.i получить идентификатор в этом коде:

Guid classGuid = Guid.Empty; 
     IntPtr hDevInfo = Win32.SetupDiGetClassDevs(ref classGuid, null, IntPtr.Zero, Win32.DIGCF_ALLCLASSES | Win32.DIGCF_PRESENT); 
     if (hDevInfo.ToInt32() == Win32.INVALID_HANDLE_VALUE) 
     { 
      Console.WriteLine("read hardware information error"); 
     } 
     else 
     { 
      int i = 0; 
      StringBuilder deviceName = new StringBuilder(); 
      deviceName.Capacity = Win32.MAX_DEV_LEN; 
      do 
      { 
       SP_DEVINFO_DATA devInfoData = new SP_DEVINFO_DATA(); 
       devInfoData.cbSize = Marshal.SizeOf(typeof(SP_DEVINFO_DATA)); 
       devInfoData.classGuid = Guid.Empty; 
       devInfoData.devInst = 0; 
       devInfoData.reserved = IntPtr.Zero; 
       bool result = Win32.SetupDiEnumDeviceInfo(hDevInfo, i, devInfoData); 
       if (false == result) 
       { 
        break; 
       } 
       Console.WriteLine("Device: {0}", i); 
       Console.WriteLine("\tGuid={0}", devInfoData.classGuid); 
       Console.WriteLine("\tName={0}", Win32.GetClassNameFromGuid(devInfoData.classGuid)); 
       Console.WriteLine("\tDescription={0}", Win32.GetClassDescriptionFromGuid(devInfoData.classGuid));} 
0

Существует инструмент (devcon), доступный от Microsoft, который может использоваться для достижения функциональности диспетчера устройств.

Следующая команда используется для удаления конкретного устройства (Предполагается, что ваше имя устройства Kingston)

> devcon remove *Kingston* 

Это приводит к тому, устройство будет отключено. Так что он больше не доступен. Повторная попытка команды позволяет устройству.

> devcon rescan 

Вы можете выполнить эту команду с помощью метода Process.Start(). Это не работает с устройствами, которые отметили на «Безопасное извлечение»

2
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Microsoft.Win32; 

private void btnenable_Click(object sender, EventArgs e) 
{ 
const string keyName = "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\USBSTOR"; 

// int tLong = (int)Registry.GetValue(keyName, "Start",0); 
Registry.SetValue(keyName, "Start", "00000003"); 
MessageBox.Show("USB MassStorage Enabled"); 

} 

private void btndisable_Click(object sender, EventArgs e) 
{ 
const string keyName = "HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\USBSTOR"; 

// int tLong = (int)Registry.GetValue(keyName, "Start",0); 
Registry.SetValue(keyName, "Start", "00000004"); 
MessageBox.Show("USB MassStorage Disabled"); 
} 
+0

но usbdisk пометил для «безопасного удаления ' – hcemp 2010-12-08 01:01:44

Смежные вопросы