实现在Windows下直接读写内存的方法.docx
- 文档编号:6026004
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:5
- 大小:16.33KB
实现在Windows下直接读写内存的方法.docx
《实现在Windows下直接读写内存的方法.docx》由会员分享,可在线阅读,更多相关《实现在Windows下直接读写内存的方法.docx(5页珍藏版)》请在冰豆网上搜索。
实现在Windows下直接读写内存的方法
实现在Windows下直接读写内存的方法
Windows以它一致的图形用户界面、完善的内存管理等特点,已被广大用户所接受,但在Windows下,计算机已运行在保护模式,虽然Windows已提供了一整套的内存管理函数,用户还是不可访问指定地址的内存,致使许多中、小型企业开发的计算机插件无法在Windows下使用,因为编写驱动程序是很费事的。
他们仅希望能直接读、写电路板所占的内存即可。
本文介绍的是在Windows下,用BorlandC++编程环境,实现用户对内存直接读写的方法,读者不难将它移植到其它编程语言。
1.利用Windows提供的各个段选择符标号,在C源程序中将选择符标号说明为外部变量。
其对照表如下:
表1
2.利用宏定义MAKELONG(段内偏移量,&段选择符标号)即可得到一个长指针。
3.经上述方法得到的指针与C语言中定义的指针是一样的。
4.如果使用的段是D000H或E000H或其它上位内存时,需改动Windows的系统配置文件,利用字符编辑器,在[386Enh]小节中加入EmmExclude=xxxxyyyy一行,禁止Windows使用这段存储空间。
值xxxx和yyyy是16位内存范围。
如开发的插件占用D000H段的64K,则应加入这样一行:
EmmExclude=d000-dfff。
利用这一方法,已使我们自己开发的电路板(占用D000H段),在Windows控制下成功地运行了。
考虑到读者没有相应的硬件,这里以读取中断向量、计算机ROM的制造时间和对DOS用户通讯区的读写为例,详见以下程序。
对于DOS用户通讯区的内容,读者可用DOS的DEBUG程序检查(D命令)和修改(E命令)。
DOS的用户通讯区在0040∶00F0H处开始,共计16个字节。
在修改时请注意:
从0040∶00F0H开始存放可显示ASCII码字符串,并以0结尾。
;模块定义文件
NAME
Memory
DESCRIPTION’demonstrateanintergratedmenu’
EXETYPEWINDOWS
STUB’’
CODEPRELOADMOVEABLEDISCARDABLE
DATAPRELOADMOVEABLEMULTIPLE
HEAPSIZE1024
STACKSIZE8192
EXPORTSWndProc
/*----------
直接读写内存的资源定义文件
----------*/
#include""
MemoryMenuMENU
BEGIN
POPUP"取中断向量[&I]"
BEGIN
MENUITEM"int0&3h",IDM-INT03H
MENUITEM"int&10h",IDM-INT10H
MENUITEM"int&21h",IDM-INT21H
END
POPUP"ROM区域[&R]"
BEGIN
MENUITEM"制造时间[&T]",
IDM-TIME
MENUITEM"取用户通讯区[&U]",IDM-READ
MENUITEM"存用户通讯区[&S]",IDM-WRITE
END
MENUITEM"“a退出[&X]",
IDM-EXIT
END
/*----------
直接读写内存的头文件
----------*/
#defineIDM-INT03H101
#defineIDM-INT10H102
#defineIDM-INT21H103
#defineIDM-TIME201
#defineIDM-READ202
#defineIDM-WRITE203
#defineIDM-EXIT300
/*----------
用户对固定内存直接读写的表演程序
----------*/
#
#include""
#include
intPASCALWinMain(HANDLE,HANDLE,LPSTR,int);
longFARPASCALWndProc(HWND,UINT,UINT,LONG);
/*----WinMain()----*/
intPASCALWinMain(HANDLEhInstance,HANDLEhPrevInstance
LPSTRlpszCmdLine,intnCmdShow)
{
MSG
msg;
HWNDhWnd;
WNDCLASSwndclass;
if(!
hPrevInstance)
{
=CS-HREDRAW|CS-VREDRAW;
=WndProc;
=0;
=0;
=hInstance;
=LoadIcon(NULL,IDI-APPLICATION);
=LoadCursor(NULL,IDC-ARROW);
=GetStockObject(WHITE-BRUSH);
="MemoryMenu";
="直接读写存储器";
if(!
RegisterClass(&wndclass))
returnFALSE;
}
hWnd=CreateWindow(
"直接读写存储器",
"直接读写存储器",
WS-OVERLAPPEDWINDOW,
CW-USEDEFAULT,
CW-USEDEFAULT,
CW-USEDEFAULT,
CW-USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if(!
hWnd)
returnFALSE;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,N
ULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return;
}
/*----WndProc()----*/
longFARPASCALWndProc(HWNDhWnd,UINTmessage,UINTw
Param,LONGlParam
)
{
HDC
hDC;
HPENhOldPen,hNewPen;
RECTrect;
TEXTMETRICtm;
PAINTSTRUCTps;
UINTi;
charStrbuf[50];
WORDfar*InterruptVector;
charfar*bios;
externWORD-0000H;
externWORD-0040H;
externWORD-F000H;
switch(message)
{
caseWM-COMMAND:
switch(wParam)
{
caseIDM-INT03H:
InterruptVector=(WORDfar*)MAKELONG(0,&-0000H);
wsprintf(Strbuf,"向量地址:
%04X:
%04XH“n",
*(InterruptVector+0x06),
*(InterruptVector+0x07));
MessageBox(hWnd,Strbuf,
"int03h",MB-OK|MB-ICONSTOP);
return0;
caseIDM-INT10H:
InterruptVector=(WORDfar*)MAKELONG(0,&-0000H);
wsprintf(Strbuf,"向量地址:
%04X:
%04XH“n",*(InterruptVecto
r+0x20),
*(InterruptVector+0x21));
MessageBox(hWnd,Strbuf,
"int10h",MBOK|MB-ICONSTOP);
return0;
caseIDM-INT21H:
InterruptVector=(WORDfar*)MAKELONG(0,&-0000H);
wsprintf(Strbuf,"向量地址:
%04X:
%04XH“n",*(InterruptVecto
r+0x42),
*(InterruptVector+0x43));
MessageBox(hWnd,Strbuf,"int21h",MB-OK|MB-ICONSTOP);
return0;
caseIDM-TIME:
bios=(charfar*)MAKELONG(0xfff5,&-F000H);
MessageBox(hWnd,bios,
"ROM制造时间",MB-OK|MB-ICONSTOP);
return0;
caseIDM-READ:
bios=(charfar*)MAKELONG(0xF0,&-0040H);
MessageBox(hWnd,bios,
"取用户通讯区内容",MB-OK|MB-ICONSTOP);
return0;
caseIDM-WRITE:
bios=(charfar*)MAKELONG(0xF0,&-0040H);
for(i=0;i10;i++)*(bios+i)=‘A‘+i;*(bios+10)=0;
MessageBox(hWnd,"Write‘A‘-‘J‘charstring!
",
"写用户通讯区内容",MB-OK|MB-ICONSTOP);
return0;
caseIDM-EXIT:
SendMessage(hWnd,WM-CLOSE,0,0);
return0;
}
break;
caseWM-DESTROY:
PostQuitMessage(0);
return0;
default:
break;
}
returnDefWindowProc(hWnd,message,wParam,lParam);
}
/*----EndProgrammingofDemo----*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 Windows 直接 读写 内存 方法