SymGetModuleInfo64函数的一个问题

SymGetModuleInfo64函数的一个问题

今天调用dbghelp.dll中的一个函数SymGetModuleInfo64来取得加载模块的信息,但是返回的结果发现常常是丢掉数据。比如本来加载的pdb文件在位置c:/测试/1.pdb上,但是返回的LoadedPdbName却是 c:/测试/1.p 。很奇怪。但是若是使用SymGetModuleInfoW64来调用(即SymGetModuleInfo64的Unicode版本)却没有这个问题。
通过更多的试验,确定问题出在SymGetModuleInfo64中计算字符长度的函数上,该将汉字和英文字符一样算作一个字节了。
为了证明这个推断,反编译了SymGetModuleInfo64发现调用过程如下:

SymGetModuleInfo64调用SymGetModuleInfoW64, 接着将返回的UNICODE字符调用SympConvertUnicodeModule64ToAnsiModule64进行转换,在SympConvertUnicodeModule64ToAnsiModule64中最终会调用dbghelp!wcs2ansi函数来将WChar字符串转换成Char字符串,下面是这个函数的反汇编代码,在这段代码里你会看到它是如何计算字符串占用的字节数的。

函数原型如下:
Bool WINAPI wcs2ansi(PWCHAR pwstr; PCHAR pstr;ULONG len);

dbghelp!wcs2ansi:
0303b4a0 8bff            mov     edi,edi
0303b4a2 55              push    ebp
0303b4a3 8bec            mov     ebp,esp
0303b4a5 83ec18          sub     esp,18h
0303b4a8 8b4508          mov     eax,dword ptr [ebp+8]
0303b4ab 8945f4          mov     dword ptr [ebp-0Ch],eax
0303b4ae 8b4df4          mov     ecx,dword ptr [ebp-0Ch]
0303b4b1 83c102          add     ecx,2
0303b4b4 894df0          mov     dword ptr [ebp-10h],ecx
0303b4b7 8b55f4          mov     edx,dword ptr [ebp-0Ch]
0303b4ba 668b02          mov     ax,word ptr [edx]
0303b4bd 668945ee        mov     word ptr [ebp-12h],ax
0303b4c1 8345f402        add     dword ptr [ebp-0Ch],2
0303b4c5 66837dee00      cmp     word ptr [ebp-12h],0        //从源字符串找出为0的字。
0303b4ca 75eb            jne     dbghelp!wcs2ansi+0x17 (0303b4b7)
0303b4cc 8b4df4          mov     ecx,dword ptr [ebp-0Ch]
0303b4cf 2b4df0          sub     ecx,dword ptr [ebp-10h]
0303b4d2 d1f9            sar     ecx,1  //将找出的长度除以2,得出字符串中需要的字节数。
0303b4d4 894de8          mov     dword ptr [ebp-18h],ecx
0303b4d7 8b55e8          mov     edx,dword ptr [ebp-18h]
0303b4da 8955f8          mov     dword ptr [ebp-8],edx
0303b4dd 837df800        cmp     dword ptr [ebp-8],0
0303b4e1 750d            jne     dbghelp!wcs2ansi+0x50 (0303b4f0)
0303b4e3 8b450c          mov     eax,dword ptr [ebp+0Ch]
0303b4e6 c60000          mov     byte ptr [eax],0
0303b4e9 b801000000      mov     eax,1
0303b4ee eb3a            jmp     dbghelp!wcs2ansi+0x8a (0303b52a)
0303b4f0 6a00            push    0
0303b4f2 6a00            push    0
0303b4f4 8b4d10          mov     ecx,dword ptr [ebp+10h]
0303b4f7 51              push    ecx
0303b4f8 8b550c          mov     edx,dword ptr [ebp+0Ch]
0303b4fb 52              push    edx
0303b4fc 6aff            push    0FFFFFFFFh
0303b4fe 8b4508          mov     eax,dword ptr [ebp+8]
0303b501 50              push    eax
0303b502 6820020000      push    220h
0303b507 6a00            push    0
0303b509 ff15fcf50e03    call    dword ptr [dbghelp!_imp__WideCharToMultiByte (0
30ef5fc)]
0303b50f 8945fc          mov     dword ptr [ebp-4],eax
0303b512 837dfc00        cmp     dword ptr [ebp-4],0
0303b516 7504            jne     dbghelp!wcs2ansi+0x7c (0303b51c)
0303b518 33c0            xor     eax,eax
0303b51a eb0e            jmp     dbghelp!wcs2ansi+0x8a (0303b52a)
0303b51c 8b4d0c          mov     ecx,dword ptr [ebp+0Ch]
0303b51f 034df8          add     ecx,dword ptr [ebp-8]
0303b522 c60100          mov     byte ptr [ecx],0  //在上面找出的长度处设置上NULL.
0303b525 b801000000      mov     eax,1
0303b52a 8be5            mov     esp,ebp
0303b52c 5d              pop     ebp
0303b52d c20c00          ret     0Ch

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中南大学信息院《数字电子技术基础》 期终考试试题(110分钟)(第二套) 一、填空题:(每空1分,共16分) 1.逻辑函数有四种表示方法,它们分别是( )、( )、( )和( )。 2.将2012个“1”异或起来得到的结果是( )。 3.目前我们所学的双极型集成电路和单极型集成电路的典型电路分别是( )电路和( )电路。 4.施密特触发器有( )个稳定状态.,多谐振荡器有( )个稳定状态。 5.已知Intel2114是1K* 4位的RAM集成电路芯片,它有地址线( )条,数据线( )条。 6.已知被转换的信号的上限截止频率为10kHz,则A/D转换器的采样频率应高于( )kHz;完成一次转换所用的时间应小于( )。 7.GAL器件的全称是( ),与PAL相比,它的输出电路是通过编程设定其( )的工作模式来实现的,而且由于采用了( )的工艺结构,可以重复编程,使用更为方便灵活。 二、根据要求作题:(共16分) 1.试画出用反相器和集电极开路与非门实现逻辑函数 。 2、图1、2中电路由TTL门电路构成,图3由CMOS门电路构成,试分别写出F1、F2、F3的表达式。 三、已知电路及输入波形如图4(a)(b)所示,其中FF1是D锁存器,FF2是维持-阻塞D触发器,根据CP和D的输入波形画出Q1和Q2的输出波形。设触发器的初始状态均为0。 (8分) 四、分析图5所示电路,写出Z1、Z2的逻辑表达式,列出真值表,说明电路的逻辑功能。 (10分) 五、设计一位8421BCD码的判奇电路,当输入码含奇数个“1”时,输出为1,否则为0。要求使用两种方法实现: (20分) (1)用最少与非门实现,画出逻辑电路图; (2)用一片8选1数据选择器74LS151加若干门电路实现,画出电路图。 六、电路如图6所示,其中RA=RB=10kΩ,C=0.1μf,试问: 1.在Uk为高电平期间,由555定时器构成的是什么电路,其输出U0的频率f0=? 2.分析由JK触发器FF1、FF2、FF3构成的计数器电路,要求:写出驱动方程和状态方程,画出完整的状态转换图; 3.设Q3、Q2、Q1的初态为000,Uk所加正脉冲的宽度为Tw=5/f0,脉冲过后Q3、Q2、Q1将保持在哪个状态? (共15分) 七、集成4位二进制加法计数器74161的连接图如图7所示,是预置控制端;D0、D1、D2、D3是预置数据输入端;Q3、Q2、Q1、Q0是触发器的输出端,Q0是最低位,Q3是最高位;为低电平时电路开始置数,为高电平时电路计数。试分析电路的功能。要求: (15分) (1)列出状态转换表; (2)检验自启动能力; (3)说明计数模值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值