llforce
驱动牛犊
驱动牛犊
  • 注册日期2009-07-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1701回复:4

新手求助:能否在SFillter中调用USB通讯接口

楼主#
更多 发布于:2009-07-20 14:06
今天被领导要求在过滤驱动中加入对USB设备的访问。。
看了同行以前的做法是建立RING0和RING3的通讯,回到应用层调用。
不知能否在过滤驱动中直接调用或类似的代替思路,请各位大牛指教
JeTus
驱动牛犊
驱动牛犊
  • 注册日期2007-09-22
  • 最后登录2010-01-17
  • 粉丝3
  • 关注0
  • 积分84分
  • 威望781点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-07-23 19:40
可以啊
找以前的帖子,有答案的。
llforce
驱动牛犊
驱动牛犊
  • 注册日期2009-07-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-07-24 09:17
小弟翻了许久。。有点眼花。。。求大大给个关键字啥的
JeTus
驱动牛犊
驱动牛犊
  • 注册日期2007-09-22
  • 最后登录2010-01-17
  • 粉丝3
  • 关注0
  • 积分84分
  • 威望781点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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;
}
JeTus
驱动牛犊
驱动牛犊
  • 注册日期2007-09-22
  • 最后登录2010-01-17
  • 粉丝3
  • 关注0
  • 积分84分
  • 威望781点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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;
*/
游客

返回顶部