PnP BIOS In Driver

Windows内核调试

PnP BIOS In Driver


welfear 2009-04-20, 12:00 下午

我需要Windows Driver里调用 PnP BIOS的服务,我认为DMIScope的驱动就是这么修改DMI的。

但是有一台机器无法使用DMIScope修改DMI但可以在实模式下使用AMI的DMI editor修改DMI,而DMI Editor是直接调用PnP BIOS实现的。

所以我想请问,在保护模式下调用16位的PnP BIOS是否可行?

谢谢!

Re: PnP BIOS In Driver


Sysnap2006 2009-04-21, 08:58 上午
保护模式下调用BIOS可以通过vm8086来实现....在用户态调用比较简单..WINDOWS会帮你处理...在驱动里就需要自己设置下了....应该是可以实现的...因为缺换显示模式需要用到BIOS..

Re: PnP BIOS In Driver


王宇 2009-04-21, 09:39 上午
欢迎 sysnap~

Re: PnP BIOS In Driver


welfear 2009-04-21, 12:30 下午

多谢 sysnap!

 我在ring 3下使用了sinister的方法修改了TSS,又使用Porttalk的方法都没有成功.

我看了看DMIScope的驱动实现,应该是通过自己设置门来实现,但也没有成功 ;-(.

然后我把所有情况都排列组合一下,还是没有成功.

我认为使用v86模式调用PnP BIOS应该在TSS上下功夫,但依然没有结果.

 

Re: PnP BIOS In Driver


welfear 2009-04-21, 23:21 下午
我在Linux Driver里找到了参考代码;-)

Re: PnP BIOS In Driver


格蠹老雷 2009-04-21, 23:40 下午
不知道你要调用的16代码是不是相对简单和固定,如果其中会调用传统的BIOS服务(INT 15等),那么运行时还是会出问题。Windows使用了类似解释执行的方法,进入系统后,会把16位代码“翻译”为32位形式执行,这样会把“危险的”调用重定向。

Re: PnP BIOS In Driver


welfear 2009-04-22, 09:26 上午
您说的是ntvdm???
我把我碰到的情况详细说明一下:
我需要在windows nt中运行PnP BIOS规范中描述的PnP BIOS调用,
根据描述中的说明在"$PnP"之后有两个调用地址,一个是实模式下的入口地址,
一个是16位保护模式下的入口地址。我简单的看了看代码,没有中断调用,但是有
敏感指令使用。
我在Linux Driver中找到了通过/proc访问PnP BIOS的代码,也就是我所说的参考代码。
另外还可以试试KeI386BiosCall 之类的函数。

Re: PnP BIOS In Driver


王宇 2009-04-29, 10:30 上午

嗯,Ke386CallBios 就是从 VDM 走的。

NTSTATUS
Ke386CallBios (
    IN ULONG BiosCommand,
    IN OUT PCONTEXT BiosArguments
    )

/*++

Routine Description:

    This function invokes specified ROM BIOS code by executing
    "INT BiosCommand."  Before executing the BIOS code, this function
    will setup VDM context, change stack pointer ...etc.  If for some reason
    the operation fails, a status code will be returned.  Otherwise, this
    function always returns success regardless of the result of the BIOS
    call.

    N.B. This implementation relies on the fact that the direct
         I/O access operations between apps are serialized by win user.

Arguments:

    BiosCommand - Supplies which ROM BIOS function to invoke.

    BiosArguments - Supplies a pointer to the context which will be used
                    to invoke ROM BIOS.

Return Value:

    NTSTATUS code to specify the failure.

--*/

bios int 0x10 的调用:

        #define V86_CODE_ADDRESS    0x10000


        PUCHAR BaseAddress = (PUCHAR)V86_CODE_ADDRESS;

        //
        // Write "Int BiosCommand; bop" to reserved user space (0x1000).
        // Later control will transfer to the user space to execute
        // these two instructions.
        //

        *BaseAddress++ = INT_OPCODE;
        *BaseAddress++ = (UCHAR)BiosCommand;       /* ARG-2 */
        *(PULONG)BaseAddress = V86_BOP_OPCODE;

00010000 cd 10 c4 c4 fe 00 cd cd cd cd cd cd cd cd  ..............

Powered by Community Server Powered by CnForums.Net