• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 64, 文章 - 11, 評(píng)論 - 12, 引用 - 0
            數(shù)據(jù)加載中……

            操控NT式驅(qū)動(dòng)小工具的源碼

               NT式驅(qū)動(dòng)在操作系統(tǒng)中,被當(dāng)成一種服務(wù)來(lái)管理。我們可以在HKLM\system\currentcontrolset\services鍵下查找到所有安裝的NT式驅(qū)動(dòng)的信息,這里也可以看到windows服務(wù)的相關(guān)信息。安裝NT式驅(qū)動(dòng)時(shí),安裝程序會(huì)在這里建立起相關(guān)的信息。如果我們手動(dòng)地來(lái)創(chuàng)建這些記錄來(lái)安裝驅(qū)動(dòng)也是可以的,不熟悉時(shí)還是比較麻煩的,網(wǎng)上也有許多操控NT驅(qū)動(dòng)的工具可供下載。這里我提供操控NT驅(qū)動(dòng)的源碼,用戶可以下下來(lái)編譯成控制臺(tái)程序或者改成窗體程序都是可以的。
              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 閱讀(487) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Windows/MFC探索

            久久久久久国产精品免费免费| 久久国产福利免费| 一级女性全黄久久生活片免费| 久久久久久亚洲精品无码| 香蕉久久永久视频| 18禁黄久久久AAA片| 久久久久久亚洲Av无码精品专口| 久久国产免费直播| 久久午夜电影网| 无码人妻久久一区二区三区蜜桃 | 久久er国产精品免费观看2| 国产AⅤ精品一区二区三区久久| 久久久久亚洲AV成人网人人软件| 久久亚洲日韩看片无码| 狠狠干狠狠久久| 精品久久久无码人妻中文字幕| 亚洲国产精久久久久久久| 久久SE精品一区二区| 久久99精品久久久久久水蜜桃 | 99久久无码一区人妻| 青青草原综合久久大伊人| 色综合久久88色综合天天| 狠狠精品久久久无码中文字幕| 青青草原1769久久免费播放| 亚洲AV日韩AV永久无码久久| 久久se精品一区二区影院| av无码久久久久不卡免费网站| 久久久久亚洲av成人网人人软件| 久久国产高清一区二区三区| 久久精品国产只有精品2020| 人妻少妇久久中文字幕一区二区 | 无码任你躁久久久久久| 1000部精品久久久久久久久| 亚洲∧v久久久无码精品| 99久久国产亚洲综合精品| 四虎国产精品成人免费久久| 国产日韩久久久精品影院首页| 国产精品久久精品| 国产真实乱对白精彩久久| 国产综合免费精品久久久| 久久精品免费网站网|