3141|1

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

获得的设备描述符的idVendor, idProduct,bcdDevice的值老是变化的 [复制链接]

这个是ddk vista 6000版本的一个toast例子中的,我只是改写filter.c中的这段想获得设备描述符。


每次读到的都不一样。怎么会这样啊。ddk下的。其他地方都没有改,就在FilterDispatchPnp中添加一段代码来获得设备描述符。但是问题如标题。每次运行
DebugPrint出来的idVendor, idProduct,bcdDevice的值老是变化的。
具体代码如下
NTSTATUS
FilterDispatchPnp (
    __in PDEVICE_OBJECT DeviceObject,
    __in PIRP Irp
    )
/*++

Routine Description:

    The plug and play dispatch routines.

    Most of these the driver will completely ignore.
    In all cases it must pass on the IRP to the lower driver.

Arguments:

   DeviceObject - pointer to a device object.

   Irp - pointer to an I/O Request Packet.

Return Value:

      NT status code

--*/
{
    PDEVICE_EXTENSION           deviceExtension;
    PIO_STACK_LOCATION         irpStack;
    NTSTATUS                            status;
    KEVENT                               event;

PURB pUrb = NULL;
PUSB_DEVICE_DESCRIPTOR deviceDescriptor = NULL;
ULONG dwSize;
NTSTATUS Status = STATUS_SUCCESS;

LARGE_INTEGER RunTime;
KEVENT Event;
IO_STATUS_BLOCK IoStatus;
PIO_STACK_LOCATION NextStack;
PIRP newIrp;
USHORT myidVendor;


    PAGED_CODE();
   
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    irpStack = IoGetCurrentIrpStackLocation(Irp);

    //DbgPrint(("FilterDO %s IRP:0x%p \n",
    //            PnPMinorFunctionString(irpStack->MinorFunction), Irp));

   status = IoAcquireRemoveLock (&deviceExtension->RemoveLock, Irp);
    if (!NT_SUCCESS (status)) {
        Irp->IoStatus.Status = status;
        IoCompleteRequest (Irp, IO_NO_INCREMENT);
        return status;
    }
//////////////////////////////////////////////////////////////  
// Added by me
pUrb = (PURB)ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
if(pUrb)
{
//DbgPrint("URB OK\n");
dwSize = sizeof(USB_DEVICE_DESCRIPTOR);
deviceDescriptor = (PUSB_DEVICE_DESCRIPTOR)ExAllocatePool(NonPagedPool, dwSize);
if(deviceDescriptor)
{
//DbgPrint("DeviceDescriptor OK\n");
UsbBuildGetDescriptorRequest(pUrb,
(USHORT)sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_DEVICE_DESCRIPTOR_TYPE,
0,
0,
deviceDescriptor,
NULL,
dwSize,
NULL);

RunTime.QuadPart = -2000 * 10;


KeInitializeEvent(&Event, NotificationEvent, FALSE);
newIrp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
DeviceObject,
NULL,
0,
NULL,
0,
TRUE,
&Event,
&IoStatus);
NextStack = IoGetNextIrpStackLocation(newIrp);
NextStack->Parameters.Others.Argument1 = pUrb;
//DbgPrint("Before Call\n");
Status = IoCallDriver(DeviceObject, newIrp);
if(Status == STATUS_PENDING)
{
DbgPrint("Pending\n");
Status = KeWaitForSingleObject(
&Event,
Suspended,
KernelMode,
FALSE,
&RunTime);
if(Status == STATUS_TIMEOUT)
{
DbgPrint("Cancel\n");
Status = STATUS_UNSUCCESSFUL;
IoCancelIrp(newIrp);
KeWaitForSingleObject(
&Event,
Suspended,
KernelMode,
FALSE,
NULL);
}
}

DbgPrint(" idVendor: %d, bcdDevice:%d, idProduct:%d\n", deviceDescriptor->idVendor,deviceDescriptor->bcdDevice,deviceDescriptor->idProduct);
DbgPrint(" bDeviceClass: %d,bDeviceSubClass:%d\n",deviceDescriptor->bDeviceClass,deviceDescriptor->bDeviceSubClass);
myidVendor = deviceDescriptor->idVendor;     
  }
ExFreePool(deviceDescriptor);
}
else
{
Status = STATUS_NO_MEMORY;
}

ExFreePool(pUrb);
}
else
{
Status = STATUS_NO_MEMORY;
}

DbgPrint("Return\n");

// End of addition
///////////////////////////////////////////////////////////////////////////

    switch (irpStack->MinorFunction) {
    case IRP_MN_START_DEVICE:

最新回复

没有人会吗?   详情 回复 发表于 2007-8-16 10:50
点赞 关注

回复
举报

89

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没有人会吗?
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表