5684|10

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何在IRP_MJ_PNP处理例程内实现对IRP_MP_IOCTL的处理 [复制链接]

是这样子的,
IRP_MP_IOCTL处理例程已实现对应用程序发来IOCTL的响应。
现在,不需要应用程序,直接在IRP_MJ_PNP为主功能,IRP_MN_START_DEVICE的处理例程中实现,将URB的各个参数填好,由IoBuildDeviceIoControlRequest建立好IRP,由IoCallDriver将其发送出去。
编译没有问题,但在安装驱动时,报“the device cannot start (Code 10)”


请问:在IRP_MJ_PNP routine中处理IRP_MP_IOCTL,可行不? 需要考虑哪些注意事项?

最新回复

icecut(平原狼 ),你问题解决了么?  详情 回复 发表于 2007-10-23 11:47
点赞 关注

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
比如说,urb的参数:

    urb = ExAllocatePool(NonPagedPool,
                         sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));         
                        
    if (urb)
    {
        RtlZeroMemory(urb,sizeof(struct  _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));

        urb->UrbHeader.Length = sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST);
        urb->UrbHeader.Function = URB_FUNCTION_VENDOR_DEVICE;

        urb->UrbControlVendorClassRequest.TransferBufferLength = 0x08;
        urb->UrbControlVendorClassRequest.TransferBufferMDL = NULL;
        urb->UrbControlVendorClassRequest.Request = 0x01;
        urb->UrbControlVendorClassRequest.Value = 0x01;
        urb->UrbControlVendorClassRequest.Index = 0x00;

        urb->UrbControlVendorClassRequest.TransferFlags = USBD_TRANSFER_DIRECTION_IN;

        
        ntStatus = xyzCallUSBDI(fdo, urb);

        ExFreePool(urb);
    }


这段代码放在IRP_MN_START_DEVICE的处理例程中,在WinDbg调试时如何捕获?
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
应用程序不发请求,IRP 没有,怎么处理呢?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
应该可以, 之前start device 的时候配置usb, 也是通过这种方式的。  不过是不是先要启动设备,然后才能发这样的请求~~~
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

5
 
是的,是在start device完成之后才发这样的请求
NTSTATUS xyzStartDevice(IN PDEVICE_OBJECT fdo)
{
    //...
    UsbBuildGetDescriptorRequest(urb,
                                SizeUrb,
                                USB_DEVICE_DESCRIPTOR_TYPE,
                                0,
                                0,
                                deviceDescriptor,
                                NULL,
                                SizeDescriptor,
                                NULL);

   ntStatus = xyzCallUSBDI(fdo, urb);

                //...
                if (NT_SUCCESS(ntStatus))
                {
        ntStatus = xyzConfigureDevice(fdo);
        
        xyzSendMyOwnRequest(IN PDEVICE_OBJECT fdo)    //也就是,在这里实现自定义请求的发送的
    }
    //...      
}
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

6
 
建立iocontrol的irp,用这个

  1. NTSTATUS OtherDeviceIoControl(
  2.         IN ULONG  IoControlCode,
  3.         IN PDEVICE_OBJECT  DeviceObject,
  4.         IN PVOID  InputBuffer  OPTIONAL,
  5.         IN ULONG  InputBufferLength,
  6.         OUT PVOID  OutputBuffer  OPTIONAL,
  7.         IN ULONG  OutputBufferLength,
  8.         IN BOOLEAN  InternalDeviceIoControl
  9.         )
  10. {
  11.         IO_STATUS_BLOCK ioStatus;
  12.         NTSTATUS ntStatus;
  13.         KEVENT event;

  14.         PIRP irp;
  15.         PIO_STACK_LOCATION stack;

  16.         ULONG bytes;
  17.        
  18.         KeInitializeEvent(&event, NotificationEvent, FALSE);

  19.         bytes = sizeof (ULONG);

  20.     irp = IoBuildDeviceIoControlRequest(
  21.                     IoControlCode,
  22.                     DeviceObject,
  23.                     InputBuffer,
  24.                     InputBufferLength,
  25.                     OutputBuffer,
  26.                     OutputBufferLength,
  27.                     InternalDeviceIoControl,
  28.                     &event,
  29.                     &ioStatus);

  30.     if(NULL == irp) {

  31.         BulkUsb_DbgPrint(1, ("memory alloc for irp failed\n"));
  32.         return STATUS_INSUFFICIENT_RESOURCES;
  33.     }

  34.         ntStatus = IoCallDriver(DeviceObject, irp);

  35.     if(STATUS_PENDING == ntStatus) {

  36.         KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
  37.     }
  38.     else {

  39.         ioStatus.Status = ntStatus;
  40.     }

  41.          ntStatus = ioStatus.Status;

  42.         return ntStatus;       
  43. }

复制代码
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
是的,iocontrol的irp也是这样建立的。现在的需求是:不处理iocontrol的irp,而是处理pnp的irp,且将urb参数配置好,把irp向下传递给usb总线驱动。 也就是说,原来由应用程序调用DeviceIoControl()所执行的,现在driver内pnp irp处理例程中实现,这样设备一插上就执行。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
那就再给你一段代码,想着给分啊,呵呵

  1. #pragma PAGEDCODE
  2. NTSTATUS Pub_IrpCompletionRoutine(
  3.     IN PDEVICE_OBJECT DeviceObject,
  4.     IN PIRP Irp,
  5.     IN PVOID Context)
  6. {
  7.     PKEVENT event = (PKEVENT)Context;

  8.     // Set the input event
  9.     KeSetEvent(event,
  10.               1,      // Priority increment  for waiting thread.
  11.               FALSE);  // Flag this call is not immediately followed by wait.

  12.     // This routine must return STATUS_MORE_PROCESSING_REQUIRED because we have not yet called
  13.     // IoFreeIrp() on this IRP.
  14.     return STATUS_MORE_PROCESSING_REQUIRED;

  15. }
  16. #pragma PAGEDCODE
  17. NTSTATUS AddDevice_QueryCapabilities(
  18.     IN PDEVICE_OBJECT      LowerDeviceObject,
  19.     IN PDEVICE_CAPABILITIES DeviceCapabilities)
  20. {
  21.     PIO_STACK_LOCATION nextStack;
  22.     PIRP irp;
  23.     NTSTATUS ntStatus;
  24.     KEVENT event;

  25.         KdPrint(("LowerDeviceObject->StackSize:%d\n",LowerDeviceObject->StackSize));
  26.     irp = IoAllocateIrp(LowerDeviceObject->StackSize, FALSE);
  27.     if (!irp) {
  28.         return STATUS_INSUFFICIENT_RESOURCES;
  29.     }
  30.     // Preinit the device capability structures appropriately.
  31.     RtlZeroMemory( DeviceCapabilities, sizeof(DEVICE_CAPABILITIES));
  32.     DeviceCapabilities->Size = sizeof(DEVICE_CAPABILITIES);
  33.     DeviceCapabilities->Version = 1;
  34.     DeviceCapabilities->Address = -1;
  35.     DeviceCapabilities->UINumber = -1;
  36.     // IoGetNextIrpStackLocation gives a higher level driver access to the next-lower
  37.     // driver\'s I/O stack location in an IRP so the caller can set it up for the lower driver.
  38.     nextStack = IoGetNextIrpStackLocation(irp);
  39.     nextStack->MajorFunction= IRP_MJ_PNP;
  40.     nextStack->MinorFunction= IRP_MN_QUERY_CAPABILITIES;

  41.     // init an event to tell us when the completion routine\'s been called
  42.     KeInitializeEvent(&event, NotificationEvent, FALSE);

  43.     // Set a completion routine so it can signal our event when
  44.     //  the next lower driver is done with the Irp
  45.     IoSetCompletionRoutine(irp,
  46.                           Pub_IrpCompletionRoutine,
  47.                           &event,  // pass the event as Context to completion routine
  48.                           TRUE,    // invoke on success
  49.                           TRUE,    // invoke on error
  50.                           TRUE);  // invoke on cancellation of the Irp
  51.     // set our pointer to the DEVICE_CAPABILITIES struct
  52.     nextStack->Parameters.DeviceCapabilities.Capabilities = DeviceCapabilities;
  53.     // preset the irp to report not supported
  54.     irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
  55.     ntStatus = IoCallDriver(LowerDeviceObject,irp);
  56.     if (ntStatus == STATUS_PENDING) {
  57.       // wait for irp to complete
  58.       KeWaitForSingleObject(
  59.             &event,
  60.             Suspended,//????
  61.             KernelMode,
  62.             FALSE,
  63.             NULL);
  64.       ntStatus = irp->IoStatus.Status;
  65.     }
  66.     IoFreeIrp(irp);
  67.     return ntStatus;
  68. }
复制代码

 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
好,copy下来看看先...
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

10
 
你的应该是配置失败,就是PNP出的问题。我现在在DS3.2生成的代码中也是出类似问题。但是用DDK代码没问题。你可看看DDK中的例程WDM\USB\BULKUSB
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
icecut(平原狼 ),你问题解决了么?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表