WEB开发网
开发学院软件开发汇编语言 实战DeviceIoControl之六:访问物理端口 阅读

实战DeviceIoControl之六:访问物理端口

 2010-01-10 09:37:25 来源:WEB开发网   
核心提示:下面给出实现设备驱动程序的动态加载的源码,动态加载的好处是,实战DeviceIoControl之六:访问物理端口(2),你不用做任何添加新硬件的操作,也不用编辑注册表

下面给出实现设备驱动程序的动态加载的源码。动态加载的好处是,你不用做任何添加新硬件的操作,也不用编辑注册表,更不用重新启动计算机。

// 安装驱动并启动服务
// lpszDriverPath:  驱动程序路径
// lpszServiceName: 服务名 
BOOL StartDriver(LPCTSTR lpszDriverPath, LPCTSTR lpszServiceName)
{
    SC_HANDLE hSCManager;        // 服务控制管理器句柄
    SC_HANDLE hService;          // 服务句柄
    DWORD dwLastError;           // 错误码
    BOOL bResult = FALSE;        // 返回值
  
    // 打开服务控制管理器
    hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  
    if (hSCManager)
    {
        // 创建服务
        hService = CreateService(hSCManager,
                    lpszServiceName,
                    lpszServiceName,
                    SERVICE_ALL_ACCESS,
                    SERVICE_KERNEL_DRIVER,
                    SERVICE_DEMAND_START,
                    SERVICE_ERROR_NORMAL,
                    lpszDriverPath,
                    NULL,
                    NULL,
                    NULL,
                    NULL,
                    NULL);
  
        if (hService == NULL)
        {
            if (::GetLastError() == ERROR_SERVICE_EXISTS)
            {
                hService = ::OpenService(hSCManager, lpszServiceName, SERVICE_ALL_ACCESS);
            }
        }
  
        if (hService)
        {
            // 启动服务
            bResult = StartService(hService, 0, NULL);
  
            // 关闭服务句柄
            CloseServiceHandle(hService);
        }
  
        // 关闭服务控制管理器句柄
        CloseServiceHandle(hSCManager);
    }
  
    return bResult;
}
  
// 停止服务并卸下驱动
// lpszServiceName: 服务名 
BOOL StopDriver(LPCTSTR lpszServiceName)
{
    SC_HANDLE hSCManager;        // 服务控制管理器句柄
    SC_HANDLE hService;          // 服务句柄
    BOOL bResult;                // 返回值
    SERVICE_STATUS ServiceStatus;
  
    bResult = FALSE;
  
    // 打开服务控制管理器
    hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  
    if (hSCManager)
    {
        // 打开服务
        hService = OpenService(hSCManager, lpszServiceName, SERVICE_ALL_ACCESS);
  
        if (hService)
        {
            // 停止服务
            bResult = ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus);
  
            // 删除服务
            bResult = bResult && DeleteService(hService);
  
            // 关闭服务句柄
            CloseServiceHandle(hService);
        }
  
        // 关闭服务控制管理器句柄
        CloseServiceHandle(hSCManager);
    }
  
    return bResult;
}

上一页  1 2 3 4  下一页

Tags:实战 DeviceIoControl 访问

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接