U盘上运行程序能否在退出时安全删除USB磁盘(已解决)
本帖最后由 touch_xu 于 2010-10-10 09:25 编辑求教:U盘上运行的程序AutoCopy.exe能否在退出时安全删除USB磁盘,程序自身退出,并删除自身运行所在的USB磁盘
{:face (427):} 本帖最后由 虫子樱桃 于 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 哦,是这样的,我是想让这个AutoCopy.exe运行完成时,也就是退出时,同时发出弹出自身所在U盘的命令,然后退出,我感觉这个功能类似于程序的自身删除。如果果纯AU3能实现就好了! 代码收藏了.... 呵呵,学习一下。。。 学习了二楼的思路. 打包收藏了。 在退出时调用这个函数:
#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 精彩的代码... {:face (411):}8楼正解,感谢pusofalse 哦,是这样的,我是想让这个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:35 编辑
怎么发了这个多,我汗。删除不了。版主我的错
原来可以删除啊
我一一删除了 本帖最后由 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,你说的是病毒吧,不知道什么是虫子程序啊 感谢好心人的代码,收藏下. 好东西, 我留下位置
页:
[1]
2