阅读:2250回复:1
更底层实现指定磁盘只读
据说所有对磁盘的写最终转化为SCSI命令,按照驱动小妹的"U盘只读可控制 驱动程序实例",http://bbs.driverdevelop.com/htm_data/16/0708/104501.html。还有:
<<驱动开发详解>>的书中有一个例子(不能在WDK下build,我改了一下,可以直接在WDKbuild),作为LowerFilters挂载在{4D36E967-E325-11CE-BFC1-08002BE10318}下,所有磁盘都只读了。 如果要控制指定的盘符驱动器,比如C、H等,我原来以为,根据得到的IRP,查询设备全部设备的名字,再和自己需要的设备名对比就可以,最简单的如: //用于得到下层设备名称 pDeviceObject = irpStack->DeviceObject; //枚举所以下层的设备对象: while ( pDeviceObject ) { DisPlayDrv(pDeviceObject); // 进一步判断当前设备上 VPB 中的设备 if ( pDeviceObject->Vpb && pDeviceObject->Vpb->DeviceObject ){ DisPlayDrv( pDeviceObject->Vpb->DeviceObject ); if ( pDeviceObject->Vpb->DeviceObject->AttachedDevice ){ DisPlayDrv( pDeviceObject->Vpb->DeviceObject ); } } // 得到建立在此驱动上的下一个设备 DEVICE_OBJECT pDeviceObject = pDeviceObject->NextDevice; } VOID DisPlayDrv(PDEVICE_OBJECT pDeviceObject) { NTSTATUS status; ULONG ReturnLength; UCHAR Buffer[sizeof(OBJECT_NAME_INFORMATION)+(256*sizeof(WCHAR))]; POBJECT_NAME_INFORMATION ObjectNameInfo = (POBJECT_NAME_INFORMATION)Buffer; status = ObQueryNameString(pDeviceObject, ObjectNameInfo, sizeof(Buffer), &ReturnLength); if (NT_SUCCESS(status)){ KdPrint(("得到的设备名称%wZ,字符长%d,返回长:%u,",&ObjectNameInfo->Name,ObjectNameInfo->Name.Length,ReturnLength)); //KdPrint(("得到的设备名称%wZ",ObjectNameInfo->Name)); } else { KdPrint(("得到的设备失败%s",OsrNTStatusToString(status))); } } 打印出来的状态都是成功,但是,设备名称却是NULL. 能后采用下面的办法,可以打印两三中下层设备的名称,但远达不到目的。请那位大侠来开导一下: VOID DisPlayDrv( PDEVICE_OBJECT DevObj ) { POBJECT_HEADER ObjectHeader; POBJECT_HEADER_NAME_INFO ObjectNameInfo; if ( DevObj == NULL ) { DbgPrint( "DevObj is NULL!\n" ); return; } // // 得到对象头 // ObjectHeader = OBJECT_TO_OBJECT_HEADER( DevObj ); if ( ObjectHeader ) { // // 查询设备名称并打印 // ObjectNameInfo = OBJECT_HEADER_TO_NAME_INFO( ObjectHeader ); if ( ObjectNameInfo && ObjectNameInfo->Name.Buffer ) { DbgPrint( "Driver Name:%S - Device Name:%S - Driver Address:0x%x - Device Address:0x%x\n", DevObj->DriverObject->DriverName.Buffer, ObjectNameInfo->Name.Buffer, DevObj->DriverObject, DevObj ); } // // 对于没有名称的设备,则打印 NULL // else if ( DevObj->DriverObject ) { DbgPrint( "Driver Name:%S - Device Name:%S - Driver Address:0x%x - Device Address:0x%x\n", DevObj->DriverObject->DriverName.Buffer, L"NULL", DevObj->DriverObject, DevObj ); } } } MyFilter.rar |
|
最新喜欢:rhpeng |
沙发#
发布于:2009-10-13 10:03
麻烦楼主发一个完整版的上来吧!
或加我QQ:329673470 |
|