• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > 急!求讲解张帆《Windows驱动开发技术详解》的虚拟串口驱动,求讲解

急!求讲解张帆《Windows驱动开发技术详解》的虚拟串口驱动,求讲解

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了女子监狱男管教张帆,张帆,女子监狱当管教张帆,监狱风云小说张帆,张帆个人资料等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:急!求讲解张帆《Windows驱动开发技术详解》的虚拟串口驱动,求讲解
描述:

驱动开发张帆windows

第19章,虚拟串口驱动,求讲解。有意的加我qq:545039712.我出钱。
需要讲解的代码如下:
NTSTATUS HelloWDMRead(IN PDEVICE_OBJECT fdo,
                        IN PIRP Irp)
{
KdPrint(("HelloWDMRead\n"));
    NTSTATUS ntStatus = STATUS_SUCCESS;// Assume success
PDEVICE_EXTENSION pExtension = (PDEVICE_EXTENSION)fdo->DeviceExtension;
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp );
ULONG BufLen = irpSp->Parameters.Read.Length;
PCHAR pBuf = (PCHAR)Irp->AssociatedIrp.SystemBuffer;
    KIRQL OldIrql;
    PDRIVER_CANCEL pOldCancelRoutine;
Irp->IoStatus.Information = 0;
DbgPrint("DeviceObject:%08X Read\n",fdo);
if (BufLen == 0)
    {
ntStatus = STATUS_SUCCESS;
    }
else
{
        KeAcquireSpinLock(&pExtension->WriteSpinLock, &OldIrql);
RtlCopyMemory(pBuf,pExtension->Buffer,BufLen);
Irp->IoStatus.Information = BufLen;
if (BufLen==0 && pExtension->pReadIrp==NULL) // nothing, store
{
pExtension->pReadIrp = Irp;
Irp->IoStatus.Status = ntStatus = STATUS_PENDING;
            IoSetCancelRoutine(Irp, DriverCancelCurrentReadIrp);
            if (Irp->Cancel)
            {
                pOldCancelRoutine = IoSetCancelRoutine(Irp, NULL);
                if (pOldCancelRoutine != NULL)
                {
                    // Nein, also IRP hier abbrechen
                    Irp->IoStatus.Status = ntStatus = STATUS_CANCELLED;
                    pExtension->pReadIrp = NULL;
                }
                else
                {
                    // Ja, Cancel-Routine wird Request beenden
                    IoMarkIrpPending(Irp);
                }
}
else
{
                    IoMarkIrpPending(Irp);
}
}
        KeReleaseSpinLock(&pExtension->WriteSpinLock, OldIrql);
}
    Irp->IoStatus.Status = ntStatus;
if (ntStatus != STATUS_PENDING)
IoCompleteRequest( Irp, IO_NO_INCREMENT );
    return ntStatus;
}
NTSTATUS HelloWDMWrite(IN PDEVICE_OBJECT fdo,
                        IN PIRP Irp)
{
KdPrint(("HelloWDMWrite\n"));
    NTSTATUS ntStatus = STATUS_SUCCESS;// Assume success
PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;
    PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp );
ULONG DataLen = irpSp->Parameters.Write.Length;
PUCHAR pData = (PUCHAR)Irp->AssociatedIrp.SystemBuffer;
    KIRQL OldIrql;
    PIRP            pOldReadIrp = NULL;
    PDRIVER_CANCEL  pOldCancelRoutine;
Irp->IoStatus.Information = 0;
ntStatus = STATUS_SUCCESS;
if (DataLen == 0)
    {
ntStatus = STATUS_SUCCESS;
    }else if (DataLen>COMBUFLEN)
    {
ntStatus = STATUS_INVALID_PARAMETER;
    }
else
{
KdPrint(("Write\n"));
        
KeAcquireSpinLock(&pdx->WriteSpinLock, &OldIrql);
RtlCopyMemory(pdx->Buffer,pData,DataLen);
pdx->uReadWrite = DataLen;
if (pdx->pReadIrp != NULL) // drop it out
{
pOldReadIrp = pdx->pReadIrp;
pOldCancelRoutine = IoSetCancelRoutine(pOldReadIrp, NULL);
if (pOldCancelRoutine != NULL)
{
pOldReadIrp->IoStatus.Information = 0;
pOldReadIrp->IoStatus.Status = STATUS_SUCCESS;
pdx->pReadIrp = NULL;
}
else
{
pOldReadIrp = NULL;
}
}
DriverCheckEvent(pdx, SERIAL_EV_RXCHAR | SERIAL_EV_RX80FULL);
// DriverCheckEvent(pdx, SERIAL_EV_TXEMPTY);
        KeReleaseSpinLock(&pdx->WriteSpinLock, OldIrql);
    if (pOldReadIrp != NULL)
    IoCompleteRequest(pOldReadIrp, IO_NO_INCREMENT);
}
    Irp->IoStatus.Status = ntStatus;
    Irp->IoStatus.Information = DataLen;
    IoCompleteRequest( Irp, IO_NO_INCREMENT );
    return ntStatus;
}


解决方案1:

读写的 操作  解释什么呢? 难道是需要 逐行代码注释?


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 急!求讲解张帆《Windows驱动开发技术详解》的虚拟串口驱动,求讲解

相关文章

  • 2017-06-05 关于VS2008MFC智能设备应用程序下添加microsoftcommunicationcontrol,version60的问题
  • 2017-06-05 开发板和仿真器有什么区别
  • 2017-06-05 求win2000下的DDK程序
  • 2017-06-05 ARMLinux将console串口当作普通数据串口的问题
  • 2017-06-17总线接口
  • 2017-06-05 用EclipseCDT配置VXWORKS开发环境如何导入导出头文件配置和环境变量配置
  • 2017-06-05 用ntddk\src\general\setup\install列子里的程序安装网卡后,在硬件管理器里面该硬件出现惊叹号??
  • 2017-06-05 i2c死锁!i2c总线恢复问题?
  • 2017-06-05 使用路由器的设备如何进行互联网通信
  • 2017-06-05 NRF24L01的初次使用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 新手,请各位指教
    • 寻找在windows系统下的应用程序调用刻录机工作的源代码实例。
    • 关于通过串口向单片机发送十六进制数组指令,求大神指点!
    • 麻烦帮忙看下这个LCD模块的使用
    • ameba-sdk使用i2c问题
    • 百思不解~,关于中断编程,达达帮忙~
    • USB方式WinCE5连接ActiveSync出现“建立合作关系失败”错误
    • RTL8019AS填入发送区的数据是什么格式??
    • 为windows驱动程序制作exe安装程序
    • 多引脚的编程应用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有