實現(xiàn)在Windows下直接讀寫內(nèi)存的方法
Windows以它一致的圖形用戶界面、完善的內(nèi)存管理等特點,已被廣大用戶所接受,但在Windows下,計算機已運行在保護模式,雖然Windows已提供了一整套的內(nèi)存管理函數(shù),用戶還是不可訪問指定地址的內(nèi)存,致使許多中、小型企業(yè)開發(fā)的計算機插件無法在Windows下使用,因為編寫驅(qū)動程序是很費事的。他們僅希望能直接讀、寫電路板所占的內(nèi)存即可。本文介紹的是在Windows 3.1下,用Borland C 3.1編程環(huán)境,實現(xiàn)用戶對內(nèi)存直接讀寫的方法,讀者不難將它移植到其它編程語言。
1.利用Windows提供的各個段選擇符標號,在C源程序中將選擇符標號說明為外部變量。其對照表如下:
表1
2.利用宏定義MAKELONG(段內(nèi)偏移量,&段選擇符標號)即可得到一個長指針。
3.經(jīng)上述方法得到的指針與C語言中定義的指針是一樣的。
4.如果使用的段是D000H或E000H或其它上位內(nèi)存時,需改動Windows的系統(tǒng)配置文件SYSTEM.INI,利用字符編輯器,在[386Enh]小節(jié)中加入EmmExclude=xxxxyyyy一行,禁止Windows使用這段存儲空間。值xxxx和yyyy是16位內(nèi)存范圍。如開發(fā)的插件占用D000H段的64K,則應(yīng)加入這樣一行:EmmExclude=d000-dfff。
利用這一方法,已使我們自己開發(fā)的電路板(占用D000H段),在Windows控制下成功地運行了?紤]到讀者沒有相應(yīng)的硬件,這里以讀取中斷向量、計算機ROM的制造時間和對DOS用戶通訊區(qū)的讀寫為例,詳見以下程序。對于DOS用戶通訊區(qū)的內(nèi)容,讀者可用DOS的DEBUG程序檢查(D命令)和修改(E命令)。DOS的用戶通訊區(qū)在0040∶00F0H處開始,共計16個字節(jié)。在修改時請注意:從0040∶00F0H開始存放可顯示ASCII碼字符串,并以0結(jié)尾。
; MEMORY.DEF 模塊定義文件
NAME
Memory
DESCRIPTION'demonstrate an intergrated menu'
EXETYPEWINDOWS
STUB'WINSTUB.EXE'
CODEPRELOAD MOVEABLE DISCARDABLE
DATAPRELOAD MOVEABLE MULTIPLE
HEAPSIZE1024
STACKSIZE8192
EXPORTSWndProc
/*----------
MEMORY.RC
直接讀寫內(nèi)存的資源定義文件
----------*/
#include "memory.h"
MemoryMenu MENU
BEGIN
POPUP"取中斷向量[&I]"
BEGIN
MENUITEM "int 0&3h", IDM-INT03H
MENUITEM "int &10h", IDM-INT10H
MENUITEM "int &21h", IDM-INT21H
END
POPUP "ROM區(qū)域[&R]"
BEGIN
MENUITEM "制造時間[&T]",
IDM-TIME
MENUITEM "取用戶通訊區(qū)[&U]", IDM-READ
MENUITEM "存用戶通訊區(qū)[&S]", IDM-WRITE
END
MENUITEM "\a退出[&X]",
IDM-EXIT
END
/*----------
MEMORY.H
直接讀寫內(nèi)存的頭文件
----------*/
#define IDM-INT03H 101
#d
[1] [2] [3]