阅读:5945回复:22
port win2k/xp ddk sample passthru to win98/se/mexp passthru是source compatible 的imd,兼容 win98se/me/xp/2k,注意不兼容win98,95是ndis3,不支持 imd。 在win98se/me下编译方法: 首先修改source文件,source文件中有注释,因为 基本上不用我多说,注意,编译的时候使用win2k 的环境,就是说,用win2k chk build env,然后 使用98ddk中的build -cZ。也就是说,使用w2k的 头文件/库,但是用98ddk的build编译。 值得注意的一点:2k ddk中的ndis函数很多都是 宏,例如ndissend,但是win98se/me中要求是函数, 因此,source文件中加一条环境变量:-DBINARY_COMPATIBLE。 不加也能编译过,但是加载的时候不知道会发生什么。 在98se/me中调试的话,强烈建议有vxdldr的chkbuild。 此外,ndis.vxd的sym也有必要。 关于w2k 的ndis driver port to win9x的问题,还有 一个地方值得考虑,w2k是unicode string,win9x是 asci string,注意看ndis.h中的PNDIS_STRING的定义。 为什么这个SAMPLE能够兼容WIN98SE/ME,但是却不能 兼容win98?因为所有win98se/me中不能用的函数都 用条件编译保护了,但是还有5到6个98下不能用的函数, 没有保护,结果系统加载的时候找不到入口,无法加载。 如果是98 chkbuild,可以在softice中看到dbgprint信息。 \"xxx fun canot found entry...\" 因此,有98 chkbuild就比较容易移植。因为你可以找到 所有不支持的函数然后用条件编译去掉。 最后谈安装,我的经验,安装会带来一场恶梦,如果不是 两场的话。 9x下的inf文件和2k的完全不同,倒是有点类似nt,而且 文档也不太详细,唯一可以找到的系统一点的描述在95ddk, vs6附带的msdn里面有。可是95并不支持imd,因此,这方面 的内容一点都没有。目前internnet上能找到的信息只有 RS_PPPOE的实现,里面有一个WINPPPOE.INF,此外,98系统 自带一个ATMLANE.INF和ATMLANM.INF,这两个都是MUX IMD, 和filter imd的情况还有不同,目前我无法找到任何关于 filter imd for 9x的inf的资料。而且由于9x似乎并不打算 方便的支持imd,因此,没有象2k那样,直接支持imd filter 的安装。因此,即使写出了一个inf也没有用,有3个问题 无法简单的解决: 1、循环绑定。因为imd有miniport也有protocol,因此, 会导致循环绑定。就是imd的protocol会绑定自己的miniport。 2、无法象2k的imd filter安装一样,打断原有的协议和 miniport的绑定,绑定效果会是tcp->real miniport tcp->imd\'s miniport并存,这是mux filter的效果,并不是 imd filter的效果。 3、对于拨号的支持。 目前我只能手动编辑注册表,使得它工作,但是系统如果一旦 再次安装了一个别的协议或者pppoe之类的东西,我就必须再次 编辑注册表,卸载其它协议也无法干净。因为我只能根据非常 有限的资料摸索98注册表中到底都有些什么东西,每个健值 是什么含义。rs_pppoe做得不错,最令我感到神奇的是,他 居然binary compatible。不知道是否使用了动态寻找入口的 技术。rs_pppoe的wi9x安装有一个dll,这个dll就是解决所有 安装卸载问题的。这方面我正在摸索,前两天刚刚下载了一个 vc1.52,就是为了编译安装dll,这玩艺是个16bit的dll,9x 下的netdi.dll也是16bit的。现在还是无法达到我手动编辑 注册表的效果,而且完美的支持更加不知道何时能够搞定, 还好这只是自娱自乐。 关于这个问题,我希望有在9x下写过网络安装dll的兄弟能够 提供一些技术支持。我没有写过16 bit的驱动程序,也没有 写过16bit的dll,这倒不是什么大问题,ddk和msdn中多次 有不少描述,但是安装的那些函数令我颇感困惑,98ddk 中有两个sample,但是都颇令人困惑。 |
|
|
沙发#
发布于:2002-01-16 11:14
我也是在16bit的这个dll上有问题,msvc152好像不能在win98se上用
。我想要先装一个win95才可。如果斑竹有了进展能不能发一个代码给我学一学。 email is: yiduz999@public.wh.hb.cn |
|
|
板凳#
发布于:2002-01-21 17:38
我已经忍无可忍了,恨不得踢烂这个破win98,在继win me 无法编译16位,vc1.52也不能不加修改地编译之后,真想一脚踢翻烂98。
|
|
地板#
发布于:2002-01-21 21:42
我已经忍无可忍了,恨不得踢烂这个破win98,在继win me 无法编译16位,vc1.52也不能不加修改地编译之后,真想一脚踢翻烂98。 我在本站下的vc1.5可以编译,感觉还是不错的,现在 我对于win98的牢骚已经很少了。 |
|
|
地下室#
发布于:2002-01-22 17:40
版主是不是成功了。把代码让大家学习学习?
hoho. 这里有vc1.51?? |
|
|
5楼#
发布于:2002-01-25 12:25
问个问题,有关NDIS函数中NDIS_STRING的解释:我在xpddk的passthru中看到
NDIS_STRING DeviceStr = NDIS_STRING_CONST(\"UpperBindings\"); 而 NDIS_STRING_CONST 在 2000 ddk中定义为{sizeof(L##x)-2, sizeof(L##x), L##x},那么如何解释NDIS_STRING在WIN9X下是ANSI_STRING呢?用WIN2000的DDK编译出来的SYS在WIN9X下怎么“自适应”NDIS_STRING呢? |
|
6楼#
发布于:2002-01-25 12:37
再问一个问题:NdisIMAssociateMiniport 和 NdisReEnumerateProtocolBindings 在 WIN98 下不支持,这两个函数如果不使用的话,有替代的函数吗?如果不用在 WIN98SE WINME下有影响吗?
其它的函数看PASSTHRU例子中仅仅是用 #ifndef 不用而已。 |
|
7楼#
发布于:2002-01-25 16:08
就我的理解,win9x下应该没有NdisIMAssociateMiniport 和 NdisReEnumerateProtocolBindings 的手替换的,win9x没有明确的层次的概念,不用应该没什么影响。
|
|
|
8楼#
发布于:2002-01-28 10:47
请教版主,如何在win98中用softice调试这种驱动?真的不会,请不林赐教,谢谢!
|
|
9楼#
发布于:2002-01-29 00:45
请教版主,如何在win98中用softice调试这种驱动?真的不会,请不林赐教,谢谢! 我考,webmaster发给我的口令居然不正确,似乎我只好 用匿名发表了。郁闷。 调试方法和在w2k中一样。 最近我基本上搞定了,对于网卡来说,已经没有问题了, 但是拨号总是拨不上去,报720错误。 如果你要做类似的工作,我建议你先用win98se版,直接 使用xp ddk的那个sample,一定是能够load的,如果用 win98的话,用98 ddk中的vxdldr.vxd 拷贝到system/vmm32 目录下,然后手动修改注册表,建立正确的绑定,然后 reboot,看到softice加载的屏幕之后立即按ctrl-d, 看前面的dbgprint信息,如果没有,那么x继续,然后 看到硬盘灯会亮一会儿,然后接着按ctrl-d(这个时候 还是黑屏状态,98还没有完全启动),翻屏看前面的 信息,如果你有函数98没有输出,vxdldr.vxd会调用 dbgprint显示的。你可以在xp ddk passthru中找到 这些函数,全部注释掉,然后编译,重起。 如果你用双机调试,就不用这么麻烦。 98不支持的函数如下: NdisIMCopySendPerPacketInfo NdisMRegisterUnloadHandler NdisIMCopySendCompletePerPacketInfo NdisMRegisterDevice NdisReEnumerateProtocolBindings NdisIMAssociateMiniport NdisMRegisterUnloadHandler NdisIMCopySendPerPacketInfo NdisIMCopySendCompletePerPacketInfo NdisGetReceivedPacket 通通注释掉,或者#ifdef掉。注释之后可以工作, 至少我的实验结果是这样。 安装的话,仅仅写一个inf是没有用的,必须用一个dll来 解决问题,但是你需要写的似乎是一个mux driver,好像 这个问题比较容易解决,我想你需要解决的就是不能循环 绑定,就是说,imd_mini不能向上绑定imd_proto,这个 可以在ndi_querybind消息处理函数中return ndi_error来解决 最后强烈建议使用英文版98做实验,因为chk build的系统 driver和动态库都是英文版的,用中文版的容易出问题。 (我因此废了一个98),测试安装程序的时候,不断的 保存注册表是非常必要的,如果你不想不停的装机器的 话。 |
|
|
10楼#
发布于:2002-01-29 00:46
啊,口令是对的,是我敲错了,只好向站长说sorry了,
我更郁闷了:-) [quote]请教版主,如何在win98中用softice调试这种驱动?真的不会,请不林赐教,谢谢! 我考,webmaster发给我的口令居然不正确,似乎我只好 用匿名发表了。郁闷。 调试方法和在w2k中一样。 最近我基本上搞定了,对于网卡来说,已经没有问题了, 但是拨号总是拨不上去,报720错误。 如果你要做类似的工作,我建议你先用win98se版,直接 使用xp ddk的那个sample,一定是能够load的,如果用 win98的话,用98 ddk中的vxdldr.vxd 拷贝到system/vmm32 目录下,然后手动修改注册表,建立正确的绑定,然后 reboot,看到softice加载的屏幕之后立即按ctrl-d, 看前面的dbgprint信息,如果没有,那么x继续,然后 看到硬盘灯会亮一会儿,然后接着按ctrl-d(这个时候 还是黑屏状态,98还没有完全启动),翻屏看前面的 信息,如果你有函数98没有输出,vxdldr.vxd会调用 dbgprint显示的。你可以在xp ddk passthru中找到 这些函数,全部注释掉,然后编译,重起。 如果你用双机调试,就不用这么麻烦。 98不支持的函数如下: NdisIMCopySendPerPacketInfo NdisMRegisterUnloadHandler NdisIMCopySendCompletePerPacketInfo NdisMRegisterDevice NdisReEnumerateProtocolBindings NdisIMAssociateMiniport NdisMRegisterUnloadHandler NdisIMCopySendPerPacketInfo NdisIMCopySendCompletePerPacketInfo NdisGetReceivedPacket 通通注释掉,或者#ifdef掉。注释之后可以工作, 至少我的实验结果是这样。 安装的话,仅仅写一个inf是没有用的,必须用一个dll来 解决问题,但是你需要写的似乎是一个mux driver,好像 这个问题比较容易解决,我想你需要解决的就是不能循环 绑定,就是说,imd_mini不能向上绑定imd_proto,这个 可以在ndi_querybind消息处理函数中return ndi_error来解决 最后强烈建议使用英文版98做实验,因为chk build的系统 driver和动态库都是英文版的,用中文版的容易出问题。 (我因此废了一个98),测试安装程序的时候,不断的 保存注册表是非常必要的,如果你不想不停的装机器的 话。 [/quote] |
|
|
11楼#
发布于:2002-01-29 10:36
感谢版主帮忙,果然搞定了!
winice显示:PRELDR:PPPOE.SYS can\'t find export NdisQueryBufferSafe in export module NDIS.SYS.我用 #ifndef 的时候,倒是没有注意到这个函数win98se也是没有的。 720在win2000上的解释是:720 由于您的计算机与远程计算机的 PPP 控制协议不一致,所以连接尝试失败。如果win98的解释也是这个意思,那就是说,很有可能是服务器上的接入属性中没有选择与客户端拨号属性中相同的协议。一般来说,把tcp/ip协议都选中,应当可以协商的过。 |
|
12楼#
发布于:2002-01-29 10:40
感谢版主帮忙,果然搞定了! 真是有BUG,怎么上面文字中间出来了个小人头?它怎么知道那正是我的BUG所在? :P :P :P啊,我明白了! |
|
13楼#
发布于:2002-01-29 23:23
感谢版主帮忙,果然搞定了! 对了,你对拨号有研究,正好这个问题请教你。 720错误的确是这个意思,我拨号是直接拨169,所以绝对不是 服务器的错。我猜想也许是因为现在我的ndiswan不再绑定MSTCP了, 而是绑定IMD_PROTOCOL了。 是否是这个问题?这个问题如何解决呢? 此外,熟悉16位动态库的兄弟能不能告诉我,如何调用WIN32的 函数或者动态连接库? |
|
|
14楼#
发布于:2002-01-29 23:26
感谢版主帮忙,果然搞定了! 在9X下不能用NdisQueryBufferSafe,直接用NdisQueryBuffer就 可以了。 |
|
|
15楼#
发布于:2002-01-30 10:50
[quote在9X下不能用NdisQueryBufferSafe,直接用NdisQueryBuffer就可以了。 [/quote]
谢谢版主。如果拨号你用的是win98“拨号网络”中创建的拨号连接,拨号连接的属性中“服务器类型”属性页上有“所允许的网络协议”,至少应选中tcp/ip;如果使用RasDial函数拨号那也一样有一个“电话簿”(也就是上面所说的拨号连接),在程序创建电话簿的时候,可以设置电话簿属性,同样要注意选上RASNP_Ip(ip协议)。 拨号能够进行到这一步,说明驱动程序部分是没有问题了,建立连接,会话过程都正确了。接下来就是ndiswan的事了,只要ndiswan的各种选项能够协商的话,应该就可以了。 |
|
16楼#
发布于:2002-01-30 16:06
呼! 好不容易注册成功.
弟想请问一下, 关于拨话的部份, 板主是怎么解决的? 弟mail给你过, 后来觉得还是公开讨论, 大家互相讨 论可能较助学习. 弟在windows2000下写过个PPPoE(当然也是拿Passthru 改的). 在windows2000都可正常运作, 也可以拨话, 连到server完成验证. 可是, 移植到windows98SE后, 驱动程序可以被激活, 在softice调适里也看到TAPI它用问了些东西, 但, 在”拨话网络”里新增联机, 怎么就是找不到调制解调器 (modem)…在windows2000都找得到. 是我哪而忘了注意吗? |
|
17楼#
发布于:2002-01-31 17:10
[quote在9X下不能用NdisQueryBufferSafe,直接用NdisQueryBuffer就可以了。 谢谢版主。如果拨号你用的是win98“拨号网络”中创建的拨号连接,拨号连接的属性中“服务器类型”属性页上有“所允许的网络协议”,至少应选中tcp/ip;如果使用RasDial函数拨号那也一样有一个“电话簿”(也就是上面所说的拨号连接),在程序创建电话簿的时候,可以设置电话簿属性,同样要注意选上RASNP_Ip(ip协议)。 拨号能够进行到这一步,说明驱动程序部分是没有问题了,建立连接,会话过程都正确了。接下来就是ndiswan的事了,只要ndiswan的各种选项能够协商的话,应该就可以了。 [/quote] 我想你说的应该是win98拨号的属性,里面有几个tcp,netbeui,ipx 的chkbox吧?我这个都选了,缺省就是选了的。服务器我是直接 拨169,中国电信的服务器,不可能有问题。我想是不是协商的 时候,某个地方没有处理对? 我现在安装已经完成了,在干净的机器上试过了,绑定关系可以 自动建立了,还没有来得及测试绑定关系和RS_PPPOE,以及sysgate, wingate,ICS的兼容性。 16bit程序要访问注册表,就只好调用32位函数,必须有平台sdk, masm611,还需要98ddk中的thunk.exe,好tmd的费劲阿。关于 thunk的写法,msdn里面有一篇文章,讲的挺详细,就是感觉 太繁了。 |
|
|
18楼#
发布于:2002-01-31 19:41
贴不上,重新来过。
恭喜版主。我做的刚刚能够装上,还不能创建拨号连接,找不到拨号设备。你的问题我还没有碰到,在win2000下的经验可能不一定适用于win98的。只好共同研究了。 不好意思,版主,我觉得现在大家很有可能都在做同样的或类似的事情,干脆明说了吧,也好尽早解决问题,大家同喜,反正我也是为老板打工的,我想也不会对各自的公司造成什么影响,否则,版主岂不是泄漏太多给我?呵呵。如果觉得不大方便,我们也可以用email交流呀,包括上面的那位geohu老兄,我现在的处境跟你一样,我断定我跟你在做同样一件事。 辅助安装我们用的是98ddk 中 MYNDI 源代码修改的。访问注册表有几个函数,NdiRegCreateKey NdiRegOpenKey NdiRegQueryValue NdiRegSetValue NdiRegCloseKey, INF我们是照RASPPPOE原样抄袭的。 |
|
19楼#
发布于:2002-01-31 19:58
辅助安装我们用的是98ddk 中 MYNDI 源代码修改的。访问注册表有几个函数,NdiRegCreateKey NdiRegOpenKey NdiRegQueryValue NdiRegSetValue NdiRegCloseKey, INF我们是照RASPPPOE原样抄袭的。 不过,要把注册表信息写到别的地方,似乎这几个函数就无能为力了。 |
|
上一页
下一页