求助
功能说明:该程序是一个专用于Windows平台的移动存储设备(如U盘、移动硬盘、SD卡等)安全弹出(Safe Eject)工具。其核心功能是模拟Windows系统“安全删除硬件”操作,通过底层Windows API调用,按标准流程对指定驱动器执行完整的卸载与物理弹出流程:1)打开卷句柄(OpenVolume),根据驱动器类型(可移动设备或光驱)设置适当访问权限;2)锁定卷(LockVolume),防止文件系统被其他进程访问,含超时重试机制与事件循环等待;3)卸载卷(DismountVolume),使文件系统脱离活动状态;4)解除介质移除保护(PreventRemovalofVolume,实际传入False参数以允许移除);5)执行物理弹出(AutoEjectVolume),触发硬件弹出动作;6)关闭句柄(CloseVolume)。整个流程严格遵循Windows设备I/O控制规范,使用CTL_CODE构造标准IOCTL码(如LOCK_VOLUME、DISMOUNT_VOLUME、EJECT_MEDIA等),适配FILE_DEVICE_FILE_SYSTEM和FILE_DEVICE_MASS_STORAGE设备类型。程序具备错误处理与用户提示机制(如失败时弹出相应错误信息框),并在成功后提示“Media may be Safely Removed from Drive X:”,确保用户在拔出前已获系统级安全确认。该工具不依赖ShellExecute或资源管理器接口,而是直接操作设备驱动层,具备高兼容性与可靠性,适用于需自动化或精细化控制外设弹出场景,典型用途包括嵌入式工控、自助终端、批量运维脚本等环境下的安全介质管理。
======窗口程序集1
| |
| |------ __启动窗口_创建完毕
| |
| |------ CTL_CODE
| |
| |------ OpenVolume
| |
| |------ CloseVolume
| |
| |------ LockVolume
| |
| |------ DismountVolume
| |
| |------ PreventRemovalofVolume
| |
| |------ AutoEjectVolume
| |
| |------ Eject
| |
| |------ _时钟1_周期事件
| |
| |------ _按钮1_被单击
| |
| |------ USBDISKINDEX
| |
| |
======调用的Dll
| |
| |---[dll]------ GetDriveType
| |
| |---[dll]------ CloseHandle
| |
| |---[dll]------ CreateFile
| |
| |---[dll]------ DeviceIoControl
======窗口程序集1
| |
| |------ _按钮1_被单击
| |
| |------ 取硬件信息_序列号
| |
| |------ 打开USB类设备信息
| |
| |------ 取下一个U盘
| |
| |------ 关闭USB类设备信息
| |
| |------ 根据设备信息判断是否U盘
| |
| |------ __启动窗口_创建完毕
| |
| |
======调用的Dll
| |
| |---[dll]------ DLL_SetupDiGetDeviceInstanceId
| |
| |---[dll]------ DLL_SetupDiGetClassDevs
| |
| |---[dll]------ DLL_SetupDiEnumDeviceInfo
| |
| |---[dll]------ DLL_SetupDiDestroyDeviceInfoList
| |
| |---[dll]------ DLL_SetupDiGetDeviceRegistryProperty
| |
| |---[dll]------ DLL_SetupDiGetDeviceRegistryProperty_text
======窗口程序集1
| |
| |------ _按钮1_被单击
| |
| |------ 取硬件信息_序列号
| |
| |------ 打开USB类设备信息
| |
| |------ 取下一个U盘
| |
| |------ 关闭USB类设备信息
| |
| |------ 根据设备信息判断是否U盘
| |
| |------ __启动窗口_创建完毕
| |
| |
======调用的Dll
| |
| |---[dll]------ DLL_SetupDiGetDeviceInstanceId
| |
| |---[dll]------ DLL_SetupDiGetClassDevs
| |
| |---[dll]------ DLL_SetupDiEnumDeviceInfo
| |
| |---[dll]------ DLL_SetupDiDestroyDeviceInfoList
| |
| |---[dll]------ DLL_SetupDiGetDeviceRegistryProperty
| |
| |---[dll]------ DLL_SetupDiGetDeviceRegistryProperty_text
======窗口程序集1
| |
| |------ _钮_取U盘数量_被单击
| |
| |------ _钮_取U盘盘符列表_被单击
| |
| |------ _钮_取U盘盘符数量_被单击
| |
| |------ 从掩码取盘符
| |
| |------ U盘插入事件处理
| |
| |------ U盘弹出事件处理
| |
| |------ _钮_注册U盘插入删除事件_被单击
| |
| |------ _钮_取消注册U盘插入删除事件_被单击
| |
| |------ _钮_弹出U盘方法1_被单击
| |
| |------ _钮_弹出U盘方法2_被单击
| |
| |------ _钮_弹出U盘方法3_被单击
| |
| |------ _钮_弹出U盘方法4_被单击
| |
| |------ 线程等待
| |
| |------ __启动窗口_创建完毕
| |
| |------ __启动窗口_将被销毁
| |
| |------ _钮_枚举U盘_被单击
| |
| |------ _钮_详细信息_被单击
| |
| |------ 格式化硬件信息
| |
| |------ 格式化字节集
| |
| |
======程序集1
| |
| |------ 取逻辑驱动器属性
| |
| |------ 填充设备描述符
| |
| |------ 根据设备信息判断是否U盘
| |
| |------ 新窗口过程
| |
| |------ 移除U盘
| |
| |------ 移除U盘独立
| |
| |------ 用换行符连接多段文本
| |
| |------ 打开USB类设备信息
| |
| |------ 取下一个U盘
| |
| |------ 关闭USB类设备信息
| |
| |------ 填充硬件信息
| |
| |------ 是U盘盘符
| |
| |------ 取U盘盘符列表
| |
| |------ 取U盘盘符数量
| |
| |------ 取U盘数量
| |
| |------ 安全移除U盘
| |
| |------ 安全移除U盘独立
| |
| |------ 强制移除U盘
| |
| |------ 禁用USB存储设备服务
| |
| |------ 置U盘只读
| |
| |------ 注册USB设备改变事件
| |
| |------ 取消注册USB设备改变事件
| |
| |------ 取硬件信息_i
| |
| |------ 取硬件信息_t
| |
| |------ 关闭句柄
| |
| |------ 取线程退出代码
| |
| |------ 等待事件对象
| |
| |------ 取兼容文本
| |
| |------ 取RemovalPolicy文本
| |
| |------ 取设备安装状态文本
| |
| |------ 取设备类型文本
| |
| |------ 取LegacyBusType文本
| |
| |
======调用的Dll
| |
| |---[dll]------ DLL_GetLastError
| |
| |---[dll]------ DLL_LoadLibrary
| |
| |---[dll]------ DLL_FreeLibrary
| |
| |---[dll]------ DLL_DeviceIoControl
| |
| |---[dll]------ DLL_CreateFile
| |
| |---[dll]------ DLL_CloseHandle
| |
| |---[dll]------ DLL_GetDriveType
| |
| |---[dll]------ DLL_SetupDiGetClassDevs
| |
| |---[dll]------ DLL_SetupDiEnumDeviceInfo
| |
| |---[dll]------ DLL_SetupDiGetDeviceRegistryProperty
| |
| |---[dll]------ DLL_SetupDiGetDeviceRegistryProperty_text
| |
| |---[dll]------ DLL_SetupDiDestroyDeviceInfoList
| |
| |---[dll]------ DLL_CM_Request_Device_Eject
| |
| |---[dll]------ DLL_SetupDiSetClassInstallParams
| |
| |---[dll]------ DLL_SetupDiCallClassInstaller
| |
| |---[dll]------ DLL_SetupDiEnumDeviceInterfaces
| |
| |---[dll]------ DLL_SetupDiGetDeviceInterfaceDetail
| |
| |---[dll]------ DLL_GetVolumeNameForVolumeMountPoint
| |
| |---[dll]------ DLL_CallWindowProc
| |
| |---[dll]------ DLL_SetWindowLong
| |
| |---[dll]------ DLL_WaitForSingleObject
| |
| |---[dll]------ DLL_CreateThread
| |
| |---[dll]------ DLL_GetExitCodeThread
======程序集1
| |
| |------ _启动子程序
| |
| |------ _临时子程序
| |
| |
======功能程序集
| |
| |------ 取逻辑驱动器属性
| |
| |------ 填充设备描述符
| |
| |------ 根据设备信息判断是否U盘
| |
| |------ 新窗口过程
| |
| |------ 移除U盘
| |
| |------ 移除U盘独立
| |
| |------ 用换行符连接多段文本
| |
| |
======_接口程序集
| |
| |------ 打开USB类设备信息
| |
| |------ 取下一个U盘
| |
| |------ 关闭USB类设备信息
| |
| |------ 填充硬件信息
| |
| |------ 是U盘盘符
| |
| |------ 取U盘盘符列表
| |
| |------ 取U盘盘符数量
| |
| |------ 取U盘数量
| |
| |------ 安全移除U盘
| |
| |------ 安全移除U盘独立
| |
| |------ 强制移除U盘
| |
| |------ 禁用USB存储设备服务
| |
| |------ 置U盘只读
| |
| |------ 注册USB设备改变事件
| |
| |------ 取消注册USB设备改变事件
| |
| |------ 取硬件信息_i
| |
| |------ 取硬件信息_t
| |
| |------ 关闭句柄
| |
| |------ 取线程退出代码
| |
| |------ 等待事件对象
| |
| |------ 取兼容文本
| |
| |------ 取RemovalPolicy文本
| |
| |------ 取设备安装状态文本
| |
| |------ 取设备类型文本
| |
| |------ 取LegacyBusType文本
| |
| |
======调用的Dll
| |
| |---[dll]------ DLL_GetLastError
| |
| |---[dll]------ DLL_LoadLibrary
| |
| |---[dll]------ DLL_FreeLibrary
| |
| |---[dll]------ DLL_DeviceIoControl
| |
| |---[dll]------ DLL_CreateFile
| |
| |---[dll]------ DLL_CloseHandle
| |
| |---[dll]------ DLL_GetDriveType
| |
| |---[dll]------ DLL_SetupDiGetClassDevs
| |
| |---[dll]------ DLL_SetupDiEnumDeviceInfo
| |
| |---[dll]------ DLL_SetupDiGetDeviceRegistryProperty
| |
| |---[dll]------ DLL_SetupDiGetDeviceRegistryProperty_text
| |
| |---[dll]------ DLL_SetupDiDestroyDeviceInfoList
| |
| |---[dll]------ DLL_CM_Request_Device_Eject
| |
| |---[dll]------ DLL_SetupDiSetClassInstallParams
| |
| |---[dll]------ DLL_SetupDiCallClassInstaller
| |
| |---[dll]------ DLL_SetupDiEnumDeviceInterfaces
| |
| |---[dll]------ DLL_SetupDiGetDeviceInterfaceDetail
| |
| |---[dll]------ DLL_GetVolumeNameForVolumeMountPoint
| |
| |---[dll]------ DLL_CallWindowProc
| |
| |---[dll]------ DLL_SetWindowLong
| |
| |---[dll]------ DLL_WaitForSingleObject
| |
| |---[dll]------ DLL_CreateThread
| |
| |---[dll]------ DLL_GetExitCodeThread
======程序集1
| |
| |------ _启动子程序
| |
| |------ _临时子程序
| |
| |
======功能程序集
| |
| |------ 取逻辑驱动器属性
| |
| |------ 填充设备描述符
| |
| |------ 根据设备信息判断是否U盘
| |
| |------ 新窗口过程
| |
| |------ 移除U盘
| |
| |------ 移除U盘独立
| |
| |------ 用换行符连接多段文本
| |
| |
======_接口程序集
| |
| |------ 打开USB类设备信息
| |
| |------ 取下一个U盘
| |
| |------ 关闭USB类设备信息
| |
| |------ 填充硬件信息
| |
| |------ 是U盘盘符
| |
| |------ 取U盘盘符列表
| |
| |------ 取U盘盘符数量
| |
| |------ 取U盘数量
| |
| |------ 安全移除U盘
| |
| |------ 安全移除U盘独立
| |
| |------ 强制移除U盘
| |
| |------ 禁用USB存储设备服务
| |
| |------ 置U盘只读
| |
| |------ 注册USB设备改变事件
| |
| |------ 取消注册USB设备改变事件
| |
| |------ 取硬件信息_i
| |
| |------ 取硬件信息_t
| |
| |------ 关闭句柄
| |
| |------ 取线程退出代码
| |
| |------ 等待事件对象
| |
| |------ 取兼容文本
| |
| |------ 取RemovalPolicy文本
| |
| |------ 取设备安装状态文本
| |
| |------ 取设备类型文本
| |
| |------ 取LegacyBusType文本
| |
| |
======调用的Dll
| |
| |---[dll]------ DLL_GetLastError
| |
| |---[dll]------ DLL_LoadLibrary
| |
| |---[dll]------ DLL_FreeLibrary
| |
| |---[dll]------ DLL_DeviceIoControl
| |
| |---[dll]------ DLL_CreateFile
| |
| |---[dll]------ DLL_CloseHandle
| |
| |---[dll]------ DLL_GetDriveType
| |
| |---[dll]------ DLL_SetupDiGetClassDevs
| |
| |---[dll]------ DLL_SetupDiEnumDeviceInfo
| |
| |---[dll]------ DLL_SetupDiGetDeviceRegistryProperty
| |
| |---[dll]------ DLL_SetupDiGetDeviceRegistryProperty_text
| |
| |---[dll]------ DLL_SetupDiDestroyDeviceInfoList
| |
| |---[dll]------ DLL_CM_Request_Device_Eject
| |
| |---[dll]------ DLL_SetupDiSetClassInstallParams
| |
| |---[dll]------ DLL_SetupDiCallClassInstaller
| |
| |---[dll]------ DLL_SetupDiEnumDeviceInterfaces
| |
| |---[dll]------ DLL_SetupDiGetDeviceInterfaceDetail
| |
| |---[dll]------ DLL_GetVolumeNameForVolumeMountPoint
| |
| |---[dll]------ DLL_CallWindowProc
| |
| |---[dll]------ DLL_SetWindowLong
| |
| |---[dll]------ DLL_WaitForSingleObject
| |
| |---[dll]------ DLL_CreateThread
| |
| |---[dll]------ DLL_GetExitCodeThread
注:本站源码主要来源于网络收集。如有侵犯您的利益,请联系我们,我们将及时删除!
部分源码可能含有危险代码,(如关机、格式化磁盘等),请看清代码在运行。
由此产生的一切后果本站均不负责。源码仅用于学习使用,如需运用到商业场景请咨询原作者。
使用本站源码开发的产品均与本站无任何关系,请大家遵守国家相关法律。