如何获取 PCI 设备的配置和位置信息
更多信息在Windows NT 4.0 上,驱动程序通过扫描总线,并调用 HalGetBusData 和 HalGetBusDataByOffset 这两个 API...在Windows NT 4.0 上,驱动程序通过扫描总线,并调用 HalGetBusData 和 HalGetBusDataByOffset 这两个 API 来获取此信息。在 Windows 2000 和更高版本的 Windows 操作系统中,控制硬件总线的则是它们各自的总线驱动程序,而不是 HAL。因此,在 Windows 2000 和更高版本的 Windows 操作系统中,过去用于提供总线相关信息的所有 Hal API 都已过时。 在Windows 2000 和更高版本的 Windows 操作系统中,驱动程序无须查询设备即可查找资源。驱动程序通过即插即用 (PnP) 管理器的 IRP_MN_START_DEVICE 请求来获取这些资源。通常,正确编写的驱动程序不需要任何这类信息就能正常工作。如果由于某种原因,驱动程序需要获取这些信息,请参照下面的代码示例来获取资源。驱动程序应当是设备驱动程序堆栈的一部分,因为它需要设备的基础物理设备对象 (PDO) 才能发送 PnP 请求。 NTSTATUS ReadWriteConfigSpace( IN PDEVICE_OBJECT DeviceObject, IN ULONG ReadOrWrite, // 0 for read 1 for write IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ) { KEVENT event; NTSTATUS status; PIRP irp; IO_STATUS_BLOCK ioStatusBlock; PIO_STACK_LOCATION irpStack; PDEVICE_OBJECT targetObject; PAGED_CODE(); KeInitializeEvent( event, NotificationEvent, FALSE ); targetObject = IoGetAttachedDeviceReference( DeviceObject ); irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP, targetObject, NULL, 0, NULL, event, ioStatusBlock ); if (irp == NULL) { status = STATUS_INSUFFICIENT_RESOURCES; goto End; } irpStack = IoGetNextIrpStackLocation( irp ); if (ReadOrWrite == 0) { irpStack-MinorFunction = IRP_MN_READ_CONFIG; }else { irpStack-MinorFunction = IRP_MN_WRITE_CONFIG; } irpStack-Parameters.ReadWriteConfig.WhichSpace = PCI_WHICHSPACE_CONFIG; irpStack-Parameters.ReadWriteConfig.Buffer = Buffer; irpStack-Parameters.ReadWriteConfig.Offset = Offset; irpStack-Parameters.ReadWriteConfig.Length = Length; // // Initialize the status to error in case the bus driver does not // set it correctly. // irp-IoStatus.Status = STATUS_NOT_SUPPORTED ; status = IoCallDriver( targetObject, irp ); if (status == STATUS_PENDING) { KeWaitForSingleObject( event, Executive, KernelMode, FALSE, NULL ); status = ioStatusBlock.Status; } End: // // Done with reference // ObDereferenceObject( targetObject ); return status; } 由于只能在 PASSIVE_LEVEL 级别发送 PnP I/O 请求数据包 (IRP),因此不能使用上面的函数在 DISPATCH_LEVEL 级别获取配置信息。 可以执行下列步骤以在 DISPATCH_LEVEL 级别访问配置空间: 在PASSIVE_LEVEL 级别发送一个 IRP_MN_QUERY_INTERFACE,以便从 PCI 总线驱动程序获取直接调用接口结构 (BUS_INTERFACE_STANDARD)。将该结构存储在非分页池内存中(通常存储在 DevcieExtension 中)。 调用SetBusData 和 GetBusData,以便在 DISPATCH_LEVEL 级别访问配置空间。 由于PCI 总线驱动程序将在它返回之前获取接口上的引用计数,因此当不再需要该接口时,必须取消对它的引用。 请使用以下函数在 PASSIVE_LEVEL 级别获取 BUS_INTERFACE_STANDARD: NTSTATUS GetPCIBusInterfaceStandard( IN PDEVICE_OBJECT DeviceObject, OUT PBUS_INTERFACE_STANDARD BusInterfaceStandard ) /*++ Routine Description: This routine gets the bus interface standard information from the PDO. Arguments: DeviceObject - Device object to query for this information. BusInterface - Supplies a pointer to the retrieved information. Return Value: NT status. --*/ { KEVENT event; NTSTATUS status; PIRP irp; IO_STATUS_BLOCK ioStatusBlock; PIO_STACK_LOCATION irpStack; PDEVICE_OBJECT targetObject; Bus_KdPrint(("GetPciBusInterfaceStandard entered.\n")); KeInitializeEvent( event, NotificationEvent, FALSE ); targetObject = IoGetAttachedDeviceReference( DeviceObject ); irp = IoBuildSynchronousFsdRequest( IRP_MJ_PNP, targetObject, NULL, 0, NULL, event, ioStatusBlock ); if (irp == NULL) { status = STATUS_INSUFFICIENT_RESOURCES; goto End; } irpStack = IoGetNextIrpStackLocation( irp ); irpStack-MinorFunction = IRP_MN_QUERY_INTERFACE; irpStack-Parameters.QueryInterface.InterfaceType = (LPGUID) GUID_BUS_INTERFACE_STANDARD ; irpStack-Parameters.QueryInterface.Size = sizeof(BUS_INTERFACE_STANDARD); irpStack-Parameters.QueryInterface.Version = 1; irpStack-Parameters.QueryInterface.Interface = (PINTERFACE) BusInterfaceStandard; irpStack-Parameters.QueryInterface.InterfaceSpecificData = NULL; // // Initialize the status to error in case the bus driver does not // set it correctly. // irp-IoStatus.Status = STATUS_NOT_SUPPORTED ; status = IoCallDriver( targetObject, irp ); if (status == STATUS_PENDING) { KeWaitForSingleObject( event, Executive, KernelMode, FALSE, NULL ); status = ioStatusBlock.Status; } End: // // Done with reference // ObDereferenceObject( targetObject ); return status; } 以下代码说明了如何使用接口直接调用函数获取总线数据。 bytes = busInterfaceStandard.GetBusData(BR/ busInterfaceStandard.Context, PCI_WHICHSPACE_CONFIG, Buffer Offset, Length); 如果不再需要该接口,请使用以下代码取消对其的引用。取消对该接口的引用之后,请勿调用任何接口例程。 (busInterfaceStandard.InterfaceDereference)( (PVOID)busInterfaceStandard.Context); 请对目标设备的 PDO 使用 IoGetDeviceProperty 函数,以获取总线号、功能号和设备号,如下所示: ULONG propertyAddress, length; USHORT FunctionNumber; DeviceNumber; // // Get the BusNumber. Please read the warning to follow. // IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyBusNumber, sizeof(ULONG), (PVOID)BusNumber, length); // // Get the DevicePropertyAddress // IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyAddress, sizeof(ULONG), (PVOID)propertyAddress, length); // // For PCI, the DevicePropertyAddress has device number // in the high word and the function number in the low word. // FunctionNumber = (USHORT)((propertyAddress) 0x0000FFFF); DeviceNumber = (USHORT)(((propertyAddress) 16) 0x0000FFFF); 重要说明:PCI 总线编号可能是动态的,会随时发生变化。因此,不建议根据总线编号或使用该信息来直接访问 PCI 端口。这可能会引发系统故障。
什么是PCI串口卡
PCI串口卡相关解释:
系统安装时,一般情况下,串口应该是可以自动识别,并安装驱动的。PCI扩展的串口卡,一般用来连接 串口条码扫描器、标签打印机、POS系统、工业控制机、安全门禁系统等。
THINKPAD x200 WIN7平台32位 PCI串行端口驱动
尊敬的联想用户您好!
该驱动时系统自带,在您卸载后点击“扫描硬件改动”即可自行安装。
更多问题您可以咨询
idea论坛:
Think论坛:
联想乐社区:
期待您满意的评价,感谢您对联想的支持,祝您生活愉快!
条码扫描仪使用 ***
导语:条码扫描仪在各个领域的使用意见非常的普遍了,但是对于新手可能还是有点迷惑的,如果你是使用u *** 接口的那你的使用非常简单,只需要连接上你的设备,就可以使用了。条码扫描仪的使用 *** 是什么呢?一般测试或简单了解扫描仪的使用步骤非常简单。
插入扫描器,(直到听到条码扫描器成功安装的提示音);
打开EXCEL(或任何可以输入文本的软件);
在光标定位到要录入的单元格;
扫描条码(根据需要设置扫描器的扫描模式,如扫描后回车、换行、连续扫描);
扫描完成,保存。
单纯的学习条码扫描器如何使用非常的简单,扫描器只是一个用来读取条码内容的'设备,而条码内容只是一串数字或数字字母组合。
如果是需要打印条码,那么你需要安装一个条码 *** 的软件,使用CorelDRAW也可以,不过条码编码方式有很多种,用户需要知道你的条码到底需要使用哪种编码。
为什么扫描器需要设置,下面是个典型例子,一般机器是否正常也可以安装此步骤来判断:新买一个9针串口条码扫描器,已测试证实可用于收银机,条码扫描器如何使用,条码扫描器本身没任何问题,现在想接入电脑,在word、Excel等文档里使用,已买外接电源线,9针串口pci扩展卡,又安装了串口驱动程序,在不考虑硬件问题后,还是无法在电脑上录入数据,应该是设置的问题吧,你用的什么电脑?为什么还要装PCI扩展卡,一般台式电脑都有9针串口的,如果另装了扩展卡,扫描器使用的端口就要重新设置,电脑主板上的串口通常是COM1和COM2,另加的串口会是COM3。
条码扫描器扫描条码有声音,说明条码扫描器供电没有问题,识读条形码也是没有问题的,但是不显示,问题可能出在你的键盘接口或者条码扫描器的设置上。
条码扫描技术近些年来在全球零售行业的普遍应用毋庸置疑地减少了大量的人力和顾客排队等待的时间,这是人类对高效率不懈探索和研究的成果。
无线条码扫描器必须在串口模式下才可以运行,如果使用过程中设置错误,请依次扫描说明书P9的"恢复出厂设置"和"串口模式"条码即可。
要设置扫描器为某个频道,必须先在主机(即接收座)上注册这个频道,否则扫描器扫描的数据将无法传到主机。
pci简易通讯控制器影响
PCI简易通讯控制器是一种硬件设备,它的作用是管理计算机系统中的串行和并行端口。如果该设备出现问题或驱动程序不正确,则可能会对计算机系统产生影响。
以下是可能的影响:
1. 系统稳定性下降:如果PCI简易通讯控制器出现故障,可能会导致系统崩溃、死机等问题,从而影响用户正常使用计算机。
2. 外部设备无法连接:PCI简易通讯控制器负责管理计算机上的串行和并行端口,如果该设备出现问题,则外部设备(如打印机、扫描仪等)将无法连接到计算机上进行数据传输。
3. 传输速度变慢:当PCI简易通讯控制器驱动程序不正确时,它可能会导致数据传输速度变慢或丢失数据包。这将直接影响用户在使用外部设备时的体验。
4. 安全漏洞增加:由于PCI简易通讯控制器可以管理串行和并行端口,在某些情况下攻击者可以利用这些端口来入侵系统或窃取敏感信息。因此,如果该设备存在安全漏洞,则会给整个系统带来风险。
综上所述,要确保计算机系统正常运转,并避免以上问题发生,请及时更新驱动程序、修复硬件故障,并注意保护好自己的电脑安全。
寻找带 *** 唤醒功能的路由
1怎样实现 *** 唤醒开机
如果用户想通过 *** 唤醒一台指定的计算机,首先需要知道能标识该计算机的身份号。由于被唤醒的计算机处于关机状态,也就没有了IP地址和计算机名字,唯一能标识其身份的只有内部网卡的物理地址,即MAC地址,该地址是唯一的,而且每块网卡的MAC地址均不相同。
当用户知道被唤醒的计算机MAC地址后,通过另外一台计算机执行相应的软件,向 *** 上发出含有该地址的特殊数据包。此时,被唤醒的计算机虽然处于关机状态,但是其内部网卡控制芯片通过专用连线所送来的电流,仍然可以接收和处理 *** 上的数据包。因此控制芯片通过检查数据包内的MAC地址,就可确认自己就是该数据包的收件者,然后通过专用连线发出开机信号,通知主板开机启动。
硬件需求
应用 *** 唤醒开机功能必须要有相应的硬件支持才可使用。
首先要有主板支持。现在,新一代的主板大都支持 *** 唤醒功能,而且在主板上都有一个三脚插座,它一般在PCI插槽附近,旁边标注“WOL”。
其次必须要有网卡支持。这类网卡在主板上比一般的网卡多了一个三脚插座,并且通常还附带一条专用的三芯连接线,该线是用来连接主板和网卡之间的三脚插座。
最后还必须要使用ATX电源,而且其+5V Standby电流必须比较大,根据Intel的建议,它需要在600mA以上。该电流的大小可以从电源外部标识中的+5VSB栏里查到。
需要说明的是,某些主板上已经集成了具有 *** 唤醒功能的网卡,所以也就没有什么三脚插座,更不需要专用的三芯连线。
软件需求
为了唤醒 *** 上的计算机,用户必须发出一种数据包,该数据包的格式与普通数据包不同,而且还必须使用相应的专用软件才能产生。当前比较普遍采用的是AMD公司 *** 的Magic Packet,这套软件可以生成 *** 唤醒所需要的特殊数据包。该数据包包含有连续6个字节的“FF”和连续重复16次的MAC地址。Magic Packet 虽然只是AMD公司开发推广的一项技术,并非业界公认的标准,但是仍受到很多网卡制造商的支持,因此许多具有 *** 唤醒功能的网卡都能与之兼容。
2首先拨通自己家的ADSL,然后用ipconfig命令查看自己的Ip,如下图所示:
在开始-运行-输入cmd,在出现的dos窗口中输入ipconfig即可看到:
一般北京的ADSL上网的用户多为61.49.*.*。获得了自己的IP段之后,就可以找一个好的端口扫描工具了。新在端口扫描工具有很多,其中支持多线程、体积小、速度快的首推superscan。我们这里就使用它作为示范工具。Superscan的界面如下:
一般我们在开始地址处输入自己的IP段首地址,即61.49.*.1,结束IP地址会自动显示出61.49.*.254,这里需要说明的是,旁边那个ping,以及connect数据需要根据自己的情况输入,对于本网段的IP,即IP地址前3部分与自己的IP地址相同的IP,在扫描的时候可以把这些数据设置的短小一些,而对于其他网段的地址,一般需要设置的大一点。具体情况根据扫描结果而定,如果输入的数据太小,扫描之后会找不到计算机。
下面需要设置一下扫描端口,我们在探测路由器的时候只需要扫描80端口即可。所以单击窗体右上的配置列表,会出现如下窗体:
修改select
ports如图所示,去掉所有其他端口前的绿钩,(单击该端口即可)最终只保留80端口,然后单击save,把端口配置表保存到硬盘上,以后每次使用superscan的时候就不再需要从新配置,只需要load即可。
全部设置好之后,单击start进行扫描。扫描结束之后,如图所示:
我们可以看到这个网段有两台机器打开了80端口,单击这两台机器左边的小+号图标,可以显示这两台机器所开发的端口信息。61.49.150.68这台机器开放的是一个IIS的服务器,61.49.150.85这台机器开的是一个302标志,根据经验,我们可以知道这里开放的是一个中兴系列的路由器配置接口。本篇文章我们主要介绍ADSL路由器的安全隐患,IIS的安全性问题我们在后面的文章再介绍,这里我们只需在61.49.150.85上单击右键,选择web方式浏览即可。
单击之后会出现一个连接配置对话框,
点击OK,就可以连接了。连接之后弹出的提示框
通过刚才连接页上的标志,我们可以肯定这是一台中兴831路由器,输入出厂默认的用户名、密码:ZXDSL、ZXDSL,就进入了配置界面:
点击导航栏上的“quick configuration”就进入了快速配置界面,如图所示:
用户名已经看到了,密码却显示为小黑点,这怎么办呢,其实也难不倒大家,单击右键,选择查看源代码:
至此一个ADSL账户就被轻易盗取了。
其实补上这个漏洞的 *** 非常简单,只要用户在安装路由器的时候修改自己默认的密码即可了,但是很多人都没有去做这一步,为黑客留下了很多“靶子”。
路由器品牌
默认IP
默认账号
默认密码
TP LINK TD8800
192.168.1.1
root
root
TPLINK 8830
192.168.10.200
root
Root
TP LINK R410
192.168.1.1
admin
admin
中兴831
192.168.1.1
ZXDSL
ZXDSL
Cyrix686 D-Link DT704P
192.168.0.1
admin
admin
D-Link DSL-500
10.1.1.1
admin
admin
腾达TED 8620
192.168.1.1
admin
admin
阿尔卡特SPEEDTOUCH HOME PLUS 511E
10.0.0.138
root
root
SPEEDTOUCH 500
10.0.0.138
admin
admin
topstar 顶星TE-SR400
192.168.62.1
admin
admin
eTEK
伊泰克 TD-2001
192.168.1.1
admin
admin
我们把一些常见的路由器配置口令和IP地址公布一下,希望大家根据自己的路由器品牌进行甄别,修改默认的口令。
需要说明的是,这些数据都不是什么机密,它们就印在产品的说明书上面,所以我们强烈建议路由方式上网的ADSL用户赶快修改你们的密码,不要为不法之徒留下犯罪的空间。
0条大神的评论