首页

为什么不能将FILETIME看做__int64  

我们先来看看FILETIME这个结构体,它通过组合两个DWORD来表示了一个64位的整数值。 你可能想将这个FILETIME结构体看做一个整体,然后将它们看做一个__int64结构来进行访问。 毕竟,这两个类型的内存布局都是一样的,下面是一些开发者写的代码,我们来看看: 上面的代码有什么错呢? 你答对啦:对齐。 因为这个FILETIME结构体包含两个DWORD部分,所以它只需要4个字节的对齐,...

叨一叨注册表中的字符串类型值  

如果一个注册表表项的值类型为REG_SZ,请注意了,它并不意味着这个字符串一定会以一个空字符串结束。从底层实现的角度来说,注册表仅仅是一个层次化组织的名值数据库而已。 所以,你可以使用一些小技巧来”欺骗”注册表。 很多人都会欺骗注册表。你会发现有很多本应该被设置为REG_DWORD的值被存储成了一个4个字节的REG_BINARY。(这部分是 Windows 95 注册表的保...

说说有点意思的STRRET结构体

如果你曾经折腾过外壳命名空间(shell namespace),则我想你一定碰到过古怪的STRRET结构体。 这个结构体是IShellFolder::GetDisplayNameOf用来返回一些列外壳项目名称的。 如果你阅读文档就可以知道,一个STRRET结构有时候是一个ANSI字符串的缓冲区,有时候它又是一个指向UNICODE字符串的指针,有时候(这个时候是最奇怪的情况)它会是一个指向一个pid...

误解:如果你想使用AWE,则必须先启用PAE

我们先来看看AWE的一个官方解释,看看它到底是什么样一个玩意儿: 地址窗口扩展 (AWE) 是一组扩展,允许应用程序快速操作大于4GB的物理内存。某些数据密集型应用程序,例如数据库管理系统和科学与工程软件,需要访问非常大的数据缓存。 在非常大的数据集的情况下,限制缓存以适应应用程序的2GB用户地址空间是一个严格的限制。在这些情况下,缓存太小而无法正确支持应用程序。 AWE通过允许应用程序在继续使用...

如何编写你自己的类菜单窗口

如果你是一位不走寻常路的人(我知道你一定是),想编写类似菜单那样的窗口,则先不用自己折腾,可以到我们的Platform SDK中找到关于“FakeMenu”的例子代码,参考一下。 这个例子代码位于SDK目录下的”winui\shell\fakemenu”目录中。对于那些没有Platform SDK的人,我想问问你:你在没有 Platform SDK的情况下编写Win32程序...

简单说说PAE和NX之间的奇妙互动

Carmen Crincoli在他自己的博客中介绍了PAE和NX之间的交互,所以今天的内容不是很多,我只是简单地引用他的文章中的一些内容。 这又是一次后兼容性的让步。 如果没有向后兼容工作,XP SP2 将附带NX支持,但是会加上下面这段星号文字: “* 那些不支持PAE的设备驱动程序将无法利用这些新的安全增强功能。我们本可以做一些事情来确保您的系统安全,但我们决定不这样做是为了给您一...

PAE真的能提升虚拟地址空间吗

实际上,这是另一个不符合逻辑的推断。 PAE(Physical Address Extensions,物理内存扩展)主要是用来提升处理器能够寻址的物理内存,和虚拟内存没有关系。在一台搭配了奔腾2处理器的32位系统上,使用PAE,可以使处理器能够从32位寻址提升到36位,也就是说理论上最大的物理内存可达64GB。 但是,指针类型的长度还是32位的,没有发生任何改变(对于一个32系统的处理器来说),这...

为什么32位系统上虚拟地址空间是4GB

在一台32位系统上,虚拟地址空间为4GB,这个大小由系统上指针的可用数量决定。 对于一块32位的处理器,一个32位值可以表达232个不同的数值,如果你将每一个数值都指向不同的内存地址,则你就得到了一个232个字节的地址空间,也就是4GB。 如果你愿意放弃平坦内存模型(flat memory model)并使用选择器(selectors),那么你可以将16 位选择器值与32位偏移量组合为一个48位的...

/3GB开关并不能映射一个3GB大小的内存

如果你使用了/3GB,则你得到一个3GB的虚拟地址空间,但这并不意味着你可以映射一个3GB大小的内存块。在这个地址空间中会有一些标准的”空洞”,例如:位于地址空间底部的64KB,以及位于2GB边界的64KB。 而且,系统DLL会继续在它所希望的内存地址加载,这些内存地址通常为于地址空间中的2GB边界下方,另外,进程堆和其他典型的进程结构记录信息也会占用你的虚拟地址空间。结果...

Visual Studio静态分析组件更新一览  

咱们C++静态分析团队的一个主要目标就是:让广大的C++开发者编写尽可能安全的代码。 一直以来,我们一直在持续地向静态分析组件中添加新的安全代码检查并处理开发者报告的各种Bug。感谢你们。 下面我汇总了所有从Visual Studio 2019 v16.10 到 v16.11之间所有的Bug修复。请注意,16.11版本Visual Studio最后的non-servicing发布版本,也就是说,我...