windows下虚拟串口驱动开发

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

现在介绍在windows XP下开发虚拟串口的方法。可以开发一个虚拟串口,将读写请求传递给USB驱动,这样就可以利用现成的串口调试工具向USB设备读取了。

1、DDK串口开发框架

DDK对串口驱动提供了专门接口。只要编写的驱动满足这些接口,并按照串口标准的命名方法,不管是真实的串口设备,还是虚拟设备,Windows操作系统都会认为

这个设备是一个标准的串口设备。用标准的串口调试工具都可以与这个设备进行通信。1、1 串口驱动的入口函数

本章的实例程序是在HelloWDM驱动的基础上修改而来,入口函数依然是DriverEntry,在DriverEntry函数中指定各种IRP的派遣函数,以及AddDevice 例程、卸载例程等。

[cpp]view plaincopy

1./************************************************************************

2.* 函数名称:DriverEntry

3.* 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象

4.* 参数列表:

5. pDriverObject:从I/O管理器中传进来的驱动对象

6. pRegistryPath:驱动程序在注册表的中的路径

7.* 返回值:返回初始化驱动状态

8.*************************************************************************/

9.#pragma INITCODE

10.extern"C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,

11. IN PUNICODE_STRING pRegistryPath)

12.{

13. KdPrint(("Enter DriverEntry\n"));

14.

15. pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;

16. pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;

17. pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HelloWDMDispatchControlp;

18. pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloWDMCreate;

19. pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloWDMClose;

20. pDriverObject->MajorFunction[IRP_MJ_READ] = HelloWDMRead;

21. pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloWDMWrite;

22. pDriverObject->DriverUnload = HelloWDMUnload;

23.

24. KdPrint(("Leave DriverEntry\n"));

25.return STATUS_SUCCESS;

26.}

其中在AddDevice例程中,需要创建设备对象,这些都是和以前的HelloWDM驱动程序类似。在创建完设备对象后,需要将设备对象指定一个符号链接,该符号链接必须是

COM开头,并接一下数字,如本例就采用了COM7。因为COM1和COM2在有些计算机中有时会被占用,因此,当该设备对象在指定符号链接时,应该避免采用这些名称。

[cpp]view plaincopy

1./************************************************************************

2.* 函数名称:HelloWDMAddDevice

3.* 功能描述:添加新设备

4.* 参数列表:

5. DriverObject:从I/O管理器中传进来的驱动对象

6. PhysicalDeviceObject:从I/O管理器中传进来的物理设备对象

7.* 返回值:返回添加新设备状态

8.*************************************************************************/

9.#pragma PAGEDCODE

10.NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,

11. IN PDEVICE_OBJECT PhysicalDeviceObject)

12.{

13. PAGED_CODE();

14. KdPrint(("Enter HelloWDMAddDevice\n"));

15.

16. NTSTATUS status;

17. PDEVICE_OBJECT fdo;

18. UNICODE_STRING devName;

19. RtlInitUnicodeString(&devName,L"\\Device\\MyWDMDevice");

20. status = IoCreateDevice(

21. DriverObject,

22.sizeof(DEVICE_EXTENSION),

23. &(UNICODE_STRING)devName,

24. FILE_DEVICE_UNKNOWN,

25. 0,

26. FALSE,

27. &fdo);

28.if( !NT_SUCCESS(status))

29.return status;

30. PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;

31. pdx->fdo = fdo;

32. pdx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);

相关文档
最新文档