Win驱动开发
Vinx911
这个作者很懒,什么都没留下…
展开
-
IRP structure
UID: NS:wdm._IRP title: “_IRP” author: windows-driver-content description: The IRP structure is a partially opaque structure that represents an I/O request packet. Drivers can use the following m...翻译 2018-07-14 23:06:26 · 436 阅读 · 0 评论 -
Windows驱动开发(7) - DEVICE_OBJECT结构体
Windows驱动开发(7) - DEVICE_OBJECT结构体typedef struct _DEVICE_OBJECT { CSHORT Type; USHORT Size; LONG ReferenceCount; struct _DRIVER_OBJECT原创 2016-05-07 21:02:01 · 2272 阅读 · 0 评论 -
Windows驱动开发报错集锦
报错:error LNK2001: unresolved external symbol ___security_cookieerror LNK2001: unresolved external symbol ___security_cookieerror LNK2001: unresolved external symbol ___security_cookieerror LNK2001:原创 2017-01-17 10:17:29 · 522 阅读 · 0 评论 -
Windows驱动开发(9) - IRP结构体
Windows驱动开发(9) - IRP结构体typedef struct _IRP { PMDL MdlAddress; ULONG Flags; union { struct _IRP* MasterIrp; PVOID SystemBuffer; } AssociatedIrp; IO_原创 2016-06-22 16:45:14 · 1725 阅读 · 0 评论 -
SetupDiGetDeviceInterfaceDetail
SetupDiGetDeviceInterfaceDetail该函数返回设备接口的详细信息。BOOL SetupDiGetDeviceInterfaceDetail( _In_ HDEVINFO DeviceInfoSet, _In_ PSP_DEVICE_INTERFACE_DATA DeviceInte原创 2016-07-14 17:58:59 · 4833 阅读 · 0 评论 -
Windows Kernel&Driver FQA
Q:error LNK2019: unresolved external symbol @__security_check_cookie@4 referenced in function __woutput error LNK2001: unresolved external symbol @__security_check_cookie@4 A:产生上述错误主要是vs为了防止缓冲区益出,提高安原创 2016-07-01 16:39:44 · 381 阅读 · 0 评论 -
驱动开发中使用安全字符串函数
转自:http://www.cppblog.com/sleepwom/archive/2009/09/27/97402.html驱动开发中使用安全字符串函数一、前言 大量的系统安全问题是由于薄弱的缓冲处理以及由此产生的缓冲区溢出造成的,而薄弱的缓冲区处理常常与字符串操作相关。 c/c++ 语言运行库提供的标准字符串操作函数( strcpy, strcat, sprintf 等)不能阻止在超出字符串转载 2016-07-01 16:34:15 · 725 阅读 · 0 评论 -
Windows驱动开发(11) - 驱动程序的同步处理(二)
Windows驱动开发(11) - 驱动程序的同步处理(二)3、自旋锁自旋锁也是一种同步机制,它能保证某个资源只能被一个线程所拥有,这种保护被形象地称做“上锁”。3.1 原理 在Windows内核中,有一种被称为自旋锁(Spin Lock)的锁,它可以用于驱动程序中的同步处理。初始化自旋锁时,处理解锁状态,这时它可以被程序“获取”。“获取”后的自旋锁处理于锁定状态,不能再被“获取”。如果自旋锁已被原创 2016-06-30 01:15:22 · 769 阅读 · 0 评论 -
自旋锁代替互斥锁的实践
自旋锁和互斥锁是多线程程序中的重要概念。 它们被用来锁住一些共享资源, 以防止并发访问这些共享数据时可能导致的数据不一致问题。 但是它们的不同之处在哪里? 我们应该在什么时候用自旋锁代替互斥锁?理论分析从理论上说, 如果一个线程尝试加锁一个互斥锁的时候没有成功, 因为互斥锁已经被锁住了, 这个未获取锁的线程会休眠以使得其它线程可以马上运行。 这个线程会一直休眠, 直到持有锁的线程释放了互斥锁, 休眠转载 2016-06-11 17:22:22 · 373 阅读 · 0 评论 -
Driver 加载步骤
Driver 加载步骤1)当硬件连接到PC或从PC移除时,在硬件上会有信号跳变,BUS Driver会检测到器件的插入和移除,比如DVI的hotplug,再比如USB1.1的1.5K上拉。BUS Driver将调用IOInvalidateDevcieRelations,PNP Manager将知道BUS上的Device关系有所改变。2)为了获得新的Device关系,PNP Manager将调用IRP转载 2018-01-01 12:28:58 · 1429 阅读 · 0 评论 -
IoGetDeviceProperty 例程
IoGetDeviceProperty 例程 IoGetDeviceProperty例程检索有关设备的信息, 如配置信息和其 PDO 的名称。语法NTSTATUS IoGetDeviceProperty( _In_ PDEVICE_OBJECT DeviceObject, _In_ DEVICE_REGISTRY_PROPERTY DevicePro原创 2017-12-26 16:49:10 · 2777 阅读 · 0 评论 -
c0000005 Access Violation
出现这种错误原因总结:1. 指针异常。引用指针前判断指针是否为空2. 数据越界。一个典型例子,char ValueName[256];strncpy(ValueName,&value->Name,value->NameLength);value->NameLength 大于了256,致使ValueName访问越界,崩溃顺便记录崩溃调试的方法...转载 2018-07-14 15:15:27 · 5403 阅读 · 0 评论 -
IRP_MN_QUERY_DEVICE_TEXT
IRP_MN_QUERY_DEVICE_TEXTThe PnP manager uses this IRP to get a device’s description or location information. PnP 管理器使用此 IRP 获取设备的描述或位置信息。Bus drivers must handle this request for their child devic...翻译 2018-06-23 22:13:32 · 358 阅读 · 0 评论 -
IRP_MN_SET_LOCK
IRP_MN_SET_LOCKBus drivers must handle this IRP for their child devices (child PDOs) that support device locking. Function and filter drivers do not handle this request. 总线驱动程序必须为支持设备锁定的子设备 (子 PDOs...翻译 2018-06-22 11:42:05 · 194 阅读 · 0 评论 -
IoRegisterDeviceInterface例程
IoRegisterDeviceInterface例程IoRegisterDeviceInterface例程注册设备接口类(如果以前未注册), 并创建接口类的新实例, 驱动程序随后可以启用应用程序或其他系统组件。语法NTSTATUS IoRegisterDeviceInterface( _In_ PDEVICE_OBJECT PhysicalDeviceObject,原创 2017-12-26 17:31:02 · 1460 阅读 · 0 评论 -
IoOpenDeviceInterfaceRegistryKey例程
IoOpenDeviceInterfaceRegistryKey例程 IoOpenDeviceInterfaceRegistryKey例程返回一个注册表项的句柄, 用于存储有关特定设备接口实例的信息。语法NTSTATUS IoOpenDeviceInterfaceRegistryKey( _In_ PUNICODE_STRING SymbolicLinkName, _In_ ACCES原创 2017-12-26 17:01:34 · 349 阅读 · 0 评论 -
IoOpenDeviceRegistryKey例程
IoOpenDeviceRegistryKey例程 IoOpenDeviceRegistryKey例程返回特定设备实例的特定于设备或特定于驱动程序的注册表项的句柄。语法 NTSTATUS IoOpenDeviceRegistryKey( _In_ PDEVICE_OBJECT DeviceObject, _In_ ULONG DevInstKeyType, _In原创 2017-12-26 17:14:41 · 820 阅读 · 0 评论 -
IRP结构体之Flag成员
IRP_NOCACHE //表示I/O请求从存储的媒介而不是高速缓存中读取数据IRP_PAGING_IO //表示此时执行内存页的I/O操作IRP_MOUNT_COMPLETION //卷挂载操作完成IRP_SYNCHRONOUS_API //该操作是一个同步分页I/O操作。IRP_ASSOCIATED_IRP原创 2016-06-08 21:19:02 · 1303 阅读 · 0 评论 -
解决KeSetTimer定时精度不够方法
KeSetTimer定时精度是因为windows系统的时钟分辨率仅为15ms,由于播出软件只是一个应用程序,十分依赖它的运行环境—操作系统。因此不得不提及Windows操作系统的时间片和时钟分辨率。 软件经常使用的API函数GetTickCount () 返回自系统启动以来的ms数,由于系统分辨率的限制,那么返回的只能是15.625ms的整数倍,这就是操作系统的时钟分辨率的概念。操作系统的时钟分辨转载 2016-05-22 13:09:57 · 3434 阅读 · 0 评论 -
内核延时的N种方法
方法一:NdisMSleepVOID NdisMSleep( IN ULONG MicrosecondsToSleep );直接调用NdisMSleep,它的参数是微秒数量级。不过这里一定要注意调用环境:KeGetCurrentIrql < DISPATCH_LEVEL方法二:NdisStallExecutionVOID NdisStallExecution( IN U转载 2016-05-22 01:19:28 · 5197 阅读 · 0 评论 -
中断处理
此部分内容参考《Windows驱动开发技术详解》第16章 16.6.2 首先在获得PCI配置空间资源的时候,就要获得中断资源,根据CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的 Type 域来区分需要获得什么样的中断资源的时候,如果Type类型为:CmResourceTypeInterrupt,此时需要将中断资源从CM_PARTIAL_RESOURCE_DESCRIPTOR中转载 2016-05-26 12:08:52 · 687 阅读 · 0 评论 -
Windows驱动开发(5) - 内核模式下的注册表操作
Windows驱动开发(5) - 内核模式下的注册表操作1、创建关闭注册表1.1 创建注册表NTSTATUS ZwCreateKey( _Out_ PHANDLE KeyHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttri原创 2016-04-17 20:31:15 · 1753 阅读 · 0 评论 -
Windows驱动开发(4) - 内核模式下的文件操作
Windows驱动开发(4) - 内核模式下的文件操作1、文件的创建NTSTATUS ZwCreateFile( _Out_ PHANDLE FileHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_原创 2016-04-16 07:48:24 · 1590 阅读 · 0 评论 -
Ntddk.h 和 Ntifs.h同时包含时的重复定义问题
Wdm.h、Ntddk.h 和 Ntifs.h 的组织结构在 Windows Vista 版本的 WDK 之前,用于驱动程序开发的主要头文件为 Wdm.h、Ntddk.h 和 Ntifs.h,它们包含很多重复声明。 从 Windows Vista 版本的 WDK 开始,Wdm.h、Ntddk.h 和 Ntifs.h 将按层次结构来组织并且不包含重复信息。上层的文件将包含下层的文件。每个函数和结构声原创 2016-04-27 10:45:36 · 3571 阅读 · 0 评论 -
Windows驱动开发(2) - Windows内存管理
Windows驱动开发(2) - Windows内存管理1、内存管理概念1.1 物理内存32位的CPU的寻址能力为4GB(2^32)个字节。用户最多可以使用4GB的真实物理内存。PC中的很多设备都提供了自己的设备内存,这部分的内存会映射到PC的物理内存上。1.2 虚拟内存Windows的所有程序(ring0,ring3),可以操作的都是虚拟内存。CPU中寄存器CR0一个位PG位来告诉系统是否分页的。原创 2016-04-10 21:30:23 · 3068 阅读 · 2 评论 -
Windows驱动开发(1) - 驱动程序结构
Windows驱动开发(1) - 驱动程序结构1、NT式1.1 头文件 Driver.h头文件中包含了开发NT式驱动所需要的NTDDK.h,此外还定义了几个标志来指明函数和变量分配在分页内存还是非分页内存中。Windows驱动程序的入口函数是DriverEntry函数。WDM式的驱动程序要导入的头文件是WDM.h。 说明: 1)采用C++编程,所以需要用extern “C”,因为我们导入的原创 2016-04-10 15:07:01 · 2037 阅读 · 0 评论 -
VS2013 + WDK7.6搭建驱动开发环境
1、下载安装VS2013、WDK7.6VS2013:https://www.visualstudio.com/zh-cn/downloads/download-visual-studio-vs.aspxWDK7.6:https://msdn.microsoft.com/zh-cn/windows/hardware/hh852365.aspx连这安装就不用说了吧,连这都搞不定,就放弃吧!!!2原创 2016-04-10 15:01:14 · 15720 阅读 · 0 评论 -
一个差点被IoGetDeviceObjectPointer搞死的菜鸟
一个差点被IoGetDeviceObjectPointer搞死的菜鸟 最近被迫学习Windows驱动开发(有多少人跟我一样不是主动去学的),感觉有所得之后就写了个读取PCI配置信息的小小小小的驱动,结果。。。。。。。。。。。。成功了。当然要是真的成功了下面的内容就没有意义了。一次幸运的手贱,我把测试程序同时打开了好多个,于是系统很光荣的牺牲了。 。。。。。。 //此处省略N次摧残系统的原创 2016-04-13 22:00:17 · 2429 阅读 · 0 评论 -
关于《Windows驱动开发技术详解》第16章 16.6例子中一个问题
《Windows驱动开发技术详解》第16章 16.6例子中,BOOLEAN OnInterrupt(PKINTERRUPT InterruptObject, PDEVICE_EXTENSION pdx){ // OnInterrupt //关中断 UCHAR HSR = READ_PORT_UCHAR(pdx->portbase原创 2016-05-26 12:19:07 · 542 阅读 · 0 评论 -
PCI9054的DMA传输过程
通过设置其DMA控制器内部的寄存器即可实现两总线之间的数据传输。PCI9054的DMA传输过程可由以下几个步骤实现: 1)设置方式寄存器:设置DMA通道的传输方式,寄存器DMAMODE0或者DMAMODE1; 2)设置PCI地址寄存器:设置PCI总线侧的地址空间起始地址; 3)设置LOCAL地址寄存器:设置LOCAL总线侧的地址空间起始地址; 4)设置传输计数转载 2016-05-26 16:58:46 · 3456 阅读 · 0 评论 -
Windows 驱动中获取指定的设备对象
转载自:http://tudian2007.blog.163.com/blog/static/3156641320137295338938/Windows 驱动中获取指定的设备对象 众所周知应用层要和驱动层通讯的话需要先打开驱动设备对象,因为驱动设备名只是对内核模式中的驱动所识别的,应用层是无法识别的,所以一般驱动都有对应的symboliclink供应用层用使用的,如”\\.\C:”,”\??\C转载 2016-06-07 22:53:14 · 6383 阅读 · 0 评论 -
Windows驱动开发(10) - 驱动程序的同步处理(一)
Windows驱动开发(10) - 驱动程序的同步处理(一)1、基本概念1.1 可重入与不可重入可重入,是指函数的执行结果不和执行顺序有关。反之,如果执行结果和执行顺序有关,则称这个函数是“不可重入”的。1.2 同步与异步1) 同步就是指一个线程要等待上一个线程执行完之后才开始执行当前的线程。 2) 异步是指一个线程去执行,它的下一个线程不必等待它执行完就开始执行2、中断请求级在Windows的原创 2016-06-24 10:04:45 · 1362 阅读 · 0 评论 -
关于驱动和设备的相关的注册表键的位置,和相关信息
关于驱动和设备的相关的注册表键的位置,和相关信息MSDN上有了: https://msdn.microsoft.com/en-us/library/windows/hardware/ff549815(v=vs.85).aspx下面是大概翻译整理: 操作系统会将设备和驱动的一些相关重要信息存储进注册表中。 注意:一般驱动程序不允许直接访问以下提到的注册表目录项和键。1. 设备和驱动的注册表树以下转载 2016-06-07 15:33:31 · 12882 阅读 · 0 评论 -
Windows驱动开发(8) - 派遣函数
Windows驱动开发(8) - 派遣函数1、IRP和派遣函数 驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的。用户模式下所有对驱动程序的I/O请求,全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP数据会被“派遣”到不同的派遣函数(Dispatch Function)中。1.1 IRP IRP(I/O request packet)有两个属性,一个是M原创 2016-05-17 13:20:16 · 858 阅读 · 0 评论 -
中断处理 - IoConnectInterrupt和中断处理例程
由于PCI设备的多样化,而系统的中断数量是有限的。所以采用多个设备共用一个中断号。在获取到中断后,操作系统会询问这条中断线上的所以设备。设备通过查询中断寄存器就可以知道是不是自己的中断,如果不是则在中断处理例程中返回FALSE,如果是则处理并返回TRUE。 在操作系统收到IRP_MN_START_DEVICE请求时,PDO会获取到中断相关的资源。参考例子如下:NTSTATUS GetPciReso原创 2016-05-30 01:48:06 · 3003 阅读 · 1 评论 -
中断处理程序中输出调试信息导致无法计算机无法启动
中断处理程序中输出调试信息导致无法计算机无法启动BOOLEAN OnInterrupt(PKINTERRUPT InterruptObject, PDEVICE_EXTENSION pExtension){ // OnInterrupt DisableInterrupt(pExtension); KdPrint(("=======原创 2016-05-29 19:09:31 · 294 阅读 · 0 评论 -
分页内存与非分页内存
Windows规定有些虚拟内存可以交换到文件中,这类内存被称为分页内存 有些虚拟内存 永远不会交换到文件中,这些内存叫非分页内存#define PAGEDCODE code_seg(“PAGE”);//分页内存#define LOCKEDCODE code_seg();//非分页的#define INITCODE code_seg(“INIT”);#define PAGEDDATA d原创 2016-05-29 16:09:02 · 1227 阅读 · 0 评论 -
Windows驱动开发(6) - DRIVER_OBJECT结构体
Windows驱动开发(6) - DRIVER_OBJECT结构体typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; PDEVICE_OBJECT DeviceObject; ULONG Flags; PVO原创 2016-05-04 15:50:12 · 4103 阅读 · 0 评论 -
Windows驱动开发(3) - 内核模式下的字符串操作
Windows驱动开发(3) - 内核模式下的字符串操作1、ASCII字符串和宽字符串 char型,记录ansi字符集。每个字符一个字节。以0标志结束。在KdPrint中用%s输出。 宽字符型,wchar_t,描述unicode字符集的字符串,每个字符两个字节,以0标志结束。通过L来体现。在KdPrint中用%S输出。CHAR *string = "Hello";WCHAR *string原创 2016-04-11 22:35:24 · 3294 阅读 · 1 评论