六。其他子系统
除了win32子系统外,windows还有OS/2 子系统、POXSIX子系统。WOW子系统、VDM子系统,这些系统各自为应用程序提供API,但是都是通过win32子系统
来实现,这类似虚拟机的概念,只是说一说 WOW(windows on windows)子系统吧,此版本是为了兼容在16位的windows,当然现在win7 上的 SystemWOW64
目录就可想而知了,就是虚拟的64位的子系统
七、Native API (原语API)
在Win32下面还有一层原语API,就在win32 API 加上 Nt 的那些函数 类似的 win32 API 有 CreateFile() 对应的原语API就是NtCreateFile(),其实我
们如果只做win32的开发,就直接不需要Native API了,就是是win32 API调用了Native API ,Native API 是从用户层进入内核模式的大门,她是通过软件
中断的方式进入到内核模式,并调用内核的系统服务,微软是不鼓励程序猿使用Native API 的,因为这会根据不同的版本在改变,只有多数的win32 API是
不变的,然而根据效率和一些诡异的要求你可以直接调用Native API
八、系统服务
Native API 从用户模式进入内核模式,调用系统服务,那个软中段在不同的版本有所不同,但是XP上是sysenter 指令完成的,在软中断会Native API
的参数和系统服务号传递进内核模式,在系统服务组件中,有一个系统服务描述符表(system service descriptor table),根据这个系统服务号为索引,
从表中可以查出对应的系统服务函数的函数地址(诡异的调用可以在这里开始了,直接修改系统服务函数描述表,一般的系统服务函数和Native API 函数)
有相同的函数名,例如NtCreateFile(),他会调用具有相同名字的系统调用,两个函数的名称是一样的,在系统调用中会进行参数的合法性,这也是操作系统
的最后一道屏障,所以修改系统服务函数描述符表的函数地址就可以执行自己任意的代码了,当然特权级别是ring 0 级别的奥!!! you can do anything
you wanna,但是执行失败的后果不仅仅是应用程序退出这莫简单了,或许直接就蓝给你看。。。。
九、执行程序组件
windows 执行体组件位于Ntoskrnl.exe 的上层,而内核位于其上层,在win2k后执行体组件是内核模式下的一组服务函数,他们位于ntskrnl.exe 中,
下面说一说执行体组件组件的若个组成部分
1.对象管理程序
windows操作系统提供的所有服务几乎都是以对象的形式存在的,windows 对象类似于面向对象(OOP)语言的概念,这实际就是把所有的服务和设备
直接抽象成一个对象,那么操作对象就等于修改他的成员变量,还有一些成员变量是不允许直接访问的,就像对象概念中的私有变量,要通过windows提供
一些特定例程来访问(这些例程就像是共有成员函数)
面向对象编程被公认是一种十分有效的软件设计技术,可以提供对代码全面组织和封装,通过对象隐藏了实现细节,提高软件的可靠性健壮性(所要学
习面向对象编程技术)。对象的管理就是创建、管理、回收这些对象组件、在驱动程序开发中,涉及很多对象,如驱动对象(Driver Object) 和设备
对象(Device Object)etc.
2.进程管理
在win2k中,每一个进程都有自己专门地址和安全身份(进程是系统分配资源的最小单位),但不是运行的最小执行单位,而线程才是最小执行单位,
进程相当于是线程的容器,进程管理负责就是进程创建、进程调度.终止进程等,这些管理组件是相互联系的(进程管理和对象管理组件等)
3.虚拟内存管理
windows引入了虚拟内存,这样就必须实现物理内存和虚拟内存之间的映射关系,并且每一个进程有独立的4G 虚拟地址空间,每个进程看到的虚拟
内存是完全不同的,因为每个进程的内存映射是完全不同的,这样为了保证每个进程之间是不会相互干扰的,进程之间如果需要访问对方的虚拟内存,
必须通过专门的几种内存通信机制
windows 规定,将4GB的虚拟内存分成两半,虚拟内存的0 ~ 0x7FFFFFFF规定为用户模式的地址,在用户模式下的程序只能访问这几段虚拟地址,
在0x80000000 ~0xFFFFFFFF 规定为内核模式的地址规定为内核模式的地址,这段程序只允许被内核模式的程序访问(终于明白在OD等调试软件的起始
都是在0 ~ 0x7fffffff 直接呐,因为OD是标准的 用户模式(ring 3)调试神器)
还有就是在内核模式下,所有进程的在指向内核地址是完全相同的(映射方式完全相同)这样在每个进程中顶端2GB的内核模式地址的数据是完全一直
的,虚拟内存管理程序是负责对虚拟内存管理的模块,对虚拟内存的申请、回收等操作都是该模块实现的(知道每一个进程的内核部分都是公共的,我们
就又高兴了,就是说在A程序里面出现设备地址(内核设备) 我可以在B程序里面继续使用(传递同样的内核服务请求,同样的控制码,窃喜中。。。))
4.I/O 管理
I/O管理器负责发起I/O请求,并且管理这些请求,它甴一系列的内核模式下的列程所组成,这些例程为用户提供了统计接口,I/O管理器的目标使
来自用户模式的I/O请求独立于设备
无论是对于端口的读写、对键盘的访问,还是对磁盘文件的操作都统一为IRP(I/O request packages)请求形式,其中IRP包含了对设备操作的重要
数据,例如是读操作还是写操作,度多少字节,写多少字节,是直接读到进程中还是先读到缓冲区,再读到进程中等
IRP被传递到具体设备的驱动程序中,驱动程序负责“完成”这些IRP,并将完成的状态按照原路返回到用户模式下的应用程序中,实际上,I/O管理器
器担当着用户模式代码和设备驱动程序之间的接口
5.配置管理程序
在windows中,配置管理程序记录所有计算机软件、硬件配置信息,它使用一个被称为注册表(Registry)的数据库保存数据,驱动设备就是根据
注册表中的这些信息进行加载
另外,驱动程序从注册表中读取相应的参数,这样可以提高驱动程序的灵活性,例如,设备操作的延时时间,可以作为参数写进注册表,驱动程序
加载的时候读取该值,而不是在编程的时候将其写成定值,这这大大调高驱动程序的灵活性
除了win32子系统外,windows还有OS/2 子系统、POXSIX子系统。WOW子系统、VDM子系统,这些系统各自为应用程序提供API,但是都是通过win32子系统
来实现,这类似虚拟机的概念,只是说一说 WOW(windows on windows)子系统吧,此版本是为了兼容在16位的windows,当然现在win7 上的 SystemWOW64
目录就可想而知了,就是虚拟的64位的子系统
七、Native API (原语API)
在Win32下面还有一层原语API,就在win32 API 加上 Nt 的那些函数 类似的 win32 API 有 CreateFile() 对应的原语API就是NtCreateFile(),其实我
们如果只做win32的开发,就直接不需要Native API了,就是是win32 API调用了Native API ,Native API 是从用户层进入内核模式的大门,她是通过软件
中断的方式进入到内核模式,并调用内核的系统服务,微软是不鼓励程序猿使用Native API 的,因为这会根据不同的版本在改变,只有多数的win32 API是
不变的,然而根据效率和一些诡异的要求你可以直接调用Native API
八、系统服务
Native API 从用户模式进入内核模式,调用系统服务,那个软中段在不同的版本有所不同,但是XP上是sysenter 指令完成的,在软中断会Native API
的参数和系统服务号传递进内核模式,在系统服务组件中,有一个系统服务描述符表(system service descriptor table),根据这个系统服务号为索引,
从表中可以查出对应的系统服务函数的函数地址(诡异的调用可以在这里开始了,直接修改系统服务函数描述表,一般的系统服务函数和Native API 函数)
有相同的函数名,例如NtCreateFile(),他会调用具有相同名字的系统调用,两个函数的名称是一样的,在系统调用中会进行参数的合法性,这也是操作系统
的最后一道屏障,所以修改系统服务函数描述符表的函数地址就可以执行自己任意的代码了,当然特权级别是ring 0 级别的奥!!! you can do anything
you wanna,但是执行失败的后果不仅仅是应用程序退出这莫简单了,或许直接就蓝给你看。。。。
九、执行程序组件
windows 执行体组件位于Ntoskrnl.exe 的上层,而内核位于其上层,在win2k后执行体组件是内核模式下的一组服务函数,他们位于ntskrnl.exe 中,
下面说一说执行体组件组件的若个组成部分
1.对象管理程序
windows操作系统提供的所有服务几乎都是以对象的形式存在的,windows 对象类似于面向对象(OOP)语言的概念,这实际就是把所有的服务和设备
直接抽象成一个对象,那么操作对象就等于修改他的成员变量,还有一些成员变量是不允许直接访问的,就像对象概念中的私有变量,要通过windows提供
一些特定例程来访问(这些例程就像是共有成员函数)
面向对象编程被公认是一种十分有效的软件设计技术,可以提供对代码全面组织和封装,通过对象隐藏了实现细节,提高软件的可靠性健壮性(所要学
习面向对象编程技术)。对象的管理就是创建、管理、回收这些对象组件、在驱动程序开发中,涉及很多对象,如驱动对象(Driver Object) 和设备
对象(Device Object)etc.
2.进程管理
在win2k中,每一个进程都有自己专门地址和安全身份(进程是系统分配资源的最小单位),但不是运行的最小执行单位,而线程才是最小执行单位,
进程相当于是线程的容器,进程管理负责就是进程创建、进程调度.终止进程等,这些管理组件是相互联系的(进程管理和对象管理组件等)
3.虚拟内存管理
windows引入了虚拟内存,这样就必须实现物理内存和虚拟内存之间的映射关系,并且每一个进程有独立的4G 虚拟地址空间,每个进程看到的虚拟
内存是完全不同的,因为每个进程的内存映射是完全不同的,这样为了保证每个进程之间是不会相互干扰的,进程之间如果需要访问对方的虚拟内存,
必须通过专门的几种内存通信机制
windows 规定,将4GB的虚拟内存分成两半,虚拟内存的0 ~ 0x7FFFFFFF规定为用户模式的地址,在用户模式下的程序只能访问这几段虚拟地址,
在0x80000000 ~0xFFFFFFFF 规定为内核模式的地址规定为内核模式的地址,这段程序只允许被内核模式的程序访问(终于明白在OD等调试软件的起始
都是在0 ~ 0x7fffffff 直接呐,因为OD是标准的 用户模式(ring 3)调试神器)
还有就是在内核模式下,所有进程的在指向内核地址是完全相同的(映射方式完全相同)这样在每个进程中顶端2GB的内核模式地址的数据是完全一直
的,虚拟内存管理程序是负责对虚拟内存管理的模块,对虚拟内存的申请、回收等操作都是该模块实现的(知道每一个进程的内核部分都是公共的,我们
就又高兴了,就是说在A程序里面出现设备地址(内核设备) 我可以在B程序里面继续使用(传递同样的内核服务请求,同样的控制码,窃喜中。。。))
4.I/O 管理
I/O管理器负责发起I/O请求,并且管理这些请求,它甴一系列的内核模式下的列程所组成,这些例程为用户提供了统计接口,I/O管理器的目标使
来自用户模式的I/O请求独立于设备
无论是对于端口的读写、对键盘的访问,还是对磁盘文件的操作都统一为IRP(I/O request packages)请求形式,其中IRP包含了对设备操作的重要
数据,例如是读操作还是写操作,度多少字节,写多少字节,是直接读到进程中还是先读到缓冲区,再读到进程中等
IRP被传递到具体设备的驱动程序中,驱动程序负责“完成”这些IRP,并将完成的状态按照原路返回到用户模式下的应用程序中,实际上,I/O管理器
器担当着用户模式代码和设备驱动程序之间的接口
5.配置管理程序
在windows中,配置管理程序记录所有计算机软件、硬件配置信息,它使用一个被称为注册表(Registry)的数据库保存数据,驱动设备就是根据
注册表中的这些信息进行加载
另外,驱动程序从注册表中读取相应的参数,这样可以提高驱动程序的灵活性,例如,设备操作的延时时间,可以作为参数写进注册表,驱动程序
加载的时候读取该值,而不是在编程的时候将其写成定值,这这大大调高驱动程序的灵活性