Windows驱动程序运行时函数的调用

编译器厂商一般在发布其编译器的时候,会连同运行时函数一同发布。Windows驱动程序不能再代码中使用编译器提供的运行时函数,因为大部分运行时函数是基于Win32 API实现的,由于Win 32 API运行在用户模式(RIng3层),驱动程序运行在内核模式(RIng0层),运行在内核模式下的程序不能调用用户模式下提供的API函数的。当然一些少部分的运行时函数并没有调用Win32 API,我们依然可以再驱动程序中去使用它们,比如strcpy等。

Windows提供了内核态的运行时函数,我们应该尽量在驱动程序中使用这些函数。

现在探讨内核程序和应用程序之间的本质区别。除了能用WDK编写内核程序和阅读一部分Windows的内核代码之外,我们还需要了解它们的本质是什么,它们和我们熟悉的应用程序有什么区别。

     Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,从Ring0到Ring3(后面简称R0、R1、R2、R3)。R0层拥有最高的权限,R3层拥有最低的权限。按照Intel原有的构想,应用程序工作在R3层,只能访问R3层的数据;操作系统工作在R0层,可以访问所有层的数据;而其他驱动程序位于R1、R2层[多多关注www.hitidc.com],每一层只能访问本层以及权限更低层的数据。

     这应该是很好的设计,这样操作系统工作在最核心层,没有其他代码可以修改它;其他驱动程序工作在R1、R2层,有要求则向R0层调用,这样可以有效保障操作系统的安全性。但现在的OS,包括Windows和Linux都没有采用4层权限,而只是使用2层——R0层和R3层,分别来存放操作系统数据和应用程序数据,从而导致一旦驱动加载了,就运行在R0层,就拥有了和操作系统同样的权限,可以做任何事情,而所谓的rootkit也就随之而生了。

     rootkit在字面上来理解,是拥有“根权限”的工具。实际上,所有的内核代码都拥有根权限,当然,并不一定它们都叫做rootkit,这要看你用它来做什么。用rootkit技术开发的木马和病毒正在迅速发展,它们往往极难清除,以往杀毒软件可以轻松清除掉系统中病毒的时代似乎已经一去不复返了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

活动选择问题

Problem Description sdut 大学生艺术中心每天都有n个活动申请举办&#xff0c;但是为了举办更多的活动&#xff0c;必须要放弃一些活动&#xff0c;求出每天最多能举办多少活动。Input 输入包括多组输入&#xff0c;每组输入第一行为申请的活动数n(n<100)&#xff0c;从第2…

java加载类时静态代码块、构造代码块、构造方法执行顺序

构造代码块作用&#xff1a;https://blog.csdn.net/hspingcc/article/details/54893853 package com.spring.partise;class A{A(){System.out.println("无参构造方法");}A(String str){System.out.println("带参数构造方法");}static{System.out.println(…

为什么可以通过类名调用静态方法?

JVM加载类&#xff1a; 所有的类都是在对其第一次使用时&#xff0c;动态加载到JVM中的。当程序创建第一个类的静态成员的引用时&#xff0c;就会加载这个类&#xff0c;进而可以得到该类的类型信息&#xff0c;而类型信息可以在程序运行时发现和使用类型信息。这个证明构造器…

小鑫去爬山

Problem Description 马上就要放假了&#xff0c;小鑫打算去爬山。 小鑫要去爬的这座山有n个海拔区间。为了清楚描述我们可以从上到下标号1到n。第i个区间有i个落脚点&#xff0c;每一个落脚点都有一个危险值。小鑫需要在第n个海拔区间挑选一个点向上爬&#xff0c;爬到第1个海…

NT驱动程序和WDM驱动程序的区别

1. Windows驱动程序分为两类&#xff0c;一类是不支持即插即用功能的NT式的驱动程序&#xff1b;另一类是支持即插即用功能的WDM式的驱动程序。2. NT式的驱动程序要导入的头文件时NTDDK.H&#xff0c;而WDM式的驱动要导入的头文件为WDM.H.3. DriverEntry需要放在INIT标志的内存…

java调用类中的静态变量时类中静态代码块什么情况会执行以及类的初始化问题?

类从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期包括&#xff1a;加载、验证、准备、解析、初始化、使用和卸载七个阶段。 类初始化是类加载过程的最后一个阶段&#xff0c;到初始化阶段&#xff0c;才真正开始执行类中的Java程序代码…

Windows驱动程序的加载

NT式驱动程序的加载 1. 用DriverMonitor工具加载NT式驱动 2. 在注册表中填写相应的字段,Windows对NT式驱动程序的加载&#xff0c;是基于服务的方式加载的&#xff0c;类似于Windows服务程序的加载。设备驱动程序的动态加载主要是基于服务控制程序&#xff08;Service Contro…

北京市(朝阳区)(西城区)(海定区)正则表达式(代码保存)

“ String str “北京市(朝阳区)(西城区)(海定区)”; String ptr “.*?(?\()”; Pattern p Pattern.compile(ptr); Matcher matcher p.matcher(str); if(matcher.find()){ System.out.println(matcher.group()); } “

上升子序列

SubmitStatisticProblem Description 一个只包含非负整数的序列bi&#xff0c;当b1 < b2 < ... < bS的时候&#xff0c;我们称这个序列是上升的。对于给定的一个序列{a1, a2, ...,aN}&#xff0c;我们可以得到一些上升的子序列{ai1, ai2, ..., aiK}&#xff0c;这里1 …

设备对象

设备对象的结构体中有3个域 &#xff08;1&#xff09;DriverObject。这个比较好理解。就是这个设备对象所属的驱动对象。毕竟设备对象是由驱动对象创建的。 &#xff08;2&#xff09;NextDevice。指向下一个设备对象。这里的指向&#xff1a;指的是由同一个驱动对象的创建的设…

Resources.getResourceAsStream用法

Resources&#xff08;com.ibatis.common.resource.*&#xff09; Resources 类为从类路径中加载资源&#xff0c;提供了易于使用的方法。处理 ClassLoader 是一项 富于挑战的工作&#xff0c;尤其是应用服务器/容器的情况下。 Resources 类试图简化这些工作&#xff0c;Res…

阿里面试回来,想和Java程序员谈一谈

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 目录(?)[-] 引言第一个问题阿里面试都问什么社招面试如何准备对于Java程序猿学习的建议结语 引言 其实本来真的没打算写这篇文章&#xff0c;主要是LZ得记忆力不是很好&#xff0c;不像一些记忆力强…

jquery添加div实现消息聊天框

上代码 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> &l…

数据结构实验之链表一:顺序建立链表

Problem Description 输入N个整数&#xff0c;按照输入的顺序建立单链表存储&#xff0c;并遍历所建立的单链表&#xff0c;输出这些数据。Input 第一行输入整数的个数N&#xff1b; 第二行依次输入每个整数。Output 输出这组整数。Example Input 8 12 56 4 6 55 15 33 62 Exam…

VS调试启动编辑并继续功能

在VS调试的过程中&#xff0c;可能需要进行源代码的修改&#xff0c;一般的做法是先停止当前的调试&#xff0c;然后重新编译再进行调试&#xff0c;哪怕做的一点点小的改动&#xff0c;这样做很浪费时间&#xff0c;尤其是当项目比较大&#xff0c;程序的启动和初始化需要较长…

IRP和IO_STACK_LOCATION

当一个应用程序调用函数去操作某个设备时&#xff0c;比如调用createFile,deviceIOControl,等等时&#xff0c;I/O管理器为此函数创建一个IRP数据结构对象和一个IRP_STACK_LOCATION数据结构对象数组。 &#xff08;数组个数等于驱动程序堆栈上驱动的个数&#xff09;。IRP对象中…

IRQL

转自&#xff1a;http://blog.csdn.net/changsha2011/article/details/6895529 最近开始入门windows 驱动开发&#xff0c;遇到一个IRQL。不知道何解&#xff0c;于是找了些资料&#xff0c;顺带记录下。下面的东西可能有不准确&#xff0c;如发现错误之处请指正&#xff0c;以…

#pragma code_seg(INIT)/code_seg(PAGE)

转自&#xff1a;http://blog.chinaunix.net/uid-24504987-id-161192.html Windows规定有些虚拟内存可以交换到文件中&#xff0c;这类内存被称为分页内存 有些虚拟内存 永远不会交换到文件中&#xff0c;这些内存叫非分页内存 #define PAGEDCODE code_seg(“PAGE”);//分页内…

JSON.stringify() 方法

JSON.stringify() 方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串&#xff0c;如果指定了replacer是一个函数&#xff0c;则可以替换值&#xff0c;或者如果指定了replacer是一个数组&#xff0c;可选的仅包括指定的属性。 语法 JSON.stringify(value[, repla…

师--链表的结点插入

Problem Description 给出一个只有头指针的链表和 n 次操作&#xff0c;每次操作为在链表的第 m 个元素后面插入一个新元素x。若m 大于链表的元素总数则将x放在链表的最后。Input 多组输入。每组数据首先输入一个整数n(n∈[1,100])&#xff0c;代表有n次操作。接下来的n行&…