还是让我来当一回文抄公吧!以下的内容都不是我写的,别见怪。
恐怕不能直接编写32位程序访问所有的内存(只有通过VXD),
但可以编写16位程序(win31)或DOS下的程序访问到所有的内存.
原因如下:
在dos或286(保护)模式下对内存的访问是通过段地址(或选择符):偏移量(16:16位)的形式进行的,
他们工作在同一级别上.而Win95是工作386(虚拟86)模式下,对内存的访问是Flat的内存访问也就是
0:32位的形式,而只有工作在ring0级别的程序才能访问到所有内存,在加之叶面内存调度管理使得
对内存的访问更复杂化,0-2G的内存地址是系统分配给应用程序的,2G-4G的内存是系统占用.一般工
作在win95下的32位程序只是工作在ring3上,因此不能直接访问不属于自己的内存,除非编写一个特
殊的DLL---VXD,设备驱动程序(VXD)工作在ring0上,因此可以访问所有内存.用Delphi来编写VXD是
可行的,但需要转换大量的头文件,同时必须找资料,学习VXD的特殊编写规则(不知道是不是DDK--VXD
的开发工具包for C,听说有for Delphi 的VXD开发工具包,使得在delphi下开发非常轻松,可惜要
美元!).
如果你只是希望能访问所有的内存,那么你可以使用Tvichw32元件,或则编写16位程序(win31)或
DOS下的程序,那里没有级别的限制,方便得多.
附:
编写16位程序访问指定内存的值的函数:
{Access Memory for win31&win95}
{must compile with delphi1.0---16bit App}
{no VXD or DLL need}
{pure native source code here,all include}
{Writen by Xueyu,LEE}
const fMemoryMapped:boolean=false;
var fSelector :word;
fBaseAddr :LongInt;
fMemoryPointer
ointer;
fMemorySize :Word;
function MapPhysMemory(PhAddr:LongInt; Size:Word)
ointer;
{input: }
{ phAddr: physics Address}
{ Size : Alloc Size(bytes)}
{output:}
{ Result: pointer to the physics memory}
{example:}
{ access the address 0:$123}
{ ptr:=MapPhysMemory($123,1)}
begin
Result:=fMemoryPointer;
if fMemoryMapped then UnmapPhysMemory;
fMemorySize:=Size;
fBaseAddr:=PhAddr;
fMemoryMapped:=TRUE;
fSelector:=AllocSelector(DSeg);
SetSelectorBase(fSelector,PhAddr);
SetSelectorLimit(fSelector,Size);
fMemoryPointer:=Ptr(fSelector,0);
Result:=fMemoryPointer;
end;
procedure UnmapPhysMemory;
begin
if fMemoryMapped then FreeSelector(fSelector);
fSelector:=0;
fMemoryMapped:=FALSE;
fBaseAddr:=0;
fMemoryPointer:=NIL;
fMemorySize:=0;
end;
读取正在运行的一个程序的内存
BOOL DebugActiveProcess(DWORD dwProcessId); //将dwProceeeID进程设置为被当前进程调试
BOOL ReadProcessMemory(
HANDLE hProcess, // handle of the process whose memory is read
LPCVOID lpBaseAddress, // address to start reading
LPVOID lpBuffer, // address of buffer to place read data
DWORD nSize, // number of bytes to read
LPDWORD lpNumberOfBytesRead // address of number of bytes read
);
BOOL WriteProcessMemory(
HANDLE hProcess, // handle to process whose memory is written to
LPVOID lpBaseAddress, // address to start writing to
LPVOID lpBuffer, // pointer to buffer to write data to
DWORD nSize, // number of bytes to write
LPDWORD lpNumberOfBytesWritten // actual number of bytes written
);
可以干任何肮脏的事情......