• 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
  • 微信公众号
您的位置:首页 > 程序设计 >嵌入式开发 > 我的PCI驱动程序执行完DriverEntry后直接进入到DriverUnload了

我的PCI驱动程序执行完DriverEntry后直接进入到DriverUnload了

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

佚名通过本文主要向大家介绍了driverentry,ntstatus driverentry,pci驱动程序下载,pci驱动程序,pci桥设备驱动程序等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 我的PCI驱动程序执行完DriverEntry后直接进入到DriverUnload了
描述:

驱动DriverEntryDriverUnload

问题:我的PCI驱动程序执行完DriverEntry后直接进入到DriverUnload了
我的DriverEntry函数内容如下:
NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT  DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
WDF_DRIVER_CONFIG config;
NTSTATUS status;
WDF_INTERRUPT_CONFIG interruptConfig;
WDFDEVICE control_device;
PDEVICE_CONTEXT deviceContext;
WDF_OBJECT_ATTRIBUTES attributes;
PWDFDEVICE_INIT device_init = NULL;
PDEVICE_OBJECT dev = NULL;
WDFDRIVER drv = NULL;//wdf framework 驱动对象 
UNICODE_STRING ustring;
WDF_IO_QUEUE_CONFIG ioQueueConfig;
WDF_FILEOBJECT_CONFIG f_config;
DEVICE_CONTEXT* dev_ctx = NULL;
WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
//
// Initialize WPP Tracing
//
DbgPrintEx(DPFLTR_DEFAULT_ID, DPFLTR_INFO_LEVEL, "this is in DriverEntry!\n");
//注册提供程序 GUID 并初始化内核模式驱动程序或用户模式应用程序中软件跟踪所需的结构
WPP_INIT_TRACING(DriverObject, RegistryPath);
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DRIVER_CONTEXT);
//对于一些对象,因为包含配置结构,因此需要先初始化配置结构,然后再调用创建函数
WDF_DRIVER_CONFIG_INIT(&config, //初始化配置结构,设置EvtDriverDeviceAdd例程地址
PCIdriverEvtDeviceAdd //为NULL表示不提供AddDevice函数
);
config.EvtDriverUnload = EvtDriverUnload;
status = WdfDriverCreate(DriverObject, //创建对象
RegistryPath,
WDF_NO_OBJECT_ATTRIBUTES,//&attributes,
&config,
WDF_NO_HANDLE//&drv,WdfDriverCreate把创建对象产生的句柄可选的返回给创建好的WDFDRIVER对象
);
if (!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, TRACE_DRIVER, "WdfDriverCreate failed %!STATUS!", status);
WPP_CLEANUP(DriverObject);
return status;
}
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Exit");
return status;
}
我的DriverUnload函数内容如下:
VOID EvtDriverUnload(
IN WDFDRIVER Driver)
{
KdPrint(("unload driver\n"));
KdPrint(("Doesn't need to clean up the devices, since we only have control device here\n"));
//遍历设备对象列表,删除设备,并删除符号链接
}
EvtDeviceAdd函数内容如下:
NTSTATUS
PCIdriverEvtDeviceAdd(
_In_    WDFDRIVER       Driver,
_Inout_ PWDFDEVICE_INIT DeviceInit
)
{
NTSTATUS status;
WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
UNICODE_STRING ustring;
WDF_FILEOBJECT_CONFIG f_config;
WDF_OBJECT_ATTRIBUTES attributes;
WDFDEVICE control_device;
WDF_IO_QUEUE_CONFIG ioQueueConfig;
WDF_INTERRUPT_CONFIG interruptConfig;
PDEVICE_CONTEXT deviceContext;
UNREFERENCED_PARAMETER(Driver);
PAGED_CODE();
TraceEvents(TRACE_LEVEL_INFORMATION, TRACE_DRIVER, "%!FUNC! Entry");
//设置I/O类型,采用WdfDeviceIoDirect方式,该函数必须在WdfDeviceCreate之前调用,否则系统会蓝屏并重新启动
WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect);
//status = PCIdriverCreateDevice(DeviceInit);
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
//注册即插即用基本例程
pnpPowerCallbacks.EvtDevicePrepareHardware = PCIDriverEvtDevicePrepareHardware;
pnpPowerCallbacks.EvtDeviceReleaseHardware = PCIDriverEvtDeviceReleaseHardware;
//注册驱动的即插即用和电源管理事件回调函数
pnpPowerCallbacks.EvtDeviceD0Entry = PCIDriverEvtDeviceDOEntry;
pnpPowerCallbacks.EvtDeviceD0Exit = PCIDriverEvtDeviceDOExit;
WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);
//用GPS_DEVICE_NAME来初始化UNICODE_STRING结构体ustring
RtlInitUnicodeString(&ustring, GPS_DEVICE_NAME);
//为设备指定一个名称,内核模式下,名字类似L"\\Device\\PCI_SZK"
status = WdfDeviceInitAssignName(DeviceInit, &ustring);
if (!NT_SUCCESS(status))
{
KdPrint(("WdfDeviceInitAssignName Fail\n"));
return status;
}
WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoDirect);
//配置FILEOBJECT配置文件,设置FILECREATE,FILECLOSE回调,这里最后一个参数为NULL,说明没有提供EvtFileCleanup回调
WDF_FILEOBJECT_CONFIG_INIT(&f_config, EvtDeviceFileCreate, EvtFileClose, NULL);
//将FILEOBJECT的设置记录到device_init中
WdfDeviceInitSetFileObjectConfig(DeviceInit, &f_config, WDF_NO_OBJECT_ATTRIBUTES);
//初始化设备对象特性结构
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);
//根据前面创建的device_init来创建一个设备
status = WdfDeviceCreate(&DeviceInit, &attributes, &control_device);//返回control_device中WDFDEVICE对象的句柄
if (!NT_SUCCESS(status)) {
return status;
}
//创建设备GUID接口
status = WdfDeviceCreateDeviceInterface(control_device, (LPGUID)&GUID_DEVINTERFACE_PCIdriver, NULL);
if (!NT_SUCCESS(status)) {
KdPrint(("Failed to create GUID interface\n"));
return status;
}
//初始化默认队列配置,KMDF会把所有读,写和设备I/O控制请求放入默认队列中
WDF_IO_QUEUE_CONFIG_INIT_DEFAULT_QUEUE(
&ioQueueConfig,
WdfIoQueueDispatchParallel //设置I/O请求分发方式为并行
);
ioQueueConfig.EvtIoDeviceControl = PCIdriverEvtIoDeviceControl;
ioQueueConfig.EvtIoStop = PCIdriverEvtIoStop;
ioQueueConfig.EvtIoWrite = PCIDriverEvtIoWrite;
ioQueueConfig.EvtIoRead = PCIDriverEvtIoRead;
status = WdfIoQueueCreate( //创建队列对象
control_device,
&ioQueueConfig,
WDF_NO_OBJECT_ATTRIBUTES,
NULL//&dev_ctx->_DefaultQueue
);
if (!NT_SUCCESS(status)) {
TraceEvents(TRACE_LEVEL_ERROR, TRACE_QUEUE, "WdfIoQueueCreate failed %!STATUS!", status);
return status;
}
//创建符号连接,这样用户模式下的程序可以使用这个驱动。
//这个是必须的,不然用户模式下的程序不能访问这个设备。
RtlInitUnicodeString(&ustring, GPS_SYMBOL_NAME);
status = WdfDeviceCreateSymbolicLink(control_device, &ustring);
if (!NT_SUCCESS(status))
{
KdPrint(("Failed to create Link\n"));
return status;
}
WdfControlFinishInitializing(control_device); //创建设备完成
deviceContext = GetDeviceContext2(control_device);
//设置中断服务例程和延迟过程调用
WDF_INTERRUPT_CONFIG_INIT(&interruptConfig,
PCIDriverEvtInterruptIsr,
PCIDriverEvtInterruptDpc);
//创建中断对象
status = WdfInterruptCreate(control_device,
&interruptConfig,
WDF_NO_OBJECT_ATTRIBUTES,
&deviceContext->Interrupt);
if (!NT_SUCCESS(s
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

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

  • 我的PCI驱动程序执行完DriverEntry后直接进入到DriverUnload了
  • 高分请教ntStatus为c0000010STATUS_INVALID_DEVICE_REQUEST的原因?

相关文章

  • 2017-06-05 关于ISE中NGC文件调用
  • 2017-06-05 求助大神,用LCD1602显示AD0804采集的湿度传感器的数据,显示的数据发生跳变
  • 2017-06-05 shell脚本shell脚本中关于$的问题
  • 2017-06-05 嵌入开发该掌握哪些基础呢
  • 2017-06-05 VS2008下开发Windowsce程序,无法加载SystemDataSqlClient类
  • 2017-06-05 无法识别的USB设备
  • 2017-06-05 全志A20电阻屏调试
  • 2017-06-05 如何从软件中提取与硬件有关的信息??
  • 2017-06-05 wince60CreateThead后,实际并没有执行线程里的程序
  • 2017-06-05 wince,引用webservice,出现服务器无法处理请求,未将对象引用设置到对象的实例。

文章分类

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

最近更新的内容

    • 如何在linux局域网内搭建一个dns服务,将主机名解析为ip?
    • ARM的JTAG接口
    • 还没搞定的问题,大家来研究研究呗?!
    • 使用ipxe+iscsi搭建的无盘工作站,多个终端使用同一个镜像,启动后计算机重名。
    • 如何向非计算机专业的人解释“TCP/IP状态机”?
    • VS2008开发了一个ADO的访问SQLSERVERCE的程序,用的是CVOConnection和CVORecordset类我修改过在WinCE35
    • WDK80+VS2012编译驱动的问题
    • WINCE6我的设备无法打开
    • arm上运行标准C程序失败的问题
    • CC2530程序烧写,显示ErrorinHEXfileverification

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

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