2010-12-06 7 views
2

J'ai un projet sur le disque USB. J'ai réussi à éjecter le disque USB dans mon code. Mais alors, je veux savoir comment le recharger? Quelqu'un peut-il me donner une suggestion. meilleur exemple! ThxComment recharger le disque USB en C#?

Répondre

1

J'ai résolu cette question de cette manière, le flux est mon code:

win32.cs

using System; 

using System.Collections.Generic; en utilisant System.Text; en utilisant System.Runtime.InteropServices;

SystemDevices d'espace de noms { [StructLayout (LayoutKind.Sequential)] public struct SP_BROADCAST_HANDLE { de dbch_size public int; public int dbch_devicetype; public int dbch_reserved; public IntPtr dbch_handle; public IntPtr dbch_hdevnotify; public Guid dbch_eventguid; public long dbch_nameoffset; octet public dbch_data; octet public 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; 
    } 
} 

}

dans les win32.cs il y a une fonction pour contrôler le matériel. La fonction stateChange (bool Enable, int SelectedItem, IntPtr DevInfo) est utilisée pour contrôler le démarrage ou l'arrêt du matériel. il y a trois Parameters.when la Enable est vrai, cette fonction rend le matériel Whos id est SelectedItem début, si elle est fausse stop.i obtenir l'ID dans ce code:

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

Il existe un outil (devcon) disponible auprès de Microsoft qui peut être utilisé pour réaliser les fonctionnalités du gestionnaire de périphériques.

La commande suivante est utilisée pour supprimer un périphérique spécifique (en supposant le nom de votre appareil est Kingston)

> devcon remove *Kingston* 

Cela provoque le dispositif est désactivé. Donc, il n'est plus disponible. La commande rescan active le périphérique.

> devcon rescan 

Vous pouvez exécuter cette commande via la méthode Process.Start(). Cela ne fonctionne pas avec les appareils qui ont marqué pour 'enlèvement Safe'

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

mais cette usbdisk a marqué pour « Suppression sécurisée ' – hcemp

Questions connexes