先谢过了!

解决方案 »

  1.   

    转贴************************************
    这时第一次上站,以前基本没有关心过文件
    格式的问题。作过的练习与工作不过是:
    1)学习MFC时对对象串行化文件格式的练习
    2)有一次编程的时候费了傻功夫对Win NT
       事件日志文件的格式的认识
    作为第一篇纪念,我把2)中这一点点工作
    与大家汇报一下
    *************************************
    我的第二篇帖子是替研究所的一个合作伙伴
    发的,有关一种仪器上用的文件格式,真的
    希望大家能够指点一二。
    我和我的合作伙伴先谢谢大家了
    *************************************
    1. 事件日志文件是二进制文件,它有若干条记录单元组
        成,其中最前面的是记录头,最后面的是记录尾。
    2. 每条记录(包括记录头、记录尾)的头、尾的双字是
        这条记录的长度(单位:字节)。如记录头48个字节
        (0x30),记录就是
        30 00 00 00  4C 66 4C 65 ……    30 00 00 00
        注意这里是字节顺序:
        30   00        00     00
       W1L   W1H    W2L     W2H
    3.每条记录的第二个双字是特定的码 4C 66 4C 65
    4. 记录头的信息
     记录头48 个字节
    (举例) 
    0000h:  30 00 00 00 
            4C 66 4C 65
            01 00 00 00     (老是1,猜不出)
            01 00 00 00     (老是1,猜不出)
    0010h:  30 00 00 00     第一条记录的偏移量
            50 02 00 00    靠后一条记录的偏移量
                         <注意,不一定是最后一条>
            03 00 00 00    靠后一条记录的串号
            01 00 00 00    第一条记录的串号
    0020h:  78 02 00 00     事件日志文件的总长度
            00 00 00 00   (这个值变化,我猜不中)
            80 39 09 00   (老是这个数,猜不中)
            30 00 00 00
    5. 记录尾的信息
    记录尾40 个字节。
    (举例)
    (0250h)  28 00 00 00   28h=40
            11 11 11 11
            22 22 22 22
            33 33 33 33
    (0260h)  44 44 44 44   4个双字的标识
            30 00 00 00   第一条记录的偏移量
            50 02 00 00   记录尾自己的偏移量
                        (记录尾是最后一条“记录”)
            03 00 00 00   记录尾的串号
                        (本例中共2条正式记录,
                         记录尾的串号是3)
    (0270h) 01 00 00 00   第一条记录的串号
           28 00 00 00
    6. 记录文件是一个FIFO
    我所见到的最大的*.evt是80000h字节长
    现举例如下
     0000h  ┏━━━━━━━━━━━━━┓
            ┃文件头:                 ┃
            ┃  文件长:80000h         ┃
            ┃ 第一条记录:            ┃ 
            ┃      偏移 0006DDCEh     ┃
            ┃      串号 01ADh         ┃
            ┃  靠后一条记录:          ┃
            ┃     偏移 00012D80h      ┃
            ┃    串号 04C5h           ┃
            ┣━━━━━━━━━━━━━┫
     0030h  ┃ 记录 03BAh 长度 60h     ┃
            ┣━━━━━━━━━━━━━┫
            ┃                        ┃
            ┊                        ┊
    012D80h ┣━━━━━━━━━━━━━┫
            ┃ 记录 (串号) 04C5h       ┃
            ┣━━━━━━━━━━━━━┫
            ┊                        ┊
    013CC8h ┣━━━━━━━━━━━━━┫
            ┃ 记录尾 04CCh            ┃
            ┃    偏移  013CC8h        ┃ 
            ┃ 第一条记录:             ┃ 
            ┃      偏移 0006DDCEh     ┃
            ┃      串号 01ADh         ┃
            ┣━━━━━━━━━━━━━┫
            ┊  (一些以前记录的残余)   ┊
    06DDECh ┣━━━━━━━━━━━━━┫
            ┃ 记录  01ADh (最老一条)  ┃
            ┣━━━━━━━━━━━━━┫
            ┊                        ┊
    07FF38h ┣━━━━━━━━━━━━━┫
            ┃ 记录  03B9h 长度 98h    ┃
            ┣━━━━━━━━━━━━━┫
            ┃ 由于不够03BA的长度,用  ┃
            ┃ 000027h填充             ┃
            ┗━━━━━━━━━━━━━┛
    080000h7.使用中的记录文件与Event Viewer 中“另存为”得到文件的差异 
       在使用中*.evt总是64k的倍数,但如果是用Event Viewer另存就
       变成实际的长度。(从第一条记录到记录尾)
       如果试图先将当前的系统默认的*.evt拷贝下来,放在别的目录下
       再用Event Viewer打开,会报错。可见Event Viewer对%system 
       root%system32/config/*.evt是区别处理的。
    8.事件记录的结构
    (举例)
    0030h:   14 01 00 00    //记录长0114h字节
             4C 66 4C 65   
             01 00 00 00   //记录串号,本例是第1号
             F7 D8 56 3A   
    0040h    F7 D8 56 3A   //时间代码
                           //时间代码以秒作单位,是一个
                           //二进制的偏移值。
                           //与系统的时间无关,推算
                           // 00000000应代表1970年左右。
             01 00 07 60    //标识特定消息的32位消息代码     ★
                           //请参 [1]Art Baker “Windows NT
                           // 设备驱动程序设计指南”机械
                           // 工业p235
                           //这个值可能与注册表注册的资
                           //源有关
                           //其中低字是“事件ID”,本例
                           //为 “1”。
            04 00 02 00     //其中——
                           //低字:
                           //决定Event Viewer中的“类型”
                           // 1 错误 (红灯)
                           // 2 警告 (叹号)
                           // 4 信息 (i) (如本例)
                           // 8 成功审核( 钥匙)
                           //10h 失败审核(锁)
                           // ……
                           //高字:(我没猜出来)
            00 00 00 00      //(没猜出来)
    0050h   00000000 72000000 00000000 00000000 (没猜出)
    0060h   28 00 00 00     //携带数据的长度,本例带数据40 字节=28h
                           //从★至此的长度为16个字节
            D8 00 00 00     //“来源”字符串、“描述字符”串
                           //和 数据(三者之和,不包括本双字)
                           //的长度。
    ……
           <以下是来源字符串,是UniCode 每个字符两个字节,
            以NULL(0000h)结束>
    ……
           <以下是描述字符串,是UniCode 每个字符两个字节,
            以NULL(0000h)结束>
    ……
          <0028h个数据>
    ……
          < 以“0000h”填充,直到达到总长,本例是0114h>
    0140h: 14 01 00 00     //记录长0x0114h字节