谈谈Windows程序中的字符编码

谈谈Windows程序中的字符编码,第1张

谈谈Windows程序中的字符编码,第2张

之所以写这篇文章,是因为我们在使用和安装Windows程序时,有时会看到名为“2052”和“1033”的文件夹。这些数字看似与字符集有关,但具体是什么意思呢?
在研究这个问题的同时,我们还会遇到其他问题。我们将讨论Windows的内部架构、Win32 API的A/W函数、区域设置、ANSI代码页、与字符编码相关的编译参数、MBCS和Unicode程序、资源和乱码等。,以琐碎的细节为主要部分,以乐趣为偶尔的点缀,走完这段旅程。

0其中是Win32 API


Windows程序有用户模式和核心模式。32位地址室空中,用户状态在0x8000000以下,内核状态在0x8000000以上。所有硬件管理都处于核心状态。用户程序不能在核心状态下直接使用任何代码。所谓的核心状态,其实只是CPU的一种保护模式。在x86 CPU上,用户状态在环3,核心状态在环0。

从用户模式进入内核模式最常见的方法是在寄存器eax中填充一个功能代码,然后执行int 2e。这有点像DOS时代的DOS和BIOS系统调用。这种机制在NT架构中被称为系统服务。

在核心态提供系统服务的有两个家伙:ntoskrnl.exe和win32k . sys Ntoskrnl.exe是Windows的大脑,它的上层叫Executive,下层叫Kernel。Win32k.sys提供与显示相关的系统服务。

在用户端,有一个重要的角色叫做ntdll.dll,它调用大多数系统服务。它封装了这些系统服务,然后提供了一个API接口。这个接口叫做原生API。native API的用户是子系统,包括Win32子系统、OS/2子系统和POSIX子系统。每个子系统为Win32、OS2和POSIX程序提供一个运行平台。

由于ntdll.dll提供了平台无关的API接口,被视为nt系统的原生接口,由此得到“原生API”的绰号。实际上,它的主要工作是将调用转移到内核状态。

Win32,OS/2,POSIX,听起来很庞大。其实只有Win32子系统才是真正好的。2.POSIX是控制台UI,也就是只有字符界面。提供OS/2子系统只是因为在1988年,NT的主要设计目标是与OS/2兼容。后来因为Windows 3.0卖得好,所以设计目标改为兼容Windows。提供POSIX子系统是为了应对美国政府编号为FIPS 151-2的标准。

Win32子系统的管理员是一个叫csrss.exe的兄弟,全名是:客户机/服务器运行时子系统。刚上任的时候应该是负责所有子系统的,但后来POSIX和OS/2分开处理,所以只管Win32。即使这很棒,Win32程序的所有进程和线程都必须向它注册。

然而,Win32子系统的dll是使用最广泛的程序,核心dll包括kernel32.dll、User32.dll、Gdi32.dll和Advapi32.dll。这些dll包装了ntdll.dll的本机API。其中,Gdi32.dll是特殊的。它与核心状态win32k.sys保持联系,提高NT系统的图形处理能力。Win32子系统的dll提供的接口函数在MSDN文档中有详细描述,该文档是Win32 API。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 谈谈Windows程序中的字符编码

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情