如何使用U盘内的程序安全删除U盘

danhu 2014-11-25 04:59:58
我有一个U盘程序,在插入U盘点时候运行,在退出程序后自动或手动安全删除U盘。
目前的方法用winexec调用%windir%\system32\control.exe hotplug.dll。
但是实际是弹出来了系统的安全删除硬件的界面,然后本身应用程序退出。这个时候点删除U盘,提示删除失败。按说这个时候和U盘有关的进程已经都结束了,因为删除硬件使用的是系统的程序。难道是因为我本身的应用程序调用了control.exe导致没有释放??可是我自己的应用也已经退出来了。任务管理器中也没有了进程。
各位,如何做才能达到我预期的目标。
...全文
105 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
danhu 2014-11-26
  • 打赏
  • 举报
回复
解决问题了。 真做出来其实很简单。 这个问题其实就像在命令行执行命令,不管运行哪里的程序,其实当前目录一直是U盘。从而导致了虽然U盘程序结束,但是其他程序还在这个目录下工作。 使用chdir("c:\\windows\\system32");把当前目录改变到control.exe的路径即可安全删除U盘。
danhu 2014-11-26
  • 打赏
  • 举报
回复
引用 3 楼 Sandrer 的回复:
因为你调用的系统界面进程还是属于你u盘里面的程序 一般的做法都是在电脑里另外运行一个程序来关闭u盘 你u盘里的程序可以给系统生成一个程序(或其它途径),这个程序一直在后台运行 检测到你u盘的时候就做一些其它工作, 你u盘的程序在打算关闭u盘的时候,给后台程序发送一条命令 让后台程序等待一段时间后关闭u盘
如你所说,任何U盘产生或调用的程序,其实还是属于U盘。我尝试从U盘拷贝另一个程序用来在程序结束后删除U盘,可是这个调用过程就宣告了使用的是U盘的资源。
Sandrer 2014-11-26
  • 打赏
  • 举报
回复
因为你调用的系统界面进程还是属于你u盘里面的程序 一般的做法都是在电脑里另外运行一个程序来关闭u盘 你u盘里的程序可以给系统生成一个程序(或其它途径),这个程序一直在后台运行 检测到你u盘的时候就做一些其它工作, 你u盘的程序在打算关闭u盘的时候,给后台程序发送一条命令 让后台程序等待一段时间后关闭u盘
danhu 2014-11-26
  • 打赏
  • 举报
回复
引用 1 楼 lx624909677 的回复:
这个是别人的一个答案。用的是WIN32的一些接口,其实就是列举设备,找到后弹出
弹出U盘在U盘未使用的时候可以做到。现在的问题是弹出U盘这个程序本身在U盘里,导致运行程序的时候无法弹出U盘。现在要解决的问题是如何在U盘程序退出之后依旧执行弹出u盘的程序。 我的思路是使用系统的弹出界面,这样子的话按说U盘就不会被锁定。可现在使用系统的control.exe还是会出现U盘被使用无法删除。不清楚怎么样才能做到完全清理U盘和系统的连接。
Sandrer 2014-11-26
  • 打赏
  • 举报
回复
lx624909677 2014-11-25
  • 打赏
  • 举报
回复
#include   <tchar.h>   
  #include   <stdio.h>   
  #include   <windows.h>   
  #include   <devguid.h>   
    
  #define   DWORD_PTR   DWORD   
  #define   ULONG_PTR   DWORD   
    
    
  extern   "C"   {     
  #include   "hidsdi.h"     
  }   
  //   需加入hid.lib   
    
  #include   <setupapi.h>   
  //   需加入setupapi.lib   
    
  #include   <regstr.h>   
  #include   <winbase.h>   
    
  #include   <cfgmgr32.h>   
  //   需要加入cfgmgr32.lib   
    
  #include   <initguid.h>   
  //#include   <usbiodef.h>   
  DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE,   
      0xA5DCBF10L,   0x6530,   0x11D2,   0x90,   0x1F,   0x00,   0xC0,   0x4F,   0xB9,   0x51,   0xED);   
  #define   GUID_CLASS_USB_DEVICE                       GUID_DEVINTERFACE_USB_DEVICE   
    
  int   main(int   argc,   _TCHAR*   argv[])   
  {   
        HDEVINFO   hDevInfo;   
          
        SP_DEVINFO_DATA   DeviceInfoData;   
        DWORD   i;   
    
        //--------------------------------------------------------------------------   
        //   获取设备信息   
        hDevInfo   =   SetupDiGetClassDevs((LPGUID)&GUID_CLASS_USB_DEVICE,   
                0,   //   Enumerator   
                0,   
                DIGCF_PRESENT   |   DIGCF_DEVICEINTERFACE   );   
        if   (hDevInfo   ==   INVALID_HANDLE_VALUE)   {   
                //   查询信息失败   
                printf("ERROR   -   SetupDiGetClassDevs()");   
                return   1;   
        }   
        //--------------------------------------------------------------------------   
    
        //   枚举每个USB设备   
        DeviceInfoData.cbSize   =   sizeof(SP_DEVINFO_DATA);   
        for   (i=0;SetupDiEnumDeviceInfo(hDevInfo,   i,   &DeviceInfoData);i++)   
        {   
                  LPTSTR   buffer   =   NULL;   
                  PVOID   buffer2   =   NULL;   
                  DWORD   buffersize   =   0;   
                  ULONG   len;   
                  CONFIGRET       cr;   
                  PNP_VETO_TYPE   pnpvietotype;   
                  CHAR   vetoname[MAX_PATH];   
                  ULONG   ulStatus;   
                  ULONG   ulProblemNumber;   
    
                  cr   =   CM_Get_DevNode_Status(   &ulStatus,   
                                                                          &ulProblemNumber,   
                                                                          DeviceInfoData.DevInst,   
                                                                          0);   
                  if   (   CR_SUCCESS   ==   cr   )   {   
                          printf("OK   -   CM_Get_DevNode_Status()[%d]\n",   cr);   
                          printf("OK   -   CM_Get_DevNode_Status()   sts   [%x]\n",   ulStatus);   
                          printf("OK   -   CM_Get_DevNode_Status()   pro   [%x]\n",   ulProblemNumber);   
                  }   else   {   
                          printf("ERROR   -   CM_Get_DevNode_Status()[%d]\n",   cr);   
                          printf("ERROR   -   CM_Get_DevNode_Status()[%d]\n",   GetLastError());   
                  }   
                  //   DN_DISABLEABLE   or   DN_REMOVABLE   
                  if   ((DN_DISABLEABLE   &   ulStatus   )   !=   0   )   {   
                          printf("HAS   -   DN_DISABLEABLE()[%x]\n",   DN_DISABLEABLE   &   ulStatus);   
                  }   else   {   
                        continue;   
                  }   
                  if   ((DN_REMOVABLE   &   ulStatus   )   !=   0   )   {   
                          printf("HAS   -   DN_REMOVABLE()[%x]\n",   DN_REMOVABLE   &   ulStatus);   
                  }   else   {   
                        continue;   
                  }   
    
                  len   =   MAX_PATH;   
                  //   pnpvietotype   =   PNP_VetoDevice;     
                  cr   =   CM_Request_Device_Eject(   
                                                          DeviceInfoData.DevInst,   
                                                          &pnpvietotype,   
                                                          vetoname,   
                                                          len,   
                                                          0   
                                                          );   
                  if   (   CR_SUCCESS   ==   cr   )   {   
                          printf("OK   -   CM_Request_Device_Eject()[%d]\n",   cr);   
                  }   else   {   
                          printf("ERROR   -   CM_Request_Device_Eject()[%d]\n",   cr);   
                          printf("ERROR   -   CM_Request_Device_Eject()[%d]\n",   GetLastError());   
                  }   
    
        }   
                  
                  
        if   (   GetLastError()!=NO_ERROR   &&   
                  GetLastError()!=ERROR_NO_MORE_ITEMS   )   
        {   
                //   Insert   error   handling   here.   
                return   1;   
        }   
                  
        //     Cleanup   
        SetupDiDestroyDeviceInfoList(hDevInfo);   
    
        return   0;   
  }
这个是别人的一个答案。用的是WIN32的一些接口,其实就是列举设备,找到后弹出
真正的U盘加密+文档同步+计算机锁定=无敌U盘伴侣 这是一款完全免费的软件,程序体积小巧,不到100KB,可以在U盘或电脑上运行。界面也绝对够“魅惑”,她还是一款绿色软件,就可以完全解决掉你上面将面临的问题!! --------------------------------------------------------- 应用举例: A、随着U盘/存储卡容量呈几何级增长,越来越多的朋友把自已的资料和秘密保存在U盘当中。 但是U盘的不安全因素使我们一直在担心害怕数据的遗失,如何保证自已U盘中的文件安全已成为一个迫在眉捷的问题! 虽然现在市场上有一些U盘加密软件,但那只是简单的隐藏,文件数据的安全得不到保障;或者有专门的软件,但又只能针对某一个U盘品牌,局限性非常大。 B、有朋友向你借用U盘/SD卡,或不慎丢失,你急得睡不着? 你还将面临:1、企业机密泄露,自己饭碗难保;2、 苦心经营多年的客户资料被黑心同事全部盗走;3、 自己、朋友和家人的照片被发布上网,惨遭恶 搞,还引发“人肉搜索”…… C、现在许多朋友把家当成公司,公司忙不完的活要带到家里继续做,每天要把“我的文档”的几百上千个文件一次次的复制到U盘中,许多文件是U盘内已经有的了,如何解决这个问题,当然是把文件同步到U盘中啦,排除相同点,每天只要一点点^_^,很快很方便! 同时也是个人备份经常更新的文档、相片的好帮手。 D、在办公室上网正看着“X照门”呢^_^ ,正好内急(不好意思啦,并不是每个人都这么巧,但一次就够了) 怎么办? 关掉?等下还要接着看呢,而且也怕有人趁机动我的电脑,打开“我最近打开的文件”,完了,什么都出来了。。。。 关机?不用这么麻烦吧,再说电脑开开关关也不太好吧,怎么办呢? --------------------------------------------------------- 分区加密功能特点: 1、不针对U盘主控方案,所有U盘、SD卡、CF卡都适用 2、可全盘加密 3、格式化后加密区数据依然存在 4、如果U盘遗失,不担心机密资料泄出 5、加密后不影响U盘的传输速度 6、加密后,别人无法得知私密区的存在 7、可预防加密区感染电脑病毒 8、兼容U盘量产USB-CDROM 魅色精灵应用举例: 我们可以将自已的密码数据库、收藏夹、银行数字证书、私人相片、日记、商业文件、财务数据等存放在加密区 这样就多了一层保护,数据更安全。 --------------------------------------------------------- 常见问题和使用技巧: 1、魅色U盘精灵可以适用于所有的U盘和SD卡吗? 答:可以,魅色U盘精灵不限制使用U盘/SD卡方案和品牌,且永久免费。 小技巧:商家们可在出售的U盘中赠送本软件,以提高产品的附加价值。且本软件基本不占用空间 2、为什么我的同步列表内出现了乱码字符? 答:造成这种情况的原因一般是U盘内出现了坏块,解决办法是用相应的量产工具将U盘低格修复。 3、第一次分区后正常使用,再次插入U盘时无法进入加密区,提示密码错误? 答:魅色U盘精灵的默认密码为“meise”,也可以通过“改密码”功能修改为自已的密码。 还有一种情况是没有改过密码,解决方法请参考第二条 4、为什么我打开魅色U盘精灵就出现一个错误提示框:I/O错误,请检查是否选定的驱动器内没有磁盘 答:这种情况一般会出现在有内置读卡器且没有插入存储卡的笔记本上,只要在“请选择可移动磁盘”的下拉 列表中选择你要操作的移动设备即可。 5、在电脑上运行魅色U盘精灵和在U盘上运行有什么区别? 答:在功能上没有任何区别。只是在U盘上运行时启动速度会稍慢一些 6、如何更快的进入加密区? 答:1、鼠标点击“加密区”;2、直接输入密码;3、按回车键。是不是很快,一气呵成 --------------------------------------------------------- 版本更新: V1.74: 窗口最小化到系统托盘,方便其它软件的操作 V1.63: 优化了内存占用,修正了同步列表最后一项无法删除的bug V1.61: 增加合并分区时需输入密码,使加密区安全性进一步提高 V1.57: 支持在U盘上运行魅色精灵,方便在没有本程序的电脑上使用,真正的私人随身保险箱。 V1.11: 1、关闭程序时自动退出加密区,U盘安全使用更放心 2、鼠标移动到同步计划栏时自动显示源文件夹全目录名
正式版更新日期:2020.06.20 接用户反馈,2020.06.16日发布的2.1正式版中包含的ghost 12.0.0.8065的分卷策略体验不佳,因此发布一个降ghost版本的新2.1正式版。 20号的正式版除了降级ghost以外,搭车升级了部分I2C驱动,如果您下载的是16号发布的2.1,无特殊需求可不替换此版本。 新的2.1版本沿用原WIN10PE内核(10.0.10586),此内核久经考验,非常稳定,暂不替换。 本次更新主要是驱动更新、软件更新以及修复一些已知的重要BUG。 后续微PE工具箱将采用3.X版本号制作新内核,此10586内核也会同步更新。 2.1版本内核更新内容: 1.为工具箱用户提供教程,因此在PE桌面上增加了一个微PE小助手,扫码可看教程(教程部署中)。 2.更新INTEL RST驱动,解决默认开启RST(RAID ON)的一些新机型,无法直接看到硬盘的问题。 3.补充一些GPIO/I2C 驱动,以支持更多触控板和键鼠。 4.补充Bitlocker解锁功能所需的相关组件,现在支持在PE内解锁Bitlocker盘了。 5.补充REFS、UDF相关功能所需的DLL文件。 6.修复WIN10PE无法直接安装原版WIN7的问题。 7.修复windows安装器不自动重启的问题。 8.更新调整盘符错乱的工具为最新版 9.变更资源管理器图标为详细信息。 10.删除文件时的弹出确认窗口。 1. 更新分区助手到8.3版本。 2. 更新Diskgenius到5.2.1.941版本。 3. 更新Dism++到10.1.1001.10版本。 4. 更新Ghost版本到12.0.0.6277版本。 5. 更新CGI工具的Wimlib版本 到1.13.2版本。 6. 更新Windows安装器到4.2版本。 7. 更新7ZIP到20.00 alpha版本。 8. 更新密码工具到0.7版本。 9. 更新CPUZ到1.92版本。 10. 更换了一个引导修复工具。 11. 更新bootice工具到1.3.4版本。 12. 更新HDTune到5.7.5版本。 13. 更新Everything到V1.4.1.969版本 14. 更新看图Imagine到1.1.1版本。 安装程序部分的更新: 1.U盘安装时,限制安装包不可放在该U盘内,以防止在U盘内运行U盘制作工具导致U盘故障。 2.U盘安装时,为制作方法7标明可以归还空间的提示。 3.解决安装程序有时候被最小化后,无法恢复的BUG。 4.解决安装程序有时候会弹出一个黑色的CMD窗口的BUG。 5.解决Windows Defender的对一些文件的误报,提高安装成功率。

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧