_asm { push si push di mov bx, word ptr [dwPhysAddr+2] mov cx, word ptr [dwPhysAddr] mov si, word ptr [dwSize+2] mov di, word ptr [dwSize] mov ax, 800h int 31h jc failure mov word ptr [dwLineAddr+2], bx mov word ptr [dwLineAddr], cx jmp ok failure: mov word ptr [dwLineAddr+2], 0 mov word ptr [dwLineAddr], 0 ok: pop di pop si } if (!dwLineAddr) OutputDebugString("\r\nError mapping phys to linear address.");
return dwLineAddr; }
void DPMI::unmapPhys(DWORD dwLineAddr) { _asm { mov bx, word ptr [dwLineAddr+2] mov cx, word ptr [dwLineAddr] mov ax, 801h int 31h jnc ok } OutputDebugString("\r\nError unmapping linear addr"); ok: return; }
还有这个:
//make far pointer from physical address of base dwLineBase=DPMI::mapPhys(dwPhysBase,0x1000ul); wSel=AllocSelector(SELECTOROF(this)); SetSelectorBase(wSel,dwLineBase); SetSelectorLimit(wSel,0x00000ffful); BaseAddr=(LPBYTE)MAKELP(wSel,0);
#define DPMI_HEADFILE
/**********************************************************
Filename: DPMI.h
Function: Declare DPMI class
to use DPMI functions (0.9)
Writen by Han Changzhe, July 1997
**********************************************************/
#include <windows.h>
class DPMI {
public:
static DWORD mapPhys(DWORD dwPhysAddr, DWORD dwSize);
static void unmapPhys(DWORD dwLineAddr);
};
#endif //DPMI_HEADFILE
文件dpmi.cpp:
#include <windows.h>
#include "debug.h"
#include "DPMI.h"
DWORD DPMI::mapPhys(DWORD dwPhysAddr, DWORD dwSize)
{
DWORD dwLineAddr;
_asm {
push si
push di
mov bx, word ptr [dwPhysAddr+2]
mov cx, word ptr [dwPhysAddr]
mov si, word ptr [dwSize+2]
mov di, word ptr [dwSize]
mov ax, 800h
int 31h
jc failure
mov word ptr [dwLineAddr+2], bx
mov word ptr [dwLineAddr], cx
jmp ok
failure:
mov word ptr [dwLineAddr+2], 0
mov word ptr [dwLineAddr], 0
ok:
pop di
pop si
}
if (!dwLineAddr)
OutputDebugString("\r\nError mapping phys to linear address.");
return dwLineAddr;
}
void DPMI::unmapPhys(DWORD dwLineAddr)
{
_asm {
mov bx, word ptr [dwLineAddr+2]
mov cx, word ptr [dwLineAddr]
mov ax, 801h
int 31h
jnc ok
}
OutputDebugString("\r\nError unmapping linear addr");
ok:
return;
}
还有这个:
//make far pointer from physical address of base
dwLineBase=DPMI::mapPhys(dwPhysBase,0x1000ul);
wSel=AllocSelector(SELECTOROF(this));
SetSelectorBase(wSel,dwLineBase);
SetSelectorLimit(wSel,0x00000ffful);
BaseAddr=(LPBYTE)MAKELP(wSel,0);
。。
WORD wSel=SELECTOROF(BaseAddr);
dwLineBase=GetSelectorBase(wSel);
FreeSelector(wSel);
DPMI::unmapPhys(dwLineBase);
开机会从BIOS里读一段数据到内存的F000:AF4A段区,
现在需要读出来,
MEMCPY只能读本进程内存地址,
ReadProcess也试了下,不过好像同样不行……
或者你写一个DOS程序来获取BIOS信息,然后输出,程序中加载这个DOS程序,将其输出重定向到管道或者文件,然后取回。