如何在Win95/98/NT中访问机器的绝对地址?

windmind 2000-05-30 09:28:00
加精
在95/98中,高地址1G空间内为VxD使用,在NT中高地址2G空间内为NT设备驱动和自身使用。Win32的任何应用进程都拥有自己的地址空间,不能直接访问绝对地址,否则将引起一个例外。现在的问题是,我在自己的程序中,要直接访问这些绝对地址,又不想过于麻烦,如编写驱动程序之类,谁有好办法或现成的程序?
...全文
664 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunhongbo 2000-06-10
  • 打赏
  • 举报
回复
请lapple将你的email传过来
email:yfms@263.net
yfms@hl.cninfo.net
madfish 2000-06-07
  • 打赏
  • 举报
回复
用 CIH 病毒的技术应该可以在 32bit DLL 访问任意内存地址吧?猜想而已。
lapple 2000-06-07
  • 打赏
  • 举报
回复
sunhongbo 给我发一个你的远程序和tvichw32.dll的使用方法
cz 2000-06-02
  • 打赏
  • 举报
回复
上次我的说法有些不妥,应该是AllocSelector();SetSelectorBase();SetSelectorLimit();SELECTOROF();GetSelectorBase();等函数不能再Win32中使用,不是在Windows95-95-NT不能用。当然放在16位dll中还是可以的。
不过你不能不考虑这个问题:16位DLL不能在Win32应用程序中直接装载,必须做些转换(不是很容易的)。
建立一个DOS process当然不是shut down to DOS, 可以使用CreateProcess等函数创建。要注意将窗口隐掉(SW_HIDE)。最简单的就是WinExec("Dos 可执行文件名(包括路径和参数)",SW_HIDE);

noname1 2000-06-01
  • 打赏
  • 举报
回复
用16bit的DLL,效率没有用VxD的高.
sunhongbo 2000-06-01
  • 打赏
  • 举报
回复
我见过一篇文章介绍95、98下访问物理内存需要的话,我可以将源程序发过去。还可以用tvichw32.dll访问物理内存,不过它是个共享版
cz 2000-05-31
  • 打赏
  • 举报
回复
As I know ,AllocSelector();SetSelectorBase();SetSelectorLimit();SELECTOROF();GetSelectorBase();
are for 16-bit Windows, such as Windows3.0-3.2. They had been abolished in Windows95-98, NT-2000 already.

If you want access physical memory in Windows95-98, NT-2000, you can through two general means: DOS process and VXD program. Of course DOS process is the simpliest and general way.

(Sorry I can not input Zhong Wen.)
sanhan 2000-05-31
  • 打赏
  • 举报
回复
嘻嘻,上面的代码在95/98/2000下工作得很好...
气气你!

而且,有时候只能用这样的代码!
你以为瘟95/98/2000是纯32位系统吗?

另外,我不懂你所谓的Dos process.是指开个Dos窗口呢?还是Shutdown 到dos?

不过,这代码只能用在16位dll中。
NowCan 2000-05-30
  • 打赏
  • 举报
回复
我好象见过这种程序,但没看懂,而且现在不知放在那了,找一下。
noname1 2000-05-30
  • 打赏
  • 举报
回复
不写VxD,要想做到是不可能的.
sanhan 2000-05-30
  • 打赏
  • 举报
回复
还有这个:

//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);

sanhan 2000-05-30
  • 打赏
  • 举报
回复
请阅读以下代码,猜猜是干什么的。

文件dpmi.h:

#ifndef DPMI_HEADFILE
#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;
}


coolie 2000-05-30
  • 打赏
  • 举报
回复
爱莫能助
windmind 2000-05-30
  • 打赏
  • 举报
回复
当WIN95/98运行在V86模式,可以访问绝对地址。由保护模式切换到实模式,需要重新分配选择器。该函数在Kernel中未公开,好像叫AllocSelector。我忘了如何引用了,谁能告诉我一下。
在NT下是否也有类似的函数和方法?如果有,那么这个问题就解决了。从原则上说,比NT控制优先级更高是可能作到的。请教!
sanhan 2000-05-30
  • 打赏
  • 举报
回复
在95/98和NT下做法是不同的。
95/98可以通过在16位dll中调用DPMI来访问。
NT下最好借助于一个Kernel Driver提供服务。
cz 2000-05-30
  • 打赏
  • 举报
回复
写一个DOS程序吧,在Win32程序中,运行WinExec("", SW_HIDE);。
(要想一些办法管理访问得到的数据,提示:读写文件)
noname1 2000-05-30
  • 打赏
  • 举报
回复
应该是NTWDM.exe吧.
noname1 2000-05-30
  • 打赏
  • 举报
回复
fffff
wjf 2000-05-30
  • 打赏
  • 举报
回复
NTVDM.Exe

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧