??xml version="1.0" encoding="utf-8" standalone="yes"?>无码国产69精品久久久久网站,无码AV波多野结衣久久,人妻久久久一区二区三区http://www.shnenglu.com/hugai/zh-cnWed, 07 May 2025 16:50:10 GMTWed, 07 May 2025 16:50:10 GMT60*控制图(II)http://www.shnenglu.com/hugai/archive/2010/09/15/126646.html(zhn)山(zhn)山Wed, 15 Sep 2010 04:14:00 GMThttp://www.shnenglu.com/hugai/archive/2010/09/15/126646.htmlhttp://www.shnenglu.com/hugai/comments/126646.htmlhttp://www.shnenglu.com/hugai/archive/2010/09/15/126646.html#Feedback0http://www.shnenglu.com/hugai/comments/commentRss/126646.htmlhttp://www.shnenglu.com/hugai/services/trackbacks/126646.html控制图对编译优化和E序静态分析很有用处。编译优化根据待~译E序的控制流减少其中不必要的跌{Q得代码结构更加紧凑。静态分析工h据程序的控制来分析得到E序的复杂度{等一pdl计信息QVisual Studio自带的代码度?Code Metrics)是静态分析中控制图应用的一个例子?br>



(zhn)山 2010-09-15 12:14 发表评论
]]>
*控制图http://www.shnenglu.com/hugai/archive/2010/09/15/126645.html(zhn)山(zhn)山Wed, 15 Sep 2010 04:00:00 GMThttp://www.shnenglu.com/hugai/archive/2010/09/15/126645.htmlhttp://www.shnenglu.com/hugai/comments/126645.htmlhttp://www.shnenglu.com/hugai/archive/2010/09/15/126645.html#Feedback0http://www.shnenglu.com/hugai/comments/commentRss/126645.htmlhttp://www.shnenglu.com/hugai/services/trackbacks/126645.html在控制流图中Q有两类Ҏ(gu)的代码块Q入口代码块和出口代码块Q所有的执行路径都从入口块开始,q且l束于一个出口块?br>一个控制流图本w是一个图(Graph)Q可以用计算机图Z的术语来加以描述Q诸如edgeQvertexQback edge{等?br>下面的图片可以作Z个基本的控制图的样本:(x)


(zhn)山 2010-09-15 12:00 发表评论
]]>
一个小型CRMpȝ的设计(未完成版本)(j)http://www.shnenglu.com/hugai/archive/2009/11/06/100292.html(zhn)山(zhn)山Fri, 06 Nov 2009 05:26:00 GMThttp://www.shnenglu.com/hugai/archive/2009/11/06/100292.htmlhttp://www.shnenglu.com/hugai/comments/100292.htmlhttp://www.shnenglu.com/hugai/archive/2009/11/06/100292.html#Feedback0http://www.shnenglu.com/hugai/comments/commentRss/100292.htmlhttp://www.shnenglu.com/hugai/services/trackbacks/100292.html RequestDataParser(ushort commandValue, ushort flags, Guid sessionId, byte[] requestData); 其输入ؓ(f)一个完整的包结构,输出析出来的Request Data中包含的有意义的字段对应C#中的数据cdQ以?qing)这些数据的倹{这样子是得我们能在我们的h监听层初始化的时候根据配|文件中的解析函数配|注册合适的解析函数Q在q行中能够调用注册好的配|函数解析对应的|络数据其转换为有意义的逻辑数据? 在这U设计之下,用户如果需要定义自qCommand ValueQ假讑օgؓ(f)0xF000Q那么用h供一个叫做CustomeRequestDataParser.dll的程序集Q其中包含了对于Command Value0xF0000下的Request Data的解析函数实玎ͼ其实现如下:(x) public class CustomeRequestDataParser { public Dictionary RequestDataParser(ushort commandValue, ushort flags, Guid sessionId, byte[] requestData) { Dictionary result = new Dictionary(); if (requestData.Length != 8) { throw new ArgumentException("Invalid network data received."); } byte[] field1 = new byte[4]; byte[] field2 = new byte[4]; Array.Copy(requestData, field1, 4); Array.Copy(requestData, field2, 4, 4); result.Add( typeof(uint), BitConverter.ToUInt32(field1, 0)); result.Add(typeof(uint), BitConverter.ToUInt32(field2, 0)); return result; } } 在我们的h监听层的E序配置文g中存在这么一:(x) 在我们的h监听层的初始化代码中存在q么几行代码Q? public void RegisterRequestDataParsers() { System.Collections.Specialized.NameObjectCollectionBase.KeysCollection keysCOllection = ConfigurationSettings.AppSettings.Keys; List requestDataParserKeys = new List(); foreach (string keyValue in keysCOllection) { if (keyValue.Contains("CommandValueParser")) { requestDataParserKeys.Add(keyValue); } } foreach (string keyValue in requestDataParserKeys) { string assemblyPath = GetAssemblyPath(ConfigurationSettings.AppSettings[keyValue]); if (!IsAssemblyLoaded(assemblyPath)) { AppDomain.CurrentDomain.Load(assemblyPath); } string typeName = GetTypeName(ConfigurationSettings.AppSettings[keyValue]); ushort commandValue=GetCommandValue(ConfigurationSettings.AppSettings[keyValue]); if (!registeredRequestDataParsers.ContainsKey(commandValue)) { registeredRequestDataParsers.Add(commandValue, Type.GetType(GetTypeFullName(typeName))); } } } 当请求监听模块收C个请求之后,它会(x)其转换Z个事Ӟ其放进事g队列中,一个事件应该包含以下信息:(x) public class Event { private DateTime timeStamp; private ushort commandValue; private ushort flags; private Guid sessionId; Dictionary requestData; } 一个时间队列的可能定义如下Q? public class EventQueue { private List eventPool; private uint eventCount; private Event mostPrioritizedEvent; } h调度模块不断的查询事仉列中的时_(d)按照特定的调度策略找Z个合适的事g交给逻辑层处理:(x) public abstract class EventSelectionPolicy { } public class EventQueueProcessor { private EventQueue eventQueue; private EventSelectionPolicy eventSelectionPolicy; public void RegisterEventQueue(EventQueue queue) { if (this.eventQueue != null) { throw new ArgumentException("Unable to register another event queue when a queue is still in processing."); } this.eventQueue = queue; } public EventQueue UnregisterEventQueue() { if (this.eventQueue == null) { throw new InvalidOperationException("Unable to unregister an event queue when the queue is not intialized."); } EventQueue queue = this.eventQueue; this.eventQueue = null; return queue; } public void RegisterEventSelectionPolicy(EventSelectionPolicy policy) { this.eventSelectionPolicy = policy; } public Event SelectEvent() { // //return ...; } } EventQueueProcessor调用SelectEventҎ(gu)按照注册q的调度{略选择一个event交给逻辑处理层处理? 后记

(zhn)山 2009-11-06 13:26 发表评论
]]>
?Net Framework中动态创建类?--System.Reflection.Emit命名I间试http://www.shnenglu.com/hugai/archive/2009/07/24/91075.html(zhn)山(zhn)山Fri, 24 Jul 2009 13:51:00 GMThttp://www.shnenglu.com/hugai/archive/2009/07/24/91075.htmlhttp://www.shnenglu.com/hugai/comments/91075.htmlhttp://www.shnenglu.com/hugai/archive/2009/07/24/91075.html#Feedback1http://www.shnenglu.com/hugai/comments/commentRss/91075.htmlhttp://www.shnenglu.com/hugai/services/trackbacks/91075.html string assemblyName = this.txtAssemblyName.Text;
            
string className = this.txtClassName.Text;

            System.Diagnostics.Debug.Assert(assemblyName 
!= null && assemblyName != string.Empty);
            System.Diagnostics.Debug.Assert(className 
!= null && className != string.Empty);

            System.Reflection.AssemblyName asmName 
= new System.Reflection.AssemblyName(assemblyName);
            AssemblyBuilder asmBuilder 
= AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);
            ModuleBuilder modBuilder 
= asmBuilder.DefineDynamicModule("MyModule"true);

            TypeBuilder typeBuilder 
= modBuilder.DefineType(className);
            typeBuilder.DefineField(
"myfield",typeof(string), System.Reflection.FieldAttributes.Public);
            MethodBuilder methodBuilder 
= typeBuilder.DefineMethod("CallMethod", System.Reflection.MethodAttributes.Public| System.Reflection.MethodAttributes.SpecialName | System.Reflection.MethodAttributes.HideBySig
                
                , 
nullnew Type[] { typeof(string) });

            methodBuilder.DefineParameter(
0, System.Reflection.ParameterAttributes.Retval, null);
            methodBuilder.DefineParameter(
1, System.Reflection.ParameterAttributes.In, "name");
            ILGenerator ilGenerator 
= methodBuilder.GetILGenerator();

            ilGenerator.Emit(OpCodes.Ldarg_1);
            
//System.Reflection.Assembly asmSystem = System.Reflection.Assembly.GetAssembly(typeof(MessageBox));
            
//Type typeMessageBox = asmSystem.GetType("MessageBox");
            Type typeMessageBox = typeof(MessageBox);
            System.Reflection.MethodInfo mInfoShow 
= typeMessageBox.GetMethod("Show",new Type[]{typeof(string)}
                
//System.Reflection.BindingFlags.Public| System.Reflection.BindingFlags.Static,
                );

            ilGenerator.EmitCall(OpCodes.Call, mInfoShow, 
null);

            ilGenerator.Emit(OpCodes.Ret);

            Type customType 
= typeBuilder.CreateType();
            
object customeObj = Activator.CreateInstance(customType); ;

            System.Reflection.MethodInfo methodInfo 
= customType.GetMethod("CallMethod");
            
//customType.InvokeMember("CallMethod", System.Reflection.BindingFlags.Public, null, customeObj, new object[] { "123" });
            
//methodBuilder.Invoke(customeObj, new object[] { "123" });
            methodInfo.Invoke(customeObj, new object[] { "11" });
            Console.ReadLine();


(zhn)山 2009-07-24 21:51 发表评论
]]>
[转蝲]滤L和卷U的资料汇?/title><link>http://www.shnenglu.com/hugai/archive/2009/06/22/88290.html</link><dc:creator>(zhn)山</dc:creator><author>(zhn)山</author><pubDate>Mon, 22 Jun 2009 07:28:00 GMT</pubDate><guid>http://www.shnenglu.com/hugai/archive/2009/06/22/88290.html</guid><wfw:comment>http://www.shnenglu.com/hugai/comments/88290.html</wfw:comment><comments>http://www.shnenglu.com/hugai/archive/2009/06/22/88290.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/hugai/comments/commentRss/88290.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/hugai/services/trackbacks/88290.html</trackback:ping><description><![CDATA[<p>原文地址Q?a >http://hi.baidu.com/niiuniu1127/blog/item/ba6e07fb28248e126d22eb8c.html</a><br><br>什么叫滤LQ用白话讲就是,一个电(sh)信号中有若干U成分,把其中一部分交流信号qo(h)掉就叫o(h)波?/p> <p>L(fng)和o(h)波的区别Q在数字信号处理的理ZQ卷l可以说是一U数学运,而o(h)波是一U信号处理的Ҏ(gu)。卷U就像加权乘法一P你能说o(h)波和加权乘法是一L(fng)吗,昄不行Q但是o(h)波最l是有乘法来实现的?/p> <p>自适应滤L是滤L所用的模板pL?x)根据图像不同位|自动调整?br>中值o(h)?median filter)单的说就是:(x)一个窗(window)中心的象素值就是这个窗包含的象素中处于中间位置的象素倹{?br>均值o(h)?mean filter)是一个窗中心的象素值就是这个窗包含的象素的q_倹{?br>I间频率主要是指囑փ的^滑或_糙E度。一般可认ؓ(f)Q高I间频率区域U?#8220;_糙”Q即囑փ的亮度值在范围内变化很大Q?#8220;qx”区,囑փ的亮度值变化相对较?yu),如^滑的水体表面{。低通o(h)波主要用于加强图像中的低频成分,减弱高频成分Q而高通o(h)波则正好相反Q加强高频细节,减弱低频l节Q简单地Ԍ(x)高通o(h)波处理过的图像更?#8220;_糙”。高通o(h)波顾名思义是让频率高的通过Q囑փh锐化效果Q低通o(h)波则恰好相反了,它是使低频通过Q囑փhqx的效果?/p> <p><br>•模板的定?–所谓模板就是一个系数矩?–模板大小Q经常是奇数Q如Q?3x3   5x5   7x7 –模板pL: 矩阵的元?w1 w2 w3 w4 w5 w6 w7 w8 w9<br>I域qo(h)?qing)过滤器的定义?x)使用I域模板q行的图像处理,被称为空域过滤?br></p> <div><span style="FONT-SIZE: 28pt; COLOR: red">w</span><span style="FONT-SIZE: 18pt; COLOR: red; POSITION: relative; TOP: 0.37em">1</span><span style="FONT-SIZE: 28pt; COLOR: red"><span> </span>w</span><span style="FONT-SIZE: 18pt; COLOR: red; POSITION: relative; TOP: 0.37em">2</span><span style="FONT-SIZE: 28pt; COLOR: red"><span> </span>w</span><span style="FONT-SIZE: 18pt; COLOR: red; POSITION: relative; TOP: 0.37em">3</span><span style="FONT-SIZE: 28pt; COLOR: red"> </span></div> <div><span style="FONT-SIZE: 28pt; COLOR: red">w</span><span style="FONT-SIZE: 18pt; COLOR: red; POSITION: relative; TOP: 0.37em">4</span><span style="FONT-SIZE: 28pt; COLOR: red"><span> </span>w</span><span style="FONT-SIZE: 18pt; COLOR: red; POSITION: relative; TOP: 0.37em">5</span><span style="FONT-SIZE: 28pt; COLOR: red"><span> </span>w</span><span style="FONT-SIZE: 18pt; COLOR: red; POSITION: relative; TOP: 0.37em">6</span><span style="FONT-SIZE: 28pt; COLOR: red"> </span></div> <div><span style="FONT-SIZE: 28pt; COLOR: red">w</span><span style="FONT-SIZE: 18pt; COLOR: red; POSITION: relative; TOP: 0.37em">7</span><span style="FONT-SIZE: 28pt; COLOR: red"><span> </span>w</span><span style="FONT-SIZE: 18pt; COLOR: red; POSITION: relative; TOP: 0.37em">8</span><span style="FONT-SIZE: 28pt; COLOR: red"><span> </span>w</span><span style="FONT-SIZE: 18pt; COLOR: red; POSITION: relative; TOP: 0.37em">9</span><br><br>模板本n被称为空域过滤器<br>I域qo(h)器的分类<br>按效果分Q钝化过滤器Q锐化过滤器<br>按数学Ş态分c?br>1Q线性过滤器Q用乘U和的计,例如QR = w1z1 + w2z2 + … + wnzn<br>高通:(x)边缘增强、边~提?br>低通:(x)钝化囑փ、去除噪?br>带通:(x)删除特定频率、增Z很少?br>2Q非U性过滤器Q结果值直接取决于像素d的?br>最大|(x)L最亮点Q亮化图?br>最|(x)L最暗点Q暗化图?br>中|(x)钝化囑փ、去除噪?/div> <p><br>钝化qo(h)器的主要用?br>1Q对大图像处理前Q删L用的l小l节<br>2Q连接中断的U段和曲U?br>3Q降低噪?br>4Q钝化处理,恢复q分锐化的图?br>5Q图像创艺(阴媄(jing)、Y辏V朦胧效果)(j)<br>~点Q?br>如果囑փ处理的目的是去除噪音Q那么,低通o(h)波在去除噪音的同时也钝化了边和尖锐的l节Q但是中值o(h)波算法的特点Q在去除噪音的同Ӟ可以比较好地保留边的锐度和图像的l节锐化qo(h)器的主要用?br>1Q印刷中的细微层ơ强调。I补扫描、挂|对囑փ的钝?br>2Q超声探成象,分L率低Q边~模p,通过锐化来改?br>3Q图像识别中Q分割前的边~提?br>4Q锐化处理恢复过度钝化、暴光不的囑փ<br>5Q图像创艺(只剩下边界的Ҏ(gu)囑փQ?br>6Q尖端武器的目标识别、定?/p> <p>qo(h)器效果的分析<br>1Q常数或变化q缓的区域,l果?或很,囑փ很暗Q亮度被降低?br>2Q在暗的背景上边~被增强?br>3Q图像的整体Ҏ(gu)度降低了<br>4Q计时?x)出现负|?处理为常?/p> <p>基本高通空域o(h)波的~点和问?br>高通o(h)波在增强了边的同Ӟ丢失了图像的层次和亮?br></p> <img src ="http://www.shnenglu.com/hugai/aggbug/88290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/hugai/" target="_blank">(zhn)山</a> 2009-06-22 15:28 <a href="http://www.shnenglu.com/hugai/archive/2009/06/22/88290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]WM_PAINT消息结http://www.shnenglu.com/hugai/archive/2009/06/04/86764.html(zhn)山(zhn)山Thu, 04 Jun 2009 09:21:00 GMThttp://www.shnenglu.com/hugai/archive/2009/06/04/86764.htmlhttp://www.shnenglu.com/hugai/comments/86764.htmlhttp://www.shnenglu.com/hugai/archive/2009/06/04/86764.html#Feedback0http://www.shnenglu.com/hugai/comments/commentRss/86764.htmlhttp://www.shnenglu.com/hugai/services/trackbacks/86764.html原文地址Q?a >http://dev.csdn.net/article/74/74935.shtm


WM_PAINT是WindowsH口pȝ中一条重要的消息Q应用程序通过处理该消息实现在H口上的l制工作?/p>

1. pȝ何时发送WM_PAINT消息Q?/p>

pȝ?x)在多个不同的时机发送WM_PAINT消息Q当W一ơ创Z个窗口时Q当改变H口的大时Q当把窗口从另一个窗口背后移出时Q当最大化或最化H口Ӟ{等Q这些动作都是由 pȝ理的,应用只是被动地接收该消息Q在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显C的数据改变的时候,q一般是通过InvalidateRect?InvalidateRgn函数来完成的。InvalidateRect和InvalidateRgn把指定的区域加到H口的Update Region中,当应用的消息队列没有其他消息Ӟ如果H口的Update Region不ؓ(f)I时Q系l就?x)自动生WM_PAINT消息?/p>

pȝZ么不在调用Invalidate时发送WM_PAINT消息呢?又ؓ(f)什么非要等应用消息队列为空时才发送WM_PAINT消息呢?q是因ؓ(f)pȝ把在H口中的l制操作当作一U低优先U的操作Q于是尽 可能地推后做。不q这样也有利于提高绘制的效率Q两个WM_PAINT消息之间通过InvalidateRect和InvaliateRgn使之失效的区域就?x)被累加hQ然后在一个WM_PAINT消息中一ơ得?更新Q不仅能避免多次重复地更新同一区域Q也优化了应用的更新操作。像q种通过InvalidateRect和InvalidateRgn来ɽH口区域无效Q依赖于pȝ在合适的时机发送WM_PAINT消息的机 制实际上是一U异步工作方式,也就是说Q在无效化窗口区域和发送WM_PAINT消息之间是有延迟的;有时候这Ugqƈ不是我们希望的,q时我们当然可以在无效化H口区域后利?br>SendMessage 发送一条WM_PAINT消息来强制立即重?br>【注解:(x)SendMessage?x)block到被发送的消息被处理完才返回,但是WM_PAINT消息的处理时间又是用户不可控制的Q?#8220;GetMessage returns the WM_PAINT message when there are no other messages in the application's message queue, and DispatchMessage sends the message to the appropriate window procedure. ”(MSDN原文)Q那么也是_(d)你调用SendMessage之后Q这个方法需要等待多长时间才能返回是不可控制的。所以MSDN不推荐用L(fng)接发送WM_PAINT消息Q?#8220;The WM_PAINT message is generated by the system and should not be sent by an application”?br>Q但不如使用Windows GDI为我们提供的更方便和强大的函敎ͼ(x)UpdateWindow和RedrawWindow。UpdateWindow?x)检查窗口的Update RegionQ当其不为空时才发送WM_PAINT消息QRedrawWindow则给我们更多的控Ӟ(x)是否重画非客户区和背景,是否L发送WM_PAINT消息而不Update Region是否为空{?/p>

2. BeginPaint

BeginPaint和W(xu)M_PAINT消息紧密相关。试一试在WM_PAINT处理函数中不写BeginPaint?x)怎样Q程序会(x)像进入了一个死循环一栯到惊人的CPU占用率,你会(x)发现E序d处理一个接 一个的WM_PAINT消息。这是因为在通常情况下,当应用收到WM_PAINT消息ӞH口的Update Region都是非空的(如果为空׃需要发送WM_PAINT消息了)(j)QBeginPaint的一个作用就是把该Update Region|ؓ(f)I,q样如果不调用BeginPaintQ窗口的Update Region׃直不为空Q如前所qͼpȝ׃(x)一直发送WM_PAINT消息?/p>

BeginPaint和W(xu)M_ERASEBKGND消息也有关系。当H口的Update Region被标志ؓ(f)需要擦除背景时QBeginPaint?x)发送WM_ERASEBKGND消息来重画背景,同时在其q回信息里有一个标志表明窗口背景是否被重画q。当我们用InvalidateRect和InvalidateRgn来把指定区域加到Update Region中时Q可以设|该区域是否需要被擦除背景Q这样下一个BeginPaintq道是否需要发送WM_ERASEBKGND消息了?/p>

另外要注意的一Ҏ(gu)QBeginPaint只能在WM_PAINT处理函数中用?/p>

(zhn)山 2009-06-04 17:21 发表评论
]]>
[囑փ处理]自适应局部图像阈值处理(Adaptive Local ThresholdingQ?/title><link>http://www.shnenglu.com/hugai/archive/2009/05/28/86018.html</link><dc:creator>(zhn)山</dc:creator><author>(zhn)山</author><pubDate>Thu, 28 May 2009 09:04:00 GMT</pubDate><guid>http://www.shnenglu.com/hugai/archive/2009/05/28/86018.html</guid><wfw:comment>http://www.shnenglu.com/hugai/comments/86018.html</wfw:comment><comments>http://www.shnenglu.com/hugai/archive/2009/05/28/86018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/hugai/comments/commentRss/86018.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/hugai/services/trackbacks/86018.html</trackback:ping><description><![CDATA[一副灰度图像{换ؓ(f)只包含ؓ(f)黑白两色的二值图像称之ؓ(f)囑փ的阈值处理;q种处理有多U方式,最单的是讑֮一个静态的阈|色素值大于该阈值的为白Q否则该值的为黑艌Ӏ但是在很多时候,q种单的Ҏ(gu)q不能得到很好的效果。在q篇文章里面我们介绍一U很单的局部自适应性图像阈值化处理Ҏ(gu)Q该Ҏ(gu)Ҏ(gu)囑փ局部特点动态的调整光|能够得到比较理想的阈值化处理效果?br><br>该方法的思想是首先将囑փ分ؓ(f)一定大的区块Q这个可以根据情况选用Q比如你可以选择3*3的矩阵,或?*5的矩c(din)选定好这些小块之后,我们计算q个块中包围了中心像素点的其他像素点(或者用户也可以加其他的限定条g选择像素点)(j)的灰度值的某种l计信息Q比如灰度均|或者灰度中间|或者最大灰度与最灰度之间的均gZ间像素点的阈倹{如果中间像素点的灰度大于该阈|则中间像素被转换为白色点Q反之,则{换ؓ(f)黑色炏V?br>以ROUND(x)代表像素点x周围的所有像素点Q以函数Statistic(ROUND(x))表示对上q的q些像素点的灰度值做l计q算Q那么我们的法思想可以描述为:(x)<br>       1Qx>Statistic(ROUND(x)))<br>x={<br>       0(x<=Statistic(ROUND(x)))<br><br>在实际情况中Q选用3*3的包围矩阵和取均值的l计法可以得到比较理想的处理效果(处理效果的图片对比如下:(x)<br>原图Q?br><img height=432 alt="" src="http://www.shnenglu.com/images/cppblog_com/hugai/1.jpg" width=576 border=0><br><br>处理后图片:(x)<br><br><img height=432 alt="" src="http://www.shnenglu.com/images/cppblog_com/hugai/2.jpg" width=576 border=0><br><br><br>Q? <img src ="http://www.shnenglu.com/hugai/aggbug/86018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/hugai/" target="_blank">(zhn)山</a> 2009-05-28 17:04 <a href="http://www.shnenglu.com/hugai/archive/2009/05/28/86018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转蝲]析本机APIhttp://www.shnenglu.com/hugai/archive/2009/05/22/85450.html(zhn)山(zhn)山Fri, 22 May 2009 10:43:00 GMThttp://www.shnenglu.com/hugai/archive/2009/05/22/85450.htmlhttp://www.shnenglu.com/hugai/comments/85450.htmlhttp://www.shnenglu.com/hugai/archive/2009/05/22/85450.html#Feedback0http://www.shnenglu.com/hugai/comments/commentRss/85450.htmlhttp://www.shnenglu.com/hugai/services/trackbacks/85450.htmlhttp://www.xfocus.net/articles/200503/782.html


创徏旉Q?005-03-09
文章属性:(x)转蝲
文章提交Q?a >cisocker (cisocker_at_163.com)

by sunwear [E.S.T]  
2004/10/02  
shellcoder@163.com

此文只能说是一笔讎ͼ是关于本机API?本机API是除了Win32 APIQNTq_开放了另一个基本接口。本机API也被很多人所熟?zhn)Q因为内核模式模块位于更低的pȝU别Q在那个U别上环境子pȝ是不可见的。尽如此,q不需要驱动别去讉Kq个接口Q普通的Win32E序可以在Q何时候向下调用本机API。ƈ没有M技术上的限Ӟ只不q微软不支持q种应用开发方法?nbsp; 
    User32.dll,kernel32.dll,shell32.dll,gdi32.dll,rpcrt4.dll,comctl32.dll,advapi32.dll,version.dll{dll代表了Win32 API的基本提供者。Win32 API中的所有调用最l都转向了ntdll.dllQ再由它转发至ntoskrnl.exe。ntdll.dll是本?API用户模式的终端。真正的接口在ntoskrnl.exe里完成。事实上Q内核模式的驱动大部分时间调用这个模块,如果它们hpȝ服务。Ntdll.dll的主要作用就是让内核函数的特定子集可以被用户模式下运行的E序调用。Ntdll.dll通过软g中断int 2Ehq入ntoskrnl.exeQ就是通过中断门切换CPUҎ(gu)U。比如kernel32.dll导出的函数DeviceIoControl()实际上调用ntdll.dll中导出的NtDeviceIoControlFile()Q反汇编一下这个函数可以看刎ͼEAX载入magic?x38Q实际上是系l调用号Q然后EDX指向堆栈。目标地址是当前堆栈指针ESP+4Q所以EDX指向q回地址后面一个,也就是指向在q入NtDeviceIoControlFile()之前存入堆栈的东ѝ事实上是函数的参数。下一个指令是int 2EhQ{C断描q符表IDT位置0x2E处的中断处理E序?br>
反编汇这个函数得刎ͼ(x)

mov eax, 38h

lea edx, [esp+4]

int 2Eh

ret 28h

当然int 2E接口不仅仅是单的API调用调度员,他是从用h式进入内核模式的main gate?br>
W2k Native API?48个这么处理的函数l成Q比NT 4.0多了37个。可以从ntdll.dll的导出列表中很容易认出来Q前~Nt。Ntdll.dll中导Z249个,原因在于NtCurrentTeb()Z个纯用户模式函数Q所以不需要传l内核。o(h)人惊奇的是,仅仅Native API的一个子集能够从内核模式调用。而另一斚wQntoskrnl.exe导出了两个Nt*W号Q它们不存在于ntdll.dll? NtBuildNumber, NtGlobalFlag。它们不指向函数Q事实上Q是指向ntoskrnl.exe的变量,可以被用C~译器extern关键字的驱动模块导入。Ntdll.dll和ntoskrnl.exe中都有两U前~Nt*,Zw*。事实上ntdll.dll中反汇编l果两者是一L(fng)。而在ntoskrnl.exe中,nt前缀指向真正的代码,而zwq是一个int 2Eh的stub。也是说zw*函数集通过用户模式到内核模式门传递的Q而Nt*W号直接指向模式切换以后的代码。Ntdll.dll中的NtCurrentTeb()没有相对应的zw函数。Ntoskrnlq不导出配对的Nt/zw函数。有些函数只以一U方式出现?br>
2Eh中断处理E序把EAX里的g为查找表中的索引Q去扑ֈ最l的目标函数。这个表是pȝ服务表SSTQC的结构SYSTEM_SERVICE_TABLE的定义如?清单也包含了l构SERVICE_DESCRIPTOR_TABLE中的定义Qؓ(f)SST数组W四个成员,前两个有着特别的用途?br>
typedef NTSTATUS (NTAPI *NTPROC) ( ) Q?br>
typedef NTPROC *PNTPROCQ?br>
#define NTPROC_ sizeof (NTPROC)

typedef struct _SYSTEM_SERVICE_TABLE

{ PNTPROC ServiceTable; // q里是入口指针数l?br>
PDWORD CounterTable; // 此处是调用次数计数数l?br>
DWORD ServiceLimit ; // 服务入口的个?br>
PBYTE ArgumentTable; // 服务参数字节数的数组

) SYSTEM_SERVICE_TABLE ,

* PSYSTEM_SERVICE_TABLE ,

* * PPSYSTEM_SERVICE_TABLE ;

/ / _ _ _ _ _ _ _ _ _ _ _ _

typedef struct _SERVICE_DESCRIPTOR_TABLE

{ SYSTEM_SERVICE_TABLE ntoskrnl ; // ntoskrnl所实现的系l服务,本机的API}

SYSTEM_SERVICE_TABLE win32k; // win32k所实现的系l服?br>
SYSTEM_SERVICE_TABLE Table3; // 未?br>
SYSTEM_SERVICE_TABLE Table4; // 未?br>
} SERVICE_DESCRIPTOR_TABLE ,

* PSERVICE_DESCRIPTOR_TABLE,

* PPSERVICE_DESCRIPTOR_TABLE Q?br>
ntoskrnl通过KeServiceDescriptorTableW号,导出了主要SDT的一个指针。内核维护另外的一个SDTQ就是KeServiceDescriptorTableShadow。但q个W号没有导出。要惛_内核模式lg中存取主要SDT很简单,只需两行C语言的代?

extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;

PSERVICE_DESCRIPTOR_TABLE psdt= KeServiceDescriptorTable;

NTPROC为本?API的方便的占位W,他类gWin32~程中的PROC。Native API正常的返回应该是一个NTSTATUS代码Q他使用NTAPI调用U定Q它和_stdcall一栗ServiceLimit成员有在ServiceTable数组里找到的入口数目。在2000下,默认值是248。ArgumentTable为BYTEs的数l,每一个对应于ServiceTable的位|ƈ昄了在调用者堆栈里的参数比Ҏ(gu)。这个信息与EDXl合Q这是内总调用者堆栈copy参数到自q堆栈所需的。CounterTable成员在free buid?000中ƈ没有使用刎ͼ在debug build中,q个成员指向代表所有函C用计数的DWORDS数组Q这个信息能用于性能分析?br>    可以使用q个命o(h)来显C?dd KeServiceDescriptorTableQ调试器把此W号解析?x8046e0c0。只有前四行是最重要的,对应那四个SDT成员?br>    q行q个命o(h):ln 8046e100Q显C符hKeServiceDescriptorTableShadowQ说明第五个开始确实ؓ(f)内核l护的第二个SDT。主要的区别在于后一个包含了win32k.sys的入口,前一个却没有。在q两个表中,Table3与Table4都是I的。Ntoskrnl.exe提供了一个方便的API函数。这个函数的名字为:(x)

    KeAddSystemServiceTable
此函数去填充q些位置?br>
2Eh的中断处理标记是KisystemService()。这也是ntoskrnl.exe没有导出的内部的W号Q但包含?kW号文g中。关于KisystemService的操作如下:(x)

1 从当前的U程控制块检索SDT指针

2 军_使用SDT?个SST的其中一个。通过试EAX中递送ID的第12?3位来军_。ID?x0000-0x0fff的映至ntoskrnl表格QID?br>
0x1000?x1ffff的分配给win32k表格。剩下的0x2000-0x2ffff?br>
0x3000-0x3ffff则是Table3和Table4保留?br>
3 通过选定SST中的ServiceLimit成员?gu)(g)查EAX?Q?1位。如果ID过了范_(d)q回错误代码为STATUS_INVALID_SYSTEM_SERVICE?br>
4 (g)查EAX中的参数堆栈指针与MmUserProbeAddress。这是一个ntoskrnl导出的全局变量。通常{于0x7FFF0000Q如果参数指针不在这个地址之下Q返回STATUS_ACCESS_VIOLATION?br>
5 查找ArgumentTable中的参数堆栈的字节数Q从调用者的堆栈copy所有的参数臛_前内核模式堆栈?br>
6 搜烦(ch)serviceTable中的服务函数指针Qƈ调用q个函数?br>
7 控制转到内部的函数KiserviceExitQ在此次服务调用q回之后?br>
从对SDT的讨论可以看C本机API一赯有第二个内核模式接口。这个接口把Win32子系l的囑Ş讑֤接口和窗口管理器和内核模式组件Win32kq接h。Win32k接口一hZint 2eh。本机API的服务号是从0x0000?x0fffQwin32k的服务号是从0x1000?x1fff?ddW32pServiceTable认定win32k.sys的符号可用?win32kd包含639个系l服务?br>

2Eh的处理过E没有用全局SDT KeServiceDescriptorTable?br>
而是一个与U程相关的指针。显?dng)U程可以有不同得SDT相关到自w。线E初试化的时?KeInitializeThread()把KeServiceDescriptorTable写到U程的控制块。尽这Pq个默认讄之后可能被改变ؓ(f)其它|例如KeServiceDescriptorTableShadow?br>

Windows 2000q行时库

Ntdll.dll臛_导出了不于1179个符受其中的249/248是属于Nt*/zw*集合。所以还?82个函C是通过int 2eh门中转。很昄Q这么多的函C依靠2k的内核?br>
其中一些是和cq行时库几乎一L(fng)函数。其实ntoskrnl也实C一些类|Eq行时库的一些函数。可以通过ddk里的ntdll.lib来链接和使用q些函数。反汇编ntdll.dll与ntoskrnl.exe的Eq行时函数能发现Qntdll.dllq不是依赖ntoskrnl.exe。这两个模块各自实现了这些函数?br>
除了Q运行时库外Q?000q提供了一个扩展的q行时函数集合。再一ơ,ntdll.dll与ntoskrnl.exe各自实现了它们。同P实现集合有重复,但是q不完全匚w。这个集合的函数都是以Rtl开头的?000q行时库包括一些辅助函数用于Eq行时候无法完成的d。例如有些处理安全事务,另外的操U?000专用的数据结构,q有些支持内存管理。微软仅仅在DDK中记录了很有用的406个函C?15个函数?br>
Ntdll.dllq提供了另外一个函数集合,以__e前缀开头。实际上它们用于点数模拟器?br>
q有很多的函数集合,所有这些函数的前缀如下Q?br>
__e(点模拟),Cc(Cache理),Csr(c/sq行时库),Dbg(调试支持)QEx(执行支持),FsRtl(文gpȝq行?QHal(g抽象?,Inbv(pȝ初试?vga启动驱动E序bootvid.dll),Init(pȝ初试?,Interlocked(U程安全变量操作),Io(IO理?,Kd(内核调试器支?,Ke(内核例程),Ki(内核中断处理),Ldr(映象装蝲?,Lpc(本地q程调用),Lsa(本地安全授权),Mm(内存理),Nls(国际化语a支持),Nt(NT本机API)QOb(对象理?,Pfx(前缀处理)QPo(甉|理),Ps(q程支持),READ_REGISTER_(从寄存器地址?QRtl(2kq行时库),Se(安全处理),WRITE_REGISTER_Q写寄存器地址Q?Zw(本机API的替换叫?Q?lt;其它>(辅助函数和Eq行时库)?br>
当编写从用户模式通过ntdll.dll或内核模式通过ntoskrnl.exe?000内核交互的Y件的时候,需要处理很多基本的数据l构Q这些结构在Win32世界中很见到?br>
常用数据l构

l     整数

ANSI字符是有W号的,而Unicode WCHAR是无W号?br>
MASM的TBYTE?0位的点敎ͼ用于高精度Q点运单元操作,注意它与Win32的TBYTEQtext byteQ完全不同?br>
TABLE 2-3. Equivalent Integral Data Types

BITS    MASM   FUNDAMENTAL    ALIAS #1    ALIAS #2  SIGNED

8       BYTE    unsigned char  UCHAR                 CHAR
16      WORD    unsigned short USHORT     WCHAR      SHORT

32      DWORD   unsigned long  ULONG                 LONG

32      DWORD   unsigned int    UINT                 INT

64      QWORD   unsigned _int64 ULONGLONG DWORDLONG LONGLONG

80      TBYTE    N/A

typedef union _LARGE_INTEGER

{  struct{

ULONG LowPart;

LONG HighPartQ};

LONGLONG QuadPart;

}

LARGE_INTEGER , * PULARGE_INTEGER ;

typedef union _ULARGE_INTEGER{

struct{

ULONG LowPart;

ULONG HighPart;?br>
ULONGLONG QuadPart;

}ULARGE_INTEGER, *PULARGE_INTEGER;

l     字符

    Win32~程中PSTR用户CHAR*QPWSTR用于WCHAR*。取决于是否定义了UNICODEQPTSTR解释为PSTR或者PWSTR。在2k内核模式下,常用的数据类型是UNICODE_STRINGQ而STRING用来表示ANSI字符?

typedef struct _UNICODE_STRING{

USHORT Length; //当前字节长度Q不是字W!Q!

USHORT MaximumLength; //Buffer的最大字节长?br>
PWSTR Buffer;}UNICODE_STRING , * PUNICODE_STRING ;

typedef struct _STRING{

USHORT Length;

USHORT MaximumLength;

PCHAR Buffer;}STRING, *PSTRING;

typedef STRING ANSI_STRING, *PANSI_STRING;

typedef STRING OEM_STRING, *POEM_STRING;

  操纵函数:RtlCreatUnicodeString(),RtlInitUnicodeString(),

RtlCopyUnicodeString(){等

l     l构

许多内核API函数需要一个固定大的OBJECT_ATTRIBUTESl构Q比如NtOpenFile()。对象的属性是OBJ_*值的l合Q可以从ntdef.h中查到?br>
IO_STATUS_BLOCKl构提供了所h操作l果的信息,很简单,status成员包含一个NTSTATUS代码, 如果操作成功 information成员提供特定h的信息?br>
q有一个结构是LIST_ENTRYQ这是一个双向环链表?br>
typedef struct _OBJECT_ATTRIBUTES

{

ULONG Length;

HANDLE RootDirectory;

PUNICODE_STRING ObjectName;

ULONG Attributes;

PVOID SecurityDescriptor;

PVOID SecurityQualityOfService;

} OBJECT_ATTRIBDTES, *POBJECT_ ATTRIBUTES;

typedef struct _IO_STATUS_BLOCK

{

NTSTATDS Status;

ULONG Information;

}IO_STATUS_BLOCK , * PIO_STATUS_BLOCK ;

typedef struct _LIST_ENTRY

{

Struct _LIST_ENTRY *Flink;

Struct _LIST_ENTRY *Blink;

}LIST_ENTRY, *PLIST_ENTRY;

双向链表的典型例子就是进E和U程链。内部变量PsActiveProcessHead是一个LIST_ENTRYl构Q在ntoskrnl.exe的数据段中,指定了系l进E列表的W一个成员?br>
CLIENT_IDl构pE和U程IDl成?br>
typedef struct _CLIENT_ID

{ HANDLE UniqueProcess;

HANDLE UniqueThread;

)CLIENT_ID, *PCLIENT_ID;

惌从用h式调用ntdll.dll中的API函数Q必考虑C下四?

1 SDK头文件没有包括这些函数的原型

2 q些函数使用的若q基本数据类型没有包括在SDK文g?br>
3 SDK和DDK头文件不兼容Q不能在win32的c源文件包含ntddk.h?br>
4 ntdll.lib没有包括在VC的默认导入库列表中?br>
W?个很Ҏ(gu)解决Q?progma comment(linker,“/defaultlib:ntdll.lib”)

~失的定义比较难解决Q最单的Ҏ(gu)是写一个自定义的头文gQ刚刚包含需要调用ntdll.dll中函数的定义。幸q的是,已经在光盘的w2k_def.h文g中做了这个工作。因个头文g用于用h式和内核模式E序Q所以必d用户模式代码中,#include<w2k_def.h>之前#define _USER_MODE_Q得DDK中出现而SDK中没有的定义可用?br>

本文部分译于一电(sh)子书<win api about>.也感谢朋友GameHunterq位p极好的朋友帮?与Free的指?

(zhn)山 2009-05-22 18:43 发表评论
]]>
[C#学习(fn)W记]在Vista或者Server2008下以Admin模式启动E序http://www.shnenglu.com/hugai/archive/2009/05/22/85447.html(zhn)山(zhn)山Fri, 22 May 2009 10:36:00 GMThttp://www.shnenglu.com/hugai/archive/2009/05/22/85447.htmlhttp://www.shnenglu.com/hugai/comments/85447.htmlhttp://www.shnenglu.com/hugai/archive/2009/05/22/85447.html#Feedback0http://www.shnenglu.com/hugai/comments/commentRss/85447.htmlhttp://www.shnenglu.com/hugai/services/trackbacks/85447.htmlhttp://www.codeproject.com/KB/vista-security/UAC_Shield_for_Elevation.aspx

Vista和W(xu)indows Server 2008上面pȝ的UACQUser Account ControlQ默认是开启的Q用户在一般情况下q过双击启动E序都不是以理员模式运行。但是,在很多情况下Qؓ(f)了在E序里面讉Kpȝ的某些特定资源,需要当前程序的identityhadmin的权限。那么这需要涉?qing)到(g)当前程序的执行用户是否处于理员模式,在当前程序不处于admin模式的情况以admin模式下重启程序?br>
参考了http://www.codeproject.com/KB/vista-security/UAC_Shield_for_Elevation.aspxq篇文章Q做如下学习(fn)W记?br>
Z(g)当前进E的之行用户是否是管理员Q需要用到CLRUSystem.Security.Principal名称I间U的WindowsIdentitycdW(xu)indowsPrincipalcR下面是代码Q很好理解:(x)

static bool IsAdmin()
        
{
            WindowsIdentity identity 
= WindowsIdentity.GetCurrent();
            WindowsPrincipal principle 
= new WindowsPrincipal(identity);
            
return principle.IsInRole(WindowsBuiltInRole.Administrator);
        }

如果当前q程不是处于理员模式,那么我们可以重启q个E序。ؓ(f)了重启程序用了System.Diagnostics名称I间下的Processc,Processc调用命令行下的"runas"命o(h)Q以理员模式重新启动当前程序。代码如下,也很好理解:(x)

 static void RestartProcessElevated()
        
{
            ProcessStartInfo info 
= new ProcessStartInfo();
            info.UseShellExecute 
= true;
            info.WorkingDirectory 
= Environment.CurrentDirectory;
            info.FileName 
= System.Windows.Forms.Application.ExecutablePath;
            info.Verb 
= "runas";
            
try
            
{
                Process.Start(info);
            }

            
catch (System.ComponentModel.Win32Exception ex)
            
{
                Console.WriteLine(
"Exception:{0}", ex.Message);
                
return;
            }


            System.Windows.Forms.Application.Exit();
        }


(zhn)山 2009-05-22 18:36 发表评论
]]>
[转蝲]解剖XP最核心的dll——NTDLL.dll http://www.shnenglu.com/hugai/archive/2009/05/21/83573.html(zhn)山(zhn)山Thu, 21 May 2009 07:23:00 GMThttp://www.shnenglu.com/hugai/archive/2009/05/21/83573.htmlhttp://www.shnenglu.com/hugai/comments/83573.htmlhttp://www.shnenglu.com/hugai/archive/2009/05/21/83573.html#Feedback0http://www.shnenglu.com/hugai/comments/commentRss/83573.htmlhttp://www.shnenglu.com/hugai/services/trackbacks/83573.html2.利用GetProcAddress 获取其函数入口地址
3.利用得到的函数指针调?br>
但是可以大致的分为几cd
1 PropertyLengthAsVariant  它被排在了第一P但是我就是不明白它是做什么的
2  CsrQconfiguration status registerQ?nbsp;Command and Status RegisterQ)(j)pd  
CsrAllocateCaptureBuffer CsrAllocateMessagePointer CsrCaptureMessageBuffer CsrCaptureMessageMultiUnicodeStringsInPlace 
CsrCaptureMessageString CsrCaptureTimeout CsrClientCallServer CsrClientConnectToServer CsrFreeCaptureBuffer 
CsrGetProcessId CsrIdentifyAlertableThread CsrNewThread CsrProbeForRead CsrProbeForWrite CsrSetPriorityClass

3 Dbgpd 调试函数
DbgBreakPoint DbgPrint DbgPrintEx DbgPrintReturnControlC DbgPrompt DbgQueryDebugFilterState DbgSetDebugFilterState 
DbgUiConnectToDbg DbgUiContinue DbgUiConvertStateChangeStructure DbgUiDebugActiveProcess DbgUiGetThreadDebugObject 
DbgUiIssueRemoteBreakin DbgUiRemoteBreakin DbgUiSetThreadDebugObject DbgUiStopDebugging DbgUiWaitStateChange DbgUserBreakPoint

4 kipd
KiRaiseUserExceptionDispatcher
KiUserApcDispatcher
KiUserCallbackDispatcher
KiUserExceptionDispatcher

5 Ldrpd  Loader APIsQ共34?br>
API
NTDLL APIs
LoadResource
LdrAccessResource
LdrAlternateResourcesEnabled
DisableThreadLibraryCalls
LdrDisableThreadCalloutsForDll
LdrEnumResources
LdrFindAppCompatVariableInfo
LdrFindEntryForAddress
EnumResourceTypesW
LdrFindResourceDirectory_U
FindResourceExA
LdrFindResource_U
LdrFlushAlternateResourceModules
LdrGetAlternateResourceModuleHandle
GetModuleHandleForUnicodeString
LdrGetDllHandle
GetProcAddress
LdrGetProcedureAddress
LdrInitializeThunk
LoadLibraryEx (LOAD_LIBRARY_AS_DATAFILE)
LdrLoadAlternateResourceModule
LoadLibrary
LdrLoadDll
LdrProcessRelocationBlock
LdrQueryApplicationCompatibilityGoo
LdrQueryImageFileExecutionOptions
LdrQueryProcessModuleInformation
LdrRelocateImage
ExitProcess
LdrShutdownProcess
ExitThread
LdrShutdownThread
LdrUnloadAlternateResourceModule
FreeLibrary
LdrUnloadDll
LdrVerifyImageMatchesChecksum
LdrVerifyMappedImageMatchesChecksum


6 NlsQNational Language SupportQ系?nbsp; 代码늮?nbsp;
NlsAnsiCodePage
NlsMbCodePageTag
NlsMbOemCodePageTag

7 Ntpd ?85个,大部分都是kernel32.dll,user32.dll{的核心实现

NtCreateFile, NtOpenFile, NtClose, NtWaitForSingleObject 是kernel32.dll中许多用L(fng)代码的核心实现?br>
NTSTATUS NtClose( HANDLE  Handle);
竟然是CloseHandle 的原w!唯一的缺Ҏ(gu)该函数ƈ没有导出库,如果要调用,必M用GetProcAddress 来获得其函数指针然后调用?br>
NtCreateFile  可以说是DDK的核?br>
RtlUnwind initiates an unwind of procedure call frames 
l构化异常(Structured Exception Handling, SEH Q的 核心?br>
NTSTATUS NtWaitForSingleObject(  HANDLE Handle, BOOLEAN Alertable, PLARGE_INTEGER Timeout);
Waits until the specified object attains a state of signaled
我想Q信号同步等Q应该与之有莫大的联pd

8 pfx 不明?br>PfxFindPrefix
PfxInitialize
PfxInsertPrefix
PfxRemovePrefix

9 RestoreEm87Context SaveEm87Context

10 rtlpd ?06个。我惻Irtl应该是runtime library的羃写吧。一个很庞大的函数族Q?br>里面包含?nbsp;RtlCreateUserProcess q样的一些很基本的函敎ͼ通常供内核模式的driver{调?br>下面是一部分CZ
APIs Forwarded to NTDLL

API
Destination
DeleteCriticalSection
Forwarded to NTDLL.RtlDeleteCriticalSection
EnterCriticalSection
Forwarded to NTDLL.RtlEnterCriticalSection
HeapAlloc
Forwarded to NTDLL.RtlAllocateHeap
HeapFree
Forwarded to NTDLL.RtlFreeHeap
HeapReAlloc
Forwarded to NTDLL.RtlReAllocateHeap
HeapSize
Forwarded to NTDLL.RtlSizeHeap
LeaveCriticalSection
Forwarded to NTDLL.RtlLeaveCriticalSection
RtlFillMemory
Forwarded to NTDLL.RtlFillMemory
RtlMoveMemory
Forwarded to NTDLL.RtlMoveMemory
RtlUnwind
Forwarded to NTDLL.RtlUnwind
RtlZeroMemory
Forwarded to NTDLL.RtlZeroMemory
SetCriticalSectionSpinCount
Forwarded to NTDLL.RtlSetCriticalSection- SpinCount
TryEnterCriticalSection
Forwarded to NTDLL.RtlTryEnterCriticalSection
VerSetConditionMask
Forwarded to NTDLL.VerSetConditionMask

11 VerSetConditionMask 用于认pȝ信息
The VerSetConditionMask function sets the bits of a 64-bit value to indicate the comparison operator to use for a specified operating system version attribute. 
This function is used to build the dwlConditionMask parameter of the VerifyVersionInfo function.

12 Zwpd ?84个。前面已l说q,为可执行性系l服务提供内核模式的入口Q?nbsp;为NTOSKRNL.EXE 提供实现。由于是内核模式Q所以在执行的时候ƈ不检查用h否有执行权限
13 内部函数 ?16个。具体作用不明,很底层的东西。无法查CQ何相兌料。无法得知与其相关的M信息?br>_CIcos 
_CIlog 
_CIpow 
_CIsin 
_CIsqrt 
__eCommonExceptions 
__eEmulatorInit 
__eF2XM1 
__eFABS 
__eFADD32 
__eFADD64 
__eFADDPreg 
__eFADDreg 
__eFADDtop 
__eFCHS 
__eFCOM 
__eFCOM32 
__eFCOM64 
__eFCOMP 
__eFCOMP32 
__eFCOMP64 
__eFCOMPP 
__eFCOS 
__eFDECSTP 
__eFDIV32 
__eFDIV64 
__eFDIVPreg 
__eFDIVR32 
__eFDIVR64 
__eFDIVRPreg 
__eFDIVRreg 
__eFDIVRtop 
__eFDIVreg 
__eFDIVtop 
__eFFREE 
__eFIADD16 
__eFIADD32 
__eFICOM16 
__eFICOM32 
__eFICOMP16 
__eFICOMP32 
__eFIDIV16 
__eFIDIV32 
__eFIDIVR16 
__eFIDIVR32 
__eFILD16 
__eFILD32 
__eFILD64 
__eFIMUL16 
__eFIMUL32 
__eFINCSTP 
__eFINIT 
__eFIST16 
__eFIST32 
__eFISTP16 
__eFISTP32 
__eFISTP64 
__eFISUB16 
__eFISUB32 
__eFISUBR16 
__eFISUBR32 
__eFLD1 
__eFLD32 
__eFLD64 
__eFLD80 
__eFLDCW 
__eFLDENV 
__eFLDL2E 
__eFLDLN2 
__eFLDPI 
__eFLDZ 
__eFMUL32 
__eFMUL64 
__eFMULPreg 
__eFMULreg 
__eFMULtop 
__eFPATAN 
__eFPREM 
__eFPREM1 
__eFPTAN 
__eFRNDINT 
__eFRSTOR 
__eFSAVE __eFSCALE __eFSIN __eFSQRT __eFST __eFST32 __eFST64 __eFSTCW __eFSTENV __eFSTP __eFSTP32 __eFSTP64 __eFSTP80
 __eFSTSW __eFSUB32 __eFSUB64 __eFSUBPreg __eFSUBR32 __eFSUBR64 __eFSUBRPreg __eFSUBRreg __eFSUBRtop __eFSUBreg __eFSUBtop
 __eFTST __eFUCOM __eFUCOMP __eFUCOMPP __eFXAM __eFXCH __eFXTRACT __eFYL2X __eFYL2XP1 __eGetStatusWord 

14 一些CRT的基本函?nbsp;?31?nbsp;主要是字W串理Q还有些基本的数学函?br>__isascii __iscsym __iscsymf __toascii _alldiv _alldvrm _allmul _alloca_probe _allrem _allshl _allshr _atoi64 _aulldiv _aulldvrm _aullrem _aullshr _chkstk _fltused 
_ftol _i64toa _i64tow _itoa _itow _lfind _ltoa _ltow _memccpy _memicmp _snprintf _snwprintf _splitpath _strcmpi _stricmp _strlwr _strnicmp _strupr _tolower 
_toupper _ui64toa _ui64tow _ultoa _ultow _vsnprintf _vsnwprintf _wcsicmp _wcslwr _wcsnicmp _wcsupr _wtoi _wtoi64 _wtol abs atan atoi atol bsearch ceil 
cos fabs floor isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper iswalpha iswctype iswdigit iswlower iswspace iswxdigit isxdigit labs log 
mbstowcs memchr memcmp memcpy memmove memset pow qsort sin sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk 
strrchr strspn strstr strtol strtoul swprintf tan tolower toupper towlower towupper vDbgPrintEx vDbgPrintExWithPrefix vsprintf wcscat wcschr wcscmp wcscpy 
wcscspn wcslen wcsncat wcsncmp wcsncpy wcspbrk wcsrchr wcsspn wcsstr wcstol wcstombs wcstoul

(zhn)山 2009-05-21 15:23 发表评论
]]>
91ɫۺϾþ| ˳˳ۺþþ| þþƷaĻ| þþƷŷպ| þ99Ʒþþþþhb| ޾Ʒþþ| Ʒþþþþþù˽| þùƷƷ| һɫþ88ձȡۺ| 99þerֻоƷ18| þ99Ʒþþþ| 97þþƷƷ| 97þþþƷۺ88þ| þ99Ʒ99þ| Ʒþ| þ¶Ʒ| ޾ƷۺϾþ| þҹ1000ϼ| ҹƷþþþþþþ| þ99Ʒ鶹| þþƷ˹ҹ| ھƷþþþþ鶹| ɫþþþۺ| ݺɫþۺ_| ƷۺϾþþþþ97| Ʒþþþþ12| www.þ99| ˾þƵ| þٸ۲AV| ޾þþһ| 99þѹƷ| þþƷ99Ʒ| 뾫ƷþɪӰ| þۺϾƷþ| 99þþƷѿ| ĻۺϾþò| ɫۺϾþĻ| Ʒþþþþ| 99þùƷһ | re99þþƷ99| 97Ʒ˾þþô߽|