首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C#中重新加载U盘?

如何在C#中重新加载U盘?
EN

Stack Overflow用户
提问于 2010-12-06 13:57:54
回答 3查看 1.8K关注 0票数 2

我有一个关于U盘的项目。我已经在我的code.but中实现了弹出U盘,那么我想知道如何重新加载它?有人能给我一些建议吗?更好的例子!谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-09 11:25:19

我是这样解决这个问题的,flow就是我的代码:

win32.cs

代码语言:javascript
运行
复制
using System;

使用System.Collections.Generic;使用System.Text;使用System.Runtime.InteropServices;

命名空间SystemDevices { StructLayout(LayoutKind.Sequential)公共结构SP_BROADCAST_HANDLE { public 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;public byte dbch_data1;}

代码语言:javascript
运行
复制
[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)用于控制硬件的启动或停止。Enable为true有三个Parameters.when,此函数使id为SelectedItem的硬件启动,如果为false,则停止。我在下面的代码中获取id:

代码语言:javascript
运行
复制
 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));}
票数 2
EN

Stack Overflow用户

发布于 2010-12-06 15:00:57

代码语言:javascript
运行
复制
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"); 
}
票数 2
EN

Stack Overflow用户

发布于 2010-12-06 14:34:14

Microsoft提供了一个工具(devcon),可用于实现设备管理器的功能。

以下命令用于删除特定设备(假设您的设备名称为Kingston)

代码语言:javascript
运行
复制
> devcon remove *Kingston*

这会导致设备被禁用。因此它不再可用。命令rescan可启用设备。

代码语言:javascript
运行
复制
> devcon rescan

您可以通过Process.Start()方法执行此命令。这不适用于已标记为“安全删除”的设备

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4363701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档