zzthhj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-30
  • 最后登录2005-06-24
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1588回复:9

请问大家一个串口驱动开发的问题

楼主#
更多 发布于:2005-06-10 11:24
我需要做个功能驱动程序,利用这个功能驱动程序调用串口驱动程序。
在AddDevice过程中IoAttachDeviceToDeviceStack老是出错误。
我分析是我没有把设备对象放到设备堆栈上。
因为我不知道串口的设备堆栈是什么?如果才能把我的驱动程序和串口的设备堆栈绑定到一起。

希望各位高手能帮帮我。
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
沙发#
发布于:2005-06-10 12:50
因为我不知道串口的设备堆栈是什么?


\\\\Device\\\\Serial0 <-- COM1
\\\\Device\\\\Serial1 <-- COM2
zzthhj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-30
  • 最后登录2005-06-24
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-10 13:59
[quote]因为我不知道串口的设备堆栈是什么?


\\\\Device\\\\Serial0 <-- COM1
\\\\Device\\\\Serial1 <-- COM2  [/quote]

问的愚蠢一点
    ATTACHED_DEVICE_OBJECT =
            IoAttachDeviceToDeviceStack(
           fdo,
           PhysicalDeviceObject
            );
我如何用\\\\Device\\\\Serial1和PhysicalDeviceObject连在一起。


KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
地板#
发布于:2005-06-10 14:25
用IoGetDeviceObjectPointer()叫serial0或serial1,反回target deviceobject.
就用这deviceobject代替IoAttachDeviceToDeviceStack()里的PhysicalDeviceObject
另外也可用inf file.
zzthhj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-30
  • 最后登录2005-06-24
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-10 15:35
用IoGetDeviceObjectPointer()叫serial0或serial1,反回target deviceobject.
就用这deviceobject代替IoAttachDeviceToDeviceStack()里的PhysicalDeviceObject
另外也可用inf file.


RtlInitUnicodeString(&COM1, L\"\\\\Device\\\\Serial0\");
status =IoGetDeviceObjectPointer(&COM1,FILE_ALL_ACCESS,&FileObject,&PhysicalDeviceObject);
我是这么来实现的。您觉得有问题么?
还有就是INF文件如何来实现?能说的详细点么?
十分感谢!
KMK
KMK
驱动大牛
驱动大牛
  • 注册日期2001-09-12
  • 最后登录2017-10-06
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望404点
  • 贡献值2点
  • 好评度58点
  • 原创分1分
  • 专家分1分
  • 社区居民
5楼#
发布于:2005-06-10 22:26
 
我是这么来实现的。您觉得有问题么?

一些保留字不要用,我会这样做

RtlInitUnicodeString(&MyCOM1, L\"\\\\Device\\\\Serial0\");
status =IoGetDeviceObjectPointer(&MyCOM1,FILE_ALL_ACCESS,&MyFileObject,&MyPhysicalDeviceObject);
zzthhj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-30
  • 最后登录2005-06-24
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-13 09:54
[quote]我是这么来实现的。您觉得有问题么?

一些保留字不要用,我会这样做

RtlInitUnicodeString(&MyCOM1, L\"\\\\Device\\\\Serial0\");
status =IoGetDeviceObjectPointer(&MyCOM1,FILE_ALL_ACCESS,&MyFileObject,&MyPhysicalDeviceObject);
 [/quote]
十分感谢您的回答
NTSTATUS
AddDevice(
        PDRIVER_OBJECT DriverObject,
        PDEVICE_OBJECT PhysicalDeviceObject
    )

{
    PDEVICE_EXTENSION deviceExtension;
   NTSTATUS status = STATUS_SUCCESS;
   ULONG deviceInstance;
   HANDLE regKey = NULL;
   PDEVICE_OBJECT fdo;
   PFILE_OBJECT  MYFileObject;
   UNICODE_STRING devname;
   UNICODE_STRING MYCOM1;
   UNICODE_STRING deviceObjName;
 static ULONG dataRatesSupported[] = { 9600, 19200, 38400, 57600, 115200 };

    PAGED_CODE();

   __try {

      RtlInitUnicodeString(&devname, L\"\\\\Device\\\\HBCOM0\");
      status = IoCreateDevice(
         DriverObject,
         sizeof(DEVICE_EXTENSION),
         &devname,
         FILE_DEVICE_SERIAL_PORT,
         FILE_DEVICE_SECURE_OPEN,
         TRUE,
         &fdo
         );

      if (status != STATUS_SUCCESS) {

            );

         __leave;
      }
      deviceExtension = fdo->DeviceExtension;
       RtlInitUnicodeString(&MYCOM1, L\"\\\\Device\\\\Serial0\");
      status =IoGetDeviceObjectPointer(&MYCOM1,FILE_ALL_ACCESS,&MYFileObject,&PhysicalDeviceObject);
      if(status ==STATUS_SUCCESS)
      {
      ATTACHED_DEVICE_OBJECT =
            IoAttachDeviceToDeviceStack(
           fdo,
           PhysicalDeviceObject
            );
        }
        if (ATTACHED_DEVICE_OBJECT == NULL) {

        status = STATUS_UNSUCCESSFUL;
            __leave;
        }

        status = IoRegisterDeviceInterface(
            PhysicalDeviceObject,
            &HBCOMGuid,
            NULL,
            &deviceExtension->PnPDeviceName
            );
        ASSERT(status == STATUS_SUCCESS);

      fdo->Flags |= DO_BUFFERED_IO;
      fdo->Flags |= DO_POWER_PAGABLE;
      fdo->Flags &= ~DO_DEVICE_INITIALIZING;

   }
   __finally {

      if (regKey) {

         ZwClose(regKey);
      }

        if (status != STATUS_SUCCESS) {

        }


   }
   return status;
}
这个就是完整的AddDevice程序。但是每次执行完 IoAttachDeviceToDeviceStack就出现错误。
错误的标志是KMODE_EXCEPTION_NOT_HANDLED
我就是不知道我错误在哪里了。建立设备对象然后绑定到指定的设备堆栈里了。可是告诉我错误。我就不知道如何解决了。
如果您能帮我。我万分感谢。
zzthhj
驱动牛犊
驱动牛犊
  • 注册日期2002-07-30
  • 最后登录2005-06-24
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-13 11:35
在AddDevice已经可以过去了。不出现错误。但是安装完成后,驱动程序表示“由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常”
原因是“该设备依赖的另一台设备不能正常工作”
因为程序是用驱动程序去加载串口1的驱动程序,所以我估计是这里出现问题。您能知道,要注意的事项么?
ceiba
驱动牛犊
驱动牛犊
  • 注册日期2004-07-27
  • 最后登录2008-04-22
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-06-13 17:25
我是个驱动初学者,也有类似的需求。

我用的是driverworks2.7,这个该怎么写呢。诚心请教。
Sealyet
驱动牛犊
驱动牛犊
  • 注册日期2004-09-10
  • 最后登录2013-05-04
  • 粉丝0
  • 关注0
  • 积分125分
  • 威望35点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-11-20 23:55
串口设备是独占方式打开的,你的驱动获取串口DeviceObject时会有IRP_MJ_CREATE的请求从你的驱动里发送过去。
游客

返回顶部