nown, 0x801, method_buffered, file_access_any )
ntstatus dispatchiocontrol( in pdevice_object pdo, in pirp pirp )
{
ntstatus status = status_success;
pdevice_extension pde;
pvoid userbuffer;
ulong insize;
ulong outsize;
ulong controlcode; // ioctl请求代码
pio_stack_location pirpstack; //堆栈区域存储了用户缓冲区信息
pirpstack = iogetcurrentirpstacklocation( pirp );
// 取出ioctl请求代码
controlcode = pirpstack-> parameters.deviceiocontrol.iocontrolcode;
// 得到请求缓冲区大小
insize = pirpstack-> parameters.deviceiocontrol.inputbufferlength;
outsize = pirpstack-> parameters.deivceiocontrol.outputbufferlength;
//现在执行二次派遣
switch (controlcode)
{
case ioctl_missledeviceaim:
......
case ioctl_device_launch:
......
default: // 驱动程序收到了未被承认的控制代码
status = status_invalid_device_request;
}
pirp->iostatus.information = 0; // 数据没有传输
iocompleterequest( pirp, io_no_increment ) ;
return status;
}
5.驱动程序的安装
sc管理器(即服务控制管理器)可以控制服务和驱动程序。
加载和运行一个服务需要执行的典型操作步骤:
1.调用openscmanager()以获取一个管理器句柄
2.调用createservice()来向系统中添加一个服务
3.调用startservice()来运行一个服务
4.调用closeservicehandle()来释放管理器或服务句柄
bool installdriver()
{
sc_handle hscmanager = null;
hscmanager = openscmanager(null, null, sc_manager_all_access);
if(hscmanager == null)
{
fprintf(stderr, "openscmanager() failed. --err: %d\n", getlasterror());
return false;
}
sc_handle schservice;
schservice = createservice( hscmanager, //scmanager database
"mydriver", // name of service
"mydriver", // name to display
service_all_access, // desired access
service_kernel_driver, // service type
service_auto_start, // start type
service_error_normal, // error control type
driverpath, // service’s binary
null, // no load ordering group
null, // no tag identifier
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>