c++驱动-C++驱动开发的小问题,求大家指点,算是初学者的问题,我弄好久了。。

问题描述

C++驱动开发的小问题,求大家指点,算是初学者的问题,我弄好久了。。
#include "Driver.h"

#pragma code_seg("INIT")
extern "C"
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj,PUNICODE_STRING pustrRegisterPath)
{
KdPrint(("Enter DriverEntryn"));
NTSTATUS status = STATUS_SUCCESS;

pDriverObj->DriverUnload = UnloadDR;
pDriverObj->MajorFunction[IRP_MJ_CREATE] = CreateDR;
pDriverObj->MajorFunction[IRP_MJ_READ] = ReadDR;

PDEVICE_OBJECT pDeviceObj;
UNICODE_STRING ustrDeviceName;
RtlInitUnicodeString(&ustrDeviceName,L"\Device\Timeout");
IoCreateDevice(pDriverObj,sizeof(DEVICE_EXTENSION),&ustrDeviceName,FILE_DEVICE_UNKNOWN,
               0,FALSE,&pDeviceObj);
UNICODE_STRING ustrSymbLinkName;
RtlInitUnicodeString(&ustrSymbLinkName,L"\DosDevices\Timeout");
status = IoCreateSymbolicLink(&ustrSymbLinkName,&ustrDeviceName);
if(!NT_SUCCESS(status))
{
    KdPrint(("Error: IoCreateSymbolicLinkn"));
    IoDeleteSymbolicLink(&ustrSymbLinkName);
    IoDeleteDevice(pDeviceObj);
    return status;
}
PDEVICE_EXTENSION pDeviceExt = (PDEVICE_EXTENSION)pDeviceObj->DeviceExtension;
pDeviceExt->pDeviceObj = pDeviceObj;
pDeviceExt->ustrDeviceName = ustrDeviceName;
pDeviceExt->ustrSymbLinkName = ustrSymbLinkName;

KdPrint(("Leave DriverEntryn"));
return status;

}

#pragma code_seg("PAGED")
VOID UnloadDR(PDRIVER_OBJECT pDriverObj)
{
KdPrint(("Enter UnloadDRn"));
PDEVICE_EXTENSION pDeviceExt = (PDEVICE_EXTENSION)pDriverObj->DeviceObject->DeviceExtension;
IoDeleteSymbolicLink(&pDeviceExt->ustrSymbLinkName);
IoDeleteDevice(pDeviceExt->pDeviceObj);
KdPrint(("Leave UnloadDRn"));
}

#pragma code_seg("PAGED")
NTSTATUS CreateDR(PDEVICE_OBJECT pDeviceObj,PIRP pIrp)
{
KdPrint(("Enter CreateDRn"));
NTSTATUS status = STATUS_SUCCESS;

PDEVICE_EXTENSION pDeviceExt = (PDEVICE_EXTENSION)pDeviceObj->DeviceExtension;
KeInitializeDpc(&pDeviceExt->kDpc,OnDpc,(PVOID)pDeviceObj);
KeInitializeTimer(&pDeviceExt->kTimer);

pIrp->IoStatus.Information = 0;
pIrp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(pIrp,IO_NO_INCREMENT);

KdPrint(("Leave CreateDRn"));
return status;

}

#pragma code_seg("PAGED")
NTSTATUS ReadDR(PDEVICE_OBJECT pDeviceObj,PIRP pIrp)
{
KdPrint(("Enter ReadDRn"));
NTSTATUS status = STATUS_SUCCESS;

PDEVICE_EXTENSION pDeviceExt = (PDEVICE_EXTENSION)pDeviceObj->DeviceExtension;
IoMarkIrpPending(pIrp);
pDeviceExt->pPendingIrp = pIrp;
ULONG ulInterval = 3000000;
pDeviceExt->liInterval = RtlConvertLongToLargeInteger(-10*ulInterval);
KeSetTimer(&pDeviceExt->kTimer,pDeviceExt->liInterval,&pDeviceExt->kDpc);
status = STATUS_PENDING;

KdPrint(("Leave ReadDRn"));
return status;

}

#pragma code_seg()
VOID OnDpc(
__in struct _KDPC *Dpc,
__in_opt PVOID DeferredContext,
__in_opt PVOID SystemArgument1,
__in_opt PVOID SystemArgument2
)
{
KdPrint(("Enter OnDpcn"));
PDEVICE_OBJECT pDeviceObj = (PDEVICE_OBJECT)DeferredContext;
PDEVICE_EXTENSION pDeviceExt = (PDEVICE_EXTENSION)pDeviceObj;
PIRP pIrp = pDeviceExt->pPendingIrp;
KdPrint(("timeoutn"));
pIrp->IoStatus.Information = 0;
pIrp->IoStatus.Status = STATUS_CANCELLED;
IoCompleteRequest(pIrp,IO_NO_INCREMENT);

KdPrint(("Leave OnDpcn"));

/* _asm
{
int 3;
}
*/
}

上面是我写的简单的代码,就是读这个驱动程序的时候,它会先挂起这个读IRP,当超时时结束这个IRP.
但是这儿我遇到个问题,一旦我在DPC里调用IOCompleteRequest之后就出错,但是不调用这个又不行,这样调用程序始终处于等待状态。
求指点,万分感谢。

时间: 2024-11-02 05:57:58

c++驱动-C++驱动开发的小问题,求大家指点,算是初学者的问题,我弄好久了。。的相关文章

领域驱动设计和开发实战

背景 领域驱动设计(DDD)的中心内容是如何将业务领域概念映射到软件工件中.大部分关于此主题的著作 和文章都以Eric Evans的书<领域驱动设计>为基础,主要从概念和设计的角度探讨领域建模和设计情况 .这些著作讨论实体.值对象.服务等DDD的主要内容,或者谈论通用语言.界定的上下文(Bounded Context)和防护层(Anti-Corruption Layer)这些的概念. 本文旨在从实践的角度探讨领域建模和设计,涉及如何着手处理领域模型并实际地实现它.我们将着 眼于技术主管和架构师

arm-rt5370驱动在9G45EK开发板Hostapd建立热点出是哪里的问题?

问题描述 rt5370驱动在9G45EK开发板Hostapd建立热点出是哪里的问题? hostapd /etc/hostapd.conf -B Configuration file: /etc/hostapd.conf drv->ifindex=3 ioctl[SIOCSIWMODE]: Invalid argument Could not set interface to mode(3)! Could not set interface to master mode! rtl871xdrv d

领域驱动设计和开发实战(转)

背景 领域驱动设计(DDD)的中心内容是如何将业务领域概念映射到软件工件中.大部分关于此主题的著作和文章都以Eric Evans的书<领域驱动设计>为基础,主要从概念和设计的角度探讨领域建模和设计情况.这些著作讨论实体.值对象.服务等DDD的主要内容,或者谈论通用语言.界定的上下文(Bounded Context)和防护层(Anti-Corruption Layer)这些的概念. 本文旨在从实践的角度探讨领域建模和设计,涉及如何着手处理领域模型并实际地实现它.我们将着眼于技术主管和架构师在实现

《Linux设备驱动开发详解 A》一一第1章 Linux设备驱动概述及开发环境构建

第1章 Linux设备驱动概述及开发环境构建本章导读本章将介绍Linux设备驱动开发的基本概念,并对本书所基于的平台和开发环境进行讲解.1.1节阐明设备驱动的概念和作用.1.2节和1.3节分别讲解在无操作系统情况下和有操作系统情况下设备驱动的设计,通过对设计差异的分析,讲解设备驱动与硬件和操作系统的关系.1.4节对Linux操作系统的设备驱动进行了概要性的介绍,给出设备驱动与整个软硬件系统的关系,分析Linux设备驱动的重点.难点和学习方法.1.5节对本书所基于的QEMU模拟的vexpress

领域驱动设计和开发实战-住房贷款处理系统

本文先阐述领域驱动设计的基本概念,然后以住房贷款系统的需求为引线,一步一步实战讲解如何进行领域驱动设计的开发,文章来源与网上,先贴出与大家一起分享. 李锡远 2010-8-20   背景 领域驱动设计(DDD)的中心内容是如何将业务领域概念映射到软件工件中.大部分关于此主题的著作和文章都以Eric Evans的书<领域驱动设计>为基础,主要从概念和设计的角度探讨领域建模和设计情况.这些著作讨论实体.值对象.服务等DDD的主要内容,或者谈论通用语言.界定的上下文(Bounded Context)

15条小贴士助你成功开发一个小游戏

有太多的游戏都在还未开发完成的时候就被作者放弃了.独立游戏<安琪拉之歌>的作者Derek Yu这篇文章中列出了15条小贴士,讨论如何成功的去完成一款游戏.这些小贴士能够帮助广大的游戏开发者,认清开发过程中所遇到的问题,并讨论如何去解决它. 完成一款游戏 在我努力完成自己游戏期间,我一直在思考一般情况下如何完成项目.我已经注意到有很多优秀的开发人员对于完成游戏这件事都会遇到麻烦.说实话,我身后已经留下了一长串未完成的游戏...我想每个人都有.由于各种原因,不是每个项目都能有成果.但是如果你发现自

公版驱动还是品牌驱动?驱动人生给你最好选择

很多童鞋在安装驱动时会有不知道该安装公版驱动还是品牌驱动,不知道这两个类别的驱动应该适用于什么情况等等问题.此时,只要用驱动人生就能完美解决这个问题. 公版驱动程序就是芯片厂商按照公版设计编制的驱动程序,由芯片厂商发布,如nVIDIA的ForceWare驱动和AMD的催化剂驱动,公版驱动程序一般适合于所有采用该核心芯片的产品,所以既可以用在公版产品上,也可以用在非公版产品上. 而非公版驱动即品牌驱动,是产品厂商为其产品量身定做的驱动程序,由产品厂商发布,一般只能用在自己品牌的产品上. 换另一种说

公版驱动还是品牌驱动?驱动人生给您最好选择

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   很多童鞋在安装驱动时会有不知道该安装公版驱动还是品牌驱动,不知道这两个类别的驱动应该适用于什么情况等等问题.此时,只要用驱动人生就能完美解决这个问题.       公版 驱动程序就是芯片厂商按照公版设计编制的驱动程序,由芯片厂商发布,如nVIDIA的ForceWare驱动和AMD的催化剂驱动,公版驱动程序一般适合于所有采用该核心芯片的产品, 所以既可以用在公版产

使用DOJO开发定制小部件,第2部分

使用DOJO开发定制小部件,第2部分:使用通用的网格处理程序生成DOJO DataGrid组件 简介 我们为本系列开发的定制小部件是基于 DOJO 1.2.3,并已经使用 Mozilla Firefox 3.0.11 在 WebSphere Integration Developer V6.2 上的 Business Space V6.2 中测试过.但是,我们开发的通用框架概念也适用于不使用 Business Space 的 DOJO 应用程序.学习本系列需要具备 DOJO 和 iWidget