首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于WDF的PCIPCIe接口卡Windows驱动程序(2)-开发者需要了解的WDF中的一些重要的概念

在用户模式下运行的处理器无法访问为该操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改并且可能损坏关键的操作系统数据; 2、在内核模式下运行的所有代码都共享单个虚拟地址空间。...如果框架可以处理IRP,则不会涉及到KMDF驱动程序;如果框架处理不了就通过调用KMDF驱动程序来实现事件处理程序来获取帮助; 10、WDK中的头文件包含的条件语句指定编程元素仅在某些版本的Windows...好吧,还没有写完~ 1、创建驱动程序时,可以指定Windows 7为基本的目标操作系统,在这种情况下,驱动程序会在Win7或更高的Windows上运行; 2、KMDF为驱动程序提供基于对象的接口,对象接口包括...一个用于驱动程序,另一个用于驱动程序包; 10、内核模式下的驱动程序在从用户地址中读取或写入这些地址时必须非常小心!...中断由此线程上运行的内核驱动程序进行处理; 4)驱动程序不得将数据写入用户应用程序在1)中提供的地址,此地址位于发起请求的进程的虚拟地址空间,该进程很大可能不同于当前进程。

1.8K20

浅说驱动程序的加载过程

众所周知,Windows操作系统将程序划分为用户模式和内核模式,在x86计算机上,用户模式的程序运行在Ring3,而内核模式的程序运行在Ring0。...从应用程序的角度来看,操作系统提供的函数接口是相当丰富的,甚至很少有人知道windows提供的API的确切的数目。...可是从Hacking的角度来看,API提供的功能却是远远不能满足Hacker们的好奇心的。操作系统对于用户模式与内核模式的划分,本意自然是出于维持系统稳定的目的,可某些时候我们并不领情。 ?...但观察代码可以发现,这段代码竟然试图访问地址0。这要是在用户模式,这个程序肯定被Windows无情的终止掉。但这段代码最终是在内核模式作为驱动程序运行的。...通常我们把那些用户级的后台程序也称为服务,但是此服务非彼服务也。服务可以用用户模式程序提供,也可以由内核驱动提供,所以微软将其统称为服务也未尝不可。调用成功后,我们获得SCM的操作句柄。

2.9K90
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    CVE-2023-21768 内核提权漏洞分析

    AFD (Ancillary Function Driver)是Windows操作系统中的一个内核模式驱动程序,它也是套接字(Socket) 通信的核心模块之一。...它提供了操作系统与网络协议栈之间的接口,让应用程序能够进行网络通信。支持WinSock,而WinSock是在Windows中访问网络服务的编程接口。...(ProbeForWrite 的作用是检查用户模式缓冲区是否实际驻留在地址空间的用户模式部分、是否可写以及是否正确对齐。...这张表包含了AFD驱动程序的调度例程,里面的函数都是AFD驱动程序的调度函数。调度例程用于通过调用DeviceIoControl来处理来自Win32应用程序的请求。...然后就会去探测从用户模式发送的数组中的每个条目,以验证所请求的缓冲区完全处于用户模式,然后将其复制到内核数组中去。 旧的内核数组(如果存在的话)被释放,操作完成。

    1.2K10

    (四)内存管理

    Windows的核心代码和Windows的驱动程序加载的位置都是在高2GB的内核地址中。...Windows操作系统在进程切换时,保持内核态地址是完全相同的,即所有进程的内核地址映射完全一致,进程切换时只改变用户模式地址的映射。 4....Windows驱动程序和进程的关系 驱动程序类似于一个DLL,被应用程序加载到虚拟内存中,只不过加载地址是内核地址。它能访问的只是这个进程的虚拟内存,不能访问其他进程的虚拟地址。...当需要加载的时候,这个进程中会有一个线程将驱动程序加载到内核模式地址空间内,并调用DriverEntry例程。 其他的例程,如IRP的派遣函数会运行于应用程序的“上下文”中。...但是栈空间不会像应用程序那么大,所以驱动程序不适合递归调用或者局部变量是大型结构体。如果需要大型结构体,需要在堆(Heap)中申请。

    1.6K30

    Linux系统结构详解

    如图: 图1 系统调用接口:SCI 层提供了某些机制执行从用户空间到内核的函数调用。这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。...SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。 1....为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ....每一个用户进程运行时都好像有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。...从用户空间到内核空间有两种触发手段: 1.系统调用: 用户空间的应用程序,通过系统调用,进入内核空间。

    1K20

    一文让你深度了解Linux内核架构和工作原理

    作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。2.从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。...(1)系统调用接口SCI 层提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。...SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。...,用户的应用程序,C库(2)内核空间:内核空间包括,系统调用,内核,以及与平台架构相关的代码2.Linux体系结构要分成用户空间和内核空间的原因:1)现代CPU通常都实现了不同的工作模式,以ARM为例:...想象一下,如果您可以升级到Windows服务包,而不需要重新启动……内核模块如果Windows已经安装了所有可用的驱动程序,而您只需要打开所需的驱动程序怎么办?这本质上就是内核模块为Linux所做的。

    91710

    深度:一文看懂Linux内核!Linux内核架构和工作原理详解

    Linux内核的任务: 从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。...从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。在实际工作中内核抽象了相关细节。 内核是一个资源管理程序。...(1)系统调用接口 SCI 层提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。...SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。...想象一下,如果您可以升级到Windows服务包,而不需要重新启动…… 内核模块 如果Windows已经安装了所有可用的驱动程序,而您只需要打开所需的驱动程序怎么办?

    2.8K31

    Windows内核原理-同步IO与异步IO

    同时通过理解windows内核原理,设计出更好、更合理的应用程序。 I/O I/O即输入输出。在现在操作系统,输入输出是计算机完整功能必不可少的一部分。...而应用程序通过统一的接口与系统内核进行交互。 Windows从一开始就设计了可扩展的I/O接口。在应用层通过统一的Win32 API,将I/O请求分配给正确的设备驱动程序。...设备驱动程序调用设备控制器来操控硬件。而内核通过硬件抽象层与硬件进行交互。硬件抽象层提供了供内核和驱动调用的例程。 例程就是系统提供的API或服务。 在Windows下分为内核模式和用户模式。...应用程序运行在用户模式下,操作系统和驱动程序运行在内核模式下。应用程序通过调用Win32 API与Windows内核交互。...可提醒I/O 在系统创建线程的时候会创建一个与线程相关的队列,该队列被称为异步调用(APC)队列,当发出一个I/O请求时,我们可以告诉设备驱动程序在调用线程的APC队列中添加一项完成函数,在I/O完成通知时调用完成函数进行回调

    1.8K10

    Linux系统结构详解

    如图: 图1 系统调用接口:SCI 层提供了某些机制执行从用户空间到内核的函数调用。...这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ....为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ....每一个用户进程运行时都好像有一份内核的拷贝,每当用户进程使用系统调用时,都自动地将运行模式从用户级转为内核级,此时进程在内核的地址空间中运行。...从用户空间到内核空间有两种触发手段: 1.系统调用: 用户空间的应用程序,通过系统调用,进入内核空间。

    68330

    《CLR via C#》笔记:第5部分 线程处理(2)

    调用FileStream 的 Read方法时,你的线程从托管代码转变为本机/用户模式代码, Read内部调用Win32 ReadFile 函数(①)。...然后,ReadFile 将你的线程从本机/用户模式代码转变成本机/内核模式代码,向内核传递IRP数据结构,从而调用Windows内核(③)。...根据IRP中的设备句柄,Windows 内核知道I/O操作要传送给哪个硬件设备。因此,Windows将IRP传送给恰当的设备驱动程序的IRP队列(④)。...现在,硬件设备将执行请求的1/O操作(⑤)。 最终,硬件设备会完成IO操作。然后,Windows 会唤醒你的线程,把它调度给一个CPU,使它从内核模式返回用户模式,再返回至托管代码(⑦,⑧和⑨)。...事实上,Windows Runtime没有提供以同步方式执行IO操作的任何API。幸好,可以使用C#的异步函数功能简化调用这些API时的编码。

    1.1K40

    Win10下VS2015(WDK10)驱动开发环境配置

    从Windows 2000开始,开发驱动程序必以WDM(Windows Driver Model)为基础的,但是,如果使用DDK来开发WDM,其开发难度之大,根本不能奢望像用户模式应用程序开发那样容易,...2、用户模式驱动程序 UMDF(User-Mode DriverFramework): 这类驱动程序通常提供 Win32 应用程序与内核模式驱动程序或其他操作系统组件之间的接口。...3、 用户模式和内核模式 运行 Windows 的计算机中的处理器有两个不同模式:“用户模式”和“内核模式”。根据处理器上运行的代码的类型,处理器在两个模式之间切换。...应用程序在用户模式下运行,核心操作系统组件在内核模式下运行。多个驱动程序在内核模式下运行时,某些驱动程序可能在用户模式下运行。...限制用户模式应用程序的虚拟地址空间可防止应用程序更改并且可能损坏关键的操作系统数据。 在内核模式下运行的所有代码都共享单个虚拟地址空间。这表示内核模式驱动程序未从其他驱动程序和操作系统自身独立开来。

    4.5K62

    Linux驱动开发概述

    除了网络设备外,字符设备和块设备的驱动程序都被映射到文件系统中,通过调用open、read、write、close就能访问。...比如ARM的七种工作模式: 用户模式(usr)绝大多数应用程序运行在此模式 快速中断模式(fiq)用于高速数据传输 外部中断模式(irp)用于通用中断处理 管理模式(svc) 数据访问模式(abt) 系统模式...(sys) 未定义指令终止模式(und) ARM+Linux采用SWI,从usr模式进入svc模式;x86处理器包含4个不同的特权级(0-3)下,Linux的用户代码运行在特权级3,系统内核运行在特权级...0 Linux只能通过系统调用或者硬件中断完成从用户空间到内核空间的控制转换。...内核的编译与加载 在linux内核中增加程序需要完成以下3项工作: 将代码加入到linux的相应目录; 在目录的Kconfig中加入相应的编译配置选项; 在目录的Makefile中增加新项目的编译条目。

    2.7K20

    Hook技术解析

    执行系统调用的时候,CPU将从用户模式切换到内核模式,进入内核后,将会根据系统调用的API编号,去找到对应的系统服务函数,实现对应API的功能。...Windows上的SSDT向来是兵家必争之地,安全软件为了监控应用程序的行为,通常都会替换SSDT表格中的系统服务函数地址为它们的函数。...当系统调用触发时,安全软件将会及时知晓,并通过应用程序的参数来判定是否“放行”这次调用。 IDT HOOK 内核中除了记录系统服务的SSDT,还有一个非常重要的表格:中断描述符表IDT。...IRP HOOK 在Windows系统上,用户程序和内核驱动之间的交互是通过一种称为IRP的数据结构实现的,你可以简单将其理解为应用程序发送了一个消息下去,这个消息就是一个IRP。...Windows内核中提供了驱动设备的挂载操作,允许别的驱动程序对指定设备进行挂载,从而可以截获发送给该设备的“消息”,这种HOOK方式被称为IRP HOOK。 ?

    3K10

    黑客用这项技术攻击你的电脑!

    执行系统调用的时候,CPU将从用户模式切换到内核模式,进入内核后,将会根据系统调用的API编号,去找到对应的系统服务函数,实现对应API的功能。...Windows上的SSDT向来是兵家必争之地,安全软件为了监控应用程序的行为,通常都会替换SSDT表格中的系统服务函数地址为它们的函数。...当系统调用触发时,安全软件将会及时知晓,并通过应用程序的参数来判定是否“放行”这次调用。 IDT HOOK 内核中除了记录系统服务的SSDT,还有一个非常重要的表格:中断描述符表IDT。...IRP HOOK 在Windows系统上,用户程序和内核驱动之间的交互是通过一种称为IRP的数据结构实现的,你可以简单将其理解为应用程序发送了一个消息下去,这个消息就是一个IRP。...Windows内核中提供了驱动设备的挂载操作,允许别的驱动程序对指定设备进行挂载,从而可以截获发送给该设备的“消息”,这种HOOK方式被称为IRP HOOK。 ?

    62530

    Linux 中的用户模式和内核模式是什么含义?

    Linux 中的用户模式和内核模式是什么含义?1. 引言在 Linux 系统中,用户模式和内核模式是操作系统的两种不同运行模式。...内核模式下的操作系统还可以通过驱动程序接口向硬件设备请求服务。4. 区别与联系用户模式和内核模式在权限、资源访问和运行环境等方面存在明显的区别,但它们之间也有紧密的联系。...4.1 权限用户模式下的应用程序运行在较低的权限级别,无法直接访问系统资源和硬件设备。而内核模式下的操作系统具有更高的权限,可以访问系统中的所有资源。...这种运行环境的划分可以有效地降低应用程序与操作系统之间的耦合度,提高系统的可维护性和可扩展性。5. 运行原理Linux 系统中的用户模式和内核模式的运行原理主要体现在操作系统的系统调用机制上。...在实际项目中,合理地使用用户模式和内核模式可以降低代码的耦合度,实现代码的解耦,提高代码的可维护性和可扩展性。

    1.2K00

    内核攻防-(2)致盲EDR

    功能描述 在内核模式下执行内存读写操作,用于在同一进程内复制内存数据。...的内存操作机制,这在驱动开发中有以下典型用途: 内存读写工具 用户模式程序通过 IOCTL 调用该函数,向驱动请求读写当前进程的特定内存区域。...这通常用于开发调试工具或与进程交互的应用程序。 内核态内存编辑 函数内部调用了 MmCopyVirtualMemory,可以用于直接操作进程的虚拟内存空间。...通过计算目标函数在用户态加载的模块中的偏移,再加上实际的内核模块基地址,最终得到函数在内核空间中的真实地址。...判断是否为 EDR 回调: 检查回调函数所属的驱动程序名称是否属于已知的 EDR 驱动(通过 IsEDRHash 函数)。

    6100

    驱动程序的同步处理

    在Windows中中断请求级别有32个,但是在编程或者在MSDN上只需要关心两类级别,PASSIVE_LEVEL:用户级别,这个中断级别最低。DISPATCH_LEVEL:级别相对较高。...DISPATCH_LEVEL NDIS回调函数 DISPATCH_LEVEL 在内核模式中可以调用KeGetCurrentIrql得到当前的IRQL 需要注意的是,线程优先级只针对于应用程序,只有在...本质上用户层和内核层的事件对象是同一个东西,在用户层用句柄代替,看不到它的具体结构,在内核层是一个KEVENT,能知道它的具体数据成员。...在驱动B中调用ObReferenceObjectByHandle根据上面两个函数返回的句柄来获取A中的事件对象,并操作它 4....在Windows中为一些常用的操作定义了一组互锁操作函数

    1.4K10

    一个来自fairgame.co 的逆向工具(1)

    1.png CPL3 ---- 我的大部分逆向工程都是在内核内部完成的,只是在最后我查看了用户模式可执行文件。让我们从购买后提供给用户的可执行映像开始。我注意到的第一件事是这个应用程序的大小。...该作弊提供商加载到内核中的第一个映像是一个驱动程序,该驱动程序使用他们购买的证书进行签名。...开发人员对这种作弊的缺乏经验真的开始显现出来。无需进行单个函数调用即可获得内核的基址。...更有趣的是,这两个函数都通过IOCTL暴露给用户模式。...经过进一步分析,很明显,win32kbase.sys 充当 dxgkrnl.sys 导出的巨大虚拟表,可以通过将指针更改为您想要的任何内容来轻松操作,从而允许您使用任意数量的参数调用内核中的任何函数.

    1.7K510

    Windows内核开发-3-内核编程基础

    内核的API由C构成,本质上内核开发和用户态开发非常相似,但是还是有一些不同,比如: User Mode Kernel Mode Unhandled Exception未处理异常 未处理异常会导致进程崩溃...可以使用绝大部分的C/C++库(例如stl这中) 绝大部分不能用 Exception Handleing异常的句柄 可以用C/C++里面的异常也可以使用SEH(Windows中的) 只能用SEH C+...这个其实导致的最重要的就是Kdprint可以使用了,在debug版本下Kdprint会调用dbgprint来输出信息,但是在release就会忽略掉kdprint这个函数。...3 The Kernel API 内核API 写的内核驱动程序可以使用已经存在的一些内核组件中提供的API,这个函数被称为内核API。...一些函数中的tag参数允许用4字节的值来标记分配的内存,通常这个值由4个ASCII字符组成,用来在逻辑上表示驱动程序或驱动程序的某些部分。

    1.7K30
    领券