Windows内核源码详尽分析-DPC篇
深入研究计算机操作系统内核Windows内核原理解析

深入研究计算机操作系统内核Windows内核原理解析计算机操作系统是指支持计算机软硬件运行的基本软件系统,其中内核是操作系统的核心部分。
作为广泛应用的操作系统之一,Windows 内核在计算机领域中具有重要地位。
本文将深入研究Windows内核的原理解析,以帮助读者更好地理解计算机操作系统内核的工作原理。
一、Windows操作系统的发展历程Windows操作系统的发展经历了多个版本和起伏。
自20世纪80年代中期开始推出的Windows 1.0版本以图形用户界面为特点,为个人计算机用户带来了更加友好的操作界面。
随着版本的不断升级,Windows 操作系统逐渐成熟,并在个人计算机市场上占据主导地位。
二、Windows内核的概述Windows内核是Windows操作系统的核心组成部分,负责管理计算机硬件资源和提供系统服务。
Windows内核采用了微内核的设计思想,将核心的功能模块化,以实现更高的灵活性和可扩展性。
Windows内核包括以下几个主要组件:1. 进程管理:负责管理计算机上的进程,调度和分配资源,实现进程的并发执行。
2. 内存管理:负责管理计算机内存的分配和回收,以及虚拟内存的管理,提供内存保护机制。
3. 文件系统:负责管理磁盘上的文件和目录,提供文件读写和文件共享的功能。
4. 设备驱动程序:提供与硬件设备的通信接口,实现对硬件设备的操作和控制。
5. 网络通信:提供网络通信功能,实现计算机之间的数据传输和通信。
三、Windows内核的工作原理分析1. 进程管理Windows内核通过进程管理来实现系统的多任务处理。
每个进程都有自己的地址空间和调度优先级。
内核根据调度算法来选择需要执行的进程,并为其分配CPU时间片。
当一个进程处于等待状态时,内核将其挂起,切换到其他可执行的进程,保证系统的整体性能。
2. 内存管理Windows内核通过内存管理来管理计算机的物理内存和虚拟内存。
物理内存管理负责将物理内存划分成多个页框,提供页面分配和回收的功能。
《Windows驱动开发技术详解》之Windows内核函数

《Windows驱动开发技术详解》之Windows内核函数内核模式下字符串操作ANSI_STRING和UNICODE_STRING分别定义如下:以UnicodeString类型对象进⾏初始化为例,代码如下:输出:进⾏复制字符串操作,代码如下:输出:但是如果这⾥改为:加载驱动运⾏就会蓝屏。
Why?其实,RltFreeUnicodeString是⽤来释放利⽤申请的堆空间初始化的UnicodeString类型对象的,⽽RtlInitUnicodeString对UniStr1进⾏初始化时,只是让Buffer指向了⼀个常量区。
进⾏ANSI_STRING字符串与UNICODE_STRING字符串相互转换操作,代码如下:注意这⾥要利⽤RtlFreeUnicodeString释放通过RtlAnsiStringToUnicodeString得到的UniStr2。
为什么这个需要释放?我们利⽤Windbg跟踪下代码。
⾸先,跟踪时要逐⼀,这⾥的勾如果不去掉,就是在源码下单步跟踪,⽽不是在汇编指令⾥单步跟踪:在RtlUnicodeStringToAnsiString函数中,有这么⼀个系统API此时的参数是正好是传⼊的字节数的⼤⼩。
⽽这个API最终调⽤了:所以,我们要利⽤RtlFreeUnicodeString进⾏释放。
内核模式下的⽂件操作:创建⽂件:代码⼊下:1 VOID FILEOPERATION(){2 OBJECT_ATTRIBUTES ObjAttributes;3 IO_STATUS_BLOCK iostatus;4 HANDLE hfile;5 UNICODE_STRING logFileUnicodeString;67 RtlInitUnicodeString(&logFileUnicodeString, L"\\??\\C:\\1.log");8 InitializeObjectAttributes(&ObjAttributes,9 &logFileUnicodeString,10 OBJ_CASE_INSENSITIVE,11 NULL,12 NULL);13//创建⽂件14 NTSTATUS status = ZwCreateFile(&hfile, GENERIC_WRITE,15 &ObjAttributes,16 &iostatus,17 NULL,18 FILE_ATTRIBUTE_NORMAL,19 FILE_SHARE_READ,20 FILE_OPEN_IF,//这⾥是FILE_OPEN_IF则不论⽂件是否存在都可以Create成功,⽽如果改为FILE_OPEN,则只当⽂件存在时create成功。
深入了解 Windows Server 2008 内核变化

深入了解Windows Server 2008 内核变化内存管理和SMB 2.0 NTFS 自修复功能、Windows 硬件错误报告体系和驱动程序验证程序I/O 完成端口、线程池和NUMA 的可伸缩性Hyper-V 虚拟化Windows Server 2008 是最新版本的Microsoft 服务器平台,它包含许多系统级更改,这些更改涉及操作系统的所有功能领域:从内存管理到线程调度,从网络连接到安全(这里只列出了少数几个)。
由于Windows Server®2008 和Windows Vista®SP1 的内核相同,因此它包含许多我曾经在之前的《TechNet 杂志》文章:“深入了解Windows Vista 内核”第1-3 部分(2007 年2 月、3 月和4 月)和“深入了解Windows Vista 用户帐户控制”(2007 年6 月)中介绍过的增强功能。
只有其中的少数功能仅特定于客户端且并未包含在Windows Server 2008 中,如SuperFetch、ReadyBoost、ReadyDrive、Ready Boot 和多媒体类计划程序服务(MMCSS)。
因此,我将不再重复介绍Windows Vista 中已介绍过且Windows Server 2008 中同样包含的重要内核变化,如I/O 优先级排列、新的引导体系结构BitLocker TM、代码完整性和强制完整性级别。
我将重点介绍之前这些文章中未涉及到的关键变化,包括与可靠性、性能、可伸缩性以及新的Microsoft 管理程序计算机虚拟化技术Hyper-V TM相关的变化。
同样,与之前的文章一样,本文的范围仅限于操作系统内核Ntoskrnl.exe 以及与其紧密关联的系统组件的变化。
例如,本文不会介绍安装(WIM 或Windows®映像格式和基于组件的服务)、管理(组策略和Active Directory®改进)、常规诊断和监控(Windows 诊断基础结构)、核心网络(新的防火墙和TCP/IP 实现)、Server Core 或服务器角色的变化。
WINCE---内核(kernel)---内存架构(memory archtitecture)学习

WINCE---内核(kernel)---内存架构(memory archtitecture)学习1.WINCE内存模型图1 WINCE5.0和WINCE6.0内存模型对比图WINCE6.0之前的WINCE操作系统支持的进程最多只有32个,并且每个进程只有32MB的虚拟内存空间,并且所有的进程共享相同的4GB地址空间。
在WINCE6.0中,内核进程占用4GB虚拟内存空间的高2GB,每个用户进程都有独立拥有低端的2GB虚拟内存空间,WINCE6.0支持的最大进程数达到32000个。
进程数量的实际限制是受物理内存的大小来决定的。
之前的WINCE版本,当前的应用在slot0执行,在WINCE6.0中,抛弃了原来的按Slot分配的方式,而是只要你需要你就可以创建内存,每个都有2GB的有效虚拟内存空间。
因为虚拟内存访问是通过内存管理单元MMU转化为物理内存的访问,所以虚拟内存代码是依赖于CPU的。
ARM和x86处理器使用硬件页表OEMAddressTable,所以硬件可以直接访问虚拟内存单元。
WINCE支持的其他CPU使用一个软件转换旁路缓冲区TLB(translation look-aside buffer,可理解为页表缓冲或是快表)miss handler,这需要完里面填充虚拟内存的内容。
WINCE6.0基于下面的目标来设计虚拟内存管理:⑴每个进程具有大容量的虚拟内存。
⑵不存在进程数量的限制。
⑶进程直接相互保护。
⑷最低程度降低使虚拟内存管理依赖CPU的代码。
⑸有效的虚拟内存分配⑹有效的TLB选中处理机制(miss handling)。
2.WINCE虚拟内存分配下面来看WINCE6.0虚拟内存地址空间图,先看内核模式下的虚拟内存地址空间分配。
图2 内核模式虚拟内存空间分配图⑴静态映射到虚拟内存,有缓冲的,范围为0x80000000~0xA0000000,大小为512MB,通过CPU的cache直接访问物理内存,这段也就是BSP包中g_oalAddressTable映射表对应于物理内存到虚拟内存的映射关系。
《Windows内核编程》基本数据结构

《Windows内核编程》基本数据结构学习各种高级外挂制作技术,马上去百度搜索(魔鬼作坊),点击第一个站进入,快速成为做挂达人。
驱动对象:每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载时被内核中的对象管理程序所创建的。
驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核加载,并且内核对一个驱动只加载一个实例。
确切地说,是由内核中的I/O管理器负责加载的,驱动程序需要在DriverEntry中初始化。
驱动对象的结构定义如下(wd m.h):typedef struct_DRIVER_OBJECT{//结构的类型和大小CSHORT Type;CSHORT Size;//每个驱动程序会有一个或多个设备对象,其中,每个设备对象都有一个指针指向下一个驱动对象//最后一个设备对象指向空。
DeviceObject指向驱动对象的第一个设备对象。
通过Devic eObject,就//可以遍历驱动对象中的所有设备对象了。
PDEVICE_OBJECT DeviceObject;ULONG Flags;//The following section describes where the driver is loaded.The count //field is used to count the number of times the driver has had its//registered reinitialization routine invoked.PVOID DriverStart;ULONG DriverSize;PVOID DriverSection;PDRIVER_EXTENSION DriverExtension;//记录驱动设备的名字,用UNICODE字符串记录,该字符串一般/Driver/[驱动程序名称]UNICODE_STRING DriverName;//设备的硬件数据库键名,也是UNICODE字符串记录。
windows内核原理与实现

在windows中,用户代码和内核代码有各自的运行环境,而且他们可以访问的内存空间也不相同。在32为系统中,内核代码可以访问当前进程的整个4GB虚拟地址空间,而用户代码只能访问底端的2GB虚拟地址(或3GB,如果打开了内核启动开关/3GB的话)。用户模式的代码只能访问2GB一下的虚拟内存地址空间,2GB以上车更为系统地址空间。实际上在两者之间有一块特殊的64KB地址空间,位于0x7fff0000—0x7fffffff,两种模式下都不能访问。
在内核模块ntoskrnl.exe中的下层部份(上层部份为执行体),最接近于HAL层,负责线程调度和中断、异常的处理。对于多处理器系统,他还负责同步处理器之间的行为以优化系统的性能。这一层的核心人物是让系统中的所有处理器尽可能的忙和高效。内核层可在多个处理器伤病发执行,他的代码以C语言为主。
执行体:
本地安全权威子系统进程(lsass.exe):负责本地系统安全策略,例如允许那些用户登录到本地系统中、口令策略、 授予用户和用户组的特权,以及系统安全审计设置,同时也负责认证用户的身份,以及将安全审 计消息发送到系统的时间日志中。
shell进程(explorer.exe):windows默认的shell,提供了系统玉用户打交道的各种界面
windows采用了双模式结构来保护操作系统本身,以避免被应用程序的错误所波及。操作系统核心运行在内核模式(kernel mode)下,应用程序的代码运行在用户模式下。每当应用程序需要用到系统内核或内核的扩展模块(内核驱动程序)所提供的服务时,应用程序通过硬件指令从用户模式切换到内核模式中,当系统内核完成了所请求的服务以后,控制权又回到用户模式代码。
系统线程和系统进程:
在windows中,每个线程代表一个指令执行序列,同时也是一个调度单元;进程定义了一个执行环境,有自己独立的地址空间。每个线程都必定依附于一个进程。windows内核除了接受来自应用程序的系统服务调用,它自己也有一些线程用于各种用途。浙西县城运行在一个特殊的进程环境中,称为system进程。他的线程被称为系统线程,其中有一组系统辅助线程(system worker thread),他们代表操作系统或者其他的应用进程来完成一些特殊的工作。
windows源码分析(10)-设备驱动篇

设备驱动设备栈:从上层到下层的顺序依次是:过滤设备、类设备、过滤设备、小端口设备【过、类、过滤、小端口】驱动栈:因设备堆栈原因而建立起来的一种堆栈老式驱动:指不提供AddDevice的驱动,又叫NT式驱动Wdm驱动:指提供了AddDevice的驱动驱动初始化:指IO管理器加载驱动后,调用驱动的DriverEntry、AddDevice函数设备栈中上层设备与下层设备的绑定关系不是一对一,而是一对多。
一个设备可以同时绑定到N个下层设备上去,而一个下层设备,也可以同时被N个上层设备绑定,但注意形式上只可被一个上层设备绑定,因为设备对象的AttachedDevice字段指的就是那个形式上绑定在它上面的设备。
相关结构定义:typedef struct _DRIVER_OBJECT {CSHORT Type;//本结构的类型CSHORT Size;//本结构的实际长度PDEVICE_OBJECT DeviceObject;//设备对象链(第一个设备对象)ULONG Flags;//驱动标志//下面两个字段经常用于检测SSDT hook、DispactcRoutine hook等PVOID DriverStart;//本驱动的sys模块在内存中的起始地址ULONG DriverSize;//长度PVOID DriverSection;//实际上是一个LDR_DATA_TABLE_ENTRY*指针,指向它的模块描述符结构PEXTENDED_DRIVER_EXTENSION DriverExtension;//标准驱动扩展(所有驱动都有一个标准驱动扩准) UNICODE_STRING DriverName;//“Driver\服务名”或“FileSystem\服务名”(也在对象头中保存) PUNICODE_STRING HardwareDatabase;//注册表硬件配置键路径struct _FAST_IO_DISPATCH *FastIoDispatch;//用于文件系统的一组快速IO例程PDRIVER_INITIALIZE DriverInit;//sys文件的oep(一般就是DriverEntry,当然可以是其他名字)PDRIVER_STARTIO DriverStartIo;//StartIO irp队列机制专用函数PDRIVER_UNLOAD DriverUnload;//驱动的卸载例程PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];//各irp的派遣函数} DRIVER_OBJECT, *PDRIVER_OBJECT;每个驱动对象都有一个标准的驱动扩展,且紧跟在驱动对象后面。
windows_XP系统内核文件分析

windows XP系统内核文件分析[精简系统做个参考]——转自eaglelin 当然, 精简系统是要付出代价的. 不要贪得无厌, 免得系统坏了修不好啊.Windows XP个别System32 文件System32 文件夹下个别要移除的文件我们就要删除另外600 个system32 文件...我们要一次把它们全都解决掉.以下是我所删除的System32 文件列表, 另外还有相关的批处理文件.我不会把自己用的批处理文件给别人的.我已经厌倦别人认为我的批处理文件就是最适合他们的. 其实并不是这么回事.这里有个很简单的例子能够说明原因.我在我用的批处理文件中定义了要删除winfax.dll (Microsoft 传真API 支持DLL), 因为我没有传真机. 你直接用我的批处理文件的话, 就会把你的系统中的传真相关文件删掉. 这样, 你的传真机无法正常工作的话. 你就会骂我.到底需要移除哪些System32 文件, 这应该由你自己来决定. 我已经尽力把相关信息提供给你了, 这些应该可以帮助你决定应当删除哪些文件.如果你想创建你自己的批处理文件的话,请仔细查看相关移除信息, 我会把相应部分的批处理脚本贴上去的, 然后你可以将其粘贴到你自己的批处理文件中.我在我的批处理文件中添加了一个防止出现意外的功能...这些文件会被移动并会被保存下来(没有直接将其删除...) 备份至C:/backup.在这个backup 文件夹中有个名为"smart placement"的子文件夹. 其出现的顺序与XP 中的顺序相同. 首先你会看到WINDOWS 文件夹. 在WINDOWS 文件夹中你可以看到system32 文件夹.我创建这个所谓的”smart placement”就是为了让你明白相关备份文件的来源. 如你所见, 这些批处理文件也可用于其它文件夹中的文件. 反正, Backup 文件夹中的结构与XP 的相同.请确保在你使用任何注册表清理工具之前, 应当先把Backup 文件夹中的文件临时删掉...注册表清理工具可能会把注册表中的路径指向backup 文件夹中的相关路径.将用得到的部分脚本复制粘贴到记事本中. 然后将其另存.代码:________________________________________IF NOT EXIST "c:/backup/WINDOWS/system32" md c:/backup/WINDOWS/system32MOVE c:/WINDOWS/system32/6to4svc.dll c:/backup/WINDOWS/system32/MOVE c:/WINDOWS/system32/aaaamon.dll c:/backup/WINDOWS/system32/MOVE c:/WINDOWS/system32/acledit.dll c:/backup/WINDOWS/system32/MOVE c:/WINDOWS/system32/admparse.dll c:/backup/WINDOWS/system32/________________________________________C:/WINDOWS/system32:12520437.cpx ...代码页转换表.12520850.cpx ... 代码页转换表.6to4svc.dll ....在IP4网络上提供IPv6 连接的服务aaaamon.dll ....Aaaa Monitor Dllacledit.dll ....访问控制列表编辑器ac3filter.cpl ..ac3filter 控制面板扩展属于我所安装用于看电影的AC3Filter 编解码器.ahui.exe .......应用程序兼容用户界面ALSNDMGR.CPL ...Realtek AC97 音频控制面板我用RTLCPL.EXE (Realtek 音频控制面板) 作为代替.amcompat.tlb ...ansi.sys .......apcups.dll .....APC 智能提供程序APPEND.EXE .....(Append). 允许应用程序在当前文件夹中打开指定目录中的数据文件. 此工具源于MS-DOS 5.0.asctrls.ocx ....Active Setup 控件A T.EXE .........(AT). 用于设置在指定时间和日期执行任务. 需要运行计划任务服务. atkctrs.dll ....Windows NT AppleTalk 性能计数器dllATMADM.EXE .....(A TM). ATM 呼叫管理器.auditusr.exe ... 设置每用户审核策略atmfd.dll ......Windows NT OpenType/Type 1 字体驱动atmlib.dll .....Windows NT OpenType/Type 1 API 库.atmpvcno.dll ...Atm Epvc Install DLLatrace.dll .....Async Trace DLLATTRIB.EXE .....(文件属性). 显示或更改文件属性(只读, 存档, 隐藏, 或系统). AUTOCONV.EXE ...(自动转换). 用于将FAT 分区格式转为NTFS.autodisc.dll ...Windows AutoDiscovery API , 自动收取邮件AUTOFMT.EXE ...(自动格式化). 用于转换文件系统的工具.AUTOLFN.EXE ....长文件名转换工具. 用于DOS模式下. 能够自动将长文件名转换为8.3 格式.-------------------------------------------------------batt.dll .......电池类安装程序如果你使用笔记本的话, 那么设备管理器会需要这个文件来访问你的电池属性.-------------------------------------------------------bidispl.dll ....Bidispl DLLbios1.rom ......bios4.rom ......bitsprx2.dll ...后台智能传输服务代理bitsprx3.dll ... 后台智能传输服务2.0 代理blastcln.exe ...Blaster/Nachi 移除工具BOOTOK.EXE .....(启动确认). 在一次成功地登录系统之后, “上次正确的配置”会用它保存配置参数.BOOTVRFY.EXE ...(启动验证). “上次正确的配置”会用它验证一个引导选择. browsewm.dll ...BrowseWM Playerbthci.dll ......蓝牙类别安装程序bthprops.cpl ...蓝牙控制面板小程序(无线公司)bthserv.dll ....蓝牙支持服务btpanui.dll ....蓝牙PAN 用户界面-------------------------------------------------------capesnpn.dll ...Microsoft 证书模板管理扩展ccfgnt.dll .....Internet 配置库certmgr.dll ....证书管理工具certmgr.msc .... 内容-> 分级审查-> 启用RTCSHARE.EXE ...(RTC 程序共享). 实时时钟组件.rtipxmib.dll ...Microsoft Router IPX MIB subagentRUNAS.EXE ......(运行方式). 这个工具可用一个新用户名和密码执行一个进程. 一般, 可用来在低权限用户登录的系统上以高权限的管理员身份来运行一个程序.safrdm.dll .....Microsoft 帮助中心桌面管理器safrslv.dll ....Microsoft 帮助中心会话处理程序SA VEDUMP.EXE ...(转储). 当系统出现STOP 错误时, 可用于将内存中的内容转储为文件. sbe.dll ........DirectShow 流缓冲滤镜sbeio.dll ...... 流缓冲输入输出DLLSC.EXE .........( Windows NT 服务管理). 一个服务管理工具.scrobj.dll .....Windows (r) 脚本组件运行时scrrun.dll .....Microsoft (r) 脚本运行时SDBINST.EXE ....(Installer). AppFix 和AppHelp 安装程序.sendcmsg.dll ....发送控制台消息sdhcinst.dll ...Secure Digital Host 控制器类别控制器sdpblb.dll .....Microsoft Sdpblbsecupd.sig .....security.dll ...安全支持提供程序接口senscfg.dll ....SENS 安装设置工具serialui.dll ...串行端口属性页面setup.bmp ......SETUP.EXE ......(Setup). Windows 安装程序setupdll.dll ...Windows 2000 安装DLLSETVER.EXE .....(设置版本). 用于定义报告给某个应用程序关于DOS 的版本.sfc.exe ........(Windows 2000 系统文件检查工具). 用于验证XP 的文件是否存在以及是否正确.sfc_os.dll ...(Windows 文件保护). 用于保护Windows 的系统文件.sfmapi.dll .....Windows NT Macintosh 文件服务客户端SHARE.EXE ......(Share). 能让两个程序同时使用一个文件的DOS 工具.shellstyle.dll ..Windows 外壳样式资源DllSHMGRATE.EXE ... Windows XP 用户数据转移工具.SHRPUBW.EXE ....(共享文件夹创建工具). 用于在Windows XP 系统上创建共享文件夹. shscrap.dll ....外壳碎片对象句柄SHUTDOWN.EXE ...(远程关机工具). 允许关闭或重启本地或远程电脑.sigtab.dll .....文件完整性设置SIGVERIF.EXE ...(文件签名验证工具). 验证所选文件是否经过认证.simpdata.tlb ....sisbkup.dll ....单实例存储备份支持功能skdll.dll ......序列号SKEYS.EXE ......(序列号). 一个可提供支持序列号功能的系统服务.slayerxp.dll ...”兼容性”选项卡外壳扩展DLLsmbinst.exe ....系统管理BIOS 驱动安装程序softpub.dll ....Softpub Forwarder DLLSORT.EXE .......(Sort). 用于整理键盘输入并将结果写入一个文件或是显示在屏幕上. spmsg.dll ......Service Pack 消息spnike.dll .....用于Nike 设备的MDM 设备接口spnpinst.exe ...点对点定制安装SPRESTRT.EXE ...重启时还原注册表sprio600.dll ... Rio 600 的MDM 设备接口sprio800.dll ... Rio 800 的MDM 设备接口spxcoins.dll ...Specialix MPS NT 升级协同安装程序srvsvc.dll .....服务器服务DLLsti_ci.dll .....静止图像类别安装程序sti.dll ........ 静止图像设备客户端DLLstimon.exe ..... 静止图像设备监视器storage.dll ....OLE 2.1 16/32 相互操作库strmfilt.dll ...流滤镜库SUBST.EXE ......(虚拟). 可将一个路径虚拟为一个分区.svcpack.dll ....Windows 2000 Service Pack 安装程序SYNCAPP.EXE ....(同步). 公文包用于同步所含文件的工具.synceng.dll ....Windows 公文包引擎syncui.dll .....Windows 公文包资源文件SYSEDIT.EXE .....(系统编辑器). 一个用于打开编辑system.ini, win.ini, config.sys, 和autoexec.bat 的编辑器.sysinv.dll .....Windows 系统清单SYSKEY.EXE .....(Windows XP 帐户数据库管理器). 用于设置Windows XP 帐户数据库的安全特性.sysmon.ocx .....系统监视控件sysprint.sep ...sysprtj.sep ....SYSTRAY.EXE ....(系统栏). 系统栏提供程序. 它能控制任务栏和系统栏. 但是, 没它的话, 也没有什么不正常的地方.t2embed.dll ....t2embedtaskman.exe ....任务管理器(不是平时使用的那个. 平时那个是: "taskmgr.exe")tdc.ocx ........TDC ActiveX 控件TELNET.EXE .....(Telnet). 一个Telnet 客户端, 可用于访问远程Telnet 服务器系统.tftp.exe .......简单文件传输协议应用程序toolhelp.dll ...Windows 调试工具助手库traffic.dll ....Microsoft 网络交通控制1.0 DLL .......将文件夹列为树形结构tsbyuv.dll .....东芝视频解码器typelib.dll ....OLE 2.1 16/32 相互操作库ufat.dll .......FAT 工具DLLumandlg.dll ....UManDlg DLLunimdm.tsp .....unimdmat.dll ...通用调制解调器服务提供程序AT 微型驱动ureg.dll .......注册表工具DLLusbmon.dll .....标准动态打印端口监视器DLLUSER.EXE .......(Windows 用户界面核心组件). 用于保持Win16 的兼容性. 不是一个有效的Win32 应用程序.v7vga.rom .......vbajet32.dll ...Visual Basic 应用程序开发环境- Expression 服务加载器vcdex.dll ......32 位MSCDEX 虚拟设备驱动vdmredir.dll ...DOS 虚拟机网络接口库verifier.dll ...标准应用程序验证提供程序dllVERIFIER.EXE ...(驱动验证管理器). 可用它探测一个驱动的操作是否会导致系统冲突. vfpodbc.dll ....vfpodbcvga256.dll .....256 色VGA/SVGA 显示驱动vga64k.dll .....32K/64K 色VGA/SVGA 显示驱动View Channels.scf ..(查看频道).vjoy.dll .......32 位手柄虚拟设备驱动(我没有手柄)w32topl.dll ....Windows NT Topology 维护工具wavemsp.dll ....Microsoft Wave MSPwdl.trm ........webvw.dll ......网页视图外壳扩展库WEXTRACT.EXE ...(Win32 Cab 自解压程序创建工具). 用于提取Cab 压缩包中的文件. wiasf.ax .......WIA 流快照滤镜wifeman.dll ....Windows WIFE 接口核心组件 ........用于保持兼容性win87em.dll ....winbrand.dll ...Windows Branding 资源WINCHA T.EXE ....简单的聊天工具winfax.dll .....Microsoft 传真API 支持DLL (我没有传真机.)winhelp.hlp ....WINHLP32.EXE ...(Windows 帮助). 用于打开帮助文件.WINMSD.EXE .....(Windows XP 诊断工具或是系统信息工具). Windows XP 诊断工具. winnls.dll .....Windows IME 接口核心组件winntbbu.dll ...Windows 安装画面DLLwinoldap.mod ...winshfhc.dll ...文件风险评估winsock.dll ....Windows Socket 16-Bit DLLwinstrm.dll ....Streams DLLwkssvc.dll .....Workstation 服务DLLwmidx.dll ......Windows Media 索引DLLwmiprop.dll ....WDM 动态属性页面协同安装程序wmv8ds32.ax ....(文件版本: 8.0.0.4000). Windows Media 视频解码器V8wmvds32.ax .....Windows Media 视频解码器WOWDEB.EXE .....(WOW 调试程序). WOW 调试程序. Win16 调试助手wowexec.exe ....Windows Win16 程序启动工具wowfax.dll .....Windows 3.1 兼容传真驱动DLLwowfaxui.dll ...Windows 3.1兼容传真驱动DLLWPABALN.EXE ....(Windows 产品激活). Windows 产品激活气球提示器.WRITE.EXE ......写字板, 支持纯文本和RTF 文档.有Word 就不用它了wscntfy.exe ....Windows 安全中心通知程序wscui.cpl ...... 安全中心控制面板小程序WSCRIPT.EXE ....(脚本宿主). 基于Windows 的脚本宿主.wshatm.dll .....Windows 套接层助手DLLwshbth.dll .....Windows套接层助手DLLwshcon.dll .....Microsoft (r) Windows 脚本控制器wshisn.dll .....NWLINK2套接层助手DLLwshnetbs.dll bios Windows套接层助手DLLwshom.ocx ......Windows 脚本宿主运行时库WshRm.dll ......用于PGM 的Windows套接层助手wsnmp32.dll ....Microsoft WinSNMP v2.0 Manager APIxactsrv.dll ....下级API 服务器DLLxcopy.exe ......加强版的复制命令xenroll.dll ....XEnrollxpob2res.dll ...Service Pack 2 OOB 消息............350 个没有删除的System32 文件...以及原因............我为什么不删除这些文件是有很多重要原因的, 其中有许多文件要经常用到. 我会把为什么不想删除这些文件的原因列在下面.NVDVD 需要以下文件acelpdec.ax 音频解码器以下是NVDVD 安装的文件:DolbyHph.dll .....杜比耳机引擎license.955200 ...... 设置-> 高级页面上的适配器, 监视器和疑难解答选项卡需要以下文件:deskadp.dll ....高级显示适配器属性deskmon.dll .... 高级显示监视器属性deskperf.dll ... 高级显示性能属性-------------------------------------------------硬件设备管理器需要以下文件:devmgr.dll .....设备管理器MMC 管理工具dmocx.dll ......树形视图OCX-------------------------------------------------Windows 默认磁盘碎片整理工具需要以下文件:虽然我用PerfectDisk 整理磁盘, 但是我发现需要保留Windows 默认的磁盘碎片整理工具才能安装PerfectDisk.你的电脑在用过一段时间之后, 磁盘上的文件分布就会比较乱, 也就产生了不少磁盘碎片, 这会导致访问操作文件变慢. 用磁盘碎片整理工具将其整理一遍之后, 就会好多了. DFRGNTFS.EXE ..(NTFS 磁盘碎片整理工具). 用于整理NTFS 分区.dfrgres.dll .... 磁盘碎片整理工具资源模块dfrgsnap.dll ... 磁盘碎片整理管理工具模块dfrgui.dll ..... 磁盘碎片整理用户界面模块vssapi.dll ....Microsoft® 卷影复制请求方/写入方服务API DLL-------------------------------------------------DivX.dll .......DivX® 编解码器for Windowsdivxdec.ax .....DivX® 解码滤镜-------------------------------------------------我所安装的第三方编解码器, 以避免播放损坏的视频时画面定格DivXAF.ax ......DivX 反定格滤镜-------------------------------------------------添加或删除模块所需的文件:duser.dll ......Windows DirectUser 引擎-------------------------------------------------ELS.DLL ........事件查看器管理工具EVENTVWR.EXE ...(事件查看器). 事件查看器的可执行文件.-------------------------------------------------服务窗口所需的文件filemgmt.dll .....服务和共享文件夹mfc42u.dll .....MFCDLL 共享库-------------------------------------------------用于维护字体文件夹的特殊结构, 且用于显示字体图标:fontext.dll ....Windows 字体文件夹外壳扩展FONTVIEW.EXE ..(字体查看器). 用于在窗口中查看字体示例.-------------------------------------------------用于安全模式下, 避免图像看起来像是被撕裂了一样:framebuf.dll ...帧缓冲显示驱动-------------------------------------------------framedyn.dll ...WMI SDK 提供程序框架我把wbem 文件夹中的framedyn.dll 移动到system32 中了, 然后又把wbem 文件夹以及其中的内容都删掉了.有时当你运行系统还原时会出现错误, 它会提示你, 没有framedyn.dll 的话, 将无法运行系统还原.没有"framedyn.dll" 的话, 当你右击我的电脑时会出错. 将其保留到system32 文件夹中可避免出错.-------------------------------------------------glu32.dll ......(OpenGL 工具库DLL). OpenGL 3D 图形渲染函数库.-------------------------------------------------GRPCONV.EXE .....(组转换). 将Microsoft Windows 3.x 的程序管理器组转换为开始菜单项目.没有GRPCONV.EXE 的话, 我就无法安装Microsoft 的文件检查工具以检查正确的DVD 编解码器.-------------------------------------------------Acronis True Image 所需的文件hhctrl.ocx .....Microsoft® HTML 帮助控件-------------------------------------------------hid.dll .....(Hid 用户库文件).Realtek’s 音频配置工具需要此文件(C:/WINDOWS 中的soundman.exe)-------------------------------------------------html.iec .......(Microsoft HTML 转换器) 用于将从网页上复制的文本粘贴到写字板中. (用于保留网页文本格式?)-------------------------------------------------我需要以下第三方解码器来回放某些格式的视频.I263_32.DRV ....Intel I.263 视频驱动2.55.012系统默认MP3 解码器:l3codecx.ax .....MPEG Layer-3 音频解码器-------------------------------------------------以下文件属于Internet Explorerimgutil.dll ....IE 图像解码插件DLLMSCTF.DLL ......MSCTF 服务器DLLMSIMTF.DLL .....Active IMM 服务器DLLpngfilt.dll ....IE PNG 图像解码插件-------------------------------------------------IMAPI.EXE .....(刻录服务).通过IMAPI 管理光盘刻录, 可用Nero 等代替.-------------------------------------------------Plus! MP3 Audio Converter LE所需用于将.mp3 转为.wma 的编解码器:IMC32.ACM ......Intel MSACM 音频编解码器l3codeca.acm ...(MPEG Layer-3 音频编解码器).。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DPCDPC不同APC,DPC的全名是‘延迟过程调用’。
DPC最初作用是设计为中断服务程序的一部分。
因为每次触发中断,都会关中断,然后执行中断服务例程。
由于关中断了,所以中断服务例程必须短小精悍,不能消耗过多时间,否则会导致系统丢失大量其他中断。
但是有的中断,其中断服务例程要做的事情本来就很多,那怎么办?于是,可以在中断服务例程中先执行最紧迫的那部分工作,然后把剩余的相对来说不那么重要的工作移入到DPC函数中去执行。
因此,DPC又叫ISR的后半部。
(比如每次时钟中断后,其isr会扫描系统中的所有定时器是否到点,若到点就调用各定时器的函数。
但是这个扫描过程比较耗时,因此,时钟中断的isr会将扫描工作纳入dpc中进行)每当触发一个中断时,中断服务例程可以在当前cpu中插入一个DPC,当执行完isr,退出isr后, cpu 就会扫描它的dpc队列,依次执行里面的每个dpc,当执行完dpc后,才又回到当前线程的中断处继续执行。
typedef struct _KDPC {UCHAR Type; //DPC类型(分为普通DPC和线程化DPC)UCHAR Importance;//该DPC的重要性,将决定挂在队列头还是尾volatile USHORT Number;//第5位为0就表示当前cpu,否则,最低4位表示目标cpu号LIST_ENTRY DpcListEntry;//用来挂入dpc链表PKDEFERRED_ROUTINE DeferredRoutine;//dpc函数PVOID DeferredContext;//dpc函数的参数PVOID SystemArgument1;//挂入时的系统附加参数1PVOID SystemArgument2;//挂入时的系统附加参数2volatile PVOID DpcData;//所在的dpc队列} KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;VOIDKeInitializeDpc(IN PKDPC Dpc,//DPC对象(DPC也是一种内核对象)IN PKDEFERRED_ROUTINE DeferredRoutine, //DPC函数IN PVOID DeferredContext)//DPC函数的参数{KiInitializeDpc(Dpc, DeferredRoutine, DeferredContext, DpcObject);}VOIDKiInitializeDpc(IN PKDPC Dpc,IN PKDEFERRED_ROUTINE DeferredRoutine,IN PVOID DeferredContext,IN KOBJECTS Type){Dpc->Type = Type;Dpc->Number = 0;//初始的目标cpu为当前cpuDpc->Importance= MediumImportance;Dpc->DeferredRoutine = DeferredRoutine;Dpc->DeferredContext = DeferredContext;Dpc->DpcData = NULL;//表示该DPC尚未挂入任何DPC队列}DPC初始化构造时的目标cpu默认都是当前cpu。
BOOLEAN KeInsertQueueDpc(IN PKDPC Dpc,IN PVOID SystemArgument1,IN PVOID SystemArgument2) {KIRQL OldIrql;PKPRCB Prcb, CurrentPrcb;ULONG Cpu;PKDPC_DATA DpcData;BOOLEAN DpcConfigured = FALSE, DpcInserted = FALSE;KeRaiseIrql(HIGH_LEVEL, &OldIrql);//插入过程的中断级是最高的,这个过程不会被打断。
CurrentPrcb = KeGetCurrentPrcb();//检查目标cpu号的第5位为1(32 = 00100000),就表示其它cpu,低4位表示cpu号if (Dpc->Number >= 32){Cpu = Dpc->Number - 32;Prcb = KiProcessorBlock[Cpu];}Else //否则,表示当前cpu{Cpu = Prcb->Number;Prcb = CurrentPrcb;//目标cpu就是当前cpu}//if 要插入的是一个线程化dpc并且那个cpu启用了线程化dpc机制if ((Dpc->Type == ThreadedDpcObject) && (Prcb->ThreadDpcEnable))DpcData = &Prcb->DpcData[DPC_THREADED]; //目标cpu的线程化dpc队列elseDpcData = &Prcb->DpcData[DPC_NORMAL];//目标cpu的普通dpc队列KiAcquireSpinLock(&DpcData->DpcLock);//if 尚未挂入任何dpc队列if (!InterlockedCompareExchangePointer(&Dpc->DpcData, DpcData, NULL)){Dpc->SystemArgument1 = SystemArgument1;Dpc->SystemArgument2 = SystemArgument2;DpcData->DpcQueueDepth++;DpcData->DpcCount++;DpcConfigured = TRUE;//不管如何,先把dpc挂到目标cpu的dpc队列中if (Dpc->Importance == HighImportance)InsertHeadList(&DpcData->DpcListHead, &Dpc->DpcListEntry);elseInsertTailList(&DpcData->DpcListHead, &Dpc->DpcListEntry);if (&Prcb->DpcData[DPC_THREADED] == DpcData){if (!(Prcb->DpcThreadActive) && !(Prcb->DpcThreadRequested))线程化DPC,ReactOS目前尚不支持,略}Else //若挂入的是一个普通dpc(最常见),检查是否需要立即发出一个dpc软中断给cpu {//if 目标cpu当前没在执行dpc,并且它尚未收到dpc中断请求if (!(Prcb->DpcRoutineActive) && !(Prcb->DpcInterruptRequested)){if (Prcb != CurrentPrcb)//if 目标cpu是其它cpu{if (((Dpc->Importance == HighImportance) ||(DpcData->DpcQueueDepth >= Prcb->MaximumDpcQueueDepth))&&(!(AFFINITY_MASK(Cpu) & KiIdleSummary) || (Prcb->Sleeping))) {Prcb->DpcInterruptRequested = TRUE;DpcInserted = TRUE; //表示需要立即给cpu发出dpc软中断}}Else //if 目标cpu就是自身cpu,最常见{//一般插入的都是中等重要性的dpc,因此,一般会立即发出一个dpc中断。
if ((Dpc->Importance != LowImportance) ||(DpcData->DpcQueueDepth >= Prcb->MaximumDpcQueueDepth) ||(Prcb->DpcRequestRate < Prcb->MinimumDpcRate)){Prcb->DpcInterruptRequested = TRUE;DpcInserted = TRUE; //表示需要立即给cpu发出dpc软中断}}}}}KiReleaseSpinLock(&DpcData->DpcLock);if (DpcInserted)//if 需要立即发出一个dpc软中断{if (Prcb != CurrentPrcb)KiIpiSend(AFFINITY_MASK(Cpu), IPI_DPC);elseHalRequestSoftwareInterrupt(DISPATCH_LEVEL);//给当前cpu发出一个dpc软中断}KeLowerIrql(OldIrql);//降低irqlreturn DpcConfigured;}如上,这个函数将dpc挂入目标cpu的指定dpc队列(每个cpu有两个dpc队列,一个普通的,一个线程化的)。
然后检查当前是否可以立即向目标cpu发出一个dpc软中断,这样,以在下次降低到DISPATCH_LEVEL 以下时扫描执行dpc(其实上面的这个函数一般用于在isr中调用,但用户也可以随时手动调用)(一般来说,挂入的都是中等重要性的dpc,一般在dpc进队的同时就会顺势发出一个dpc中断.)下面的函数可用于模拟硬件,向cpu发出任意irql级别的软中断,请求cpu处理执行那种中断。
VOID FASTCALLHalRequestSoftwareInterrupt(IN KIRQL Irql)//Irql一般是APC_LEVEL/DPC_LEVEL{ULONG EFlags;PKPCR Pcr = KeGetPcr();KIRQL PendingIrql;EFlags = __readeflags();//保存老的eflags寄存器_disable();//关中断Pcr->IRR |= (1 << Irql);//关键。
标志向cpu发出了一个对应irql级的软中断PendingIrql = SWInterruptLookUpTable[Pcr->IRR & 3];//IRR后两位表示是否有阻塞的apc中断//若有阻塞的apc中断,并且当前irql是PASSIVE_LEVEL,立即执行apc。