阅读:3178回复:26
在WDM驱动中调用PnP Bios 提供的函数接口(DMI 操作)的方法讨论
背景:现在已知在某系统内存处会存储以下信息,其signature为 $PnP,从以下可得到对应函数的16 bit的 real /protected mode seg & offset的值。现在我已经能够在内存中找到$PnP,和函数地址的seg & offset值。
问题: 1)现在我想在WDM 驱动中调用该函数,也就是说我如何将16 bit的seg & offset 值转化为wdm 中32位的函数地址 2)大家还有什么好的方法,在WDM中搜索内存空间指定的内容?我是通过驱动将指定的物理地址映射到用户内存空间,让后再此空间查找 实现写 DMI 操作的 C 代码我已经实现, Field Offset Length Value Signature 00h 4 BYTES $PnP (ASCII) Version 04h BYTE 10h Length 05h BYTE 21h Controlfield 06h WORD Varies Checksum 08h BYTE Varies Eventaddress 09h DWORD Varies Real Mode 16-bit offset to entry point 0Dh WORD Varies Real Mode 16-bit code segment address 0Fh WORD Varies 16BitProtectedModeoffset to entry point 11h WORD Varies 16BitProtectedModecode segment base addr 13h DWORD Varies |
|
沙发#
发布于:2005-05-19 12:06
F000:0 中的东西实际上在进入win2000之后访问虚拟内存地址也是访问的物理内存同一块东西。可以直接把ip指到那里去跑也能跑出正常的结果,我试过可以。
在驱动中我是叫了块内存。然后手动call进去。也能正常返回。反正既然是f0000中的东西。随便啦。。。。 |
|
板凳#
发布于:2005-05-19 12:07
pnp function是很老的东西了。你还在用?奇怪中。。。。。
|
|
地板#
发布于:2005-05-23 09:41
TO:sharpor
我这边主要是用来修改DMI信息的, DOS下的代码,我写过了,是可以的。可在Windows下,我这就不行了,能否提供代码给我参考,谢谢了 |
|
地下室#
发布于:2005-05-23 10:37
访问pci寄存器的f000:0写保护。search $DMI。直接改f0000中的DMI table 吧。比较方便。
|
|
5楼#
发布于:2005-05-23 10:39
访问pci寄存器的f000:0写保护。search \"_DMI_\"。直接改f0000中的DMI table 吧。比较方便。
|
|
6楼#
发布于:2005-05-23 11:43
TO:sharpor
DMI信息是从 存储bios的flash 中load到内存中的,你的那种方法虽然能该,当只能改当前内存中的信息,机器一重起,那DMI信息不由恢复原来的数据了。 如果通过调用PnP bios的接口函数可以将 存储bios的flash中的DMI信息给改变(因为BIOS源码中那PnP 接口就是修改flash中的数据),这样才会永久的修改的 。 所以希望能在Windows中调用 PnP BIOS 提供的接口。 因此问题也就是:在 Windows下如何调用指定物理地址上对应的函数? |
|
7楼#
发布于:2005-05-23 14:29
你说得很对,bios在flash的时候会把f0000的dmi读出并更新。像我们提供的bios,会有一个bios32接口,去修改dmi信息,不会用pnp function,因为那个定义本来就是给16位代码用的,你硬要在windows下用不好吧。如果你们有bios 工程师就应该叫他们提供bios32接口。这是他们的事情,你不用操心啊。
如果是32位代码,我会在driver层定义一个buffer,把程序copy到buffer,然后push 好ip和cs,跳到buffer去跑,程序最后一句一定是retf,就可以安全返回了。 |
|
8楼#
发布于:2005-05-24 11:07
TO:sharpor
很受启发,谢谢 可我们这边的BIOS编译就用vc7和masm,asl,vc7不是32位的编译器吗,怎么编译生成的BIOS是16位的代码(其实我也不能确定该BIOS代码是不是16位的)? 因此我的问题是:用一个编译器,如何使编译生成的代码是16位和32位,大哥能否告知,或举个例子,不胜感激!!! |
|
9楼#
发布于:2005-05-24 12:12
小弟工作一年多,只叫过别人大哥哈,不敢当呀。。。。。
我们的代码呢,别人写好的,也是从32位代码跳到16位来,中间设置了一系列的寄存器,我看起来头大,莫看懂。 不过被同事洗了脑壳,说16位的代码,那时侯跑应该没有问题,我郁闷老,不晓得他说得对不对。你可以按我上面哪个方法跑先,没有异常就可以了撒 |
|
10楼#
发布于:2005-05-24 14:04
我也不晓得,其实说不定我们在同一个公司上班,做bios的公司就那么几家。。。。。
我上不了qq,证明你和我不在同一家。哈哈 |
|
11楼#
发布于:2005-05-24 14:08
不会吧。如果正常的话,我是上不了qq的,我用了一个代理软件(服务器在国外)上的(通常都是下午下班之后才上的)。
你在哪里啊? 偶在上海 |
|
12楼#
发布于:2005-05-24 14:13
顺便说说,
Intel? Platform Innovation Framework for EFI (“the Framework”) Base Training will be held in Shanghai at 8:30 AM on June 8(.9.10) on the 2F of ShanghaiMart. |
|
13楼#
发布于:2005-05-24 14:57
对啊,马上要上efi了。你要参加吗?
|
|
14楼#
发布于:2005-05-24 15:02
不知道上海有哪些公司在做bios,
我只知道phoenix有个分部在上海。 我在深圳。你那边行情如何 |
|
15楼#
发布于:2005-05-24 15:45
对啊,马上要上efi了。你要参加吗?
―――――――――――――――― 肯定去啊,也是我们老大叫我们去的,可以上三天的课 不知道上海有哪些公司在做bios, 我只知道phoenix有个分部在上海。 我在深圳。你那边行情如何 ―――――――――――――――― 对了,phoenxi是在上海是有分部, 在上海还很需要做BIOS的,不过大部分都是 一些台湾的代工PC,notebook,server工厂招人。 你是在做主板BIOS,还在哪家专门做BIOS的公司 [编辑 - 5/24/05 by sunvan] |
|
16楼#
发布于:2005-05-24 15:54
命苦,oem nb
命苦,职位太低,参加不了培训。 你是在写efi的东西哦。那应该是phoenix的吧 |
|
17楼#
发布于:2005-05-24 17:28
是啊,最近的一个项目是EFI的。
我们也是OEM的。上海很缺BIOS的人,我们部门也是的, 有没上qq,啊,我在qq上,想跟你交流交流 |
|
18楼#
发布于:2005-05-25 08:43
发邮件给我啊!最近策划走人
sharpor@163.com |
|
19楼#
发布于:2005-05-25 10:25
我在我们的文档上看到,下面的东东,
Slot 1 AD____25___ INTAPIRQ_B___, INTBPIRQ__C___, INTCPIRQ__D___, INTDPIRQ__A___ 请问 Slot 1 AD____25___ 这个AD是什么意思?我问了一个同事,听说是地址,看看PCI系统结构的书就知道了,可我现在还不知道? |
|
上一页
下一页