【问题标题】:How to read the string value from ESE database file using ESE CPP apis?如何使用 ESE CPP api 从 ESE 数据库文件中读取字符串值?
【发布时间】:2015-04-17 23:12:30
【问题描述】:

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

我可以读取任何整数或长整数类型的列值,但无法读取字符串类型的列值。

例如,我打开了“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 列。这意味着列 18 不是无效的。

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

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

    花了将近两天的时间,我终于想出了如何从 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 数据库工作的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多