如何使用ESE CPP apis从ESE数据库文件中读取字符串值?

时间:2015-02-17 09:19:12

标签: c++ computer-forensics extensible-storage-engine

我正在解析ESE数据库文件,即WebCacheV01.dat。这是IE 10开始存储所有浏览历史记录和其他信息的文件。我正在使用JET Blue CPP apis来解析这个文件。

我可以读取integer或long类型的任何列值,但不能读取string类型的列值。

例如我打开了" MSysObjects"表并希望检索" Name"的值柱。

以下是示例代码

 for( err = ::JetMove( sessionID, tableId, JET_MoveFirst, 0 );
        JET_errSuccess == err;
        err = ::JetMove( sessionID, tableId, JET_MoveNext, 0 ) )
    {
        JET_COLUMNID columnid = 12/*columnid of the Name column*/;
        char *pszBuff = new char[2048];
        if( pszBuff )
        {
            long lReadBytes;
             memset(pszBuff, 0, 2048);
             err = ::JetRetrieveColumn( sessionID,
               tableId,
                columnid,
                pszBuff,
                2047,
               &lReadBytes,
               0,
               NULL);
            delete[] pszBuff;
        }
    }

JetRetrieveColumn的返回值是-1507,这只是JET_errColumnNotFound。我已经使用ESEDatabaseViewer工具验证了MSysObjects表包含25列。这意味着columnd 18无效。

如果有人知道如何从ESE数据库中检索字符串值,请告诉我。

提前感谢你。

1 个答案:

答案 0 :(得分:2)

花了差不多两天后,我终于想出了如何从ESE数据库表中正确读取值。我认为columnid是顺序的,因此我通过计算" ESEDatabaseView"中的特定列位置来确定columnid。工具。

但它不是那样的。获取columnid的正确方法是通过指定列的名称来调用JetGetTableColumnInfo方法。获取columnid后,在JetRetrieveColumn方法中使用它来检索列值。

这是更正后的代码

for( err = ::JetMove( jetSessionId, jetContainersTableId, JET_MoveFirst, 0 );
    JET_errSuccess == err;
    err = ::JetMove( jetSessionId, jetContainersTableId, JET_MoveNext, 0 ) )
{
    unsigned long nReadBytes = 0;

    JET_COLUMNDEF colName;
    err = ::JetGetTableColumnInfoW(jetSessionId, jetContainersTableId, L"Name", (void *)&colName, sizeof(JET_COLUMNDEF), JET_ColInfo);

    wchar_t szName[MAX_PATH] = {0};
    if( JET_errSuccess == err )
    {
        err = ::JetRetrieveColumn(jetSessionId, jetContainersTableId, colName.columnid, szName, sizeof(szName) , &nReadBytes, 0, NULL);
    }
}

这可以帮助正在处理ESE数据库的人。