User:Hyddd

= Welcome to The Wiki of Hyddd =

* Main Page Of Hyddd --

= 编程高手箴言--笔记_3.2.1 =

* 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位时的消息机理下图所示：

= 编程高手箴言--笔记_3.1.4 =

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

= 编程高手箴言--笔记_3.1.3 =

* 在了解什么是DDB前，先看一幅图： * 设备描述块（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函数的地址
 * DDB数据结构：

* 当实模式初始化完成后，VMM将通过专门的消息方法来通知所有的VxD发生了什么. VxD的消息处理就像Windows的窗口消息处理一样，能通过如下一组切换函数： * * switch  (事件){ * *  case  系统初始化事件 * *     处理此消息代码 * *  case  VM初始化 * *     处理此消息代码 *     … * *   case  其他 *     … * * }
 * VxD的事件处理

* 为了给VxD发送消息，VMM就会从VxD的DDB中取得设备控制函数的地址，在EAX中放置的是消息的值，EBX中放入当前VM的句柄，接着调用对应的函数.

= 编程高手箴言--笔记_3.1.2 =

* 就在第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就有很大的灵活性.
 * VxD加载过程:

= 编程高手箴言--笔记_3.1.1 =

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

. 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--两种 : System VM, Dos VM.
 * 我VM-VMM-VXD的理解：