|
快好了...上礼拜帮别人装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"
...
顺便贴上源代码:- ;FileName:SCANPCI.ASM
- .model tiny
- .386
- code segment
- assume cs:code,ds:code,es:code
- org 81H
- cmdline db 126 dup(?)
- org 100H
- START: mov ax,cs
- mov ds,ax
- mov es,ax
- mov ax,0B101H;支持PCI 2.0?
- int 1AH
- jc PCIERR;否
- cmp ah,0
- jne PCIERR;否
- cmp edx,' ICP'
- jne PCIERR;否
- ;========读取PCI配置空间数据
- mov ecx,7FFFFF00H
- READPCI:add ecx,100H
- cmp ecx,80FFFF00H;全读完了?
- jnb EXIT;是
- mov dx,0CF8H
- mov eax,ecx
- out dx,eax
- mov dx,0CFCH
- in eax,dx
- cmp eax,0FFFFFFFFH;无效设备?
- je READPCI;是
- push ecx
- mov di,offset venid
- cld
- PCISTR: mov eax,ecx
- mov dx,0CF8H
- out dx,eax
- mov dx,0CFCH
- insd;后面为啥要对齐4的倍数,主要就是防止本指令被掰成2或4个内存访问周期。
- add cl,4
- cmp cl,0FCH;读完256字节数据?
- jb PCISTR;否
- ;=======查找匹配的记录
- mov bx,offset hwdb
- L0: xor di,di;指向新记录首字节
- mov chkok,di;匹配标志清零
- L1: mov al,[bx][di]
- cmp al,0FFH;读完所有记录?
- je UNKNOW;是
- mov dx,chkok
- cmp al,'$';本记录尾部?
- jne L3;否
- cmp dx,1;该记录匹配?
- jne L2;否
- mov dx,bx
- jmp DISP
- L2: inc di
- add bx,di;bx指向下一记录
- jmp L0
- L3: cmp dx,0FFFFH;本记录不匹配?
- jne L5;否。是的话直到下一条记录之前不再进行匹配尝试
- L4: inc di
- jmp L1
- L5: cmp al,'_';有可能是硬件信息?
- jne L4;否
- mov eax,[bx][di-3]
- cmp eax,'_NEV';后面的是VEN信息?
- je CHKVEN
- cmp eax,'_VED';后面的是DEV信息?
- je CHKDEV
- cmp eax,'_SYS';后面的是SUBSYS信息?
- je CHKSUB
- cmp eax,'_VER';后面的是REV信息?
- je CHKREV
- and eax,0FFFFFF00H
- cmp eax,5F434300H;高三位为'_CC';后面的是CLASS信息?
- jne L4;都不是
- CHKCC: mov eax,[bx][di+1]
- call asctohex
- mov cx,classid
- cmp ax,cx
- jz L12
- jmp L11
- CHKVEN: mov eax,[bx][di+1]
- call asctohex
- mov cx,venid
- cmp ax,cx;与检测到的venid比较
- jz L12
- jmp L11
- CHKDEV: mov eax,[bx][di+1]
- call asctohex
- mov cx,devid
- cmp ax,cx;与检测到的devid比较
- jz L12
- jmp L11
- CHKSUB: mov eax,[bx][di+5]
- call asctohex
- push di
- mov di,offset subsys
- mov cx,[di]
- pop di
- cmp ax,cx;与检测到的subvid比较
- jnz L11
- mov eax,[bx][di+1]
- call asctohex
- push di
- mov di,offset subsys
- mov cx,[di+2]
- pop di
- cmp ax,cx;与检测到的subdid比较
- jnz L11
- jmp L12
- CHKREV: mov eax,30303030H;为了兼容子过程的处理
- mov ax,[bx][di+1]
- call asctohex
- mov cl,revid
- cmp ah,cl;与检测到的rid比较
- jz L12
- L11: mov dx,0FFFFH
- mov chkok,dx;填充不匹配标志
- jmp L4
- L12: mov dx,1;填充匹配标志
- mov chkok,dx
- jmp L4
- ;=======没有匹配记录则生成并显示未知硬件
- UNKNOW: mov di,offset msg
- mov ax,venid
- mov dx,ax
- mov al,ah
- call hextoasc
- mov [di+8],ax
- mov ax,dx
- call hextoasc
- mov [di+10],ax
- mov ax,devid
- mov dx,ax
- mov al,ah
- call hextoasc
- mov [di+17],ax
- mov ax,dx
- call hextoasc
- mov [di+19],ax
- mov ax,classid
- mov dx,ax
- mov al,ah
- call hextoasc
- mov [di+41],ax
- mov ax,dx
- call hextoasc
- mov [di+43],ax
- mov al,revid
- call hextoasc
- mov [di+52],ax
- mov al,progif
- call hextoasc
- mov [di+45],ax
- mov eax,subsys
- mov edx,eax
- shr eax,24
- call hextoasc
- mov [di+29],ax
- mov eax,edx
- shr eax,16
- call hextoasc
- mov [di+31],ax
- mov eax,edx
- shr eax,8
- call hextoasc
- mov [di+33],ax
- mov eax,edx
- call hextoasc
- mov [di+35],ax;循环的效率没有更高,所以直接写
- mov dx,offset msg
- DISP: mov ah,9
- int 21H
- pop ecx
- jmp READPCI
- EXIT: mov ax,4C00H
- int 21H
- PCIERR: mov ax,4C01H;非PCI2.0以上版本返回ERRORLEVEL=1
- int 21H
- ;把al的数据转换成双字节HEX字符串
- hextoasc proc near
- ;输入:al待转换值
- ;返回:ax
- push bx
- mov bx,offset hextab
- mov ah,al
- and al,0FH
- xlat
- xchg al,ah
- and al,0F0H
- shr al,4
- xlat
- pop bx
- ret
- hextab db '0123456789ABCDEF'
- hextoasc endp
- ;把eax的四字节HEX字符串转换成ax数据
- asctohex proc near;会破坏edx、ecx、eax内容
- ;输入:eax待转换值
- ;返回:ax
- push bx
- mov cx,4
- mov edx,eax
- xor eax,eax
- S11: mov bl,dl
- cmp bl,'9';不做更多判断请务必保证字串由'0-9、A-F、a-f'组成
- jbe S12
- and bx,0DFH;转大写字母
- sub bl,7
- S12:and bl,0FH
- shl ax,4
- add al,bl
- shr edx,8
- loop S11
- pop bx
- ret
- asctohex endp
- ; db 'X';用来使后面对齐4的倍数
- venid dw 0;pcicfg offset 00H
- devid dw 0;pcicfg offset 02H
- command_reg dw 0
- status_reg dw 0
- revid db 0;pcicfg offset 08H
- progif db 0;pcicfg offset 09H
- classid dw 0;pcicfg offset 0AH
- cacheline_size db 0
- latency db 0
- headtype db 0;pcicfg offset 0EH,=00时SUBSYS有效
- bist db 0
- baseaddr0 dd 0
- baseaddr1 dd 0
- baseaddr2 dd 0
- baseaddr3 dd 0
- baseaddr4 dd 0
- baseaddr5 dd 0
- cardbus_cis dd 0
- subsys dd 0;pcicfg offset 2CH
- expansion_ROM dd 0
- cap_ptr db 0
- reserved1 db 3 dup(0)
- reserved2 dd 0
- interrupt_line db 0
- interrupt_pin db 0
- min_grant db 0
- max_latency db 0
- specific db 192 dup(0)
- msg db 'PCI\VEN_0000&DEV_0000&SUBSYS_00000000&CC_000000&REV_00="unknowhw"',0DH,0AH,'$'
- chkok dw 0;匹配判定标志
- ;tmpstr db 30H,30H,30H,30H,0DH,0AH,'$';调试用
- hwdbstart db 'HWDBSTART:'
- hwdb db 31607 dup(' ')
- hwdbend db 0FFH
- code ends
- end START
复制代码 仅对两个子过程比较满意。
[ 本帖最后由 netwinxp 于 2008-5-1 02:28 AM 编辑 ] |
-
-
PCISCAN.RAR
1.89 KB, 下载次数: 133, 下载积分: 无忧币 -2
带磁盘库的PCI硬件扫描
|