阅读:2006回复:8
sirroom兄,请来看看,关于ndis.h的那个问题
sirroom兄,上回你所提出的关于ndis.h的问题:
#include \"ndis.h\" #include \"stdio.h\" int main(){ printf(\"hello ndis\"); return 0; } 这段代码的编译,开始的时候我所试的结果和你一样,即使像胡老大那样预定义了_X86_也无法通过编译,具体的错误如下: d:\\ntddk\\inc\\ddk\\ntddk.h(370) : error C2146: syntax error : missing \';\' before identifier \'Lock\' d:\\ntddk\\inc\\ddk\\ntddk.h(370) : error C2501: \'PULONG_PTR\' : missing storage-class or type specifiers d:\\ntddk\\inc\\ddk\\ntddk.h(370) : error C2501: \'Lock\' : missing storage-class or type specifiers d:\\ntddk\\inc\\ddk\\ntddk.h(825) : error C2146: syntax error : missing \';\' before identifier \'KSPIN_LOCK\' d:\\ntddk\\inc\\ddk\\ntddk.h(825) : fatal error C1004: unexpected end of file found Error executing cl.exe. 我的机器中,DDK装在d盘,像胡老大所说的那样,我一直认为是什么东西没有设置正确,打开NTDDK.H找到错误的地方,PULONG_PTR和ULONG_PTR这两东西无法识别,在DDK中搜索这俩哥们,发现他们在BASETSD.H之中,但是我的包含路径和你一样,也包含DDK的inc所在地路径,所以我在开始没有完整找出问题所在根源的情况下使用了一个笨办法:自己仿照BASETED.H中定义这两个家伙: typedef unsigned __int32 ULONG_PTR, *PULONG_PTR; typedef signed __int32 LONG_PTR; 然后编译,god save me!编译通过了,然后链接,没问题,运行结果正常,所以就此看来是编译器没有找到BASETED.H这个头文件,我的VS是6.0的版本,在另外一台装有VS.NET的机器上按照原来的代码编译,就没有问题,这下有点傻眼,不死心之下,在整个计算机中搜索baseted.h,结果发现有两个,一个在VC下,一个在NTDDK下!!问题就在这里了,这两个文件的内容有很大的不相同,最重要的就是,一个typedef了PULONG_PTR和ULONG_PTR这两东西,而VC下的没有,看看VC中的设置,发现VC的include的路径在NTDDK\\INC之前,在把他们交换顺序,添加#include \"baseted.h\"后编译运行完全ok了,当然开始自己typedef的那两行就可以删掉了:) #define _X86_ //typedef unsigned __int32 ULONG_PTR, *PULONG_PTR; //typedef signed __int32 LONG_PTR; 这两句是开始自己强行定义的; #include \"basetsd.h\" 我觉得这个是一定要的(VC 6.0中) #include \"ndis.h\" #include \"stdio.h\" int main(){ printf(\"hello ndis\"); return 0; } 这就是我所得到的结果,结论就是在老版本的VC中baseted.h这个文件和这段代码一起用有问题,而在VS.NET中这个文件已经更新了,所以VS.NET中可以编译通过,胡老大的代码中没有#include \"baseted.h\"是因为他还包含了SDK的路径吧,不知道你在胡老大那边得到的结果是什么,希望算是一种解释,希望指正。 剩下的一个问题就是在VS.NET中这段代码可以通过编译,但是无法链接(产生一些完全看不懂的错误),不知道有何高见。 |
|
沙发#
发布于:2002-06-07 21:19
没有来么?
版主大哥也没兴趣^_^ |
|
板凳#
发布于:2002-06-08 09:44
没有来么? 这些花样,除了能够锻炼锻炼c语言基本功,我看不出还有什么 其它的意义。 锻炼c语言的基本功,还有比这更好的方法。以前我以为看source 是个好方法,后来发现看source不能强迫自己理解所有的代码, 总是重复理解已经熟悉的代码。最近发现更好的方法是做不同 os上的库移植,遇到的各种编译问题更多。 |
|
|
地板#
发布于:2002-06-08 12:10
[quote]没有来么? 这些花样,除了能够锻炼锻炼c语言基本功,我看不出还有什么 其它的意义。 锻炼c语言的基本功,还有比这更好的方法。以前我以为看source 是个好方法,后来发现看source不能强迫自己理解所有的代码, 总是重复理解已经熟悉的代码。最近发现更好的方法是做不同 os上的库移植,遇到的各种编译问题更多。 [/quote] 你说得太对了,我看过linux的一些源码,但是感觉没有什么很大的感触(当然别人的优秀代码风格是另外一回事),该理解还是没很迷糊,在对胡老大所说的重复理解已经熟悉的代码这句话算是比较理解,比如看了socket.c后,还是那些已经理解比较深的东西在打转,我会试着做些OS的库移植看看:) |
|
地下室#
发布于:2002-06-10 14:09
授人以鱼,不如授人以渔! 你今天回答了他ndis.h,明天他又问ntddk.h,哎…… |
|
|
5楼#
发布于:2002-06-11 13:36
[quote] 授人以鱼,不如授人以渔! 你今天回答了他ndis.h,明天他又问ntddk.h,哎…… [/quote] sorry,我并没有向谁要鱼,胡大哥给了一些渔的经验我很感激,但是即使他不告诉我,我也没有必要去乞讨!这个问题我只是在求证一下,并没有乞讨什么,请不要误会我的意思,我只是在重复他当年走的道路而已。 我知道你的意思并非嘲讽,感谢你的关注。 |
|
6楼#
发布于:2002-06-12 18:41
这下偶真的明白了,看来是ndis.h中没有把那个东东用上.hoho.
不过偶最后偷懒了,什么地方和偶的冲突,偶就改掉它,tnnd.懒得东翻西翻的 |
|
|
7楼#
发布于:2002-06-12 18:44
事实上,如果有了sdk的path应该没有什么问题,不过另一个同事的有一大堆代码好象和sdk有冲突的地方,偶也懒得改,....所以就把ntddndis.h该了.hehehe
|
|
|
8楼#
发布于:2002-06-12 19:55
这下偶真的明白了,看来是ndis.h中没有把那个东东用上.hoho. hehe 你既然看到了这个帖子就ok了,感谢各位关注:) |
|