紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5494|回复: 1

把TA教程的SCM驱动加载代码改成了“面向过程”版

[复制链接]

28

主题

144

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

积分
273
发表于 2015-9-16 16:37:58 | 显示全部楼层 |阅读模式
本帖最后由 gfw 于 2015-9-16 16:43 编辑

原版的代码比较啰嗦 于是抽空改写了份 现在看来舒爽多了 方便大家 不隐藏不卖B了 哈哈
  1. #pragma comment(lib,"advapi32.lib") //Finishing by GFW@vbasm.com

  2. SC_HANDLE InstallDriver(PCHAR m_pSysPath, PCHAR m_pServiceName)
  3. {
  4.         PCHAR m_pDisplayName = m_pServiceName;
  5.         SC_HANDLE m_hSCManager = OpenSCManagerA(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  6.         if (NULL == m_hSCManager)
  7.         {
  8.                 return 0;
  9.         }
  10.         SC_HANDLE m_hService = CreateServiceA(m_hSCManager,
  11.                                                                                         m_pServiceName,
  12.                                                                                         m_pDisplayName,
  13.                                                                                         SERVICE_ALL_ACCESS,
  14.                                                                                         SERVICE_KERNEL_DRIVER,
  15.                                                                                         SERVICE_DEMAND_START,
  16.                                                                                         SERVICE_ERROR_NORMAL,
  17.                                                                                         m_pSysPath,
  18.                                                                                         NULL,NULL,NULL,NULL,NULL);
  19.         if (NULL == m_hService)
  20.         {
  21.                 if (ERROR_SERVICE_EXISTS == GetLastError())
  22.                 {
  23.                         m_hService = OpenServiceA(m_hSCManager,m_pServiceName,SERVICE_ALL_ACCESS);
  24.                 }
  25.         }
  26.         CloseServiceHandle(m_hSCManager);
  27.         return m_hService;
  28. }

  29. BOOL StartDriver(SC_HANDLE m_hService)
  30. {
  31.         return StartServiceA(m_hService,NULL,NULL);
  32. }

  33. BOOL StopDriver(SC_HANDLE m_hService)
  34. {
  35.         SERVICE_STATUS ss = {0};
  36.         return ControlService(m_hService,SERVICE_CONTROL_STOP,&ss);
  37. }

  38. BOOL RemoveDriver(SC_HANDLE m_hService)
  39. {
  40.         return DeleteService(m_hService);
  41. }

  42. HANDLE OpenDriver(PCHAR pLinkName)/* \\\\.\\test */
  43. {
  44.         HANDLE m_hDriver = CreateFileA(pLinkName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  45.         if(m_hDriver != INVALID_HANDLE_VALUE)
  46.                 return m_hDriver;
  47.         else
  48.                 return 0;
  49. }

  50. BOOL CloseDriver(HANDLE m_hDriver)
  51. {
  52.         __try
  53.         {
  54.                 return CloseHandle(m_hDriver);
  55.         }
  56.         __except(1)
  57.         {
  58.                 return 0;
  59.         }
  60. }

  61. _inline DWORD CTL_CODE_GEN(DWORD lngFunction)
  62. {
  63.         return (FILE_DEVICE_UNKNOWN * 65536) | (FILE_ANY_ACCESS * 16384) | (lngFunction * 4) | METHOD_BUFFERED;
  64. }

  65. BOOL ControlDriver(HANDLE m_hDriver, DWORD dwIoCode, PVOID InBuff, DWORD InBuffLen, PVOID OutBuff, DWORD OutBuffLen, DWORD *RealRetBytes)
  66. {
  67.         DWORD dw=0;
  68.         BOOL b=DeviceIoControl(m_hDriver,CTL_CODE_GEN(dwIoCode),InBuff,InBuffLen,OutBuff,OutBuffLen,&dw,NULL);
  69.         if(RealRetBytes)
  70.         {
  71.                 *RealRetBytes=dw;
  72.         }
  73.         return b;
  74. }

  75. void GetAppPath(char *szPathString)
  76. {
  77.         GetModuleFileNameA(0,szPathString,MAX_PATH);
  78.         for(SIZE_T i=strlen(szPathString)-1;i>=0;i--)
  79.         {
  80.                 if(szPathString[i]=='\\')
  81.                 {
  82.                         szPathString[i+1]='\0';
  83.                         break;
  84.                 }
  85.         }
  86. }

  87. SC_HANDLE GetServiceHandle(PCHAR m_pServiceName)
  88. {
  89.         SC_HANDLE m_hSCManager = OpenSCManagerA(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  90.         if (NULL == m_hSCManager)
  91.         {
  92.                 return 0;
  93.         }
  94.         SC_HANDLE m_hService = OpenServiceA(m_hSCManager,m_pServiceName,SERVICE_ALL_ACCESS);
  95.         if (NULL == m_hService)
  96.         {
  97.                 CloseServiceHandle(m_hSCManager);
  98.                 return 0;
  99.         }
  100.         CloseServiceHandle(m_hSCManager);
  101.         return m_hService;
  102. }
复制代码

如何使用?
  1. void test()
  2. {
  3.         CHAR szDrvFile[MAX_PATH]={0};
  4.         GetAppPath(szDrvFile);
  5.         strcat(szDrvFile,"KrnlHW64.sys");
  6.         SC_HANDLE hSc=InstallDriver(szDrvFile,"KrnlHW64");
  7.         if(hSc)
  8.         {
  9.                 StartDriver(hSc);
  10.                 HANDLE hDrv=OpenDriver("\\\\.\\KrnlHW64");
  11.                 ControlDriver(hDrv,0x800,0,0,0,0,0);
  12.                 CloseDriver(hDrv);
  13.                 StopDriver(hSc);
  14.                 RemoveDriver(hSc);
  15.         }
  16. }
复制代码

评分

参与人数 1水晶币 +100 收起 理由
Tesla.Angela + 100

查看全部评分

854

主题

3481

帖子

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36100
发表于 2015-9-16 22:55:39 | 显示全部楼层
嗯,不错。已将链接加入教程帖目录。此外最后应该加上:CloseServiceHandle(hSC),防止句柄泄漏。

又把你的例子加上了点内容,『驱动本体』和『加载器』完全模板化了。WIN32+WIN64都可以用。
  1. SC_HANDLE g_hSc;
  2. HANDLE g_hDrv;

  3. BOOLEAN DriverInit(BOOLEAN IsInit)
  4. {
  5.         if(IsInit)
  6.         {
  7.                 char szFileName[]="XXXX.sys";//TODO: CHANGE THIS VALUE
  8.                 char szLinkName[]="\\\\.\\XXXX";//TODO: CHANGE THIS VALUE
  9.                 CHAR szDrvFile[MAX_PATH]={0};
  10.                 GetAppPath(szDrvFile);
  11.                 strcat(szDrvFile,szFileName);
  12.                 g_hSc=InstallDriver(szDrvFile,szFileName);
  13.                 if(g_hSc)
  14.                 {
  15.                         StartDriver(g_hSc);
  16.                         g_hDrv=OpenDriver(szLinkName);
  17.                         if(g_hDrv)
  18.                                 return 1;
  19.                         else
  20.                                 return 0;
  21.                 }
  22.                 return 0;
  23.         }
  24.         else
  25.         {
  26.                 BOOLEAN b;
  27.                 b=CloseDriver(g_hDrv);if(!b) return 0;
  28.                 b=StopDriver(g_hSc);if(!b) return 0;
  29.                 b=RemoveDriver(g_hSc);if(!b) return 0;
  30.                 b=CloseServiceHandle(g_hSc);if(!b) return 0;
  31.                 return 1;
  32.         }
  33. }

  34. void main()
  35. {
  36.         BOOLEAN b;
  37.         b=DriverInit(1);if(b){puts("load driver OK!");}else{puts("load driver failed!");return;}
  38.         system("pause");
  39.         //ControlDriver(g_hDrv,0x800,0,0,0,0,0);
  40.         b=DriverInit(0);if(b){puts("unload driver OK!");}else{puts("unload driver failed!");}
  41.         system("pause");
  42. }
复制代码
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-4-18 23:16 , Processed in 0.022807 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表