4201|6

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

一个简单的驱动程序与应用程序通信问题请教 [复制链接]

com.sys的完整代码:

  1. #include
  2. #define NTSTRSAFE_LIB
  3. #include

  4. #define COM_DRIVER_NAME  L"\\Device\\Serial0"        //要绑定的设备名
  5. //延时用的
  6. #define  DELAY_ONE_MICROSECOND  (-10)
  7. #define  DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
  8. #define  DELAY_ONE_SECOND (DELAY_ONE_MILLISECOND*1000)

  9. PDEVICE_OBJECT s_fltobj=NULL;        //全局指针
  10. PDEVICE_OBJECT s_nextobj=NULL;        //全局指针

  11. void ccpUnload(PDRIVER_OBJECT drv);        //动态卸载函数
  12. NTSTATUS ccpAttachAllComs(PDRIVER_OBJECT driver);        //绑定函数
  13. NTSTATUS ccpDispatch(PDEVICE_OBJECT device,PIRP irp);        //过滤IRP函数
  14. NTSTATUS fengReadComplete(PDEVICE_OBJECT DeviectObject,PIRP Irp,PVOID Context);        //IRP_MJ_READ回调函数

  15. NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)        //所有的驱动都是这个入口函数跟c语言的main函数一样
  16.         {
  17.         size_t i;

  18.         for(i=0;i
  19.                 {
  20.                 driver->MajorFunction[i] = ccpDispatch;        //所有的分发函数都进入ccpDispatch这个函数里面去
  21.                 }

  22.         driver->DriverUnload = ccpUnload;        //支持动态卸载(=号后面是卸载函数)

  23.         ccpAttachAllComs(driver);        //绑定所有的串口

  24.         return STATUS_SUCCESS;        //返回成功(STATUS_SUCCESS=成功的意思)
  25.         }

  26. void ccpUnload(PDRIVER_OBJECT drv)        //动态卸载函数
  27.         {

  28.         LARGE_INTEGER interval;

  29.         UNICODE_STRING uniNtNameString;                //定义一个字符串
  30.         RtlInitUnicodeString(&uniNtNameString, COM_DRIVER_NAME);        // 初始化一个字符串(就是COM驱动的名字)

  31.         IoDetachDevice(s_nextobj);        // 首先解除绑定

  32.         interval.QuadPart = (2*1000 * DELAY_ONE_MILLISECOND);        // 睡眠时间(2秒)
  33.         KeDelayExecutionThread(KernelMode,FALSE,&interval);                //等待所有irp处理结束

  34.         IoDeleteDevice(s_fltobj);        // 删除设备
  35.         }

  36. NTSTATUS ccpAttachAllComs(PDRIVER_OBJECT driver)        //绑定函数
  37.         {

  38.         NTSTATUS status;        //定义返回状态数据类型
  39.         PFILE_OBJECT fileobj = NULL;        //定义一个设备的文件对象指针
  40.         PDEVICE_OBJECT devobj = NULL;        //定义一个设备对象指针


  41.         UNICODE_STRING uniNtNameString;                //定义一个字符串
  42.         RtlInitUnicodeString(&uniNtNameString, COM_DRIVER_NAME);        // 初始化一个字符串(就是COM驱动的名字)

  43.         status=IoGetDeviceObjectPointer(&uniNtNameString, FILE_ALL_ACCESS, &fileobj, &devobj);        //根据设备名字获取设备对象
  44.         if(status == STATUS_SUCCESS)        //如果获取设备对象成功
  45.                 ObDereferenceObject(fileobj);        //就取消设备的文件对象引用(因为过滤串口不需要文件对象)

  46.         status = IoCreateDevice(driver,0,NULL,devobj->DeviceType,0,FALSE,&s_fltobj);        //生成设备

  47.         if (status != STATUS_SUCCESS)        //如果没有生成设备成功就返回
  48.                 return status;

  49.         // 拷贝重要标志位。
  50.         if(devobj->Flags & DO_BUFFERED_IO)
  51.                 (s_fltobj)->Flags |= DO_BUFFERED_IO;
  52.         if(devobj->Flags & DO_DIRECT_IO)
  53.                 (s_fltobj)->Flags |= DO_DIRECT_IO;
  54.         if(devobj->Flags & DO_BUFFERED_IO)
  55.                 (s_fltobj)->Flags |= DO_BUFFERED_IO;
  56.         if(devobj->Characteristics & FILE_DEVICE_SECURE_OPEN)
  57.                 (s_fltobj)->Characteristics |= FILE_DEVICE_SECURE_OPEN;

  58.         (s_fltobj)->Flags |=  DO_POWER_PAGABLE;

  59.         s_nextobj = IoAttachDeviceToDeviceStack(s_fltobj,devobj);        //绑定一个设备到另一个设备上

  60.         if (s_nextobj == NULL)
  61.                 {
  62.                 // 如果绑定失败了,销毁设备,重新来过。
  63.                 IoDeleteDevice(s_fltobj);
  64.                 s_fltobj = NULL;
  65.                 return STATUS_UNSUCCESSFUL;
  66.                 }

  67.         (s_fltobj)->Flags = (s_fltobj)->Flags & ~DO_DEVICE_INITIALIZING;        //设置这个设备已经启动

  68.         return STATUS_SUCCESS;
  69.         }

  70. NTSTATUS ccpDispatch(PDEVICE_OBJECT device,PIRP irp)        //过滤函数
  71.         {

  72.         PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(irp);        //获取当前栈空间
  73.         NTSTATUS status;
  74.         ULONG i;

  75.         if(s_fltobj== device)
  76.                 {
  77.                 if(irpsp->MajorFunction == IRP_MJ_POWER)
  78.                         {
  79.                         //如果是电源直接发送,然后返回说已经被处理了
  80.                         PoStartNextPowerIrp(irp);
  81.                         IoSkipCurrentIrpStackLocation(irp);
  82.                         return PoCallDriver(s_nextobj,irp);
  83.                         }

  84.                 if(irpsp->MajorFunction == IRP_MJ_WRITE)
  85.                         {
  86.                         ULONG len = irpsp->Parameters.Write.Length;        //获取写入数据的长度

  87.                         PUCHAR buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;        //取得系统缓冲区数据

  88.                         for(i=0;i
  89.                                 {
  90.                                 DbgPrint("%2x,",buf[i]);        //打印内容
  91.                                 }
  92.                         }

  93.                 if(irpsp->MajorFunction == IRP_MJ_READ)
  94.                         {
  95.                         //因为读的是需要完成后才能得到,所以用回调函数来获取
  96.                         IoCopyCurrentIrpStackLocationToNext(irp);
  97.                         IoSetCompletionRoutine(irp, fengReadComplete, device, TRUE, TRUE, TRUE);
  98.                         return IoCallDriver(s_nextobj,irp);
  99.                         }

  100.                 //其它请求直接下发(不禁止也不修改)
  101.                 IoSkipCurrentIrpStackLocation(irp);
  102.                 return IoCallDriver(s_nextobj,irp);
  103.                 }

  104.         // 如果根本就不在被绑定的设备中,那是有问题的,直接返回参数错误。
  105.         irp->IoStatus.Information = 0;
  106.         irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
  107.         IoCompleteRequest(irp,IO_NO_INCREMENT);
  108.         return STATUS_SUCCESS;
  109.         }

  110. NTSTATUS fengReadComplete(PDEVICE_OBJECT DeviectObject,PIRP Irp,PVOID Context)        //IRP_MJ_READ回调函数
  111.         {
  112.         PIO_STACK_LOCATION IrpSp;
  113.         ULONG i;

  114.         IrpSp = IoGetCurrentIrpStackLocation(Irp);
  115.         if(NT_SUCCESS( Irp->IoStatus.Status))        //读成功才处理
  116.                 {
  117.                 PUCHAR buf = (PUCHAR)[color=#FF0000]Irp->AssociatedIrp.SystemBuffer[/color];        //取得系统缓冲区数据
  118.                 for(i=0; i<[color=#FF0000]Irp->IoStatus.Information[/color]; i++)
  119.                         {
  120.                         DbgPrint("%02X, ", buf[i]);
  121.                         }
  122.                 }

  123.         if( Irp->PendingReturned)
  124.                 IoMarkIrpPending( Irp);

  125.         return Irp->IoStatus.Status;
  126.         }
复制代码

经测试dbg里可以显示读写的数据
现在的问题是想写个应用程序来动态修改IRP_MJ_READ回调函数里面的缓冲区数据(目的就是修改COM1设备传回的数据)
刚学驱动开发...以前用VC写程序(于其说写不如说复制)....汗

最新回复

哦...我以为把问题说的详细点比较好....原来太详细也不好啊...下次我会注意的 不过上面的问题搞定了...         if(pCommunicate== device)                 {                 if(irpsp->MajorFunction == IRP_MJ_CREATE)                         {                         irp->IoStatus.Status = STATUS_SUCCESS;                         irp->IoStatus.Information = 0L;                         }                 if(irpsp->MajorFunction == IRP_MJ_CLOSE)                         {                         irp->IoStatus.Status = STATUS_SUCCESS;                         irp->IoStatus.Information = 0L;                         }                 if(irpsp->MajorFunction == IRP_MJ_WRITE)                         {                         irp->IoStatus.Status = STATUS_SUCCESS;                         irp->IoStatus.Information = 0L;                         DbgPrint("wwwwwwwwwwwww");        //打印内容                         }                 IoCompleteRequest(irp, 0);                 return STATUS_SUCCESS;                 } 复制代码 感谢一楼的大大提醒.....  详情 回复 发表于 2009-10-23 13:23
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

  1. #include
  2. #define NTSTRSAFE_LIB
  3. #include

  4. #define COM_DRIVER_NAME  L"\\Device\\Serial0"        //要绑定的设备名
  5. //延时用的
  6. #define  DELAY_ONE_MICROSECOND  (-10)
  7. #define  DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
  8. #define  DELAY_ONE_SECOND (DELAY_ONE_MILLISECOND*1000)

  9. PDEVICE_OBJECT s_fltobj=NULL;        //全局指针
  10. PDEVICE_OBJECT s_nextobj=NULL;        //全局指针
  11. PDEVICE_OBJECT pCommunicate=NULL;        //全局指针
  12. UNICODE_STRING devicename;                        //定义一个字符串
  13. UNICODE_STRING symboliclinkname;        //定义一个字符串
  14. void ccpUnload(PDRIVER_OBJECT drv);        //动态卸载函数
  15. NTSTATUS ccpAttachAllComs(PDRIVER_OBJECT driver);        //绑定设备函数
  16. NTSTATUS ccpDispatch(PDEVICE_OBJECT device,PIRP irp);        //自定义IRP分发函数
  17. NTSTATUS fengReadComplete(PDEVICE_OBJECT DeviectObject,PIRP Irp,PVOID Context);        //IRP_MJ_READ回调函数
  18. NTSTATUS CreateDevices(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath);        //创建设备用于同ring3应用程序通信

  19. NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)        //所有的驱动都是这个入口函数跟c语言的main函数一样
  20.         {
  21.         NTSTATUS status;        //定义返回状态数据类型
  22.         size_t i;
  23.         status = CreateDevices(driver,reg_path);
  24.         if (status==STATUS_SUCCESS)
  25.                 {
  26.                 for(i=0;i
  27.                         {
  28.                         driver->MajorFunction[i] = ccpDispatch;        //所有的分发函数都进入ccpDispatch这个函数里面去
  29.                         }
  30.                 driver->DriverUnload = ccpUnload;        //支持动态卸载(=号后面是卸载函数)
  31.                 ccpAttachAllComs(driver);        //绑定设备
  32.                 }
  33.         return STATUS_SUCCESS;        //返回成功(STATUS_SUCCESS=成功的意思)
  34.         }
  35. NTSTATUS CreateDevices(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
  36.         {        //创建设备用于同ring3应用程序通信
  37.         NTSTATUS status;
  38.         RtlInitUnicodeString(&devicename,L"\\Device\\MyDevice");        //初始化设备名称
  39.         RtlInitUnicodeString(&symboliclinkname,L"\\??\\MyDeviceName");        //初始化符号连接名称
  40.         status = IoCreateDevice(DriverObject,0,&devicename,FILE_DEVICE_UNKNOWN,0,FALSE,&pCommunicate);        //生成设备
  41.         if (status != STATUS_SUCCESS)        //如果没有生成设备成功就返回
  42.                 return status;
  43.         IoCreateSymbolicLink(&symboliclinkname,&devicename);//符号链接名称//设备名称
  44.         pCommunicate->Flags |= DO_BUFFERED_IO;
  45.         return status;
  46.         }
  47. void ccpUnload(PDRIVER_OBJECT drv)        //动态卸载函数
  48.         {
  49.         LARGE_INTEGER interval;
  50.         UNICODE_STRING uniNtNameString;                //定义一个字符串
  51.         RtlInitUnicodeString(&uniNtNameString, COM_DRIVER_NAME);        // 初始化一个字符串(就是COM驱动的名字)
  52.         IoDetachDevice(s_nextobj);        // 首先解除绑定
  53.         interval.QuadPart = (2*1000 * DELAY_ONE_MILLISECOND);        // 睡眠时间(2秒)
  54.         KeDelayExecutionThread(KernelMode,FALSE,&interval);                //等待所有irp处理结束
  55.         IoDeleteDevice(s_fltobj);        // 删除设备
  56.         IoDeleteDevice(pCommunicate);        // 删除设备
  57.         }
  58. NTSTATUS ccpAttachAllComs(PDRIVER_OBJECT driver)        //绑定设备函数
  59.         {
  60.         NTSTATUS status;        //定义返回状态数据类型
  61.         PFILE_OBJECT fileobj = NULL;        //定义一个设备的文件对象指针
  62.         PDEVICE_OBJECT devobj = NULL;        //定义一个设备对象指针
  63.         UNICODE_STRING uniNtNameString;                //定义一个字符串
  64.         RtlInitUnicodeString(&uniNtNameString, COM_DRIVER_NAME);        // 初始化一个字符串(就是COM驱动的名字)

  65.         status=IoGetDeviceObjectPointer(&uniNtNameString, FILE_ALL_ACCESS, &fileobj, &devobj);        //根据设备名字获取设备对象
  66.         if(status == STATUS_SUCCESS)        //如果获取设备对象成功
  67.                 ObDereferenceObject(fileobj);        //就取消设备的文件对象引用(因为过滤串口不需要文件对象)
  68.         status = IoCreateDevice(driver,0,NULL,devobj->DeviceType,0,FALSE,&s_fltobj);        //生成设备
  69.         if (status != STATUS_SUCCESS)        //如果没有生成设备就返回
  70.                 return status;
  71.         // 拷贝重要标志位。
  72.         if(devobj->Flags & DO_BUFFERED_IO)
  73.                 (s_fltobj)->Flags |= DO_BUFFERED_IO;
  74.         if(devobj->Flags & DO_DIRECT_IO)
  75.                 (s_fltobj)->Flags |= DO_DIRECT_IO;
  76.         if(devobj->Flags & DO_BUFFERED_IO)
  77.                 (s_fltobj)->Flags |= DO_BUFFERED_IO;
  78.         if(devobj->Characteristics & FILE_DEVICE_SECURE_OPEN)
  79.                 (s_fltobj)->Characteristics |= FILE_DEVICE_SECURE_OPEN;
  80.         (s_fltobj)->Flags |=  DO_POWER_PAGABLE;
  81.         s_nextobj = IoAttachDeviceToDeviceStack(s_fltobj,devobj);        //绑定一个设备到另一个设备上
  82.         if (s_nextobj == NULL)
  83.                 {
  84.                 // 如果绑定失败了,销毁设备,重新来过。
  85.                 IoDeleteDevice(s_fltobj);
  86.                 s_fltobj = NULL;
  87.                 return STATUS_UNSUCCESSFUL;
  88.                 }
  89.         (s_fltobj)->Flags = (s_fltobj)->Flags & ~DO_DEVICE_INITIALIZING;        //设置这个设备已经启动
  90.         return STATUS_SUCCESS;
  91.         }
  92. NTSTATUS ccpDispatch(PDEVICE_OBJECT device,PIRP irp)        //自定义IRP分发函数
  93.         {
  94.         PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(irp);        //获取当前栈空间
  95.         NTSTATUS status;
  96.         ULONG i;
  97.         if(s_fltobj== device)
  98.                 {
  99.                 if(irpsp->MajorFunction == IRP_MJ_POWER)
  100.                         {
  101.                         //如果是电源直接发送,然后返回说已经被处理了
  102.                         PoStartNextPowerIrp(irp);
  103.                         IoSkipCurrentIrpStackLocation(irp);
  104.                         return PoCallDriver(s_nextobj,irp);
  105.                         }
  106.                 if(irpsp->MajorFunction == IRP_MJ_WRITE)
  107.                         {
  108.                         ULONG len = irpsp->Parameters.Write.Length;        //获取写入数据的长度
  109.                         PUCHAR buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;        //取得系统缓冲区数据
  110.                         for(i=0;i
  111.                                 {
  112.                                 DbgPrint("%2x,",buf[i]);        //打印内容
  113.                                 }
  114.                         }
  115.                 if(irpsp->MajorFunction == IRP_MJ_READ)
  116.                         {
  117.                         //因为读的是需要完成后才能得到,所以用回调函数来获取
  118.                         IoCopyCurrentIrpStackLocationToNext(irp);
  119.                         IoSetCompletionRoutine(irp, fengReadComplete, device, TRUE, TRUE, TRUE);
  120.                         return IoCallDriver(s_nextobj,irp);
  121.                         }
  122.                 //其它请求直接下发(不禁止也不修改)
  123.                 IoSkipCurrentIrpStackLocation(irp);
  124.                 return IoCallDriver(s_nextobj,irp);
  125.                 }
  126.         // 如果根本就不在被绑定的设备中,那是有问题的,直接返回参数错误。
  127.         irp->IoStatus.Information = 0;
  128.         irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
  129.         IoCompleteRequest(irp,IO_NO_INCREMENT);
  130.         return STATUS_SUCCESS;       
  131.         }

  132. NTSTATUS fengReadComplete(PDEVICE_OBJECT DeviectObject,PIRP Irp,PVOID Context)        //IRP_MJ_READ回调函数
  133.         {
  134.         PIO_STACK_LOCATION IrpSp;
  135.         ULONG i;
  136.         IrpSp = IoGetCurrentIrpStackLocation(Irp);
  137.         if(NT_SUCCESS( Irp->IoStatus.Status))        //读成功才处理
  138.                 {
  139.                 PUCHAR buf = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;        //取得系统缓冲区数据
  140.                 for(i=0; iIoStatus.Information; i++)
  141.                         {
  142.                         DbgPrint("%02X, ", buf[i]);
  143.                         }
  144.                 }
  145.         if( Irp->PendingReturned)
  146.                 IoMarkIrpPending( Irp);
  147.         return Irp->IoStatus.Status;
  148.         }
复制代码

改成这样后为什么还不能用CreateFile打开设备??请大大们帮我看下我哪里写错了
应用层代码:

  1. void Cdriver_TestDlg::OnBnClickedButton4()
  2.         {
  3.         HANDLE handle  = ::CreateFile("\\\\.\\MyDeviceName",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
  4.         if(handle == INVALID_HANDLE_VALUE)
  5.                 MessageBox("打开设备出错");
  6.         CloseHandle(handle);
  7.         }
复制代码
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
驱动程序要响应IRP_MJ_CREATE和IRP_MJ_CLOSE。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 cnzdgs 的回复:
驱动程序要响应IRP_MJ_CREATE和IRP_MJ_CLOSE。

那如何响应呢???应怎么修改我上面的代码让它能用呢?
初学编程更是初学驱动代码能力巨差......
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

5
 

  1. #include
  2. #define NTSTRSAFE_LIB
  3. #include

  4. #define COM_DRIVER_NAME  L"\\Device\\Serial0"        //要绑定的设备名
  5. //延时用的
  6. #define  DELAY_ONE_MICROSECOND  (-10)
  7. #define  DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
  8. #define  DELAY_ONE_SECOND (DELAY_ONE_MILLISECOND*1000)

  9. PDEVICE_OBJECT s_fltobj=NULL;        //全局指针
  10. PDEVICE_OBJECT s_nextobj=NULL;        //全局指针
  11. PDEVICE_OBJECT pCommunicate=NULL;        //全局指针
  12. UNICODE_STRING devicename;                        //定义一个字符串
  13. UNICODE_STRING symboliclinkname;        //定义一个字符串
  14. void ccpUnload(PDRIVER_OBJECT drv);        //动态卸载函数
  15. NTSTATUS ccpAttachAllComs(PDRIVER_OBJECT driver);        //绑定设备函数
  16. NTSTATUS ccpDispatch(PDEVICE_OBJECT device,PIRP irp);        //自定义IRP分发函数
  17. NTSTATUS fengReadComplete(PDEVICE_OBJECT DeviectObject,PIRP Irp,PVOID Context);        //IRP_MJ_READ回调函数
  18. NTSTATUS CreateDevices(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath);        //创建设备用于同ring3应用程序通信

  19. NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)        //所有的驱动都是这个入口函数跟c语言的main函数一样
  20.         {
  21.         NTSTATUS status;        //定义返回状态数据类型
  22.         size_t i;
  23.         status = CreateDevices(driver,reg_path);
  24.         if (status==STATUS_SUCCESS)
  25.                 {
  26.                 for(i=0;i
  27.                         {
  28.                         driver->MajorFunction[i] = ccpDispatch;        //所有的分发函数都进入ccpDispatch这个函数里面去
  29.                         }
  30.                 driver->DriverUnload = ccpUnload;        //支持动态卸载(=号后面是卸载函数)
  31.                 ccpAttachAllComs(driver);        //绑定设备
  32.                 }
  33.         return STATUS_SUCCESS;        //返回成功(STATUS_SUCCESS=成功的意思)
  34.         }
  35. NTSTATUS CreateDevices(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
  36.         {        //创建设备用于同ring3应用程序通信
  37.         NTSTATUS status;
  38.         RtlInitUnicodeString(&devicename,L"\\Device\\MyDevice");        //初始化设备名称
  39.         RtlInitUnicodeString(&symboliclinkname,L"\\??\\MyDeviceName");        //初始化符号连接名称
  40.         status = IoCreateDevice(DriverObject,0,&devicename,FILE_DEVICE_UNKNOWN,0,FALSE,&pCommunicate);        //生成设备
  41.         if (status != STATUS_SUCCESS)        //如果没有生成成功就返回
  42.                 return status;
  43.         IoCreateSymbolicLink(&symboliclinkname,&devicename);//符号链接名称//设备名称
  44.         pCommunicate->Flags |= DO_BUFFERED_IO;
  45.         return status;
  46.         }
  47. void ccpUnload(PDRIVER_OBJECT drv)        //动态卸载函数
  48.         {
  49.         LARGE_INTEGER interval;
  50.         UNICODE_STRING uniNtNameString;                //定义一个字符串
  51.         RtlInitUnicodeString(&uniNtNameString, COM_DRIVER_NAME);        // 初始化一个字符串(就是COM驱动的名字)
  52.         IoDetachDevice(s_nextobj);        // 首先解除绑定
  53.         interval.QuadPart = (2*1000 * DELAY_ONE_MILLISECOND);        // 睡眠时间(2秒)
  54.         KeDelayExecutionThread(KernelMode,FALSE,&interval);                //等待所有irp处理结束
  55.         IoDeleteDevice(s_fltobj);        // 删除设备
  56.         IoDeleteDevice(pCommunicate);        // 删除设备
  57.         }
  58. NTSTATUS ccpAttachAllComs(PDRIVER_OBJECT driver)        //绑定设备函数
  59.         {
  60.         NTSTATUS status;        //定义返回状态数据类型
  61.         PFILE_OBJECT fileobj = NULL;        //定义一个设备的文件对象指针
  62.         PDEVICE_OBJECT devobj = NULL;        //定义一个设备对象指针
  63.         UNICODE_STRING uniNtNameString;                //定义一个字符串
  64.         RtlInitUnicodeString(&uniNtNameString, COM_DRIVER_NAME);        // 初始化一个字符串(就是COM驱动的名字)

  65.         status=IoGetDeviceObjectPointer(&uniNtNameString, FILE_ALL_ACCESS, &fileobj, &devobj);        //根据设备名字获取设备对象
  66.         if(status == STATUS_SUCCESS)        //如果获取设备对象成功
  67.                 ObDereferenceObject(fileobj);        //就取消设备的文件对象引用(因为过滤串口不需要文件对象)
  68.         status = IoCreateDevice(driver,0,NULL,devobj->DeviceType,0,FALSE,&s_fltobj);        //生成设备
  69.         if (status != STATUS_SUCCESS)        //如果没有生成设备就返回
  70.                 return status;
  71.         // 拷贝重要标志位。
  72.         if(devobj->Flags & DO_BUFFERED_IO)
  73.                 (s_fltobj)->Flags |= DO_BUFFERED_IO;
  74.         if(devobj->Flags & DO_DIRECT_IO)
  75.                 (s_fltobj)->Flags |= DO_DIRECT_IO;
  76.         if(devobj->Flags & DO_BUFFERED_IO)
  77.                 (s_fltobj)->Flags |= DO_BUFFERED_IO;
  78.         if(devobj->Characteristics & FILE_DEVICE_SECURE_OPEN)
  79.                 (s_fltobj)->Characteristics |= FILE_DEVICE_SECURE_OPEN;
  80.         (s_fltobj)->Flags |=  DO_POWER_PAGABLE;
  81.         s_nextobj = IoAttachDeviceToDeviceStack(s_fltobj,devobj);        //绑定一个设备到另一个设备上
  82.         if (s_nextobj == NULL)
  83.                 {
  84.                 // 如果绑定失败了,销毁设备,重新来过。
  85.                 IoDeleteDevice(s_fltobj);
  86.                 s_fltobj = NULL;
  87.                 return STATUS_UNSUCCESSFUL;
  88.                 }
  89.         (s_fltobj)->Flags = (s_fltobj)->Flags & ~DO_DEVICE_INITIALIZING;        //设置这个设备已经启动
  90.         return STATUS_SUCCESS;
  91.         }
  92. NTSTATUS ccpDispatch(PDEVICE_OBJECT device,PIRP irp)        //自定义IRP分发函数
  93.         {
  94.         PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(irp);        //获取当前栈空间
  95.         NTSTATUS status;
  96.         ULONG i;
  97.         if(s_fltobj== device)
  98.                 {
  99.                 if(irpsp->MajorFunction == IRP_MJ_POWER)
  100.                         {
  101.                         //如果是电源直接发送,然后返回说已经被处理了
  102.                         PoStartNextPowerIrp(irp);
  103.                         IoSkipCurrentIrpStackLocation(irp);
  104.                         return PoCallDriver(s_nextobj,irp);
  105.                         }
  106.                 if(irpsp->MajorFunction == IRP_MJ_WRITE)
  107.                         {
  108.                         ULONG len = irpsp->Parameters.Write.Length;        //获取写入数据的长度
  109.                         PUCHAR buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;        //取得系统缓冲区数据
  110.                         for(i=0;i
  111.                                 {
  112.                                 DbgPrint("%2x,",buf[i]);        //打印内容
  113.                                 }
  114.                         }
  115.                 if(irpsp->MajorFunction == IRP_MJ_READ)
  116.                         {
  117.                         //因为读的是需要完成后才能得到,所以用回调函数来获取
  118.                         IoCopyCurrentIrpStackLocationToNext(irp);
  119.                         IoSetCompletionRoutine(irp, fengReadComplete, device, TRUE, TRUE, TRUE);
  120.                         return IoCallDriver(s_nextobj,irp);
  121.                         }
  122.                 //其它请求直接下发(不禁止也不修改)
  123.                 IoSkipCurrentIrpStackLocation(irp);
  124.                 return IoCallDriver(s_nextobj,irp);
  125.                 }

  126.         if(pCommunicate== device)
  127.                 {
  128.                 if(irpsp->MajorFunction == IRP_MJ_POWER)
  129.                         {
  130.                         //如果是电源直接发送,然后返回说已经被处理了
  131.                         PoStartNextPowerIrp(irp);
  132.                         IoSkipCurrentIrpStackLocation(irp);
  133.                         return PoCallDriver(pCommunicate->NextDevice,irp);
  134.                         }
  135.                 if(irpsp->MajorFunction == IRP_MJ_CREATE)
  136.                         {
  137.                         IoSkipCurrentIrpStackLocation(irp);
  138.                         return IoCallDriver(pCommunicate->NextDevice,irp);
  139.                         }
  140.                 if(irpsp->MajorFunction == IRP_MJ_CLOSE)
  141.                         {
  142.                         IoSkipCurrentIrpStackLocation(irp);
  143.                         return IoCallDriver(pCommunicate->NextDevice,irp);
  144.                         }
  145.                 //其它请求直接下发(不禁止也不修改)
  146.                 IoSkipCurrentIrpStackLocation(irp);
  147.                 return IoCallDriver(pCommunicate->NextDevice,irp);
  148.                 }

  149.         // 如果根本就不在被绑定的设备中,那是有问题的,直接返回参数错误。
  150.         irp->IoStatus.Information = 0;
  151.         irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
  152.         IoCompleteRequest(irp,IO_NO_INCREMENT);
  153.         return STATUS_SUCCESS;       
  154.         }

  155. NTSTATUS fengReadComplete(PDEVICE_OBJECT DeviectObject,PIRP Irp,PVOID Context)        //IRP_MJ_READ回调函数
  156.         {
  157.         PIO_STACK_LOCATION IrpSp;
  158.         ULONG i;
  159.         IrpSp = IoGetCurrentIrpStackLocation(Irp);
  160.         if(NT_SUCCESS( Irp->IoStatus.Status))        //读成功才处理
  161.                 {
  162.                 PUCHAR buf = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;        //取得系统缓冲区数据
  163.                 for(i=0; iIoStatus.Information; i++)
  164.                         {
  165.                         DbgPrint("%02X, ", buf[i]);
  166.                         }
  167.                 }
  168.         if( Irp->PendingReturned)
  169.                 IoMarkIrpPending( Irp);
  170.         return Irp->IoStatus.Status;
  171.         }
复制代码

改成这样直接蓝屏......why????
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
IoCompleteRequest(irp,IO_NO_INCREMENT);
像是这句的问题,你这样贴代码,效果太差了。把你的觉得有问题的代码贴上来,最好和LOG一起。OK?
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 beyondma 的回复:
IoCompleteRequest(irp,IO_NO_INCREMENT);
像是这句的问题,你这样贴代码,效果太差了。把你的觉得有问题的代码贴上来,最好和LOG一起。OK?

哦...我以为把问题说的详细点比较好....原来太详细也不好啊...下次我会注意的
不过上面的问题搞定了...

  1.         if(pCommunicate== device)
  2.                 {
  3.                 if(irpsp->MajorFunction == IRP_MJ_CREATE)
  4.                         {
  5.                         irp->IoStatus.Status = STATUS_SUCCESS;
  6.                         irp->IoStatus.Information = 0L;
  7.                         }
  8.                 if(irpsp->MajorFunction == IRP_MJ_CLOSE)
  9.                         {
  10.                         irp->IoStatus.Status = STATUS_SUCCESS;
  11.                         irp->IoStatus.Information = 0L;
  12.                         }
  13.                 if(irpsp->MajorFunction == IRP_MJ_WRITE)
  14.                         {
  15.                         irp->IoStatus.Status = STATUS_SUCCESS;
  16.                         irp->IoStatus.Information = 0L;
  17.                         DbgPrint("wwwwwwwwwwwww");        //打印内容
  18.                         }
  19.                 IoCompleteRequest(irp, 0);
  20.                 return STATUS_SUCCESS;
  21.                 }
复制代码

感谢一楼的大大提醒.....
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

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