无忧启动论坛

标题: [求助]会PASCAL的请进.请帮忙改写一个程序[已解决] [打印本页]

作者: chenall    时间: 2008-4-12 01:33
标题: [求助]会PASCAL的请进.请帮忙改写一个程序[已解决]
附件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


作者: 老九老毛桃粉丝    时间: 2008-4-12 07:02
高手辛苦了,不懂P语言,只懂点C
void GetStrStr(char* pcImport,char *pcStart,char cEnd,char *pcExport)
{
pcExport[0]=0;
//略..................
}
//s1 s2 略.............
char pcJ[256],pcV2[256],pcD2[256],pcC2[256],pcU2[256],pcV[256],pcD[256],pcC[256],pcU[256];
GetStrStr(s1,"V:",0x20,pcV);
GetStrStr(s1,"D:",0x20,pcD);
GetStrStr(s1,"C:",0x20,pcC);
GetStrStr(s1,"U:",0x20,pcU);
GetStrStr(s2,"PCI\\VEN_",'&',pcV2);
GetStrStr(s2,"DEV_",'=',pcD2);
GetStrStr(s2,"&CC_",'=',pcC2);
pcU2[0]=pcC2[2];pcU2[1]=pcC2[3];pcU2[2]=0;pcC2[2]=0;
GetStrStr(s2,"=\"",'\"',pcJ);
//略...........................

[ 本帖最后由 老九老毛桃粉丝 于 2008-4-12 07:07 AM 编辑 ]
作者: neo4026    时间: 2008-4-12 07:30
以前玩过oi , free pascal和turbo pascal都会
今晚回家写给你
作者: netwinxp    时间: 2008-4-12 07:52
那个源代码看得晕晕乎乎的,连是否有PCI都没检测@_@
PCI设备检测方法:
;该代码只是几个片断,自己组织去。
.386
;================
MajorRevision       db      0;PCI主版本
MinorRevision       db      0;PCI从版本
NumBuses           db      0;总线数,一般不大于16
HWMechanism     db      0;硬件机制
Buffer                 db xxxx DUP(0);xxxx自己设
;=================
;检查是否支持PCI
mov  ax,0B101h
int   1ah
jc    oldtest
cmp  ah,0
jne   oldtest
cmp  edx," ICP"
jne   pciIDfailed
mov  MajorRevision,dh
mov  MinorRevision,dl
mov  HwMechanism,al
inc   cl
mov  numBuses,cl
...
;PCI1.0检测方法
oldtest:
mov  ax,0B001h
int   1ah
cmp   dx,"CP"
jne   nopci
cmp   cx," I"
jne   nopci
mov   MajorRevision,ah
mov   MinorRevision,al
mov  al,2
mov  HwMechanism,al
mov  al,1
mov  numBuses,al
;直接用I/O
...
pciIDfailed:
;@_@
nopci:
;其实还有ISAPNP,不管了...
;老老实实用标准硬盘
;...
;大于等于PCI2.0,检测PCI设置空间(具体含义看附图)
;有可能一个CLASS有多个设备,需不断增加SI,直到AH返回86为止。
;参数:
;ECX=CLASS(不大于3字节)
;SI=索引号
;返回:
;C=错误标志,C置位表示出错
;AH=是否存在,00为有,86为没
;BH=总线数;一般如果有多层桥接的话会有多总线。
;BL(bit7~3)=设备数;?插槽号
;BL(bit2~0)=功能数;就像82371AB那个Function,具体含义不清。
mov  ax,0b103h
mov  ecx,010100h;后面两位为可编程接口可能有多种,前面的是CLASS,0104、0106、0180类似。
mov  si,0h
int   1ah
push  bx
...
;读取PCI设置空间数据,(所有设备需要要执行numBuses次,自己去实现)
;读取SUBSYS ID也不难,先读取0E寄存器(BYTE),如果为0,那么2C-2F就是SID,否则它们为00000000。
;B108、B109、B10A功能差不多,只不过读取的分别是BYTE、WORD、DWORD
;参数:
;BL=设备号/功能号
;BH=总线号;0为主板,其他为板卡或板载
;DI=寄存器号
;返回:
;C=错误标志,C置位表示出错
;AH=是成功,00为有,87为错误的寄存器号(下面的攒忽略之)
;ECX、CX、CL=读取的数据
...
pop   bx
lea   si,Buffer
mov  di,00h
mov  ax,0b10Ah
int   1ah
mov  [si],ecx;保存VID和DID
add   si,4
mov  di,0ah
mov  ax,0b109h
int   1ah
mov  [si],cx;保存CLASS(那个可编程接口别管他)
inc   si
inc   si
mov  di,08h
mov  ax,0b108h
int   1ah
mov  [si],cl;保存RID
inc   si
mov  cl,"="
mov  [si],cl;每个设备以=隔开
inc   si
...
;其它类型的类似上面。

标注一下,让大家比较容易看懂:)

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

pciconfig.png (3.36 KB, 下载次数: 105)

附图

附图

82371AB_PCICFG_IDE.PNG (35.8 KB, 下载次数: 108)

82371AB_IDE,和上图接近

82371AB_IDE,和上图接近

作者: lxl1638    时间: 2008-4-12 11:16
看得头晕眼花,也不明楼主要做什么?
作者: chenall    时间: 2008-4-12 11:19
等待neo4026 的好消息.这里先谢了.

to netwinxp
这些代码是从上面的网址上下载的,附件的代码我删除了一些我认为没有用的东西.编译后由原来的80KB,现在只有12KB.(应还可以小).

The current release version of PCI now features classic PCI Specification Version 3.0 support, including all 140 device class/subclass/programming interface codes, PCI Express support, much improved power management  reporting, as well as  many bug fixes and code cleanups.

至于检测PCI,应该就是下面这一段吧.
呵呵.我不懂这些.
对编程我还是刚入门的.汇编的根本就看不懂.其它的看得懂一点.

if test8086<2 then
begin
writeln('PCI Halted:');
writeln;
writeln('The PC Must be at least a 386 to possibly have a PCI or AGP bus!');
halt(1);
end;

{ Look for PCI BIOS }

asm
mov ax,$b101
int $1a
jc @exit

{ check signature bytes OK }
cmp dx,$4350
jne @exit

{ check no error code returned > AH=00=Success }
cmp ah,0
jne @exit

mov PCIchar,al
mov PCI_hibus,cl
mov PCIverlo,bl
mov PCIverhi,bh
mov failed,false

@exit:
end;

if failed then
begin
writeln('PCI Halted:');
writeln;
writeln('No PCI BIOS was detected! (NB: I don''t work under Windows NT/2000/XP/2003 etc!)');
writeln;
writeln('For PCI reports under Win NT-era OS''s such as NT/2K/XP/2K3, use PCI32.EXE');
writeln('which is available from the same website as this program (See PCI /? for the');
writeln('website address.)');
writeln;
halt(2);
end;



{ OK, we have PCI... do our stuff.. }

作者: chenall    时间: 2008-4-12 11:23
原帖由 lxl1638 于 2008-4-12 11:16 发表
看得头晕眼花,也不明楼主要做什么?


只要根据上面的程序输出的结果读取一个类似于TXTSETUP.SIF文件,将得到的值设为变量就好了.
若能修改程序直接得到结果最好了,否则只好配合其它DOS工具来实现
作者: netwinxp    时间: 2008-4-12 12:18
原帖由 chenall 于 2008-4-12 11:19 发表
等待neo4026 的好消息.这里先谢了.

to netwinxp
这些代码是从上面的网址上下载的,附件的代码我删除了一些我认为没有用的东西.编译后由原来的80KB,现在只有12KB.(应还可以小).


至于检测PCI,应该就是下 ...

这个不就是C语言嵌入汇编,同样是调用INT 1AH的B0和B1号功能,只是判断一下CLASS,没有读取PCI配置块,得不到VEN ID和DEV ID,那个PASCAL同样是嵌入汇编,用0CF8 I/O读(直接改自别人的C源代码,俺终于看明白了那一大堆0x66了),兼容性可能不太好(外插卡、PCMCIA卡的可能读不到),事实上NTDETECT也是用INT 1A而不是直接I/O(详见NT Source:hwpci.inc、hwdetect.c、hwpcia.asm)。Buffer里面的每个块的00-01H就是16进制的Vendor ID,02-03H就是Device ID,如果把BL&F8然后右移3位保存起来还可以知道挂接的营盘个数,然后用INT 21H 09号功能输出(可以转向)。与硬件打交道用其他语言麻烦太多。
另外用设置环境变量很麻烦(DOS内存环境块受限制不能太大),你直接把txtsetup.sif的[HardwareIdsDatabase]放到最后,然后用>>txtsetup.sif,追加到后面不是更理想?
比如检测到CC_0101设备VEN_8086&DEV_27C0那就输出PCI\VEN_8086&DEV_26C0&CC_0101="808627C0",酱紫还不用查表,你只要修改设置好
[BusExtenders.Load]
808627C0=intelide.sys
[BusExtenders]
808627C0="Intel SATA Controller",files.intelide,808627C0
[files.intelide]
intelide.sys,4
pciidex.sys,4

不过这两个字段会变得很长:)

[ 本帖最后由 netwinxp 于 2008-4-13 05:02 AM 编辑 ]
作者: neo4026    时间: 2008-4-12 12:45
修改dos变量的话要回去查查
uses dos;
的详细ooxx

先做着输出这个变量
作者: neo4026    时间: 2008-4-12 21:38
to chenall:
完工后拿去编译 突然想起dos有640k限制 编译不了 要修改算法
(现在的是读入整个txtsetup.sif)
要改成读一个扔一个 可能要下周回家才能给你
作者: chenall    时间: 2008-4-12 23:31
等你好消息,我也要下星期二才比较有时间,现在用手机上的论坛。
作者: netwinxp    时间: 2008-4-13 17:42
原帖由 neo4026 于 2008-4-12 21:38 发表
to chenall:
完工后拿去编译 突然想起dos有640k限制 编译不了 要修改算法
(现在的是读入整个txtsetup.sif)
要改成读一个扔一个 可能要下周回家才能给你

>640K@_@
有理由相信10K以内可以搞定这还包括2K的堆栈(PCI BIOS功能调用里面有说明需要不少于1K的堆栈)和4K数据库,不依靠其他文件*^_^*,设备字串处理和输出还在思考中...
;FileName:SCANHD.ASM
.model tiny
.386
code segment
        assume cs:code,ds:code,es:code
start: mov  ax,cs
        mov  ds,ax
        mov  es,ax
;检测PCI 2.0
        mov  ax,0B101H
        int  1AH
        jc   pcierr
        cmp  ah,0
        jne  pcierr
        cmp  edx.' ICP'
        jne  pcierror
        mov  numbus,cl
        mov  bh,cl
        xor  bl,bl
readpci:shl  bl,3
        mov  si,offset hwlst
        xor  di,di
        mov  ax,0B10AH
        int  1AH
        mov  [si],ECX;取VID&DID
        add  si,4
        mov  bh,numbus
        mov  bl,numdev
        mov  di,8
        mov  ax,0B10AH
        int  1AH
        mov  [si],ecx;取CLASS&REV
        add  si,4
        mov  bh,numbus
        mov  bl,numdev
        mov  di,2CH
        mov  ax,0B10AH
        int  1AH
        mov  [si],ecx;取SUBSYS(不一定有效)
        add  si,4
        mov  bh,numbus
        mov  bl,numdev
        mov  di,0EH
        mov  ax,0B108H
        int  1AH
        mov  [si],cl;00为SUBSYS有效
        mov  si,offset hwlst
;硬件匹配和字符串输出处理,正在调试中...
        mov  bh,numbus
        mov  bl,numdev
        inc  bl
        mov  numdev,bl
        cmp  bl,20H
        jb   readpci;设备号没读完
        cmp  bh,0
        jz   exit;已经读到总线0了
        dec  bh
        mov  numbus,bh
        xor  bl,bl;设备号回0
        mov  numdev,bl
        jmp  readpci
pcierr: mov  ax,4C01H;非PCI2.0以上版本返回ERRORLEVEL=1
        int  21H
exit: mov  ax,4C00H;没问题不返回ERRORLEVEL
        int  21H
numbus      db   0
numdev      db   0
hwlst          db   13dup(0)
msg            db   'PCI\VEN_0000&DEV_0000&SUBSYS_00000000&CC_000000&REV_00=        $'
hwdatasig    db 'hwDataBase:'
hwdatabase db 4096 dup(0);4K的自定义硬件库,格式和txtsetup.sif相同
;但不要回车和换行,每字串以ASC(0)结尾,长度不超过msg长度,用UltraEdit改。
code    ends
end     start

[ 本帖最后由 netwinxp 于 2008-4-23 09:15 AM 编辑 ]
作者: 情留メ蚊子    时间: 2008-4-13 18:44
什么来的~~~~~~~~~
作者: chenall    时间: 2008-4-14 17:02
对编程不太懂,等待成品.,
这样以后自动检测硬盘控制器或其它的像网卡驱动之类的也就方便多了.
作者: chenall    时间: 2008-4-16 14:43
不知搞得怎么样了?
有没有我可以帮忙的...

顺便再说下,检测顺序还是按照WINDOWS的格式来检测比较好.
对这些也不太懂,提供个参考.

例子:
PCI\VEN_1106&DEV_0591&SUBSYS_21711019&REV_80   ;这个好像可以不用,
PCI\VEN_1106&DEV_0591&SUBSYS_21711019
PCI\VEN_1106&DEV_0591&CC_01018F                           ;这个好像也很少用到.
PCI\VEN_1106&DEV_0591&CC_0101
PCI\VEN_1106&DEV_0591&REV_80                               ;应该也可以不用吧.
PCI\VEN_1106&DEV_0591
PCI\VEN_1106&CC_01018F
PCI\VEN_1106&CC_0101
PCI\VEN_1106           ;后面的也都不需要.                        
PCI\CC_01018F
PCI\CC_0101

[ 本帖最后由 chenall 于 2008-4-16 02:49 PM 编辑 ]
作者: neo4026    时间: 2008-4-16 14:55
寒一个 这两天期中考 停工了

就反馈的信息来看 只检测以下俩:
PCI\VEN_1106&DEV_0591&CC_0101
PCI\VEN_1106&DEV_0591
能帮上忙的倒没多少了 但程序也没时间去加强健壮性 所以输入文件格式严谨点
(即等号左右别打空格)
作者: chenall    时间: 2008-4-16 15:14
学习比较重要,这个可以等考完后再弄,

可以先把目前还没有完工的作品上传,我看看能否看得懂.
作者: neo4026    时间: 2008-4-16 15:25
嘿嘿…在学校木电脑…用手机上…
完工的只有转化为标准hwid那段 其它部分都写错del了

剩余的不难 只差读取文件而已
作者: netwinxp    时间: 2008-4-16 18:13
思路是:
0、检测检查Class是否为01(以后改成与命令行CC参数比较),否转0检测下一硬件,是转1
1、把每条硬件检测结果转成VID、DID、CCID(屏蔽最后一字节)、REV、SID
2、读取硬件库文件的单条记录分拆成VID、DID、CC、REV、SID,没有对应字符的不填写
3、把已经拆好硬件库记录具有的字段与硬件检测结果匹配,没有的字段不参与匹配。全匹配成功则输出(PCI\VID&DID&SID&CC&REV=硬件库纪录"="后面的冬冬),然后返回1、检测下一硬件;有匹配失败则返回2、读取下一条记录。
4、整个硬件库没找到匹配纪录输出PCI\VID&DID&SID&CC&REV="unknow"
*酱紫的好处是只会把检测到的硬件使用第一条匹配到的硬件库纪录*
***刚才发现link.exe版本居然是windows的,好久没用DOS了,居然犯了大错-_-!!***
估计下个礼拜可以完工(这次只检测01类),以后版本再提供命令行输入CC参数

[ 本帖最后由 netwinxp 于 2008-4-16 06:26 PM 编辑 ]
作者: neo4026    时间: 2008-4-16 18:21
猫咪你会的话就你来吧 偶太久没写 思路混乱了
作者: netwinxp    时间: 2008-4-16 18:25
原帖由 neo4026 于 2008-4-16 18:21 发表
猫咪你会的话就你来吧 偶太久没写 思路混乱了

我也好久没弄DOS得咚咚了@_@
作者: nn2nn    时间: 2008-4-17 10:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: chenall    时间: 2008-4-22 18:23
一个星期过去了,差点就找不到这个贴子了.自己再顶一下.
期待楼上几位高手的成品
作者: netwinxp    时间: 2008-4-22 19:22
还没调试好,主要在于反向首次匹配这个算法还没弄好。而且检测结果还有点问题(不知是不是nvSMBUS的问题)
PCI\VEN_10DE&DEV_0312&SUBSYS_00000000&CC_030000&REV_A1="unknowhw";VGA
PCI\VEN_10DE&DEV_01E0&SUBSYS_00000000&CC_060000&REV_A2="unknowhw";PCI2CPU
PCI\VEN_10DE&DEV_01E8&CC_060400="unknowhw";AGP2PCI
PCI\VEN_10DE&DEV_0060&SUBSYS_10001695&CC_060100&REV_A2="unknowhw";PCI2ISA
PCI\VEN_10DE&DEV_0066&SUBSYS_10001695&CC_020000&REV_A2="unknowhw";NET
PCI\VEN_10DE&DEV_006B&SUBSYS_10001695&CC_040100&REV_A2="unknowhw";APU
PCI\VEN_10DE&DEV_006A="unknowhw";SOUND CODE
PCI\VEN_10DE&DEV_006C&SUBSYS_10001695&CC_060400&REV_A3="unknowhw";PCI2PCI
PCI\VEN_10DE&DEV_0065&SUBSYS_10001695&CC_01018A&REV_A2="unknowhw";IDE
PCI\VEN_10DE&DEV_006E="unknowhw";1394
PCI\VEN_10DE&DEV_0067&SUBSYS_10001695&CC_050000&REV_A2="unknowhw";USB
PCI\VEN_FFFF&DEV_FFFF&SUBSYS_10001695&CC_050000&REV_A2="unknowhw";?
PCI\VEN_FFFF&DEV_FFFF&SUBSYS_10001695&CC_0C0310&REV_A3="unknowhw";OHCI USB
PCI\VEN_FFFF&DEV_FFFF&SUBSYS_10001695&CC_0C0310&REV_A3="unknowhw";OHCI USB
PCI\VEN_FFFF&DEV_FFFF&SUBSYS_10001695&CC_0C0320&REV_A3="unknowhw";EHCI USB
...
;及后面是为了方便看手工加上去的。似乎有些冬冬挂到SMBUS(CC_0500)上了,实在不行我也改成用I/O口读*_*

[ 本帖最后由 netwinxp 于 2008-4-22 07:35 PM 编辑 ]
作者: netwinxp    时间: 2008-4-24 11:12
更换新的硬件检测方法,请楼主帮忙检查一下是否会漏检硬件(硬件驱动匹配暂时不让它显示),如果没问题(请回复)那就不准备再更换硬件检测方法了,直接完成那些未完成的部分。
我这里是没问题了,所有pci全检测出来
PCI\VEN_10DE&DEV_01E0&SUBSYS_00000000&CC_060000&REV_A2="unknowhw";cpu2pci
PCI\VEN_10DE&DEV_01EB&SUBSYS_10001695&CC_050000&REV_A2="unknowhw";内存控制器
PCI\VEN_10DE&DEV_01EE&SUBSYS_10001695&CC_050000&REV_A2="unknowhw";内存控制器
PCI\VEN_10DE&DEV_01ED&SUBSYS_10001695&CC_050000&REV_A2="unknowhw";内存控制器
PCI\VEN_10DE&DEV_01EC&SUBSYS_10001695&CC_050000&REV_A2="unknowhw";内存控制器
PCI\VEN_10DE&DEV_01EF&SUBSYS_10001695&CC_050000&REV_A2="unknowhw";内存控制器
PCI\VEN_10DE&DEV_0060&SUBSYS_10001695&CC_060100&REV_A3="unknowhw";pci2isa/lpc
PCI\VEN_10DE&DEV_0064&SUBSYS_10001695&CC_0C0500&REV_A2="unknowhw";system management
PCI\VEN_10DE&DEV_0067&SUBSYS_10001695&CC_0C0310&REV_A3="unknowhw";ohci usb1
PCI\VEN_10DE&DEV_0067&SUBSYS_10001695&CC_0C0310&REV_A3="unknowhw";ohci usb2
PCI\VEN_10DE&DEV_0068&SUBSYS_10001695&CC_0C0320&REV_A3="unknowhw";pci2usb
PCI\VEN_10DE&DEV_0066&SUBSYS_10001695&CC_020000&REV_A1="unknowhw";net
PCI\VEN_10DE&DEV_006B&SUBSYS_10001695&CC_040100&REV_A2="unknowhw";apu
PCI\VEN_10DE&DEV_006A&SUBSYS_10001695&CC_040100&REV_A1="unknowhw";audio code
PCI\VEN_10DE&DEV_006C&SUBSYS_00000000&CC_060400&REV_A3="unknowhw";pci2pci
PCI\VEN_10DE&DEV_0065&SUBSYS_10001695&CC_01018A&REV_A2="unknowhw";pata
PCI\VEN_10DE&DEV_006E&SUBSYS_10001695&CC_0C0010&REV_A3="unknowhw";1394
PCI\VEN_10DE&DEV_01E8&SUBSYS_00000000&CC_060400&REV_A2="unknowhw";agp2pci
PCI\VEN_10DE&DEV_0312&SUBSYS_00000000&CC_030000&REV_A1="unknowhw";vga

[ 本帖最后由 netwinxp 于 2008-4-24 02:51 PM 编辑 ]

s20080424_2.rar

416 Bytes, 下载次数: 95, 下载积分: 无忧币 -2

新一点的版本,仅运行于DOS


作者: chenall    时间: 2008-4-24 12:37
现在用办公室的电脑测了一下,和PCI的结果不太一样.
这个检测的结果比PCI.EXE检测的还多了几条.用VMWARE测试,多了几条VEN_0000&DEV_0000的
先贴上检测结果的对比.

等一下回宿舍再试一下,我宿舍的笔记本,用以前SCANPCI检测会检测不到,用PCI.EXE可以.再试试这个是否可以.

PCI\VEN_1106&DEV_0327&SUBSYS_00000000&CC_060000&REV_00="unknowhw"
PCI\VEN_1106&DEV_1327&SUBSYS_00000000&CC_060000&REV_00="unknowhw"
PCI\VEN_1106&DEV_2327&SUBSYS_00000000&CC_060000&REV_00="unknowhw"
PCI\VEN_1106&DEV_3327&SUBSYS_00000000&CC_060000&REV_00="unknowhw"
PCI\VEN_1106&DEV_4327&SUBSYS_00000000&CC_060000&REV_00="unknowhw"
PCI\VEN_1106&DEV_5327&SUBSYS_00000000&CC_080000&REV_00="unknowhw"
PCI\VEN_1106&DEV_6327&SUBSYS_00000000&CC_060000&REV_00="unknowhw"
PCI\VEN_1106&DEV_7327&SUBSYS_00000000&CC_060000&REV_00="unknowhw"
PCI\VEN_1106&DEV_B198&SUBSYS_00000000&CC_060400&REV_00="unknowhw"
PCI\VEN_1106&DEV_A327&SUBSYS_00000000&CC_060400&REV_00="unknowhw"
PCI\VEN_1106&DEV_C327&SUBSYS_00000000&CC_060400&REV_00="unknowhw"
PCI\VEN_1106&DEV_0591&SUBSYS_00000000&CC_010100&REV_80="unknowhw"
PCI\VEN_1106&DEV_0571&SUBSYS_00000000&CC_010100&REV_07="unknowhw"
PCI\VEN_1106&DEV_3038&SUBSYS_00000000&CC_0C0300&REV_A0="unknowhw"
PCI\VEN_1106&DEV_3038&SUBSYS_00000000&CC_0C0300&REV_A0="unknowhw"
PCI\VEN_1106&DEV_3038&SUBSYS_00000000&CC_0C0300&REV_A0="unknowhw"
PCI\VEN_1106&DEV_3038&SUBSYS_00000000&CC_0C0300&REV_A0="unknowhw"
PCI\VEN_1106&DEV_3104&SUBSYS_00000000&CC_0C0300&REV_86="unknowhw"
PCI\VEN_1106&DEV_3337&SUBSYS_00000000&CC_060100&REV_00="unknowhw"
PCI\VEN_1106&DEV_287E&SUBSYS_00000000&CC_060000&REV_00="unknowhw"
PCI\VEN_1106&DEV_3065&SUBSYS_00000000&CC_020000&REV_7C="unknowhw"
PCI\VEN_1106&DEV_337B&SUBSYS_00000000&CC_060400&REV_00="unknowhw"
PCI\VEN_1106&DEV_337A&SUBSYS_00000000&CC_060400&REV_00="unknowhw"
PCI\VEN_1106&DEV_3343&SUBSYS_00000000&CC_030000&REV_01="unknowhw"
PCI\VEN_1106&DEV_3288&SUBSYS_00000000&CC_040300&REV_10="unknowhw"
PCI\VEN_127A&DEV_1025&SUBSYS_00000000&CC_078000&REV_01="unknowhw"
PCI\VEN_127A&DEV_1025&SUBSYS_00000000&CC_078000&REV_01="unknowhw"
PCI\VEN_127A&DEV_1025&SUBSYS_00000000&CC_078000&REV_01="unknowhw"
PCI\VEN_127A&DEV_1025&SUBSYS_00000000&CC_078000&REV_01="unknowhw"
PCI\VEN_127A&DEV_1025&SUBSYS_00000000&CC_078000&REV_01="unknowhw"
PCI\VEN_127A&DEV_1025&SUBSYS_00000000&CC_078000&REV_01="unknowhw"
PCI\VEN_127A&DEV_1025&SUBSYS_00000000&CC_078000&REV_01="unknowhw"
PCI\VEN_127A&DEV_1025&SUBSYS_00000000&CC_078000&REV_01="unknowhw"
V:1106 D:0327 S:21711019 B:0 E:00 F:0 I:00 N:- C:06 U:00 P:00 R:00
V:1106 D:1327 S:21711019 B:0 E:00 F:1 I:00 N:- C:06 U:00 P:00 R:00
V:1106 D:2327 S:21711019 B:0 E:00 F:2 I:00 N:- C:06 U:00 P:00 R:00
V:1106 D:3327 S:00000000 B:0 E:00 F:3 I:00 N:- C:06 U:00 P:00 R:00
V:1106 D:4327 S:21711019 B:0 E:00 F:4 I:00 N:- C:06 U:00 P:00 R:00
V:1106 D:5327 S:00000000 B:0 E:00 F:5 I:00 N:- C:08 U:00 P:20 R:00
V:1106 D:6327 S:00000000 B:0 E:00 F:6 I:00 N:- C:06 U:00 P:00 R:00
V:1106 D:7327 S:00000000 B:0 E:00 F:7 I:00 N:- C:06 U:00 P:00 R:00
V:1106 D:B198 S:00000000 B:0 E:01 F:0 I:00 N:- C:06 U:04 P:00 R:00
V:1106 D:A327 S:00000000 B:0 E:02 F:0 I:10 N:A C:06 U:04 P:00 R:00
V:1106 D:C327 S:00000000 B:0 E:03 F:0 I:10 N:A C:06 U:04 P:00 R:00
V:1106 D:0591 S:21711019 B:0 E:15 F:0 I:05 N:B C:01 U:01 P:8F R:80
V:1106 D:0571 S:21711019 B:0 E:15 F:1 I:00 N:- C:01 U:01 P:8A R:07
V:1106 D:3038 S:21711019 B:0 E:16 F:0 I:11 N:A C:0C U:03 P:00 R:A0
V:1106 D:3038 S:21711019 B:0 E:16 F:1 I:05 N:B C:0C U:03 P:00 R:A0
V:1106 D:3038 S:21711019 B:0 E:16 F:2 I:03 N:C C:0C U:03 P:00 R:A0
V:1106 D:3038 S:21711019 B:0 E:16 F:3 I:07 N:D C:0C U:03 P:00 R:A0
V:1106 D:3104 S:21711019 B:0 E:16 F:4 I:03 N:C C:0C U:03 P:20 R:86
V:1106 D:3337 S:21711019 B:0 E:17 F:0 I:00 N:- C:06 U:01 P:00 R:00
V:1106 D:287E S:337E1106 B:0 E:17 F:7 I:00 N:- C:06 U:00 P:00 R:00
V:1106 D:3065 S:01021019 B:0 E:18 F:0 I:11 N:A C:02 U:00 P:00 R:7C
V:1106 D:337B S:00000000 B:0 E:19 F:0 I:00 N:- C:06 U:04 P:00 R:00
V:1106 D:337A S:00000000 B:0 E:19 F:1 I:00 N:- C:06 U:04 P:01 R:00
V:1106 D:3343 S:21711019 B:1 E:00 F:0 I:11 N:A C:03 U:00 P:00 R:01
V:1106 D:3288 S:21711019 B:4 E:01 F:0 I:05 N:A C:04 U:03 P:00 R:10
V:127A D:1025 S:1025127A B:5 E:03 F:0 I:11 N:A C:07 U:80 P:00 R:01

[ 本帖最后由 chenall 于 2008-4-24 12:42 PM 编辑 ]
作者: chenall    时间: 2008-4-24 14:38
笔记本的检测结果
PCI\VEN_8086&DEV_2590&SUBSYS_00000000&CC_060000&REV_04="unknowhw"
PCI\VEN_8086&DEV_2592&SUBSYS_00000000&CC_030000&REV_04="unknowhw"
PCI\VEN_8086&DEV_2792&SUBSYS_00000000&CC_038000&REV_04="unknowhw"
PCI\VEN_8086&DEV_2660&SUBSYS_00000000&CC_060400&REV_04="unknowhw"
PCI\VEN_8086&DEV_2662&SUBSYS_00000000&CC_060400&REV_04="unknowhw"
PCI\VEN_8086&DEV_2658&SUBSYS_00000000&CC_0C0300&REV_04="unknowhw"
PCI\VEN_8086&DEV_2659&SUBSYS_00000000&CC_0C0300&REV_04="unknowhw"
PCI\VEN_8086&DEV_265A&SUBSYS_00000000&CC_0C0300&REV_04="unknowhw"
PCI\VEN_8086&DEV_265B&SUBSYS_00000000&CC_0C0300&REV_04="unknowhw"
PCI\VEN_8086&DEV_265C&SUBSYS_00000000&CC_0C0300&REV_04="unknowhw"
PCI\VEN_8086&DEV_2448&SUBSYS_00000000&CC_060400&REV_D4="unknowhw"
PCI\VEN_8086&DEV_266E&SUBSYS_00000000&CC_040100&REV_04="unknowhw"
PCI\VEN_8086&DEV_2641&SUBSYS_00000000&CC_060100&REV_04="unknowhw"
PCI\VEN_8086&DEV_2653&SUBSYS_00000000&CC_010100&REV_04="unknowhw"
PCI\VEN_8086&DEV_266A&SUBSYS_00000000&CC_0C0500&REV_04="unknowhw"
PCI\VEN_10EC&DEV_8169&SUBSYS_00000000&CC_020000&REV_10="unknowhw"
PCI\VEN_10EC&DEV_8169&SUBSYS_00000000&CC_020000&REV_10="unknowhw"
PCI\VEN_10EC&DEV_8169&SUBSYS_00000000&CC_020000&REV_10="unknowhw"
PCI\VEN_10EC&DEV_8169&SUBSYS_00000000&CC_020000&REV_10="unknowhw"
PCI\VEN_10EC&DEV_8169&SUBSYS_00000000&CC_020000&REV_10="unknowhw"
PCI\VEN_10EC&DEV_8169&SUBSYS_00000000&CC_020000&REV_10="unknowhw"
PCI\VEN_10EC&DEV_8169&SUBSYS_00000000&CC_020000&REV_10="unknowhw"
PCI\VEN_10EC&DEV_8169&SUBSYS_00000000&CC_020000&REV_10="unknowhw"
PCI\VEN_1A47&DEV_0003&SUBSYS_00000000&CC_020000&REV_00="unknowhw"
PCI\VEN_1A47&DEV_0003&SUBSYS_00000000&CC_020000&REV_00="unknowhw"
PCI\VEN_1A47&DEV_0003&SUBSYS_00000000&CC_020000&REV_00="unknowhw"
PCI\VEN_1A47&DEV_0003&SUBSYS_00000000&CC_020000&REV_00="unknowhw"
PCI\VEN_1A47&DEV_0003&SUBSYS_00000000&CC_020000&REV_00="unknowhw"
PCI\VEN_1A47&DEV_0003&SUBSYS_00000000&CC_020000&REV_00="unknowhw"
PCI\VEN_1A47&DEV_0003&SUBSYS_00000000&CC_020000&REV_00="unknowhw"
PCI\VEN_1A47&DEV_0003&SUBSYS_00000000&CC_020000&REV_00="unknowhw"
PCI\VEN_104C&DEV_8031&SUBSYS_00000000&CC_060700&REV_00="unknowhw"
PCI\VEN_104C&DEV_8032&SUBSYS_00000000&CC_0C0000&REV_00="unknowhw"
PCI\VEN_104C&DEV_8033&SUBSYS_00000000&CC_018000&REV_00="unknowhw"
PCI\VEN_104C&DEV_8034&SUBSYS_00000000&CC_080500&REV_00="unknowhw"

V:8086 D:2590 S:0746152D B:0 E:00 F:0 I:00 N:- C:06 U:00 P:00 R:04
V:8086 D:2592 S:0746152D B:0 E:02 F:0 I:10 N:A C:03 U:00 P:00 R:04
V:8086 D:2792 S:0746152D B:0 E:02 F:1 I:00 N:- C:03 U:80 P:00 R:04
V:8086 D:2660 S:00000000 B:0 E:28 F:0 I:00 N:- C:06 U:04 P:00 R:04
V:8086 D:2662 S:00000000 B:0 E:28 F:1 I:00 N:- C:06 U:04 P:00 R:04
V:8086 D:2658 S:0746152D B:0 E:29 F:0 I:10 N:A C:0C U:03 P:00 R:04
V:8086 D:2659 S:0746152D B:0 E:29 F:1 I:11 N:B C:0C U:03 P:00 R:04
V:8086 D:265A S:0746152D B:0 E:29 F:2 I:10 N:C C:0C U:03 P:00 R:04
V:8086 D:265B S:0746152D B:0 E:29 F:3 I:10 N:D C:0C U:03 P:00 R:04
V:8086 D:265C S:0746152D B:0 E:29 F:7 I:10 N:A C:0C U:03 P:20 R:04
V:8086 D:2448 S:00000000 B:0 E:30 F:0 I:00 N:- C:06 U:04 P:01 R:D4
V:8086 D:266E S:0746152D B:0 E:30 F:2 I:10 N:A C:04 U:01 P:00 R:04
V:8086 D:2641 S:0746152D B:0 E:31 F:0 I:00 N:- C:06 U:01 P:00 R:04
V:8086 D:2653 S:0746152D B:0 E:31 F:2 I:00 N:- C:01 U:01 P:80 R:04
V:8086 D:266A S:0746152D B:0 E:31 F:3 I:11 N:B C:0C U:05 P:00 R:04
V:10EC D:8169 S:0746152D B:6 E:00 F:0 I:11 N:A C:02 U:00 P:00 R:10
V:1A47 D:0003 S:02000000 B:6 E:04 F:0 I:10 N:A C:02 U:00 P:00 R:00
V:104C D:8031 S:00000000 B:6 E:09 F:0 I:00 N:- C:06 U:07 P:00 R:00
V:104C D:8032 S:0746152D B:6 E:09 F:2 I:10 N:C C:0C U:00 P:10 R:00
V:104C D:8033 S:0746152D B:6 E:09 F:3 I:10 N:A C:01 U:80 P:00 R:00
V:104C D:8034 S:0746152D B:6 E:09 F:4 I:10 N:A C:08 U:05 P:00 R:00

作者: netwinxp    时间: 2008-4-24 14:40
新的版本已经显示除硬件匹配外的所有字段,但有个缺点就是—如果系统存在多个完全相同的硬件就会显示多条(比如:usb host controller,这是为了简化程序采取读一条硬件纪录处理一条造成的,事实上windows本身也是酱紫的。建议用P处理来解决^_^),麻烦再测试一下,看看可能还存在什么其它问题。
另外:是否是只需要硬盘类,如果是,那我将屏蔽其他类型的硬件。因为大多数的hwid是没法在txtsetup.sif中加载。

[ 本帖最后由 netwinxp 于 2008-4-24 03:07 PM 编辑 ]
作者: zhangfei.892    时间: 2008-4-24 15:25
可能要下周回家才能给你
作者: zhangfei.892    时间: 2008-4-24 15:25
可能要下周回家才能给你
作者: chenall    时间: 2008-4-24 15:36
标题: 回复 #28 netwinxp 的帖子
刚刚试了下,好像没有什么问题(办公室的电脑)

另外:是否是只需要硬盘类,如果是,那我将屏蔽其他类型的硬件。因为大多数的hwid是没法在txtsetup.sif中加载。

如果可能的话,可以考虑使用参数.来过滤
作者: minmax    时间: 2008-4-24 15:38
挺好的想法 能將完成的工具 源碼 送上來˙大家一起研究
作者: netwinxp    时间: 2008-4-24 18:17
原帖由 minmax 于 2008-4-24 15:38 发表
挺好的想法 能將完成的工具 源碼 送上來˙大家一起研究

完工之后肯定带源码
作者: chenall    时间: 2008-4-30 12:42
我再顶,
期待早日可以用上......
作者: netwinxp    时间: 2008-4-30 12:44
快好了...上礼拜帮别人装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硬件扫描


作者: 135956    时间: 2008-4-30 16:01
太good了,功德无量呀。
作者: 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"
作者: netwinxp    时间: 2008-4-30 20:59
原帖由 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, 下载次数: 87)

vpc.PNG

作者: secowu    时间: 2008-4-30 21:23
很不错。。。。。。。摸摸很仔细
作者: zery    时间: 2008-4-30 21:29
以前学过点皮毛,就不献丑了,还是让高手看看吧
作者: chenall    时间: 2008-4-30 23:09
试了下,不错。虽然是半成品,也比SCANPCI好用多了。

希望再加一个将找到(匹配的)的值设为DOS变量的功能(虽然用批处理可以实现,但如果程序中直接实现会更方便)
如下。
PCI\VEN_104B&DEV_1040="VMSCSI"
PCI\VEN_8086&DEV_7111="intelide"
就设一个变量PCI=VMSCSI INTELIDE
若不处理“”也可以直接PCI="VMSCSI" "INTELIDE"
方便直接在批处理中调用,而不用再根据结果进行转换。
作者: netwinxp    时间: 2008-5-1 06:05
要知道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 编辑 ]
作者: chenall    时间: 2008-5-1 10:16
这样也行,真的很暴力.
等下再试试看.
作者: netwinxp    时间: 2008-5-4 21:22
标题: 最终方案
化繁为简,不再显示未知设备,把主动权交给定制者。
由于.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

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


作者: chenall    时间: 2008-5-4 21:55
先收下了,先用你的磁盘方案搞一个SCSI.img出来。
展望:下一次推出CPU检测、ACPI检测(正在消化资料中...)

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

[ 本帖最后由 chenall 于 2008-5-4 09:56 PM 编辑 ]
作者: netwinxp    时间: 2008-5-4 21:57
原帖由 chenall 于 2008-5-4 21:55 发表
先收下了,先用你的磁盘方案搞一个SCSI.img出来。

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

[ 本帖最后由 netwinxp 于 2008-5-4 10:10 PM 编辑 ]
作者: chenall    时间: 2008-5-5 00:15
不支持PCI 2.0?有办法支持吗?不知这个影响到哪一类的主板?

先试试看。

[ 本帖最后由 chenall 于 2008-5-5 01:26 AM 编辑 ]
作者: netwinxp    时间: 2008-5-5 00:43
原帖由 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 编辑 ]
作者: 135956    时间: 2008-5-5 10:05
强人。下载测试、是dos下运行的吧。
作者: netwinxp    时间: 2008-5-5 11:23
只运行于真正的DOS,第一个不包含硬件库,所以不会显示任何东西(主要方便YY硬件库),第二个带一些不全的磁盘HWID硬件库,可以检测并显示我的那个磁盘方案里面的冬冬(做样本实例)。

[ 本帖最后由 netwinxp 于 2008-5-5 11:28 AM 编辑 ]
作者: chenall    时间: 2008-5-5 13:55
先上传一个试试,
直接使用44楼的驱动库,未经修改.所以只支持一部份驱动.
下载
SCSI.RAR
作者: netwinxp    时间: 2008-5-5 14:11
很好,就是这个意思。你可以大胆地修改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 编辑 ]
作者: jianliulin    时间: 2008-5-5 18:26
请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


作者: netwinxp    时间: 2008-5-5 20:10
每个硬件记录应该以$结尾($要写在回车换行的后面,也就是下一行的最开头,下一条记录才不会和这条跑到一行上),所有记录完毕以后添加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

已修改好的


作者: jianliulin    时间: 2008-5-6 09:16
感谢lz的指点,本人写了一个方便编辑CHKPCI.COM 的工具。

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

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

未命名.JPG

作者: pseudo    时间: 2008-5-6 13:41
标题: 一点建议
原帖由 jianliulin 于 2008-5-6 09:16 AM 发表
感谢lz的指点,本人写了一个方便编辑CHKPCI.COM 的工具。

用户不必输入$更好,还有,允许用户输入空行、注释,程序负责处理。
其实编辑功能就用记事本等编辑器好了(格式符合用户习惯),程序只负责文件转换就行了。
作者: jianliulin    时间: 2008-5-6 17:05
$ 是没有规律的,
作者: netwinxp    时间: 2008-5-6 17:15
用户不必输入$更好,还有,允许用户输入空行、注释,程序负责处理。
其实编辑功能就用记事本等编辑器好了(格式符合用户习惯),程序只负责文件转换就行了。

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

[ 本帖最后由 netwinxp 于 2008-5-6 05:19 PM 编辑 ]
作者: pseudo    时间: 2008-5-6 19:39
原帖由 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

这样可读性强些吧。没弄汇编,对回车换行、$不好理解的。
作者: jianliulin    时间: 2008-5-8 14:22
頂,不能讓它沉下去
作者: 19951001    时间: 2008-5-8 22:44
真正的高手才能做底层的驱动,顶一下
作者: ice360    时间: 2008-6-14 23:27
顶一下,这样的帖子看起来才起劲!呵呵
作者: microcwj    时间: 2010-11-30 12:08
都是高手,可惜源码贴出来也看不懂,好多年没有用汇编了.




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3