无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 16227|回复: 62
打印 上一主题 下一主题

[求助]会PASCAL的请进.请帮忙改写一个程序[已解决]

[复制链接]
跳转到指定楼层
1#
发表于 2008-4-12 01:33:54 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
附件PCI.RAR的源码来自于以下网址的DOS版本,
http://members.datafast.net.au/dft0802/downloads.htm

已删除里面一些没有用的代码,并且修改了显示结果,只显示class type=1的项(C:01)

显示的结果类似于下面
V:1106 D:0598 S:00000000 B:0 E:00 F:0 I:00 N:- C:06 U:00 P:00
V:1106 D:8598 S:00000000 B:0 E:01 F:0 I:00 N:- C:06 U:04 P:00
V:1106 D:0586 S:00001106 B:0 E:07 F:0 I:00 N:- C:06 U:01 P:00
V:1106 D:0571 S:00000000 B:0 E:07 F:1 I:00 N:- C:01 U:01 P:8A
V:1106 D:3038 S:12340925 B:0 E:07 F:2 I:11 N:D C:0C U:03 P:00
V:1106 D:3040 S:00000000 B:0 E:07 F:3 I:00 N:- C:06 U:00 P:00
V:121A D:0003 S:0017139C B:0 E:17 F:0 I:10 N:A C:03 U:00 P:00
V:1011 D:0014 S:01001186 B:0 E:19 F:0 I:09 N:A C:02 U:00 P:00

其中主要使用的是
V:XXXX D:XXXX C:XX U:XX


为了配合自动检测硬盘控制器驱动,需要增加代码.

根据得到的结果读取一个指定的文件(驱动数据库)中的数据并将得到的结果设为DOS环境下的变量.

数据库格式就是TXTSETUP.SIF的格式[HardwareIdsDatabase]段
如下
PCI\VEN_8086&DEV_27C1&CC_0106="iaStor78"

PCI\VEN_8086&DEV_27C1="iaStor50"
PCI\VEN_8086&DEV_27C3&CC_0104="iaStor79"
PCI\VEN_8086&DEV_27C5="IASTOR70"
PCI\VEN_8086&DEV_27C6="IASTOR78";ICH7MDH SATA RAID

;后面注释

例子:
得到的数据(以下数据只是随意写的):
对应关系:

PCI\VEN_8086&DEV_27C1&CC_0106
PCI\VEN_V:&DEV_D:&CC_C:U:

V:8086 D:27C1 S:00000000 B:0 E:07 F:1 I:00 N:- C:01 U:06 P:8A
V:8086 D:27C5 S:00000000 B:0 E:07 F:1 I:00 N:- C:01 U:01 P:8A

程序中要先查找完整的,找到就设变量,如果没有找到再找另一个.若还没有找到就不管.
查找顺序
PCI\VEN_V:&DEV_D:&CC_C:U:

PCI\VEN_V:&DEV_D:


如果找到就将后面的值添加到变量PCI中(重复不计),不要引号.
PCI=DEV0 DEV1 DEV2 ....


如上例子,得到的变量要为
PCI=iaStor78 IASTOR70

希望有高人可以出手帮忙....

之前使用的SCANPCI,有些会检测不到,所以才想用这个.



[ 本帖最后由 chenall 于 2008-12-9 19:37 编辑 ]

pci.rar

12.44 KB, 下载次数: 261, 下载积分: 无忧币 -2

63#
发表于 2010-11-30 12:08:52 | 只看该作者
都是高手,可惜源码贴出来也看不懂,好多年没有用汇编了.
回复

使用道具 举报

62#
发表于 2008-6-14 23:27:31 | 只看该作者
顶一下,这样的帖子看起来才起劲!呵呵
回复

使用道具 举报

61#
发表于 2008-5-8 22:44:21 | 只看该作者
真正的高手才能做底层的驱动,顶一下
回复

使用道具 举报

60#
发表于 2008-5-8 14:22:40 | 只看该作者
頂,不能讓它沉下去
回复

使用道具 举报

59#
发表于 2008-5-6 19:39:01 | 只看该作者
原帖由 netwinxp 于 2008-5-6 05:15 PM 发表
除非用户一条一条地输入硬件记录(更麻烦),否则$确实不好处理。

这样吧:
由程序处理用户输入的文本文件为#54楼硬件库:
PCI\VEN_10DE&DEV_00E5="pciide";CK8S PATA

GenNvRaidDisk="nvraid"
*_NVRAIDBUS="nvraid"
PCI\VEN_10DE&DEV_00E3="nvatabus";CK8S SATA



;空一行或多行
GenNvRaidDisk="nvraid"
*_NVRAIDBUS="nvraid"
PCI\VEN_10DE&DEV_00EE="nvatabus";CK8S SATA

PCI\VEN_10DE&DEV_0265="pciide";MCP51 PATA

SCSI\NVIDIA__Raid_Disk________="nvrd32"
SCSI\__NVIDIA_______Raid_Disk="nvrd32"
SCSI\NVIDIA__Raid_Disk_20_____="nvrd32"
SCSI\__NVIDIA____Raid_Disk_20="nvrd32"
*NVRAID20="nvrd32"
*NVRAIDBUS="nvraid32"
*_NVRAIDBUS="nvraid32"
GenNvRaidDisk="nvraid32"
PCI\VEN_10DE&DEV_0266="nvgts";MCP51 SATA

SCSI\NVIDIA__Raid_Disk________="nvrd32"
SCSI\__NVIDIA_______Raid_Disk="nvrd32"
SCSI\NVIDIA__Raid_Disk_20_____="nvrd32"
SCSI\__NVIDIA____Raid_Disk_20="nvrd32"
*NVRAID20="nvrd32"
*NVRAIDBUS="nvraid32"
*_NVRAIDBUS="nvraid32"
GenNvRaidDisk="nvraid32"
PCI\VEN_10DE&DEV_0267="nvgts";MCP51 SATA

这样可读性强些吧。没弄汇编,对回车换行、$不好理解的。
回复

使用道具 举报

58#
发表于 2008-5-6 17:15:56 | 只看该作者
用户不必输入$更好,还有,允许用户输入空行、注释,程序负责处理。
其实编辑功能就用记事本等编辑器好了(格式符合用户习惯),程序只负责文件转换就行了。

除非用户一条一条地输入硬件记录(更麻烦),否则$确实不好处理。

[ 本帖最后由 netwinxp 于 2008-5-6 05:19 PM 编辑 ]
回复

使用道具 举报

57#
发表于 2008-5-6 17:05:06 | 只看该作者
$ 是没有规律的,
回复

使用道具 举报

56#
发表于 2008-5-6 13:41:17 | 只看该作者

一点建议

原帖由 jianliulin 于 2008-5-6 09:16 AM 发表
感谢lz的指点,本人写了一个方便编辑CHKPCI.COM 的工具。

用户不必输入$更好,还有,允许用户输入空行、注释,程序负责处理。
其实编辑功能就用记事本等编辑器好了(格式符合用户习惯),程序只负责文件转换就行了。
回复

使用道具 举报

55#
发表于 2008-5-6 09:16:58 | 只看该作者
感谢lz的指点,本人写了一个方便编辑CHKPCI.COM 的工具。

下载连接:
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=125193&extra=page%3D2&frombbs=1

未命名.JPG (19.79 KB, 下载次数: 76)

未命名.JPG
回复

使用道具 举报

54#
发表于 2008-5-5 20:10:20 | 只看该作者
每个硬件记录应该以$结尾($要写在回车换行的后面,也就是下一行的最开头,下一条记录才不会和这条跑到一行上),所有记录完毕以后添加ASC(FF)结束。还有PCI\CC_0607="pcmcia"重复记录是没必要的,下面是帮你改好的。
PCI\CC_0604="pci"
$PCI\CC_0601="isapnp"
$PCI\VEN_8086&DEV_24CA="intelide"
$PCI\CC_0607="pcmcia"
$

PCI\CC_0607="pcmcia"多的一行可以删除。
我举一个支持nforce3-250和MCP51驱动的例子:
从nv的磁盘驱动我们可以看到,CK8S需要的驱动是:
PCI\VEN_10DE&DEV_00E5="pciide";CK8S PATA
GenNvRaidDisk="nvraid"
*_NVRAIDBUS="nvraid"
PCI\VEN_10DE&DEV_00E3="nvatabus";CK8S SATA
PCI\VEN_10DE&DEV_00EE="nvatabus";CK8S SATA

而MCP51的驱动是:
PCI\VEN_10DE&DEV_0265="pciide";MCP51 PATA
SCSI\NVIDIA__Raid_Disk________="nvrd32"
SCSI\__NVIDIA_______Raid_Disk="nvrd32"
SCSI\NVIDIA__Raid_Disk_20_____="nvrd32"
SCSI\__NVIDIA____Raid_Disk_20="nvrd32"
*NVRAID20="nvrd32"
*NVRAIDBUS="nvraid32"
*_NVRAIDBUS="nvraid32"
GenNvRaidDisk="nvraid32"
PCI\VEN_10DE&DEV_0266="nvgts";MCP51 SATA
PCI\VEN_10DE&DEV_0267="nvgts";MCP51 SATA

很显然,如果按传统的办法,*_NVRAIDBUS、GenNvRaidDisk存在冲突,如果我们按下面填好硬件库:
PCI\VEN_10DE&DEV_00E5="pciide";CK8S PATA
$GenNvRaidDisk="nvraid"
*_NVRAIDBUS="nvraid"
PCI\VEN_10DE&DEV_00E3="nvatabus";CK8S SATA
$GenNvRaidDisk="nvraid"
*_NVRAIDBUS="nvraid"
PCI\VEN_10DE&DEV_00EE="nvatabus";CK8S SATA
$PCI\VEN_10DE&DEV_0265="pciide";MCP51 PATA
$SCSI\NVIDIA__Raid_Disk________="nvrd32"
SCSI\__NVIDIA_______Raid_Disk="nvrd32"
SCSI\NVIDIA__Raid_Disk_20_____="nvrd32"
SCSI\__NVIDIA____Raid_Disk_20="nvrd32"
*NVRAID20="nvrd32"
*NVRAIDBUS="nvraid32"
*_NVRAIDBUS="nvraid32"
GenNvRaidDisk="nvraid32"
PCI\VEN_10DE&DEV_0266="nvgts";MCP51 SATA
$SCSI\NVIDIA__Raid_Disk________="nvrd32"
SCSI\__NVIDIA_______Raid_Disk="nvrd32"
SCSI\NVIDIA__Raid_Disk_20_____="nvrd32"
SCSI\__NVIDIA____Raid_Disk_20="nvrd32"
*NVRAID20="nvrd32"
*NVRAIDBUS="nvraid32"
*_NVRAIDBUS="nvraid32"
GenNvRaidDisk="nvraid32"
PCI\VEN_10DE&DEV_0267="nvgts";MCP51 SATA
$

那么就会根据具体硬件生成不同的内容,从而避开可能存在的冲突。
当然,象SIS的PATA(5513),一个HWID代表多种不一样的硬件,而且他自家驱动程序没法通用,我们只能让它使用通用的驱动"pciide",再次BS SIS*_*

[ 本帖最后由 netwinxp 于 2008-5-5 08:53 PM 编辑 ]

CHKPCI3.rar

541 Bytes, 下载次数: 60, 下载积分: 无忧币 -2

已修改好的

回复

使用道具 举报

53#
发表于 2008-5-5 18:26:23 | 只看该作者
请netwinxp (爱吃水煮活鱼^_^) 帮我看看我这个为什么不行,是那里弄错?谢谢

PCI\CC_0604="pci"
PCI\CC_0601="isapnp"
PCI\VEN_8086&DEV_24CA="intelide"
PCI\CC_0607="pcmcia"
PCI\CC_0607="pcmcia"

以上是用CHKPCI1.COM 在dos下显示的结果,我修改过的什么也不显示。

CHKPCI2.rar

544 Bytes, 下载次数: 75, 下载积分: 无忧币 -2

回复

使用道具 举报

52#
发表于 2008-5-5 14:11:08 | 只看该作者
很好,就是这个意思。你可以大胆地修改chkpci.com,其实你可以把HWDBSTART:后面的全部切掉,保存为CHKPCI.BIN然后和硬件库的hwid.txt COPY /B成一个(hwid.txt放后面),最后用UE等再在最后面加一个字节FF(字符串匹配搜索结束标志)即可定制自己的CHKPCI.COM(记得.COM文件的总长度限制64K)。可以自由修改这也是为什么采用.COM的原因。
另外,如果证实Intel新方案没问题的话,可以去掉Iastor78.sys。还有,VLATENCY.SYS是在regsetup.hiv加载,和txtsetup.sif没有关系,所以建议直接放到system32\drivers里面。via sata已经暂时改成pciide了(我怀疑和nvgts一样,要在注册表加pnpinterface,但还没得到证实,当然用pciide应该可以直接驱动,只不过性能有可能会有所降低),vibus和ViPrt可以去掉了。

[ 本帖最后由 netwinxp 于 2008-5-5 02:18 PM 编辑 ]
回复

使用道具 举报

51#
 楼主| 发表于 2008-5-5 13:55:33 | 只看该作者
先上传一个试试,
直接使用44楼的驱动库,未经修改.所以只支持一部份驱动.
下载
SCSI.RAR
回复

使用道具 举报

50#
发表于 2008-5-5 11:23:17 | 只看该作者
只运行于真正的DOS,第一个不包含硬件库,所以不会显示任何东西(主要方便YY硬件库),第二个带一些不全的磁盘HWID硬件库,可以检测并显示我的那个磁盘方案里面的冬冬(做样本实例)。

[ 本帖最后由 netwinxp 于 2008-5-5 11:28 AM 编辑 ]
回复

使用道具 举报

49#
发表于 2008-5-5 10:05:02 | 只看该作者
强人。下载测试、是dos下运行的吧。
回复

使用道具 举报

48#
发表于 2008-5-5 00:43:44 | 只看该作者
原帖由 chenall 于 2008-5-5 00:15 发表
不支持PCI 2.0?
有办法支持吗?不支这个影响到哪一类的主板?

也就是PCI2.0以下的主板你需要拷贝一个准备好的txtsetup.sif,只要是奔腾以上级的主板都支持,基本上只有486、5s86这级别的主板才不支持。简单地说Intel 430LX、VIA VP2、AMD 750、SIS5591级以上的主板都支持。

[ 本帖最后由 netwinxp 于 2008-5-5 01:01 AM 编辑 ]
回复

使用道具 举报

47#
 楼主| 发表于 2008-5-5 00:15:38 | 只看该作者
不支持PCI 2.0?有办法支持吗?不知这个影响到哪一类的主板?

先试试看。

[ 本帖最后由 chenall 于 2008-5-5 01:26 AM 编辑 ]
回复

使用道具 举报

46#
发表于 2008-5-4 21:57:17 | 只看该作者
原帖由 chenall 于 2008-5-4 21:55 发表
先收下了,先用你的磁盘方案搞一个SCSI.img出来。

你还要再补充一些,我的只有常见芯片组的冬冬(别的还没整理完)。
另外,记得批处理errorlevel=1的情况(不支持PCI 2.0)
CPU肯定是没问题了(我不通过ACPI取得),就剩ACPI没消化完。

[ 本帖最后由 netwinxp 于 2008-5-4 10:10 PM 编辑 ]
回复

使用道具 举报

45#
 楼主| 发表于 2008-5-4 21:55:48 | 只看该作者
先收下了,先用你的磁盘方案搞一个SCSI.img出来。
展望:下一次推出CPU检测、ACPI检测(正在消化资料中...)

这个也实现了就...。。,期待。

[ 本帖最后由 chenall 于 2008-5-4 09:56 PM 编辑 ]
回复

使用道具 举报

44#
发表于 2008-5-4 21:22:49 | 只看该作者

最终方案

化繁为简,不再显示未知设备,把主动权交给定制者。
由于.COM文件头为空,所以你可以用UE等(开16进制)在HWDBSTART:后面直接插入硬件库(切记总长度不能超过64K-256)。
硬件库太大放不下怎么办?多弄几个CHKPCI.COM,把硬件库分开放。
硬件库规则前面已经说过了。
===================
目前只支持4位Classid,下一版本支持6位。
由于是针对特定硬件生成信息,真正彻底解决nv raid驱动。
展望:下一次推出CPU检测、ACPI检测(正在消化资料中...)

[ 本帖最后由 netwinxp 于 2008-5-4 09:34 PM 编辑 ]

CHKPCI.rar

476 Bytes, 下载次数: 112, 下载积分: 无忧币 -2

空硬件库,方便定制

CHKPCI1.rar

1.68 KB, 下载次数: 118, 下载积分: 无忧币 -2

已加入我的磁盘方案的样本

回复

使用道具 举报

43#
 楼主| 发表于 2008-5-1 10:16:08 | 只看该作者
这样也行,真的很暴力.
等下再试试看.
回复

使用道具 举报

42#
发表于 2008-5-1 06:05:16 | 只看该作者
要知道DOS的环境块容量是很小的。为何舍近尔求远呢?
;标准IDE控制器
echo PCI\CC_0101="PCIIDE" >>X:\WXPE\txtsetup.sif
copy /y pciide.sy? X:\wxpe\system32\drivers\.
call pciide.bat
$

这也算一条硬件记录,匹配依据CC_0101(不匹配的硬件是不会显示上面4行滴),是不是很暴力?
只要你表影响匹配硬件的判断依据,硬件记录要怎么写你可以随意发挥的。
*总体来说保留字为$、CC_(前面最少还要有一个任意字符,凑足4字节)、VEN_、DEV_、SYS_、REV_、_(其实_不算保留字,但会稍微影响匹配速度),你的硬件记录除了hwid判断字串外,其他得不能包含这些保留字。

[ 本帖最后由 netwinxp 于 2008-5-1 06:39 AM 编辑 ]
回复

使用道具 举报

41#
 楼主| 发表于 2008-4-30 23:09:10 | 只看该作者
试了下,不错。虽然是半成品,也比SCANPCI好用多了。

希望再加一个将找到(匹配的)的值设为DOS变量的功能(虽然用批处理可以实现,但如果程序中直接实现会更方便)
如下。
PCI\VEN_104B&DEV_1040="VMSCSI"
PCI\VEN_8086&DEV_7111="intelide"
就设一个变量PCI=VMSCSI INTELIDE
若不处理“”也可以直接PCI="VMSCSI" "INTELIDE"
方便直接在批处理中调用,而不用再根据结果进行转换。
回复

使用道具 举报

40#
发表于 2008-4-30 21:29:54 | 只看该作者
以前学过点皮毛,就不献丑了,还是让高手看看吧
回复

使用道具 举报

39#
发表于 2008-4-30 21:23:07 | 只看该作者
很不错。。。。。。。摸摸很仔细
回复

使用道具 举报

38#
发表于 2008-4-30 20:59:26 | 只看该作者
原帖由 pseudo 于 2008-4-30 19:48 发表
PCI\VEN_104B&DEV_1040&SUBSYS_1040104B&CC_010000&REV_01="unknowhw"
-->
PCI\VEN_104B&DEV_1040&SUBSYS_1040104B&CC_010000&REV_01="VMSCSI"

没加入硬件库,目前只加了我的磁盘方案里面的冬冬。在硬件库里面找不到匹配的就会显示完整的hwid和"unknowhw"(未知硬件),匹配到的话就显示那条记录的内容(可以有多行,能解决nv问题),匹配方式为首条匹配(找到匹配记录后就停止继续匹配开始查找下一硬件),硬件库可以用UE自行YY。
下面是vpc的检测结果。那条全零的好像VM也有,我怀疑是用来和宿主机沟通的某种虚拟设备。

[ 本帖最后由 netwinxp 于 2008-4-30 09:15 PM 编辑 ]

vpc.PNG (23.8 KB, 下载次数: 83)

vpc.PNG
回复

使用道具 举报

37#
发表于 2008-4-30 19:48:18 | 只看该作者
PCI\VEN_104B&DEV_1040&SUBSYS_1040104B&CC_010000&REV_01="unknowhw"
-->
PCI\VEN_104B&DEV_1040&SUBSYS_1040104B&CC_010000&REV_01="VMSCSI"
回复

使用道具 举报

36#
发表于 2008-4-30 16:01:46 | 只看该作者
太good了,功德无量呀。
回复

使用道具 举报

35#
发表于 2008-4-30 12:44:53 | 只看该作者
快好了...上礼拜帮别人装5、6台机子所以落下来了-_-!!
事实上,只剩下命令行参数屏蔽其它硬件显示没做好而已,你可以44这个半成品。
硬件库从HWDBSTART:后面开始,FF字符结束,硬件HWID必须为大写字符(为了简化编程),每条硬件记录以$结尾(方便直接显示你的记录字串,可以有多行),所有硬件记录完成后用FF结尾(提高搜索速度,另外文件结尾字节请填写FF防止程序飞掉),还有"VEN_"、"DEV_"等硬件识别字串为保留字(如果有可能尽量避免在HWID外面用_提高匹配速度),仅用在HWID里面。CC_ID只识别前面四个字符(事实上后面两位从来没被用来区分不同硬件),文件大小暂时定为32K-256字节(其实COM文件你可以自己加长,但不能超过64K-256字节),其实程序才几百字节,主要空间保留来填写硬件库(已经内置了我的磁盘方案,NV的暂时未完全处理好),你可以用UE来修改硬件库,修改时注意遵守以上原则。
下面是在我机子上监测的结果:
...
PCI\VEN_10DE&DEV_006A&SUBSYS_10001695&CC_040100&REV_A1="unknowhw"
PCI\VEN_10DE&DEV_006C&SUBSYS_00000000&CC_060400&REV_A3="unknowhw"
PCI\VEN_10DE&DEV_0065="pciide"
PCI\VEN_10DE&DEV_006E&SUBSYS_10001695&CC_0C0010&REV_A3="unknowhw"
PCI\VEN_10DE&DEV_01E8&SUBSYS_00000000&CC_060400&REV_A2="unknowhw"
...

顺便贴上源代码:
  1. ;FileName:SCANPCI.ASM
  2. .model tiny
  3. .386
  4. code segment
  5. assume cs:code,ds:code,es:code
  6. org 81H
  7. cmdline db   126 dup(?)
  8. org 100H
  9. START: mov  ax,cs
  10. mov  ds,ax
  11. mov  es,ax
  12. mov  ax,0B101H;支持PCI 2.0?
  13. int  1AH
  14. jc   PCIERR;否
  15. cmp  ah,0
  16. jne  PCIERR;否
  17. cmp  edx,' ICP'
  18. jne  PCIERR;否
  19. ;========读取PCI配置空间数据
  20. mov  ecx,7FFFFF00H
  21. READPCI:add  ecx,100H
  22. cmp  ecx,80FFFF00H;全读完了?
  23. jnb  EXIT;是
  24. mov  dx,0CF8H
  25. mov  eax,ecx
  26. out  dx,eax
  27. mov  dx,0CFCH
  28. in   eax,dx
  29. cmp  eax,0FFFFFFFFH;无效设备?
  30. je   READPCI;是
  31. push ecx
  32. mov  di,offset venid
  33. cld
  34. PCISTR: mov  eax,ecx
  35. mov  dx,0CF8H
  36. out  dx,eax
  37. mov  dx,0CFCH
  38. insd;后面为啥要对齐4的倍数,主要就是防止本指令被掰成2或4个内存访问周期。
  39. add  cl,4
  40. cmp  cl,0FCH;读完256字节数据?
  41. jb   PCISTR;否
  42. ;=======查找匹配的记录
  43. mov  bx,offset hwdb
  44. L0: xor  di,di;指向新记录首字节
  45. mov  chkok,di;匹配标志清零
  46. L1: mov  al,[bx][di]
  47. cmp  al,0FFH;读完所有记录?
  48. je   UNKNOW;是
  49. mov  dx,chkok
  50. cmp  al,'$';本记录尾部?
  51. jne  L3;否
  52. cmp  dx,1;该记录匹配?
  53. jne  L2;否
  54. mov  dx,bx
  55. jmp  DISP
  56. L2: inc  di
  57. add  bx,di;bx指向下一记录
  58. jmp  L0
  59. L3: cmp  dx,0FFFFH;本记录不匹配?
  60. jne  L5;否。是的话直到下一条记录之前不再进行匹配尝试
  61. L4: inc  di
  62. jmp  L1
  63. L5: cmp  al,'_';有可能是硬件信息?
  64. jne  L4;否
  65. mov  eax,[bx][di-3]
  66. cmp  eax,'_NEV';后面的是VEN信息?
  67. je   CHKVEN
  68. cmp  eax,'_VED';后面的是DEV信息?
  69. je   CHKDEV
  70. cmp  eax,'_SYS';后面的是SUBSYS信息?
  71. je   CHKSUB
  72. cmp  eax,'_VER';后面的是REV信息?
  73. je   CHKREV
  74. and  eax,0FFFFFF00H
  75. cmp  eax,5F434300H;高三位为'_CC';后面的是CLASS信息?
  76. jne  L4;都不是
  77. CHKCC: mov  eax,[bx][di+1]
  78. call asctohex
  79. mov  cx,classid
  80. cmp  ax,cx
  81. jz   L12
  82. jmp  L11
  83. CHKVEN: mov  eax,[bx][di+1]
  84. call asctohex
  85. mov  cx,venid
  86. cmp  ax,cx;与检测到的venid比较
  87. jz   L12
  88. jmp  L11
  89. CHKDEV: mov  eax,[bx][di+1]
  90. call asctohex
  91. mov  cx,devid
  92. cmp  ax,cx;与检测到的devid比较
  93. jz   L12
  94. jmp  L11
  95. CHKSUB: mov  eax,[bx][di+5]
  96. call asctohex
  97. push di
  98. mov  di,offset subsys
  99. mov  cx,[di]
  100. pop  di
  101. cmp  ax,cx;与检测到的subvid比较
  102. jnz  L11
  103. mov  eax,[bx][di+1]
  104. call asctohex
  105. push di
  106. mov  di,offset subsys
  107. mov  cx,[di+2]
  108. pop  di
  109. cmp  ax,cx;与检测到的subdid比较
  110. jnz  L11
  111. jmp  L12
  112. CHKREV: mov  eax,30303030H;为了兼容子过程的处理
  113. mov  ax,[bx][di+1]
  114. call asctohex
  115. mov  cl,revid
  116. cmp  ah,cl;与检测到的rid比较
  117. jz   L12
  118. L11: mov  dx,0FFFFH
  119. mov  chkok,dx;填充不匹配标志
  120. jmp  L4
  121. L12: mov  dx,1;填充匹配标志
  122. mov  chkok,dx
  123. jmp  L4
  124. ;=======没有匹配记录则生成并显示未知硬件
  125. UNKNOW: mov  di,offset msg
  126. mov  ax,venid
  127. mov  dx,ax
  128. mov  al,ah
  129. call hextoasc
  130. mov  [di+8],ax
  131. mov  ax,dx
  132. call hextoasc
  133. mov  [di+10],ax
  134. mov  ax,devid
  135. mov  dx,ax
  136. mov  al,ah
  137. call hextoasc
  138. mov  [di+17],ax
  139. mov  ax,dx
  140. call hextoasc
  141. mov  [di+19],ax
  142. mov  ax,classid
  143. mov  dx,ax
  144. mov  al,ah
  145. call hextoasc
  146. mov  [di+41],ax
  147. mov  ax,dx
  148. call hextoasc
  149. mov  [di+43],ax
  150. mov  al,revid
  151. call hextoasc
  152. mov  [di+52],ax
  153. mov  al,progif
  154. call hextoasc
  155. mov  [di+45],ax
  156. mov  eax,subsys
  157. mov  edx,eax
  158. shr  eax,24
  159. call hextoasc
  160. mov  [di+29],ax
  161. mov  eax,edx
  162. shr  eax,16
  163. call hextoasc
  164. mov  [di+31],ax
  165. mov  eax,edx
  166. shr  eax,8
  167. call hextoasc
  168. mov  [di+33],ax
  169. mov  eax,edx
  170. call hextoasc
  171. mov  [di+35],ax;循环的效率没有更高,所以直接写
  172. mov  dx,offset msg
  173. DISP: mov  ah,9
  174. int  21H
  175. pop  ecx
  176. jmp  READPCI
  177. EXIT: mov  ax,4C00H
  178. int  21H
  179. PCIERR: mov  ax,4C01H;非PCI2.0以上版本返回ERRORLEVEL=1
  180. int  21H
  181. ;把al的数据转换成双字节HEX字符串
  182. hextoasc proc near
  183. ;输入:al待转换值
  184. ;返回:ax
  185. push bx
  186. mov  bx,offset hextab
  187. mov  ah,al
  188. and  al,0FH
  189. xlat
  190. xchg al,ah
  191. and  al,0F0H
  192. shr  al,4
  193. xlat
  194. pop  bx
  195. ret
  196. hextab  db   '0123456789ABCDEF'
  197. hextoasc endp
  198. ;把eax的四字节HEX字符串转换成ax数据
  199. asctohex proc near;会破坏edx、ecx、eax内容
  200. ;输入:eax待转换值
  201. ;返回:ax
  202. push bx
  203. mov  cx,4
  204. mov  edx,eax
  205. xor  eax,eax
  206. S11: mov  bl,dl
  207. cmp  bl,'9';不做更多判断请务必保证字串由'0-9、A-F、a-f'组成
  208. jbe  S12
  209. and  bx,0DFH;转大写字母
  210. sub  bl,7
  211. S12:and  bl,0FH
  212. shl  ax,4
  213. add  al,bl
  214. shr  edx,8
  215. loop S11
  216. pop  bx
  217. ret
  218. asctohex endp
  219. ; db 'X';用来使后面对齐4的倍数
  220. venid  dw   0;pcicfg offset 00H
  221. devid  dw   0;pcicfg offset 02H
  222. command_reg dw   0
  223. status_reg dw   0
  224. revid  db   0;pcicfg offset 08H
  225. progif  db   0;pcicfg offset 09H
  226. classid  dw   0;pcicfg offset 0AH
  227. cacheline_size db   0
  228. latency  db   0
  229. headtype db   0;pcicfg offset 0EH,=00时SUBSYS有效
  230. bist  db   0
  231. baseaddr0 dd   0
  232. baseaddr1 dd   0
  233. baseaddr2 dd   0
  234. baseaddr3 dd   0
  235. baseaddr4 dd   0
  236. baseaddr5 dd   0
  237. cardbus_cis dd   0
  238. subsys  dd   0;pcicfg offset 2CH
  239. expansion_ROM dd   0
  240. cap_ptr  db   0
  241. reserved1 db   3 dup(0)
  242. reserved2 dd   0
  243. interrupt_line db   0
  244. interrupt_pin   db   0
  245. min_grant db   0
  246. max_latency db   0
  247. specific db   192 dup(0)
  248. msg db   'PCI\VEN_0000&DEV_0000&SUBSYS_00000000&CC_000000&REV_00="unknowhw"',0DH,0AH,'$'
  249. chkok   dw 0;匹配判定标志
  250. ;tmpstr   db 30H,30H,30H,30H,0DH,0AH,'$';调试用
  251. hwdbstart db 'HWDBSTART:'
  252. hwdb   db 31607 dup(' ')
  253. hwdbend   db 0FFH
  254. code ends
  255. end START
复制代码
仅对两个子过程比较满意。

[ 本帖最后由 netwinxp 于 2008-5-1 02:28 AM 编辑 ]

PCISCAN.RAR

1.89 KB, 下载次数: 133, 下载积分: 无忧币 -2

带磁盘库的PCI硬件扫描

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-12 06:26

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表