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