阅读:1623回复:9
请问大家一个串口驱动开发的问题
我需要做个功能驱动程序,利用这个功能驱动程序调用串口驱动程序。
在AddDevice过程中IoAttachDeviceToDeviceStack老是出错误。 我分析是我没有把设备对象放到设备堆栈上。 因为我不知道串口的设备堆栈是什么?如果才能把我的驱动程序和串口的设备堆栈绑定到一起。 希望各位高手能帮帮我。 |
|
沙发#
发布于:2005-06-10 12:50
因为我不知道串口的设备堆栈是什么? \\\\Device\\\\Serial0 <-- COM1 \\\\Device\\\\Serial1 <-- COM2 |
|
板凳#
发布于:2005-06-10 13:59
[quote]因为我不知道串口的设备堆栈是什么? \\\\Device\\\\Serial0 <-- COM1 \\\\Device\\\\Serial1 <-- COM2 [/quote] 问的愚蠢一点 ATTACHED_DEVICE_OBJECT = IoAttachDeviceToDeviceStack( fdo, PhysicalDeviceObject ); 我如何用\\\\Device\\\\Serial1和PhysicalDeviceObject连在一起。 |
|
地板#
发布于:2005-06-10 14:25
用IoGetDeviceObjectPointer()叫serial0或serial1,反回target deviceobject.
就用这deviceobject代替IoAttachDeviceToDeviceStack()里的PhysicalDeviceObject 另外也可用inf file. |
|
地下室#
发布于:2005-06-10 15:35
用IoGetDeviceObjectPointer()叫serial0或serial1,反回target deviceobject. RtlInitUnicodeString(&COM1, L\"\\\\Device\\\\Serial0\"); status =IoGetDeviceObjectPointer(&COM1,FILE_ALL_ACCESS,&FileObject,&PhysicalDeviceObject); 我是这么来实现的。您觉得有问题么? 还有就是INF文件如何来实现?能说的详细点么? 十分感谢! |
|
5楼#
发布于:2005-06-10 22:26
我是这么来实现的。您觉得有问题么? 一些保留字不要用,我会这样做 RtlInitUnicodeString(&MyCOM1, L\"\\\\Device\\\\Serial0\"); status =IoGetDeviceObjectPointer(&MyCOM1,FILE_ALL_ACCESS,&MyFileObject,&MyPhysicalDeviceObject); |
|
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 我就是不知道我错误在哪里了。建立设备对象然后绑定到指定的设备堆栈里了。可是告诉我错误。我就不知道如何解决了。 如果您能帮我。我万分感谢。 |
|
7楼#
发布于:2005-06-13 11:35
在AddDevice已经可以过去了。不出现错误。但是安装完成后,驱动程序表示“由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常”
原因是“该设备依赖的另一台设备不能正常工作” 因为程序是用驱动程序去加载串口1的驱动程序,所以我估计是这里出现问题。您能知道,要注意的事项么? |
|
8楼#
发布于:2005-06-13 17:25
我是个驱动初学者,也有类似的需求。
我用的是driverworks2.7,这个该怎么写呢。诚心请教。 |
|
9楼#
发布于:2007-11-20 23:55
串口设备是独占方式打开的,你的驱动获取串口DeviceObject时会有IRP_MJ_CREATE的请求从你的驱动里发送过去。
|
|