- 相關推薦
實現在Windows下直接讀寫內存的方法
Windows以它一致的圖形用戶界面、完善的內存管理等特點,已被廣大用戶所接受,但在Windows下,計算機已運行在保護模式,雖然Windows已提供了一整套的內存管理函數,用戶還是不可訪問指定地址的內存,致使許多中、小型企業開發的計算機插件無法在Windows下使用,因為編寫驅動程序是很費事的。他們僅希望能直接讀、寫電路板所占的內存即可。本文介紹的是在Windows 3.1下,用Borland C 3.1編程環境,實現用戶對內存直接讀寫的方法,讀者不難將它移植到其它編程語言。
1.利用Windows提供的各個段選擇符標號,在C源程序中將選擇符標號說明為外部變量。其對照表如下:
表1
2.利用宏定義MAKELONG(段內偏移量,&段選擇符標號)即可得到一個長指針。
3.經上述方法得到的指針與C語言中定義的指針是一樣的。
4.如果使用的段是D000H或E000H或其它上位內存時,需改動Windows的系統配置文件SYSTEM.INI,利用字符編輯器,在[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結尾。
; MEMORY.DEF 模塊定義文件
NAME
Memory
DESCRIPTION'demonstrate an intergrated menu'
EXETYPEWINDOWS
STUB'WINSTUB.EXE'
CODEPRELOAD MOVEABLE DISCARDABLE
DATAPRELOAD MOVEABLE MULTIPLE
HEAPSIZE1024
STACKSIZE8192
EXPORTSWndProc
/*----------
MEMORY.RC
直接讀寫內存的資源定義文件
----------*/
#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區域[&R]"
BEGIN
MENUITEM "制造時間[&T]",
IDM-TIME
MENUITEM "取用戶通訊區[&U]", IDM-READ
MENUITEM "存用戶通訊區[&S]", IDM-WRITE
END
MENUITEM "\a退出[&X]",
IDM-EXIT
END
/*----------
MEMORY.H
直接讀寫內存的頭文件
----------*/
#define IDM-INT03H 101
#d
[1] [2] [3]
【實現在Windows下直接讀寫內存的方法】相關文章:
語文讀寫學習方法11-01
內存·什么是內存電壓04-26
教育隨筆:讀寫結合的寫作教學方法05-01
精細直接積分法的積分方法選擇05-01
一種直接基于位移的抗震設計方法04-29
什么是內存04-26
直接04-29
直接推導攝動運動方程的一種方法05-01