阅读:1181回复:7
tooflat来,帮我
我做了一个简单的LOCK USB的过滤驱动.我没有使用在REG中写入UpperFilters 方式.而是在程序中利用IoGetDeviceObjectPointer得到设备对象,然后创建个设备IoAttachDeviceToDeviceStack到原来的设备上.
驱动加载以后,USB确实不能使用,但是我卸载以后,USB同样不能使用,必须重新完成插拔动作后,方可使用.这个错误我可以容忍,但是,经过上述过程后,WINDOWS在关机或重新启动的时候会出现蓝屏.提示有没有处理完的IRP.可是我在UNLOAD的时候已经都DETEACH了. 希望得到大家的帮助,这是我写的第一个驱动,我需要他为以后建立信心. 谢谢 [编辑 - 3/28/05 by zhjie374] |
|
沙发#
发布于:2005-03-29 14:09
经过我修改以后,我现在可以在驱动卸载以后恢复USB的读写操作.
但是不能从WINDOWS卸载U盘,说U盘仍然在使用.但是我在UNLOAD里面已经做了相应的操作. 如果有人愿意帮助我的,留下EMAIL.我发给你. 谢谢 |
|
板凳#
发布于:2005-03-29 19:18
把代码贴出来吧
|
|
地板#
发布于:2005-03-30 09:45
请指教:
// LockA.c // 03-21-2005 <Jason Zhang> // Copyright ゥ 2005 <SCT SH> //UpperFilter USBPDO-3 #define _LOCKA_SYS_ #include <ddk\\ntddk.h> #include \"LockA.h\" #define NAME L\"\\\\Device\\\\USBPDO-3\" // ================================================================= // REVISION HISTORY // ================================================================= /* 03-21-2005 V1.00 Original version. */ // ================================================================= // GLOBAL DATA // ================================================================= //In order to save original function address PDRIVER_DISPATCH g_p_real_dispatch_device_control = NULL; PDRIVER_OBJECT g_p_target_driver_object = NULL; PDEVICE_OBJECT g_p_fdo=NULL; PDEVICE_OBJECT g_p_fido=NULL; BOOLEAN fSymbolicLink; //---------------------------------------------------------------- //Test by Jason PDRIVER_DISPATCH g_p_read=NULL; PDRIVER_DISPATCH g_p_close=NULL; PDRIVER_DISPATCH g_p_pnp=NULL; PDRIVER_DISPATCH g_p_dev=NULL; PDRIVER_DISPATCH g_p_in_dev=NULL; PDRIVER_DISPATCH g_p_create=NULL; PDRIVER_DISPATCH g_p_cleanup=NULL; PDRIVER_DISPATCH g_p_setinfo=NULL; // ================================================================= // DISCARDABLE FUNCTIONS // ================================================================= NTSTATUS DriverEntry (PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pusRegistryPath); NTSTATUS MyControl (PDEVICE_OBJECT Device_Object,PIRP irp); NTSTATUS MySendToNextDriver(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp); // ----------------------------------------------------------------- #ifdef ALLOC_PRAGMA #pragma alloc_text (INIT, DriverEntry) #endif //================================================================== //MyControl //================================================================== NTSTATUS MyControl(PDEVICE_OBJECT Device_Object,PIRP irp) { PAGED_CODE (); irp->IoStatus.Status = STATUS_ACCESS_DENIED; irp->IoStatus.Information = 0; IoCompleteRequest(irp, IO_NO_INCREMENT); //UNICODE_STRING file; return STATUS_ACCESS_DENIED; } //------------------------------------------------------------------ void DriverUnload (PDRIVER_OBJECT pDriverObject) { PAGED_CODE (); DbgPrint(\"Here is DriverUnload\"); g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL]=g_p_real_dispatch_device_control; g_p_target_driver_object->MajorFunction[IRP_MJ_READ] =g_p_read; g_p_target_driver_object->MajorFunction[IRP_MJ_CREATE]=g_p_create; g_p_target_driver_object->MajorFunction[IRP_MJ_PNP]=g_p_pnp; g_p_target_driver_object->MajorFunction[IRP_MJ_CLOSE]=g_p_close; g_p_target_driver_object->MajorFunction[IRP_MJ_CLEANUP]=g_p_cleanup; g_p_target_driver_object->MajorFunction[IRP_MJ_SET_INFORMATION]=g_p_setinfo; g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL]=g_p_dev; g_p_target_driver_object->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL]=g_p_in_dev; ObDereferenceObject(g_p_target_driver_object->DeviceObject); IoDetachDevice(g_p_fdo); if(g_p_fido!=NULL) { IoDeleteDevice(g_p_fido); } // IoDeleteDevice(pDriverObject->DeviceObject); return; } //--------------------------------------------------------------------------- NTSTATUS MySendToNextDriver(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { PDEVICE_EXTENSION deviceExtension; PAGED_CODE (); DbgPrint(\"Here is MySendToNextDriver\"); IoSkipCurrentIrpStackLocation(Irp); deviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; return IoCallDriver(g_p_fdo, Irp); } //--------------------------------------------------------------------- NTSTATUS MyDispatchPower(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { PDEVICE_EXTENSION deviceExtension; PAGED_CODE (); DbgPrint(\"Power Here\"); deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension; PoStartNextPowerIrp(Irp); IoSkipCurrentIrpStackLocation(Irp); return PoCallDriver(deviceExtension->NextStackDevice, Irp); } //---------------------------------------------------------------------- NTSTATUS MyRead(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { PAGED_CODE(); DbgPrint(\"Read Here\"); return MyControl(DeviceObject,Irp); } //---------------------------------------------------------------------- NTSTATUS MyWrite(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { PAGED_CODE(); DbgPrint(\"Write Here\"); return MyControl(DeviceObject,Irp); } //---------------------------------------------------------------------- NTSTATUS MyCreate(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { PAGED_CODE(); DbgPrint(\"Create Here\"); return MyControl(DeviceObject,Irp); } //---------------------------------------------------------------------- NTSTATUS MyDevCtl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { PAGED_CODE(); DbgPrint(\"DevCtl Here\"); return MyControl(DeviceObject,Irp); } //---------------------------------------------------------------------- NTSTATUS MyInDevCtl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp) { PAGED_CODE(); DbgPrint(\"InDevCtl Here\"); return MyControl(DeviceObject,Irp); } // ================================================================= // DRIVER Entry // ----------------------------------------------------------------- NTSTATUS DriverEntry (PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pusRegistryPath) { PDRIVER_DISPATCH *ppdd; UNICODE_STRING target_device_name; PDEVICE_OBJECT target_device_object; PFILE_OBJECT target_file_object; PDEVICE_OBJECT fido; PDEVICE_EXTENSION pdx; PDEVICE_OBJECT fdo; ULONG i; NTSTATUS status; UNICODE_STRING ntDeviceName; UNICODE_STRING win32DeviceName; //Initialize unicode string by RtlInitUnicodeString(&target_device_name, NAME); status = IoGetDeviceObjectPointer( &target_device_name, 0, &target_file_object, &target_device_object ); if (!NT_SUCCESS(status)) { KdPrint((\"IoGetDeviceObjectPointer return %Xn\", status)); return status; } //why still need IoCreateDevice after calling IoGetDeviceObjectPointer status=IoCreateDevice(pDriverObject, sizeof(DEVICE_EXTENSION), &ntDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &fido); if (!NT_SUCCESS(status)) {//Unsuccess KdPrint((\"IoCreateDevice return %Xn\", status)); return status; } else{ //Success //All following are boring me! g_p_fido=fido; pdx = (PDEVICE_EXTENSION)fido->DeviceExtension; pdx->fdo = fido; DbgPrint(\"Before Attach\"); fdo = IoAttachDeviceToDeviceStack(fido,target_device_object); g_p_fdo=fdo; DbgPrint(\"After Attach\"); DbgPrint(\"NextDevice %X\",g_p_fdo); pdx->NextStackDevice = fdo; fido->Flags |= fdo->Flags & (DO_DIRECT_IO|DO_BUFFERED_IO);//|=--or_eq fido->Flags |= DO_POWER_PAGABLE; fido->DeviceType = fdo->DeviceType; fido->Characteristics = fdo->Characteristics; fido->Flags &= ~DO_DEVICE_INITIALIZING; } g_p_target_driver_object = target_device_object->DriverObject; if (!g_p_target_driver_object) { KdPrint((\"target_device_object->DriverObject == NULLn\")); return STATUS_UNSUCCESSFUL; } KdPrint((\"target_device_object is %Xn\",target_device_object)); KdPrint((\"g_p_target_driver_object is %Xn\",g_p_target_driver_object)); g_p_real_dispatch_device_control = g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL]; g_p_read=g_p_target_driver_object->MajorFunction[IRP_MJ_READ]; g_p_create=g_p_target_driver_object->MajorFunction[IRP_MJ_CREATE]; g_p_pnp=g_p_target_driver_object->MajorFunction[IRP_MJ_PNP]; g_p_close=g_p_target_driver_object->MajorFunction[IRP_MJ_CLOSE]; g_p_cleanup=g_p_target_driver_object->MajorFunction[IRP_MJ_CLEANUP]; g_p_setinfo=g_p_target_driver_object->MajorFunction[IRP_MJ_SET_INFORMATION]; g_p_dev=g_p_target_driver_object->MajorFunction[IRP_MJ_DEVICE_CONTROL]; g_p_in_dev=g_p_target_driver_object->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL]; KdPrint((\"g_p_real_dispatch_device_control is %Xn\",g_p_real_dispatch_device_control)); ppdd = g_p_target_driver_object->MajorFunction; //----------------------------------------------------------------------- for(i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++) { ppdd = MySendToNextDriver;// } //----------------------------------------------------------------------- ppdd [IRP_MJ_CREATE ] =MyCreate; ppdd [IRP_MJ_READ ] =MyRead; ppdd [IRP_MJ_WRITE ] =MyWrite; ppdd [IRP_MJ_DEVICE_CONTROL ] =MyDevCtl; ppdd [IRP_MJ_INTERNAL_DEVICE_CONTROL ] =MyInDevCtl; ppdd [IRP_MJ_PNP ] =MyControl; ppdd [IRP_MJ_POWER ] =MyDispatchPower; pDriverObject->DriverUnload = DriverUnload; return status; } // ================================================================= // END OF PROGRAM // ================================================================= |
|
地下室#
发布于:2005-03-30 12:08
发给我看看,我想可能是你其他还有些资源没有释放掉,说明你的pnp处理部队
|
|
5楼#
发布于:2005-03-30 12:54
楼上的留下你的EMAIL.
先谢了 |
|
6楼#
发布于:2005-03-30 15:11
不清楚蓝屏的原因是什么,
不过我有个问题搞不懂,为什么你attach到usb设备上了,为什么还要替换它的dispatch routine,这两个只要做一个就可以了,试试不attach如何 |
|
7楼#
发布于:2005-03-30 15:55
我现在觉得这个方法可能不行.因为U的驱动是U插上以后才上的.所以我现在不用这种方法了,我写注册表UPPERFILTERS,不知道能不能成功.
另外,我控制只读的话,应该禁止哪个IRP? |
|