最近要写个在线专杀的东东,虽然是专杀(本来只要清除几个特定的文件和杀几个特定的进程,然后把用户的注册表恢复正常,很多病毒木马最喜欢干的一件事情就是写 映像劫持 然后机器一重启,安全相关的软件全部玩完了,不过这也没什么技术含量,利用了操作系统的“漏洞”而已),但是因为是 磁碟机,这个病毒(木马)很恶心,是感染型的,你磁盘上的exe文件可以全部给你感染成一个个的“小磁碟机”,很恐怖,呵呵,所以没办法,要清除它,必须在杀掉磁碟机的进程之后,对全盘进行扫描,对每一个被感染的exe文件(好像com文件不能感染)进行修复,怎么进行磁盘遍历呢?请看下面的代码:(其实杀毒引擎工作的过程就是一个遍历磁盘上文件的过程,然后再对每个文件进行处理)

  1. // -------------------------------------------------------------------------
  2. // 函数       : ScanDirectory
  3. // 功能       : 遍历一个目录,然后做一些事情(想做什么做什么呗)
  4. // 返回值  : DWORD
  5. // 参数       : const WCHAR *pwszPath
  6. // 附注       : 可以为磁盘根目录
  7. // -------------------------------------------------------------------------
  8. DWORD ScanDirectory(const WCHAR *pwszPath)
  9. {
  10. USES_CONVERSION;
  11. static int nCountFile = 0;
  12. DWORD dwRet = 1;
  13. WCHAR *s = NULL;
  14. HANDLE hFind = NULL;
  15. WIN32_FIND_DATAW fd = {0};
  16. WCHAR wszFileName[MAX_PATH] = L"";
  17. lstrcpyW(wszFileName, pwszPath);
  18. s = wszFileName + wcslen(wszFileName);
  19. if (*(s-1) != L'//')
  20. *s++ = L'//';
  21. // wcscpy_s(s, 4, L"*.*");
  22. ::lstrcpyW(s, L"*.*");
  23. hFind = FindFirstFileW(wszFileName, &fd);
  24. if (hFind==INVALID_HANDLE_VALUE)
  25. goto Exit0;
  26. do
  27. {
  28. // 过滤
  29. if (_wcsicmp(L".", fd.cFileName) == 0 || _wcsicmp(L"..", fd.cFileName) == 0)
  30. continue;
  31. ::lstrcpyW(s, fd.cFileName);
  32. *(s + lstrlenW(fd.cFileName)) = L'/0';
  33. // 如果是文件夹则递归
  34. if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  35. {
  36. // 删除.svn目录,我做一个小工作,删文件,o(∩_∩)o...
  37. WCHAR wszSvnCmd[MAX_PATH] = {0};
  38. ::lstrcpyW(wszSvnCmd, L"rmdir /s/q ");
  39. ::lstrcatW(wszSvnCmd, wszFileName);
  40. ::lstrcatW(wszSvnCmd, L"//.svn");
  41. system(W2A(wszSvnCmd));
  42. ScanDirectory(wszFileName);
  43. }
  44. else
  45. {
  46. // 对文件进行扫描
  47. // 这里你可以放入你对文件的处理代码
  48. }
  49. }while(::FindNextFileW(hFind, &fd));
  50. dwRet = 0;
  51. Exit0:
  52. if( hFind != INVALID_HANDLE_VALUE )
  53. {
  54. ::FindClose( hFind );
  55. hFind = NULL;
  56. }
  57. return dwRet;
  58. }

当然上面的代码还只能遍历一个磁盘,除非你知道自己的机器上有几个磁盘,然后调用几次就可以了,但是你不知道用户的机器上有几个什么磁盘咯,所以还须有下面的代码和上面配合:

  1. // -------------------------------------------------------------------------
  2. // 函数       : ParseDiskName
  3. // 功能       : 解析机器上能扫描的磁盘的名
  4. // 返回值  : DWORD 返回能扫描的磁盘数量
  5. // 参数       : TCHAR *pszDiskName  缓冲区 放入可扫描的磁盘的英文盘符名
  6. // 附注       :
  7. // -------------------------------------------------------------------------
  8. DWORD ParseDiskName(TCHAR *pszDiskName)
  9. {
  10. static TCHAR *pszWordTable = {"abcdefghijklmnopqrstuvwxyz"};
  11. DWORD dwDisk;
  12. DWORD dwBase = 0x1;
  13. DWORD dwCount = 0;          // 记录磁盘数量
  14. DWORD dwScanCount = 0;      // 要扫描的有效磁盘数量,用于返回
  15. DWORD dwStyle;
  16. TCHAR szDiskPath[4] = {0};                  // 缓存一个磁盘根目录名
  17. TCHAR szDiskArray[26] = {0};                // 记录要扫描的所有磁盘名
  18. dwDisk = GetLogicalDrives();
  19. while (dwDisk && dwCount <= ::lstrlen(pszWordTable))
  20. {
  21. memset(szDiskPath, 0, sizeof(szDiskPath));
  22. if (dwDisk & dwBase)
  23. {
  24. ::lstrcpyn(szDiskPath, pszWordTable + dwCount, 2);
  25. ::lstrcat(szDiskPath, TEXT("://"));
  26. dwStyle = GetDriveType(szDiskPath);
  27. // 是否可扫描的
  28. if (DRIVE_REMOVABLE == dwStyle || DRIVE_FIXED == dwStyle)
  29. {
  30. szDiskArray[dwScanCount] = pszWordTable[dwCount];
  31. dwScanCount++;
  32. }
  33. }
  34. dwDisk = dwDisk & ~dwBase;
  35. dwBase = dwBase * 2;
  36. dwCount++;
  37. }
  38. ::lstrcpy(pszDiskName, szDiskArray);
  39. return dwScanCount;
  40. }

呵呵,差不多了,不过上面的遍历文件用递归实现的,有可能出现堆栈溢出的情况,用迭代实现遍历磁盘也是可以的,不过我一直没有去写一个,还是觉得太麻烦了,递归多方便啊。再show点代码,对计算机进行重启的,不过这个重启是类似于掉电重启的,大家别随便试啊,一调你的机器得不到任何通知就重启了,为什么要这么用呢?是因为有些病毒再收到系统重启通知的时候会干些坏事情,用这种方法才能彻底清除它。

  1. // -------------------------------------------------------------------------
  2. // 函数       : ForceShutDown
  3. // 功能       : 强制重启
  4. // 返回值  : HRESULT
  5. // 附注       :
  6. // -------------------------------------------------------------------------
  7. HRESULT ForceShutDown()
  8. {
  9. // 强制重启参数 函数指针声明
  10. typedef enum _SHUTDOWN_ACTION
  11. {
  12. ShutdownNoReboot,
  13. ShutdownReboot,
  14. ShutdownPowerOff
  15. } SHUTDOWN_ACTION;
  16. typedef DWORD (WINAPI* lpNtShutdownSystem)(SHUTDOWN_ACTION Action);
  17. LONG nRet = FALSE;
  18. HANDLE hToken;
  19. TOKEN_PRIVILEGES tkp;
  20. HANDLE hProcess = NULL;
  21. HMODULE hNTDLL = NULL;
  22. hProcess = ::GetCurrentProcess();
  23. if(hProcess == NULL)
  24. goto Exit0;
  25. if(!::OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
  26. goto Exit0;
  27. if(!::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid))
  28. goto Exit0;
  29. tkp.PrivilegeCount = 1;
  30. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  31. ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
  32. hNTDLL = LoadLibrary(_T("NTDLL.DLL"));
  33. if (hNTDLL)
  34. {
  35. lpNtShutdownSystem NtShutdownSystem = (lpNtShutdownSystem)GetProcAddress(hNTDLL, "NtShutdownSystem");
  36. if (NtShutdownSystem)
  37. {
  38. NtShutdownSystem(ShutdownReboot);
  39. }
  40. ::FreeLibrary(hNTDLL);
  41. nRet = TRUE;
  42. }
  43. Exit0:
  44. if(hToken)
  45. {
  46. ::CloseHandle(hToken);
  47. hToken = NULL;
  48. }
  49. if(hProcess)
  50. {
  51. ::CloseHandle(hProcess);
  52. hProcess = NULL;
  53. }
  54. return nRet;
  55. }
 

以后再说说那个堆栈溢出的情况吧。

http://blog.csdn.net/magictong/article/details/2784420

关于 win32 下磁盘的遍历方法的更多相关文章

  1. 不同WINDOWS平台下磁盘逻辑扇区的直接读写

    不同WINDOWS平台下磁盘逻辑扇区的直接读写 关键字:VWIN32.中断.DeviceIoControl 一.概述 在DOS操作系统下,通过BIOS的INT13.DOS的INT25(绝对读).INT ...

  2. Java中Map的三种遍历方法

    Map的三种遍历方法: 1. 使用keySet遍历,while循环: 2. 使用entrySet遍历,while循环: 3. 使用for循环遍历.   告诉您们一个小秘密: (下↓面是测试代码,最爱看 ...

  3. Jquery中each的三种遍历方法

    Jquery中each的三种遍历方法 $.post("urladdr", { "data" : "data" }, function(dat ...

  4. JavaScript、jQuery、fish的遍历方法(each、forEach)总结

    起因 在工作中,需要在遍历的dom中找到第一个并做下操作然后退出遍历,我首先想到了用each方法,但由于无论是公用的jQuery组件还是公司的fish组件.我都忘记了怎么去退出遍历,所以就有了这篇帖子 ...

  5. python数据结构与算法——二叉树结构与遍历方法

    先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置 层序遍历  采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点 # 先序遍历 # ...

  6. Oracle 11g RAC环境下Private IP修改方法及异常处理

    Oracle 11g RAC环境下Private IP修改方法及异常处理 Oracle 11g RAC环境下Private IP修改方法及异常处理 一. 修改方法 1. 确认所有节点CRS服务以启动 ...

  7. 两种QMultiMap的遍历方法(最好使用只读遍历器)

    留个爪,备查 QMultiMap<QString, QString>& remote_map = my_obj->m_MapVersion; // ccc 这里体现了引用的好 ...

  8. java 完全二叉树的构建与四种遍历方法

    本来就是基础知识,不能丢的太干净,今天竟然花了那么长的时间才写出来,记一下. 有如下的一颗完全二叉树: 先序遍历结果应该为:1  2  4  5  3  6  7 中序遍历结果应该为:4  2  5 ...

  9. linux下磁盘占用达到100%了,找不到哪些大文件耗尽了磁盘

    Linux下的根分区使用率100%,但是查看/分区下的目录都不大,没有占用满,这该怎么处理? 重启是肯定有效的,目前处理情况:重新restart应用后,空间释放出来 1.lsof | grep del ...

随机推荐

  1. 征服OA 飞鱼工作流程的在线培训课程(两)HTML形成基于

    表HTML的重要作用,等效混凝土框架建筑的行,于div在此之前流行.是否所有形式的世界.在角色表页面主要是针对页面布局和定位.通过整合人才规划表设计出合理的页面布局. 当然.更重要的是,存在是表示数据 ...

  2. SQL Server 存储过程之嵌套游标

    下面是一个订单取消的含2个游标的存储过程 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[CancelOrde ...

  3. echarts的一些基础笔记

    图表标题 title: { x: "left", // 水平安放位置,默认为左对齐,可选为: // 'center' ¦ 'left' ¦ 'right' // ¦ {number ...

  4. Scala Control Structures

    Scala之Control Structures 一.前言 前面学习了Scala的Numbers,接着学习Scala的Control Structures(控制结构). 二.Control Struc ...

  5. Gamma 函数与exponential power distribution (指数幂分布)

    1. Γ(⋅) 函数 Γ(α)=∫∞0tα−1e−tdt 可知以下基本性质: Γ(α+1)=αΓ(α) Γ(1)=1 ⇒ Γ(n+1)=n! Γ(12)=π√ 2. 指数幂分布(exponential ...

  6. Linux性能测试 top衍生命令 atop/htop/slaptop

    1. Atop Atop 是一个类似 top 的工具,但比 top 更有料.通过 Atop,你能够监视 Linux 系统的性能状况,包括进程活动.CPU.内存.硬盘.网络等方面的使用情况等. 2. h ...

  7. 努比亚Z7 mini刷机教程_recovery卡刷机教程

    之前小编分享努比亚Z7 mini电话访问Root权限.recovery刷机教程. 所以对于朋友谁搞机整机的爱,左边是写第三方手机刷包.那么下面刷的家小编与您分享努比亚Z7 mini刷机教程手机. 一. ...

  8. windows8运行zxing源码 生成与解码二维码 详解(含注释与图解可直接运行)

    1 下载zxing2.1 2 本代码配置环境:eclipse.java1.6.windows8.zxing2.1 3 解压后将文件夹里面core/src下面的com文件夹导入到eclipse工程(工程 ...

  9. delphi之多线程编程(尚未学习)

    本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以 ...

  10. 好用的Markdown 编辑器及工具

    Markdown 是 2004 年由 John Gruberis 设计和开发的纯文本格式的语法,所以通过同一个名字它可以使用工具来转换成 HTML.readme 文件,在线论坛编写消息和快速创建富文本 ...