bool CUSBControl::RemoveUSB(CString csDisk)
HANDLE hDevice; // handle to the drive to be examined
BOOL bResult; // results flag
DWORD junk; // discard results
DWORD dwError;
CString csVolume;
int nPos = csDisk.Find('\\');//csDisk like "H:\"
if ( -1 != nPos )
csDisk = csDisk.Left(nPos);
csVolume.Format(L"\\\\.\\%s", csDisk);
// Open the volume
hDevice = CreateFile(csVolume, // drive to open
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL); // don't copy any file's attributes
if (hDevice == INVALID_HANDLE_VALUE) // can't open the drive
dwError = GetLastError();
return FALSE;
//Dismount the volume
bResult = DeviceIoControl(
hDevice, // handle to volume
IOCTL_STORAGE_EJECT_MEDIA, //eject USB
NULL, // lpInBuffer
0, // nInBufferSize
NULL, // lpOutBuffer
0, // nOutBufferSize
&junk, // discard count of bytes returned
(LPOVERLAPPED) NULL); // synchronous I/O
if (!bResult) // IOCTL failed
dwError = GetLastError();
// Close the volume handle
bResult = CloseHandle(hDevice);
if (!bResult)
dwError = GetLastError();
return FALSE;
csDisk怎么来的呢?
BOOL CUSBControl::OnDeviceChange( UINT nEventType, DWORD dwData)
DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData;
PDEV_BROADCAST_VOLUME pDevVolume = NULL;
switch (nEventType)
case DBT_DEVICEARRIVAL:
pDevVolume = (PDEV_BROADCAST_VOLUME)dbd;
switch(pDevVolume->dbcv_flags)
case 0:
if(DBT_DEVICEARRIVAL == nEventType)
CString strDisk;
strDisk.Format(L"%c:\\",FirstDriveFromMask(pDevVolume->dbcv_unitmask));
RemoveUSB(strDisk);
break;
break;
return TRUE;
char CUSBControl::FirstDriveFromMask( ULONG unitmask )
char i;
for (i = 0; i < 26; ++i)
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
return( i + 'A' );
调研USB弹出,记录结果:bool CUSBControl::RemoveUSB(CString csDisk){ HANDLE hDevice; // handle to the drive to be examined BOOL bResult; // results flag DWORD junk; // discard results DWORD dwError;
1.无需安装SDK, DDK/WDK
2.参考了网上的介绍和程序,都不完整
3.安装了SDK,DDK, WDK.始终有一个函数CM_Request_Device_EjectW无法链接
4.最后抛弃SDK.DDK.WDK,用网上的一个有关USB的inc和lib包,搞定!
摘自http://bbs.pcbeta.com/viewthread-1067733-1-1.html
windows弹出可移动媒体的时候,首先通过DeviceIoControl发送FSCTL_LOCK_VOLUME IOCTL来锁定卷,然后发送FSCTL_DISMOUNT_VOLUME
IOCTL来卸载卷,这两步之后,可确保卷不被其他程序使用,这时拔出可移动磁盘可以确保没有损害,虽然并没有
上大学的时候有老师不给上课的PPT,就总想有个程序能偷偷复制老师的U盘。一直没有去实现,然后用C++做了个U盘“备份”器。现在将做好的软件的源代码和可执行文件(exe)分享给大家,交流学习
软件用法:直接双击运行(没有任何界面效果,软件已在后台运行,可在任务管理器中看到,高隐蔽性),程序会在C盘下创建一个名为UBack的文件夹(如果该文件夹已存在,则不会再次创建),然后即可静静等待U盘插入,插入后程序会自动将U盘中的所有内容悄悄拷贝到C盘UBack文件夹里面,拷贝完成后自动退出程序。整个过程只可能在任务管理器中查看,改个文件名更不易被人发现,隐蔽性极高
const char* temp = "\\\\.\\";
char device_path1[10] = { 0 };
memcpy(device_path1, temp, strlen(temp));
QByteArray dp = device_path.toLocal8Bit();
通过C++我们读取已经mount到设备上的数据节点,读取这个节点,将节点作为参数传递给shell脚本,最后通过shell脚本根据参数来选择格式化哪一个盘。
具体实现过程:
1.初始化系统盘节点信息,将所有信息保存在结构体中
/etc/mtab 文件里面保存的是所有已经挂载上的盘符信息,通过文件方式逐行读取并保存到结构体数组中。
fd = fopen(PARTITION_PATH,
我们可以通过以下步骤来获取U盘中的文件。首先,将U盘插入电脑。接着,在电脑桌面的“我的电脑”或“计算机”中找到U盘图标并双击打开。此时,我们可以看到U盘中的所有文件夹和文件。如果想要打开某个文件夹或文件,只需要单击它即可。
有时候,U盘中的文件可能很多,我们需要进行搜索。我们可以在U盘根目录中输入关键词并按回车键进行搜索。此时,系统会返回与该关键词相关的所有文件和文件夹。
如果我们想要将U盘中的某些文件复制到电脑上,只需选择需要复制的文件并按下“Ctrl+C”组合键。接着,在电脑上打开一个目录,右键单击空白处,选择“粘贴”即可将文件复制到该目录中。
在获取U盘中的文件时,注意不要意外删除或改名文件。如果不小心删除文件,可以尝试使用“回收站”恢复。如果需要修改文件名,可以右键单击文件并选择“重命名”进行修改。
总的来说,获取U盘中的文件非常简单,只需要插入U盘并打开对应文件夹即可。如果需要进行搜索或复制粘贴等操作,也都很容易操作。