翻译《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
相关推荐
小肝一下4 小时前
2. 顺序表和链表
c语言·数据结构·c++·链表·dijkstra·依蕾娜·香香的依蕾娜
王老师青少年编程4 小时前
csp信奥赛C++高频考点专项训练:【二分答案】案例5:进击的奶牛
c++·二分答案·csp·高频考点·信奥赛·进击的奶牛
旖-旎16 小时前
《LeetCode647 回文子串 || LeetCode 5 最长回文子串》
c++·算法·leetcode·动态规划·哈希算法
Darkwanderor17 小时前
对Linux的进程控制的研究
linux·运维·c++
云泽80817 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
REDcker18 小时前
libdatachannel 快速入门
c++·webrtc·datachannel
XUHUOJUN18 小时前
Windows 2025架构深度分析之Stretch Cluster 延迟工程现实
windows·microsoft·架构·azure local
love530love18 小时前
将 ChatCut MCP 插件从 Codex 桌面应用移植到 WorkBuddy —— 完整适配实录
ide·人工智能·windows·视频剪辑·ai agent
second6019 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
works cart19 小时前
windows常用命令
windows