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

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 bhw98 的 blog

ing); iodeletedevice(driverobject->deviceobject); }

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

// 安装驱动并启动服务
// 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;
}

应用程序实现端口i/o的接口如下:

// 全局的设备句柄
handle hmyport;
  
// 打开设备
// lpszdevicepath: 设备的路径
handle opendevice(lpctstr lpszdevicepath)
{
    handle hdevice;
  
    // 打开设备
    hdevice = ::createfile(lpszdevicepath,    // 设备路径
        generic_read | generic_write,        // 读写方式
        file_share_read | file_share_write,  // 共享方式
        null,                    // 默认的安全描述符
        open_existing,           // 创建方式
        0,                       // 不需设置文件属性
        null);                   // 不需参照模板文件
  
    return hdevice;
}
  
// 打开端口驱动
bool openmyport()
{
    bool bresult;
  
    // 设备名为"myport",驱动程序位于windows的"system32\drivers"目录中
    bresult = startdriver("system32\\drivers\\myport.sys", "myport");
  
    // 设备路径为"\\.\myport"
    if (bresult)
    {
        hmyport = opendevice("\\\\.\\myport");
    }
  
    return (bresult && (hmyport != invalid_handle_value));
}
  
// 关闭端口驱动
bool closemyport()
{
    return (closehandle(hmyport) && stopdriver("myport"));
}
  
// 从指定端口读一个字节
// port: 端口
by

本文关键:DeviceIoControl,物理端口,设备驱动程序,IOPM,CMOS,speaker
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top