能详解Windows系统共享单车开锁原理的原理吗

转:Windows&DLL基本原理与加载连接的实现
Windows DLL基本原理
Windows系统平台上,你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable
Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。Microsoft
Windows自己就将一些主要的系统功能以DLL模块的形式实现。例如IE中的一些基本功能就是由DLL文件实现的,它可以被其它应用程序调用和集成。一般来说,DLL是一种磁盘文件(通常带有DLL扩展名,是标准win32可执行文件-“PE”格式),它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分,进程中所有线程都可以调用其中的函数。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务。Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。
在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。
DLL文件中包含一个导出函数表(存在于PE的.edata节中)。这些导出函数由它们的符号名和称为标识号的整数与外界联系起来。函数表中还包含了DLL中函数的地址。当应用程序加载DLL模块时时,它并不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载的DLL模块时动态建立一个函数调用与函数地址的对应表。如果重新编译和重建DLL文件,并不需要修改应用程序,除非你改变了导出函数的符号名和参数序列。
简单的DLL文件只为应用程序提供导出函数,比较复杂的DLL文件除了提供导出函数以外,还调用其它DLL文件中的函数。
每个DLL都有一个入口函数(DLLMain),系统在特定环境下会调用DLLMain。在下面的事件发生时会调用dll入口函数:1.进程装载DLL。2.进程卸载DLL。3.DLL在被装载之后创建了新线程。4.
DLL在被装载之后一个线程被终止了。
应用程序导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。
隐式链接(load-time dynamic
linking)是指在应用程序中不需指明DLL文件的实际存储路径,程序员不需关心DLL文件的实际装载(由编译器自动完成地址分配)。采用隐式链接方式,程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现对DLL函数的动态链接。我们使用的大部分系统Dll就是通过这样的方式链接的。若找不到需要的Dll则会给出一个Dll缺少的错误消息。
显式链接(run-time dynamic
linking)与此相反。用户程序在编译的时候并没有指明需要哪些Dll,而是在运行起来之后调用Win32
的LoadLibary()函数,去装载Dll。若没有找到Dll则这个函数就会返回一个错误。在用LoadLibary()函数装载Dll之后,应用程序还需要用GetProcAdress()函数去获得Dll输出函数的地址。显式链接方式对于集成化的开发语言比较适合。有了显式链接,程序员就不必再使用导入文件,而是直接调用Win32
的LoadLibary()函数,并指定DLL的路径作为参数。还要说明一点的就是Known
Dlls就是保证在通过LoadLibary()去装载系统Dll的时候,只从特定的系统目录去装载,防止装载错。装载的时候会去看注册表下是否有一样的注册表键名。如果是装载windows\system32\目录下的对应的Dll。
Dll的搜索顺序,在Windows上有个注册表键值决定了Dll的搜索顺序:HKLM\System\CurrentControlSet\SessionManager\SafeDllSearchMode。在vista,server2003,xp
sp2中这个值为1,在xp,2000
sp4中为0。1值时的搜素顺序为:1.可执行文件所在目录,2.系统目录windows\system32\,3.
16位系统目录,4.windows目录,5.当前进程目录。6.环境变量PATH中的目录。0值时的搜素顺序为:1.可执行文件所在目录,2.
当前进程目录。3.系统目录windows\system32\,4.
16位系统目录,5.windows目录,6.环境变量PATH中的目录。
DLL的加载与连接
DLL装入(除ntdll.dll外)和连接是通过ntdll.dll中一个函数LdrInitializeThunk实现的。先对LdrInitializeThunk()这个函数名作些解释“Ldr显然是“Loader”的缩写。而“Thunk”意为“翻译”、“转换”、或者某种起着“桥梁”作用的东西。这个词在一般的字典中是查不到的,但却是个常见于微软的资料、文档中术语。这个术语起源于编译技术,表示一小片旨在获取某个地址的代码,最初用于函数调用时“形参”和“实参”结合。后来这个术语有了不少新的特殊含义和使用,但是DLL的动态连接与函数调用时“形实结合”确实有着本质的相似。
由于Windows没有公开这个函数的代码,所以学习起来比较困难,只能通过查阅一些资料来大概猜测这个函数的实现。这个过程中也参看了很多ReactOS(ReactOS是一个免费而且完全兼容
Microsoft Windows XP 的操作系统。ReactOS 旨在通过使用类似构架和提供完整公共接口实现与 NT
操作系统二进制下的应用程序和驱动设备的完全兼容。)的LdrInitializeThunk()函数实现源代码。
在进入这个函数之前,目标 EXE映像已经被映射到当前进程的用户空间,系统DLL
ntdll.dll的映像也已经被映射,但是并没有在EXE映像与ntdll.dll映像之间建立连接 (实际上
EXE映像未必就直接调用ntdll.dll中的函数)。LdrInitializeThunk()是ntdll.dll中不经连接就可进入的函数,实质上就是ntdll.dll的入口。除ntdll.dll以外,别的
DLL都还没有被装入(映射)。此外,当前进程(除内核中的“进程控制块”EPROCESS等数据结构外)在用户空间已经有了一个“进程环境块”PEB,以及该进程的第一个“线程环境块”TEB。这就是进入
LdrInitializeThunk()前的“当前形势”。
PEB中有一个字段Ldr是个PEB_LDR_DATA结构指针,所指向的数据结构用来为本进程维持三个“模块”队列、即InLoadOrderModuleList、InMemoryOrderModuleList、和InInitializationOrderModuleList。这里所谓“模块”就是PE格式的可执行映像,包括EXE映像和DLL映像。前两个队列都是模块队列,第三个是初始化队列。两个模块队列的不同之处在于排列的次序,一个是按装入的先后,一个是按装入的位置。每当为本进程装入一个模块、即.exe映像或DLL映像时,就要为其分配,创建一个LDR_DATA_TABLE_ENTRY数据结构,并将其挂入InLoadOrderModuleList。然后,完成对这个模块的动态连接以后,就把它挂入InInitializationOrderModuleList队列,以便依次调用它们的初始化函数。相应地,LDR_DATA_TABLE_ENTRY数据结构中有三个队列头,因而可以同时挂在三个队列中。在我做的小实验当中就是通过查找这三个队列,来将当前进程的Dll加载信息显示出来的。具体的实例请见我的实验说明文档。
在LdrInitializeThunk()中,最开始为做的事情就是将加载的模块信息存放在PEB中的ldr字段,如上面一段文字中所述。之后,LdrInitializeThunk()函数又调用了一个叫LdrPEStartup()的函数。LdrPEStartup()函数首先判断了“期望地址”是否可用,PE映像的NtHeader(peb中有个ImageBaseAddress的地址,代表exe映像在用户空间的位置,在这个地址指向的数据结构中就有NtHeader的结构)中有个指针,指向一个OptionalHeader。在OptionalHeader中有个字段ImageBase,是具体映像建议、或者说希望被装入的地址,我们称之为“愿望地址”。在装入一个映像时,只要相应的区间(取决于它的期望地址和大小)空闲,就总正常装入。但是如果与已经被占用的区间相冲突,就只好利用LdrPerformRelocations()换个地方。
那么映像的愿望地址有着什么物理的或者逻辑的意义呢?我们知道,软件在编译以后有个连接的过程,即为函数的调用者落实被调用函数的入口地址、为全局变量(按绝对地址)的使用者落实变量地址的过程。连接有静态和动态两种,静态连接是在“制造”软件时进行的,而动态连接则是在使用软件时进行的。尽管EXE模块和DLL模块之间的连接是动态连接,但是EXE或DLL模块内部的连接却是静态连接。既是静态连接,就必须为模块的映像提供一个假定的起点地址。如果以此假定地址为基础进行连接以后就不可变更,使用时必须装入到这个地址上,那么这个地址就是固定的“指定地址”了。早期的静态连接往往都是使用指定地址的。但是,如果允许按假定地址连接的映像在实际使用时进行“重定位”,那么这假定地址就是可浮动的“愿望地址”了。可“重定位”的静态连接当然比固定的静态连接灵活。事实上,要是没有可“重定位”的静态连接技术,DLL的使用就无法实现,因为根本就不可能事先为所有可能的DLL划定它们的装入位置和大小。至于可“重定位”静态连接的实现,则一般都是采用间接寻址,通过指针来实现。
所谓重定位,就是计算出实际装入地址与建议装入地址间的位移a,然后调整每个重定位块中的每一个重定位项、即指针,具体就是在指针上加a。而映像中使用的所有绝对地址(包括函数入口、全局量数据的位置)实际上用的都是间接寻址,每个这样的地址都有个指针存在于某个重定位块中。
完成了可能需要的EXE映像重定位以后,下一个主要的操作就是LdrFixupImports()了。实际上这才是关键所在,它所处理的就是当前模块所需DLL模块的装入和连接。各DLL的程序入口记录在它们的LDR_DATA_TABLE_ENTRY数据结构中借助InInitializationOrderModuleList队列就可依次调用所有DLL的初始化函数。
NtHeader的OptionalHeader中有个数组DataDirectory[],其中之一是重定位目录。除此之外,数组中还有“(普通)引入(import)”、“绑定引入(bound
import)”以及其它多种目录,但是我们在这里只关心“引入”和“绑定引入”。这两个目录都是用于库函数的引入,但是作用不同,目录项的数据结构也不同。每个引入目录项都代表着一个被引入模块,其模块名、即文件名在dwRVAModuleName(ReactOS中的名字,下同)所指的地方。需要从同一个被引入模块引入的函数通常有很多个,dwRVAFunctionNameList指向一个字符串数组,数组中的每一个字符串都是一个函数名;与此相对应,dwRVAFunctionAddressList则指向一个指针数组。这两个数组是平行的,同一个函数在两个数组中具有相同的下标。从一个被引入模块中引入一个函数的过程大体上就是:根据函数名在被引入模块的引出目录中搜索,找到目标函数以后就把它实际装入后的入口地址填写到指针数组中的相应位置上。但是,这个过程可能是个开销相当大、速度比较慢的过程。为此,又发展起一种称为“绑定”的优化。
所谓绑定,就是在软件的编译,连接过程中先对使用时的动态连接来一次预演,预演时假定所有的DLL都被装入到它们的愿望地址上,然后把预演中得到的被引入函数的地址直接记录在引入者模块中相应引入目录下的指针数组中。这样,使用软件时的动态连接就变得很简单快捷,因为实际上已经事先连接好了。其实“绑定引入”和静态连接并无实质的不同。但是,各模块的版本配套就成为一个问题,因为万一使用的某个DLL不是当初绑定时的版本,而且其引出目录又发生了变化,就有可能引起混乱。为此,PE格式增加了一种“绑定引入”目录,相关的机制会进行判断。但是,“绑定引入”毕竟不是很可靠的,万一发现版本不符就不能使用原先的绑定了。所以“绑定引入”不能单独存在,而必须有普通引入作为后备。如果不符就不能按“绑定引入”目录处理引入,而只好退而求其次,改成按普通“引入”目录处理引入。另一方面,所谓“绑定”是指当被引入模块装入在预定位置上时的地址绑定,如果被引入模块的装入位置变了,就得对原先所绑定的地址作相应的调整、即“重定位”。
LdrFixupImports()函数首先从映像头部获取指向“引入”目录和“绑定引入”目录的指针。若存在“绑定引入”目录,则先通过LdrpGetOrLoadModule()找到或装入(映射)被引入模块的映像。首先当然是在模块队列中寻找,找不到就从被引入模块的磁盘文件装入。之后检查绑定版本是否一致,如果不一致就退而求其次,通过LdrpProcessImportDirectory()处理引入。当然,那样一来效率就要降低了。如果一致,则返回(因为在“预演”中已经连接好,效率当然高了)。而LdrpProcessImportDirectory()才是真正意义上的动态连接!!(说了这么多原来才开始……)。
LdrpProcessImportDirectory()首先根据目录项中的两个位移量取得分别指向函数名字符串数组和函数指针数组的指针。这两个数组是平行的(前面有介绍),然后对字符串数组中的元素计数,得到该数组的大小IATSize。显然,函数指针数组的大小也是IATSize。这里IAT是“引入地址表(Imported
Table)”的缩写,其实就是函数指针数组。这个数组在映像内部,其所在的页面在装入映像时已被加上写保护,而下面要做的事正是要改变这些指针的值,所以先要通过NtProtectVirtualMemory()把这些页面的访问模式改成可读可写。做完这些准备之后,下面就是连接的过程了,那就是根据需要把被引入模块所引出的函数入口(地址)填写到引入者模块的IAT中。与当前模块中的两个数组相对应,在被引入模块的“引出”目录中也有两个数组,说明本模块引出函数的名称和入口地址(在映像中的位移)。当然,这两个数组也是平行的。要获取被引入模块中的函数入口有两种方法,即按序号(Ordinal)引入和按函数名引入。从而分别调用LdrGetExportByOrdinal()和LdrGetExportByName()。这两个函数都返回目标函数在本进程用户空间中的入口地址,把它填写入当前模块引入目录函数指针数组中的相应元素,就完成了一个函数的连接。当然,同样的操作要循环实施于当前模块需要从给定模块引入的所有函数,并且(在上一层)循环实施于所有的被引入模块。完成了对一个被引入模块的连接之后,又调用NtProtectVirtualMemory()恢复当前模块中给定目录项内函数指针数组所在页面的保护。
到此,我们大概的清楚Windows Dll的加载与连接过程。
总结与感想
以上的Dll加载与连接过程有点抽象与混乱,在这里进行总结,绝体的函数加载关系如下:
<img ALT="" src="/blog7style/images/common/sg_trans.gif" real_src ="http&#58;//album.hi.csdn.net/app_uploads/weidade2/.p.jpg?d=36961" WIDTH="408" HEIGHT="545"
TITLE="转:Windows&DLL基本原理与加载连接的实现" />
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。WINDOWS系统注册表详细工作原理
我的图书馆
WINDOWS系统注册表详细工作原理
WINDOWS系统注册表详细工作原理
WINDOWS系统注册表是什么样的原理
1. Hkey-local-machine\ software\ microsoft\ windows\ currentVersion\ Policies\ Ratings 保存IE4.0中文版&#8220;安全&#8221;*&#8220;分级审查&#8221;中设置的口令()。  2. Hkey-local-machine\ software\ microsoft\ windows\ currentVersion\ exploredesktop\nameSpace保存桌面中特殊的图标,如、收件箱、MS Network等。 Hkey_local_machine\software\microsoft\windows\currentVersion\explorer\user shell folders 保存个人文件夹、的路径  3. Hkey_local_machine\system\currentControlSet\control\keyboard Layouts保存键盘使用的语言以及各种中文输入法 Hkey_users\.Default\software\microsoft\internet explorer\typeURLs保存IE浏览器地址栏中输入的URL地址列表信息。清除文档菜单时将被清空。  4. Hkey_users\.Default\so..\mi..\wi..\currentVersion\ex..\menuOrder\startMenu 保留程序菜单排序信息 5.Hkey_users\.Default\so..\microsoft\windows\currentVersion\explorer\RunMRU 保存&#8220;开始 * 运行...&#8220;中运行的程序列表信息。清除文档菜单时将被清空。 6.Hkey_local_machine\system\CurrentControlSet\control\update 立即刷新设置。值为00设置为自动刷新,01设置为手工刷新[在中按F5刷新]。  7. Hkey_users\.Default\so..\microsoft\windows\currentVersion\explorer\ecentDocs 保存最近使用的十五个文档的快捷方式(删除掉可解决文档名称重复的毛病),清除文档菜单时将被清空。  8. Hkey_local_machine\software\microsoft\windows\currentVersion\uninstall 保存已安装的Windows应用程序卸载信息。 9.hkey_users\.default\software\microsoft\windows\currentVersion\applets 保存Windows应用程序的纪录数据。 10.Hkey_local_machine\system\CurrentControlSet\services\class 保存-增添硬件设备-设备类型目录。  11. HKEY_CURRENT_USER\Control Panel\Desktop 新建串值名MenuShowDelay=0 可使&#8220;开始&#8221;菜单中子菜单的弹出速度提高。新建串值名MinAnimate,值为1启动动画效果开关窗口,值为0取消动画效果。  12. Hkey_local_machine\software\microsoft\windows\currentVersion\run 保存由控制面板设定的计算机启动时运行程序的名称,其图标显示在任务条右边。[启动文件夹程序运行时图标也在任务条右边] hkey_users\.default\software\microsoft\windows\currentVersion\run保存由用户设定的计算机启动时运行程序的名称,其图标显示在任务条右侧。 13. HKEY_CLASS_ROOT/Paint.Pricture/DefaultIcon 默认图片的图标。双击窗口右侧的字符串,在打开的对话框中删除原来的,输入%1。重新启动后,在&#8220;我的电脑&#8221;中打开Windows目录,选择&#8220;大图标&#8220;,然后看到的Bmp文件的图标再也不是千篇一律的画板图标了,而是每个Bmp文件的略图。  Windows文件夹中有system.dat和user.dat这样两个隐藏文件,其中保存了至关重要的信息。 可以通过运行regedit.exe来修改windows的设置方法,我们了解Windows系统注册表详细含义用途对我们作用很大.
回答人的补充 && 09:59
HKEY_LOCAL_MACHINE包括了如下五个子键:
HARDWARE子键:
该子键下面存放一些有关超文本终端、数学协处理器和串口等信息。HARDWARE子键下面包括两个子键DEVICEMAP(用于存放设备映象)、DESCRIPTION(存放有关系统信息)。DEVICEMAP子键的层次结构如下:
HKEY_LOCAL_MACHINE/HARDWARE
HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP
HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/SERIALCOMM
在HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/SERIALCOMM分支下面包括如下设置内容:
*COM1=COM1:指定COM1端口。
*COM2=COM2:指定COM2端口。
DESCRIPTION子键的层次结构如下:
HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION
HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System
HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/FloatingPointProcessor
HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/FloatingPointProcessor/0
*SAM子键:系统自动将其保护起来。
*SECURITY子键:包含了安全设置的信息,同样也让系统保护起来。
*SOFTWARE子键:包含了系统软件、当前安装的应用软件及用户的有关信息。
*SYSTEM子键:
该子键存放的是启动时所使用的信息和修复系统时所需的信息,其中包括各个驱动程序的描述信息和配置信息等。System子键下面只有一个CurrentControlSet子键,系统在这个子键下保存了当前的驱动程序控制集的信息。这里介绍CurrentControlSet子键下面的Control和Services子键。
Control子键
这个子键中保存的是由控制面板中各个图标程序设置的信息。由于控制面板中的各个图标程序可能会把信息写在不同的子键下,所以用户最好不要通过注册表编辑器来修改这些信息,否则容易引起系统死机。
(1) fontassoc子键
该子键存放的是有关字体设置信息(如缺省字体、替代字体以及字符集等)。在
HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ fontassoc分支下还有两个子键Associated DefaultFonts、Associated CharSet。
Associated DefaultFonts子键
在HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/fontassoc/Associated DefaultFonts分支下有如下设置信息:
*AssocSystemFont=simsun.ttf:定义系统字体。simsun.ttf为TrueType宋体字库文件。
*FontPackageDontCare=宋体:以下行设置了已安装的套装字体(FontPackage),在
Win3.x中,这些设置在Wifeman.ini文件的[FontPackages]小节中列出。
*FontPackageRoman=宋体
*FontPackageSwiss=宋体
*FontPackageModern=宋体
*FontPackageScript=宋体
*FontPackageDecorative=宋体 Associated CharSet子键 在
HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ fontassoc/Associated
CharSet分支下是关于一些系统字体的设置。
(2) Nls子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ Nls分支中,它是用来设置Windows的语言特性,如代码页、EUDC内码范围、语言分类等。
(3) SessionManager子键
该子键用于管理系统的会话,它包括三个主键和八个子键。
KnownDLLs子键
该子键下包含了Windows中32位Dll文件以及标识。
CheckBadApps子键
该子键用于检查有问题的16位应用程序,这些应用程序在Windows中运行会出现莫名其妙的问题,甚至引起系统的崩溃。该子键下面有许多应用程序的可执行文件的子键,如PPower.exe是MS DOS 6.x一个用于便携机电源管理的程序,它在注册表中的分支是 HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/SessionManager/CheckBadApps/POWER.EXE。
通常这个分支下有几个子键!
CheckBadApps400子键
该子键用于检查有问题的32位应用程序,它在注册表的分支是
HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/
SessionManager/CheckBadApps400。
该分支下面有许多应用程序的子键,这些子键有这些应用程序的相应运行设置,例如,
UltraEdit32是一个32位的多功能编辑器,其可执行文件为Ui32.exe,它在注册表的分支是HKEY_LOCAL_MACHINE/System/ CurrentControlSet/control/SessionManager/CheckBadApps400
/ UE32.EXE。在该分支下面有Ui32.exe的运行设置(包括可执行文件Ui32.exe本身的检查标志、版本检查标志以及其标志位等)。
AppPatches子键
该子键用于应用程序的补丁,使这些应用程序能够很好地运行在Windows中。在Windows 3.x时代,这些补丁是放在Win.ini文件中。该子键位于注册表的HKEY_LOCAL_MACHINE/System/CurrentControlSet/ control/SessionManager/AppPatches分支上。在该分支下面有许多应用程序的子键及其设置内容。例如,在该分支下有一个Setup的应用程序,其位置是HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/SessionManager/AppPatches/SETUP。
(4) MediaResources子键
该子键用于设置多媒体资源,其位置在HKEY_LOCAL_MACHINE/System/
CurrentControlSet/control/MediaResources分支上。该分支下还包括DirectSound、
Joystick、MIDINonGeneralMIDIDriverList子键及其设置。
(5)MediaProperties子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ Media-Properties分支上,用于设置多媒体的属性。
(6)FileSystem子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ FileSystem分支上,主要对Windows的NTFS及Win31、Win9.x文件系统进行设置。
(7) Shutdown子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ Shutdown分支上,用于对Windows关机时的设置,一般里面有一个快速关机的设置。
(8)keyboard layouts子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ keyboard layouts分支上,主要对Windows的键盘布局(Keyboard Layouts)或者键盘语言进行设置。该子键下面包括多个关于键盘语言(也包括汉字输入法)的子键,这些子键使用数值表示出来。
(9) Update子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ Update分支上,用于确定&#8220;控制面板&#8221;窗口是否被刷新,此子键的功能与&#8220;控制面板&#8221;窗口中的&#8220;查看&#8221;菜单中的&#8220;刷新&#8221;相同。
回答人的补充 && 10:00
(10) TimeZoneInformation子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/TimeZoneInformation分支上,用于设置时区信息。
(11) Print子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ Print分支上,用于设置打印机。
(12)IDConfigDB子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ IDConfigDB分支上,用于显示硬件配置文件的配置数据、配置名称等其他信息。
(13)ComputerName子键
该子键下面具有如下分层结构:
HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ComputerName/ActiveComputerName
HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/ ComputerName/ComputerName
该分层结构用于设置计算机名称。
(14)SecurityProviders子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/control/SecurityProviders分支上,用于设置网络供应商的安全功能。
Services子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services分支上。该子键中存放了Windows中各项服务的信息,有些是自带的,有些是随后安装的。在该子键下面的每个子键中存放相应服务的配置和描述信息。
(1) Class子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/Class分支上。该子键中保存的是Windows支持的不同种类硬件的信息,它下面的子键与&#8220;控制面板&#8221;中添加新硬件的分类类似。 下面简单介绍几种硬件分类子键。
① 1394子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services /Class1394,用于配置满足IEEE 1394规范的&#总线控制器&#8221;。 * @=1394 总线控制器:指定1394子键的描述名称。
* Icon=-21:指定图标标识。
* Link={6BDD1FC1-810F-11D0-BEC7-0F:指定&#总线控制器&#8221;的连接。该连接将在{6BDD1FC1-810F-11D0-BEC7-0F子键中定义。
② {6BDD1FC1-810F-11D0-BEC7-0F}子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/Class/ {6BDD1FC1-810F-11D0-BEC7-0F}分支上,用于配置&#总线控制器&#8221;的连接。
*Link=1394:指定连接为&#&#8221;。
*Class=1394:指定&#总线控制器&#8221;类为&#&#8221;。
③Adapter子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/Class/Adapter分支上,用于配置&#8220;CD-ROM 控制器&#8221;。
*@=CD-ROM 控制器:指定该子键的描述名称。
*Icon=-9:指定图标标识。
*Link={4d36e964-e325-11ce-bfc1-0}:指定&#8220;CD-ROM 控制器&#8221;的连接,由{4d36e964-e325-11ce-bfc1-0}子键进一步地定义。
④{4d36e964-e325-11ce-bfc1-0}子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/Class/ {4d36e964-e325-11ce-bfc1-0}分支上,用于配置&#8220;CD-ROM 控制器&#8221;的连接。
*Link=Adapter:指定连接为&#8220;Adapter&#8221;。
*Class=Adapter:指定类为&#8220;Adapter&#8221;。
⑤Printer子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Class/Printer分支上,用于配置&#8220;打印机&#8221;。
*@=打印机:指定该子键的描述名称。
*Installer=MSPRINT.DLL:指定&#8220;打印机&#8221;的安装程序为&#8220;MSPRINT.DLL&#8221;。
*Icon=-4:指定图标标识。
*NoDisplayClass=1:确定是否显示类。若为1,则不显示类。若为0,则显示类。
*Link={4d36e979-e325-11ce-bfc1-0}:指定&#8220;打印机&#8221;的连接。
⑥ MEDIA子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/Class/MEDIA分支上,用于配置多媒体设备,包括声音卡、视频卡和游戏控制器等。
*@=声音、视频和游戏控制器:指定该子键的描述。
*Link={4d36e96c-e325-11ce-bfc1-0:指定&#8220;多媒体&#8221;的连接,
参见{4d36e96c-e325-11ce-bfc1-0}子键。
*Icon=0:指定图标标识。
*Installer=mmci.dll:指定&#8220;多媒体&#8221;设备的安装程序为&#8220;MMCI.DLL&#8221;。
(2) VxD子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/VxD分支上。该子键保存了Windows中所有虚拟设备驱动程序的信息。由于Windows系统能够自动管理这些信息,因此,在通常情况下最好不要通过注册表编辑器来修改这些信息,但是了解此子键下的信息是有好处的,因为有一些功能(如拨号网络提速)必须修改此子键下的信息。
① Winsock子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/
Services/VxD/Winsock分支上,用于设置WinSock。 *IrSockets=wsirda.vxd:指定
Winsock的虚拟驱动程序为wsirda.vxd。
② VNETSUP子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/VNETSUP分支上,用于设置网络的标识以及初始化数值。
*ComputerName=caogjwj:计算机名称。
*Workgroup=cgj:工作组名字。
*Comment=CAO GUO JUN:计算机描述。
*StaticVxD=vnetsup.vxd:静态虚拟设备驱动程序为vnetsup.vxd。
*Start=hex:00:设置初始化数值。
*NetClean=hex:01:确定是否清理网络。若为01,则清理网络。若为00,则不清理网络。
*MaintainServerList=2:设置浏览主控服务器的属性值。
*LMAnnounce=0:设置LM广播(LMAnnounce)属性值。
为了进一步地配置网络服务,在Ndi子键下面将有如下子键结构:
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/ VNETSUP/NdiHKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/ VNETSUP/Ndi/params
params子键用于进一步地设置浏览主控服务器、LM广播的属性值。
a.MaintainServerList子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/VxD/VNETSUP/Ndi/params/MaintainServerList分支上,用于设置浏览主控服务器的属性值。在Windows中,浏览服务是由一个浏览主控服务器和一个浏览备份服务器来管理浏览列表。您可以使用net view命令来获得浏览主控服务器的机器列表。
*default=2:缺省属性值为2。
*ParamDesc=浏览主控服务器:属性描述。
*type=enum:属性值类型为枚举型。
*@=2:缺省值为2。
以上枚举型由enum子键定义。enum位于
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/VNETSUP/Ndiparams/MaintainServerList/enum分支上。
*2=自动:使用&#8220;自动&#8221;选项,则系统将允许该终端变成一个合格的浏览主控服务器。
*1=启用:使用&#8220;启用&#8221;选项,则系统将允许该工作站将成为浏览主控服务器。
*0=禁用:使用&#8220;禁用&#8221;选项,则系统将使此机器不可能成为浏览主控服务器。
b.LMAnnounce子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/
Services/VxD/VNETSUP/Ndi/params/LMAnnounce分支上,用于设置LM广播的属性值。LM广播设置用于LAN Manager网络环境,它要求每个工作站必须向网络上的其他工作站广播自己的存在。
*default=0:缺省属性值为0。
*ParamDesc=LM 广播:属性描述。
*type=enum:属性类型为枚举型。
*@=0:缺省值为0。
枚举型是由enum子键定义的。enum位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/VNETSUP/Ndi/params/LMAnnounce/ enum分支上。
*1=是:使用&#8220;是&#8221;选项,则LAN Manager就会开始广播,这会增加用户的网络冲突。
*0=否:如果在用户的网络环境中不需要LM广播性能,则选择&#8220;否&#8221;选项。
③ NDIS子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/VxD/NDIS分支上,用于设置NIDS。
*Start=hex:00:初始化值为00。
*NetClean=hex:01:确定是否清理网络。
*StaticVxD=ndis.vxd,ndis2sup.vxd:静态虚拟设备驱动程序为ndis.vxd、ndis2sup.
vxd。*DeviceVxDs=ndiswmi.sys:NIDS的设备驱动程序为ndiswmi.sys。
④ JAVASUP子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/JAVASUP分支上,用于设置JAVASUP(Java服务)。
*Start=hex:00:初始化值为00。
*StaticVxD=JAVASUP.VXD:静态虚拟设备驱动程序为JAVASUP.VXD。
回答人的补充 && 10:00
⑤ CONFIGMG子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/CONFIGMG分支上,用于所有系统设备的管理。
*StaticVxD=*CONFIGMG:静态虚拟设备驱动程序为*CONFIGMG。
*Start=hex:00:初始化值为00。
*SysDM=SYSDM.CPL:由SYSDM.CPL启动系统设备管理器。
*SysDMFunc=DMSetupDevnode:由DMSetupDevnode启动系统设备管理器功能。
*Detect=SYSDM.CPL:由SYSDM.CPL自动检测系统设备。
*DetectFunc=DMRedetect:由DMRedetect启动自动检测功能。
*Private=SYSDM.CPL:由SYSDM.CPL启动私有设备管理器。
*PrivateFunc=DMPrivateProblem:由DMPrivateProblem启动私有设备管理器功能。
*RemoveRomOkay=SYSDM.CPL:由SYSDM.CPL确定ROM中内容删除是否成功。
*RemoveRomOkayFunc=DMRemoveRomOkay:由DMRemoveRomOkay启动ROM删除功能。
*AskForConfig=SYSDM.CPL:使用SYSDM.CPL查询系统设备的设置。*AskForConfigFunc=
DMAskForConfig:由DMAskForConfig启动系统设备的查询功能。
*AskForUndock=SYSDM.CPL:使用SYSDM.CPL查询设备出坞情况。
*AskForUndockFunc=DMAskForUndock:由DMAskForUndock启动设备出坞查询功能。
在CONIFGMG子键下面还有两个子键,用于设置系统总线。
a.SpannableBus子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/CONFIGMG/SpannableBus分支上,用于设置可扩展的总线(Spannable Bus)的个数。
*PCI=hex:00:设置可扩展的PCI总线个数。
*ISAPNP=hex:00:设置可扩展的即插即用ISA总线的个数。
b.PnPBus子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/CONFIGMG/PnPBus分支上,用于设置即插即用总线(PnP Bus)的个数。
*PCI=hex:00:设置PCI总线的个数。
*BIOS=hex:00:设置BIOS总线的个数。
*EISA=hex:00:设置EISA总线的个数。
*USB=hex:00:设置USB总线的个数。
*HID=hex:00:设置HID总线的个数。
*1394=hex:00:设置1394总线的个数。
*ISAPNP=hex:00:设置ISAPNP总线的个数。
*MF=hex:00:设置MF总线的个数。
*ACPI=hex:00:设置ACPI总线的个数。
⑥ NTKern子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/VxD/NTKern分支上,用于设置NTKern。
*StaticVxD=*NTKERN:静态虚拟驱动程序为*NTKERN。
*Start=hex:00:设置初始化数值。
(3) WinSock子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/Winsock分支上,存放的是当系统连接Internet时使用的WinSock的信息。 在该子键下面有如下两个子键:
① Autodial子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Winsock/Autodial分支上,用于设置Autodial(自动拨号)。
*AutodialDllName32=wininet.dll:启动自动拨号功能的32位DLL驱动程序为wininet.dll
*AutodialFcnName32=InternetAutodialCallback:设置自动拨号的回调功能。
② Parameters子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Winsock/Parameters分支上,用于设置WinSock参数。
* MSTCP=:使用HKEY_LOCAL_MACHINE/System/CurrentControlSet/
Services/VxD/MSTCP/Parameters/Winsock分支中的参数设置WinSock。
(4) WDMFS子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/WDMFS分支上,用于设置WDMFS(WDM文件系统)。
*ImagePath=//SystemRoot//System32//Drivers//wdmfs.sys:WDMFS驱动程序为wdmfs.sys。
*ErrorControl=hex:01,00,00,00:设置错误控制码。
*Start=hex:00:设置初始化数值。
*Type=hex:01,00,00,00:设置WDMFS的类型。
*DisplayName=WDM Windows File System Mapper:显示WDMFS的名称。
(5) UPDATE子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/UPDATE分支上,用于设置UPDATE(更新服务)。
*ImagePath=//SystemRoot//System32//Drivers//update.sys:UPDATE服务的驱动程序为update.sys。
*ErrorControl=hex:01,00,00,00:设置错误控制码。
*Start=hex:00:设置初始化数值。
*Type=hex:01,00,00,00:设置UPDATE服务的类型。
*DisplayName=Intel Update Driver:UPDATE服务的显示名称。
(6) RemoteAccess子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ ServicesRemoteAccess分支上,存放的是和Windows拨号网络有关的信息。
*Version=1.2c:版本号。
*Remote Connection=hex:00,00,00,00:设置远程连接。 在该子键下面有如下两个子键:
① Authentication子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services
/RemoteAccess/Authentication分支上,用于设置拨号网络的验证信息(如服务器类型、协议等)。
② NetworkProvider子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services RemoteAccess/NetworkProvider分支上,用于设置拨号网络的驱动程序。
(7) MSNP32子键
该子键具有如下子键结构:HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/MSNP32
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/MSNP32/NetworkProvider NetworkProvider子键用于保存Microsoft网络用户的验证信息。
*GroupFcn=GROUPPOL.DLL,NTGetUserGroups:由GROUPPOL.DLL、NTGetUserGroups设置组功能。
*AuthenticatingAgent=:设置验证代理。若为空,则使用缺省的验证代理。
*LogonDisconnected=hex:00,00,00,00:设置登录断开标志。
*Name=Microsoft Network:设置名称。
*ProviderPath=msnp32.dll:&#8220;Microsoft网络用户&#8221;的驱动程序为msnp32.dll。
*Description=Microsoft Network:设置&#8220;Microsoft网络用户&#8221;的描述。
*NetID=hex:00,00,01,00:网络标识号。
*CallOrder=hex:00,00,00,40:设置调用顺序。
回答人的补充 && 10:01
(8) NWNP32子键
该子键下面具有如下子键结构:HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/NWNP32HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/NWNP32/NetworkProvider NetworkProvider子键中存放的是Microsoft网络用户针对Netware网络时的验证信息。
*GroupFcn=GROUPPOL.DLL,NWGetUserGroups:由GROUPPOL.DLL、NWGetUserGroups设置组功能。
(9) Arbitrators子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Arbitrators
分支上。该子键中保存的信息是用来解决不同的设备间资源冲突的问题,它的四个子键中分别保存了内存区域、DMA、I/O端口和中断的信息。
① IRQArb子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Arbitrators/IRQArb分支上,主要用于保存保留的中断信息。
② DMAArb子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Arbitrators/DMAArb分支上,主要用于保存保留的DMA信息。
③ AddrArb子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Arbitrators/AddrArb分支上,用于保存保留的内存区域列表。
④ IOArb子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/Arbitrators/IOArb分支上,用于保存保留的I/O端口列表。
(10) WinSock2子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/WinSock2分支上,用于存放与Internet连接时WinSock 2.0版本的有关信息。
① Parameters子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/WinSock2/Parameters分支上,用于存放WinSock 2.0版的有关参数,如注册版本号、协议目录、名字空间目录等。
② Providers子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/WinSock2/Providers分支上,用于存放WinSock 2.0的提供商信息。在该子键下面还提供了一个INET子键,用于存放提供商名称。
(11) wdmaud子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/ Services/wdmaud分支上,用于存放WDM Audio(WDM音频)信息。
*Group=Base:设置WDM Audio所属组(基组)。
*ImagePath=//SystemRoot//system32//drivers//wdmaud.sys:WDM Audio驱动程序为
wdmaud.sys。
*Start=hex:03,00,00,00:设置初始化值。
*Type=hex:01,00,00,00:设置类型值。
*ErrorControl=hex:01,00,00,00:设置错误控制代码。 类似于wdmaud子键设置的还有redbook、sbemul、swmidi等子键。
(12) NPSTUB子键
该子键具有如下子键结构:HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/NPSTUB
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/NPSTUB/NetworkProviderNetworkProvider子键用于存放&#8220;Microsoft友好登录&#8221;的有关信息。
*Name=Microsoft 友好登录:名称。
*ProviderPath=ienpstub.dll:32位保护模式驱动程序为ienpstub.dll。
*RealDLL=mslocusr.dll:实模式DLL驱动程序为mslocusr.dll。
*Description=Microsoft 友好登录:描述。
*NetID=hex:00,00,01,00:设置网络标识。
*CallOrder=hex:00,00,00,40:设置调用顺序。
(13) ProtectedStorage子键
该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/ProtectedStorage分支上,用于存放ProtectedStorage(受保护的系统存储)信息。
在该子键下面有一个Parameters子键,它位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/ProtectedStorage/Parameters分支上,用于设置受保护的系统存储参数。
*ImagePath=C://WINDOWS//SYSTEM//PSTORES.EXE:启动保护的系统存储功能的程序为
PSTORES.EXE。
*AuthCodeCfg=dword::设置验证代码值。
*Configuration=dword::设置配置值。
另外,Parameters子键下面还有一个S子键,该子键位于HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/ ProtectedStorage/Parameters/S分支上,用于进一步地设置pstores.exe、psbase.dll系统参数值。
*pstores.exe=hex:13,ff,e7,bb,a3,f2,01,1e,87,.......:设置pstores.exe系统参数值。
*psbase.dll=hex:d0,08,ef,10,2b,bf,b2,f2,23,.......:设置psbase.dll系统参数值。
(14) WebPost子键
该子键具有如下子键结构:
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/WebPostHKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/WebPost/Providers
Providers子键下面保存了所有与Internet Mail(这是Outlook Express软件中的一个电子邮件管理程序)有关的信息。
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢

我要回帖

更多关于 共享单车定位原理 的文章

 

随机推荐