﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-每天早晨叫醒你的不是闹钟,而是梦想-随笔分类-Windows</title><link>http://www.cppblog.com/mmdengwo/category/16463.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 20 Feb 2014 16:25:11 GMT</lastBuildDate><pubDate>Thu, 20 Feb 2014 16:25:11 GMT</pubDate><ttl>60</ttl><item><title>pragma指令简介 </title><link>http://www.cppblog.com/mmdengwo/archive/2011/05/03/145574.html</link><dc:creator>沛沛</dc:creator><author>沛沛</author><pubDate>Tue, 03 May 2011 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/mmdengwo/archive/2011/05/03/145574.html</guid><wfw:comment>http://www.cppblog.com/mmdengwo/comments/145574.html</wfw:comment><comments>http://www.cppblog.com/mmdengwo/archive/2011/05/03/145574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mmdengwo/comments/commentRss/145574.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mmdengwo/services/trackbacks/145574.html</trackback:ping><description><![CDATA[在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作.<br>&nbsp;下面介绍了一下该指令的一些常用参数,希望对大家有所帮助!
<p>&nbsp;一. message 参数。<br>&nbsp;message<br>&nbsp;它能够在编译信息输出窗口中输出相应的信息，这对于源代码信息的控制是非常重要的。</p>
<p>&nbsp;其使用方法为：&nbsp; #pragma message("消息文本")</p>
<p>&nbsp;当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。<br>&nbsp;当我们在程序中定义了许多宏来控制源代码版本的时候，我们自己有可能都会忘记有没有正确的设置这些宏，此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法：<br>#ifdef _X86<br>#pragma message("_X86 macro activated!")<br>#endif<br>&nbsp;当我们定义了_X86这个宏以后，应用程序在编译时就会在编译输出窗口里显示<br>&nbsp;"_X86 macro activated!"<br>&nbsp;这样，我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。</p>
<p>&nbsp;二. 另一个使用得比较多的#pragma参数是code_seg。<br>&nbsp;格式如：<br>&nbsp;#pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] )<br>&nbsp;该指令用来指定函数在.obj文件中存放的节,观察OBJ文件可以使用VC自带的dumpbin命令行程序,函数在.obj文件中默认的存放节为.text节，如果code_seg没有带参数的话,则函数存放在.text节中。</p>
<p>&nbsp;push (可选参数) 将一个记录放到内部编译器的堆栈中,可选参数可以为一个标识符或者节名<br>&nbsp;pop(可选参数) 将一个记录从堆栈顶端弹出,该记录可以为一个标识符或者节名<br>&nbsp;identifier (可选参数) 当使用push指令时,为压入堆栈的记录指派的一个标识符,当该标识符被删除的时候和其相关的堆栈中的记录将被弹出堆栈<br>&nbsp;&nbsp;&nbsp;"segment-name" (可选参数) 表示函数存放的节名<br>&nbsp;例如:<br>&nbsp;//默认情况下,函数被存放在.text节中<br>&nbsp;void func1() {&nbsp;&nbsp;&nbsp;// stored in .text<br>&nbsp;}</p>
<p>&nbsp;//将函数存放在.my_data1节中<br>&nbsp;#pragma code_seg(".my_data1")<br>&nbsp;void func2() {&nbsp;&nbsp;&nbsp;// stored in my_data1<br>&nbsp;}</p>
<p>&nbsp;//r1为标识符,将函数放入.my_data2节中<br>&nbsp;#pragma code_seg(push, r1, ".my_data2")<br>&nbsp;void func3() {&nbsp;&nbsp;&nbsp;// stored in my_data2<br>&nbsp;}</p>
<p>&nbsp;int main() {<br>&nbsp;}</p>
<p>&nbsp;三. #pragma once (比较常用）<br>&nbsp;这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次</p>
<p>&nbsp;四. #pragma hdrstop表示预编译头文件到此为止，后面的头文件不进行预编译。<br>&nbsp;BCB可以预编译头文件以加快链接的速度，但如果所有头文件都进行预编译又可能占太多磁盘空间，所以使用这个选项排除一些头文件。<br>&nbsp;有时单元之间有依赖关系，比如单元A依赖单元B，所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级，如果使用了#pragma package(smart_init) ，BCB就会根据优先级的大小先后编译。</p>
<p>&nbsp;五. #pragma warning指令<br>&nbsp;该指令允许有选择性的修改编译器的警告消息的行为<br>&nbsp;指令格式如下:<br>&nbsp;#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]<br>&nbsp;#pragma warning( push[ ,n ] )<br>&nbsp;#pragma warning( pop )</p>
<p>&nbsp;主要用到的警告表示有如下几个:</p>
<p>&nbsp;once:只显示一次(警告/错误等)消息<br>&nbsp;default:重置编译器的警告行为到默认状态<br>&nbsp;1,2,3,4:四个警告级别<br>&nbsp;disable:禁止指定的警告信息<br>&nbsp;error:将指定的警告信息作为错误报告</p>
<p>&nbsp;如果大家对上面的解释不是很理解,可以参考一下下面的例子及说明</p>
<p>&nbsp;#pragma warning( disable : 4507 34; once : 4385; error : 164 )<br>&nbsp;等价于：<br>&nbsp;#pragma warning(disable:4507 34)&nbsp; // 不显示4507和34号警告信息<br>&nbsp;#pragma warning(once:4385)&nbsp;&nbsp; // 4385号警告信息仅报告一次<br>&nbsp;#pragma warning(error:164)&nbsp;&nbsp; // 把164号警告信息作为一个错误。<br>&nbsp;同时这个pragma warning 也支持如下格式：<br>&nbsp;#pragma warning( push [ ,n ] )<br>&nbsp;#pragma warning( pop )<br>&nbsp;这里n代表一个警告等级(1---4)。<br>&nbsp;#pragma warning( push )保存所有警告信息的现有的警告状态。<br>&nbsp;#pragma warning( push, n)保存所有警告信息的现有的警告状态，并且把全局警告等级设定为n。<br>&nbsp;#pragma warning( pop )向栈中弹出最后一个警告信息，在入栈和出栈之间所作的一切改动取消。例如：<br>&nbsp;#pragma warning( push )<br>&nbsp;#pragma warning( disable : 4705 )<br>&nbsp;#pragma warning( disable : 4706 )<br>&nbsp;#pragma warning( disable : 4707 )<br>&nbsp;#pragma warning( pop )</p>
<p>&nbsp;在这段代码的最后，重新保存所有的警告信息(包括4705，4706和4707)</p>
<p>&nbsp;在使用标准C++进行编程的时候经常会得到很多的警告信息,而这些警告信息都是不必要的提示,所以我们可以使用#pragma warning(disable:4786)来禁止该类型的警告在vc中使用ADO的时候也会得到不必要的警告信息,这个时候我们可以通过#pragma warning(disable:4146)来消除该类型的警告信息</p>
<p>&nbsp;六. pragma comment(...)<br>&nbsp;该指令的格式为：&nbsp; #pragma comment( "comment-type" [, commentstring] )<br>&nbsp;该指令将一个注释记录放入一个对象文件或可执行文件中,comment-type(注释类型):可以指定为五种预定义的标识符的其中一种。<br>&nbsp;五种预定义的标识符为:</p>
<p>&nbsp;1、compiler:将编译器的版本号和名称放入目标文件中,本条注释记录将被编译器忽略<br>如果你为该记录类型提供了commentstring参数,编译器将会产生一个警告<br>例如:#pragma comment( compiler )</p>
<p>&nbsp;2、exestr:将commentstring参数放入目标文件中,在链接的时候这个字符串将被放入到可执行文件中,当操作系统加载可执行文件的时候,该参数字符串不会被加载到内存中.但是,该字符串可以被dumpbin之类的程序查找出并打印出来,你可以用这个标识符将版本号码之类的信息嵌入到可执行文件中!</p>
<p>&nbsp;3、lib:这是一个非常常用的关键字,用来将一个库文件链接到目标文件中常用的lib关键字，可以帮我们连入一个库文件。<br>&nbsp;例如: <br>&nbsp;#pragma comment(lib, "user32.lib")<br>&nbsp;该指令用来将user32.lib库文件加入到本工程中</p>
<p>&nbsp;4、linker:将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项,你可以指定/include选项来强制包含某个对象,例如:<br>#pragma comment(linker, "/include:__mySymbol")<br>你可以在程序中设置下列链接选项<br>/DEFAULTLIB<br>/EXPORT<br>/INCLUDE<br>/MERGE<br>/SECTION</p>
<p>&nbsp;这些选项在这里就不一一说明了,详细信息请看msdn!</p>
<p>&nbsp;5、user:将一般的注释信息放入目标文件中commentstring参数包含注释的文本信息,这个注释记录将被链接器忽略<br>&nbsp;例如:<br>&nbsp;#pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ ) </p>
<img src ="http://www.cppblog.com/mmdengwo/aggbug/145574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mmdengwo/" target="_blank">沛沛</a> 2011-05-03 15:50 <a href="http://www.cppblog.com/mmdengwo/archive/2011/05/03/145574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>下載 Windows Symbol 封裝</title><link>http://www.cppblog.com/mmdengwo/archive/2011/04/29/145305.html</link><dc:creator>沛沛</dc:creator><author>沛沛</author><pubDate>Fri, 29 Apr 2011 03:13:00 GMT</pubDate><guid>http://www.cppblog.com/mmdengwo/archive/2011/04/29/145305.html</guid><wfw:comment>http://www.cppblog.com/mmdengwo/comments/145305.html</wfw:comment><comments>http://www.cppblog.com/mmdengwo/archive/2011/04/29/145305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mmdengwo/comments/commentRss/145305.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mmdengwo/services/trackbacks/145305.html</trackback:ping><description><![CDATA[<p>如果您想要下一代 Windows 版本 Windows Vista、Windows Server 2003、Windows XP 或 Windows 2000 的完整 Symbol，您可以下載 Symbol 封裝然後將它安裝在您的電腦上。</p>
<p>在此 Symbol 下載封裝是依處理器型態 (x86、Itanium 和 x64) 以及 Build 類別 (retail 以及 checked) 來列示。幾乎所有的客戶都需要用於 Retail 版本的 Symbol。如果您正在 Debugging 一個特殊版本的 Windows 需要額外的 Debugging 資訊，那您就應該下載用於 Checked 版本的 Symbol。</p>
<p>Windows XP 與 Windows Server 2003 不需要當地語系化版本的 Symbol 來 Debug 當地語系化版本的產品。每一個 Windows XP 與 Windows Server&#8482; 2003 Symbol 下載封裝皆可用於 Debugging 所有已當地語系化的版本。</p>
<p>每一個 x86 Symbol 可能需要 750 MB 或更大的硬碟空間，每個 Itanium Symbol 可能需要 560 MB 或更大的硬碟空間，而每個 x64 Symbol 套件可能需要 640 MB 或更大空間。此空間需求量包含下載的封裝與其所需的暫存檔案所要求的空間大小，建議您在下載與安裝任可 Symbol 套件之前至少預留 1 GB 的可用硬碟空間。</p>
<p>注意：若您為 MSDN Subscriber 且使用的是 Windows Vista CTP 版本，您可由 Microsoft Connect 伺服器取得 CTP 版本使用之 Symbols 封裝套件。若您目前並非 MSDN Subscriber 但想成為 MSDN Subscriber，您可以由此處加入。</p>
<p>檢視用於 Symbol 封裝的下載連結</p>
<p>&nbsp;&nbsp; Windows Vista Release Candidate 1 (RC1)<br>&nbsp;<br>&nbsp; 這些封裝檔案中包含了所有用於 Debug Windows Vista Release Candidate 1 (RC1) 的完整 Symbol 套件。</p>
<p>Windows Vista RC1 x86 retail symbols, all languages (檔案大小：270 MB - 大部份的客戶需要這個封裝套件。) <br>Windows Vista RC1 Itanium retail symbols, all languages (檔案大小：148 MB) <br>Windows Vista RC1 x64 retail symbols, all languages (檔案大小：205 MB) <br>Windows Vista RC1 x86 checked symbols, all languages (檔案大小：248 MB) <br>Windows Vista RC1 Itanium checked symbols, all languages (檔案大小：187 MB) <br>Windows Vista RC1 x64 checked symbols, all languages (檔案大小：224 MB) <br>&nbsp;<br>&nbsp;&nbsp; Windows Server 2003 and Windows XP x64 Edition<br>&nbsp;<br>&nbsp; 含 Service Pack 1 的 Windows Server 2003 Symbols</p>
<p>此封裝包含在 Debug 己安裝 Service Pack 1 之 Windows Server 2003 的完整 Symbol 套件。其中 Windows Server 2003 的 Symbol 己被更新為符合 Windows Server 2003 Service Pack 1 更新檔案的 Symbol。</p>
<p>附註：Windows Server 2003 SP1 x64-based Symbol 套件亦可用於 Windows XP x64 Edition。</p>
<p>Windows Server 2003 with Service Pack 1 x86 retail symbols, all languages (檔案大小：153 MB - 大部份的客戶需要這個封裝套件。) <br>Windows Server 2003 with Service Pack 1 x86 checked symbols, all languages (檔案大小：146 MB) <br>Windows Server 2003 with Service Pack 1 Itanium-based retail symbols, all languages (檔案大小：102 MB) <br>Windows Server 2003 with Service Pack 1 Itanium-based checked symbols, all languages (檔案大小：123 MB) <br>Windows Server 2003 with Service Pack 1 x64-based retail symbols, all languages (檔案大小：123 MB) <br>Windows Server 2003 with Service Pack 1 x64-based checked symbols, all languages (檔案大小：113 MB) <br>減少下載的量：Windows Server 2003 Service Pack 1</p>
<p>此封裝比含有 Service Pack 1 的 Windows Server 2003 完整套件的下載量來的小。它僅包含隨附於 Windows Server 2003 Service Pack 1 之檔案的 Symbol。若您己經安裝了 Windows Server 2003 的 Symbol，您可以將它安裝在相同的路徑，這樣您就擁有了含有 Service Pack 1 的 Windows Server 2003 完整 Symbol 套件。</p>
<p>Windows Server 2003 Service Pack 1 x86 retail symbols, all languages (檔案大小：130 MB - 此為大多數客戶所需要的封裝。) <br>Windows Server 2003 Service Pack 1 x86 checked symbols, all languages (檔案大小：121 MB) <br>Windows Server 2003 Service Pack 1 Itanium-based retail symbols, all languages (檔案大小：91 MB) <br>Windows Server 2003 Service Pack 1 Itanium-based checked symbols, all languages (檔案大小：110 MB) <br>不包含 Service Pack 的 Windows Server 2003 Symbols</p>
<p>&nbsp;</p>
<p>Windows Server 2003 x86 retail symbols, all languages (檔案大小：168 MB - 此為大多數客戶所需要的封裝。) <br>Windows Server 2003 Itanium retail symbols, all languages (檔案大小：105 MB) <br>Windows Server 2003 x86 checked symbols, all languages (檔案大小：163 MB) <br>Windows Server 2003 Itanium checked symbols, all languages (檔案大小：123 MB) <br>&nbsp;<br>&nbsp;&nbsp; Windows XP<br>&nbsp;<br>&nbsp; 含 Service Pack 2 的 Windows XP Symbol</p>
<p>此封裝包含在 Debug 己安裝 Service Pack 2 之 Windows XP 的完整 Symbol 套件。其中 Windows XP 的 Symbol 己被更新為符合 Windows XP Service Pack 2 更新檔案的 Symbol。</p>
<p>&nbsp;</p>
<p>Windows XP with Service Pack 2 x86 retail symbols, all languages (檔案大小：195 MB - 此為大多數客戶所需要的封裝。) <br>Windows XP with Service Pack 2 x86 checked symbols, all languages (檔案大小：188 MB) <br>減少下載的量：Windows XP Service Pack 2</p>
<p>此封裝比含有 Service Pack 2 的 Windows XP 完整套件的下載量來的小。它僅包含隨附於 Service Pack 2 之檔案的 Symbol。若您己經安裝了 Windows XP 的 Symbol，您可以將它安裝在相同的路徑，這樣您就擁有了含有 Service Pack 2 的 Windows XP 完整 Symbol 套件。</p>
<p>&nbsp;</p>
<p>Windows XP Service Pack 2 x86 retail symbols, all languages (檔案大小：145 MB - 此為大多數客戶所需要的封裝。) <br>Windows XP Service Pack 2 x86 checked symbols, all languages (檔案大小：132 MB) <br>Windows XP with Service Pack 1 以及 Service Pack 1a Symbol</p>
<p>此封裝包含在 Debug 己安裝 Service Pack 1 或 Service Pack 1a 之 Windows XP 的完整 Symbol 套件。其中 Windows XP 的 Symbol 己被更新為符合 Windows XP Service Pack 1 以及 Service Pack 1a 更新檔案的 Symbol。</p>
<p>&nbsp;</p>
<p>Windows XP with Service Pack 1 and Service Pack 1a x86 retail symbols, all languages (檔案大小：172 MB - 此為大多數客戶所需要的封裝。) <br>Windows XP with Service Pack 1 and Service Pack 1a Itanium retail symbols, all languages (檔案大小：101 MB) <br>Windows XP with Service Pack 1 and Service Pack 1a x86 checked symbols, all languages (檔案大小：168 MB) <br>Windows XP with Service Pack 1 and Service Pack 1a Itanium checked symbols, all languages (檔案大小：124 MB) <br>減少下載的量：Windows XP Service Pack 1 以及 Service Pack 1a Symbol</p>
<p>此封裝比含有 Service Pack 1 以及 Service Pack 1a 的 Windows XP 完整套件的下載量來的小。它僅包含隨附於 Service Pack 1 以及 Service Pack 1a 之檔案的 Symbol。若您己經安裝了 Windows XP 的 Symbol，您可以將它安裝在相同的路徑，這樣您就擁有了含有 Service Pack 1 以及 Service Pack 1a 的 Windows XP 完整 Symbol 套件。 </p>
<p>&nbsp;</p>
<p>Windows XP Service Pack 1 and Service Pack 1a x86 retail symbols, all languages (檔案大小：103 MB - Most customers want this package.) <br>Windows XP Service Pack 1 and Service Pack 1a Itanium retail symbols, all languages (檔案大小：50 MB) <br>Windows XP Service Pack 1 and Service Pack 1a x86 checked symbols, all languages (檔案大小：96 MB) <br>Windows XP Service Pack 1 and Service Pack 1a Itanium checked symbols, all languages (檔案大小：63 MB) <br>Windows XP Symbol 其中不含 Service Pack</p>
<p>&nbsp;</p>
<p>Windows XP x86 retail symbols, all languages (檔案大小：149 MB - 此為大多數客戶所需要的封裝。) <br>Windows XP IA-64 retail symbols, all languages (檔案大小：95 MB) <br>Windows XP x86 checked symbols, all languages (檔案大小：147 MB) <br>Windows XP IA-64 checked symbols, all languages (檔案大小：116 MB) <br>&nbsp;<br>&nbsp;&nbsp; Windows 2000<br>&nbsp;<br>&nbsp; 下列連結連接至每一個 Symbols 封裝的下載處，或是帶領您至提供關於 Windows 2000 Symbol 下載資訊的網站。 </p>
<p>Windows 2000 SP4 的更新彙總套件 1 (Update Rollup 1)。欲安裝 Windows 2000 SP4 的更新彙總套件 1 中所包括的新增 Symbols，請在下方的下拉式選單中選擇您想要下載的語言版本然後在 "按一下這裡開始下載" 的連結按一下。欲擁有完整的 Symbol 套件，您必須先安裝 Windows 2000 Symbol，之後接著安裝 Service Pack 4 Symbol，最後再安裝 Windows 2000 SP4 更新彙總套件 1 的 Symbol。</p>
<p>&lt; language="javascript" type="text/javascript"&gt; function ShowSelectInfoSP4UR1() { oElement = window.event.srcElement for (i=0; i 選擇所需的語言版本：<br>&nbsp;<br>&nbsp; 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&nbsp;&nbsp;&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量： 22 MB)<br>&nbsp;</p>
<p>Windows 2000 Service Pack 4 。安裝 Service Pack 4 所提供的額外 Symbol，請在下面的下拉式表單中選擇您想要下載的語言然後按一下 "按一下這裡開始下載" 的連結項目。欲擁有完整的 Symbol 套件，您必須在安裝 Service Pack 4 Symbol 前先安裝 Windows 2000 Symbol。</p>
<p>&lt; language="javascript" type="text/javascript"&gt; function ShowSelectInfoSP4() { oElement = window.event.srcElement for (i=0; i 選擇所需的語言版本：<br>&nbsp;<br>&nbsp; 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&nbsp;&nbsp;&nbsp; 按一下這裡開始下載 (下載量：72 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：72 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：74 MB)<br>&nbsp;</p>
<p>若您有特殊版本的 Service Pack 4 且需要更多的 Debugging 資訊，那您應該下載用於 Checked 版本的 Symbol。下載英文版的 Service Pack 4 Checked 版本，請按一下這裡 (下載量： 66 MB)。</p>
<p>Windows 2000 Service Pack 3。安裝 Service Pack 3 所提供的額外 Symbol，請在下面的下拉式表單中選擇您想要下載的語言然後按一下 "按一下這裡開始下載" 的連結項目。欲擁有完整的 Symbol 套件，您必須在安裝 Service Pack 3 Symbol 前先安裝 Windows 2000 Symbol。</p>
<p>&lt; language="javascript" type="text/javascript"&gt; function ShowSelectInfo() { oElement = window.event.srcElement for (i=0; i 選擇所需的語言：<br>&nbsp;<br>&nbsp; English French German Italian Japanese Japanese NEC98 Portugese (Brazilian) Spanish&nbsp;&nbsp;&nbsp; 按一下這裡開始下載 (下載量：67 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：67 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：67 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：67 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：67 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：67 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：67 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：67 MB)<br>&nbsp;</p>
<p>若您有特殊版本的 Service Pack 3 且需要更多的 Debugging 資訊，那您應該下載用於 Checked 版本的 Symbol。下載英文版的 Service Pack 3 Checked 版本，請按一下此處。</p>
<p>Windows 2000 Service Pack 2 Security Rollup Package 1。安裝 Service Pack 2 Security Rollup Package 1 所提供的額外 Symbol，請在下面的下拉式表單中選擇您想要下載的語言然後按一下 "按一下這裡開始下載" 的連結項目。欲擁有完整的 Symbol 套件，您必須先安裝 Windows 2000 Symbol，再安裝 Service Pack 2 Symbol，最後再安裝 Service Pack 2 Security Rollup Package 1 Symbol。</p>
<p>選擇所需的語言：<br>&nbsp;<br>&nbsp; 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&nbsp;&nbsp;&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)</p>
<p>&nbsp; 按一下這裡開始下載 (下載量：19 MB)<br>&nbsp;</p>
<p>Windows 2000 Service Pack 2 Symbols - 跟隨 SP2 所新增的 Symbol。欲擁有用於含有 Service Pack 2 之 Windows 2000 的完整 Symbol 套件，您必須先安裝 Windows 2000 Symbo 然後再安裝 Service Pack 2 Symbol。</p>
<p>Windows 2000 Service Pack 1 Symbols - 跟隨 SP1 所新增的 Symbol。欲擁有用於含有 Service Pack 1 之 Windows 2000 的完整 Symbol 套件，您必須先安裝 Windows 2000 Symbo 然後再安裝 Service Pack 1 Symbol。</p>
<p>Windows 2000 Symbols - 用於 Debugging Windows 2000 所需的檔案。<br>&nbsp;</p>
<p><br>&nbsp; </p>
<p><br>Debugging 說明檔 - 為了幫助您 Debugging 問題，請提送線上說明檔的要求或是使用附加的資源於 DDK 開發人員支援。</p>
<p>意見反應 - 我們期待得到您闗於 Symbol 的意見反應。請將您的建議或是錯誤報告 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#105;&#110;&#100;&#98;&#103;&#102;&#98;&#64;&#109;&#105;&#99;&#114;&#111;&#115;&#111;&#102;&#116;&#46;&#99;&#111;&#109;">windbgfb@microsoft.com</a>。 雖然您無法從此處取得技術支援，但是您的意見將可以幫助我們未來在 Symbol 的變更計畫並且使得它在未來更合於您的需求。</p>
<p>Last Updated: 2006 年 9 月 13 日</p>
<p><br>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/coffeemay/archive/2006/10/12/1331356.aspx">http://blog.csdn.net/coffeemay/archive/2006/10/12/1331356.aspx</a></p>
<img src ="http://www.cppblog.com/mmdengwo/aggbug/145305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mmdengwo/" target="_blank">沛沛</a> 2011-04-29 11:13 <a href="http://www.cppblog.com/mmdengwo/archive/2011/04/29/145305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在NT中直接访问物理内存</title><link>http://www.cppblog.com/mmdengwo/archive/2011/04/29/145300.html</link><dc:creator>沛沛</dc:creator><author>沛沛</author><pubDate>Fri, 29 Apr 2011 03:00:00 GMT</pubDate><guid>http://www.cppblog.com/mmdengwo/archive/2011/04/29/145300.html</guid><wfw:comment>http://www.cppblog.com/mmdengwo/comments/145300.html</wfw:comment><comments>http://www.cppblog.com/mmdengwo/archive/2011/04/29/145300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mmdengwo/comments/commentRss/145300.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mmdengwo/services/trackbacks/145300.html</trackback:ping><description><![CDATA[<p>我们知道，在NT/2K/XP中，操作系统利用虚拟内存管理技术来维护地址空间映像，每个进程分配一个4GB的虚拟地址空间。运行在用户态的应用程序，不能直接访问物理内存地址；而运行在核心态的驱动程序，能将虚拟地址空间映射为物理地址空间，从而访问物理内存地址。</p>
<p>如果要在应用程序中以物理地址方式访问内存，自然而然的办法，是编写一个专用的驱动程序（如大家熟悉的WinIO），里面设置一定的IOCTL码，应用程序通过调用DeviceIoCtrol()来实现这样的功能。</p>
<p>那么，有没有一种方法，省去编写专用驱动程序这一步，很方便地就能访问物理内存呢？答案是肯定的。实际上，微软早就给我们准备好了一套办法，只是他们秘而不宣罢了。系统内建一个叫做PhysicalMemory的内核对象，可以通过系统核心文件NTDLL.DLL中的有关API进行操纵，从而实现物理内存的直接访问。微软声称这些API是用于驱动程序开发的，在VC/.NET中未提供原型说明和库文件，然而事实证明在应用程序中调用它们是没有问题的。我们感兴趣的API主要包括：</p>
<p>ZwOpenSection 或 NtOpenSection - 打开内核对象 <br>ZwMapViewOfSection 或 NtMapViewOfSection - 映射虚拟地址空间 <br>ZwUnmapViewOfSection 或 NtUnmapViewOfSection - 取消地址空间映射 <br>RtlInitUnicodeString - 用UNICODE串初始化UNICODE描述的结构 <br>以下的代码描述了如何利用NTDLL.DLL中的上述几个API，实现对物理内存的读取。需要指出的是，只有system拥有读写权限，administrator只有读权限，而user连读权限都没有。这一点，是不能与专用驱动程序方法向相比的。</p>
<p>在VC/.NET中，由于没有相应的原型说明和库文件，我们用GetProcAddress()进行DLL显式调用。前面大段的代码，用于说明必需的类型和结构。读取物理内存的主要步骤为：打开内核对象 &#8594; 映射虚拟地址空间 &#8594; 读取(复制)内存 &#8594; 取消地址空间映射。</p>
<p>typedef LONG&nbsp;&nbsp;&nbsp; NTSTATUS;<br>&nbsp;<br>typedef struct _UNICODE_STRING<br>{<br>&nbsp;&nbsp;&nbsp; USHORT Length;<br>&nbsp;&nbsp;&nbsp; USHORT MaximumLength;<br>&nbsp;&nbsp;&nbsp; PWSTR Buffer;<br>} UNICODE_STRING, *PUNICODE_STRING;<br>&nbsp;<br>typedef enum _SECTION_INHERIT<br>{<br>&nbsp;&nbsp;&nbsp; ViewShare = 1,<br>&nbsp;&nbsp;&nbsp; ViewUnmap = 2<br>} SECTION_INHERIT, *PSECTION_INHERIT;<br>&nbsp;<br>typedef struct _OBJECT_ATTRIBUTES<br>{<br>&nbsp;&nbsp;&nbsp; ULONG Length;<br>&nbsp;&nbsp;&nbsp; HANDLE RootDirectory;<br>&nbsp;&nbsp;&nbsp; PUNICODE_STRING ObjectName;<br>&nbsp;&nbsp;&nbsp; ULONG Attributes;<br>&nbsp;&nbsp;&nbsp; PVOID SecurityDescriptor;<br>&nbsp;&nbsp;&nbsp; PVOID SecurityQualityOfService;<br>} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;<br>&nbsp;<br>#define InitializeObjectAttributes( p, n, a, r, s ) { \ <br>&nbsp;&nbsp;&nbsp; (p)-&gt;Length = sizeof( OBJECT_ATTRIBUTES ); \ <br>&nbsp;&nbsp;&nbsp; (p)-&gt;RootDirectory = r; \ <br>&nbsp;&nbsp;&nbsp; (p)-&gt;Attributes = a; \ <br>&nbsp;&nbsp;&nbsp; (p)-&gt;ObjectName = n; \ <br>&nbsp;&nbsp;&nbsp; (p)-&gt;SecurityDescriptor = s; \ <br>&nbsp;&nbsp;&nbsp; (p)-&gt;SecurityQualityOfService = NULL; \ <br>}<br>&nbsp;<br>// Interesting functions in NTDLL<br>typedef NTSTATUS (WINAPI *ZwOpenSectionProc)<br>(<br>&nbsp;&nbsp;&nbsp; PHANDLE SectionHandle,<br>&nbsp;&nbsp;&nbsp; DWORD DesiredAccess,<br>&nbsp;&nbsp;&nbsp; POBJECT_ATTRIBUTES ObjectAttributes<br>);<br>typedef NTSTATUS (WINAPI *ZwMapViewOfSectionProc)<br>(<br>&nbsp;&nbsp;&nbsp; HANDLE SectionHandle,<br>&nbsp;&nbsp;&nbsp; HANDLE ProcessHandle,<br>&nbsp;&nbsp;&nbsp; PVOID *BaseAddress,<br>&nbsp;&nbsp;&nbsp; ULONG ZeroBits,<br>&nbsp;&nbsp;&nbsp; ULONG CommitSize,<br>&nbsp;&nbsp;&nbsp; PLARGE_INTEGER SectionOffset,<br>&nbsp;&nbsp;&nbsp; PULONG ViewSize,<br>&nbsp;&nbsp;&nbsp; SECTION_INHERIT InheritDisposition,<br>&nbsp;&nbsp;&nbsp; ULONG AllocationType,<br>&nbsp;&nbsp;&nbsp; ULONG Protect<br>);<br>typedef NTSTATUS (WINAPI *ZwUnmapViewOfSectionProc)<br>(<br>&nbsp;&nbsp;&nbsp; HANDLE ProcessHandle,<br>&nbsp;&nbsp;&nbsp; PVOID BaseAddress<br>);<br>typedef VOID (WINAPI *RtlInitUnicodeStringProc)<br>(<br>&nbsp;&nbsp;&nbsp; IN OUT PUNICODE_STRING DestinationString,<br>&nbsp;&nbsp;&nbsp; IN PCWSTR SourceString<br>);<br>&nbsp;<br>// Global variables<br>static HMODULE hModule = NULL;<br>static HANDLE hPhysicalMemory = NULL;<br>static ZwOpenSectionProc ZwOpenSection;<br>static ZwMapViewOfSectionProc ZwMapViewOfSection;<br>static ZwUnmapViewOfSectionProc ZwUnmapViewOfSection;<br>static RtlInitUnicodeStringProc RtlInitUnicodeString;<br>&nbsp;<br>// initialize<br>BOOL InitPhysicalMemory()<br>{<br>&nbsp;&nbsp;&nbsp; if (!(hModule = LoadLibrary("ntdll.dll")))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; // 以下从NTDLL获取我们需要的几个函数指针<br>&nbsp;&nbsp;&nbsp; if (!(ZwOpenSection = (ZwOpenSectionProc)GetProcAddress(hModule, "ZwOpenSection")))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; if (!(ZwMapViewOfSection = (ZwMapViewOfSectionProc)GetProcAddress(hModule, "ZwMapViewOfSection")))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; if (!(ZwUnmapViewOfSection = (ZwUnmapViewOfSectionProc)GetProcAddress(hModule, "ZwUnmapViewOfSection")))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; if (!(RtlInitUnicodeString = (RtlInitUnicodeStringProc)GetProcAddress(hModule, "RtlInitUnicodeString")))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; // 以下打开内核对象<br>&nbsp;&nbsp;&nbsp; WCHAR PhysicalMemoryName[] = L"<a href="file://Device//PhysicalMemory">\\Device\\PhysicalMemory</a>";<br>&nbsp;&nbsp;&nbsp; UNICODE_STRING PhysicalMemoryString;<br>&nbsp;&nbsp;&nbsp; OBJECT_ATTRIBUTES attributes;<br>&nbsp;&nbsp;&nbsp; RtlInitUnicodeString(&amp;PhysicalMemoryString, PhysicalMemoryName);<br>&nbsp;&nbsp;&nbsp; InitializeObjectAttributes(&amp;attributes, &amp;PhysicalMemoryString, 0, NULL, NULL);<br>&nbsp;&nbsp;&nbsp; NTSTATUS status = ZwOpenSection(&amp;hPhysicalMemory, SECTION_MAP_READ, &amp;attributes );<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; return (status &gt;= 0);<br>}<br>&nbsp;<br>// terminate -- free handles<br>void ExitPhysicalMemory()<br>{<br>&nbsp;&nbsp;&nbsp; if (hPhysicalMemory != NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloseHandle(hPhysicalMemory);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; if (hModule != NULL)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreeLibrary(hModule);<br>&nbsp;&nbsp;&nbsp; }<br>}<br>&nbsp;<br>BOOL ReadPhysicalMemory(PVOID buffer, DWORD address, DWORD length)<br>{<br>&nbsp;&nbsp;&nbsp; DWORD outlen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 输出长度，根据内存分页大小可能大于要求的长度<br>&nbsp;&nbsp;&nbsp; PVOID vaddress;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 映射的虚地址<br>&nbsp;&nbsp;&nbsp; NTSTATUS status;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // NTDLL函数返回的状态<br>&nbsp;&nbsp;&nbsp; LARGE_INTEGER base;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 物理内存地址<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; vaddress = 0;<br>&nbsp;&nbsp;&nbsp; outlen = length;<br>&nbsp;&nbsp;&nbsp; base.QuadPart = (ULONGLONG)(address);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; // 映射物理内存地址到当前进程的虚地址空间<br>&nbsp;&nbsp;&nbsp; status = ZwMapViewOfSection(hPhysicalMemory,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (HANDLE) -1,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PVOID *)&amp;vaddress,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; length,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;base,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;outlen,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ViewShare,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PAGE_READONLY);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; if (status &lt; 0)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; // 当前进程的虚地址空间中，复制数据到输出缓冲区<br>&nbsp;&nbsp;&nbsp; memmove(buffer, vaddress, length);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; // 完成访问，取消地址映射<br>&nbsp;&nbsp;&nbsp; status = ZwUnmapViewOfSection((HANDLE)-1, (PVOID)vaddress);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; return (status &gt;= 0);<br>}<br>&nbsp;<br>// 一个测试函数，从物理地址0xfe000开始，读取4096个字节<br>// 对于Award BIOS，可以从这段数据找到序列号等信息<br>BOOL test()<br>{<br>&nbsp;&nbsp;&nbsp; UCHAR buf[4096];<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; if (!InitPhysicalMemory())<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; if (!ReadPhysicalMemory(buf, 0xfe000, 4096))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ... 成功读取了指定数据<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExitPhysicalMemory();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; ExitPhysicalMemory();<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; return TRUE;<br>}</p>
<p>补充说明一点，由于Windows虚拟内存页面大小默认是4KB，NtMapViewOfSection()返回的虚拟空间基址是按照4KB对齐的，返回的</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/coffeemay/archive/2006/10/28/1354465.aspx">http://blog.csdn.net/coffeemay/archive/2006/10/28/1354465.aspx</a></p>
<img src ="http://www.cppblog.com/mmdengwo/aggbug/145300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mmdengwo/" target="_blank">沛沛</a> 2011-04-29 11:00 <a href="http://www.cppblog.com/mmdengwo/archive/2011/04/29/145300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Visual C++线程同步技术剖析</title><link>http://www.cppblog.com/mmdengwo/archive/2011/04/14/144256.html</link><dc:creator>沛沛</dc:creator><author>沛沛</author><pubDate>Thu, 14 Apr 2011 14:36:00 GMT</pubDate><guid>http://www.cppblog.com/mmdengwo/archive/2011/04/14/144256.html</guid><wfw:comment>http://www.cppblog.com/mmdengwo/comments/144256.html</wfw:comment><comments>http://www.cppblog.com/mmdengwo/archive/2011/04/14/144256.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/mmdengwo/comments/commentRss/144256.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mmdengwo/services/trackbacks/144256.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要： 多线程同步技术是计算机软件开发的重要技术，本文对多线程的各种同步技术的原理和实现进行了初步探讨。　　关键词： VC++6.0； 线程同步；临界区；事件；互斥；信号量； 　　阅读目录： 　　使线程同步 　　临界区　　管理事件内核对象 　　信号量内核对象　　互斥内核对象 　　小结 　　正文 　　使线程同步　　在程序中使用多线程时，一般很少有多个线程能在其生命期内进行完全独立的操作。更多的情...&nbsp;&nbsp;<a href='http://www.cppblog.com/mmdengwo/archive/2011/04/14/144256.html'>阅读全文</a><img src ="http://www.cppblog.com/mmdengwo/aggbug/144256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mmdengwo/" target="_blank">沛沛</a> 2011-04-14 22:36 <a href="http://www.cppblog.com/mmdengwo/archive/2011/04/14/144256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怎样查看端口被哪个进程占用 </title><link>http://www.cppblog.com/mmdengwo/archive/2011/04/14/144252.html</link><dc:creator>沛沛</dc:creator><author>沛沛</author><pubDate>Thu, 14 Apr 2011 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/mmdengwo/archive/2011/04/14/144252.html</guid><wfw:comment>http://www.cppblog.com/mmdengwo/comments/144252.html</wfw:comment><comments>http://www.cppblog.com/mmdengwo/archive/2011/04/14/144252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mmdengwo/comments/commentRss/144252.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mmdengwo/services/trackbacks/144252.html</trackback:ping><description><![CDATA[查看端口被占用情况：<br>开始==》运行==》cmd==》netstat -ano|more（后面加more可以分页显示） 可获得PID，记下PID<br>查看进程被谁启动：<br>任务管理器==》查看（V）==》选择列（S）&#8230;==》勾选&#8220;PID（进程标识符）&#8221;==》找到PID对应的映像名称&#8230;&#8230; 
<img src ="http://www.cppblog.com/mmdengwo/aggbug/144252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mmdengwo/" target="_blank">沛沛</a> 2011-04-14 22:24 <a href="http://www.cppblog.com/mmdengwo/archive/2011/04/14/144252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软ping程序源代码完整版 </title><link>http://www.cppblog.com/mmdengwo/archive/2011/04/14/144251.html</link><dc:creator>沛沛</dc:creator><author>沛沛</author><pubDate>Thu, 14 Apr 2011 14:21:00 GMT</pubDate><guid>http://www.cppblog.com/mmdengwo/archive/2011/04/14/144251.html</guid><wfw:comment>http://www.cppblog.com/mmdengwo/comments/144251.html</wfw:comment><comments>http://www.cppblog.com/mmdengwo/archive/2011/04/14/144251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mmdengwo/comments/commentRss/144251.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mmdengwo/services/trackbacks/144251.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 编写自己的一个ping程序,可以说是许多人迈出网络编程的第一步吧!!这个ping程序的源代码经过我的修改和调试,基本上可以取代windows中自带的ping程序. 各个模块后都有我的详细注释和修改日志,希望能够对大家的学习Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighli...&nbsp;&nbsp;<a href='http://www.cppblog.com/mmdengwo/archive/2011/04/14/144251.html'>阅读全文</a><img src ="http://www.cppblog.com/mmdengwo/aggbug/144251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mmdengwo/" target="_blank">沛沛</a> 2011-04-14 22:21 <a href="http://www.cppblog.com/mmdengwo/archive/2011/04/14/144251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>