return ntstatus;
}
}
建立符号链接的作用就是暴露一个给应用程序的接口,应用程序可以通过createfile api打开链接符号,得到一个语柄,和我们的驱动程序进行交互操作。
3.unload例程
虽然各个驱动程序的unload例程不尽相同,但是它大致执行下列工作:
释放属于驱动程序的任何硬件。
从win32的名字空间移除符号连接名。
这个动作可以调用iodeletesymboliclink来实现。
使用iodeletedevice移除设备对象。
释放驱动程序持有的任何缓冲池等。
void driverunload ( in pdriver_object pdriverobject )
{
pdevice_object pnextobj;
// 循环每一个驱动过程控制的设备
pnextobj = pdriverobject->deviceobject;
while (pnextobj != null)
{
//从设备对象中取出设备extension
pdevice_extension pdevext = (pdevice_extension)extobj->deviceextension;
// 取出符号连接名
unicode_string plinkname = pdevext->ustrsymlinkname;
iodeletesymboliclink(&plinkname); //删除符号连接名
iodeletedevice(pnextobj); // 删除设备
pnextobj = pnextobj->nextdevice;
}
}
4. 派遣例程
win2000的i/o请求是包驱动的,当一个i/o请求开始,i/o管理器先创建一个irp去跟踪这个请求,另外,它存储一个功能代码在irp的i/o堆栈区的majorfield域中来唯一的标识请求的类型。majorfield域是被i/o管理器用来索引驱动程序对象的majorfunction表,这个表包含一个指向一个特殊i/o请求的派遣例程的功能指针,如果驱动程序不支持这个请求,majorfunction表就会指向i/o管理器函数_iopinvaliddevicerequest,该函数返回一个错误给原始的调用者。驱动程序的作者有责任提供所有的驱动程序支持的派遣例程。所有的驱动程序必须支持irp_mj_create功能代码,因为这个功能代码是用来响应win32用户模式的createfile调用,如果不支持这功能代码,win32程序就没有办法获得设备的句柄,类似的,驱动程序必须支持irp_mj_close功能代码,因为它用来响应win32用户模式的closehandle调用。顺便提一下,系统自动调用closehandle函数,因为在程序退出的时候,所有的句柄都没有被关闭。
static ntstatus mydrvdispatch (in pdevice_object deviceobject, in pirp irp)
{
ntstatus status;
pio_stack_location irpsp;
//得到当前irp (i/o请求包)
irpsp = iogetcurrentirpstacklocation( irp );
switch (irpsp->majorfunction)
{
case irp_mj_create:
dbgprint("irp_mj_create\n");
irp->iostatus.status = status_success;
irp->iostatus.information = 0l;
break;
case irp_mj_close:
dbgprint("irp_mj_close\n");
irp->iostatus.status = status_success;
irp->iostatus.information = 0l;
break;
}
iocompleterequest(irp, 0);
return status_success;
}
大部分的i/o管理器的操作支持一个标准的读写提取,irp_mj_device_control允许扩展的i/o请求,使用用户模式的deviceiocontrol函数来调用,i/o管理器创建一个irp,这个irp的majorfunction和iocontrolcode是被deviceiocontrol函数指定其内容。传递给驱动程序的ioctl遵循一个特殊的结构,它有32-bit大小,ddk包含一个方便的产生ioctl值的机制的宏,ctl_code。可以使用ctl_code宏来定义我们自己的ioctl。
例如:
#define ioctl_missledevice_aim ctl_code \
( file_device_unk
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>