记事本.LOG 的秘密

Windows 自带的记事本(Notepad)是一个非常方便易用的文本编辑工具。虽然我从Window3.1开就使用这个软件,但是最近刚知道它有一个特别的功能:如果在文本开头写入  .LOG ,那么保存之后每次使用记事本打开这个文件都会自动添加当前的日期和时间。

这个功能是记事本代码实现的,在https://github.com/vxiiduu/NotepadEx 这个项目上可以看到(这个项目代码来自泄露的 Windows XP 代码)。在其中的 npfile.c 文件中可以看到检测 “.LOG”字样的代码:

       // null terminate it.  Safe even if nChars==0 because it is 1 TCHAR bigger
       *(lpch+nChars)= (TCHAR) 0;
   
       // Set 'fLog' if first characters in file are ".LOG"
       fLog= *lpch++ == TEXT('.') && *lpch++ == TEXT('L') &&
             *lpch++ == TEXT('O') && *lpch == TEXT('G');

之后,同样文件还有根据标志位进行动作的代码:

    /* If file starts with ".LOG" go to end and stamp date time */
    if (fLog)
    {
       SendMessage( hwndEdit, EM_SETSEL, (WPARAM)nChars, (LPARAM)nChars);
       SendMessage( hwndEdit, EM_SCROLLCARET, 0, 0);
       InsertDateTime(TRUE);
}

为了验证猜想,我对上述代码进行修改,判断条件之后除了增加时间再增加一段我自定义的字符串:

    /* If file starts with ".LOG" go to end and stamp date time */
    if (fLog)
    {
       SendMessage( hwndEdit, EM_SETSEL, (WPARAM)nChars, (LPARAM)nChars);
       SendMessage( hwndEdit, EM_SCROLLCARET, 0, 0);
       InsertDateTime(TRUE);
	   //LABZ_Debug_Start
	   TCHAR szMsg[] = TEXT("www.lab-z.com");
	   SendMessage(hwndEdit, EM_REPLACESEL, TRUE, (LPARAM)szMsg);
	   //LABZ_Debug_End
}

编译之后用生成的 EXE 打开 TEXT 文件,可以看到除了时间,还增加了我自定义的代码。

未修改的完整项目可以在这类下载(就是 Github 上的源代码):

工作的视频

https://www.bilibili.com/video/BV1Ym421H7zk