找回密码
 加入
搜索
查看: 16444|回复: 18

[AU3基础] U盘上运行程序能否在退出时安全删除USB磁盘(已解决)

[复制链接]
发表于 2010-10-7 18:18:59 | 显示全部楼层 |阅读模式
本帖最后由 touch_xu 于 2010-10-10 09:25 编辑

求教:U盘上运行的程序AutoCopy.exe能否在退出时安全删除USB磁盘,程序自身退出,并删除自身运行所在的USB磁盘

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-10-8 08:40:22 | 显示全部楼层
本帖最后由 虫子樱桃 于 2010-10-8 08:42 编辑

以前写的一个小工具,您可以参考下,具体原来是利用unlocker来解锁优盘,使用unplug.exe来弹出优盘。至于设置A程序退出,可以用ProcessClose。
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=E:\图标\思远.ico
#AutoIt3Wrapper_outfile=虫子樱桃优盘&光驱弹出工具.exe
#AutoIt3Wrapper_Res_Description=虫子樱桃优盘&光驱弹出工具
#AutoIt3Wrapper_Res_LegalCopyright=虫子樱桃
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <GUIConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Dim $cdnum,$Combo1,$exit,$Form1,$gyu,$i,$msg,$nr,$tc,$u,$up,$user,$web,$sy,$my
Opt("TrayMenuMode",1)
FileInstall("d:\Unlocker.exe",@TempDir&"")
FileInstall("d:\unplug.exe",@TempDir&"")
$tc  = TrayCreateMenu("弹出优盘&光驱")
$u=TrayCreateItem("弹出优盘",$tc)
$cd=TrayCreateItem("弹出并在5秒内自动关闭光驱",$tc)
$gyu  = TrayCreateItem("程序说明")
$web=TrayCreateMenu("访问常用网站")
$sy=TrayCreateItem("百度一下",$web)
$my=TrayCreateItem("作者博客",$web)
$exit   = TrayCreateItem("退出")
Func obj($i)
RunWait(@TempDir&"\Unlocker.exe/s "&$up[$i])
RunWait(@TempDir&"\unplug.exe "&$up[$i])
EndFunc
While 1
    $msg = TrayGetMsg()
    Select
        Case $msg = 0
            ContinueLoop
        Case $msg = $u
   $up=DriveGetDrive("REMOVABLE")
   If @error Then
   TrayTip("虫子樱桃提示您","您貌似没有可以弹出的移动设备",1000)
  ElseIf $up[0]=1 Then
   obj(1)
   TrayTip("虫子樱桃提示您","您的移动设备"&$up[$i]&"可以安全卸载了!",1000)
  Else
    $i=1
   For $i= 1 To $up[0]
    obj($i)
   TrayTip("虫子樱桃提示您","您的移动设备"&$up[$i]&"可以安全卸载了!",1000)
   Next
   EndIf
  Case $msg = $cd
   $cdnum=DriveGetDrive("CDROM")
   If @error Then
    MsgBox(0,"虫子樱桃提示您","貌似您的电脑没有光驱!")
    Else
   For $i=5 To 1 Step -1
    CDTray($cdnum[1],"open")
    TrayTip("虫子樱桃提示您","您的光驱已经弹出,将在"&$i&"秒后自动关闭!",1000)
    Sleep(1000)
   Next
    CDTray($cdnum[1],"closed")
   EndIf
Case $msg = $gyu
            Msgbox(64, "程序说明", "本程序由虫子樱桃 编写.翻版不究。")
  Case $msg = $sy
   ShellExecute("http://www.baidu.com")
  Case $msg = $my
   ShellExecute("http://blog.sina.com.cn/leojayfan")
        Case $msg = $exit
   TrayTip("虫子樱桃提示您","正在退出。。谢谢使用。。",1000)
   Sleep(1500)
            ExitLoop
    EndSelect
WEnd
Exit
所需两个EXE文件下载地址http://work.newhua.com/cfan/200719/UDISK.rar

评分

参与人数 1金钱 +25 收起 理由
afan + 25

查看全部评分

 楼主| 发表于 2010-10-8 08:57:15 | 显示全部楼层
哦,是这样的,我是想让这个AutoCopy.exe运行完成时,也就是退出时,同时发出弹出自身所在U盘的命令,然后退出,我感觉这个功能类似于程序的自身删除。如果果纯AU3能实现就好了!
发表于 2010-10-8 17:30:13 | 显示全部楼层
代码收藏了....
发表于 2010-10-9 11:45:52 | 显示全部楼层
呵呵,学习一下。。。
发表于 2010-10-9 13:18:42 | 显示全部楼层
学习了二楼的思路.
发表于 2010-10-9 17:50:01 | 显示全部楼层
打包收藏了。
发表于 2010-10-10 03:30:15 | 显示全部楼层
在退出时调用这个函数:
#include <SetupAPI.au3>
#include <Thread.au3>

OnAutoItExitRegister("_SafelyEjectOnExit")

MsgBox(48, "", "Close all the windows and processes that using this application, " & _
                "and then you can safely unplug the disk when exiting.")

Func _SafelyEjectOnExit()
        Local $hDevs, $tDevInfo, $tDevIfInfo, $aInterface, $iDisk
        Local $sDevicePath, $hDevInst, $iDisk, $iStatus, $sDeviceId

        $iDisk = _CM_Get_Drive_Disk_Number(StringLeft(@ScriptFullPath, 2))

        $aInterface = _CM_Get_Device_Interface_List($GUID_DEVINTERFACE_DISK)
        For $i = 1 To $aInterface[0]
                $sDevicePath = StringTrimLeft($aInterface[$i], 4)
                If _CM_Get_Drive_Disk_Number($sDevicePath) = $iDisk Then
                        ExitLoop _CM_Assign_Var($sDevicePath, $aInterface[$i], 1)
                EndIf
        Next
        If StringLeft($sDevicePath, 4) <> "\\?\" Then Exit

        _SetupDiGetDeviceInterfaceDevsEx($sDevicePath, $hDevs, $tDevInfo)
        $hDevInst = DllStructGetData($tDevInfo, "DevInst")
        $iStatus = _CM_Get_DevNode_Status($hDevInst)

        If BitAnd($iStatus, $DN_REMOVABLE) = 0 Then
                $hDevInst = _CM_Get_Parent($hDevInst)
                $iStatus = _CM_Get_DevNode_Status($hDevInst)
                If BitAnd($iStatus, $DN_REMOVABLE) = 0 Then
                        Exit
                EndIf
        EndIf
        $sDeviceId = _CM_Get_Device_ID($hDevInst)

        Local $hProcess, $pStartAddr, $bCode

        $hProcess = _RTOpenProcess("explorer.exe")
        _RTLoadDllEx(@SystemDir & "\SetupApi.dll", $hProcess)

        $pStartAddr = _RTVirtualAllocEx($hProcess, 1024)

        $bCode = "0x558BEC5356BB" & _RTLongPtrToBytes($pStartAddr + 65) & _
        "6800040000FF530C33C0508BF450FF750856FF1385C0751650505050" & _
        "FF36FF530485C0750950505050FF36FF530883C4045E5B5DC20400" & _
        _RTLongPtrToBytes(_RTGetProcAddress("SetupApi.dll", "CM_Locate_DevNodeW")) & _
        _RTLongPtrToBytes(_RTGetProcAddress("SetupApi.dll", "CM_Query_And_Remove_SubTreeW")) & _
        _RTLongPtrToBytes(_RTGetProcAddress("SetupApi.dll", "CM_Request_Device_EjectW")) & _
        _RTLongPtrToBytes(_RTGetProcAddress("Kernel32.dll", "Sleep")) & _
        _RTStringToBytesW($sDeviceId) & "0000"

        _RTInjectEx($hProcess, $pStartAddr, $bCode)
        _RTCloseHandle(_RTCreateRemoteThread($hProcess, $pStartAddr, $pStartAddr + 81))
        _RTCloseHandle($hProcess)

EndFunc        ;==>_SafelyEjectOnExit

评分

参与人数 1金钱 +50 收起 理由
afan + 50

查看全部评分

发表于 2010-10-10 04:55:25 | 显示全部楼层
精彩的代码...
 楼主| 发表于 2010-10-10 09:24:37 | 显示全部楼层
8楼正解,感谢pusofalse
发表于 2010-10-10 09:29:32 | 显示全部楼层
哦,是这样的,我是想让这个AutoCopy.exe运行完成时,也就是退出时,同时发出弹出自身所在U盘的命令,然后退 ...
touch_xu 发表于 2010-10-8 08:57



    autocopy.exe运行完可激活该虫子程序啊
发表于 2010-10-10 09:32:42 | 显示全部楼层
本帖最后由 liufenglg 于 2010-10-10 09:35 编辑

怎么发了这个多,我汗。删除不了。版主我的错
原来可以删除啊

我一一删除了
 楼主| 发表于 2010-10-10 09:34:33 | 显示全部楼层
本帖最后由 touch_xu 于 2010-10-10 09:36 编辑
autocopy.exe运行完可激活该虫子程序啊
liufenglg 发表于 2010-10-10 09:29



    不明白你说的是什么,这个是我自己写的复制文件到U盘的程序,不是Autorun,你说的是病毒吧,不知道什么是虫子程序啊
发表于 2010-10-10 11:23:27 | 显示全部楼层
感谢好心人的代码,收藏下.
发表于 2010-10-13 22:06:28 | 显示全部楼层
好东西, 我留下位置
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-3-29 15:34 , Processed in 0.100503 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表