天!GetFullPathName() 竟然对 DF 位有要求

zara 2010-11-22 02:30:32
写了个小程序,用到了 GetFullPathName() 这个系统函数。开始时用得都好好的,后来有改动,运行到这个函数就出错了,Ollydbg 时提示是 ntdll 内 int3 中断;将 EIP 重设下再运行这个函数,似又正常了;如果将错误交回,在该函数是返回 0, GetLastError() 提示 ERROR_NOT_ENOUGH_MEMORY。
对着这个问题,真是百思不得其解啊。左看,右看,上看,下看,终还是很茫然。网上搜索了下,也无结果。
再仔细瞪着这个语句看了半天,一闪念间,想想修改的有上面反向检索个字符串 std 设置了递减方向标记位。于是,在 GetFullPathName() 语句之前加上了个 cld 指令,再运行,竟然就正常了!

很少写东西的,用到什么函数,也就是查下 Win32API.HLP。一直都没看到有对 DF 标记位有要求的啊!这个,算怎么回事儿呢?

我的系统是 xp/sp3,GetFullPathName() 函数所在的 kernel32.dll 版本为 5.1.2600.5512
...全文
103 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2010-11-22
  • 打赏
  • 举报
回复
高级语言编译器都默认DF=0,SDK文档是用C语言来描述的,而且兼容多种硬件平台,所以不会特别去提这个地方。
PctGL 2010-11-22
  • 打赏
  • 举报
回复
有个约定,深究起来我也忘了叫什么名字了,就是对这些标志位还有其他的东西的默认设置约定的

比如win系统,默认置位都是cld的默认顺序,如果你认为的std过,那么在调用系统函数前一定要

记得恢复cld,以前我hook一个函数,然后总出错,怎么也想不通为什么,后来跟了一下才发现

std导致系统的rep movs 顺序出错,造成错误

至于那个约定好像叫什么intelxxx约定... lz感兴趣的话还是自己查查资料去吧
MHBBCRCPJ 2010-11-22
  • 打赏
  • 举报
回复
把微软当成女的,这样当你被她强奸的时候就会感觉很爽了。
zara 2010-11-22
  • 打赏
  • 举报
回复
我自己程序里,怎么动 DF 是我自己的事儿了,也是我的自由吧。如果系统 API 要求 DF 的状态,要么自己进行设置,要么就应在文档里显著地、明确地说明了才对吧。
coohai 2010-11-22
  • 打赏
  • 举报
回复
系统API函数,遇到串操作,不会去设置DF,所以楼主应当检查自己是否改动了DF而又没有恢复?

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧