touch_xu 发表于 2010-10-7 18:18:59

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

本帖最后由 touch_xu 于 2010-10-10 09:25 编辑

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

{:face (427):}

虫子樱桃 发表于 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=1 Then
   obj(1)
   TrayTip("虫子樱桃提示您","您的移动设备"&$up[$i]&"可以安全卸载了!",1000)
Else
    $i=1
   For $i= 1 To $up
    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,"open")
    TrayTip("虫子樱桃提示您","您的光驱已经弹出,将在"&$i&"秒后自动关闭!",1000)
    Sleep(1000)
   Next
    CDTray($cdnum,"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

touch_xu 发表于 2010-10-8 08:57:15

哦,是这样的,我是想让这个AutoCopy.exe运行完成时,也就是退出时,同时发出弹出自身所在U盘的命令,然后退出,我感觉这个功能类似于程序的自身删除。如果果纯AU3能实现就好了!

lxz 发表于 2010-10-8 17:30:13

代码收藏了....

menfan1 发表于 2010-10-9 11:45:52

呵呵,学习一下。。。

006001 发表于 2010-10-9 13:18:42

学习了二楼的思路.

liufenglg 发表于 2010-10-9 17:50:01

打包收藏了。

pusofalse 发表于 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
                $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

lxz 发表于 2010-10-10 04:55:25

精彩的代码...

touch_xu 发表于 2010-10-10 09:24:37

{:face (411):}8楼正解,感谢pusofalse

liufenglg 发表于 2010-10-10 09:29:32

哦,是这样的,我是想让这个AutoCopy.exe运行完成时,也就是退出时,同时发出弹出自身所在U盘的命令,然后退 ...
touch_xu 发表于 2010-10-8 08:57 http://www.autoitx.com/images/common/back.gif


    autocopy.exe运行完可激活该虫子程序啊

liufenglg 发表于 2010-10-10 09:32:42

本帖最后由 liufenglg 于 2010-10-10 09:35 编辑

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

我一一删除了

touch_xu 发表于 2010-10-10 09:34:33

本帖最后由 touch_xu 于 2010-10-10 09:36 编辑

autocopy.exe运行完可激活该虫子程序啊
liufenglg 发表于 2010-10-10 09:29 http://www.autoitx.com/images/common/back.gif


    不明白你说的是什么,这个是我自己写的复制文件到U盘的程序,不是Autorun,你说的是病毒吧,不知道什么是虫子程序啊

12250279 发表于 2010-10-10 11:23:27

感谢好心人的代码,收藏下.

chenronting 发表于 2010-10-13 22:06:28

好东西, 我留下位置
页: [1] 2
查看完整版本: U盘上运行程序能否在退出时安全删除USB磁盘(已解决)