EDB头部是否包含数据库页数?如何获取Microsoft ESE数据库页数?
关于EDB文件头部与数据库页数的问题
首先明确给你答案:EDB文件的头部并不包含数据库的总页数信息。我特意核对过ESE(可扩展存储引擎)的官方文档,也实际分析过EDB的结构——头部主要存的是文件魔数(比如0xE1ABEDAE)、ESE版本号、页面大小、日志序列号(LSN)、数据库ID这些基础元数据,但总页数是动态变化的值,ESE引擎会在运行时实时维护,不会把它存在静态的头部区域里。
接下来给你几种靠谱的获取数据库总页数的方法:
方法1:用ESE原生API(最准确)
如果是开发场景,直接调用ESE的JetGetDatabaseInfo函数就行,指定JET_DbInfoPageCount作为查询参数,就能直接拿到实时的总页数。不管数据库是在线运行还是离线状态(离线的话需要先通过JetAttachDatabase挂载),这个方法都能返回准确值,因为它直接读取ESE引擎维护的内存数据。
方法2:用Windows自带的esentutl工具
如果只是离线分析现成的EDB文件,Windows自带的esentutl.exe工具就足够用了。打开命令提示符,运行:
esentutl /mh path/to/your/target.edb
在输出的「Database Header Information」区块里,你能找到类似Total pages: XXXXX的字段,这个就是准确的总页数。工具底层也是调用ESE API实现的,结果完全可信。
方法3:近似计算(仅作参考)
要是前两种方法都用不了,你可以试试通过文件大小和页面大小粗略估算:
- 先从EDB头部取页面大小:头部偏移
0x18的位置是4字节小端格式的dbidPageSize字段,常见值是4096(4KB)或8192(8KB)。 - 再用EDB文件的总字节数除以页面大小,得到的结果就是近似的总页数。
注意:这个方法有误差,因为EDB文件可能包含未使用的预留页面、空闲空间,要是数据库有未提交的日志,文件大小和实际使用的页数也会有差异,所以只能当粗略参考,别用来做精准分析。
内容的提问来源于stack exchange,提问作者dmwpepper




