精华内容
下载资源
问答
  • 微软官方Win7U盘启动制作工具+使用方法 可以完美制作用U盘安装Win7!
  • udev实现U盘或SD卡的自动挂载,在这里我们再说一下怎样用mdev实现这个功能。mdev的使用在busybox中的mdev.txt文档已经将得很详细了。   mdev是busybox中的一个udev管理程序的一个精简版,他也可以实现设备节点的...
    udev实现U盘或SD卡的自动挂载,在这里我们再说一下怎样用mdev实现这个功能。mdev的使用在busybox中的mdev.txt文档已经将得很详细了。
    
     
    mdev是busybox中的一个udev管理程序的一个精简版,他也可以实现设备节点的自动创建和设备的自动挂载,只是在实现的过程中有点差异,在发生热插拔时间的时候,mdev是被hotplug直接调用,这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。
    下面是如何让我们的系统支持mdev。
     
    1.在使用busybox制作根文件系统的时候,选择支持mdev
    Linux System Utilities  --->   
               [*] mdev      
               [*]   Support /etc/mdev.conf
               [*]     Support command execution at device addition/removal
    2.在文件系统添加如下内容
    Vim /etc/init.d/rcS
            mount -t tmpfs mdev /dev 
            mount -t sysfs sysfs /sys
            mkdir /dev/pts
            mount -t devpts devpts /dev/pts
    echo /sbin/mdev>/proc/sys/kernel/hotplug
            mdev –s
    这些语句的添加在mdev的手册中可以找到。
    3.添加对热插拔事件的响应,实现U盘和SD卡的自动挂载。
    Vim /etc/mdev.conf
            mmcblk[0-9]p[0-9] 0:0 666 @ /etc/sd_card_inserting
            mmcblk[0-9] 0:0 666 $ /etc/sd_card_removing
            sd[a-z] [0-9] 0:0 666 @ /etc/usb/usb_inserting
            sd[a-z] 0:0 666 $ /etc/usb/usb_removing
    红色部分,是一个脚本,脚本内容可以根据我们的需要定制,可以实现挂载,卸载或其他一些功能。
    如下是自动挂载和卸载的脚本:
    /etc/sd_card_inserting
            #!/bin/sh
            mount -t vfat /dev/mmcblk0p1 /mnt/sd
    /etc/sd_card_removing
            #!/bin/sh
            sync
            umount /mnt/sd
     
    项目中要用到这样的功能,插入U盘时,要求自动检测到U盘的插入,并自动启动应用程序。
     
    我的根文件系统是用busybox构建的,其中,设备文件的生成是使用busybox中的mdev生成。Mdev除了生成设备文件外,还能检测到设备的插入拨出,即热插拨检测。那么,自动检测U盘的插入,mdev本来就可以做到,不用再做研究了,问题是如何自动启动程序呢?这就要使用mdev.conf文件了,此文件在根文件系统的/etc目录下。Mdev检测到设备插入后,会根据此文件中的规则自动做一些相关的事。于是,我就写了如下一条规则,sda[0-9] 0:0 600 @(/autostart) 让mdev在检测到U盘插入后,自动运行autostart脚本。做到这一步都没困难,busybox的文档就有详细说明,不多解释了。
     
    但我要启动的是一个QT4 embedded的程序。大家都知道,运行这样的程序是要配置一些相关环境变量的,比如,我的程序要使用到tslib的一些环境变量,一般是在/etc/profile文件中进行配置。我也在此文件中配置了相关环境变量,但发现用手工方法启动QT程序,环境变量是起作用的,程序工作正常。但是我用autostart脚本启运此程序,却发现环境变量没起作用。百思不得其解,想到很多办法都没有解决。最后,在PC上的linux发行版中运行QT程序时,得到启发,我发现QT程序相关的环境变量只在当前的控制台中起作用。那么,mdev自动起动autostart是不是另起了一个控制台呢?于是在atutostart的脚本中加入QT的相关环境变量设置,问题得到了解决。
     
    -----------------------------------------------------------------------------------------
     
    mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选择。
    mdev使用
    mdev的使用在busybox中的mdev.txt文档已经将得很详细了。但作为例子,我简单讲讲我的使用过程: 
    (1)在编译时加上对mdev的支持(我是使用的是busybox1.10.1):
        Linux System Utilities  ---> 
        mdev           
        Support /etc/mdev.conf 
        Support command execution at device addition/removal
     
    (2)在启动时加上使用mdev的命令:
    我在自己创建的根文件系统(nfs)中的/linuxrc文件中添加了如下指令:
    #挂载/sys为sysfs文件系统
        echo "----------mount /sys as sysfs"
        /bin/mount -t tmpfs mdev /dev 
        /bin/mount -t sysfs sysfs /sys
        echo "----------Starting mdev......"
        /bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
        mdev -s 
    注意:是/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug,并非/bin/echo /bin/mdev > /proc/sys/kernel/hotplug。
    busybox的文档有错!!
      
    (3)在你的驱动中加上对类设备接口的支持。
      在驱动程序的初始化函数中,使用下述的类似语句,就能在类设备目录下添加包含设备号的名为“dev”的属性文件。并通过mdev在/dev目录下产生gpio_dev0的设备节点文件。
      my_class = class_create(THIS_MODULE, "gpio_class");
      if(IS_ERR(my_class)) {
        printk("Err: failed in creating class.\n");
        return -1;
      }
      /* register your own device in sysfs, and this will cause mdev to create corresponding device node */
      class_device_create(my_class, NULL, MKDEV(gpio_major_number, 0), NULL, "gpio_dev%d" ,0);
      在驱动程序的清除程序段,加入以下语句,以完成清除工作。
      class_device_destroy(my_class, MKDEV(gpio_major_number, 0));
      class_destroy(my_class);
      需要的头文件是linux/device.h,因此程序的开始应加入下句
      #include 
      另外,my_class是class类型的结构体指针,要在程序开始时声明成全局变量。
      struct class *my_class;
      上述程序中的gpio_major_number是设备的主节点号。可以换成需要的节点号。gpio_dev是最终生成的设备节点文件的名子。%d是用于以相同设备自动编号的。gpio_class是建立的class的名称,当驱动程序加载后,可以在/sys/class的目录下看到它。
      上述语句也不一定要在初始化和清除阶段使用,可以根据需要在其它地方使用。
     
    (4)至于/etc/mdev.conf文件,可有可无,不影响使用,只是添加了些功能。
    关于mdev的使用方法,我在网上找到一篇中文版的。大家可以到我上传的资源中下载。    
     
    要想真正用好mdev,适当知道一下原理是必不可少的。现在简单介绍一下mdev的原理:
     
    执行mdev -s:以‘-s’为参数调用位于/sbin目录写的mdev(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),mdev扫描 /sys/class 和/sys/block中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点文件。一般只在启动时才执行一次 “mdev -s”。
     
    热插拔事件:由于启动时运行了命令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那么当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev。这时mdev通过环境变量中的 ACTION 和DEVPATH,(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。
     
    最后,附上我在工作中编写的一段简单的gpio控制驱动程序。此程序没有什么功能,主要是做一些测试用的。有兴趣的朋友可以用它测试一下上述的mdev的使用方法。我用的是友善公司的mini2440开发板。
     
    补充:1
    为mdev的运行准备环境 
    mdev需要改写/dev和/sys两个目录。所以必须保证这两个目录是可写的(一般会用到sysfs,tmpfs。所以要重新编译内核)。 
    然后在你的启动脚本文件中加入 
    /bin/mdev -s
    补充2:
     ·/etc/fstab
    这是mount -a要读取的文本。根据需要编写。 mdev的使用方法和原理以及实现U盘或SD卡的自动挂载  
    展开全文
  • 安全优盘有三个分区,分别是光盘区、加密区用户区。光盘区存放 S-NUMEN DT 的安装程序。加 密区可以设置访问密码,只有输入了正确的密码才能访问加密区。用户区可以设置 Autorun.inf 病毒 免疫 Exe 免疫,还可以...
  • 能够显示U盘的总容量、使用容量剩余容量3.能够将某个目录上的文件或整个目录复制到U盘上4. 删除U盘上文件5.禁止U盘使用及开启U盘使用6.尝试读取PCB信息2.项目到底长啥样3.总结 前言 MFC实现对U盘的管理并用...


    前言

    MFC实现对U盘的管理并用图形化界面展示出来。


    项目下载地址
    MFC教程

    一、利用OS API实现对U盘的管理

    • 能够判断U盘是否存在
    • 能够显示U盘的总容量、使用容量和剩余容量;
    • 能够将某个目录上的文件或整个目录复制到U盘上;
    • 可以删除U盘上文件;
    • 禁止U盘的使用及开启U盘的使用;
    • 推荐使用C# winform,也可以使用其它语言;
    • 体会OS的API的作用; 尝试读取PCB信息;
    • 其它创意。 项目最终能以图形界面的形式完成。

    二、项目到底长啥样

    界面比较简单

    三、实例代码

    本项目主要采用MFC(微软基础类库)开发一个Windows窗体程序,实现对U盘的管理。项目第一个功能以及使用MFC开发的idea源自一位学长。其余功能由自己通过网上查阅资料实现。
    项目传送门:
    https://blog.csdn.net/qq_39861376/article/details/102678582

    1.实时判断U盘插入与拔出

    OnDeviceChange(UINT nEventType, DWORD dwData):
    首先设置消息映射

    afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);
    
    BEGIN_MESSAGE_MAP(CMFCUSBDlg, CDialogEx)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDC_BUTTON1, &CMFCUSBDlg::OnBnClickedButton1)
    	//ON_WM_ACTIVATE()
    	ON_WM_DEVICECHANGE()
    END_MESSAGE_MAP()
    

    注册USB设备消息,不注册消息处理函数无法响应, 只有注册了该设备,OnDeviceChange才能获得详细的信息,否则收到的nEventType参数都是0007,dwData无数据。

    BOOL CMFCUSBDlg::OnInitDialog()
    	// 注意向OnInitDialog中添加如下代码;
    	DEV_BROADCAST_DEVICEINTERFACE Filter;
    	ZeroMemory(&Filter, sizeof(Filter));
    	Filter.dbcc_size = sizeof(Filter);   // size gets set to 29 with 1-byte packing or 32 with 4- or 8-byte packing
    	Filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
    	Filter.dbcc_classguid = {0xA5DCBF10,0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
    	//DEVICE_NOTIFY_ALL_INTERFACE_CLASSES //关注所有设备事件
    	RegisterDeviceNotification(this->m_hWnd, &Filter, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
    	if (NULL == RegisterDeviceNotification(this->m_hWnd, &Filter, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES))
    		TRACE("RegisterDeviceNotification failed!!");
    

    常见的GUID
    GUID:
    https://blog.csdn.net/diyu122222/article/details/79791073

    C/C++ code
    static const GUID GUID_DEVINTERFACE_LIST[] = 
    {
        // GUID_DEVINTERFACE_USB_DEVICE
        { 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } },
    
        // GUID_DEVINTERFACE_DISK
        { 0x53f56307, 0xb6bf, 0x11d0, { 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } },
    
        // GUID_DEVINTERFACE_HID, 
        { 0x4D1E55B2, 0xF16F, 0x11CF, { 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } },
    
        // GUID_NDIS_LAN_CLASS
        { 0xad498944, 0x762f, 0x11d0, { 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c } }
    
         GUID_DEVINTERFACE_COMPORT
        //{ 0x86e0d1e0, 0x8089, 0x11d0, { 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73 } },
    
         GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR
        //{ 0x4D36E978, 0xE325, 0x11CE, { 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18 } },
    
         GUID_DEVINTERFACE_PARALLEL
        //{ 0x97F76EF0, 0xF883, 0x11D0, { 0xAF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x84, 0x5C } },
    
         GUID_DEVINTERFACE_PARCLASS
        //{ 0x811FC6A5, 0xF728, 0x11D0, { 0xA5, 0x37, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xD1 } }
    };
    
    

    接受设备变更消息:

    BOOL CMFCUSBDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
    {
    	//const int DBT_DEVICEARRIVAL = 0x8000; // system detected a new device
    	//public const int DBT_DEVICEQUERYREMOVE = 0x8001;   // Preparing to remove (any program can disable the removal)
    	//const int DBT_DEVICEREMOVECOMPLETE = 0x8004; // removed 
    	//const int DBT_DEVTYP_VOLUME = 0x00000002;
    	//DEV_BROADCAST_DEVICEINTERFACE * dbd = (DEV_BROADCAST_DEVICEINTERFACE*)dwData;
    	//CString str;
    	//str.Format(_T("U disk in !"));
    	//SetDlgItemText(IDC_BUTTON1, str);第一个短点,判断是否接收到设备变动的信息
    	CString detectMsg;
    	char  m_decDriver;
    	PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)dwData;
    	switch (nEventType)
    	{
    	case DBT_DEVICEARRIVAL:
    		{
    		//第二个断点,判断nEventType传来的值是0007还是0X8000
    		if (lpdb->dbch_devicetype==DBT_DEVTYP_VOLUME)//逻辑卷
    		{
    			
    			PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
    			switch (lpdbv->dbcv_flags)
    			{
    			case 0://U盘
    			{
    				m_decDriver = FirstDriveFromMask(lpdbv->dbcv_unitmask);
    				detectMsg.Format(_T("检测到U盘:[%c]插入!"),m_decDriver);
    				MessageBox(detectMsg);
    			}
    			break;
    			case DBTF_MEDIA://光盘
    				break;
    			}
    		}
    	}
    	break;
    	case DBT_DEVICEREMOVECOMPLETE:
    		//   Handle   device   removal
    	{
    		
    		if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//逻辑卷
    		{
    			PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
    			switch (lpdbv->dbcv_flags)
    			{
    			case 0:                //U盘
    			{
    				m_decDriver = FirstDriveFromMask(lpdbv->dbcv_unitmask);
    				//detectMsg.Format(_T("检测到U盘:[%s]拔出!"), m_decDriver/*.GetBuffer(0)*/);
    				detectMsg.Format(_T("检测到U盘:[%c]拔出!"),m_decDriver);
    				MessageBox(detectMsg);
    				
    			}
    			break;
    			case DBTF_MEDIA:    //光盘
    				break;
    			}
    		}
    	}
    	break;
    	}
    	//CString str;
    	//str.Format(_T("U disk in !"));
    	//SetDlgItemText(IDC_BUTTON1, str);
    	return  TRUE;
    }
    

    获取单元掩码

    char FirstDriveFromMask(ULONG unitmask)
    {
    	char i;
    
    	for (i = 0; i < 26; ++i)
    	{
    		if (unitmask & 0x1)
    			break;
    		unitmask = unitmask >> 1;
    	}
    
    	return(i + 'A');
    }
    

    2.能够显示U盘的总容量、使用容量和剩余容量

    按钮事件:

    void CMFCUSBDlg::OnBnClickedButton1()
    {
    	 CString m_decDriver = GetDiskLetter();
    	// 获取盘符
    	 INT_PTR nRes;
    	 CTipDlg tipDlg;           // 构造对话框类CTipDlg的实例   
    	 nRes = tipDlg.DoModal();  // 弹出对话框   
    	 //从这里开始
    	 UpdateData(true);
    	   ULARGE_INTEGER nFreeBytesAvailable;
    	   ULARGE_INTEGER nTotalNumberOfBytes;
    	   ULARGE_INTEGER nTotalNumberOfFreeBytes;
    		   //lpDirectoryName 是驱动器的名称。
    		   //lpFreeBytesAvailableToCaller 是用户可用的磁盘空间。
    		   //lpTotalNumberOfBytes 是磁盘总共的空间。
    		   //lpTotalNumberOfFreeBytes 是磁盘空闲的空间。以上都是字节为单位。
    	   if (GetDiskFreeSpaceEx(m_decDriver + ":", &nFreeBytesAvailable, &nTotalNumberOfBytes, &nTotalNumberOfFreeBytes))
    	   {
    		   CString str;
    		   str.Format(_T("用户可用的磁盘空间:%.2fGB\n磁盘总空间:%.2fGB\n磁盘空闲空间:%.2fGB\n"), (GB(nFreeBytesAvailable)), (GB(nTotalNumberOfBytes)), (GB(nTotalNumberOfFreeBytes)));
    		   MessageBox(str, _T("磁盘信息"), MB_OK);
    	   }
    	   UpdateData(false);
    }
    

    获取盘符:

    CString GetDiskLetter()
    {
    	CString strDiskLetter = _T("");
    	LPTSTR lpDrives = new TCHAR[MAX_PATH];
    	DWORD dwLen = ::GetLogicalDriveStrings(MAX_PATH, lpDrives);
    	CString sDrives[26];
    	for (DWORD nIndex = 0; nIndex < dwLen / 4; nIndex++)
    	{
    		if (::GetDriveType(lpDrives + nIndex * 4) == DRIVE_REMOVABLE)
    		{
    			sDrives[nIndex] += (CString)(lpDrives + nIndex * 4);
    			if (sDrives[nIndex] != _T("A://") && sDrives[nIndex] != _T("B://"))
    			{
    				CString usbPath = sDrives[nIndex];
    				strDiskLetter = usbPath.Left(1);
    				//AfxMessageBox(strDiskLetter);
    				break;
    			}
    		}
    	}
    	delete lpDrives;
    	return strDiskLetter;
    }
    

    字节与GB转化:

    float GB(ULARGE_INTEGER TotalNumberOfBytes) {
    	int iTotal = (TotalNumberOfBytes.u.HighPart << 12) + (TotalNumberOfBytes.u.LowPart >> 20);
    	return iTotal / 1024.0;
    }
    

    3.能够将某个目录上的文件或整个目录复制到U盘上

    获取文件路径:

    void CMFCUSBDlg::OnBnClickedButtonfile()
    {
    	CString strFile = _T("");
    	
    		 CFileDialog    dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.jpg)|*.jpg|All Files (*.*)|*.*||"), NULL);
    	
    		 if (dlgFile.DoModal())
    		 {
    		      strFile = dlgFile.GetPathName();
    		 }
    		 SetDlgItemText(EditFile, strFile);
    	// TODO: 在此添加控件通知处理程序代码
    }
    

    获取目录路径:

    void CMFCUSBDlg::OnBnClickedButtondir()
    {
    	TCHAR           szFolderPath[MAX_PATH] = { 0 };
    	CString         strFolderPath = TEXT("");
    
    	BROWSEINFO      sInfo;
    	::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
    	sInfo.pidlRoot = 0;
    	sInfo.lpszTitle = _T("请选择处理结果存储路径");
    	sInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_DONTGOBELOWDOMAIN;
    	sInfo.lpfn = NULL;
    
    	// 显示文件夹选择对话框  
    	LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
    	if (lpidlBrowse != NULL)
    	{
    		// 取得文件夹名  
    		if (::SHGetPathFromIDList(lpidlBrowse, szFolderPath))
    		{
    			strFolderPath = szFolderPath;
    		}
    	}
    	if (lpidlBrowse != NULL)
    	{
    		::CoTaskMemFree(lpidlBrowse);
    	}
    	CString strFile;
    	GetDlgItemText(EditFile, strFile);
    	string dirname = Replace(strFile);
    	string filename;
    	int flag;
    	for (int i = dirname.length() - 1; i >= 0; i--)
    	{
    		if (dirname[i] == '/') {
    			flag = i;
    			break;
    		}
    	}
    	for (int i = flag + 1; i < dirname.length(); i++) {
    		filename += dirname[i];
    	}
    	//strFolderPath = strFolderPath + filename;
    	
    	CString cstrTest;
    	cstrTest = CA2T(filename.c_str());
    	SetDlgItemText(EditDir, strFolderPath+cstrTest);
    			     //return strFolderPath		 
    }
    

    复制文件:

    void CMFCUSBDlg::OnBnClickedButtoncopy()
    {
    	
    	//string Ef= "C:/masm/usb/usb.txt";
    	//string Nf = "D:/1usb.txt";
    	CString Ef; 
    	GetDlgItemText(EditFile, Ef);
    	CString Nf; 
    	GetDlgItemText(EditDir, Nf);
    	CString str;
    	//str.Format(_T("请选择要复制的文件"));
    	if (Replace(Ef)=="") {
    		//cout << 1;
    		str.Format(_T("请选择要复制的文件"));
    		MessageBox(str);		
    	}
    	else if (Replace(Nf) == "")
    	{
    		str.Format(_T("请选择文件复制位置"));
    		MessageBox(str);
    	}
    	else{	
    	wstring stempEf = s2ws(Replace(Ef));
    	wstring stempNf = s2ws(Replace(Nf));
    	LPCWSTR resultEf = stempEf.c_str();
    	LPCWSTR resultNf = stempNf.c_str();
    	// TODO: 在此添加控件通知处理程序代码
    	CString str;
    	str.Format(_T("复制失败,请检查您的文件路径"));
    	if (!CopyFile(resultEf, resultNf, FALSE))
    	{
    		MessageBox(str);
    	}	
    	else {
    		str.Format(_T("Copy successfully!"));
    		MessageBox(str);
    	}
    	}
    }
    

    替换函数:

    //把\替换成/
    string Replace(CString str) {
    	string strTest;
    	//CString转换为String
    	strTest = CT2A(str.GetString());
    	for (int i = 0; i < strTest.length(); i++) {
    		if (str[i] == '\\') {
    			strTest = strTest.replace(i, 1, "/");
    		}
    	}
    	return strTest;
    }
    

    类型转换函数(string转化为wstring再转换为LPCTSTR):

    //string到wstring类型转换,wstring可以转换为LPCTSTR文件
    wstring s2ws(const std::string& s) {
    
    	int len;
    
    	int slength = (int)s.length() + 1;
    
    	len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
    
    	wchar_t* buf = new wchar_t[len];
    
    	MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    
    	std::wstring r(buf);
    
    	delete[] buf;
    
    	return r.c_str();
    
    }
    

    第二种类型转换的方法:

    LPCWSTR stringToLPCWSTR(std::string orig)
    {
    	size_t origsize = orig.length() + 1;
    	const size_t newsize = 100;
    	size_t convertedChars = 0;
    	wchar_t *wcstring = (wchar_t *)malloc(sizeof(wchar_t)*(orig.length() - 1));
    	mbstowcs_s(&convertedChars, wcstring, origsize, orig.c_str(), _TRUNCATE);
    
    	return wcstring;
    }
    

    第三种类型转化:

    直接强转(LPCTSTR)string
    

    4. 删除U盘上文件

    获取文件路径:同复制操作
    删除文件:

    void CMFCUSBDlg::OnBnClickedButtondelete()
    {
    	CString Nf;
    	GetDlgItemText(EditFile, Nf);
    	wstring stempNf = s2ws(Replace(Nf));
    	LPCWSTR resultNf = stempNf.c_str();
    	BOOL del = DeleteFile(resultNf);
    	if (del)
    	{
    		MessageBox(_T("删除成功"), _T("提示信息"), MB_OK);
    	}
    	else
    	{
    		DWORD error_rus = GetLastError();
    		MessageBox( _T("删除失败"), _T("提示信息"), MB_OK);
    	}
    
    }
    

    5.禁止U盘的使用及开启U盘的使用

    这里采用更改注册表的方式达到禁用与开启的效果,详情可以见:
    https://blog.csdn.net/weixin_44627672/article/details/109430607

    void CMFCUSBDlg::OnBnClickedCloseu()
    {
    	long lRet;
    	HKEY hKey;
    	lRet = RegCreateKey(
    		HKEY_LOCAL_MACHINE,
    		_T("SYSTEM\\CurrentControlSet\\Services\\USBSTOR"),
    		&hKey
    	);
    	DWORD KeyValue = 4;
    	
    	if (lRet == ERROR_SUCCESS)
    	{
    
    		//MessageBox(_T("right"), _T("Prompt"), MB_OK);
    		lRet = RegSetKeyValue(HKEY_LOCAL_MACHINE,
    			_T("SYSTEM\\CurrentControlSet\\Services\\USBSTOR"),
    			_T("Start"),
    			REG_DWORD,
    			(LPBYTE)&KeyValue,
    			sizeof(DWORD)
    		);
    		if (lRet == ERROR_SUCCESS)
    		{
    			MessageBox(_T("禁用成功"), _T("Prompt"), MB_OK);
    		}
    		else
    		{
    			MessageBox(_T("禁用失败,请检查您的权限"), _T("Prompt"), MB_OK);
    		}
    		RegCloseKey(hKey);
    	}
    	else {
    		MessageBox(_T("权限不足"), _T("Prompt"), MB_OK);
    		RegCloseKey(hKey);
    	}
    	//open+query查询值
    	/*
    	TCHAR tchData[64];
    	DWORD dwSize;
    	DWORD dwValue, dwType;
    	DWORD dwBufLen = 255;
    	DWORD dwRet;
    	dwSize = sizeof(data);
    	lRet = RegOpenKeyEx(
    		HKEY_LOCAL_MACHINE,         // handle to open key
    		_T("SYSTEM\\CurrentControlSet\\Services\\USBSTOR"),  // subkey name
    		0,   // reserved
    		KEY_QUERY_VALUE, // security access mask
    		&hKey    // handle to open key
    	);
    	假设start说存储的数据是REG_SZ
    	lRet = RegQueryValueEx(
    			hKey,            // handle to key
    			_T("Start"),  // value names
    			NULL,   // reserved
    			NULL,       // type buffer
    			(LPBYTE)tchData,        // data buffer
    			&dwSize      // size of data buffer
    		);
    	if (RegQueryValueEx(hKey, _T("Start"), NULL, &dwType, (LPBYTE)&dwValue, &dwBufLen) == ERROR_SUCCESS)
    	{
    		if (dwType == REG_DWORD)
    			dwRet = dwValue;
    	}
    	else {
    		MessageBox(_T("234"));
    	}
    	RegCloseKey(hKey);
    	*/
    }
    

    6.尝试读取PCB信息

    这里只获取了PID

    //获取PCB信息如PID
    void CMFCUSBDlg::OnBnClickedButtonpcb()
    {
    	CString str;
    	DWORD csPid;
    	csPid = GetCurrentProcessId();
    	str.Format(_T("PID:%u"), csPid);
    	//SetDlgItemText(IDC_EDIT1, _T("PID:[]"));
    	SetDlgItemText(IDC_EDIT1, str);
    }
    

    四、总结

    做完这个项目将近三天,因为自己基础不好实现起来不是很容易,好在终于解决了;主要还是提高了自己的文献检索能力(如何快速的从网上获得自己所需要的东西,这点很重要)、以及独立解决问题的能力(一个复杂的问题是如何一步一步解决的。从毫无思路到知道大概思路再到具体实现,不断发现问题解决问题,最后走到终点。)
    就像海里航行的船,没有指南针,到处都没有路,也可以说到处都是路,如何走到终点这是一个很重要的问题。
    最后感谢以下大佬的博客:
    1.VS2017加装MFC以及创建第一个MFC程序
    https://blog.csdn.net/qq_35987486/article/details/94456910
    https://blog.csdn.net/qq_39861376/article/details/102678582
    2.为什么找不到标志符
    https://blog.csdn.net/taotaoah/article/details/46333983
    三.判断U盘是否拔出与插入
    1.如何进行消息映射
    https://blog.csdn.net/eqiang8271/article/details/24477001?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
    2.USB GUID
    https://blog.csdn.net/phenixyf/article/details/48783271
    3.判断U盘插入拔出程序
    https://blog.csdn.net/qq_39861376/article/details/102678582
    4.各个函数的使用以及导入外部库(windows.h,dbt.h)
    MSDN
    四.判断U盘容量
    lpDirectoryName 是驱动器的名称。
    lpFreeBytesAvailableToCaller 是用户可用的磁盘空间。
    lpTotalNumberOfBytes 是磁盘总共的空间。
    lpTotalNumberOfFreeBytes 是磁盘空闲的空间。以上都是字节为单位。
    1.GB与bytes转换:
    https://blog.csdn.net/qq_41786318/article/details/80969881
    2.获取盘符
    忘了记录
    3.判断U盘容量程序
    https://blog.csdn.net/qq_39861376/article/details/102678582
    4.如何用MFC框架生成模态对话框弹出式的程序(跟C#、VB,类似)
    鸡啄米http://www.jizhuomi.com/software/160.html
    五、复制文件操作
    1.copyfile函数的使用
    MSDN
    https://www.jb51.net/article/190834.htm
    2.如何查找文件路径
    https://blog.csdn.net/wuhenyouyuyouyu/article/details/78521092
    3.string中的replace函数
    https://blog.csdn.net/qq_40968179/article/details/104380460
    4.Cstring与string之间的相互转换
    https://blog.csdn.net/Gordon_Wei/article/details/90443677
    5.string如何转换成LPCTSTR类型
    https://www.cnblogs.com/qinguoyi/p/7249561.html?utm_source=itdadao&utm_medium=referral
    六、删除U盘上的文件
    1.deleteFile函数等使用
    MSDN
    七、停止U盘的使用与终止U盘的使用
    如何通过注册表禁用U盘
    https://jingyan.baidu.com/article/e2284b2b892cd7e2e6118dbb.html
    对注册表的操作
    https://www.cnblogs.com/zhaoyixiang/p/12983823.html
    如何修改REG_DWORD类型的start值
    https://zhidao.baidu.com/question/1046050784719513299.html
    八、尝试读取PCB的信息
    VC如何获取当前自身PID:
    https://blog.csdn.net/sunnysab/article/details/9367077?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param

    展开全文
  • SM32X量产工具H1218汉化版,早已汉化OK,因此版量产工具对于目前市场上使用的FLASH并未有什么作用,主要是针对新FLASH,反而用此版量产后会使个别的FLASH速度变慢,迟迟未发出来。不要追求最新版,最新版并不见得是...
  • 手机技巧:被人忽视OTG功能怎么使用?复制文件到U盘的新方法 目前我们所购买的手机大...OTG全称为On-The-Go,是最近几年出现的新兴技术,其主要作用就是使我们的移动智能设备和U盘相互连接,我们使用的移动智能设...

    手机技巧:被人忽视OTG功能怎么使用?复制文件到U盘的新方法

    目前我们所购买的手机大部分都带有OTG功能,那么OTG到底是什么呢?好多人对OTG功能其实都是太过于了解的,那么我们如何正确的使用手机的OTG功能呢?这个手机小技巧能够帮助我们不通过电脑直接导出手机照片哦!
    在这里插入图片描述
    OTG全称为On-The-Go,是最近几年出现的新兴技术,其主要作用就是使我们的移动智能设备和U盘相互连接,我们使用的移动智能设备的接口多为USB Micro或USB Mini,并不能直接插入USB,所以才会有OTG数据线的出现。
    在这里插入图片描述
    那么OTG的主要功能有哪些呢?

    1. 手机通过OTG连接U盘等,可以直接读取U盘或者读卡器的资料。

    2. 鼠标可通过OTG连接,进行操作手机。

    3. 部分移动硬盘也能够通过OTG连接读取资料。

    4. 部分摄像机额也能够通过OTG连接读取相片、视频。

    5. 部分游戏手柄也可以直接通过或OTG与移动智能设备相连。

    6. 通过OTG我们能够给手机、MP3、MP4设备进行充电。

    7. OTG还能够给USB小风扇、USB台灯供电。

    这些都是我们经常见到的OTG的操作方法。
    在这里插入图片描述
    当然OTG最实用的功能就是方便我们把手机文件复制到U盘,具体的操作方法就是,我们要先准备一条与我们手机端口相匹配的OTG数据线,U盘与手机通过OTG相互连接以后,我们就可以在文件管理内,把手机内的资料备份到U盘中了,这样我们就无需通过电脑进行中转。
    在这里插入图片描述
    除了复制以外,如果你还有USB接口的MP3,这样连接到手机上,我们还能够通过手机对MP3内的音乐,进行删除复制等操作。通过OTG给我们的手环等小的移动设备进行充电也是可以的。
    在这里插入图片描述
    以上就是我要为大家介绍的OTG功能了,手机内除了OTG比较实用以外,通过手机应用市场获取的录音转文字助手也是比较实用的。我们通过录音转文字助手,可以进行实时的语音输入,识别音频文件的文字以及语音翻译等功能。
    在这里插入图片描述
    今天的话题就到这里,感谢大家的阅读,对于小编分享的手机技巧,大家还有什么看法呢?
    在这里插入图片描述
    或者说大家还有没有更好的手机技巧,也可以在评论区分享给大家哦!

    展开全文
  • DiskGenius是一款集分区办理与数据规复功效的...2.带有系统的U盘(我是用ULtraISO软件将ISO镜像写入到U盘的,方法:http://jingyan.baidu.com/article/a948d651b0f6a20a2dcd2eae.html) 3.电脑 第一步:将U盘中的系

    DiskGenius是一款集分区办理与数据规复功效的东西软件。它是在最初的DOS版的底子上开辟而成的。

    准备工作:

    1.DiskGenius软件

    2.带有系统的U盘(我是用ULtraISO软件将ISO镜像写入到U盘的,方法:http://jingyan.baidu.com/article/a948d651b0f6a20a2dcd2eae.html)

    3.电脑


    第一步:将U盘中的系统导出到电脑备份

         用这个启动盘制作一个能用的PE启动盘,毫无意外,这个时候U盘将被重新格式化为单个分区。

      ①打开diskgenius

           ②找到U盘,选中,鼠标右击,有“备份分区到镜像文件”选项

           ③“选择文件路径”,选择在电脑中的存储路径,稍后恢复时用,将U盘备份到镜像文件,备份的文件默认后缀名为pmf。

    系统备份完成

    第二步:用diskgenius删除U盘分区,重新分区

    ①选中U盘,鼠标右击,选项“删除所有分区”

    ②删除后,红色选中区应为灰色,(图中是已分好区的状态)

    ③点击红色选中区,右击,“建立新分区”,建立第一个分区,作为存储盘,格式为NTFS,再点击剩下灰色部分,建立第二个分区,选择选项“主磁盘”,不要选“扩展磁盘”,格式为FAT32,作为启动盘

    ④激活第二分区,格式化时要选中“建立DOS系统”选项,第一分区不用激活但要格式化。由于第一个分区是平时在windows下使用的主要存储分区,所以主要的容量都放在第一分区,第二分区的大小则根据你的PE文件的大小留出200M左右的磁盘交换空间即可。


    第三步,将备份的系统导入到第二分区


    选择第二分区,右击,有“将镜像文件恢复分区”选项,等待写入完成,启动盘就做好了。

    一切OK!!



    展开全文
  • U盘维修是一件细心的事情,下面将一一讲述其故障判断方法及维修思路:  (以下故障在维修时,首先要排除USB接口损坏及PCB板虚焊、及USB延长线正常的情况下,再维修判断)  1、U盘插到机器上没有任何反应  维修...
  • 由于现在U盘相当普及,导致了U盘病毒的泛滥。很多人对U盘病毒非常痛恨,但是却找不到一种较好的解决方案。特别是比如有的时候新安装的系统,一不小心插个U盘,努力全部白费了,真是让人欲哭无泪啊。 U盘病毒,...
  • come on 伸出中指戳戳上方关注我……之前有跟大家分享过Armbian挂载硬盘的方法,但是有很多网友反馈挂载的时候因为格式化没有成功(特别是U盘有的U盘是不支持ext4格式的)结果造成挂载后服务器无法进入系统!...
  • Windows下两种方法弹出U盘

    千次阅读 2019-11-13 21:19:27
    通过CreateFile打开指定盘符的U盘获取设备句柄hDevice 通过DeviceIoControl(hDevice,FSCTL_DISMOUNT_VOLUME…)强制关闭其他进程对设备的占用 通过DeviceIoControl(hDevice,FSCTL_LOCK_VOLUME…)对设备进行加锁,防止...
  • 舍友拿来14年8GU盘(有写保护) ...再挂载,不起作用 dd :success: dd if=/dev/zero of=/dev/sdd 我没等到写完,直接中断就了, 连到 Win 10, 提示格式化 格式化后, 能正常使用 脑图
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 这个是SWAP 交换分区的作用。  系统中交换分区的大小并不取决于物理内存的量,而是取决于系统中内存的负荷,所以在安装系统时要根据具体的业务来设置SWAP的值。其实虚拟内存并不是等到物理内存用尽了才使用的,...
  • 进入U盘PE系统无法识别硬盘分区的原因分析解决方法时间:2015-07-15 来源:http://www.xitongtiandi.com/ 复制网址 进入U盘PE系统无法识别硬盘分区的原因分析解决方法分享给大家!PE,Windows PE Windows ...
  • 小甲鱼零基础入门学习python笔记

    万次阅读 多人点赞 2019-08-14 11:06:30
    039 类对象:拾遗 040 类对象:一些相关的BIF 041 魔法方法:构造析构 042 魔法方法:算术运算 043 魔法方法:算术运算2 044 魔法方法:简单定制 045 魔法方法:属性访问 046 魔法方法:描述符(Property的...
  •  通常“$OEM$”文件夹有三种使用方法:1.集成到boot.wim;2.集成到install.wim;3.直接复制到镜像的Sources目录下,这三种方法前面都详细的讲过。现再简单介绍一下—— 首先请看之前写过的OEM版系统制作方法以及...
  • mac登陆密码绕过/清除,反馈的同学还是挺多,觉得大家都有这方面的需求,于是再把自己的使用经验总结一下。 软件的原贴地址:http://bbs.wuyou.net/forum.php?mod=viewthread&amp;tid=330493&amp;extra=pag.....
  • 前几天打开电脑准备开始做老师的任务,结果开机进不了系统,蓝屏显示自动修复失败,立马选了启动修复,但可想而知不起作用。...下面给大家这几天我所查到并使用方法,以及最后我是用什么方法解决的。
  • 系统不认U盘的几种处理方法

    千次阅读 2018-11-15 02:55:04
    系统不认U盘的几种处理方法
  • Linux下挂载U盘方法

    千次阅读 2014-11-13 16:29:18
    Linux下挂载U盘方法 毫无疑问这是一个非常简单的问题,但是同样也是初学者肯定会碰到的问题,那么下面我们来了解一下linux下挂载U盘方法(以Ubuntu14.04为例) 本文的目录结构为: 1、主流的Linux系统基本都已经...
  • 众所周周知,随着U盘、移动硬盘、存储卡等移动存储设备的普及,U盘病毒已经成为比较流行的计算机病毒之一。优盘真的是病毒感染的重灾区!
  • Linux常用命令及使用方法

    千次阅读 2015-10-25 21:26:18
    本文详细列出Linux常用命令及使用方法,欢迎收藏,方便日后使用。 1.#表示权限用户(如:root),$表示普通用户 开机提示:Login:输入用户名 password:输入口令用户是系统注册用户成功登陆后,可以进入相应的用户环境...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,191
精华内容 5,676
关键字:

u盘的作用和使用方法