zoukankan      html  css  js  c++  java
  • win驱动开发笔记-驱动加载

    手动加载

    代码加载(win32)

     /*安装驱动程序流程:
       1、调用OpenSCManager()打开服务控制管理器
      
       2、调用CreateService()创建一个服务,服务类型为内核驱动
      
       3、调用OpenService()取得服务句柄
       启动服务
      
      4、调用StartService()启动服务
       停止服务
      
      4、调用ControlService()停止服务
       删除服务
      
      4、调用DeleteService()删除服务
      
      5、调用CloseServiceHandle()关闭服务句柄


    操作驱动程序流程:  
       1、调用CreateFile()取得设备句柄
      
       2、调用DeviceIoControl()传递I/O控制代码
      
       3、调用CloseHandle()关闭设备句柄

    */

    #include <windows.h>  
    #include <winsvc.h>  
    #include <conio.h>  
    #include <stdio.h>
    
    #define DRIVER_NAME "HelloDDK"
    #define DRIVER_PATH "..\MyDriver\MyDriver_Check\HelloDDK.sys"
    
    //装载NT驱动程序
    BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath)
    {
        char szDriverImagePath[256];
        //得到完整的驱动路径
        GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);
    
        BOOL bRet = FALSE;
    
        SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
        SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄
    
        //打开服务控制管理器
        hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
    
        if( hServiceMgr == NULL )  
        {
            //OpenSCManager失败
            printf( "OpenSCManager() Faild %d ! 
    ", GetLastError() );
            bRet = FALSE;
            goto BeforeLeave;
        }
        else
        {
            ////OpenSCManager成功
            printf( "OpenSCManager() ok ! 
    " );  
        }
    
        //创建驱动所对应的服务
        hServiceDDK = CreateService( hServiceMgr,
            lpszDriverName, //驱动程序的在注册表中的名字  
            lpszDriverName, // 注册表驱动程序的 DisplayName 值  
            SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限  
            SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序  
            SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值  
            SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值  
            szDriverImagePath, // 注册表驱动程序的 ImagePath 值  
            NULL,  
            NULL,  
            NULL,  
            NULL,  
            NULL);  
    
        DWORD dwRtn;
        //判断服务是否失败
        if( hServiceDDK == NULL )  
        {  
            dwRtn = GetLastError();
            if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )  
            {  
                //由于其他原因创建服务失败
                printf( "CrateService() Faild %d ! 
    ", dwRtn );  
                bRet = FALSE;
                goto BeforeLeave;
            }  
            else  
            {
                //服务创建失败,是由于服务已经创立过
                printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! 
    " );  
            }
    
            // 驱动程序已经加载,只需要打开  
            hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );  
            if( hServiceDDK == NULL )  
            {
                //如果打开服务也失败,则意味错误
                dwRtn = GetLastError();  
                printf( "OpenService() Faild %d ! 
    ", dwRtn );  
                bRet = FALSE;
                goto BeforeLeave;
            }  
            else 
            {
                printf( "OpenService() ok ! 
    " );
            }
        }  
        else  
        {
            printf( "CrateService() ok ! 
    " );
        }
    
        //开启此项服务
        bRet= StartService( hServiceDDK, NULL, NULL );  
        if( !bRet )  
        {  
            DWORD dwRtn = GetLastError();  
            if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )  
            {  
                printf( "StartService() Faild %d ! 
    ", dwRtn );  
                bRet = FALSE;
                goto BeforeLeave;
            }  
            else  
            {  
                if( dwRtn == ERROR_IO_PENDING )  
                {  
                    //设备被挂住
                    printf( "StartService() Faild ERROR_IO_PENDING ! 
    ");
                    bRet = FALSE;
                    goto BeforeLeave;
                }  
                else  
                {  
                    //服务已经开启
                    printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! 
    ");
                    bRet = TRUE;
                    goto BeforeLeave;
                }  
            }  
        }
        bRet = TRUE;
    //离开前关闭句柄
    BeforeLeave:
        if(hServiceDDK)
        {
            CloseServiceHandle(hServiceDDK);
        }
        if(hServiceMgr)
        {
            CloseServiceHandle(hServiceMgr);
        }
        return bRet;
    }
    
    //卸载驱动程序  
    BOOL UnloadNTDriver( char * szSvrName )  
    {
        BOOL bRet = FALSE;
        SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄
        SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄
        SERVICE_STATUS SvrSta;
        //打开SCM管理器
        hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );  
        if( hServiceMgr == NULL )  
        {
            //带开SCM管理器失败
            printf( "OpenSCManager() Faild %d ! 
    ", GetLastError() );  
            bRet = FALSE;
            goto BeforeLeave;
        }  
        else  
        {
            //带开SCM管理器失败成功
            printf( "OpenSCManager() ok ! 
    " );  
        }
        //打开驱动所对应的服务
        hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS );  
    
        if( hServiceDDK == NULL )  
        {
            //打开驱动所对应的服务失败
            printf( "OpenService() Faild %d ! 
    ", GetLastError() );  
            bRet = FALSE;
            goto BeforeLeave;
        }  
        else  
        {  
            printf( "OpenService() ok ! 
    " );  
        }  
        //停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。  
        if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) )  
        {  
            printf( "ControlService() Faild %d !
    ", GetLastError() );  
        }  
        else  
        {
            //打开驱动所对应的失败
            printf( "ControlService() ok !
    " );  
        }  
        //动态卸载驱动程序。  
        if( !DeleteService( hServiceDDK ) )  
        {
            //卸载失败
            printf( "DeleteSrevice() Faild %d !
    ", GetLastError() );  
        }  
        else  
        {  
            //卸载成功
            printf( "DelServer:eleteSrevice() ok !
    " );  
        }  
        bRet = TRUE;
    BeforeLeave:
    //离开前关闭打开的句柄
        if(hServiceDDK)
        {
            CloseServiceHandle(hServiceDDK);
        }
        if(hServiceMgr)
        {
            CloseServiceHandle(hServiceMgr);
        }
        return bRet;    
    } 
    
    void TestDriver()
    {
        //测试驱动程序  
        HANDLE hDevice = CreateFile("\\.\HelloDDK",  
            GENERIC_WRITE | GENERIC_READ,  
            0,  
            NULL,  
            OPEN_EXISTING,  
            0,  
            NULL);  
        if( hDevice != INVALID_HANDLE_VALUE )  
        {
            printf( "Create Device ok ! 
    " );  
        }
        else  
        {
            printf( "Create Device faild %d ! 
    ", GetLastError() );  
        }
        CloseHandle( hDevice );
    } 
    
    int main(int argc, char* argv[])  
    {
        //加载驱动
        BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH);
        if (!bRet)
        {
            printf("LoadNTDriver error
    ");
            return 0;
        }
        //加载成功
    
        printf( "press any to create device!
    " );  
        getch();  
    
        TestDriver();
    
        //这时候你可以通过注册表,或其他查看符号连接的软件验证。  
        printf( "press any to unload the driver!
    " );  
        getch();  
    
        //卸载驱动
        UnloadNTDriver(DRIVER_NAME);
        if (!bRet)
        {
            printf("UnloadNTDriver error
    ");
            return 0;
        }
    
        return 0;  
    }  
    View Code
  • 相关阅读:
    if——while表达式详解
    java算法:抽象数据类型ADT
    java算法:FIFO队列
    Android_NetworkInfo以及判断手机是否联网
    java算法:堆栈ADT及实例
    java算法:数据项
    java算法:一流的ADT
    java算法:复合数据结构
    java算法:字符串
    java算法:基于应用ADT例子
  • 原文地址:https://www.cnblogs.com/xuankuwa/p/3657910.html
Copyright © 2011-2022 走看看