Windows NT架构相关资料

Windows NT架构相关资料

文章目录

  • Windows NT架构相关资料
    • Windows NT架构——Wiki
    • Windows API——Wiki
      • Window API分类
    • 微软Windows库文件——Wiki
      • 1. 内部组件
        • 1.1 HAL.DLL(未明确翻译)
        • 1.2 NTDLL.DLL
      • 2. Win32 API
        • 2.1 KERNEL32.DLL
        • 2.2 GDI32.DLL
        • 2.3 USER32.DLL
        • 2.4 COMCTL32.DLL
        • 2.5 COMDLG32.DLL
        • 2.6 WS2_32.DLL
        • 2.7 ADVAPI32.DLL
        • 2.8 NETAPI32.DLL
        • 2.9 OLE32.DLL
      • 3. 其他API
        • 3.1 SHSCRAP.DLL
        • 3.2 WINMM.DLL
        • 3.3 IMM32.DLL
      • 4. 运行时库
        • 4.1 MSVCRT.DLL,MSVCP*.DLL 和 CRTDLL.DLL
        • 4.2 其他运行时库
        • 4.3 .NET Framework库

Windows NT架构——Wiki

Windows NT的体系结构是由Microsoft生产和销售的一系列操作系统,是一种分层设计,由两个主要组件组成,即用户模式和内核模式。它是一种抢占式,可重入的操作系统,旨在与基于单处理器和对称多处理器(SMP)的计算机配合使用。为了处理输入/输出(I / O)请求,它们使用数据包驱动的I / O,它利用I / O请求数据包(IRP)和异步I / O.从Windows XP开始,微软开始提供64位版本的Windows;在此之前,这些操作系统仅存在于32位版本中。

用户模式下的程序和子系统在访问哪些系统资源方面受到限制,而内核模式对系统内存和外部设备的访问权限不受限制。 Windows NT中的内核模式可以完全访问计算机的硬件和系统资源。 Windows NT内核称为混合内核。该体系结构包括一个简单的内核,硬件抽象层(HAL),驱动程序和一系列服务(统称为Executive),它们都存在于内核模式中。[1]

Windows NT中的用户模式由能够通过I / O管理器将I / O请求传递到适当的内核模式设备驱动程序的子系统组成。 Windows NT的用户模式层由“环境子系统”组成,它运行为许多不同类型的操作系统编写的应用程序,以及“集成子系统”,它代表环境子系统操作系统特定的功能。内核模式阻止用户模式服务和应用程序访问他们无法访问的操作系统的关键区域。

Executive接口与所有用户模式子系统一起处理I / O,对象管理,安全性和进程管理。内核位于硬件抽象层和执行程序之间,以提供多处理器同步,线程和中断调度和调度,以及陷阱处理和异常调度。内核还负责在启动时初始化设备驱动程序。内核模式驱动程序分为三个级别:最高级驱动程序,中级驱动程序和低级驱动程序。 Windows驱动程序模型(WDM)存在于中间层,主要设计为Windows 98和Windows 2000之间的二进制和源兼容。最低级驱动程序是直接控制设备的旧版Windows NT设备驱动程序,或者可以是插件和播放(PnP)硬件总线。

Windows API——Wiki

Windows操作系统应用程序接口(Windows API),是微软对于Windows操作系统中可用的核心应用程序编程接口的称法。它被设计为各种语言的程序调用,也是应用软件与Windows系统最直接的交互方式。大多数驱动程序需要对Windows系统更底层次访问接口,由所用版本的Windows的 Native API 来提供接口。

Windows有一个软件开发包(SDK, software development kit)提供相应的文档和工具,以使程序员开发使用Windows API的软件和利用Windows技术。

Window API分类

类别 说明 DLL
基础服务(Base Services) Windows系统可用的基础资源的访问接口。
比如:文件系统(file system)、外部设备(device)、,进程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)
16位kernel.exe、krnl286.exe或krnl386.exe
32位kernel32.dll和advapi32.dll
图形设备接口(GDI) 输出图形内容到显示器、打印机以及其他外部输出设备。 16位gdi.exe
32位gdi32.dll
图形化用户界面(GUI) 创建和管理屏幕和大多数基本控件(control)。
比如按钮和滚动条。接收鼠标和键盘输入,以及其他与GUI有关的功能
16位user.exe
32位user32.dll
Windows XP之后分割出comctl32.dll中
通用对话框链接库(Common Dialog Box Library) 为应用程序提供标准对话框。
比如打开/保存文件对话框、颜色对话框和字体对话框等等
16位commdlg.dll
32位comdlg32.dll
通用控件链接库(Common Control Library) 为应用程序提供接口来访问操作系统提供的一些高级控件。
比如:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)
16位commctrl.dll
32位comctl32.dll
Windows Shell 16位shell.dll
32位shell32.dll
网络服务(Network Services) 为访问操作系统提供的多种网络功能提供接口 包括NetBIOS、Winsock、NetDDE及RPC等

微软Windows库文件——Wiki

Microsoft Windows操作系统支持一种称为“动态链接库”的共享库形式,这些库是可由多个进程使用的代码库,而只有一个副本被加载到内存中。本文概述了每个现代Windows安装中包含的核心库,在此基础上构建了大多数Windows应用程序。

1. 内部组件

HAL.DLL是一个内核模式库文件,它不能被任何用户模式程序使用。

NTDLL.DLL仅供某些程序使用,但它是程序使用的大多数Win32库的依赖项。

1.1 HAL.DLL(未明确翻译)

Windows硬件抽象层(HAL)在Hal.dll中实现。HAL的许多功能由不同硬件平台以不同方式实现,这种情况下的这些功能主要指芯片组功能。这样,操作系统中的其他组件可以在所有平台上以相同的方式调用这些功能,而不考虑实际实现。

例如,在具有高级可编程中断控制器(APIC)的机器上响应中断与在没有高级可编程中断控制器的机器上的响应完全不同。 HAL为此提供了单一功能,可以通过各种芯片组处理各种中断,因此其他组件无需关注差异。

HAL被加载到内核地址空间并以内核模式运行,因此HAL中的例程不能由应用程序直接调用,并且没有用户模式API直接对应于HAL例程。相反,HAL主要为Windows执行程序和内核以及内核模式设备驱动程序提供服务。虽然大多数硬件的驱动程序都包含在其他文件中,通常是文件类型.sys,但是一些核心驱动程序被编译成Hal.dll。

PCI和PCI Express等总线上设备的内核模式设备驱动程序直接调用HAL中的例程来访问其设备的I / O端口和寄存器。驱动程序使用HAL例程,因为不同的平台可能需要这些操作的不同实现。 HAL为每个平台适当地实现操作,因此可以在使用相同CPU架构的所有平台上使用相同的驱动程序可执行文件,并且驱动程序源文件可以在所有体系结构中移植。

在x86系统上,安装介质上有几个不同的HAL文件。 Windows安装过程确定哪些适合当前平台并将其复制到硬盘驱动器,必要时将其重命名为Hal.dll。此选择的标准包括:存在ACPI兼容的BIOS,是否存在APIC,以及是否存在和启用多个处理器。 (多核CPU的多核,甚至是超线程CPU实现的“逻辑处理器”,都为此目的而算作“处理器”。)在x86-64和Itanium平台上只有一个可能的Hal.dll对于每个CPU架构。

1.2 NTDLL.DLL

NTDLL.DLL导出Windows Native API。Native API是操作系统的用户模式组件使用的接口,其必须在没有Win32或其他API子系统支持的情况下运行。Native API大多是在NTDLL.DLL和ntoskrnl.exe(及其变体)的上边缘实现的,并且这些库中的大多数导出API的标识符都是 Nt 前缀,例如NtDisplayString。Native API还用于实现KERNEL32.DLL导出的许多内核API(Kernel APIs)或基础API(Base APIs)。绝大多数Windows应用程序不直接调用NTDLL.DLL。

直接链接到NTDLL的应用程序被认为使用了本机子系统(native subsystem),这类程序存在的目的是在Win32子系统可用之前执行必须在系统启动序列的早期运行的任务。比如创建Win32子系统的进程csrss.exe。在csrss.exe进程运行之前,不会创建任何Win32进程,因此创建它的进程(Smss.exe,“会话管理器”)必须使用本机子系统。 csrss.exe本身就是这样一个应用程序。

尽管具有“.exe”文件扩展名,但用户(或Win32或其他子系统中的任何程序)都无法执行本机应用程序(上述)。一个例子是在系统初始化“蓝屏”期间运行chkdsk的autochk.exe二进制文件。其他突出的例子是实现各种子系统的服务,例如csrss.exe。

与Win32应用程序不同,本机应用程序在内核运行时代码(ntoskrnl.exe)中进行实例化,因此它们必须具有不同的入口点(NtProcessStartup,而不是Win32应用程序中的 (w)(Win)MainCRTStartup),通过指向内存结构的指针获取命令行参数,使用Rtl heap API管理它们自己的内存(Win32 heap API只是包装器 - 没有真正的区别)并通过调用 NtTerminateProcess 返回执行(与ExitProcess相反)。与Native应用程序链接的公共库是nt.lib,它包含Native应用程序的启动代码,类似于C运行时为Win32应用程序提供启动代码。

虽然大多数API都没有文档,但可以使用Windows驱动程序开发工具包(Windows DDK)构建本机应用程序;许多防病毒软件和其他实用程序软件供应商在其产品中包含本机应用程序,通常用于执行无法在用户空间执行的某些启动时任务。

2. Win32 API

本节中的库Win32 API中不同子集的实现。

2.1 KERNEL32.DLL

KERNEL32.DLL向应用程序公开大多数Win32基本API,例如内存管理,输入/输出(I/O)操作,进程和线程创建以及同步功能。其中许多都是在KERNEL32.DLL中通过调用NTDLL.DLL公开的native API中的相应函数来实现的。

2.2 GDI32.DLL

GDI32.DLL导出图形设备接口(GDI)函数,这些函数执行原始绘图功能以输出到视频显示器和打印机。例如,它用于XP版本的Paint。应用程序直接调用GDI函数来执行低级绘图(线,矩形,椭圆),文本输出,字体管理和类似的功能。

最初,GDI支持16和256色EGA/VGA显卡和单色打印机。多年来,该功能得到了扩展,现在包括对TrueType字体,alpha通道和多个监视器等内容的支持。

2.3 USER32.DLL

USER32.DLL实现了Windows USER组件,该组件用于创建和操作Windows用户界面的标准元素,例如桌面、窗口和菜单。因此,它使程序能够实现与Windows外观相匹配的图形用户界面(GUI)。程序调用Windows USER中函数来执行操作,例如创建和管理窗口,接收窗口消息(主要是用户输入,如鼠标和键盘事件,还包括来自操作系统的通知),在窗口中显示文本以及显示消息框。

USER32.DLL中的许多函数调用GDI32.DLL导出的GDI函数来实际呈现用户界面的各种元素。某些类型的程序还将在通过USER32函数创建的窗口中,直接调用GDI函数来执行较低级别的绘图操作。

2.4 COMCTL32.DLL

COMCTL32.DLL实现了各种标准Windows控件,例如“文件打开”,“保存”和“另存为”对话框,进度条和列表视图。它调用USER32.DLL和GDI32.DLL中的函数来创建和管理这些UI元素的窗口,在其中放置各种图形元素,以及收集用户输入。

2.5 COMDLG32.DLL

COMDLG32.DLL是通用对话框库,它实现了各种Windows对话框,旨在执行Microsoft认为是“常见应用程序任务”的操作。从Windows Vista发布开始,Microsoft将此库提供的“打开”和“另存为”对话框视为弃用状态,并替换为“Common Item Dialog API”。

2.6 WS2_32.DLL

WS2_32.DLL实现了Winsock API,它提供TCP/IP网络功能,并部分的破碎的与其他网络API(network APIs)的兼容性。 wsock.dll和wsock32.dll是Win3.11和Win95兼容性的旧版本。

2.7 ADVAPI32.DLL

ADVAPI32.DLL提供用于操作Windows注册表的安全调用和函数。

2.8 NETAPI32.DLL

NETAPI32.DLL提供查询和管理网络接口的功能。

2.9 OLE32.DLL

OLE32.DLL提供组件对象模型,以及对象链接和嵌入。

3. 其他API

3.1 SHSCRAP.DLL

SHSCRAP.DLL是对象链接和嵌入(OLE)机制的一部分。它实现了对shell碎片文件的支持,当您将选定的内容从支持OLE的应用程序拖动到资源管理器窗口或桌面时,会自动创建它们,但您也可以使用对象打包程序来创建它们。然后可以将它们拖到另一个支持OLE的应用程序中。

此功能已从Windows Vista(以及更高版本)中删除,以提高安全性并消除操作系统通常未使用的功能。报废(.shs)文件已被病毒使用,因为它们可以包含各种文件(包括可执行代码),即使禁用“隐藏已知文件类型的文件扩展名”,也不会显示文件扩展名。通过从Windows XP系统复制注册表项和DLL,可以恢复该功能。

3.2 WINMM.DLL

WINMM.DLL提供对原始WinMM音频访问的API。

3.3 IMM32.DLL

IMM32负责调用输入法编辑器并与之交互。

4. 运行时库

4.1 MSVCRT.DLL,MSVCP*.DLL 和 CRTDLL.DLL

MSVCRT.DLL是Visual C++(MSVC)编译器4.2到6.0版本的C标准库。它提供了编译这些版本的MSVC的程序需要的大多数标准C库函数。包括字符串操作,内存分配,C风格的输入/输出调用等。MSVCP*.DLL是相应的C++库。

自Windows 95 OSR2起,它随Windows版本一起提供,供其他Windows组件使用;早期版本则是由CRTDLL.DLL库提供。在旧版本的Windows中,与MSVCRT.DLL链接的程序需要在System32文件夹中安装兼容的副本,但这会导致DLL Hell问题,因为许多安装程序无法在替换副本之前检查已安装的库的版本。

4.0之前的MSVC和7.0至13.0的MSVC对每个版本使用不同的DLL命名(MSVCR20.DLL,MSVCR70.DLL,MSVCR71.DLL,MSVCP110.DLL等)。应用程序需要安装适当的版本,并且Microsoft为此提供了Visual C++ Redistributable软件包,尽管Windows通常附带一个已安装的版本。

在14.0版本中,大多数C/C++运行时库被移动到新的DLL UCRTBASE.DLL 中。但是,使用UCRTBASE.DLL的C/C++程序被强制链接到另一个新的DLL VCRuntime,其名称随着MSVC版本变化(例如VCRUNTIME140.DLL)而不断变化。

运行时库的源代码包含在Visual C++中以供参考和调试(例如,C:\Program Files\Microsoft Visual Studio 11.0\VC\crt\src )。

此运行时库供Visual C++和其他一些编译器(例如MinGW)编写的程序使用。有些编译器有自己的运行时库。

4.2 其他运行时库

DLL 说明
ATL*.DLL 活动模板库
MFC*.DLL Microsoft基础类
MSVBVM60.DLL Visual Basic 6.0虚拟机(Visual Basic.NET程序需要.NET Framework)
VCOMP*.DLL Microsoft OpenMP运行时
VCRUNTIME*.DLL Microsoft VCRuntime,适用于MSVC 14.0+
MSVCIRT.DLL Microsoft C++库,包含来自的已弃用的C ++类(注意文件扩展名),用于MS C 9和10(MSVC 2.x,4.x)(当时的草案C++标准库已集成在MSVCRT.DLL中。它与Visual C ++ 5.0版本分开)

4.3 .NET Framework库

用C#,Visual Basic.NET,C++/CLI和其他.NET语言编写的程序需要.NET Framework。它有许多库(其中一个是mscorlib.dll - 多语言标准公共对象运行时库,以前的Microsoft公共对象运行时库)和所谓的程序集(例如System.Windows.Forms.dll)。

你可能感兴趣的:(Windows NT架构相关资料)