随笔 - 64, 文章 - 11, 评论 - 12, 引用 - 0
数据加载中……

操控NT式驱动小工具的源码

   NT式驱动在操作系统中,被当成一种服务来管理。我们可以在HKLM\system\currentcontrolset\services键下查找到所有安装的NT式驱动的信息,这里也可以看到windows服务的相关信息。安装NT式驱动时,安装程序会在这里建立起相关的信息。如果我们手动地来创建这些记录来安装驱动也是可以的,不熟悉时还是比较麻烦的,网上也有许多操控NT驱动的工具可供下载。这里我提供操控NT驱动的源码,用户可以下下来编译成控制台程序或者改成窗体程序都是可以的。
  1//////////////////////////////////////////////////////////////////////////
  2// file InstallNTDriver.cpp
  3//
  4// Copyright (c) 2010 robert xiao. All Rights Reserved. robert.xiao2010@gmail.com
  5// 
  6// Permission to use, copy, modify, and distribute this software and its
  7// documentation for any purpose, without fee, and without a written
  8// agreement, is hereby granted, provided that the above copyright notice, 
  9// this paragraph and the following two paragraphs appear in all copies, 
 10// modifications, and distributions.
 11//
 12//
 13// IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT,
 14// INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST
 15// PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION,
 16// EVEN IF THE AUTHOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 17//
 18// THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT
 19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 20// PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF
 21// ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS". THE AUTHOR HAS NO OBLIGATION
 22// TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 23//
 24//////////////////////////////////////////////////////////////////////////
 25#pragma once
 26#include <windows.h>  
 27#include <winsvc.h>
 28#include <conio.h>  
 29#include <stdio.h>
 30#include <shlwapi.h>
 31#include <iostream>
 32#include <string>
 33using namespace std;
 34
 35#pragma comment(lib, "shlwapi.lib")
 36
 37#define  WARN_MSG(X) printf X
 38#define  ERROR_MSG(X) printf X
 39#define  MAX_FNAME_LEN 256
 40//////////////////////////////////////////////////////////////////////////
 41// forward declaration.
 42void Quit(){
 43    exit(0);
 44}

 45void InstallMyDriver();
 46void StartMyDevice();
 47void PauseMyDevice();
 48void ResumeMyDevice();
 49void StopMyDevice();
 50void UnstallMyDriver();
 51
 52//////////////////////////////////////////////////////////////////////////
 53// global variable and structure
 54
 55typedef void (* pf)();
 56
 57enum SERVICE_COMMAND_TYPE{SCT_START, SCT_PAUSE, SCT_CONTINUE, SCT_STOP};
 58void _controlServiceImpl(char *szName, SERVICE_COMMAND_TYPE t);
 59
 60struct {
 61    int _nIndex;
 62    char _chMsg[100];
 63    pf _fu;
 64}
g_works[] = {
 65    0"Install NT Driver",                    InstallMyDriver,
 66    1"Start Device.",                        StartMyDevice,
 67    2"Stop Device.",                        StopMyDevice,
 68    3"UnInstall Driver.",                    UnstallMyDriver,
 69    -1"Quit.",                            Quit,
 70}
;
 71
 72static int g_nAmount = sizeof(g_works)/sizeof(g_works[0]);
 73
 74//////////////////////////////////////////////////////////////////////////
 75// message loop
 76
 77void PrintHelp(){
 78    system("cls");
 79    printf("\nplease select a item from follow items");
 80    for (int i = 0; i < g_nAmount; ++i){
 81        printf("\n%-4d: %s", g_works[i]._nIndex, g_works[i]._chMsg);
 82    }

 83    printf("\nEnter your input: ");
 84}

 85bool CheckInput(){
 86    if(cin.fail()){
 87        cin.clear();
 88        char c;
 89        cin >> c;
 90        return false;
 91    }

 92    return true;
 93}

 94
 95bool Dispatch(int nSelect){
 96    if(!CheckInput())
 97        return false;
 98
 99    bool bProduced = false;
100    for (int i = 0; i < g_nAmount; ++i){
101        if(nSelect ==  g_works[i]._nIndex){
102            bProduced = true;
103            g_works[i]._fu();
104            break;
105        }

106    }

107    return bProduced;
108}

109
110void ProcessMessage(){
111    int n;
112    do{
113        PrintHelp();
114        cin>> n;
115        while (!Dispatch(n)){
116            printf("\nEnter a valid item eg.(-1):");
117            cin >> n;
118        }

119        printf("press enter to begin next.");
120        system("pause");
121    }
while(true);
122}

123
124//////////////////////////////////////////////////////////////////////////
125// Entry point.
126int main(int argc, char* argv[]){
127    ProcessMessage();
128    return EXIT_SUCCESS;
129}

130
131//////////////////////////////////////////////////////////////////////////
132// implemention.
133
134bool InputDriverPath(char *szPath, int nLength = MAX_PATH){
135    if(!szPath){
136        ERROR_MSG(("InputDriverPath`s argument is invalid"));
137        return false;
138    }

139    string strTemp;
140    do{
141        printf("Driver binary file:");
142        cin >>strTemp;
143        if(PathFileExistsA(strTemp.c_str())){
144            break;    
145        }

146        printf("You input a invalid file path!\n");
147    }
while (1);
148
149    if(nLength < strTemp.length()){
150        WARN_MSG(("The buffer for file path is too samll"));
151    }

152    strcpy_s(szPath, nLength, strTemp.c_str());
153    return true;
154}

155
156bool InputDriverName(char *szName, int nLen = MAX_FNAME_LEN){
157    if(!szName){
158        ERROR_MSG(("InputDriverName`s argument is invalid"));
159        return false;
160    }

161    string strTemp;
162    do{
163        printf("Driver name:");
164        cin >> strTemp;
165        if(strTemp.size() > 3){
166            break;    
167        }

168        printf("You input a invalid driver name!\n");
169    }
while (1);
170
171    if(nLen < strTemp.size()){
172        ERROR_MSG(("The buffer for file path is too samll"));
173        return false;
174    }

175    strcpy_s(szName,nLen, strTemp.c_str());
176    return true;
177}

178
179DWORD _InstallMyDriver(char *szName, char * szImagePath){
180    // Open scm
181    if(!szName || !szImagePath){
182        ERROR_MSG(("_InstallMyDriver`parameter is invalid.\n"));
183        return EXIT_FAILURE;
184    }

185    SC_HANDLE hMgr = 0;
186    SC_HANDLE hSev = 0;
187    hMgr = OpenSCManager(00, SC_MANAGER_ALL_ACCESS);
188    if(!hMgr){
189        ERROR_MSG(("OpenSCManager() Failed: %d.\n", GetLastError()));
190        return EXIT_FAILURE;
191    }

192
193    // create service.
194    hSev = CreateServiceA(hMgr,
195        szName,
196        szName,
197        SERVICE_ALL_ACCESS,
198        SERVICE_KERNEL_DRIVER,
199        SERVICE_DEMAND_START,
200        SERVICE_ERROR_IGNORE,
201        szImagePath,
202        NULL,
203        NULL,
204        NULL,
205        NULL,
206        NULL);
207    DWORD dwError = EXIT_SUCCESS;
208    if(!hSev){
209        dwError = GetLastError();
210        if(dwError != ERROR_IO_PENDING && dwError != ERROR_SERVICE_EXISTS){
211            ERROR_MSG(("CreateServiceA failed: %d.\n", dwError));
212            goto clear;
213        }

214        hSev = OpenServiceA(hMgr, szName, SERVICE_ALL_ACCESS);
215        if(!hSev){
216            ERROR_MSG(("OpenServiceA failed: %d", GetLastError()));
217            goto clear;
218        }

219        dwError = EXIT_SUCCESS;
220    }

221clear:
222    if(hSev){
223        CloseServiceHandle(hSev);
224    }

225    if(hMgr){
226        CloseServiceHandle(hMgr);
227    }

228    return dwError;
229}

230void InstallMyDriver()
231{
232    // Input file path and name.
233    char szImagePath[MAX_PATH] = {'\0'};
234    if(!InputDriverPath(szImagePath)){
235        return;
236    }

237    char szName[MAX_FNAME_LEN] = {'\0'};
238    if(!InputDriverName(szName)){
239        return;
240    }

241    if(_InstallMyDriver(szName, szImagePath) != EXIT_SUCCESS){
242        ERROR_MSG(("Install driver failed.\n"));
243        return;
244    }

245    printf("Did you want to start the device?(0: yes):");
246    int i;
247    cin >> i;
248    if(i == 0){
249        _controlServiceImpl(szName, SCT_START);
250    }

251}

252
253DWORD _UnstallMyDriver(char *szName){
254    SC_HANDLE hMgr = 0;
255    SC_HANDLE hSev = 0;
256    hMgr = OpenSCManager(00, SC_MANAGER_ALL_ACCESS);
257    if(!hMgr){
258        ERROR_MSG(("OpenSCManager() Failed: %d.\n", GetLastError()));
259        return EXIT_FAILURE;
260    }

261
262    DWORD dwError = EXIT_SUCCESS;
263    hSev = OpenServiceA(hMgr, szName, SERVICE_ALL_ACCESS);
264    if(!hSev){
265        ERROR_MSG(("OpenServiceA failed: %d", GetLastError()));
266        dwError = GetLastError();
267        goto clear;
268    }

269
270    SERVICE_STATUS sta;
271    ControlService(hSev, SERVICE_CONTROL_STOP, &sta);
272    if(!DeleteService(hSev)){
273        dwError = GetLastError();
274        ERROR_MSG(("DeleteService failed:%d", GetLastError()));
275        goto clear;
276    }

277    printf("Uninstall driver successfully.\n");
278clear:
279    if(hSev){
280        CloseServiceHandle(hSev);
281    }

282    if(hMgr){
283        CloseServiceHandle(hMgr);
284    }

285    return dwError;
286
287}

288void UnstallMyDriver()
289{
290    char szName[MAX_FNAME_LEN] = {'\0'};
291    if(!InputDriverName(szName)){
292        return;
293    }

294    _UnstallMyDriver(szName);
295}

296
297bool _IsSameState(SERVICE_COMMAND_TYPE t, DWORD dwState){
298    if(dwState == SERVICE_RUNNING){
299        if(t == SCT_START || t == SCT_CONTINUE){
300            return true;
301        }

302    }

303    else if(dwState != SERVICE_RUNNING){
304        if(t == SCT_STOP){
305            return true;
306        }

307    }

308    else if(dwState == SERVICE_PAUSED){
309        if(t == SCT_PAUSE){
310            return true;
311        }

312    }

313    return false;
314}

315void _controlServiceImpl(char *szName, SERVICE_COMMAND_TYPE t){
316    SC_HANDLE hMgr = 0;
317    SC_HANDLE hSev = 0;
318    hMgr = OpenSCManager(00, SC_MANAGER_ALL_ACCESS);
319    if(!hMgr){
320        ERROR_MSG(("OpenSCManager() Failed: %d.\n", GetLastError()));
321        return ;
322    }

323
324    DWORD dwError = EXIT_SUCCESS;
325    hSev = OpenServiceA(hMgr, szName, SERVICE_ALL_ACCESS);
326    if(!hSev){
327        ERROR_MSG(("OpenServiceA failed: %d", GetLastError()));
328        dwError = GetLastError();
329        goto clear;
330    }

331
332    SERVICE_STATUS sta;
333    if(!QueryServiceStatus(hSev, &sta)){
334        ERROR_MSG(("QueryServiceStatus failed: %d", GetLastError()));
335        goto clear;
336    }

337
338    if(!_IsSameState(t, sta.dwCurrentState)){
339        BOOL bSuccessful = TRUE;
340        switch (t)
341        {
342        case SCT_START:
343            bSuccessful = StartService(hSev, 00);
344            break;
345        case SCT_CONTINUE:
346            bSuccessful = ControlService(hSev, SERVICE_CONTROL_CONTINUE, &sta);
347            break;
348        case SCT_PAUSE:
349            bSuccessful = ControlService(hSev, SERVICE_CONTROL_PAUSE, &sta);
350            break;
351        default:
352            bSuccessful = ControlService(hSev, SERVICE_CONTROL_STOP, &sta);
353            break;            
354        }

355        if(!bSuccessful){
356            ERROR_MSG(("Control Service failed: %d", GetLastError()));
357        }

358        else{
359            printf("Successfully.\n");
360        }

361    }

362    else{
363        printf("The service`s state is same.\n");
364    }

365clear:
366    if(hSev){
367        CloseServiceHandle(hSev);
368    }

369    if(hMgr){
370        CloseServiceHandle(hMgr);
371    }

372    return ;
373}

374
375void _controlService(SERVICE_COMMAND_TYPE t){
376    char szName[MAX_FNAME_LEN] = {'\0'};
377    if(!InputDriverName(szName)){
378        return;
379    }

380    _controlServiceImpl(szName, t);
381}

382void StartMyDevice()
383{
384    _controlService(SCT_START);
385}

386
387void PauseMyDevice()
388{
389    _controlService(SCT_PAUSE);
390}

391
392void ResumeMyDevice()
393{
394    _controlService(SCT_CONTINUE);
395}

396
397void StopMyDevice()
398{
399    _controlService(SCT_STOP);
400}

posted on 2010-04-21 20:08 Robertxiao 阅读(475) 评论(0)  编辑 收藏 引用 所属分类: Windows/MFC探索


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理