收藏 分销(赏)

实现在Windows下直接读写内存的方法.docx

上传人:天**** 文档编号:4548677 上传时间:2024-09-27 格式:DOCX 页数:11 大小:15.32KB 下载积分:8 金币
下载 相关 举报
实现在Windows下直接读写内存的方法.docx_第1页
第1页 / 共11页
实现在Windows下直接读写内存的方法.docx_第2页
第2页 / 共11页


点击查看更多>>
资源描述
实现在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()----*/ long FAR PASCAL WndProc (HWND hWnd, UINT message, UINT w Param,LONG lParam ) { HDC hDC; HPEN hOldPen,hNewPen; RECTrect; TEXTMETRICtm; PAINTSTRUCTps; UINT i; char Strbuf[50]; WORD far * InterruptVector; char far * bios; extern WORD-0000H; extern WORD-0040H; extern WORD-F000H; switch (message) { case WM-COMMAND: switch (wParam) { case IDM-INT03H: InterruptVector=(WORD far *)MAKELONG(0,&-0000H); wsprintf(Strbuf,"向量地址:%04X:%04XH“n", *(InterruptVector+0x06), *(InterruptVector+0x07)); MessageBox (hWnd,Strbuf, "int 03h", MB-OK | MB-ICONSTOP); return 0; case IDM-INT10H: InterruptVector=(WORD far *)MAKELONG(0,&-0000H); wsprintf(Strbuf,"向量地址:%04X:%04XH“n",*(InterruptVecto r+0x20), *(InterruptVector+0x21)); MessageBox (hWnd,Strbuf, "int 10h",MB OK | MB-ICONSTOP); return 0; case IDM-INT21H: InterruptVector=(WORD far *)MAKELONG(0,&-0000H); wsprintf(Strbuf,"向量地址:%04X:%04XH“n",*(InterruptVecto r+0x42), *(InterruptVector+0x43)); MessageBox (hWnd,Strbuf,"int 21h",MB-OK | MB-ICONSTOP); return 0; case IDM-TIME: bios=(char far *)MAKELONG(0xfff5,&-F000H); MessageBox (hWnd,bios, "ROM制造时间",MB-OK | MB-ICONSTOP); return 0; case IDM-READ: bios=(char far *)MAKELONG(0xF0,&-0040H); MessageBox (hWnd,bios, "取用户通讯区内容",MB-OK | MB-ICONSTOP); return 0; case IDM-WRITE: bios=(char far *)MAKELONG(0xF0,&-0040H); for(i=0;i10;i++) *(bios+i)=‘A‘+i; *(bios+10)=0; MessageBox (hWnd,"Write ‘A‘-‘J‘char string !", "写用户通讯区内容",MB-OK | MB-ICONSTOP); return 0; case IDM-EXIT: SendMessage (hWnd,WM-CLOSE,0,0); return 0; } break; case WM-DESTROY: PostQuitMessage (0); return 0; default: break; } return DefWindowProc (hWnd,message,wParam,lParam); } /*----End Programming of Demo----*/
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服