分不多了,请教高手:window程序在调用ntdll.dll时崩溃.

pSK_LB 2006-01-25 02:11:44
请教高手:我用VC开发了一个win32 动态库程序,可程序有时会在调用ntdll.dll时崩溃.(开发环境是win2000 Server)
ntdll.dll是一个系统用户模块,好像是用户的程序都要调用它进入系统.
那是不是我的操作系统有问题,还是我的编译器有问题呢.
...全文
972 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
DrSmart 2006-01-25
  • 打赏
  • 举报
回复
你搞什么的没事调用它干嘛~~~~~~~~
pSK_LB 2006-01-25
  • 打赏
  • 举报
回复
等我检查一遍再来讨论,数组越界可能产生这类的错误,
anothervip 2006-01-25
  • 打赏
  • 举报
回复
看看你的数组有没有越界。
pSK_LB 2006-01-25
  • 打赏
  • 举报
回复
好啊,你说的删除的关键段对象是指什么,一个已经删除的对象,那是一个空的对象,但我的程序中没有使用指针,只使用了较多的数组,每个数组在程序启动时进行了初始化.
jerry 2006-01-25
  • 打赏
  • 举报
回复
你的代码有问题,仔细检查,估计是内存问题,或者使用了已经删除的对象。如已经删除的关键段对象进入NTDLL可能会崩溃
PE编译是什么,一个语言的编译流程就是从代码编译到汇编,然后整合到相对于系统的格式,PE就是window的格式。 也许,有人会告诉你PE结构,但是从来没有人会告诉你运行原理以及如何利用。 在PE上,可以分为几种大类 1.代码 2.资源 3.导入导出表 4.文件信息 . 在如今,资源和导入表已经弃用,为什么要弃用? 因为资源需要加载才能访问,不仅要调用API,还有其他处理,大大影响访问速度。 而如今都是直接访问指针,因为代码段是可读的,也就是说你把它放到代码段,就能直接用指针访问,这就是集成资源,明白吧。 . 导入表就更要弃用的,大家应该都知道windowdll映射是写复制的,同样的道理,如果你不是在使用再加载(仅加载一次)是不是会导致打开速度特别慢? . 资源如何集成? 假如一个资源只被一个子程序引用,那么你就可以整合进这个子程序代码里,因为这样能够让你访问资源的速度最大化,因为执行到这段代码,你这个资源就可能被放入高速缓存了,当然,这是适合单引用,如果是多引用,可以专门放一个区域,并过滤掉所有重复的常量,资源等等,这会使你的程序体积变得更小。 . 代码的编译规范? 首先,在你对所有子程序编译成汇编后,你需要注意的是,子程序间的调用,也就是CALL,一定要保证它的指针是16的倍数,切记!包括集成资源的指针,静态变量的指针,是一定要对齐16的,如果你不这么做,你的代码执行速度会变慢好几倍!这涉及的原理非常的复杂,我就不再详细解释,你可以亲自测试一下。 比如一个子程序的代码才10字节,这个子程序你把它编译在偏移0的位置,你下一个子程序的代码就得编译在偏移16的位置了,千万不要在意这几个无用的字节,但是它也有用的,比如你这个子程序调用了个“你好”的常量,你是不是可以集成进这6个字节里呢? . 如今,x86就快淘汰了,为什么?因为现在几乎都是使用x64系统,另外,x86程序在x64系统上运行每次调用比较特殊的API都会导致非常的慢,因为系统会切换到x64模式再执行再切换回来,这个切换非常的耗,这也是什么查询虚拟内存特别快而保留虚拟内存特别慢的原因。 . 也许我告诉你的这些,你找遍全网,也找不到答案,这些是从我的经验和摸索出来的。 . 曾经,我想过做个语言,这是PE编译的来源,但是,这不是一个好想法,因为力量薄弱赶不上代,更不会有市场,不以盈利为目的才是不正常的,毕竟有谁会闲着无聊呢?编译特别容易,难的是集成库,更别说当今代的,估计大部分人都懒得打开电脑了把,手机端的编译更是复杂无比,等你会了,也许已经是AI编程代了。 . 发这份源码的目的,也是希望某天能看到一个易语言 的x64编译器,当然,这涉及的知识非常的多,你还得集成那些库,要想实现高效的编译器,你还得懂得如何利用SSE2和FPU配合进行循环的优化,现在CPU都支持SSE2的,以及如何用动态缓冲编译循环合并的代码。 . 当然,这个源码不是完善的,相当于一个半成品,但是是能够让你放入一段汇编代码就能编译出exe来能正常运行的,这源码里,只是x86的实现,只需要改动几个东西就可以编译成x64模式,因为有x64编译的那个源码我好像没有测试过,放着吃灰好久好久了,所以我没有发那个,你需要查找下PEX64的结构,修改一下几处需要8字节指针的地方就可以,没记错的话应该是导入、导出、代码、重定位的某些RVA。 . 另外,这个源码好像在资源的处理那里有BUG,不知道我有没有修复了,代码、导出、导入、的处理是可行的,重定位有没有问题我不记得了,你可以使用OD、PE查看器对EXE跟踪下,修复问题后再转成X64模式。。 . 希望这篇贴能给那些想给易语言写X64编译的带来帮助,也希望某天能看到易语言X64编译器的出现,当然,你要是免费开 源就更好了 . 还有,没有导入表的exe只会加载ntdll的,也就是说你需要通过ldr获取ntdll的相关函数地址,然后调用再加载其他DLL。 . 感谢阅读

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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