zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1314回复:3

BUS如何创建多个PDO(高手请进100分)

楼主#
更多 发布于:2005-03-07 09:50
设计的时候,我在虚拟的BUS驱动中只创建了一个PDO,现在想根据实际情况创建多个PDO,可以当我创建第二个PDO的时候,第一个PDO和FDO就被自动删除了,而桌面上也出现了“不安全删除设备”的对话框。如何实现创建多个PDO?
---内核开发合作或提供基础技术服务QQ:22863668 ---
symon
驱动牛犊
驱动牛犊
  • 注册日期2001-09-19
  • 最后登录2011-06-29
  • 粉丝1
  • 关注1
  • 积分6分
  • 威望55点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-03-07 11:14
DDK中不是说一个驱动中PDO只能有一个,只有FDO才可以有多个?
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2005-03-07 11:47
DDK中不是说一个驱动中PDO只能有一个,只有FDO才可以有多个?

总线驱动程序为总线上它所枚举的每个设备产生PDO,PDO代表一个设备,可以有多个。
DEAMON TOOL创建多个虚拟光驱,设备管理器就有多个设备
---内核开发合作或提供基础技术服务QQ:22863668 ---
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-03-08 11:46
算了,自己已经解决了,可以创建多个PDO FDO
就知道在这不会找到答案的。
这就是枚举设备的过程

NTSTATUS
PnpRootQueryBusRelations(
  IN PDEVICE_OBJECT DeviceObject,
  IN PIRP Irp,
  IN PIO_STACK_LOCATION IrpSp)
{
  PDEVICE_RELATIONS Relations;
  PLIST_ENTRY CurrentEntry;
  PPNPROOT_DEVICE Device;
  NTSTATUS Status;
  ULONG Size;
  ULONG i;

  DPRINT(\"Called\\n\");

  Size = sizeof(DEVICE_RELATIONS) + sizeof(Relations->Objects) *
    (PnpRootDeviceListCount - 1);
  Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, Size);
  if (!Relations)
    return STATUS_INSUFFICIENT_RESOURCES;

  Relations->Count = PnpRootDeviceListCount;

  i = 0;
  CurrentEntry = PnpRootDeviceListHead.Flink;
  while (CurrentEntry != &PnpRootDeviceListHead)
    {
    Device = CONTAINING_RECORD(
      CurrentEntry, PNPROOT_DEVICE, ListEntry);

    if (!Device->Pdo) {
      /* Create a physical device object for the
         device as it does not already have one */
      Status = IoCreateDevice(DeviceObject->DriverObject, 0,
        NULL, FILE_DEVICE_CONTROLLER, 0, FALSE, &Device->Pdo);
      if (!NT_SUCCESS(Status)) {
        DPRINT(\"IoCreateDevice() failed with status 0x%X\\n\", Status);
        ExFreePool(Relations);
        return Status;
      }

      Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE;
    }

    /* Reference the physical device object. The PnP manager
       will dereference it again when it is no longer needed */
    ObReferenceObject(Device->Pdo);

    Relations->Objects = Device->Pdo;

    i++;

    CurrentEntry = CurrentEntry->Flink;
    }

  Irp->IoStatus.Information = (ULONG)Relations;

  return Status;
}
---内核开发合作或提供基础技术服务QQ:22863668 ---
游客

返回顶部