最近要写个在线专杀的东东,虽然是专杀(本来只要清除几个特定的文件和杀几个特定的进程,然后把用户的注册表恢复正常,很多病毒木马最喜欢干的一件事情就是写 映像劫持 然后机器一重启,安全相关的软件全部玩完了,不过这也没什么技术含量,利用了操作系统的“漏洞”而已),但是因为是 磁碟机,这个病毒(木马)很恶心,是感染型的,你磁盘上的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. 使用nodejs 来压缩整个目录

    var fstream = require('fstream'), tar = require('tar'), zlib = require('zlib'); fstream.Reader({ 'pa ...

  2. webpack优化经验1(持续)

    1 不知道该优化哪里 先开启gzip压缩,这样可以很直接的减少请求包的体积,效果显著,不过需要在服务器端作相应的配置才能生效 2拆分vendor包, 减少单体包的体积,并行加载 通过配置,将不同的公用 ...

  3. phpstudy2018升级MySQL5.5为5.7.24教程(图文)

    原文: phpstudy2018升级MySQL5.5为5.7教程(图文) 一.MySQL官网下载MySQL5.7版本,我这里下载的是MySQL5.7.24. 二.直接到D:phpStudyPHPTut ...

  4. WPF 超长文本的来回滚动

    原文:WPF 超长文本的来回滚动 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/Vblegend_2013/article/details/8362 ...

  5. 各个版本 Windows 10 系统中自带的 .NET Framework 版本

    原文各个版本 Windows 10 系统中自带的 .NET Framework 版本 Windows 名称 Windows 版本 自带的 .NET Framework 版本 Windows 10 Oc ...

  6. 《北京IT报道》你可以成为下一个《万万没有想到》?

    10一个月29当天上午,一位名为<北京IT报道>在视频短剧IT朋友谁快速刷新的互联网商业圈.这种制作粗糙.演员表情僵硬.安置赤裸网络剧,但对布局和内容因IT互联网从业者的生活,深受广大用户 ...

  7. 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)

    概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...

  8. ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Fram ...

  9. 1407251735-hd-美素数.cpp

    #include<stdio.h> int s1[1005000],s2[1005000]; //如果main该阵列外部函数中定义,全局变量的数组,自己主动初始化数组0: //在main里 ...

  10. OpenStack Summit Paris 会议记录 - 11-05-2014

    Ops/Design Summit - 2014-11-05 Record 1. Keystone Operators, Deployers, and DevOps 1. Icehouse中,SAML ...