精华内容
下载资源
问答
  • windows7采用什么结构
    千次阅读
    2020-12-07 19:38:34

      Windows系统结构

    Windows系统结构,如图:

    Windows 采用了双模式结构来保护操作系统本身。操作系统核心运行在内核模式,应用程序的代码运行在用户模式下。每当应用程序需要用到系统内核或内核的扩展模块(内核驱动程序)所提供的服务时,应用程序通过硬件指令从用户模式切换到内核模式中;当系统内核完成了所请求的服务以后,控制权又回到用户模式代码。

    一、  Windows内核结构

    Windows内核分为三层,硬件抽象层(Hardware Abstraction Layer ,简称HAL), HAL之上是内核层,有时候也称为微内核,在内核层之上则是执行体(executive)层。

    硬件抽象层的用意是把所有与硬件相关联的代码逻辑隔离到一个专门的模块中,从而使上面的层次可能做到独立于硬件平台。

    内核层和执行层的分工是,内核层实现操作系统的基本机制,而所有的策略决定则留个执行体。

    Windows 内核的组成结构,如图:

    应用程序最终通过ntdll.dll 切换到内核模式下的执行API函数中,以调用内核中的系统服务。Ntdll.dll 是连接用户模式代码和内核模式系统服务的桥梁。

    1.1  Windows内核中的关键组件

    1.HAL(硬件抽象层)

    Windows Server 2003 的HAL 列表(Intel X86 处理器)

    HAL 文件

    所支持的硬件系统

    Hal.dll

    标准PC

    Halacpi.dll

    ACPI(高级配置和电源接口)PC

    Halapic.dll

    APIC(高级可编程中断控制器)PC

    Halaacpi.dll

    APIC ACPI PC

    Halmaps.dll

    多处理器PC

    Halmacpi.dll

    多处理器ACPI PC

    2. 内核(或微内核)

    它是内核模块ntoskrml.exe 中的下层部分(上层部分为执行体),最接近HAL层,负责现场调度和中断、异常的处理;对于多处理器系统,还负责同步处理器之间的行为。

    Windows 内核实现了抢占式线程调度机制。

    Windows内核管理两种类型的对象:分发器对象(dispatcher object) 和控制对象。分发器对象实现了各种同步功能。Windows内核实现的分发器对象包括事件(event)、突变体(mutant)、信号量(semaphore)、进程(process)、线程(thread)、队列(queue)、门(gate)和定时器(timer)。控制对象被用于内核的操作,包括异步过程调用(APC)、延迟过程调用(DPC)、中断对象等。

    3. 执行体

    执行体是内核模块ntoskrnl.exe 的上层部分,包含5种类型的函数

    1. 被导出的、可在用户模式下调用的函数。如ntdll.dll。
    2. 虽已被到处并且可在用户模式下调用,但无法通过任何一个Windows API调用的函数。
    3. 只能在内核模式下调用的导出函数,并且在Windows DDK/WDK中有关这些函数的文档。
    4. 供执行体组件之间相互调用,但未被文档化的函数。
    5. 属于一个组件的内部函数。

    执行体包含以下组件:

    1. 进程和线程管理器。负责创建进程和线程,以及终止进程和线程。
    2. 内存管理器。实现了虚拟内存管理,负责系统地址空间的内存管理,为每个进程提供了一个私有的地址空间,并且支持进程之间内存共享。
    3. 安全引用监视器(SRM,Security Reference Monitor)。强制在本地计算机上实施安全策略,守护着操作系统的资源,执行对象的保护和审计。
    4. I/O 管理器。实现了与设置无关的输入和输出的功能,负责将I/O请求分发给正确的设备驱动程序以便进一步处理。
    5. 缓存管理器。为文件系统提供了统一的数据缓存支持,允许文件系统驱动程序将磁盘上的数据映射到内存中,并通过内存管理器来协调物理内存的分配。
    6. 配置管理器。负责系统注册表的实现和管理。
    7. 即插即用管理器。负责列举设备,并为每个列举到的设备确定哪些驱动程序是必需的,然后加载并初始化这些驱动程序。
    8. 电源管理器。负责协调电源事件,向设备驱动程序发生电源I/O通知。

    执行体还包含4组主要的支持函数,如下:

    1. 对象管理器。负责创建、管理和删除Windows执行体对象,以及用于表达操作系统吸引的抽象数据类型,比如进程、线程和各种同步对象。
    2. LPC设施。负责同一台机器上的客户进程和服务器进程之间传递消息。
    3. 一组运行时库函数。
    4. 执行体支持例程。例如系统内存分配、互锁的内存访问,两种同步对象(资源和互斥体)的支持。

    4. 设备驱动程序

    设备驱动程式可以懂得加载到系统的模块,其文件扩展名为.sys,是标准的PE文件格式。

    设备驱动程序有三种基本类型:

    1. 即插即用驱动程序(即WDM驱动程序)。
    2. 内核扩展驱动程序(非即插即用驱动程序)。
    3. 文件系统驱动程序。

    5. 文件系统/存储管理

    Windows的原生文件系统是NTFS(NT File System),驱动程序为ntfs.sys。还有一个文件系统格式是FAT(File Allocation Table),是DOS时代发展的文件系统格式。

    Windows支持两种形式的过滤驱动程序:一种直接插入到设备栈中,能够看到每个经过设备栈的文件I/O请求;另一种基于Windows提供的过滤管理器驱动程序(FltMgr)的I/O过滤框架,称为文件系统小过滤驱动程序,以回到方式来想要FltMgr的事件。

    6.网络

    Windows 主要的网络API:

    1. Windows 套接字,简称Winsock。实现并扩展了BSD套接字标准。
    2. WinInet 。一个高层网络API,支持Gopher、FTP、HTTP等多个协议。
    3. 命名管道(named pipe)和邮件槽(mailslot)。用于不同进程之间进行通信。支持不同机器上的进程之间相互通信。命名管道支持连接方式的通信模型;邮件槽支持非链接方式的通信模型,客户进程可以发送广播信息。
    4. NetBIOS 。
    5. RPC。

     

    二、 Windows子系统

    Windows子系统包含内核模式和用户模式,内核模式部分核心是Win32k.sys ,包含2部分,窗口管理和图形设备接口,窗口管理负责收集分发消息,控制窗口显示和管理屏幕输出。图形设备接口部分包含各种形状绘制及文本输出功能。用户模式部分包括Windows子系统csrss.exe 以及一组动态链接库(DLL)。Csrss.exe 进程主要负责控制台窗口的功能,以及创建或删除进程和线程等。子系统Dll 则被直接链接到应用程序中,包括kernel32.dll ,user32.dll,

    gdi32.dll,advapi.dll等,负责实现已经文档化的Windows API函数。

    窗口管理:

    Windows 子系统的用户界面管理有一个层次结构,通常应用程序只是在一个默认的桌面上运行。Windows子系统窗口管理层次结构:

    每个子系统会话都有自己的会话空间,属于某一个会话的资源将从该会话空间中分配。当用户登录到Windows时,操作系统将为该用户建立一个会话;即使用户通过远程桌面或终端服务连接到一个系统中,系统也会为该用户建立一个单独的会话。

    在一个会话中,有一个交互式窗口站,可能还有非交互式窗口站。交互式窗口站中通常有三个桌面:登录桌面、默认桌面和屏幕保护桌面。

    图形设备接口:

    Windows子系统的图形模块结构

    Windows的图形引擎有两方面的特点

    首先,它提供了一套与设备无关的编程接口,即GDI,这使得应用程序可以使用各种底层显示设备的差异;

    其次,应用程序与图形设备驱动程序之间的通信足够高兴,从而即使在频繁的输出和刷新图形元素的情况下,Windows也能够为用户提供良好的视觉效果。

     系统线程和系统进程

    Windows 关键系统进程介绍:

    系统空闲进程(Idle),PID为0,每个处理器或核对应有一个线程

    System进程,xp,server2003 PID 为4,包含了内核模式系统线程

    会话管理器(Session manager smss.exe),这是Windows系统中第一个创建的用户模式进程。启动了子系统进程csrss.exe 和winlogon.exe。

    登录进程winlogon.exe,负责处理交互用户的登录和注销。

    Windows 子系统进程csrss.exe , 负责为用户提供一个子系统环境,包括提供控制台窗口的功能,以及创建和删除进程和线程等。

    本地安全权威子系统进程(lsass.exe),负责本地系统安全策略。

    Shell 进程explorer.exe 。windows 默认Shell,提供了系统与用户打交道的各种界面,包括开始菜单,任务栏等。

    服务控制管理器services.exe ,负责管理Windows的系统服务。

    更多相关内容
  • Windows 2000 Server体系结构与规划
  • Windows 7操作系统

    千次阅读 2021-10-24 11:03:03
    Win7桌面知识简介

    Win7操作系统

    在这里插入图片描述

    一、操作系统的概述

    1.1操作系统的概念

    操作系统(operating system,简称OS)一组控制和管理计算机系统的硬件和软件资源、控制程序执行、改善人机界面、合理地组织计算机工作流程并为用户使用计算机提供良好运行环境的一种系统软件。

    目的在于提高计算机系统的效率,增强系统的处理能力,提高系统资源的利用率,方便使用。

    1.2操作系统的功能

    1.处理器管理(进程管理)

    指操作系统对CPU进行管理

    一是处理中断事件;二是处理器调度。
    存储器管理(只要指内存:RAM)

    主要任务是管理存储器资源,为多道程序运行提供有力的支撑。

    2.设备管理

    主要任务是管理各类外围设备。(外设)

    3.文件管理

    文件管理是指操作系统对信息资源的管理。在操作系统中,将负责存取的管理信息的部分称为文件系统。文件是在逻辑上具有完整意义的一组相关信息的有序集合,每个文件都有一个文件名。文件管理支持文件的存储、检索和修改等操作以及文件的保护功能。操作系统一般都提供功能较强的文件系统,有的还提供数据库系统来实现信息的管理工作。

    4.作业管理(主要是外存上的文件)

    用户需要计算机完成某项任务时要求计算机所做工作的集合称为作业。

    1.3操作系统的主要特征

    并发性:并发性是指多个程序同时在系统中运行;
    共享性:指计算机系统中的咨源能够被并发执行的程序共同使用;
    虚拟性:存在状态是无形;
    异步性:不确定性。

    1.4操作系统的分类

    1.按功能划分

    (1)批处理操作系统

    指用户将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行。
    工作方式:用户作业→ 交给系统操作员→ 操作系统→ 用户。

    (2)分时操作系统

    使一台计算机采用时间片轮转的方式同时为多个用户服务的一种操作系统。

    (3)实时操作系统

    使计算机能及时响应外部事件的请求,在规定的严格时间内完成对该事件的处理;
    分别为:

    实时信息处理系统;
    实时过程控制系统。

    (4)嵌入式操作系统(简称:EOS)
    (5)网络操作系统

    包括网络管理、通信、安全、资源共享和各种网络应用,
    目标是实现网络通信及资源共享。
    目前:Windows Server。

    (6)分布式操作系统

    科学计算领域较为广泛。

    2.按用户界面划分

    ①命令行用户界面操作系统:用户对计算机的操作必须在命令提示符后输人命令才能操作计算机;如DOS操作系统;
    ②图形用户界面操作系统:在图形用户界面的操作系统中文件、文件夹用图标来表示,命令以菜单或按钮的形式列出;如Windows、Mac OS、Linux和 UNIX。

    3.按所支持的用户数划分

    ①单用户操作系统:一台计算机在同一时间只能由一个用户使用,一个用户独自享用系统的全部硬件和软件资源;如DOS操作系统;
    ②多用户操作系统:在同一时间允许多个用户同时使用计算机;如Windows 7、Linux和 UNIX。

    4.按是否能够同时运行多个任务划分

    ①单任务操作系统:指用户在同一时间只能运行一个应用程序(或者是计算机在同一时间只能执行一个任务)如DOS操作系统;
    ②多任务操作系统:指用户在同一时间可以运行多个应用程序(或者是计算机在同一时间可以执行多个任务)如Windows、Linux、UNIX。

    1.5常用计算机操作系统

    ① DOS 磁盘操作系统
    ②Windows操作系统
    ③UNIX 操作系统
    ④Linux操作系统
    ⑤Mac OS

    二、Windows 7基础

    2.1 Windows 7的基础知识

    1.Windows 7的最低配置

    硬件最低配置
    CPU(主频)主频1GHz或更快的32位或64位处理器。
    内存1GB(基于32位)或2GB(基于64位)的物理内存。
    硬盘16GB可用硬盘空间(基干32位)或20GB可用硬盘空间(基于64位)。
    显卡带有WDDM 1.0或更高版本驱动程序的 DirectX 9图形设备。
    显示器分辨率1024×768像素及以上,或可支持触摸技术的显示设备。
    其他光盘驱动器、键盘及 Windowe支持的鼠标或定占设备等。

    2.Windows 7的安装方法

    三种安装方法:升级安装、全新安装和多系统安装。通过windows盘进行系统安装是比较传统的安装方式,

    除此之外还有从虚拟光驱安装、从硬盘安装和从U盘安装等。

    2.2 Windows 7的基本操作

    1.启动:只要有电即可,不再多说

    2.退出

    选项阐释
    切换用户切换到其它用户(不锁屏,速度快)。
    注销与“切换用户“差不多,但当前用户正在运行的任务也被注销了(前者不会)。
    锁定只能由锁定的用户账户登录,不能进行用户切换。防止他人用其他用户账户登录。
    重新启动重新启动计算机。
    睡眠维持内存中的工作,处理器保持极低功率。(所有部件都没有断电。)
    休眠把RAM中正在运行的程序移动到光盘上,重启后计算机回到休眠之前的状态。

    2.3 Windows 7中鼠标与键盘的操作
    1.鼠标操作

    操作方式阐释
    左击(也叫单击)按一下鼠标左键,表示选中某个对象或启动按钮。
    双击快速连续地单击两次鼠标左键,表示启动某个对象(等同于单击选中之后再按Enter键)。
    右击按一下鼠标右键,表示启动快捷菜单(弹出式菜单)。
    拖动按住鼠标左键不放,并移动鼠标指针至屏幕的另一个位置或另一个对象(即拖动鼠标)。
    指向移动鼠标指针至屏幕的某个位置或某个对象上,在移动中没有按键动作。

    2.键盘操作

    鼠标能实现的键盘也能实现,鼠标不能实现的键盘也能实现。

    功能快捷键
    撤销(也作“撤销”)–误删使用此操作Ctrl+Z
    复制Ctrl+C
    剪贴Ctrl+X
    粘贴Ctrl+V
    显示/隐藏“开始”菜单Win或Ctrl+Esc
    关闭’当前’程序或窗口Alt+F4
    新建Ctrl+N
    打开Ctrl+O
    储存Ctrl+S
    另存为Ctrl+Shift+S
    显示/隐藏“开始”菜单Win或Ctrl+Esc
    关闭’当前’程序或窗Alt+F4
    复制整个屏幕到剪贴板PrintScreen
    复制活动窗口图像到剪贴板Alt+PrintScreen
    全选Ctrl+A
    显示桌面Win+D
    打开运行Win+R
    打开“资源管理器”Win+E
    保存当前操作的文件Win+S
    进行中、英文输入法的切换Ctrl+空格键
    在安装的各个输入法之间进行切换Ctrl+Shift
    在打开的窗口之间切换Alt+Tab
    以3D形式在打开的窗口之间切换Win+Tab
    帮助F1
    重命名F2
    刷新F5

    2.4Windows 7的桌面

    1.桌面上的主要元素

    (1)图标:图形加文字
    (2)"开始"按钮
    (3)快捷方式:

    后缀名:.link

    ①快速访问
    ②访问路径
    ③一对多
    ④清除后软件或文件不受影响

    方法:

    ①桌面右击→发送到→桌面快捷方式
    ②选中文件→选择文件菜单→发送到→桌面快捷方式

    (4)任务栏

    由开始菜单(屏幕)、应用程序区、语言选项带(可解锁)、托盘区和“显示桌面”功能。

    2.个性化桌面设置

    (1)图标排列:名称、大小、项目类型、修改日期

    ①鼠标直接拖动
    ②桌面右击→快捷菜单→排序方式名称/大小/项目类型/修改日期
    ③桌面右击→查看→自动排列图标(在此状态下不能任意移动)

    (2)设置桌面图标

    ①右击→个性化→更改桌面图标→选择应用程序→确定
    ②开始→控制面板→个性化→更改桌面图标→选择应用程序→确定

    (3)设置桌面背景

    ①桌面右击→快捷菜单→个性化→更改桌面背景
    ②开始→控制面板→个性化→更改桌面背景

    (4)设置显示器的分辨率

    ①桌面右击→快捷菜单→屏幕分辨率
    ②开始→控制面板→显示→调整屏幕分辨率

    (5)设置屏幕保护程序

    ①右击→快捷菜单→个性化→屏幕保护程序
    ②开始按钮→控制面板→个性化→屏幕保护程序

    任务栏与开始菜单

    (1)任务栏

    ①开始按钮
    ②快速启动工具栏
    ③任务栏按钮
    ④语言栏
    ⑤通知区域
    ⑥显示桌面按钮:Win+D

    (2)开始菜单
    在这里插入图片描述

    2.5窗口及其基本操作

    请添加图片描述

    1.窗口的概念

    当前活动窗口指的是正在接收用户鼠标、键盘等操作信息的窗口。
    后台运行窗口也叫做非活动窗口,指的是不接收用户操作信息的窗口,但程序仍在后台运行。

    2.窗口的组成

    ①边框
    ②标题栏
    ③地址栏
    ④搜索栏
    ⑤"前进/后退"按钮
    ⑥工具栏
    ⑦导航窗格
    ⑧详细信息面板
    ⑨菜单栏
    ⑩滚动条:所在位置大致反映文章/程序

    3.窗口的操作

    (1)打开窗口

    ①双击
    ②右击→打开

    (2)移动窗口

    还原状态下拖动标题框

    (3)最大化、最窗口小化

    ①还原状态下拖动标题框到屏幕最上方(还原→最大化)
    ②最大化状态下拖动标题框向下(最大化→还原)

    (4)改变窗口大小

    前提:还原状态下

    拖动对角线
    拖动边框线
    双击标题栏

    (5)排列窗口

    右击桌面任务栏:
    层叠窗口
    堆叠显示窗口
    并排显示窗口

    (6)切换窗口

    Alt+Tab(平面切换)
    Win+Tab(立体切换)
    Alt+Esc(循环切换)

    (7)关闭窗口

    ①直接在标题栏右侧单击“关闭”按钮。
    ②按快捷键Alt+F4组合键。
    ③右击任务栏上的窗口图标并在弹出的快捷菜单中选择“关闭窗口”命令。
    ④在标题栏上右击,在弹出的快捷菜单中选择“关闭”命令。

    2.6对话框

    在这里插入图片描述
    补充:窗口与对话框区别

    窗口的右上角有三个按钮:分别是最小化,最大化/还原,关闭按钮;对话框右上角有二个按钮:分别是帮助、关闭按钮
    窗口和对话框都有标题栏,鼠标放在上面按住左键可以对窗口或话框进行移动窗口的大小可以调整,对话框的大小不可以调整

    2.7剪贴板

    内存(RAM)中开辟的临时性存储区域。
    (补充:回收站·硬盘中开辟的临时性存储区域)


    ★简答:“剪贴板”定义及作用
    “剪贴板”是程序和文件之间用于传递信息的临时存储区,是内存中的一块区域。剪贴板的作用是在程序和文件之间传递信息,既可以在不同的程序中传递文本、图像等信息,也可以在Windows操作系统中传递文件或文件夹。

    三、Win7的文件和文件夹管理

    存放在计算机中的所有程序以及各种类型的数据,都是以文件的形式存储在磁盘上的(实质:二进制)

    3.1基本概念

    1.磁盘

    硬盘划出的分区。

    2.文件

    储存在硬盘上的信息的集合,是计算机系统中数据组织的基本存储单位

    ①系统文件夹
    ②用户定义文件夹

    文件和文件夹的命名形式规范

    ①文件名=主文件名+扩展名;
    ②在文件或文件夹的名字中,最多可使用255个合法的字符。
    ③分类:可执行程序、源程序文件、Office文档、流媒体文件压缩文件、网页文件、图像文件、音额文件;
    ④文件或文件夹名中不能出现 : / \ : * " < > | ?
    ⑤可以使用带有多分隔符的文件名;
    ⑥在同一个文件夹内不能有相同的文件名;
    ⑦文件名中不区分英文字母的大小写。

    3.文件夹及其组织形式

    请添加图片描述

    这样逐级存放的组织结构被称为“树形结构”。

    4.目录

    Windows操作系统是通过树形结构来组织和管理计算机资源的。

    磁盘根目录是在磁盘格式化时自新生成的如C:\。一个盘有且只能有一个根目录(文件位置),根目录不能被删除。

    5.路径

    路径由根目录开始,则称为绝对路径,不是从根目录开始的路径则称为相对路径。

    3.2“计算机”和“资源管理器”

    1.“计算机”

    ①双击桌面计算机图标
    ②开始—计算机

    2.“资源管理器”

    Windows任务管理器提供了有关计算机性能的信息,并显示了计算机上所还行的程序和进程的详细信息;如果连接到网络,还可以查看网络状态并迅速了解网络是如何工作的。

    (1)右击“开始”按钮→快捷菜单中→打开 Windows资源管理器”。
    (2)单击“开始”按钮→选择“所有程序”→单击“附件”→Windows资源管理器";
    (3)单击“开始”按钮→“计算机”。
    (4)按 Win十E快捷键也可以打开 Windows资源管理器窗口。

    3.库

    收集不同盘内的文件并集中显示为一个集合。
    储存的是快照(类似于快捷方式)并非是文件本身。

    库:
    视频
    图片
    文档
    音乐

    3.3文件和文件夹管理

    1.新建文件夹或文件

    (1)新建文件夹

    步骤:

    右击
    新建文件夹
    命名
    点击空白处/Enter
    (2)新建文件

    只有文件名和路径的空文件

    2.文件或文件夹的选定

    选择对象操作
    单个文件或文件夹在窗口中直接单击要选定的文件或文件夹。
    连续的一组文件或文件夹(1)按下鼠标左键并拖动鼠标,拖动范围内的文件和文件夹被选中。(2)单击该组的第一个对象,按住Shift键然后单击该组的最后一个对象。
    不连续的文件或文件夹在窗口选中一个对象后,按住 Ctrl键然后再单击要选定的各个对象。
    选取全部文件或文件夹(1)按Ctrl+A组合键。(2)单击“编辑”或“组织”按钮,在下拉菜单中选择“全选”命令。
    取消已选定的部分文件或文件夹按住 Ctrl键,再用鼠标依次单击各个需要取消的对象。
    取消已选定的所有文件或文件夹在空白处单击。

    3.复制文件或文件夹

    (1)利用“剪贴板”

    右击—复制;右击—粘贴
    Ctrl+C;Ctrl+V
    编辑—复制;编辑—粘贴

    (2)利用鼠标拖动

    源位置与目标位置在同一盘不同文件夹(同盘异夹):按住Ctrl同时拖动鼠标;
    源位置与目标位置在同一盘相同文件夹(同盘同夹):复制文件名·源文件—副本;
    源位置与目标位置不在同一盘:拖动鼠标。

    4.移动文件或文件夹

    (1)利用“剪贴板”

    选定需要移动的文件或文件夹。
    执行“编辑”或“组织”按钮下拉菜单中的“剪切”命令(或右击,在弹出的快捷菜单中选择“剪切”命令,或按Ctrl+X组合键)。
    打开目标位置,执行“编辑”或“组织”按钮下拉菜单中的“粘贴”命令(或右击,在弹出的快捷菜单中选择“粘贴”命令,或按Ctrl+V组合键)。

    (2)利用鼠标拖动

    在不同的磁盘之间移动:按住 Shift键同时拖动选定的文件或文件夹到目标磁盘或文件夹的图标上。
    在同一磁盘的不同文件夹之间移动:用鼠标左键直接拖动选定的文件或文件夹到目标文件夹的图标上。

    5.删除文件或文件夹

    (1)文件或文件夹的删除

    ①选中文件,点击Delete按键
    ②右击文件—删除
    ③文件菜单一删除
    (以上均弹出对话框)①②③+Shift 可跳过对活框

    (2)回收站

    还原:双击打开→选中所要还原的文件→右击→还原
    修改回收站的大小:右击图标一属性一对话框一对应磁盘—设置回收站大小—确定

    ★使删除的文件不放入回收站的方法

    (1)按 Shift十Delete键删除。
    (2)将回收站的属性设置为“不将文件移到回收站中”。
    (3)按下Shift键的同时,单击“文件”菜单中的“删除”命令。(4)按下Shift键的同时,单击快捷菜单中的“删除”命令。

    6.重命名文件或文件夹(主文件名)

    ①右击文件一重命名一点击空白处/Enter
    ②文件菜单一重命名一点击空白处/Enter
    ③两次有间隔单击一重命名后点击空白处/Enter
    ④选中F2一重命名后点击空白处/Enter

    7.查找文件或文件夹

    通配符“*”和“?”

    *:(表示一个字符) ;
    ?:(表示多个字符);

    简答:Win7默认不显示文件扩展名,怎样显示?

    工具菜单→文件选项命令→文件选项对话框→切换到查看选项卡→勾掉隐藏已知文件类型的扩展名→确定。

    简答:怎样显示被隐藏的文件?(怎样恢复在硬盘中的文件?)

    工具菜单→文件选项命令→文件选项对话框→切换到查看选项→勾选隐藏的文件夹和驱动器→确定。

    8.查看和设置文件或文件夹属性

    请添加图片描述

    9.文件与文件夹的加密与解密

    对文件夹和文件加密,可以保护它们免受未许可的访问。加密文件系统 (EFS) 是Windows 的一项功能,用于将信息以加密格式存储在硬盘上。加密是 Windows 提供用于保护信息安全的最强保护措施。

    (1)加密文件夹或文件的步骤

    1.右键单击要加密的文件夹或文件,然后单击“属性”。
    2.单击“常规”选项卡,然后单击“高级”。
    3.选中“加密内容以便保护数据”复选框,单击“确定”,然后再次单击“确定”。

    ★注意
    首次加密文件夹或文件时,系统会自动创建加密证书。您应该备份加密证书。如果证书和密钥已丢失或受损,并且没有备份,则无法使用已经过加密的文件。有关详细信息,请参阅备份加密文件系统 (EFS) 证书。

    (2)解密文件夹

    在“高级属性”对话框中,取消对“加密内容以便保护数据”的选择。单击“确定”按钮,返回“属性”对话框,接着单击“确定”按钮,在弹出的“确定属性更改”对话框中选择“将更改应用于此文件夹、子文件夹和文件”选项,单击“确定”按钮,此时将对所选的文件夹进行解密。

    10.文件与文件夹的压缩

    请添加图片描述

    11.设置快捷方式

    它是应用程序的快速链接。 快捷方式的一般扩展名为*.lnk。

    方法一

    请添加图片描述

    方法二

    请添加图片描述

    附:控制面板截图
    在这里插入图片描述
    控制面板
    在这里插入图片描述
    系统和安全
    在这里插入图片描述
    网络和Internet
    在这里插入图片描述
    硬件和声音
    在这里插入图片描述
    程序
    在这里插入图片描述
    用户帐户和家庭安全
    在这里插入图片描述
    外观和个性化
    在这里插入图片描述
    时钟、语言和区域
    在这里插入图片描述
    轻松访问


    白天学习晚上熬夜整理,竟然整理了一周才总算编辑完这一点内容,首先发于知乎,但排版标题过少又发于此,后续还会进行内容的增加和排版,不需点赞,学会知识最重要!!!
    在这里插入图片描述

    展开全文
  • 本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有ReactOS的源代码(以及...
  • windows PE文件结构及其加载机制

    万次阅读 多人点赞 2016-04-29 15:00:50
    1. 概述PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软...虽然使用PE作为可执行文件格式的Windows操作系统已经更换了很多版本,其结构的变

    1. 概述

    PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)。它是1993年Windows NT系统引入的新可执行文件格式,到现在已经经过20多年了。虽然使用PE作为可执行文件格式的Windows操作系统已经更换了很多版本,其结构的变化、新特性的增加、文件格式的转换,以及内核的重新定位等,都发生了翻天覆地的变化,硬件架构也从16位发展到现在的64位架构,而这些变化对PE格式的影响却不大。由于PE格式有较好的数据组织方式和数据管理算法,面对如此多的变化却能保持其设计的优雅。

    众所周知,Windows NT继承自VAX® VMS®和UNIX。Windows NT的许多创建者在到Microsoft之前都曾为这些平台设计和编写程序。当他们设计Windows NT时,很自然会使用以前写过的和测试过的工具以尽快开始他们的新项目。这些工具产生的和使用的可执行文件和目标模块的格式被称为COFF(Common Object File Format的首字母,通用目标文件格式)。Microsoft编译器生成的OBJ文件就使用COFF格式。

    PE文件之所以被称为“可移植”是因为Windows NT在各种平台(x86、MIPS®、Alpha等等)上的所有实现都使用同样的可执行文件格式。当然,像CPU指令的二进制编码之类的内容会有所不同。重要的是操作系统加载器和编程工具不需要针对遇到的每种新的CPU再完全重写。Windows NT及其以后版本,Windows 95及其以后版本和Windows CE一直到现在的win10都使用了这个相同的格式,所以说在很大程度上,这个目的达到了。对于64位的Windows,PE格式只是进行了很少的修改。这种新的格式被叫做PE32+。没有加入新的域,只有一个域被去除。剩下的改变只是一些域从32位扩展到了64位。在这种情况下,你能写出和32位与64位PE文件都能一起工作的代码。对于C++代码,Windows头文件的能力使这些改变很不明显。EXE和DLL文件之间的不同完全是语义上的。它们都使用完全相同的PE格式。仅有的区别是用了一个单个的位来指出这个文件应该被作为EXE还是一个DLL。甚至DLL文件的扩展名也是不固定的,一些具有完全不同的扩展名的文件也是DLL,比如.OCX控件和控制面板程序(.CPL文件)。

    PE文件格式主要来自于UNIX操作系统所通用的COFF规范,同时为了保证与旧版本MS-DOS及Windows操作系统的兼容,也保留了MS-DOS中那熟悉的MZ头部。PE格式被公开在WINNT.H头文件中(非常零散)。在WINNT.H文件的中间有一个“Image Format”节。这个节以MS-DOS MZ格式和PE格式开头,后面才是新的PE格式。WINNT.H提供了PE文件使用的原始数据结构的定义。

    2. PE文件分析相关的概念

    在详细了解PE文件结构之前,我们需要先了解几个基本的概念。理解这些概念有利于我们更好地把握和分析PE中的数据结构。

    2.1. 地址

    PE中涉及的地址有四类,他们分别是:

    • 虚拟内存地址(VA)
    • 相对虚拟地址(RVA)
    • 文件偏移地址(FOA)
    • 特殊地址

    2.1.1. 虚拟地址(Virtual Addresses)

    由于Windows NT推出时程序是运行在保护模式下,用户的PE文件被操作系统加载进内存后,PE对应的进程支配了自己独立的4GB虚拟空间。在这个空间中定位的地址称为虚拟内存地址(Virual Address,VA)。到了现在系统运行在X64架构的硬件上(长模式),内存访问可以采用线性地址的方式,同时可访问的内存也突破了4GB的限制,但是独立的进程拥有独立的虚拟地址空间的内存管理机制还在沿用。在PE中,进程本身的VA被解释为:进程的基地址 + 相对虚拟内存地址。

    2.1.2. 相对虚拟地址(Relative Virtual Addresses)

    PE格式大量地使用所谓的RVA(相对虚拟地址)。一个RVA,亦即一个“Relative Virtual Addresses(相对虚拟地址)”,是在你不知道基地址时,被用来描述一个内存地址的。它是需要加上基地址才能获得线性地址的数值。基地址就是PE映象文件被装入内存的地址,并且可能会随着一次又一次的调用而变化。

    在一个可执行文件中,有许多在内存中的地址必须被指定的位置。例如,当引用一个全局变量时就必须指定它的地址。PE文件可以被加载到进程地址空间的任何位置。虽然它们有一个首选加载地址,但你不能依赖于可执行文件真的会被加载到那个位置。因为这个原因,指定一个地址而不依赖于可执行文件的加载位置就很重要。

    为了消除PE文件中对内存地址的硬编码,于是产生了RVA。一个RVA是在内存中相对于PE文件被加载的地址的一个偏移。例如,如果一个EXE文件被加载到地址0x400000,它的代码节位于地址0x401000处。那么代码节的RVA就是:

    (目标地址) 0x401000 - (加载地址)0x400000 = (RVA)0x1000.

    因为PE-文件中的各部分(各节)不需要像已载入的映象文件那样对齐,事情变得复杂起来。例如,文件中的各节常按照512(十六进制的0x200)字节边界对齐,而已载入的映象文件则可能按照4096(十六进制的0x1000)字节边界对齐。参见下面的“SectionAlignment(节对齐)”和“FileAlignment(文件对齐)”。

    因此,为了在PE文件中找到一个特定RVA地址的信息,你得按照文件已被载入时的那样来计算偏移量,但要按照文件的偏移量来跳过。

    试举一例,假若你已知道执行开始处位于RVA 0x1560地址处,并且想从那里开始的代码处反汇编。为了从文件中找到这个地址,你得先查明在RAM(内存)中各节是按照4096字节对齐的,并且“.code”节是从RVA 0x1000地址处开始,有16384字节长;然后你才知道RVA 0x1560地址位于此节的偏移量0x560处。你还要查明在文件中那节是按512字节边界对齐,且“.code”节在文件中从偏移量0x800处开始,然后你就知道在文件中代码的执行开始处就在0x800+0x560=0xd60字节处。

    然后你反汇编它并发现访问一个变量的线性地址位于0x1051d0处。二进制文件的线性地址在装入时将被重定位,并常被假定使用的是优先载入地址。因为你已查明优先载入地址为0x100000,因此我们可开始处理RVA 0x51d0了。因数据节开始于RVA 0x5000处,且有2048字节长,所以它处于数据节中。又因数据节在文件中开始于偏移量0x4800处,所以该变量就可以在文件中的0x4800+0x51d0-0x5000=0x49d0处找到。

    2.1.3. 文件偏移地址

    文件偏移地址(File Offset Address,FOA)和内存无关,他是指某个位置距离文件头的偏移。

    2.1.4. 特殊地址

    在PE结构中海油一种特殊地址,其计算方法并不是从文件头算起,也不是从内存的某个位置的基地址算起,而是从特定的位置算起。这个地址在PE结构中很少见,如:在资源表里就出现过这样的地址。

    2.2. 节(Section)

    无论是结构化程序设计,还是面向对象程序设计,都是倡导程序和数据的独立性,因此,程序中的代码和数据通通常是分开存放的。为了保证程序执行的安全,保证内核的稳定,Windows操作系统通常对不同用途的数据设置不同的权限。比如:代码段中的字节码在程序运行的时候,一般不允许用户进行修改,数据段则允许在程序运行过程中读和写,常量只能读等。Windows操作系统在加载可执行程序时,会为这些具有不同属性的数据分别分配标记有不同属性的页面(当然,相同属性的数据可能会被放到同一个页面),以确保程序运行时的安全。正式基于这个原因,PE中才出现了所谓的节的概念。

    节就是存放不同类型数据(比如代码、数据、常量、资源等)的地方,不同的节具有不同的访问权限。节是PE文件中存放代码和数据的基本单元。例如:一个目标文件中的所有代码可以组合成单个节,或者每个函数独占一格节(如果编译器允许)。增加节的数目会增加文件的开销,但是链接器在链接代码的时候就会有更大的选择余地。一个节中的所有原始数据必须被加载到连续的内存空间中。

    从操作系统加载角度来看,节是相同属性数据的组合。与数据目录不同的是,尽管有些数据类型不同,分别属于不同的数据目录,但是由于其访问属性相同,便被归类到同一个节中。这个节最终可能会占用一个或多个页面;但无论有多少个,所有相关页面均会被赋予相同的页面属性。这些属性包括只读、只写、可读、可写等。

    Windows操作系统在装载PE文件时会对相同和不同类型的节数据执行抛弃、合并、新增、复制等操作。这些不同的操作交叉组合导致了内存中的节和文件中的节会出现很大的不同。例如:”.data”的数据在磁盘中不存在,但是在内存中存在,而”.reloc”重定位表数据却恰恰相反。

    2.3. 对齐(Alignment)

    对齐这个概念并非只在PE文件中出现,许多文件格式都会有对齐的要求。有的对齐是为了美观,有的对齐则是为了效率。PE中规定了三类的对齐:数据在内存中的对齐、数据在文件中的对齐、资源文件中资源数据的对齐。

    2.3.1. 内存对齐(SectionAligment)

    PE 文件头里边的SectionAligment 定义了内存中区块的对齐值。由于Windows操作系统对内存属性的设置以页为单位,所以通常情况下,PE 文件被映射到内存中时,节在内存中的对齐单位必须至少是一个页的大小。对于32位的windows操作系统来说,这个值是4KB(1000h),而对64位操作系统来说,这个值就是8KB(2000h)。

    2.3.2. 文件对齐(FileAligment)

    PE 文件头里边的FileAligment 定义了磁盘区块的对齐值。每一个区块从对齐值的倍数的偏移位置开始存放。而区块的实际代码或数据的大小不一定刚好是这么多,所以在多余的地方一般以00h 来填充,这就是区块间的间隙。为了提高磁盘利用率,对齐单位通常小于内存,以一个物理扇区的大小作为对齐粒度,512字节,200h。

    2.3.3. 资源数据对齐

    资源字节码部分一般要求以双字(4字节)方式对齐。

    3. PE文件结构

    PE 文件格式被组织为一个线性的数据流,它由一个MS-DOS 头部开始,接着是一个是模式的程序残余以及一个PE 文件标志,这之后紧接着PE文件头和可选头部。这些之后是所有的段头部,段头部之后跟随着所有的段实体。文件的结束处是一些其它的区域,其中是一些混杂的信息,包括重分配信息、符号表信息、行号信息以及字串表数据。

    如下图所示,PE文件结构被划分为四大部份,包括:DOS部分、PE头、节表、和节数据。

    这里写图片描述

    PE文件至少包含两个段(节),即数据段和代码段。Windows的应用程序PE文件格式有11个预定义段,这是对Windows应用程序所通用的。例如: .text 、.bss 、.rdata 、.data 、.pdata 和.debug 段,这些段并不是都是必须的,当然,也可以根据需要定义更多的段(比如一些加壳程序)。

    在应用程序中最常出现的段有以下6种:

    • 执行代码段,通常 .text (Microsoft)或 CODE(Borland)命名;
    • 数据段,通常以 .data
      、.rdata 或 .bss(Microsoft)、DATA(Borland)命名;
    • 资源段,通常以 .rsrc命名;
    • 导出表,通常以 .edata命名;
    • 导入表,通常以 .idata命名;
    • 调试信息段,通常以 .debug命名;

    PE文件一个方便的特点是磁盘上的数据结构和加载到内存中的数据结构是相同的。加载一个可执行文件到内存中 (例如,通过调用LoadLibrary)主要就是映射一个PE文件中的几个确定的区域到地址空间中。因此,一个数据结构比如IMAGE_NT_HEADERS (稍后我们会研究到)在磁盘上和在内存中是一样的。关键的一点是如果你知道怎么在一个PE文件中找到一些东西,当这个PE文件被加载到内存中后你几乎能找到相同的信息。

    要注意到PE文件并不仅仅是被映射到内存中作为一个内存映射文件。代替的,Windows加载器分析这个PE文件并决定映射这个文件的哪些部分。当映射到内存中时文件中偏移位置较高的数据映射到较高的内存地址处。一个项目在磁盘文件中的偏移也许不同于它被加载到内存中时的偏移。然而,所有被表现出来的信息都允许你进行从磁盘文件偏移到内存偏移的转换 (参见下图)。

    Windows装载器在装载的时候仅仅建立好虚拟地址和PE文件之间的映射关系,只有真正执行到某个内存页中的指令或访问某一页中的数据时,这个页才会被从磁盘提交到物理内存。但因为装载可执行文件时,有些数据在装入前会被预先处理(如需要重定位的代码),装入以后,数据之间的相对位置也可能发生改变。因此,一个节的偏移和大小在装入内存前后可能是完全不同的。

    这里写图片描述

    这里写图片描述

    4. PE文件结构分析

    4.1. PE文件准备

    为了对PE文件结构进行更好的分析,我们首先准备一个例子,这次我们通过在WIN10 X64环境下使用VS2015编译生成的一个X64架构的release程序来进行分析。这个例子是一个在WIN10 X64下通过TLS实现反调试的小程序。程序清单如下:

    #include <Windows.h>
    #include <tchar.h>
    
    #pragma comment(lib,"ntdll.lib")
    
    extern "C" NTSTATUS NTAPI NtQueryInformationProcess(HANDLE hProcess, ULONG InfoClass, PVOID Buffer, ULONG Length, PULONG ReturnLength);
    
    #define NtCurrentProcess() (HANDLE)-1
    
    
    void NTAPI __stdcall TLS_CALLBACK(PVOID DllHandle, DWORD Reason, PVOID Reserved)
    {
        if (IsDebuggerPresent())
        {
            MessageBoxA(NULL, "TLS_CALLBACK: Debugger Detected!", "TLS Callback", MB_OK);
    //      ExitProcess(1);
        }
        else
        {
            MessageBoxA(NULL, "TLS_CALLBACK: No Debugger Present!...", "TLS Callback", MB_OK);
        }
    }
    
    void NTAPI __stdcall TLS_CALLBACK_2(PVOID DllHandle, DWORD Reason, PVOID Reserved)
    {
        HANDLE DebugPort = NULL;
        if (!NtQueryInformationProcess(
            NtCurrentProcess(),
            7,          // ProcessDebugPort
            &DebugPort, // If debugger is present, it will be set to -1 | Otherwise, it is set to NULL
            sizeof(HANDLE),
            NULL))
        {
            if (DebugPort)
            {
                MessageBoxA(NULL, "TLS_CALLBACK2: Debugger detected!", "TLS callback", MB_ICONSTOP);
            }
    
            else
            {
                MessageBoxA(NULL, "TLS_CALLBACK2: No debugger detected", "TLS callback", MB_ICONINFORMATION);
            }
        }
    }
    
    //linker spec通知链接器PE文件要创建TLS目录,注意X86和X64的区别
    #ifdef _M_IX86
    #pragma comment (linker, "/INCLUDE:__tls_used")
    #pragma comment (linker, "/INCLUDE:__tls_callback")
    #else
    #pragma comment (linker, "/INCLUDE:_tls_used")
    #pragma comment (linker, "/INCLUDE:_tls_callback")
    #endif
    //创建TLS段
    EXTERN_C
    #ifdef _M_X64
    #pragma const_seg (".CRT$XLB")
    const
    #else
    #pragma data_seg (".CRT$XLB")
    #endif
    //end linker
    
    //tls import定义多个回调函数
    PIMAGE_TLS_CALLBACK _tls_callback[] = { TLS_CALLBACK, TLS_CALLBACK_2, 0 };
    #pragma data_seg ()
    #pragma const_seg ()
    //end 
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
        HINSTANCE hPrevInstance,
        LPTSTR    lpCmdLine,
        int       nCmdShow)
    {
    
        MessageBoxA(NULL, "Hello Wolrd!...:)", "main()", MB_OK);
        return 0;
    
    }

    程序是一个简单的windows小程序,通过使用TLS回调函数来检测调试器的存在,并弹出窗口提示检测到的状态,主程序只是一个简单的hello world消息窗。程序中涉及到PE文件中几个重要的节。程序通过在WIN10 X64环境下使用VS2015编译生成的一个X64架构的release版本tlstest.exe,程序大小为12.0 KB (12,288 字节)。

    这里写图片描述

    4.2. MS-DOS 文件头

    在 image 文件的最开始处就是 DOS 文件头,DOS 文件头包含了 DOS stub 小程序。在 WinNT.h 文件里定义了一个结构来描述 DOS 文件头。

    typedef struct _IMAGE_DOS_HEADER {      // DOS .EXE header
        WORD   e_magic;             // 00000000  4D 5A,Magic number
        WORD   e_cblp;          // 00000002  90 00,Bytes on last page of file
        WORD   e_cp;             // 00000004  03 00,Pages in file
        WORD   e_crlc;            // 00000006  00 00,Relocations
        WORD   e_cparhdr;           // 00000008  04 00,Size of header in paragraphs
        WORD   e_minalloc;        // 0000000A  00 00,Minimum extra paragraphs needed
        WORD   e_maxalloc;          // 0000000C  FF FF,Maximum extra paragraphs needed
        WORD   e_ss;                // 0000000E  00 00,Initial (relative) SS value
        WORD   e_sp;             // 00000010  B8 00,Initial SP value
        WORD   e_csum;          // 00000012  00 00,Checksum
        WORD   e_ip;                // 00000014  00 00,Initial IP value
        WORD   e_cs;                // 00000016  00 00,Initial (relative) CS value
        WORD   e_lfarlc;        // 00000018  40 00,File address of relocation table
        WORD   e_ovno;           // 0000001A  00 00,Overlay number
    WORD   e_res[4];            // 0000001C  00 00 00 00,Reserved words
            // 00000020  00 00 00 00
        WORD   e_oemid;             // 00000024  00 00,OEM identifier (for e_oeminfo)
        WORD   e_oeminfo;           // 00000026  00 00,OEM information; e_oemid specific
    WORD   e_res2[10];          // 00000028  00 00 00 00,Reserved words
            // 0000002C  00 00 00 00
            // 00000030  00 00 00 00
            // 00000034  00 00 00 00
            // 00000038  00 00 00 00
        LONG    e_lfanew;           // 0000003C  F8 00 00 00,File address of new exe header
    } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

    这个结构名叫 IMAGE_DOS_HEADER 共 64 bytes,以 IMAGE_DOS_HEADER 结构描述的 DOS 文件头结构从 image 的 0x00000000 - 0x0000003F(64 bytes)

    结构的 e_magic 域是 DOS 头文件签名,它的值是:0x5A4D 代表字符 MZ,它在 WinNT.h 里定义为:

    #define IMAGE_DOS_SIGNATURE                 0x5A4D      // MZ

    e_lfanew 域是一个 offset 值,它指出 NT 文件头的位置。

    下面看看tlstest.exe 的 DOS 文件头内容:

    这里写图片描述

    绿色部分是 DOS 签名,蓝色部分是 PE header offset(NT 文件头)值,也就是 IMAGE_DOS_HEADER 里的 e_lfanew 值,表明 NT 文件头在 image 文件的 0x000000F8 处。

    4.2.1. DOS stub 程序

    在 DOS 文件头下面紧跟着一小段 stub 程序,其内容随着链接时使用的链接器不同而不同,在PE中并没有与之对应的相关结构。在本例中从 0x00000040 - 0x0000004D 共 14 bytes是代码,其后是显示数据等内容,这段 dos stub 程序是这样的:

    00000040  0E                push cs
    00000041  1F                pop ds
    00000042  BA0E00       mov dx,0xe
    00000045  B409            mov ah,0x9
    00000047  CD21           int 0x21
    00000049  B8014C       mov ax,0x4c01
    0000004C  CD21          int 0x21

    当 windows 的 PE 文件放在 DOS 上执行时,将会执行这一段 DOS stub 程序,作用是打印信息:This program cannot be run in DOS mode…. 然后调用 int 21 来终止执行返回到 DOS,看看它是怎样运行的:

    00000014  00 00      // ip
    00000016  00 00      // cs
    00000018  40 00      // e_lfarlc

    这个 DOS 执行环境中,CS 和 IP 被初始化为 0(对应值在IMAGE_DOS_HEADER结构中的e_ip、e_cs字段),e_lfarlc 是 DOS 环境的 relocate 表,它的值是 0x40 ,那么信息字符串的位置是:0x0040 + 0x000e = 0x4e,在 image 文件 0x0000004e 正好这字符串的位置。

    4.3. NT 文件头

    NT 文件头是 PE 文件头的核心部分,由 IMAGE_DOS_HEADER 结构的 e_lfanew 域指出它的位置。

    同样 NT 文件头部分由一个结构 IMAGE_NT_HEADER 来描述,在 WinNT.h 里定义如下:

    typedef struct _IMAGE_NT_HEADERS64 {
        DWORD Signature;
        IMAGE_FILE_HEADER FileHeader;
        IMAGE_OPTIONAL_HEADER64 OptionalHeader;
    } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;
    typedef struct _IMAGE_NT_HEADERS {
        DWORD Signature;
        IMAGE_FILE_HEADER FileHeader;
        IMAGE_OPTIONAL_HEADER32 OptionalHeader;
    } IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
    #ifdef _WIN64
    typedef IMAGE_NT_HEADERS64                  IMAGE_NT_HEADERS;
    typedef PIMAGE_NT_HEADERS64                PIMAGE_NT_HEADERS;
    #else
    typedef IMAGE_NT_HEADERS32                  IMAGE_NT_HEADERS;
    typedef PIMAGE_NT_HEADERS32                PIMAGE_NT_HEADERS;
    #endif

    可见这个结构分为 32 和 64 位版本,IMAGE_NT_HEADER 结构分为三大部分:

    • PE 文件签名:Signature
    • IMAGE_FILE_HEADER 文件头:FileHeader
    • IMAGE_OPTINAL_HEADER(32/64) 可选头:OptionalHeader

    IMAGE_NT_HEADERS32 和 IMAGE_NT_HEADERS64 的匹别在于 IMAGE_OPTIONAL_HEADER 结构,分别为:IMAGE_OPTIONAL_HEADERS32 和 IMAGE_OPTIONAL_HEADERS64

    在 Win32 下 IMAGE_NT_HEADERS32 是 248 bytes,在 Win64 下 IMAGE_NT_HEADERS64 是 264 bytes,因此 tlstest.exe的 NT 文件头从 0x000000F8 - 0x000001FF 共 264 bytes

    4.3.1. PE 签名

    在 WinNT.h 文件里定义了 PE 文件的签名,它是:

    #define IMAGE_NT_SIGNATURE                  0x00004550  // PE00

    这个签名值是 32 位,值为:0x00004550 即:PE 的 ASCII 码,下面看看 tlstest.exe 中的 PE 签名:

    这里写图片描述

    4.3.2. IMAGE_FILE_HEADER 文件头结构

    PE 签名接着是 IMAGE_FILE_HEADER 结构,它在 WinNT.h 中的定义为:

    typedef struct _IMAGE_FILE_HEADER {   
        WORD   Machine;               //运行平台 
        WORD   NumberOfSections;     //块(section)数目      
          DWORD    TimeDateStamp;        //时间日期标记     
          DWORD   PointerToSymbolTable;    //COFF符号指针,这是程序调试信息    
         DWORD   NumberOfSymbols;         //符号数  
          WORD   SizeOfOptionalHeader;    //可选部首长度,是IMAGE_OPTIONAL_HEADER的长度    
         WORD   Characteristics;         //文件属性 
    } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

    这个 IMAGE_FILE_HEADER 对 PE 文件大致的描述,这个结构共 20 bytes,它的域描述如下:

    size描述
    MachineWORDIMAGE_FILE_MACHINE_xxx表示目标平台 processor 类型,例:IMAGE_FILE_MACHINE_I386
    NumberOfSectionsWORD节数量表示映象中有多少个 section
    TimeDataStampDWORD从1970年1月1日0:00 以来的总秒数表示文件创建的时间
    PointerToSymbolTableDWORDCOFF 符号表偏移量在 image 文件中很少见,总是为 0
    NumberOfSymbolsDWORDCOFF 符号表的个数如果存在的话,表示符号表的个数
    SizeOfOptionalHeaderWORDIMAGE_OPTIONAL_HEADER 结构大小该域表示 IMAGE_NT_HEADER 中的 IMAGE_OPTIONAL_HEADER 结构的大小
    CharacteristicsWORDIMAGE_FILE_xxx表示文件属性,例如:IMAGE_FILE_DLL 属性

    IMAGE_FILE_HEADER 结构中比较重要的域是:Machine 和 SizeOfOptionalHeader, Machine 可以用来判断目标平台,比如:值为 0x8664 是代表 AMD64(即:x64 平台)它也适合 Intel64 平台。SizeOfOptionalHeader 指出 IMAGE_OPTIONAL_HEADER 结构的大小。

    WinNT.h 中定义了一些常量值用来描述 Machine,以 IMAGE_FILE_MACHINE_XXX 开头,下面是一些典型的常量值:

    #define IMAGE_FILE_MACHINE_UNKNOWN           0
    #define IMAGE_FILE_MACHINE_I386                   0x014c  // Intel 386.
    #define IMAGE_FILE_MACHINE_ALPHA                0x0184  // Alpha_AXP
    #define IMAGE_FILE_MACHINE_POWERPC            0x01F0  // IBM PowerPC Little-Endian
    #define IMAGE_FILE_MACHINE_AMD64                0x8664  // AMD64 (K8)

    WinNT.h 中还针对 Characteristics 域定义了一些常量值,以 IMAGE_FILE_XXX 开头,代表目标 image 文件的类型,下面是一些常见的值:

    #define IMAGE_FILE_RELOCS_STRIPPED              0x0001  // Relocation info stripped from file.
    #define IMAGE_FILE_EXECUTABLE_IMAGE          0x0002  // File is executable  (i.e. no unresolved externel references).
    #define IMAGE_FILE_LINE_NUMS_STRIPPED        0x0004  // Line nunbers stripped from file.
    #define IMAGE_FILE_LOCAL_SYMS_STRIPPED     0x0008  // Local symbols stripped from file.
    #define IMAGE_FILE_AGGRESIVE_WS_TRIM         0x0010  // Agressively trim working set
    #define IMAGE_FILE_LARGE_ADDRESS_AWARE  0x0020  // App can handle >2gb addresses
    #define IMAGE_FILE_BYTES_REVERSED_LO         0x0080  // Bytes of machine word are reversed.
    #define IMAGE_FILE_32BIT_MACHINE                 0x0100  // 32 bit word machine.
    #define IMAGE_FILE_DEBUG_STRIPPED               0x0200  // Debugging info stripped from file in .DBG file
    #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP   0x0400  // If Image is on removable media, copy and run from the swap file.
    #define IMAGE_FILE_NET_RUN_FROM_SWAP        0x0800  // If Image is on Net, copy and run from the swap file.
    #define IMAGE_FILE_SYSTEM                            0x1000  // System File.
    #define IMAGE_FILE_DLL                                 0x2000  // File is a DLL.
    #define IMAGE_FILE_UP_SYSTEM_ONLY              0x4000  // File should only be run on a UP machine
    #define IMAGE_FILE_BYTES_REVERSED_HI         0x8000  // Bytes of machine word are reversed.

    可以看出Characteristics是以每一位表示文件属性,它的每一个bit代表的含义如下:

             Bit 0 :置1表示文件中没有重定向信息。每个段都有它们自己的重定向信息。
                     这个标志在可执行文件中没有使用,在可执行文件中是用一个叫做基址重定向目录表来表示重定向信息的,这将在下面介绍。
            Bit 1 :置1表示该文件是可执行文件(也就是说不是一个目标文件或库文件)。
         Bit 2 :置1表示没有行数信息;在可执行文件中没有使用。
         Bit 3 :置1表示没有局部符号信息;在可执行文件中没有使用。
         Bit 4Bit 7 
         Bit 8 :表示希望机器为32位机。
         Bit 9 :表示没有调试信息,在可执行文件中没有使用。
         Bit 10:置1表示该程序不能运行于可移动介质中(如软驱或CD-ROM)。在这    种情况下,OS必须把文件拷贝到交换文件中执行。
             Bit 11:置1表示程序不能在网上运行。在这种情况下,OS必须把文件拷贝到交换文件中执行。
             Bit 12:置1表示文件是一个系统文件例如驱动程序。在可执行文件中没有使用。
             Bit 13:置1表示文件是一个动态链接库(DLL)。
             Bit 14:表示文件被设计成不能运行于多处理器系统中。
             Bit 15:表示文件的字节顺序如果不是机器所期望的,那么在读出之前要进行
                     交换。在可执行文件中它们是不可信的(操作系统期望按正确的字节顺序执行程序)。

    NumberOfSections 表示 image 有多个 section,另一个重要的域是:SizeOfOptionalHeader 它指出接下来 IMAGE_OPTIONAL_HEADER 的大小,它有两个 size:Win32 的 0xDC 和 Win64 的 0xF0.

    下面是 tlstest.exe的 IMAGE_FILE_HEADER 结构,从 0x000000F8 - 0x0000010F 共 20 bytes:

    这里写图片描述

    将这些值分解为:

    000000FC  64 86                   // Machine
    000000FE  07 00                   // NumberOfSections
    00000100  F1 71 1E 57           // TimeDateStamp
    00000104  00 00 00 00           // PointerToSymbolTable
    00000108  00 00 00 00           // NumberOfSymbols
    0000010C  F0 00                   // SizeOfOptionalHeader
    0000010E  22 00                   // Characteristics
    • Machine 是 0x0x8664,它的值是 IMAGE_FILE_MACHINE_AMD64,说明这个 image
      文件的目标平台是 AMD64,即:X64 平台
    • NumberOfSections 是 0x08,说明 image 文件内含有 8 个 sections
    • SizeOfOptionalHeader 是 0xF0,说明接下来的 IMAGE_OPTIONAL_HEADERS64 将是
      0xF0(224 bytes)

    它的 Characteristics 是 0x0022 = IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LARGE_ADDRESS_AWARE,说明这个 image 是 64 位可执行的映像。可以在 >2G 地址上,并且指明了接下来的 IMAGE_OPTIONAL_HEADER 结构是 0xf0 bytes(240 个字节)。

    4.3.3. IMAGE_OPTIONAL_HEADER64 结构

    在 IMAGE_FILE_HEADER 结构里已经指明了 image 是 64 位,并且 IMAGE_OPTIONAL_HEADER 的大小是 240 bytes,那么这个结构就是 IMAGE_OPTIONAL_HEADER64 结构。
    可以根据 IMAGE_FILE_HEAER 结构的 Machine 来判断 image 是 Win32 还是 Win64 平台的。但是 Microsoft 官方推荐及认可的方法是从 IMAGE_OPTIONAL_HEADER 里的 magic 的值来判断目标平台 。

    在 WinNT.h 里 IMAGE_OPTIONAL_HEADER64 的定义如下:

    typedef struct _IMAGE_OPTIONAL_HEADER64 {
    
        WORD          Magic;
        BYTE           MajorLinkerVersion;
        BYTE           MinorLinkerVersion;
        DWORD        SizeOfCode;
        DWORD        SizeOfInitializedData;
        DWORD        SizeOfUninitializedData;
        DWORD        AddressOfEntryPoint;
        DWORD        BaseOfCode;
        ULONGLONG   ImageBase;
        DWORD        SectionAlignment;
        DWORD        FileAlignment;
        WORD          MajorOperatingSystemVersion;
        WORD          MinorOperatingSystemVersion;
        WORD          MajorImageVersion;
        WORD          MinorImageVersion;
        WORD          MajorSubsystemVersion;
        WORD          MinorSubsystemVersion;
        DWORD        Win32VersionValue;
        DWORD        SizeOfImage;
        DWORD        SizeOfHeaders;
        DWORD        CheckSum;
        WORD          Subsystem;
        WORD          DllCharacteristics;
        ULONGLONG  SizeOfStackReserve;
        ULONGLONG  SizeOfStackCommit;
        ULONGLONG  SizeOfHeapReserve;
        ULONGLONG  SizeOfHeapCommit;
        DWORD        LoaderFlags;
        DWORD        NumberOfRvaAndSizes;
        IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
    } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;

    64 位的 IMAGE_OPTIONAL_HEADER64 里没有 BaseOfData 域,其它的与 IMAGE_OPTIONAL_HEADER32 结构的域是一样的,只是一些域扩展为 64 位值,它们包括:

    • ImageBase
    • SizeOfStackReserve
    • SizeOfStackCommit
    • SizeOfHeapRerserve
    • SizeOfHeapCommit

    这些域在 64 位结构里被定义为 ULONGLONG 类型。

    IMAGE_OPTIONAL_HEADER64 的定义的各个域含义如下:

    偏移大小字段描述
    02MagicThe unsigned integer that identifies the state of the image file. The most common number is 0x10B, which identifies it as a normal executable file. 0x107 identifies it as a ROM image, and 0x20B identifies it as a PE32+ executable. 确定这是什么类型的头。两个最常用的值是0x10b和0x20b.
    21MajorLinkerVersionThe linker major version number. 创建可执行文件的链接器的主版本号。对于Microsoft的链接器生成的PE文件,这个版本号的Visual Studio的版本号相一致
    31MinorLinkerVersionThe linker minor version number. 创建可执行文件的链接器的次版本号。
    44SizeOfCodeThe size of the code (text) section, or the sum of all code sections if there are multiple sections. 所有具有IMAGE_SCN_CNT_CODE属性的节的总的大小。
    84SizeOfInitializedDataThe size of the initialized data section, or the sum of all such sections if there are multiple data sections. 所有包含已初始数据的节的总的大小。
    124SizeOfUninitializedDataThe size of the uninitialized data section (BSS), or the sum of all such sections if there are multiple BSS sections. 所有包含未初始化数据的节的总的大小。这个域总是0,因为链接器可以把未初始化数据附加到常规数据节的末尾。
    164AddressOfEntryPointThe address of the entry point relative to the image base when the executable file is loaded into memory. For program images, this is the starting address. For device drivers, this is the address of the initialization function. An entry point is optional for DLLs. When no entry point is present, this field must be zero. 文件中将被执行的第一个代码字节的RVA。对于DLL,这个进入点将在进程初始化和关闭时以及线程被创建和销毁时调用。在大多数可执行文件中,这个地址并不直接指向main,WinMain或DllMain函数,而是指向运行时库代码,由运行时库调用前述函数。在DLL中,这个域可以被设为0。链接器选项/NOENTRY可以设置这个域为0。
    204BaseOfCodeThe address that is relative to the image base of the beginning-of-code section when it is loaded into memory. 加载到内存后代码的第一个字节的RVA
    244BaseOfDataThe address that is relative to the image base of the beginning-of-data section when it is loaded into memory. 理论上,它表示加载到内存后数据的第一个字节的RVA。然而,这个域的值对于不同版本的Microsoft链接器是不一致的。在64位的可执行文件中这个域不出现。
    28/244/8ImageBaseThe preferred address of the first byte of image when loaded into memory; must be a multiple of 64 K. The default for DLLs is 0x10000000. The default for Windows CE EXEs is 0x00010000. The default for Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98, and Windows Me is 0x00400000. 文件在内存中的首选加载地址。加载器尽可能地把PE文件加载到这个地址(就是说,如果当前这块内存没有被占用,它是对齐的并且是一个合法的地址,等等)。如果可执行文件被加载到这个地址,加载器就可以跳过进行基址重定位这一步。在Win32下,对于EXE,缺省的ImageBase是0x400000。对于DLL,缺省是0x10000000。在链接时可以通过/BASE 选项来指定ImageBase,或者以后用REBASE工具重新设置。
    32/324SectionAlignmentThe alignment (in bytes) of sections when they are loaded into memory. It must be greater than or equal to FileAlignment. The default is the page size for the architecture. 加载到内存后节的对齐大小。这个值必须大于等于FileAlignment(下一个域)。缺省的对齐值是目标CPU的页大上。对于运行在Windows 9x或Windows Me下的用户模式可执行文件,最小对齐大小是一页(4KB)。这个域可以通过链接器选项/ALIGN来设置。
    36/364FileAlignmentThe alignment factor (in bytes) that is used to align the raw data of sections in the image file. The value should be a power of 2 between 512 and 64 K, inclusive. The default is 512. If the SectionAlignment is less than the architecture’s page size, then FileAlignment must match SectionAlignment. 在PE文件中节的对齐大小。对于x86下的可执行文件,这个值通常是0x200或0x1000。不同版本的Microsoft链接器缺省值不同。这个值必须是2的幂,并且如果SectionAlignment小于CPU的页大小,这个域必须和SectionAlignment相匹配。链接器选项/OPT:WIN98可设置x86可执行文件的文件对齐为0x1000,/OPT:NOWIN98设置文件对齐为0x200。
    40/402MajorOperatingSystemVersionThe major version number of the required operating system. 所要求的操作系统的主版本号。随着那么多版本Windows的出现,这个域的值就变得很不确切。
    42/422MinorOperatingSystemVersionThe minor version number of the required operating system. 所要求的操作系统的次版本号。
    44/442MajorImageVersionThe major version number of the image. 这个文件的主版本号。不被系统使用并可设为0。可以通过链接器选项/VERSION来设置。
    46/462MinorImageVersionThe minor version number of the image. 这个文件的次版本号。
    48/482MajorSubsystemVersionThe major version number of the subsystem. 可执行文件所要求的操作子系统的主版本号。它曾经被用来表示需要较新的Windows 95或Windows NT用户界面,而不是老版本的Windows NT界面。今天随着各种不同版本Windows的出现,这个域已不被系统使用,并且通常被设为4。可通过链接器选项/SUBSYSTEM设置这个域的值。
    50/502MinorSubsystemVersionThe minor version number of the subsystem. 可执行文件所要求的操作子系统的次版本号。
    52/524Win32VersionValueReserved, must be zero. 另一个不被使用的域,通常设为0。
    56/564SizeOfImageThe size (in bytes) of the image, including all headers, as the image is loaded in memory. It must be a multiple of SectionAlignment. 映像的大小。它表示了加载文件到内存中时系统必须保留的内存的数量。这个域的值必须是SectionAlignmnet的倍数。
    60/604SizeOfHeadersThe combined size of an MS-DOS stub, PE header, and section headers rounded up to a multiple of FileAlignment. MS-DOS头,PE头和节表的总的大小。PE文件中所有这些项目出现在任何代码或数据节之前。这个域的值被调整为文件对齐大小的整数倍。
    64/644CheckSumThe image file checksum. The algorithm for computing the checksum is incorporated into IMAGHELP.DLL. The following are checked for validation at load time: all drivers, any DLL loaded at boot time, and any DLL that is loaded into a critical Windows process. 映像的校验和。IMAGEHLP.DLL中的CheckSumMappedFile函数可以计算出这个值。校验和用于内核模式的驱动和一些系统DLL。对于其它的,这个域可以为0。当使用链接器选项/RELEASE时校验和被放入文件中。
    68/682SubsystemThe subsystem that is required to run this image. For more information, see “Windows Subsystem” later in this specification. 指示可执行文件期望的子系统(用户界面类型)的枚举值。这个域只用于EXE。一些重要的值包括:
    IMAGE_SUBSYSTEM_NATIVE // 映像不需要子系统
    IMAGE_SUBSYSTEM_WINDOWS_GUI // 使用Windows GUI IMAGE_SUBSYSTEM_WINDOWS_CUI // 作为控制台程序运行。
    // 运行时,操作系统创建一个控制台
    // 窗口并提供stdin,stdout和stderr
    // 文件句柄。
    70/702DllCharacteristicsFor more information, see “DLL Characteristics” later in this specification. 标记DLL的特性。对应于IMAGE_DLLCHARACTERISTICS_xxx定义。当前的值是:
    IMAGE_DLLCHARACTERISTICS_NO_BIND // 不要绑定这个映像
    IMAGE_DLLCHARACTERISTICS_WDM_DRIVER // WDM模式的驱动程序
    IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE // 当终端服务加载一个不是
    // Terminal- Services-aware 的应用程
    // 序时,它也加载一个包含兼容代码
    // 的DLL。
    72/724/8SizeOfStackReserveThe size of the stack to reserve. Only SizeOfStackCommit is committed; the rest is made available one page at a time until the reserve size is reached. 在EXE文件中,为线程保留的堆栈大小。缺省是1MB,但并不是所有的内存一开始都被提交。
    76/804/8SizeOfStackCommitThe size of the stack to commit. 在EXE文件中,为堆栈初始提交的内存数量。缺省情况下,这个域是4KB。
    80/884/8SizeOfHeapReserveThe size of the local heap space to reserve. Only SizeOfHeapCommit is committed; the rest is made available one page at a time until the reserve size is reached. 在EXE文件中,为默认进程堆初始保留的内存大小。缺省是1MB。然而在当前版本的Windows中,堆不经过用户干涉就能超出这里指定的大小。
    84/964/8SizeOfHeapCommitThe size of the local heap space to commit. 在EXE文件中,提交到堆的内存大小。缺省情况下,这里的值是4KB。
    88/1044LoaderFlagsReserved, must be zero. 不使用。
    92/1084NumberOfRvaAndSizesThe number of data-directory entries in the remainder of the optional header. Each describes a location and size. 在IMAGE_NT_HEADERS结构的末尾是一个IMAGE_DATA_DIRECTORY结构数组。此域包含了这个数组的元素个数。自从最早的Windows NT发布以来这个域的值一直是16。

    上面表格中的 offset 值两个,前面的是 IMAGE_OPTIONAL_HEADER32 的 offset 值,后面的是 IMAGE_OPTIONAL_HEADER64,这是因为在 64 位版本中一些域被扩展为 64 位值,而 BaseOfData 域在 64 位版中是不存在的。
    Magic 域是一个幻数值,在 WinNT.h 里定义了一些常量值:

    #define IMAGE_NT_OPTIONAL_HDR32_MAGIC      0x10b
    #define IMAGE_NT_OPTIONAL_HDR64_MAGIC      0x20b
    #define IMAGE_ROM_OPTIONAL_HDR_MAGIC       0x107
    • 值 0x10b 说明这个 image 是 32 位的,PE 文件格式是 PE32
    • 值 0x20b 说明这个 image 是 64 位的,PE 文件格式是 PE32+

    PE32+ 代表的扩展的 PE 文件格式,扩展为 64 位。在 PE 文件规范中并没有 PE64 这种文件格式,Microsoft 官方的判断 image 文件是 32 位还是 64 位的方法就是通过 Magic 的值来确定。

    在这些基本的域里可以获得 linker 的版本,text 节,data 节以及 bss 节的大小,下面看一看tlstest.exe 的 IMAGE_OPTIONAL_HEADER64 结构,从 0x00000110 - 0x000001FF

    这里写图片描述

    这里写图片描述

    Magic 是 0x020B 表明这个 image 文件是 64 位的 PE32+格式,这里看出 linker 的版本是 14.00
    .text 节的 size 是 0x00001000 bytes,.data 节的 size 是 0x00022000 bytes,还有一个重要的信息,代码的 RVA 入口在 0x00001338,它是基于 ImageBase 的 RVA 值。tlstest.exe 的 ImageBase 是0x0000000140000000,那么 tlstest.exe 映象的入口在:ImageBase + AddressOfEntryPoint = 0x0000000140000000 + 0x00001338 = 0x0000000140001338,这个地址是 __scrt_common_main() 的入口。

    上面的 SectionAlinment 域值为 0x1000 是表示映象被加载到 virtual address 以是 0x1000(4K byte)为单位的倍数,也就是加载在 virtual address 的 4K 边界上。例如:tlstest.exe映象的 .text 节被加载到以 ImageBase(virtual address 为 0x00000001_40000000)为基址的第 1 个 4K 边界上(即:0x00000001_40001000 处),.rdata 节加载到第 2 个 4K 边界上(即:0x00000001_40002000 处)。FileAlinment 域的值为 0x200 表示执行映象从 0x200 为边界开始加载到 virtual address 上。例如,t.exe 映象中 code 位于文件映象的 0x400 处(0x200 边界上),因此,t.exe 文件映象 code 从 0x400 处开始加载到 virtual address。

    4.3.3.1. IMAGE_DATA_DIRECTORY表格

    这里写图片描述

    在 IMAGE_OPTIONAL_HEADER64 未端是一组 IMAGE_DATA_DIRECTORY 结构的数组,上图所示:从 0x00000180 到 0x000001FF。在 WinNT.h 里定义为:

    //
    // Directory format.
    //
    typedef struct _IMAGE_DATA_DIRECTORY {
        DWORD   VirtualAddress;
        DWORD   Size;
    } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
    #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES    16

    这个结构十分重要,它用来描述 windows 执行映象中所使用的各种表格的位置和大小。VirtualAddress 域是一个 RVA(Relative Virtual Address)值,更明白一点就是:它是一个偏移量(基于 PE 文件头),Size 域表示这个表格有多大。IMAGE_NUMBEROF_DIRECTORY_ENTRIES 的值为 16,因此有 16 个 Directory,也就是表示,在执行映象中最多可以使用 16 个表格。

    这 16 个 Driectory 指引出 16 不同格式的 table,实际上这 16 个表格是固定的,对于这些表格 Microsoft 都作了统一的规定,在 WinNT.h 里都作了定义:

    // Directory Entries
    #define IMAGE_DIRECTORY_ENTRY_EXPORT              0   // Export Directory
    #define IMAGE_DIRECTORY_ENTRY_IMPORT              1   // Import Directory
    #define IMAGE_DIRECTORY_ENTRY_RESOURCE          2   // Resource Directory
    #define IMAGE_DIRECTORY_ENTRY_EXCEPTION         3   // Exception Directory
    #define IMAGE_DIRECTORY_ENTRY_SECURITY           4   // Security Directory
    #define IMAGE_DIRECTORY_ENTRY_BASERELOC         5   // Base Relocation Table
    #define IMAGE_DIRECTORY_ENTRY_DEBUG                6   // Debug Directory
    //      IMAGE_DIRECTORY_ENTRY_COPYRIGHT           7   // (X86 usage)
    #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE    7   // Architecture Specific Data
    #define IMAGE_DIRECTORY_ENTRY_GLOBALPTR         8   // RVA of GP
    #define IMAGE_DIRECTORY_ENTRY_TLS                    9   // TLS Directory
    #define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    10   // Load Configuration Directory
    #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT  11   // Bound Import Directory in headers
    #define IMAGE_DIRECTORY_ENTRY_IAT                   12   // Import Address Table
    #define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   13   // Delay Load Import Descriptors
    #define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14   // COM Runtime descriptor

    从定义上得出,第 0 项是 export table(导出表),第 1 项是 import table(导入表)等等,在 Microsoft 的 MSDN 网站里有一个知识点介绍:http://msdn.microsoft.com/en-us/library/ms680305(VS.85).aspx
    下面,我将这些表格归纳如下:

    表项表格
    0export table
    1import table
    2resource table
    3exception table
    4certificate table
    5base relocation table
    6debug
    7architecute
    8global pointer
    9TLS table
    10load configuration table
    11bound import
    12import address table
    13delay import descriptor
    14CLR runtime header
    15reserved, must bo zero

    在 WinNT.h 有对这些 table 的结构的全部定义。

    那么,下面我们来看一看tlstest.exe 映象中使用了哪些表?

    这里写图片描述

    上面表格显示我们的示例程序 t.exe 仅仅使用了 8 个 driectory 表格:import table、resource table 、exception table 、relocation table 、debug table、TLS table、load configuration table以及 import address table。

    4.4. section 表

    IMAGE_NT_HEADER 结构后面紧接着就是 section table(节表)结构。现在来看一看tlstest.exe 的 section 表,从 0x00000200 - 0x0000033F,共 320 bytes

    这个节表结构在 WinNT.h 中定义为

    //
    // Section header format.
    //
    #define IMAGE_SIZEOF_SHORT_NAME              8
    typedef struct _IMAGE_SECTION_HEADER {
        BYTE    Name[IMAGE_SIZEOF_SHORT_NAME];
        union {
                DWORD   PhysicalAddress;
                DWORD   VirtualSize;
        } Misc;
        DWORD   VirtualAddress;
        DWORD   SizeOfRawData;
        DWORD   PointerToRawData;
        DWORD   PointerToRelocations;
        DWORD   PointerToLinenumbers;
        WORD     NumberOfRelocations;
        WORD     NumberOfLinenumbers;
        DWORD   Characteristics;
    } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
    #define IMAGE_SIZEOF_SECTION_HEADER          40

    每个 section 表的大小为 40 bytes,section 表的作用是指出 image 映象 section 所在tlstest.exe 映象的 IMAGE_FILE_HEADER 结构的 NumberOfSections 域里已经指出tlstest.exe 映象中包含有 8 个 sections,因此整个 section 表的大小为:320 bytes。

    tlstest.exe的 section 表如下:

    这里写图片描述

    这 8 个 section 分别是:

    • .text 节
    • .rdata 节
    • .data 节
    • .pdata 节
    • .tls 节
    • .gfids 节
    • .rsrc 节
    • .reloc 节
      这里写图片描述

    在 IMAGE_SECTION_HEADER 结构的第 1 个域 Name,用来标识 section table 的名字。它的长度固定为 8 bytes(前面定义的宏),这将意味着,不存在超过 8 bytes 的节表名。接下来使用 VirtualSize 来用表示 section talbe 大小。VirtualAddress 表示 section table 的 RVA,它是基于 ImageBase 的 RVA 值,它指出 section 的所在,SizeOfRawData 是在 image 文件里占有的空间,它是 FileAlignment 的倍数,即:0x200 的倍数,也就是说 0x200 的边界。PointerToRawData是 section 在 image 文件的位置,同样也是 FileAligment 即:0x200 边界上。

    size描述
    Name8 bytesSection 表名字
    VirtualSizeDWORDSection 表的大小
    VirtualAddressDWORDSection 表的 RVA,即:section 表的位置
    SizeOfRawDataDWORDsection 表占用映像的大小,这个 size 是以 0x200 为单位的
    PointerToRawDataDWORDsection 表在映像中的物理位置,即是:file 位置,而非 virtual 位置
    PointerToRelocationDOWRD
    PointerToLinenumberDWORD
    NumberOfRelocationWORD
    NumberOfLineumbersWORD
    CharacteristicsDWORDsection 的属性 flags,可用于 ‘

    所有的 Characteristics 都在 WinNT.h 中有定义,下面是一些常用的 flags:

    #define IMAGE_SCN_CNT_CODE                            0x00000020  // Section contains code.
    #define IMAGE_SCN_CNT_INITIALIZED_DATA         0x00000040  // Section contains initialized data.
    #define IMAGE_SCN_CNT_UNINITIALIZED_DATA     0x00000080  // Section contains uninitialized data.
    ... ...
    #define IMAGE_SCN_LNK_NRELOC_OVFL                0x01000000  // Section contains extended relocations.
    #define IMAGE_SCN_MEM_DISCARDABLE                0x02000000  // Section can be discarded.
    #define IMAGE_SCN_MEM_NOT_CACHED                 0x04000000  // Section is not cachable.
    #define IMAGE_SCN_MEM_NOT_PAGED                   0x08000000  // Section is not pageable.
    #define IMAGE_SCN_MEM_SHARED                        0x10000000  // Section is shareable.
    #define IMAGE_SCN_MEM_EXECUTE                       0x20000000  // Section is executable.
    #define IMAGE_SCN_MEM_READ                            0x40000000  // Section is readable.
    #define IMAGE_SCN_MEM_WRITE                           0x80000000  // Section is writeable.

    下面以 .text 节为例,看看tlstest.exe的 .text 是什么。

    这里写图片描述

    .text 节的 Name 是 “.text”,VirtualSize 是 0x00000E08 bytes,.text 节在 RVA 为 0x00001000 的位置上,section 的分配单位为 0x1000(4K bytes),第 1 个 section 一般都分配在 0x1000 位置上,SizeOfRawData 为 0x1000,这是映像文件分配单位。PointerToRawData 为 0x400,说明 .text 节在映像文件的 0x400 处。Characteristics 是 0x60000020,说明 .text 是 executable/readable/code 属性。

    展开全文
  • 什么要学数据结构

    万次阅读 多人点赞 2019-11-19 09:45:23
    一、前言 在可视化化程序设计的今天,借助于...1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...

    一、前言

    在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件:

    1) 能够熟练地选择和设计各种数据结构和算法

    2) 至少要能够熟练地掌握一门程序设计语言

    3) 熟知所涉及的相关应用领域的知识

    其中,后两个条件比较容易实现,而第一个条件则需要花相当的时间和精力才能够达到,它是区分一个程序设计人员水平高低的一个 重要标志,数据结构 贯穿程序设计的始终 ,缺乏数据结构和算法的深厚功底,很难设计出高水平的具有专业水准的应用程序。曾经有一本经典计算机专业书籍叫做《数据结构+算法=程序》,也说明了数据结构和算法的重要性。

    在这里插入图片描述

    二、为什么要学数据结构

    • 数据结构是所有计算机专业的同学必学的一门课程
    • 数据结构研究的是数据如何再计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据

    计算机专业的学生都开设过数据结构课程,它是计算机学科知识结构的核心和技术体系的基石。数据结构作为计算机专业的专业基础课程,是计算机 考研必考 科目之一,如果有打算报考计算机专业的研究生,这门数据结构你是必须要学好它的,同时,工作以后的同学,会有想去报考计算机 软考 、计算机 等级考试 的,数据结构也是必考的内容之一,科学技术在飞速发展,但是作为基石的科学技术没有动摇,由于近年来算法工程师的高薪火爆,使得数据结构的重视程序空前高涨,总而言之,既然我们已经与计算机接轨就必须 掌握 好它。

    三、数据结构无处不在

    不管你是IT开发,还是其他岗位的工作人员,或者是游戏爱好者,只要你用过电脑,那么你就接触过数据结构,下面我们就来讲一讲,数据结构究竟是如何 无处不在 的。

    3.1 数据库

    不管你是从事IT工作的,还是准备从事IT开发的,数据库一定是了解的,我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为 O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如 二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,但是数据本身的组织结构不可能完全满足各种数据结构,所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是 索引 ,索引是一种帮助MySQL高效获取数据的 排好序数据结构,其中MySQL使用的数据结构为 B+Tree
    在这里插入图片描述

    3.2 操作系统

    相信现在的我们常用的操作系统大家一定都知道吧,例如:比尔盖茨大叔成立的微软的 Windows操作系统,大神乔布斯苹果的 Mac OS,Java开发常用的 Linux系统,由林纳斯·本纳第克特·托瓦兹开发(百度来的),还有redhat、Solaris、SunCobalt等等,都有使用到数据结构中的,系统栈以及优先队列:堆
    在这里插入图片描述

    3.3 文件压缩

    比如:RAR压缩软件、PNG图片、MAP3文件等等,都会使用数据结构,对数据进行压缩(很怕打成了亚索,心虚),而使用压缩的算法是一种树结构叫 哈夫曼树

    在这里插入图片描述

    3.4 游戏

    1) 数组:需处理的元素个数确定并且需使用下标时可以考虑,不过建议用泛型List
    优点:数组在内存中是连续存储的,索引和修改的速度都非常快
    缺点:插入和删除很慢,长度开辟过长易造成内存浪费,长度开辟过短易造成内存越界

    2) List: List是泛型的,即List,需处理的元素个数可以不确定,不存在装箱与拆箱,建议多用;而ArrayList:ArrayList list1 = new ArrayList(); ArrayList的元素属于 object 类型存在装箱与拆箱,很损耗性能。,List的底层数据结构就是数组。

    List<string> list = new List<string>();
    //新增数据   
    list.Add(“abc”);   
    //修改数据   
    list[0] = “def”;   
    //移除数据   
    list.RemoveAt(0);  
    //错误操作,因为数据的类型不是string
    list.add(123);
    

    3) 链表:常用来维护、管理那些需要频繁产生、消除的游戏对象,比如:消除类游戏中需要消除的对象。

    4) HashMap:底层是哈希表,是键值对容器,用于处理key/value键值对;底层使用的是数组+链表的结构:Map<String,String> map = new HashMap<>();

    5) 树: 1.场景管理中的四叉树;2.游戏UI里的菜单一般是分级的,一个主页面可以衍生出很多的子页面的时候,使用树来管理这些菜单是很合适的做法。

    6) 图: A*寻路算法、DFS、BFS

    游戏也是采用了大量的算法,都需要以数据结构为基石,就最简单的功能寻路,鼠标从A点到B点,这个角色就需要寻找一条从A点到B点的路,这条路还需要绕过所有的障碍物,甚至还需要找出最短的路径,这就是最经典的 图论算法,在图论算法种就使用了大量的数据结构。

    在这里插入图片描述

    四、数据结构类型

    在这里插入图片描述

    在计算机领域有一句名言 数据结构+算法=程序,而数据结构本身就是算法的基石,在近乎任何一本算法教材,都花了大量的时间讲解数据结构,学好数据结构和算法可以让我们在计算机这条道路上走的更远。如果数据结构是因为它无处不在,学好数据结构是使我们快速成长的垫脚石。

    在接下面的几篇文章中,我会为大家更新数据结构中:数组、栈、队列、链表、二分搜索树、堆、线段树、Trie、并查集、红黑树以及哈希表等等...的详细讲解,感兴趣的同学记得关注我,我是牧小农,我喂自己带盐。

    展开全文
  • 关于windows7基本操作的实验总结.docx

    千次阅读 2021-07-16 06:09:27
    关于windows7基本操作的实验总结大学计算机基础 第二章Windows7 上 机 实 验 报 告 班级: 学号: 姓名:Windows7的基本操作一 一、实验目的: 1、了解桌面的组成,掌握桌面属性的设置方法; 2、掌握...
  • Linux 内核和 Windows 内核有什么区别?

    万次阅读 多人点赞 2021-02-20 09:46:29
    Windows 基本占领了电脑时代的市场,商业上取得了很大成就,但是它并不开源,所以要想接触源码得加入 Windows 的开发团队中。 对于服务器使用的操作系统基本上都是 Linux,而且内核源码也是开源的,任何人都可以下载...
  • win7下堆管理结构分析

    千次阅读 2015-10-10 13:43:45
    win7下堆管理结构主要包括HEAP HEAP_SEGMENT HEAP_ENTRY 这几个结构
  • 微内核结构可以有效地支持多处理机运行,故非常适用于分布式系统,当前比较流行的、能支持多处理机运行的OS,几乎全部都采用了微内核结构,如 Mach OS、Windows 2000/XP。 一、计算机体系结构——冯 · 诺依曼结构...
  • Windows系统如何mount盘符到目录

    万次阅读 多人点赞 2019-08-31 10:58:50
    Windows上如何将一个文件系统分区挂载到一个目录,这其实是一个 硬需求! 是的,非常硬的需求。因为我们总是面临C盘,D盘满了却无法动态扩容问题。所以,在有一天我因为路上堵车撸了一个Linux上的最小的tinyfs之后...
  • Windows操作系统的体系结构

    千次阅读 2011-09-11 09:58:03
    下面是windows的体系结构:   这是整个windows的体系结构的总览。从图上可以看出系统被分成内核模式和用户模式。 内核模式的构成文件是系统的核心文件她包含: hal.dll ntoskrnl.exe 设备驱动 ...
  • 文章转自:http://www.ithov.com/Article/Windows7/Win7Skills/93264.shtml Windows 7/Windows Server 2008 R2发布已经有近一个月了,加上RC/beta阶段,相信很多人都已经接触或者使用过了。很多人都已经知道在界面...
  • 什么是BS结构什么是CS结构

    千次阅读 2021-04-12 11:50:32
    C/S和B/S都是互联网中常见的网络结构模型。 一、什么是C/S模型? C是英文单词“Client”的首字母,即客户端的意思,C/S就是“Client/Server”的缩写,即“客户端/服务器”模式。 例如:拼多多APP、PC上的有道云笔记...
  • 作者:巴斯滕 转自:http://blog.csdn.net/wince7/article/details/6543114 ...Windows Embedded Compact 7是在Windows Embedded CE的基础之上演变而来的。它是一种组件化的实时操作系统,用于创建各种占用空间小的企
  • 在安装Windows过程中,格式化C盘之后,提示:Windows无法安装到这个磁盘,选中的磁盘采用gpt分区形式 问题原因 由于硬盘格式为GPT分区表,而您的U盘启动引导方式为“Legacy”模式,导致了开机引导方式和磁盘数据结构...
  • Windows什么越用越慢而Linux却不会?

    万次阅读 多人点赞 2019-07-25 22:07:34
    哈哈,我又来了。...为什么Windows/iOS操作很流畅而Linux/Android却很卡顿呢? https://blog.csdn.net/dog250/article/details/96362789 所以,上述文章的声明,本文依然适用,不再赘述。 这个话题网上一搜一...
  • 从这篇文章开始,作者将带着大家来学习《Windows黑客编程技术详解》,其作者是甘迪文老师,推荐大家购买来学习。作者将采用实际编程和图文结合的方式进行分享,并且会进一步补充知识点。第一篇文章主要包括两部分...
  • 局域网拓扑结构(常见三种)

    千次阅读 2021-07-31 08:37:14
    局域网拓扑结构是指网络中结点的互连构形,是网络的接线图大多数局域网使用以下三种基本拓扑之一:1.环形2.总线形3.星形其他许多的拓扑,例如星形连接环,星形总线,树,或分布式网络,是三种基本拓扑结构的混合组合...
  • 计算机网络按拓扑结构分为哪些

    千次阅读 2021-06-16 12:10:33
    本教程操作环境:windows7系统、Dell G3电脑。相关推荐:《编程视频》计算机网络的拓扑结构,即是指网上计算机或设备与传输媒介形成的结点与线的物理构成模式。网络的结点有两类:一类是转换和交换信息的转接结点,...
  • windows内存堆的数据结构

    千次阅读 2012-10-16 19:52:21
    还是紧接着昨天的问题,很想明白到底在内存中堆的数据结构到底是怎么样的?究竟是不是别人回答的红黑树...上面这本书里面主要讲了对windows2000 - windows xp1 平台的堆管理策略。 对于基本的操作系统中堆的一些特征,
  • [ linux ] 文件系统和目录结构详解

    千次阅读 多人点赞 2021-12-07 20:29:21
    微软的DOS和windows也是采用树型结构,但是在DOS和 windows中这样的树型结构的根是磁盘分区的盘符,有几个分区就有几个树型结构,他们之间的关系是并列的。 但是在linux中,无论操作系统管理几个磁盘分区,这样的...
  • linux & windows C++开发差异

    千次阅读 2017-11-03 17:46:19
    windows下不区分大小写,路径分隔符一般使用”\”;linux下区分大小写,路径分隔符使用”/”。 2、itoa()函数在linux下并不存在。 所以使用类似sprintf();之类的函数是个不错的替代。(为什么说是类似函数,看...
  • 文章目录Python 3.7.3安装安装程序下载启动安装程序定制安装设置安装目录安装完毕验证安装成功检查Windows环境变量确认Python版本探索Python的安装目录安装目录安装目录下其他的子目录多版本Python共存创建超链接...
  • 文章目录Python 2.7.15安装下载安装程序启动安装程序指定安装目录安装选项启用环境变量高级选项安装完毕安装成功验证检查Windows环境变量确认Python版本探索Python的安装目录安装目录结构Python安装目录下的子目录...
  • 《数据结构》(C语言版)严蔚敏

    热门讨论 2012-08-31 09:29:24
    光盘内容可在DOS环境下运行的以类C语言描述的“数据结构算法动态模拟辅助教学软件,以及在Windows环境下运行的以类PASCAL或类C两种语言描述的“数据结构算法动态模拟辅助教学软件”。内附 数据结构算法实现(严蔚敏...
  • PE文件结构解析

    千次阅读 2021-09-01 17:16:59
    PE(Portable Executable)文件,即可移植的可执行文件,是 Windows 操作系统上主流的可执行文件。
  • Windows API函数大全(Windows编程参考手册)

    千次阅读 多人点赞 2020-12-10 15:50:58
    Windows API包括几千个可调用的函数,它们大致可以分为以下几个大类:基本服务、组件服务、用户界面服务、图形多媒体服务、消息和协作、网络、Web服务。
  • dockerToolbox和docker for windows的区别

    万次阅读 2018-11-25 15:54:12
    前言: 我们先来补充一下关于hyper-v 虚拟机与virtualbox和VMware的知识 一:VMware工作站(VMware Workstation)是VMware公司...每个虚拟机实例可以运行其自己的客户机操作系统,如(但不限于)Windows、Linux、BSD变...
  • C++和C在linux下编程和与在WINDOWS下有什么区别 [ 标签:c++ 编程,c++

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 317,264
精华内容 126,905
关键字:

windows7采用什么结构