You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#调用NtQueryObject获取ObjectBasicInformation时CreationTime始终为0

问题原因及解决方案

核心原因

你获取的是设备对象(\\.\GlobalRoot\Device\Harddisk0\Partition2)的句柄,Windows内核中的设备对象类型默认不会维护CreationTime字段,因此该值始终为0,这并非代码实现错误。

验证与解决步骤

1. 验证代码正确性(切换到文件对象测试)

尝试打开一个普通文件(而非设备),比如C:\test.txt,此时获取的句柄对应文件对象,CreationTime字段会正常返回有效值:

using NativeFile file = new NativeFile(
    @"C:\test.txt",
    Kernel32Con.DesiredAccess.None,
    FileShare.ReadWrite,
    0,
    FileMode.Open,
    Kernel32Con.FlagsAndAttributes.None,
    0
);

// 后续调用NtQueryObject的逻辑保持不变

2. 结构体定义确认

你的ObjectBasicInformation结构体定义完全符合Windows原生结构(64位环境下):

  • 前12个uint字段共48字节,CreationTime作为ulong(对应原生LARGE_INTEGER类型)占8字节,总大小56字节,与计算值一致,无需调整。

3. 设备对象的时间获取替代方案

若你确实需要设备相关的时间信息,设备对象本身没有维护创建时间,但可以通过以下方式尝试获取硬件/驱动关联的时间(非内核对象创建时间):

  • 使用DeviceIoControl调用IOCTL_STORAGE_QUERY_PROPERTY查询存储设备属性,这类属性通常包含硬件出厂时间或驱动加载时间,但并非内核对象的创建时间。

内容的提问来源于stack exchange,提问作者gyucudu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:27:08