翻译《The Old New Thing》- 为什么 SHFormatDateTime 要接收一个未对齐的 FILETIME?

Why does SHFormatDateTime take an unaligned FILETIME? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20251103-00/?p=111753


我之前曾提到,Windows 要求指针必须对齐,除非显式允许未对齐。我举了一个显式允许未对齐指针的函数例子,那就是 SHFormatDateTime

复制代码
LWSTDAPI_(int)
    SHFormatDateTimeA(
        _In_ const FILETIME UNALIGNED * pft,
        _Inout_opt_ DWORD * pdwFlags,
        _Out_writes_(cchBuf) LPSTR pszBuf,
        UINT cchBuf);

为什么这个函数要大费周章地允许未对齐的 FILETIME 呢?

SHFormatDateTime 最初是为 Explorer 编写的,用于在详细信息视图和属性表中格式化日期和时间。而这些 FILETIME 结构的常见来源是嵌入在 Shell 项 ID 列表中------通常称为 "pidls"(发音类似 "riddles"),因为它的匈牙利命名法是 pidl,即「指向 ID 列表的指针」。

Shell 项 ID 列表只要求字节对齐,因此你嵌入其中的任何结构都将是未对齐的。SHFormatDateTime 为了迎合其主要用户群体,不惜委曲求全,允许传入未对齐的 FILETIME 结构。(它 presumably 只是将其拷贝到一个已对齐的局部变量中。)

我怀疑 SHFormatDateTime 函数最初是为 Windows 95 系列编写的,该系列运行在 x86 架构处理器上,而 x86 处理器对未对齐访问很宽容。当 Windows NT 团队将代码移植到对对齐敏感的 RISC 处理器时,他们厌倦了逐个修复调用点来将未对齐的 FILETIME 拷贝到已对齐的局部变量,于是他们干脆让 SHFormatDateTime 函数本身容忍未对齐,把拷贝未对齐 FILETIME 到局部变量这项工作转移到 SHFormatDateTime 函数内部来完成。

所以实际上,SHFormatDateTime 接受未对齐指针这件事,只是一个历史上的权宜之计,而非其原始设计的一部分。现如今,我们只会要求所有人在调用端对齐 FILETIME,而不是在接收端处理。


  • btw,欢迎关注我
  • @0x0007 ~ 😃
  • Windows|HarmonyOS|AIGC
相关推荐
端平入洛2 天前
delete又未完全delete
c++
端平入洛3 天前
auto有时不auto
c++
埃博拉酱4 天前
VS Code Remote SSH 连接 Windows 服务器卡在"下载 VS Code 服务器":prcdn DNS 解析失败的诊断与 BITS 断点续传
windows·ssh·visual studio code
唐宋元明清21884 天前
.NET 本地Db数据库-技术方案选型
windows·c#
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
哇哈哈20214 天前
信号量和信号
linux·c++
多恩Stone4 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
tryCbest4 天前
Windows环境下配置pip镜像源
windows·pip
呉師傅4 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
百事牛科技4 天前
保护文档安全:PDF限制功能详解与实操
windows·pdf