一. message 参数?br> message
它能够在~译信息输出H口中输出相应的信息Q这对于源代码信息的控制是非帔R要的?/p>
其用方法ؓQ?nbsp; #pragma message("消息文本")
当编译器遇到q条指o时就在编译输出窗口中消息文本打印出来?br> 当我们在E序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设|这些宏Q此时我们可以用q条指o在编译的时候就q行查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86q个宏可以用下面的方法:
#ifdef _X86
#pragma message("_X86 macro activated!")
#endif
当我们定义了_X86q个宏以后,应用E序在编译时׃在编译输出窗口里昄
"_X86 macro activated!"
q样Q我们就不会因ؓ不记得自己定义的一些特定的宏而抓x腮了?/p>
? 另一个用得比较多的#pragma参数是code_seg?br> 格式如:
#pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] )
该指令用来指定函数在.obj文g中存攄?观察OBJ文g可以使用VC自带的dumpbin命o行程?函数?obj文g中默认的存放节ؓ.text节,如果code_seg没有带参数的?则函数存攑֜.text节中?/p>
push (可选参? 一个记录放到内部编译器的堆栈中,可选参数可以ؓ一个标识符或者节?br> pop(可选参? 一个记录从堆栈端弹出,该记录可以ؓ一个标识符或者节?br> identifier (可选参? 当用push指o?为压入堆栈的记录指派的一个标识符,当该标识W被删除的时候和其相关的堆栈中的记录被弹出堆栈
"segment-name" (可选参? 表示函数存放的节?br> 例如:
//默认情况?函数被存攑֜.text节中
void func1() { // stored in .text
}
//函数存攑֜.my_data1节中
#pragma code_seg(".my_data1")
void func2() { // stored in my_data1
}
//r1为标识符,函数放?my_data2节中
#pragma code_seg(push, r1, ".my_data2")
void func3() { // stored in my_data2
}
int main() {
}
? #pragma once (比较常用Q?br> q是一个比较常用的指o,只要在头文g的最开始加入这条指令就能够保证头文件被~译一?/p>
? #pragma hdrstop表示预编译头文g到此为止Q后面的头文件不q行预编译?br> BCB可以预编译头文g以加快链接的速度Q但如果所有头文g都进行预~译又可能占太多盘I间Q所以用这个选项排除一些头文g?br> 有时单元之间有依赖关p,比如单元A依赖单元BQ所以单元B要先于单元A~译。你可以?pragma startup指定~译优先U,如果使用?pragma package(smart_init) QBCB׃Ҏ优先U的大小先后~译?/p>
? #pragma warning指o
该指令允许有选择性的修改~译器的警告消息的行?br> 指o格式如下:
#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]
#pragma warning( push[ ,n ] )
#pragma warning( pop )
主要用到的警告表C有如下几个:
once:只显CZ?警告/错误{?消息
default:重置~译器的警告行ؓ到默认状?br> 1,2,3,4:四个警告U别
disable:止指定的警告信?br> error:指定的警告信息作ؓ错误报告
如果大家对上面的解释不是很理?可以参考一下下面的例子及说?/p>
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
{h于:
#pragma warning(disable:4507 34) // 不显C?507?4可告信?br> #pragma warning(once:4385) // 4385可告信息仅报告一?br> #pragma warning(error:164) // ?64可告信息作Z个错误?br> 同时q个pragma warning 也支持如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
q里n代表一个警告等U?1---4)?br> #pragma warning( push )保存所有警告信息的现有的警告状态?br> #pragma warning( push, n)保存所有警告信息的现有的警告状态,q且把全局警告{讑֮为n?br> #pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
#pragma warning( pop )
在这D代码的最后,重新保存所有的警告信息(包括4705Q?706?707)
在用标准C++q行~程的时候经怼得到很多的警告信?而这些警告信息都是不必要的提C?所以我们可以?pragma warning(disable:4786)来禁止该cd的警告在vc中用ADO的时候也会得C必要的警告信?q个时候我们可以通过#pragma warning(disable:4146)来消除该cd的警告信?/p>
? pragma comment(...)
该指令的格式为: #pragma comment( "comment-type" [, commentstring] )
该指令将一个注释记录放入一个对象文件或可执行文件中,comment-type(注释cd):可以指定ZU预定义的标识符的其中一U?br> 五种预定义的标识Wؓ:
1、compiler:编译器的版本号和名U放入目标文件中,本条注释记录被~译器忽?br>如果你ؓ该记录类型提供了commentstring参数,~译器将会生一个警?br>例如:#pragma comment( compiler )
2、exestr:commentstring参数攑օ目标文g?在链接的时候这个字W串被攑օ到可执行文g?当操作系l加载可执行文g的时?该参数字W串不会被加载到内存?但是,该字W串可以被dumpbin之类的程序查扑ևq打印出?你可以用q个标识W将版本L之类的信息嵌入到可执行文件中!
3、lib:q是一个非常常用的关键?用来一个库文g链接到目标文件中常用的lib关键字,可以帮我们连入一个库文g?br> 例如:
#pragma comment(lib, "user32.lib")
该指令用来将user32.lib库文件加入到本工E中
4、linker:一个链接选项攑օ目标文g?你可以用这个指令来代替由命令行传入的或者在开发环境中讄的链接选项,你可以指?include选项来强制包含某个对?例如:
#pragma comment(linker, "/include:__mySymbol")
你可以在E序中设|下列链接选项
/DEFAULTLIB
/EXPORT
/INCLUDE
/MERGE
/SECTION
q些选项在这里就不一一说明?详细信息Lmsdn!
5、user:一般的注释信息攑օ目标文g中commentstring参数包含注释的文本信?q个注释记录被链接器忽?br> 例如:
#pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )
在此 Symbol 下載裝是依處理器型?(x86、Itanium ?x64) 以及 Build 別 (retail 以及 checked) 來列C。幾乎所有的客戶都需要用?Retail 版本?Symbol。如果您正在 Debugging 一個特D版本的 Windows 需要額外的 Debugging 資訊Q那您就應該下載用於 Checked 版本?Symbol?/p>
Windows XP ?Windows Server 2003 不需要當地語pd版本?Symbol ?Debug 當地語系化版本的產品。每一?Windows XP ?Windows Server™ 2003 Symbol 下載裝皆可用於 Debugging 所有已當地語系化的版本?/p>
每一?x86 Symbol 可能需?750 MB 或更大的碟I間Q每?Itanium Symbol 可能需?560 MB 或更大的碟I間Q而每?x64 Symbol 套g可能需?640 MB 或更大空間。此I間需求量包含下載的封裝與其所需的暫存檔案所要求的空間大,您在下載與安裝Q?Symbol 套g之前臛_預留 1 GB 的可用硬空間?/p>
注意Q若您為 MSDN Subscriber 且用的?Windows Vista CTP 版本Q您可由 Microsoft Connect 伺服器取?CTP 版本使用?Symbols 裝套g。若您目前並?MSDN Subscriber 但想成為 MSDN SubscriberQ您可以由此處加入?/p>
檢視用於 Symbol 裝的下載連結
Windows Vista Release Candidate 1 (RC1)
這些裝檔案中包含了所有用?Debug Windows Vista Release Candidate 1 (RC1) 的完?Symbol 套g?/p>
Windows Vista RC1 x86 retail symbols, all languages (檔案大小Q?70 MB - 大部份的客戶需要這個封裝套件?
Windows Vista RC1 Itanium retail symbols, all languages (檔案大小Q?48 MB)
Windows Vista RC1 x64 retail symbols, all languages (檔案大小Q?05 MB)
Windows Vista RC1 x86 checked symbols, all languages (檔案大小Q?48 MB)
Windows Vista RC1 Itanium checked symbols, all languages (檔案大小Q?87 MB)
Windows Vista RC1 x64 checked symbols, all languages (檔案大小Q?24 MB)
Windows Server 2003 and Windows XP x64 Edition
?Service Pack 1 ?Windows Server 2003 Symbols
此封裝包含在 Debug 己安?Service Pack 1 ?Windows Server 2003 的完?Symbol 套g。其?Windows Server 2003 ?Symbol p更新為符?Windows Server 2003 Service Pack 1 更新檔案?Symbol?/p>
附註QWindows Server 2003 SP1 x64-based Symbol 套g亦可用於 Windows XP x64 Edition?/p>
Windows Server 2003 with Service Pack 1 x86 retail symbols, all languages (檔案大小Q?53 MB - 大部份的客戶需要這個封裝套件?
Windows Server 2003 with Service Pack 1 x86 checked symbols, all languages (檔案大小Q?46 MB)
Windows Server 2003 with Service Pack 1 Itanium-based retail symbols, all languages (檔案大小Q?02 MB)
Windows Server 2003 with Service Pack 1 Itanium-based checked symbols, all languages (檔案大小Q?23 MB)
Windows Server 2003 with Service Pack 1 x64-based retail symbols, all languages (檔案大小Q?23 MB)
Windows Server 2003 with Service Pack 1 x64-based checked symbols, all languages (檔案大小Q?13 MB)
減少下載的量QWindows Server 2003 Service Pack 1
此封裝比含有 Service Pack 1 ?Windows Server 2003 完整套g的下載量來的。它僅包含隨附於 Windows Server 2003 Service Pack 1 之檔案的 Symbol。若您己E安裝了 Windows Server 2003 ?SymbolQ您可以它安裝在相同的路徑Q這樣您就擁有了含?Service Pack 1 ?Windows Server 2003 完整 Symbol 套g?/p>
Windows Server 2003 Service Pack 1 x86 retail symbols, all languages (檔案大小Q?30 MB - 此為大多數客戶所需要的裝?
Windows Server 2003 Service Pack 1 x86 checked symbols, all languages (檔案大小Q?21 MB)
Windows Server 2003 Service Pack 1 Itanium-based retail symbols, all languages (檔案大小Q?1 MB)
Windows Server 2003 Service Pack 1 Itanium-based checked symbols, all languages (檔案大小Q?10 MB)
不包?Service Pack ?Windows Server 2003 Symbols
Windows Server 2003 x86 retail symbols, all languages (檔案大小Q?68 MB - 此為大多數客戶所需要的裝?
Windows Server 2003 Itanium retail symbols, all languages (檔案大小Q?05 MB)
Windows Server 2003 x86 checked symbols, all languages (檔案大小Q?63 MB)
Windows Server 2003 Itanium checked symbols, all languages (檔案大小Q?23 MB)
Windows XP
?Service Pack 2 ?Windows XP Symbol
此封裝包含在 Debug 己安?Service Pack 2 ?Windows XP 的完?Symbol 套g。其?Windows XP ?Symbol p更新為符?Windows XP Service Pack 2 更新檔案?Symbol?/p>
Windows XP with Service Pack 2 x86 retail symbols, all languages (檔案大小Q?95 MB - 此為大多數客戶所需要的裝?
Windows XP with Service Pack 2 x86 checked symbols, all languages (檔案大小Q?88 MB)
減少下載的量QWindows XP Service Pack 2
此封裝比含有 Service Pack 2 ?Windows XP 完整套g的下載量來的。它僅包含隨附於 Service Pack 2 之檔案的 Symbol。若您己E安裝了 Windows XP ?SymbolQ您可以它安裝在相同的路徑Q這樣您就擁有了含?Service Pack 2 ?Windows XP 完整 Symbol 套g?/p>
Windows XP Service Pack 2 x86 retail symbols, all languages (檔案大小Q?45 MB - 此為大多數客戶所需要的裝?
Windows XP Service Pack 2 x86 checked symbols, all languages (檔案大小Q?32 MB)
Windows XP with Service Pack 1 以及 Service Pack 1a Symbol
此封裝包含在 Debug 己安?Service Pack 1 ?Service Pack 1a ?Windows XP 的完?Symbol 套g。其?Windows XP ?Symbol p更新為符?Windows XP Service Pack 1 以及 Service Pack 1a 更新檔案?Symbol?/p>
Windows XP with Service Pack 1 and Service Pack 1a x86 retail symbols, all languages (檔案大小Q?72 MB - 此為大多數客戶所需要的裝?
Windows XP with Service Pack 1 and Service Pack 1a Itanium retail symbols, all languages (檔案大小Q?01 MB)
Windows XP with Service Pack 1 and Service Pack 1a x86 checked symbols, all languages (檔案大小Q?68 MB)
Windows XP with Service Pack 1 and Service Pack 1a Itanium checked symbols, all languages (檔案大小Q?24 MB)
減少下載的量QWindows XP Service Pack 1 以及 Service Pack 1a Symbol
此封裝比含有 Service Pack 1 以及 Service Pack 1a ?Windows XP 完整套g的下載量來的。它僅包含隨附於 Service Pack 1 以及 Service Pack 1a 之檔案的 Symbol。若您己E安裝了 Windows XP ?SymbolQ您可以它安裝在相同的路徑Q這樣您就擁有了含?Service Pack 1 以及 Service Pack 1a ?Windows XP 完整 Symbol 套g?
Windows XP Service Pack 1 and Service Pack 1a x86 retail symbols, all languages (檔案大小Q?03 MB - Most customers want this package.)
Windows XP Service Pack 1 and Service Pack 1a Itanium retail symbols, all languages (檔案大小Q?0 MB)
Windows XP Service Pack 1 and Service Pack 1a x86 checked symbols, all languages (檔案大小Q?6 MB)
Windows XP Service Pack 1 and Service Pack 1a Itanium checked symbols, all languages (檔案大小Q?3 MB)
Windows XP Symbol 其中不含 Service Pack
Windows XP x86 retail symbols, all languages (檔案大小Q?49 MB - 此為大多數客戶所需要的裝?
Windows XP IA-64 retail symbols, all languages (檔案大小Q?5 MB)
Windows XP x86 checked symbols, all languages (檔案大小Q?47 MB)
Windows XP IA-64 checked symbols, all languages (檔案大小Q?16 MB)
Windows 2000
下列連結連接x一?Symbols 裝的下載處Q或是帶領您x供關?Windows 2000 Symbol 下載資訊的網站?
Windows 2000 SP4 的更新彙^套?1 (Update Rollup 1)。欲安裝 Windows 2000 SP4 的更新彙^套?1 中所包括的新?SymbolsQ請在下方的下拉式選單中選擇您想要下載的語言版本然後?"按一下這裡開始下載" 的連結按一下。欲擁有完整?Symbol 套gQ您必須先安?Windows 2000 SymbolQ之後接著安?Service Pack 4 SymbolQ最後再安裝 Windows 2000 SP4 更新彙總套g 1 ?Symbol?/p>
< language="javascript" type="text/javascript"> function ShowSelectInfoSP4UR1() { oElement = window.event.srcElement for (i=0; i 選擇所需的語a版本Q?br>
Arabic Chinese (Simplified) Chinese (Traditional) Czech Danish Dutch English Finnish French German Greek Hebrew Hungarian Italian Japanese Japanese NEC98 Korean Norwegian Polish Portugese Portugese (Brazilian) Russian Spanish Swedish Turkish 按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
按一下這裡開始下載 (下載量: 22 MB)
Windows 2000 Service Pack 4 。安?Service Pack 4 所提供的額?SymbolQ請在下面的下拉式表單中選擇您想要下載的語言然後按一?"按一下這裡開始下載" 的連結項目。欲擁有完整?Symbol 套gQ您必須在安?Service Pack 4 Symbol 前先安裝 Windows 2000 Symbol?/p>
< language="javascript" type="text/javascript"> function ShowSelectInfoSP4() { oElement = window.event.srcElement for (i=0; i 選擇所需的語a版本Q?br>
Arabic Chinese (Simplified) Chinese (Traditional) Chinese (Hong Kong SAR) Czech Danish Dutch English Finnish French German Greek Hebrew Hungarian Italian Japanese Japanese NEC98 Korean Norwegian Polish Portugese Portugese (Brazilian) Russian Spanish Swedish Turkish 按一下這裡開始下載 (下載量:72 MB)
按一下這裡開始下載 (下載量:72 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
按一下這裡開始下載 (下載量:74 MB)
若您有特D版本的 Service Pack 4 且需要更多的 Debugging 資訊Q那您應該下載用?Checked 版本?Symbol。下載英文版?Service Pack 4 Checked 版本Q請按一下這裡 (下載量: 66 MB)?/p>
Windows 2000 Service Pack 3。安?Service Pack 3 所提供的額?SymbolQ請在下面的下拉式表單中選擇您想要下載的語言然後按一?"按一下這裡開始下載" 的連結項目。欲擁有完整?Symbol 套gQ您必須在安?Service Pack 3 Symbol 前先安裝 Windows 2000 Symbol?/p>
< language="javascript" type="text/javascript"> function ShowSelectInfo() { oElement = window.event.srcElement for (i=0; i 選擇所需的語aQ?br>
English French German Italian Japanese Japanese NEC98 Portugese (Brazilian) Spanish 按一下這裡開始下載 (下載量:67 MB)
按一下這裡開始下載 (下載量:67 MB)
按一下這裡開始下載 (下載量:67 MB)
按一下這裡開始下載 (下載量:67 MB)
按一下這裡開始下載 (下載量:67 MB)
按一下這裡開始下載 (下載量:67 MB)
按一下這裡開始下載 (下載量:67 MB)
按一下這裡開始下載 (下載量:67 MB)
若您有特D版本的 Service Pack 3 且需要更多的 Debugging 資訊Q那您應該下載用?Checked 版本?Symbol。下載英文版?Service Pack 3 Checked 版本Q請按一下此處?/p>
Windows 2000 Service Pack 2 Security Rollup Package 1。安?Service Pack 2 Security Rollup Package 1 所提供的額?SymbolQ請在下面的下拉式表單中選擇您想要下載的語言然後按一?"按一下這裡開始下載" 的連結項目。欲擁有完整?Symbol 套gQ您必須先安?Windows 2000 SymbolQ再安裝 Service Pack 2 SymbolQ最後再安裝 Service Pack 2 Security Rollup Package 1 Symbol?/p>
選擇所需的語aQ?br>
English Arabic Chinese (Simplified) Chinese (Traditional) Czech Danish Dutch Finnish French German Greek Hebrew Hungarian Italian Japanese Japanese NEC98 Korean Norwegian Polish Portugese Portugese (Brazilian) Russian Spanish Swedish Turkish 按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
按一下這裡開始下載 (下載量:19 MB)
Windows 2000 Service Pack 2 Symbols - 跟隨 SP2 所新增?Symbol。欲擁有用於含有 Service Pack 2 ?Windows 2000 的完?Symbol 套gQ您必須先安?Windows 2000 Symbo 然後再安?Service Pack 2 Symbol?/p>
Windows 2000 Service Pack 1 Symbols - 跟隨 SP1 所新增?Symbol。欲擁有用於含有 Service Pack 1 ?Windows 2000 的完?Symbol 套gQ您必須先安?Windows 2000 Symbo 然後再安?Service Pack 1 Symbol?/p>
Windows 2000 Symbols - 用於 Debugging Windows 2000 所需的檔案?br>
Debugging 說明?- Zq助?Debugging 問題Q請提送線上說明檔的要求或是用附加的資源?DDK 開發人員支援?/p>
意見反應 - 我們期待得到您闗於 Symbol 的意見反應。請您的徏議或是錯誤報?windbgfb@microsoft.com?雖然您無法從此處取得技術支_但是您的意見可以幫助我們未來在 Symbol 的變更計畫並且得它在未來更合於您的需求?/p>
Last Updated: 2006 q?9 ?13 ?/p>
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/coffeemay/archive/2006/10/12/1331356.aspx
如果要在应用E序中以物理地址方式讉K内存Q自然而然的办法,是编写一个专用的驱动E序Q如大家熟悉的WinIOQ,里面讄一定的IOCTL码,应用E序通过调用DeviceIoCtrol()来实现这L功能?/p>
那么Q有没有一U方法,省去~写专用驱动E序q一步,很方便地p讉K物理内存呢?{案是肯定的。实际上Q微软早q我们准备好了一套办法,只是他们U而不宣Ş了。系l内Z个叫做PhysicalMemory的内核对象,可以通过pȝ核心文gNTDLL.DLL中的有关APIq行操纵Q从而实现物理内存的直接讉K。微软声U这些API是用于驱动程序开发的Q在VC/.NET中未提供原型说明和库文gQ然而事实证明在应用E序中调用它们是没有问题的。我们感兴趣的API主要包括Q?/p>
ZwOpenSection ?NtOpenSection - 打开内核对象
ZwMapViewOfSection ?NtMapViewOfSection - 映射虚拟地址I间
ZwUnmapViewOfSection ?NtUnmapViewOfSection - 取消地址I间映射
RtlInitUnicodeString - 用UNICODE串初始化UNICODE描述的结?
以下的代码描qC如何利用NTDLL.DLL中的上述几个APIQ实现对物理内存的读取。需要指出的是,只有system拥有d权限Qadministrator只有L限,而userq读权限都没有。这一点,是不能与专用驱动E序Ҏ向相比的?/p>
在VC/.NET中,׃没有相应的原型说明和库文Ӟ我们用GetProcAddress()q行DLL昑ּ调用。前面大D늚代码Q用于说明必需的类型和l构。读取物理内存的主要步骤为:打开内核对象 → 映射虚拟地址I间 → d(复制)内存 → 取消地址I间映射?/p>
typedef LONG NTSTATUS;
typedef struct _UNICODE_STRING
{
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
typedef enum _SECTION_INHERIT
{
ViewShare = 1,
ViewUnmap = 2
} SECTION_INHERIT, *PSECTION_INHERIT;
typedef struct _OBJECT_ATTRIBUTES
{
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
#define InitializeObjectAttributes( p, n, a, r, s ) { \
(p)->Length = sizeof( OBJECT_ATTRIBUTES ); \
(p)->RootDirectory = r; \
(p)->Attributes = a; \
(p)->ObjectName = n; \
(p)->SecurityDescriptor = s; \
(p)->SecurityQualityOfService = NULL; \
}
// Interesting functions in NTDLL
typedef NTSTATUS (WINAPI *ZwOpenSectionProc)
(
PHANDLE SectionHandle,
DWORD DesiredAccess,
POBJECT_ATTRIBUTES ObjectAttributes
);
typedef NTSTATUS (WINAPI *ZwMapViewOfSectionProc)
(
HANDLE SectionHandle,
HANDLE ProcessHandle,
PVOID *BaseAddress,
ULONG ZeroBits,
ULONG CommitSize,
PLARGE_INTEGER SectionOffset,
PULONG ViewSize,
SECTION_INHERIT InheritDisposition,
ULONG AllocationType,
ULONG Protect
);
typedef NTSTATUS (WINAPI *ZwUnmapViewOfSectionProc)
(
HANDLE ProcessHandle,
PVOID BaseAddress
);
typedef VOID (WINAPI *RtlInitUnicodeStringProc)
(
IN OUT PUNICODE_STRING DestinationString,
IN PCWSTR SourceString
);
// Global variables
static HMODULE hModule = NULL;
static HANDLE hPhysicalMemory = NULL;
static ZwOpenSectionProc ZwOpenSection;
static ZwMapViewOfSectionProc ZwMapViewOfSection;
static ZwUnmapViewOfSectionProc ZwUnmapViewOfSection;
static RtlInitUnicodeStringProc RtlInitUnicodeString;
// initialize
BOOL InitPhysicalMemory()
{
if (!(hModule = LoadLibrary("ntdll.dll")))
{
return FALSE;
}
// 以下从NTDLL获取我们需要的几个函数指针
if (!(ZwOpenSection = (ZwOpenSectionProc)GetProcAddress(hModule, "ZwOpenSection")))
{
return FALSE;
}
if (!(ZwMapViewOfSection = (ZwMapViewOfSectionProc)GetProcAddress(hModule, "ZwMapViewOfSection")))
{
return FALSE;
}
if (!(ZwUnmapViewOfSection = (ZwUnmapViewOfSectionProc)GetProcAddress(hModule, "ZwUnmapViewOfSection")))
{
return FALSE;
}
if (!(RtlInitUnicodeString = (RtlInitUnicodeStringProc)GetProcAddress(hModule, "RtlInitUnicodeString")))
{
return FALSE;
}
// 以下打开内核对象
WCHAR PhysicalMemoryName[] = L"\\Device\\PhysicalMemory";
UNICODE_STRING PhysicalMemoryString;
OBJECT_ATTRIBUTES attributes;
RtlInitUnicodeString(&PhysicalMemoryString, PhysicalMemoryName);
InitializeObjectAttributes(&attributes, &PhysicalMemoryString, 0, NULL, NULL);
NTSTATUS status = ZwOpenSection(&hPhysicalMemory, SECTION_MAP_READ, &attributes );
return (status >= 0);
}
// terminate -- free handles
void ExitPhysicalMemory()
{
if (hPhysicalMemory != NULL)
{
CloseHandle(hPhysicalMemory);
}
if (hModule != NULL)
{
FreeLibrary(hModule);
}
}
BOOL ReadPhysicalMemory(PVOID buffer, DWORD address, DWORD length)
{
DWORD outlen; // 输出长度Q根据内存分大可能大于要求的长度
PVOID vaddress; // 映射的虚地址
NTSTATUS status; // NTDLL函数q回的状?br> LARGE_INTEGER base; // 物理内存地址
vaddress = 0;
outlen = length;
base.QuadPart = (ULONGLONG)(address);
// 映射物理内存地址到当前进E的虚地址I间
status = ZwMapViewOfSection(hPhysicalMemory,
(HANDLE) -1,
(PVOID *)&vaddress,
0,
length,
&base,
&outlen,
ViewShare,
0,
PAGE_READONLY);
if (status < 0)
{
return FALSE;
}
// 当前q程的虚地址I间中,复制数据到输出缓冲区
memmove(buffer, vaddress, length);
// 完成讉KQ取消地址映射
status = ZwUnmapViewOfSection((HANDLE)-1, (PVOID)vaddress);
return (status >= 0);
}
// 一个测试函敎ͼ从物理地址0xfe000开始,d4096个字?br>// 对于Award BIOSQ可以从q段数据扑ֈ序列L信息
BOOL test()
{
UCHAR buf[4096];
if (!InitPhysicalMemory())
{
return FALSE;
}
if (!ReadPhysicalMemory(buf, 0xfe000, 4096))
{
// ... 成功d了指定数?br> ExitPhysicalMemory();
return FALSE;
}
ExitPhysicalMemory();
return TRUE;
}
补充说明一点,׃Windows虚拟内存面大小默认?KBQNtMapViewOfSection()q回的虚拟空间基址是按?KB寚w的,q回?/p>
本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/coffeemay/archive/2006/10/28/1354465.aspx