[原创]BXP的WinXP系统PNP技术过程

其实,看一下左轮的 me pnp 补丁,应该很容易做成 2000/xp 的网卡PNP

只在有盘上试过。

使用左轮的ME/PNP补丁估一个PNP最简单不过了。

任意键问题已经解决。

怎么解决??

只要预置注册表,就可 pnp ,没有官方那样麻烦.

[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\VEN_10EC&DEV_8139&SUBSYS_813910EC&REV_10\3&61aaa01&0&50]

修改 3&61aaa01&0&50 即可,内容不用修改! 在 via intel 均可以!

请楼上的兄弟能否讲讲清楚点,,呵呵,,不太清楚你的做法

98在基于DOS7.0上面的,在刚开始动是DOS实模式,win.com执行后切换到保护模式,NT系统一开始是进入保护模式,(这点aqxd说的没错)不过j是可以按照楼主所说的强行执行autoexec.bat,只在一种厂商类型芯片上PNP不叫PNP,XP本身就可以包容,要至少能在Intel和VIA两种类型上都能使用才叫PNP

我在dos运行pciview.exe得到网卡的信息,我的是intel 82558
foCX F EthernetRg[
hc F Vendor = 8086 Device = 1229 Rev = 05
gp F yhnzyzyoX}X^z
AhX F da000000H
hnAhX F 0000c000H
AhX F d9000000H
F IRQ11

却没看到subsystem的值,请问大家运行有subsystem的值吗?

到哪里去找点最初级的材料去看看啊,这些对我有点困难啊!

怎么看不到原文

老大。 在换了不同的主板后3&61aaa01&0&30 这里面的61aaa01就跟着改变了。 你是怎么解决的???

这个我已经搞懂了。 问题是那个3&61aaa01&0&50 中间的61aaa01会随主板的不同而改变。 而且暂时没有什么软件工具可以在DOS下读取。 所以我觉得网卡PNP的关键还在这里。。。

这么久了,PNP还是有很大的进步.看到这些我挺开心的,大家都在努力.回想那个什么信达的当时说的乱七八糟的,还是有点气慨.

说到哪儿,我说点我自己的系统东西,目前主流的主板没几种,而且芯片决定了主板的特性,那么采集主板的PCI值得有效的,再通过我说的方法修改系统,可以很完美的解决PNP问题.

我曾给过几个朋友注册表值,里面讲的很清楚.强行使用无I/O网卡驱动也是很有研究价值的.因为XP/2000同样支持强制驱动机制.

我不会写程序,哪位朋友帮我搞个程序来计算有规律的网卡值程序,只是按规律来计算就行了.

有这样的朋友请与我联系,我提供方法

每个PCI设备都有自己的配置空间,用于支持即插即用,使之满足现行的系统配置结构。下面对PCI配置空间做一下简要介绍。
配置空间是一容量为256字节并具有特定结构的地址空间。这个空间又分为头标区和设备有关区两部分。头标区的长度是64字节,每个设备都必须配置该区的寄存器。该区中的各个字段用来唯一地识别设备。其余的192字节因设备而异。配置空间的头标区64个字节的使用情况如图1示。
为了实现即插即用,系统可根据硬件资源的使用情况,为PCI设备分配新的资源。因此编写设备驱动程序重点是获得基址寄存器(Base Address)和中断干线寄存器的内容。配置空间共有六个基址寄存器和一个中断干线寄存器,具体用法如下:
PCI Base Address 0寄存器:系统利用此寄存器为PCI接口芯片的配置寄存器分配一段PCI地址空间,通过这段地址我们可以以内存映射的形式访问PCI接口芯片的配置寄存器。
PCI Base Address 1寄存器:系统利用此寄存器为PCI接口芯片的配置寄存器分配一段PCI地址空间,通过这段地址我们可以以I/O的形式访问PCI接口芯片的配置寄存器。
PCI Base Address 2、3、4、5寄存器:系统BIOS利用这些寄存器分配PCI地址空间以支持PCI接口芯片的局部配置寄存器0、1、2、3的访问。
在所有基址寄存器中,第0位均为只读位,表示这段地址映射到存储器空间还是I/O空间,如果是“1”表示映射到I/O空间,如果是“0”则表示映射到存储器空间。
中断干线寄存器(Interrupt Line):用于说明中断线的连接情况,这个寄存器的值与标准8259的IRQ编号(0~15)对应。

设备识别号 供应商识别号
状态寄存器 命令寄存器
分类代码 修改版本
自测试 头标类型 延时计数 Cache
基址寄存器
保留
保留
扩展ROM基址寄存器
保留
保留
Max-Lat Min-Gnt中断引脚 中断干线

设备初始化
PCI设备驱动程序要完成识别PCI器件、分配PCI硬件资源、响应PCI器件中断等功能,这就需要访问PCI配置空间来获得必需的参数。实现在Windows9x操作系统下访问PCI配置空间可以利用PCI系统BIOS功能调用,通过供应商识别号(VendorID)和设备识别号 (DeviceID)直接访问设备,也可以利用配置管理器(Configuration Manager)封装的功能函数,根据供应商识别号(VendorID)和设备识别号 (DeviceID)搜索设备结点树,查询PCI设备。由于编写PCI系统BIOS功能调用程序更为简捷,所以本文采用这种方法。
PCI系统BIOS功能提供了BIOS的访问与控制的具体方法,所有软件(设备驱动程序、扩展ROM码)将通过标准中断号1AH调用BIOS功能访问特殊部件。在驱动程序中调用VtoolsD系统服务Exec_VxD_Int()来实现PCI系统BIOS的1AH中断。
首先,通过PCI设备的供应商识别号(VendorID)、 设备识别号 (DeviceID)和索引号(Index)查找特定设备所在的总线号(Bus Num)、设备号(Device NUM)、功能号(Function Num)和寄存器号(Register Num)。总线号是从0到255的数值,在一个系统中,可把多达256条的PCI总线用桥连接在一起。由于编号是从0开始的,所以当系统有N条总线时,总线号会达到N-1;设备号是在0到31之间分配的任意值,并不拘于从0开始按顺序分配;功能号分配从0到7的值。代码如下:

ALLREGS* pRegisters; // pRegisters是指向寄存器结构体的指针
pRegisters->REAX =0xb102; // 0xb102是功能号
pRegisters->RECX =0x1001; // 假设Device ID=0x1001
pRegisters->REDX=0x102b; // 假设Vendor ID=0x102b
Exec_VxD_Int(0x1a,pRegisters); // 调用1AH中断

返回值是pRegisters->REBX。BH寄存器是总线号,BL寄存器的高5位是设备号,低3位是功能号。
然后,向配置空间地址寄存器CF8h写入总线号、设备号、功能号、索引号, 从配置空间数据寄存器CFCh读出配置空间的内容。
配置空间地址寄存器(CF8h)格式如下:
Bit31 30-24 23-16 15-11 10-8 7-2 10
使能位 保 留 总线号 设备号 功能号 寄存器号 00

使能位为“1”表示允许访问

配置空间数据寄存器(CFCh)存放要读写的数据。
代码如下:

DWORD d=0;
d=pRegisters->REBX;
(d<<=8)|=0x80000000;
for (short i=0;i<16;i++) // 读取64字节配置空间
{
_outpd(0xcf8,d+4*i); // 按DWORD类型一次读取四个字节
dprintf(“%8x”,_inpd(0xcfc)); // 打印输出
}

这里面包含了PCI设备的初始化和读取配置空间的方法.

void CPCIDlg::OnButton1()
{
CListCtrl *pListCtrl=(CListCtrl )GetDlgItem(IDC_LIST1);
CString str;
int temp;
UpdateData(true);//get bus,dev,fun
for(int i=0;i<16;i++)
{
for(int j=1;j<=16;j++)
{
temp=GetResult(m_bus,m_dev,m_fun,i
16+j-1);
if(temp<16)
str.Format(“0%X”,temp);
else
str.Format(“%X”,temp);
pListCtrl->SetItemText(i,j,str);
}
}
}

int CPCIDlg::GetResult(int bus, int dev, int fun, int reg)
{
int i,j,temp;
i=reg/4;
j=reg-i4;
j=j
8;
_asm{
pushad
mov eax,80h
sal eax,8
or eax,bus
sal eax,5
or eax,dev
sal eax,3
or eax,fun
sal eax,6
or eax,i
sal eax,2
mov dx,0cf8h
out dx,eax
mov dx,0cfch
in eax,dx
mov ecx,j
and ecx,000000ffh
sar eax,cl
and eax,000000ffh
mov temp,eax
popad
}
return temp;
}

看不懂,
可以说明一下吗?

我网吧30种配置