User:Hyddd

From Wikipedia, the free encyclopedia

Welcome to The Wiki of Hyddd[edit]

* Main Page Of Hyddd

编程高手箴言--笔记_3.2.1[edit]


  • 消息机制:
* Windows 16位,消息机制:
 * 一直等待消息,直到有消息发生时
 *  
 * while( GetMessage(&msg ,NULL , 0 ,0 ) ){
 *     TranslateMessage(&msg);    //翻译消息
 *     //... ...
 *     DispatchMessage(&msg);     //分配消息到对应的窗口
 * }
 * GetMessage:  而GetMessage就会一直停止在这些函数上,直到有消息为止。
 * PeekMessage: 和GetMessage不同的是,当消息队列中有消息时,它会返回函数;没有消息时就会返回0
* Windows 32位,消息机制:
 * 和16位Windows的消息运行基理很不一样,所有的消息队列看上去是放在USER32的模块内,但每个应用程序自己有一个USER32,
 * 因为每个应用程序在内存内都是从4000000B(也就是4MB的位置开始的),这样,每个GetMessage和PeekMessage都在处理事件。实际上,
 * 每个GetMessage就会成为一个WaitsingleMessage,当有事件来后,就直接进行处理,也不用做什么调度。因为自己完成自己的消息处理,
 * 每个程序都是独立的,所以要用底层内核来实现页面的切换。它某一程序切入时,其他程序就会被切出。当切换出去时,整个消息队列也就被切换出去了。
 * 所以,整个消息的处理就很简单了。
* Windows 32位时的消息机理下图所示:

[[Image:Win32 Message.JPG|]]



编程高手箴言--笔记_3.1.4[edit]


  • LE文件格式:
* 为什么出现LE文件格式:
 * VxD采用线性可执行文件格式(LE)。这种文件格式是为OS/2 2.0版设计的。它同时包含16位和32位代码,这也是VxD程序的需要。
 * 回想VxD在Windows 3.x的时代,从DOS启动Windows,Windows在把机器转到保护模式之前,需要在实模式下做一些初始化。
 * 实模式的16位代码必须和32位代码一起放在可执行文件中。所以,LE文件格式成为理所当然的选择。
 * Windows NT驱动程序不必在实模式下初始化,所以它们不必使用LE文件格式。它们用的是PE文件格式


编程高手箴言--笔记_3.1.3[edit]


  • DDB结构
* 在了解什么是DDB前,先看一幅图:

File:VxD Installing.JPG

* 设备描述块(The Device Descriptor Block)简称DDB,是VMM联系VxD的句柄。DDB中包括了VxD的信息和指向VxD主要的入口指针。当然,为了给其他的应用程序使用,也可以包括指向其他入口的指针。
  • DDB数据结构
* 字段区域                    描述
* Name                      8个字节的VxD名称
* Major Version             VxD的主版号,与Windows的版本号无关
* Minor Version             VxD的从版号,与Windows的版本号无关
* Device Control Procedure  设备控制过程的地址:  VxD程序的设备控制函数的名字,可以把设备控制函数看做Windows函数的等价物。
* Device ID                 Microsoft分配的惟一的ID号
* Initialization Order      通常是Undefine_Init_Order 。如果要强制在某个指定的VxD初始化之前或结束之后进行初始化,那就在VMM.INC中找到相应的Init_Order加1或减1。
* Service Table             服务表的地址
* V86 API Procedure         V86 API函数的地址
* PM API Procedure           PM API函数的地址
  • VxD的事件处理
* 当实模式初始化完成后,VMM将通过专门的消息方法来通知所有的VxD发生了什么。VxD的消息处理就像Windows的窗口消息处理一样,能通过如下一组切换函数:
*
* switch   (事件){
*
*   case  系统初始化事件
*
*      处理此消息代码
*
*   case  VM初始化
*
*      处理此消息代码
*      …
*
*   case  其他
*      …
*
* }
* 为了给VxD发送消息,VMM就会从VxD的DDB中取得设备控制函数的地址,在EAX中放置的是消息的值,EBX中放入当前VM的句柄,接着调用对应的函数。


编程高手箴言--笔记_3.1.2[edit]


  • VxD再叙:
* 就在第0级工作,并且有极高的权限,所以VxD能访问任何的硬件,不仅可以访问任何的物理空间,还可以捕获软件中断和I/O端口以及其他程序对内存的访问,就连硬件中断也可以被它捕获。
  • VxD装入系统:
1. 静态装入: VxD可以和VMM一起被静态地装入系统。
2. 动态装入: 由应用程序主动地装入系统。
  • VxD的组成:
* 安装一个VxD的过程有下面几个部分:
 . 实模式的初始化代码和数据在完成以下4部分后,被系统销毁。
 . 保护模式 -- 初始化代码部分,完成后销毁。(个人理解: 为进入保护模式做准备的代码,所以进入保护模式后,代码可以废弃。)
 . 保护模式 -- 初始化代码数据,完成后销毁。(个人理解: 为进入保护模式做准备的数据,所以进入保护模式后,数据可以废弃。)
 . PM代码,包括设备过程、API和回调过程,以及服务例程。
 . PM数据,包括设备描述符块、服务表,以及全局数据。
  • VxD加载过程:
* Win 9x支持静态动态两种加载模式。

 

 * 静态加载: VxD是在Windows初始化时被自动加载的,只有当Windows结束运行后,它才会卸载。
   * 静态加载方法1: 直接在SYSTEM.INI中加入如下一行代码:Device =VxD_NAME。
   * 静态加载方法2: 可以在Windows 9x注册表中的HKEY_LOCAL_MACHINE\ System\CurrentControlSet\Services\VxD\key\StaticVxD子键下加入如下的VxD的路径和名字:VxD_NAME=PATHNAME。
 * 动态加载: VxD不是和VMM一起在Windows启动时一起装入内存的,而由应用程序或另外的VxD装入,并且也可以通过VxD或其他应用程序动态地删除,所以,动态的VxD就有很大的灵活性。



编程高手箴言--笔记_3.1.1[edit]


  • 早期Windows和Dos的一些机制:
. Dos系统会出现严重的资源冲突问题。
. Windows为了兼容Dos程序,通过虚拟设备(VxD)的方法模拟每个Dos程序都有拥有所有的设备资源,实际上这个就是虚拟机(VM)的概念。


  • 一些基本概念:
. VxD: x表示任意设备。
. VDD: 虚拟显示设备。
. VDMAD: 表示虚拟DMA设备。
. VMM: 虚拟机管理器:它控制着计算机的主存、CPU的执行时间和外围设备功能。
 . VMM是一个32位的保护模式程序。它的主要任务是建立和维护一个支持虚拟机的框架,并对每个VM提供服务。
. VxD程序是Windows 3.1和Windows 9x特有。在NT下不能运行。
. 虚拟机管理器(VMM)是Windows 9x操作系统的真正内核。
. 所有的Win32的进程都运行在一个叫System VM中。


  • 我VM-VMM-VXD的理解
. VM--通过VMM调用下面的-VXD程序(设备模拟程序),从而达到控制所有虚拟设备的效果。
. 常用VM--两种 : System VM , Dos VM.