阅读:1840回复:4
新手求助:能否在SFillter中调用USB通讯接口
今天被领导要求在过滤驱动中加入对USB设备的访问。。
看了同行以前的做法是建立RING0和RING3的通讯,回到应用层调用。 不知能否在过滤驱动中直接调用或类似的代替思路,请各位大牛指教 |
|
沙发#
发布于:2009-07-23 19:40
可以啊
找以前的帖子,有答案的。 |
|
板凳#
发布于:2009-07-24 09:17
小弟翻了许久。。有点眼花。。。求大大给个关键字啥的
|
|
地板#
发布于:2009-07-24 14:44
//默认为全部允许
NTSTATUS GetStorageDeviceBusType( IN PDEVICE_OBJECT DeviceObject, ULONG* puType, IN PIRP Irp) { PIRP NewIrp; PSTORAGE_DEVICE_DESCRIPTOR Descriptor; PSTORAGE_PROPERTY_QUERY pQuery; PSTORAGE_PROPERTY_QUERY pBuffer; KEVENT WaitEvent; NTSTATUS Status = STATUS_SUCCESS; IO_STATUS_BLOCK IoStatus; KIRQL CurrentIRQL; PDEVICE_OBJECT StorageStackDeviceObject; PIO_STACK_LOCATION IrpSp; UNREFERENCED_PARAMETER(Irp); UNREFERENCED_PARAMETER(DeviceObject); *puType = BusTypeUnknown; if(Irp == NULL) { KdPrint(("USBFilter!GetStorageDeviceBusType Irp == NULL\n")); return Status; } CurrentIRQL = KeGetCurrentIrql(); if(CurrentIRQL >= DISPATCH_LEVEL) { KdPrint(("USBFilter!GetStorageDeviceBusType CurrentIRQL != PASSIVE_LEVEL\n")); return Status; } //得到真正的设备对象 IrpSp = IoGetCurrentIrpStackLocation(Irp); StorageStackDeviceObject = IrpSp->Parameters.MountVolume.Vpb->RealDevice; pBuffer = (PSTORAGE_PROPERTY_QUERY)ExAllocatePool(NonPagedPool, sizeof(STORAGE_DEVICE_DESCRIPTOR) * 4); pQuery = (PSTORAGE_PROPERTY_QUERY)ExAllocatePool(NonPagedPool, sizeof(STORAGE_DEVICE_DESCRIPTOR)); // first set the query properties pQuery->PropertyId = StorageDeviceProperty; pQuery->QueryType = PropertyStandardQuery; // initialize the waitable event KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE); //发送irp对象,这里需要是真正的设备 NewIrp = IoBuildDeviceIoControlRequest( IOCTL_STORAGE_QUERY_PROPERTY, StorageStackDeviceObject, (PVOID)pQuery, sizeof(STORAGE_DEVICE_DESCRIPTOR), (PVOID)pBuffer, sizeof(STORAGE_DEVICE_DESCRIPTOR) * 4, FALSE, &WaitEvent, &IoStatus); if (NULL == NewIrp) // can't create new irp { DbgPrint("[%s] [%u] I can't create a new irp to query the property of device (%p)!\n", __FILE__, __LINE__, StorageStackDeviceObject); return Status; } // send this irp to the storage device Status = IoCallDriver(StorageStackDeviceObject, NewIrp); if (Status == STATUS_PENDING) { Status = KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, NULL); Status = IoStatus.Status; } if (!NT_SUCCESS(Status)) { DbgPrint("[%s] [%u] Query IOCTL_STORAGE_QUERY_PROPERTY of device (%p) failed, Status=0x%08X!\n", __FILE__, __LINE__, StorageStackDeviceObject, Status); return Status; } Descriptor = (PSTORAGE_DEVICE_DESCRIPTOR)pBuffer; *puType = Descriptor->BusType; ExFreePool(pBuffer); ExFreePool(pQuery); return Status; } |
|
地下室#
发布于:2009-07-24 14:44
/*
typedef enum _STORAGE_BUS_TYPE { BusTypeUnknown = 0x00, BusTypeScsi, BusTypeAtapi, BusTypeAta, BusType1394, BusTypeSsa, BusTypeFibre, BusTypeUsb, BusTypeRAID, BusTypeiScsi, BusTypeSas, BusTypeSata, BusTypeSd, BusTypeMmc, BusTypeMax, BusTypeMaxReserved = 0x7F } STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE; */ |
|