subject_22182.htm

来自「一些关于vc的问答」· HTM 代码 · 共 21 行

HTM
21
字号
<p>
序号:22182 发表者:金枪鱼 发表日期:2002-11-23 13:27:27
<br>主题:请问__declspec(naked)是什么意思
<br>内容:请问在一个函数的定义前面加上__declspec(naked)是什么意思?<BR>例如<BR>__declspec(naked) void Ring0()<BR>{<BR>。。。。。。<BR>}
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:未出手的飞刀 回复日期:2002-11-23 13:52:58
<br>内容:<BR>msdn上好象是这样说的:<BR><BR>具有naked属性的函数不会自动帮你参数压栈和退栈以及寄存器保护之类的工作,而这些要你自己使用在线汇编来完成。<BR>还说这种函数在VxDs程序编写时特别有用。<BR><BR>(:
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金枪鱼 回复日期:2002-11-23 14:33:12
<br>内容:我在类中定义一个这样的函数(.cpp文件中)<BR>__declspec(naked) void CZhylHardDiskID::Ring0GetPortVal()<BR>{<BR>&nbsp;&nbsp;_asm<BR> {<BR>&nbsp;&nbsp;...<BR> }<BR>}<BR>但在这个成员函数的申明部分(.h文件中)<BR>只能声明为void Ring0SetPortVal(void);<BR>如果声明为__declspec(naked)void Ring0SetPortVal(void);则编译出错,说naked不能用于函数的定义。<BR><BR>另外,这各类的另外一个函数中要调用这个成员函数:<BR>&nbsp;&nbsp;&nbsp;&nbsp;Result =this-&gt;CallRing0((PVOID)Ring0GetPortVal, wPortAddr, pdwPortVal, bSize);<BR>&nbsp;&nbsp;&nbsp;&nbsp;但编译出现类型错误。<BR>CallRang0函数的原型为:<BR>bool CallRing0(PVOID pvRing0FuncAddr, WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize)<BR>&nbsp;&nbsp; 请高手指点怎样写CallRing0((PVOID)Ring0GetPortVal,...)这第一个参数才不会出现错误。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:John Lan 回复日期:2002-11-24 15:18:42
<br>内容:http://www.vchelp.net/cndevforum/subject_view.asp?subject_id=22147&amp;forum_id=<BR>(为什么老伸着个大舌头? :DDD)<BR>一般的调用栈帧会生成栈开始和栈结束的汇编指令来维护调用栈<BR>如果用naked修饰,编译器不会帮你生成,所以维护堆栈是你自己的责任,<BR>更加灵活。<BR>2002-11-24 15:24:52

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?