wenjiang 的个人资料morning's blog照片日志列表更多 工具 帮助

日志


9月25日

VC10.0 Beta1

比较VC8.0,VC9.0的不可靠的 /MP选项,在10.0 终于可以稳定使用了.
编译时 cl.exe会生成 2~3个进程,基本上把CPU的能量都发挥出来了.编译10几个库文件,节约的时间相当可观.
 
VCPKG5.3的代码在使用VC6的库文件和VC10.0的编译器情况下,一切OK.当然,那个 crt_ex.lib 是我写的小Patch lib,解决一些函数不存在的问题.
 
Deleting intermediate files and output files for project 'vcpkg - Win32 Unicode Release'.
--------------------Configuration: vcpkg - Win32 Unicode Release--------------------
Version: VCPKG 5.3(Unicode,Build:Sep 24 2009 16:55:45),Author: morning,EMail: ywjheart@gmail.com
Component: WDK/PSDK(CRT6.0,ATL7.1),PSDK2003Feb,DDK2K,WTL8.1,DXSDK9
vcpkg: info: Add Option: /wd4786
vcpkg: info: Add Option: /wd4127
vcpkg: info: Add Option: /wd4201
vcpkg: info: Add Option: /wd4660
vcpkg: info: Add Option: /wd4231
vcpkg: info: Add Option: /D DDKENV_BUILD=1
vcpkg: info: Add Option: /wd4786
vcpkg: info: Add Option: /wd4127
vcpkg: info: Add Option: /wd4201
vcpkg: info: Add Option: /wd4660
vcpkg: info: Add Option: /wd4231
vcpkg: info: Add Option: /D DDKENV_BUILD=1
vcpkg: info: Add Option: /RELEASE
vcpkg: info: Add Option: /OPT:REF
vcpkg: info: Add Option: /OPT:ICF
vcpkg: info: Add Option: /ALIGN:512
vcpkg: info: Add Option: /FILEALIGN:512
vcpkg: info: Add Option: /ignore:4010,4037,4039,4065,4070,4078,4087,4089,4099,4221,4210,4108
vcpkg: info: Delete Option: /pdb:none
vcpkg: info: Add Library: crt_ex.lib
Compiler: WDK(32bit)
Compiling resources...
Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
Copyright (C) Microsoft Corporation.  All rights reserved.
Compiling...
stdafx.cpp
Automatically linking with libbasesuwdk.lib
Automatically linking with libhooksuwdk.lib
Automatically linking with libassuwdk.lib
Compiling...
AddonHook.cpp
BuildHook.cpp
CmdAnalyst.cpp
compiler.cpp
helpex.cpp
msdev_patch.cpp
util.cpp
vcpkg.cpp
ComHook.cpp
ProcessExitMon.cpp
RegMon.cpp
varmgr.cpp
Generating Code...
Linking...
   Creating library R:\TEMP\Unicode_Release/!vcpkg.lib and object R:\TEMP\Unicode_Release/!vcpkg.exp
!vcpkg.pkg - 0 error(s), 0 warning(s) 
9月24日

manifest 终于死翘翘了,哈哈

VC10.0将不再需要无聊的manifest(SXS),显然它带来的好处不如坏处多,经过5年的折腾,微软终于放弃了,nice.
9月21日

vcpkg 5.3

相信很多人都和我一样,正在使用最新的PSDK/MSDN了,但是VC6并不能支持F1键直接查询这些新版帮助的中的信息.
 
vcpkg5.3 添加一个老版本有的功能,但是这个更强大.
老版本
原理:
采用COM虚函数表覆盖的办法拦截了 对帮助的调用,
功能:
实现 可选的使用VS .net 的帮助,用户可以自定义ms-help 命名空间.
不足:
它依赖于 VC6对应的VSHelp.dll的接口.调用新帮助库时,使用COM接口.
配置方式:
<ExHelp enable="0" url="ms-help://MS.MSDNQTR.v90.chs" />
 
新版:
原理:
不再需要VSHelp.dll,vcpkg自身包含了相关接口(是的,喜欢清爽的朋友可以立刻去把它删了,哈哈),VC6 IDE调用帮助接口时自动调用VCpkg提供的接口.
由于老版本需要额外的创建新帮助库的实例,需要耗费额外的时间,而这个新版则相对简洁,直接打开用户指定程序.
功能:
实现可选的使用任何帮助,用户可以指定执行文件和参数,根据喜好,可以配置成调用本地的MSDN帮助库,也可以打开网页查询MSDN网站,甚至可以打开网页查询google.com
配置方式:
 <ExHelp enable="1" exe="some.exe" url="someurl"/> ,其中 url 部分可包含 $(keyword),调用时会展开成当前需要查询的关键字
例如:
 <ExHelp enable="1" exe="D:\tools\MSHelp2\H2Viewer\H2Viewer.exe" url="/appID vchelp /XNav /PageTab 2 /helpcol MS.MSDNQTR.v90.chs /filterquery /index &quot;$(keyword)&quot;" />
 
无论新老版本,当 enable=0时,不改变VC6的行为,执行默认的帮助调用.
9月18日

Using the Optimizing VC7 compiler with the VC6 IDE,with DEBUGGING

Using the Optimizing VC7 compiler with the VC6 IDE,with DEBUGGING

2009.09.18
By: morning.ye
you may contact him at: ywjheart ## gmail.com (replace ## to @)

from the source of atl/mfc in vc7x series,wo can see something interesting,that vc7 is able to output pdb files in the format used in vc6,the options is as following:
cl.exe:  /Zvc6
link.exe: /debugtype:vc6

however,vc7 toolset refuse the options if we add to commandline.
They lie to us,in fact,after debugging,we know M$ close the interface in commandline,but leave the functions in binaries.
OK,let's patch the toolset,in order to reenable the capability we need.

prepares:
1.install vc2003toolkit(any vc2003 edition is ok,and psdk/ddk 2003 also has these files),i'll use the toolset unpack from vc2003sp1,it's the lastest version.
copy the following files to C:\Program Files\Microsoft Visual Studio\VC98\bin\,don't forget to backup files from vc6!
msobj71.dll
c1.dll
c1xx.dll
c2.dll
cl.exe
link.exe
2. take a copy of the mspdb60.dll from PSDK/DDK2003,its version should equal to 6.2
3. hex editor

start patch:
1.1 modify the compiler front end
c1.dll in offset 78a11,change 0 to 1;
c1xx.dll in offset 18D3B1,change 0 to 1;
1.2 modify the compiler back end
c2.dll in offset 744C,change 1D to 3D;

2. modify the linker
link.exe
from 2a4dc to 2a4e7
original:  8A 98 60 01 00 00 84 DB
after patch: B3 01 88 98 60 01 00 00


3.open c1.dll,c1xx.dll,c2.dll,cl.exe,link.exe in a hex editor
replace all string "mspdb71.dll" to "mspdb60.dll"

4.in link.exe,search the string ?Open@PDB@@SAHPBD0KPAJQADPAPAU1@@Z ,and change it to ?Open@PDB@@SAHPAD0KPAJQADPAPAU1@@Z

5.copy the mspdb60.dll v6.2 to bin folder.

all done.now you can new a console project, and build the debug configuration,open the output file in a hex editor,you can find the  signature of  the old pdb format,"NB10",set a break in the function "main",and press F5, after break,you can see variables,callstack,and etc.


 

【原创】让VC7系列生成VC6支持PDB格式,以便VC6IDE可以调试

让VC7系列生成VC6支持PDB格式,以便VC6IDE可以调试
morning.ye 2009-9-18

我们知道 阅读VC7系列的 atl/mfc 源代码可以看到,VC7似乎具备生成 vc6 pdb文件的能力,其中参数分别是
cl.exe:  /Zvc6
link.exe: /debugtype:vc6

但是,很遗憾,如果我们把这个参数加上,它们纷纷表示,不认识.
当然,到底是否支持,调试一下才知道,通过分析,发现只是前端接口关掉了,不接受这些参数,但是内部实现确实支持的.
OK,patch它们.

准备工作:
拷贝一份vc2002/2003bin目录到vc6bin目录,把vc6的改名,vc2003toolkit也可以
从PSDK/DDK2003等地方拷贝 PDB60.dll,版本号应该是6.2

开始修改
1.修改编译前端
分别用od加载c1.dll,c2.dll,搜索字符串 pdb60.dll,在前方不远处有一个比较,记下这个全局变量的地址,在 LoadPE里转成 offset,并将原来的0改成1
c1.dll 在偏移10678a11处,将原来的0改成1
c1xx.dll 在偏移1058D3B1处,将原来的0改成1

2.修改连接器
link.exe
0042A4DC      8A98 60010000 mov     bl, byte ptr [eax+160]
0042A4E2      84DB          test    bl, bl
0042A4E4  |.  56            push    esi
0042A4E5  |.  57            push    edi
0042A4E6      74 0B         je      short link.0042A4F3
0042A4E8  |.  BF AC3C4000   mov     edi, link.00403CAC                   ;  mspdb60.dll
0042A4ED  |.  897C24 0C     mov     dword ptr [esp+C], edi
0042A4F1  |.  EB 0C         jmp     short link.0042A4FF
0042A4F3  |>  C74424 0C A03>mov     dword ptr [esp+C], link.00403CA0     ;  mspdb71.dll
0042A4FB  |.  8B7C24 0C     mov     edi, dword ptr [esp+C]
0042A4FF  |>  57            push    edi                                  ; /FileName
0042A500  |.  FF15 A4104000 call    dword ptr [<&KERNEL32.LoadLibraryA>] ; \LoadLibraryA

改成
0042A4DC      B3 01         mov     bl, 1              //把原来的判断改成赋值
0042A4DE      8898 60010000 mov     byte ptr [eax+160], bl      //
0042A4E4  |.  56            push    esi
0042A4E5  |.  57            push    edi
0042A4E6      90            nop                    //不再跳转,其实跳转也没关系,因为后面我们会替换这个名字
0042A4E7      90            nop
0042A4E8  |.  BF AC3C4000   mov     edi, link.00403CAC                         ;  mspdb60.dll
0042A4ED  |.  897C24 0C     mov     dword ptr [esp+C], edi
0042A4F1  |.  EB 0C         jmp     short link.0042A4FF
0042A4F3  |>  C74424 0C A03>mov     dword ptr [esp+C], link.00403CA0           ;  mspdb71.dll
0042A4FB  |.  8B7C24 0C     mov     edi, dword ptr [esp+C]
0042A4FF  |>  57            push    edi                                        ; /FileName
0042A500  |.  FF15 A4104000 call    dword ptr [<&KERNEL32.LoadLibraryA>]       ; \LoadLibraryA


3.用16进制编译器打开 c1.dll,c1xx.dll,c2.dll,cl.exe,link.exe
搜索 pdb71.dll 全部改成 pdb60.dll

4.在link.exe中把 ?Open@PDB@@SAHPBD0KPAJQADPAPAU1@@Z 改成 ?Open@PDB@@SAHPAD0KPAJQADPAPAU1@@Z
因为 pdb60.dll 把参数声明为 char*,而pdb71.dll把参数声明为 const char*,这导致修改符不同

5.从PSDK/DDK任何能找到 pdb60.dll的地方把 6.2 版的pdb60.dll 拷贝进去


OK,一切搞定,现在新建一个console工程,编译debug配置,可以看到 生成的文件内部已经是 NB10 标记的 PDB 文件了,开始调试,不再提示没有符号文件.


附注:
1.
如果提示找不到 ftol2

源代码中加上
extern "C" long _cdecl _ftol(double x);
long _cdecl _ftol2(double x){return _ftol(x);}

2.
关掉 /GZ,避免提示找不到 _SEH_epilog , _SEH_prolog
如果不关掉,可以从 PSDK2003 中拷贝sehprolg.obj,添加到工程

现在,可以继续使用 VC6这个轻快的IDE,配合VAX的书写代码提示,然后用VC7.1这个更标准的编译器编译了
还可以再拷贝一个 vcpkg,从而自动切换编译平台生成 i386/amd64 的目标文件

enjoy it!

9月14日

vcpkg 5.0

v5.0 (2009-9-14)
1. 代码重构
 1.1 移除 tinyxml,改用自己写的XML处理模块,支持UTF8/UNICODE/ANSI
 1.2 去掉了部分不常用特性,例如:dll加密,编译工具替换
 1.4 新的命令行词法分析模块,可以通过定义关键字规则/默认规则,较好的分析已知和未知的选项,分解后的结构易于后期处理
 1.3 现在内置 类C语言脚本引擎(不区分大小写),取代原来通过XML定义关键字进行编译器选择和命令行修改的方式,
 脚本引擎可以访问绝大多数命令行读写操作,实现数据分析和修改
1.2 XML结构配套调整
 
email me to get the new version.
9月11日

copyanyway

写批处理文件时遇到拷贝文件失败的问题,so 写了一个不屈不挠,几乎非拷贝成功不可的batch代码
 
功能:
拷贝文件,如果目标文件已经存在,则会删除或改名(无法删除时,改名后的文件会在重启后删除)后再进行拷贝
 
用法:
在批处理文件头部加上
set myrand=selfdel_%random%
set bRestartrun=false
以后可以任意调用 call :copyanyway 文件名 路径
文件名必须是仅名称部分,不含路径
路径不需要加反斜杠结尾
 
提示:文件名或路径如果包含空格,则必须加上引号
 
用法举例:
@echo off
set myrand=selfdel_%random%
set bRestartrun=false
 
call :copyanyway symbolcheck.dll %windir%\system32
 
源代码:
rem------------------- copyanyway ------------------------
:copyanyway
rem the original code written by morning.ye
if exist "%2\%1" (
  del /F /Q "%2\%1" >nul
  if not exist "%2\%1" goto copyanyway_docopy
  rem try to rename it in rand filename.
  if exist "%2\%1.%myrand%.bak" (
    del /F /Q "%2\%1.%myrand%.bak"
  )
  if not exist "%2\%1.%myrand%.bak" (
    echo ren "%2\%1" "%1.%myrand%.bak"
    ren "%2\%1" "%1.%myrand%.bak" >nul
    if not exist "%2\%1" (
      call :copyanyway_resartdel "%2\%1.%myrand%.bak"
      goto copyanyway_docopy
    )
  )
  rem try again,i think it should be ok anyway.
  if exist "%2\%1.%myrand%.bak.bak" (
    del /F /Q "%2\%1.%myrand%.bak.bak"
  )
  if not exist "%2\%1.%myrand%.bak.bak" (
    echo ren "%2\%1" "%1.%myrand%.bak.bak"
    ren "%2\%1" "%1.%myrand%.bak.bak" >nul
    if not exist "%2\%1" (
      call :copyanyway_resartdel "%2\%1.%myrand%.bak.bak"
      goto copyanyway_docopy
    )
  )
  rem failed,display as copy.
  echo copy %1 %2\%1
  echo 0 file copied.
  goto :eof
)
:copyanyway_docopy
echo copy %1 %2\%1
copy /Y %1 %2\%1
goto :eof
:copyanyway_resartdel
if exist %1 (
  call :runonce_batch_append del /F /Q %1
)
goto :eof
rem------------------- runonce batch file ------------------------
:runonce_batch_append
rem the original code written by morning.ye
if "%bRestartrun%"=="false" (
  set bRestartrun=true
  rem empty existed file,and add file head
  echo @echo off > "%APPDATA%\%myrand%.bat"
  rem create loader file,and we don't have to care is wether the selfdel operation has been added in runonce batch file
  echo @echo off > "%APPDATA%\%myrand%ldr.bat"
  rem batfile may be deleted by user,so add self reg cleanup
  echo reg delete HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce /v %myrand% /f >> "%APPDATA%\%myrand%ldr.bat"
  echo del /F /Q "%APPDATA%\%myrand%.bat" >> "%APPDATA%\%myrand%ldr.bat"
  echo del /F /Q "%APPDATA%\%myrand%ldr.bat" >> "%APPDATA%\%myrand%ldr.bat"
  rem create reg runonce info
  reg add HKCU\Software\Microsoft\Windows\CurrentVersion\RunOnce /v %myrand% /d "%APPDATA%\%myrand%ldr.bat" /f >nul
)
rem append to batch file
echo %* >> "%APPDATA%\%myrand%.bat"
goto :eof