其次是应为驱动程序函数选择名字。由于每个驱动程序中都要包含标准的驱动程序函数,因此,应使用一套区别于其他驱动程序的函数命名机制,由于使程序更容易开发、调试和测试。
此外,还要编写一个为AddDevice、DispatchPnP、DispatchPower和DispatchCreate函数设置入口点的DriverEntry函数,同时要编写一个完成内容的AddDevice函数。这四个内容。第一是调用IoCreateDevice以创建一个独立设备对象:第二是调用IoAttachDeviceToDeviceStack。以把它自己加入设备栈,同时填写PDEVICE_EXTENSION;第三是调用IoRegisterDeviceInterface,并为它的设备暴露一个接口,暴露的接口可为访问该设备的应用程序提供途径:第四调用IoSetDevi.ceInterfaceState,以激活它先前注册的接口。
至此,过滤设备就可以在DeviceTree中看到了。
最后,应为IRP_MJ_PNP请求编写一个基本DispatchPnP函数。该DispatchPnP函数必须准备处理具体的PnP IRP,然后为IRP_MJ_POWER编写一个基本DispatchPower函数,再为IRP_MJ_CREATE请求编写一个基本Dispatch Create函数,同时拦截相应的IRP请求,接着再为I/O控制请求编写一个基本DispatchDevCtrl函数,以与应用程序进行通讯和处理具体的控制请求。
2单向控制关键技术分析
2.1 SCSI命令的分析
对应于不同的过滤功能,其需要拦截的IRP也不相同。要对U盘进行单向控制。就需要拦截所有的写操作,使U盘成为只读的。但是,写U盘的时候,发送的并不是通常的IRP_MJ_WRITE请求,而是要分析相应的SCSI命令,对SCSI命令的取得和操作大致有两种。
第一种是得到当前的SCSI命令,其格式为:
2.2单向控制的实现
系统进行写操作时,通常都是先写在缓存区,然后经过一定的延时后,才会写到真正的磁盘中。所以,当拦截到SCSI命令中的SCSIOP WRITE后,虽然系统不会真正的写东西到U盘上,但却要过很久才会提示延时写错误。所以,本文采用了另外一种方法,即用软件实现“带写保护功能”的U盘,其效果与硬件实现的写保护方式一样,从而实现了U盘的只读。其软件实现方法如下: