- 注册时间
 - 2010-8-21
 
- 最后登录
 - 2017-5-27
 
- 在线时间
 - 4 小时
 
 
 
 
 
编程入门 
  
	- 魔鬼币
 - 1008 
 
 
 
 | 
 
c++加载驱动文件,自己经常用的。 
 
#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 ! \n", GetLastError() ); 
        bRet = FALSE; 
        goto BeforeLeave; 
    } 
    else 
    { 
        ////OpenSCManager成功 
        printf( "OpenSCManager() ok ! \n" );  
    } 
 
    //创建驱动所对应的服务 
    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 ! \n", dwRtn );  
            bRet = FALSE; 
            goto BeforeLeave; 
        }  
        else  
        { 
            //服务创建失败,是由于服务已经创立过 
            printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );  
        } 
 
        // 驱动程序已经加载,只需要打开  
        hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );  
        if( hServiceDDK == NULL )  
        { 
            //如果打开服务也失败,则意味错误 
            dwRtn = GetLastError();  
            printf( "OpenService() Faild %d ! \n", dwRtn );  
            bRet = FALSE; 
            goto BeforeLeave; 
        }  
        else 
        { 
            printf( "OpenService() ok ! \n" ); 
        } 
    }  
    else  
    { 
        printf( "CrateService() ok ! \n" ); 
    } 
 
    //开启此项服务 
    bRet= StartService( hServiceDDK, NULL, NULL );  
    if( !bRet )  
    {  
        DWORD dwRtn = GetLastError();  
        if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )  
        {  
            printf( "StartService() Faild %d ! \n", dwRtn );  
            bRet = FALSE; 
            goto BeforeLeave; 
        }  
        else  
        {  
            if( dwRtn == ERROR_IO_PENDING )  
            {  
                //设备被挂住 
                printf( "StartService() Faild ERROR_IO_PENDING ! \n"); 
                bRet = FALSE; 
                goto BeforeLeave; 
            }  
            else  
            {  
                //服务已经开启 
                printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n"); 
                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 ! \n", GetLastError() );  
        bRet = FALSE; 
        goto BeforeLeave; 
    }  
    else  
    { 
        //带开SCM管理器失败成功 
        printf( "OpenSCManager() ok ! \n" );  
    } 
    //打开驱动所对应的服务 
    hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS );  
 
    if( hServiceDDK == NULL )  
    { 
        //打开驱动所对应的服务失败 
        printf( "OpenService() Faild %d ! \n", GetLastError() );  
        bRet = FALSE; 
        goto BeforeLeave; 
    }  
    else  
    {  
        printf( "OpenService() ok ! \n" );  
    }  
    //停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。  
    if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) )  
    {  
        printf( "ControlService() Faild %d !\n", GetLastError() );  
    }  
    else  
    { 
        //打开驱动所对应的失败 
        printf( "ControlService() ok !\n" );  
    }  
    //动态卸载驱动程序。  
    if( !DeleteService( hServiceDDK ) )  
    { 
        //卸载失败 
        printf( "DeleteSrevice() Faild %d !\n", GetLastError() );  
    }  
    else  
    {  
        //卸载成功 
        printf( "DelServer:eleteSrevice() ok !\n" );  
    }  
    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 ! \n" );  
    } 
    else  
    { 
        printf( "Create Device faild %d ! \n", GetLastError() );  
    } 
    CloseHandle( hDevice ); 
} 
 
int main(int argc, char* argv[])  
{ 
    //加载驱动 
    BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH); 
    if (!bRet) 
    { 
        printf("LoadNTDriver error\n"); 
        return 0; 
    } 
    //加载成功 
 
    printf( "press any to create device!\n" );  
    getch();  
 
    TestDriver(); 
 
    //这时候你可以通过注册表,或其他查看符号连接的软件验证。  
    printf( "press any to unload the driver!\n" );  
    getch();  
 
    //卸载驱动 
    UnloadNTDriver(DRIVER_NAME); 
    if (!bRet) 
    { 
        printf("UnloadNTDriver error\n"); 
        return 0; 
    } 
    return 0;  
}  
 |   
 
 
 
 |