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
相关产品推荐
相关产品推荐

