﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-随风</title><link>http://www.cppblog.com/Alexxu/</link><description>Time is life</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 11:37:07 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 11:37:07 GMT</pubDate><ttl>60</ttl><item><title>寄存器 与 存储器 </title><link>http://www.cppblog.com/Alexxu/archive/2010/01/22/106237.html</link><dc:creator>Only Soft</dc:creator><author>Only Soft</author><pubDate>Fri, 22 Jan 2010 10:57:00 GMT</pubDate><guid>http://www.cppblog.com/Alexxu/archive/2010/01/22/106237.html</guid><wfw:comment>http://www.cppblog.com/Alexxu/comments/106237.html</wfw:comment><comments>http://www.cppblog.com/Alexxu/archive/2010/01/22/106237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alexxu/comments/commentRss/106237.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alexxu/services/trackbacks/106237.html</trackback:ping><description><![CDATA[寄存器没有地址<br><br>也就是寄存器存放着存储器的地址．<br><br>ＣＰＵ通过寄存器中存放的存储器地址来访问存储器中的数据<br><br>X86系列的处理器中的寄存器较少,所以<br>没有给cpu中的寄存器进行编址,而是直接对这些寄存器进行了命名.在访问寄存器的时候只要直接使用寄存器名就可以了.<br><br><br>lea指令举例：<br>lea 取得地址（第二个参数）后放入到前面的寄存器。<br>如：lea edi, ebp&nbsp; ,就是将ebp里存储的地址放入edi, 让edi也只想这个地址。<br>其实就是edi 指向ebp指向的存储器地址<br><br>又如: lea edi, [ebp+0cch],&nbsp;&nbsp; []中代表存储器地址,&nbsp;即ebp指向的存储器地址+0cch偏移。 <br><br><br>再举一个例子：<br>mov ecx,30h<br>mov eax,0CCCCCCCCh<br>rep&nbsp;&nbsp; stos dword ptr es:[edi]<br>stos是串存储指令，他的功能是将eax中的数据存入edi寄存器所指向的存储器地址中。同时，edi会增加4（字节数）<br>rep是指令重复执行ecx中填写的次数
<img src ="http://www.cppblog.com/Alexxu/aggbug/106237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alexxu/" target="_blank">Only Soft</a> 2010-01-22 18:57 <a href="http://www.cppblog.com/Alexxu/archive/2010/01/22/106237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FS寄存器到_TEB线程环境块</title><link>http://www.cppblog.com/Alexxu/archive/2010/01/20/106066.html</link><dc:creator>Only Soft</dc:creator><author>Only Soft</author><pubDate>Wed, 20 Jan 2010 07:10:00 GMT</pubDate><guid>http://www.cppblog.com/Alexxu/archive/2010/01/20/106066.html</guid><wfw:comment>http://www.cppblog.com/Alexxu/comments/106066.html</wfw:comment><comments>http://www.cppblog.com/Alexxu/archive/2010/01/20/106066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alexxu/comments/commentRss/106066.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alexxu/services/trackbacks/106066.html</trackback:ping><description><![CDATA[从FS寄存器获取当前线程ID<br>int GetThreadId()<br>{<br>&nbsp;int ithread = 0;<br>&nbsp;_asm{<br>&nbsp;&nbsp;&nbsp; xor esi , esi<br>&nbsp;&nbsp;&nbsp; mov eax, fs:[esi+18h]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ecx, [eax+ 20h] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax, [eax+ 24h]<br>&nbsp;&nbsp;&nbsp; mov dword ptr[ithread], eax<br>&nbsp;}<br>&nbsp;return ithread;<br>}<br>从FS寄存器获取当前进程ID<br>int GetProcessId()<br>{<br>&nbsp;int iProcess = 0;<br>&nbsp;_asm{<br>&nbsp;&nbsp;&nbsp; xor esi , esi<br>&nbsp;&nbsp;&nbsp; mov eax, fs:[esi+18h]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov ecx, [eax+ 20h] <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov eax, [eax+ 24h]<br>&nbsp;&nbsp;&nbsp; mov dword ptr[iProcess ],&nbsp;ecx<br>&nbsp;}<br>&nbsp;return iProcess ;<br>}<br><br>原理：<br>1.fs:18h 地址指向线程环境块_TEB<br>打开windbg可以证明：<br>0:028&gt; dd fs:18h L1<br>0053:00000018&nbsp; <span style="COLOR: red">7eeb8000</span><br>0:028&gt; !teb<br>TEB at <span style="COLOR: red">7eeb8000</span><br>&nbsp;&nbsp;&nbsp; ExceptionList:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1f8ff15c<br>&nbsp;&nbsp;&nbsp; StackBase:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1f900000<br>&nbsp;&nbsp;&nbsp; StackLimit:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1f8fc000<br>&nbsp;&nbsp;&nbsp; SubSystemTib:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00000000<br>&nbsp;&nbsp;&nbsp; FiberData:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00001e00<br>&nbsp;&nbsp;&nbsp; ArbitraryUserPointer: 00000000<br>&nbsp;&nbsp;&nbsp; Self:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7eeb8000<br>&nbsp;&nbsp;&nbsp; EnvironmentPointer:&nbsp;&nbsp; 00000000<br>&nbsp;&nbsp;&nbsp; ClientId:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00001a30 . 00001408<br>&nbsp;&nbsp;&nbsp; RpcHandle:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00000000<br>&nbsp;&nbsp;&nbsp; Tls Storage:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 133d2718<br>&nbsp;&nbsp;&nbsp; PEB Address:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7efde000<br>&nbsp;&nbsp;&nbsp; LastErrorValue:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; LastStatusValue:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c0000302<br>&nbsp;&nbsp;&nbsp; Count Owned Locks:&nbsp;&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp; HardErrorMode:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br><br>2. 在_TEB中找到线程ID和进程ID<br>0:028&gt; dt ntdll!_TEB<br>&nbsp;&nbsp; +0x000 NtTib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : _NT_TIB<br>&nbsp;&nbsp; +0x01c EnvironmentPointer : Ptr32 Void<br>&nbsp;&nbsp; +0x020 ClientId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : _CLIENT_ID<br><br>0:028&gt; dt ntdll!_CLIENT_ID<br>&nbsp;&nbsp; +0x000 UniqueProcess&nbsp;&nbsp;&nbsp; : Ptr32 Void&nbsp;&nbsp;&gt;进程ID<br>&nbsp;&nbsp; +0x004 UniqueThread&nbsp;&nbsp;&nbsp;&nbsp; : Ptr32 Void&nbsp; &gt;线程ID<br><br>当然从TEB又可以找到_PEB的地址，从_PEB里面可以获取到更多的信息。暂且搁笔~~
<img src ="http://www.cppblog.com/Alexxu/aggbug/106066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alexxu/" target="_blank">Only Soft</a> 2010-01-20 15:10 <a href="http://www.cppblog.com/Alexxu/archive/2010/01/20/106066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>驱动中关于内存分配</title><link>http://www.cppblog.com/Alexxu/archive/2009/11/15/101030.html</link><dc:creator>Only Soft</dc:creator><author>Only Soft</author><pubDate>Sun, 15 Nov 2009 15:57:00 GMT</pubDate><guid>http://www.cppblog.com/Alexxu/archive/2009/11/15/101030.html</guid><wfw:comment>http://www.cppblog.com/Alexxu/comments/101030.html</wfw:comment><comments>http://www.cppblog.com/Alexxu/archive/2009/11/15/101030.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alexxu/comments/commentRss/101030.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alexxu/services/trackbacks/101030.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在驱动中分配内存，通常你的驱动会向NT VMM请求内存，这是你必须决定你的内存是可分页的或者非可分页的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分配原则：尽量使用可分页内存，但是必须注意高等级IRQL执行不允许page fault。所以不允许采用可分页内存。可以使用PAGED_CODE();宏来检查。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非分页内存在系统中是一个有限的资源，取决于操作系统和物理内存大小. (NT VMM使用一个私有算法来计算非分页大小，这个算法使用物理内存总是作为计算因子来计算。)<br>&nbsp;&nbsp;&nbsp;&nbsp; NT提供如下例程来分配内存：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExAllocatePool();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExAllocatePoolWithQuota();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExAllocatePoolWithTag();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ExAllocatePoolWithQuotaTag<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用以上例程分配内存是必须制定内存的类型：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NonPagedPool<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PagedPool<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NonPagedPoolMustSuccessed.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......................<br><br>&nbsp;&nbsp;&nbsp; 关于非分页内存碎片问题：<br>&nbsp;&nbsp;&nbsp;&nbsp; 本来初始化的时候地址都是相邻的非分页池会变成碎片。而且VMM在托大的时候也不保证地址相邻。<br>&nbsp;&nbsp;&nbsp; 如果请求的分配或者释放小块内存（小于一个PAGE_SIZE）,可能导致物理内存碎片化。这回给系统带来各种各样的问题，包括降低系统性能和分配内存失败的情况。<br>&nbsp;&nbsp;&nbsp; 解决办法使用旁视列表，旁视列表是一个NT4.0开始提供的一个内存分配方式；具体请参考WDK docment.<br>&nbsp;&nbsp;&nbsp;&nbsp; 顺便提一下内核栈：<br>&nbsp;&nbsp;&nbsp;&nbsp; 每个在NT平台的线程有一个用户栈在用户模式执行的时候使用，一个内核栈在内核模式执行的时候使用。当线程请求系统服务而切换到内核模式的时候，陷阱机制会切换栈。用分配和线程的内核空间栈来覆盖用户空间栈。<br>在NT3.51之前，内核栈限制在两页的内存中。NT4.0开始增加到12KB.必须要谨慎的在栈上使用变量以节省占空间，防止超过限制而是系统停止。<br><br>
<img src ="http://www.cppblog.com/Alexxu/aggbug/101030.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alexxu/" target="_blank">Only Soft</a> 2009-11-15 23:57 <a href="http://www.cppblog.com/Alexxu/archive/2009/11/15/101030.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WDK中的相关宏</title><link>http://www.cppblog.com/Alexxu/archive/2009/11/15/101024.html</link><dc:creator>Only Soft</dc:creator><author>Only Soft</author><pubDate>Sun, 15 Nov 2009 15:03:00 GMT</pubDate><guid>http://www.cppblog.com/Alexxu/archive/2009/11/15/101024.html</guid><wfw:comment>http://www.cppblog.com/Alexxu/comments/101024.html</wfw:comment><comments>http://www.cppblog.com/Alexxu/archive/2009/11/15/101024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alexxu/comments/commentRss/101024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alexxu/services/trackbacks/101024.html</trackback:ping><description><![CDATA[首先是参数说明宏。参数说明宏一般都是空宏，最常见的是IN和OUT。其实定义很简单，如下所示：<br>#define IN<br>#define OUT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样一来，IN和OUT就被定义成了空。无论出现在代码中的任何地方，对代码都不会有什么实质的影响。在WDK的代码中，用来作为函数的说明。IN表示这个参数用于输入；OUT表示这个参数用来返回结果。比如下面的例子：<br>NTSTATUS <br>&nbsp; ZwQueryInformationFile(<br>&nbsp;&nbsp;&nbsp; IN HANDLE&nbsp; FileHandle,<br>&nbsp;&nbsp;&nbsp; OUT PIO_STATUS_BLOCK&nbsp; IoStatusBlock,<br>&nbsp;&nbsp;&nbsp; OUT PVOID&nbsp; FileInformation,<br>&nbsp;&nbsp;&nbsp; IN ULONG&nbsp; Length,<br>&nbsp;&nbsp;&nbsp; IN FILE_INFORMATION_CLASS&nbsp; FileInformationClass<br>&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN和OUT是比较传统的参数说明宏。在WDK中到处可见更复杂的参数说明宏，比如下面的例子：<br>VOID<br>NdisProtStatus(<br>&nbsp;&nbsp;&nbsp; IN NDIS_HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProtocolBindingContext,<br>&nbsp;&nbsp;&nbsp; IN NDIS_STATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GeneralStatus,<br>&nbsp;&nbsp;&nbsp; __in_bcount(StatusBufferSize) IN PVOID&nbsp; StatusBuffer,<br>&nbsp;&nbsp;&nbsp; IN UINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StatusBufferSize<br>&nbsp;&nbsp;&nbsp; )<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中的__in_bcount不但说明参数StatusBuffer是一个输入参数，而且说明了StatusBuffer作为一个缓冲区，它的字节长度被另一个参数StatusBufferSize所指定。读者再见到类似的说明宏，就以字面意思理解即可。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后是指定函数位置的预编译指令。比如下面的例子：<br>NTSTATUS <br>ZwQueryInformationFile(<br>&nbsp;&nbsp;&nbsp; IN HANDLE&nbsp; FileHandle,<br>&nbsp;&nbsp;&nbsp; OUT PIO_STATUS_BLOCK&nbsp; IoStatusBlock,<br>&nbsp;&nbsp;&nbsp; OUT PVOID&nbsp; FileInformation,<br>&nbsp;&nbsp;&nbsp; IN ULONG&nbsp; Length,<br>&nbsp;&nbsp;&nbsp; IN FILE_INFORMATION_CLASS&nbsp; FileInformationClass<br>&nbsp;&nbsp;&nbsp; );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN和OUT是比较传统的参数说明宏。在WDK中到处可见更复杂的参数说明宏，比如下面的例子：<br>VOID<br>NdisProtStatus(<br>&nbsp;&nbsp;&nbsp; IN NDIS_HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ProtocolBindingContext,<br>&nbsp;&nbsp;&nbsp; IN NDIS_STATUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GeneralStatus,<br>&nbsp;&nbsp;&nbsp; __in_bcount(StatusBufferSize) IN PVOID&nbsp; StatusBuffer,<br>&nbsp;&nbsp;&nbsp; IN UINT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StatusBufferSize<br>&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中的__in_bcount不但说明参数StatusBuffer是一个输入参数，而且说明了StatusBuffer作为一个缓冲区，它的字节长度被另一个参数StatusBufferSize所指定。读者再见到类似的说明宏，就以字面意思理解即可。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后是指定函数位置的预编译指令。比如下面的例子：<br>#pragma alloc_text(INIT, DriverEntry)<br>#pragma alloc_text(PAGE, NdisProtUnload)<br>#pragma alloc_text(PAGE, NdisProtOpen)<br>#pragma alloc_text(PAGE, NdisProtClose)<br>#pragma alloc_text<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个宏仅仅用来指定某个函数的可执行代码在编译出来后在sys文件中的位置。内核模块编译出来之后是一个PE格式的sys文件，这个文件的代码段（text段）中有不同的节（Section），不同的节被加载到内存中之后处理情况不同。读者需要关心的主要是3种节：INIT节的特点是在初始化完毕之后就被释放。也就是说，就不再占用内存空间了。PAGE节的特点是位于可以进行分页交换的内存空间,这些空间在内存紧张时可以被交换到硬盘上以节省内存。如果未用上述的预编译指令处理，则代码默认位于PAGELK节，加载后位于不可分页交换的内存空间中。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 函数DriverEntry显然只需要在初始化阶段执行一次，因此这个函数一般都用#pragma alloc_text(INIT, DriverEntry)使之位于初始化后立刻释放的空间内。为了节约内存，可以把很多函数放在PAGE节中。但是要注意：放在PAGE节中的函数不可以在Dispatch级调用，因为这种函数的调用可能诱发缺页中断。但是缺页中断处理不能在Dispatch级完成。为此，一般都用一个宏PAGED_CODE()进行测试。如果发现当前中断级为Dispatch级，则程序直接报异常，让程序员及早发现。示例如下：<br>#pragma alloc_text(PAGE, SfAttachToMountedDevice)<br>&#8230;&#8230;<br>NTSTATUS<br>SfAttachToMountedDevice (<br>&nbsp;&nbsp;&nbsp; IN PDEVICE_OBJECT DeviceObject,<br>&nbsp;&nbsp;&nbsp; IN PDEVICE_OBJECT SFilterDeviceObject<br>&nbsp;&nbsp;&nbsp; )<br>{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; PSFILTER_DEVICE_EXTENSION newDevExt =<br>&nbsp;&nbsp;&nbsp;SFilterDeviceObject-&gt;DeviceExtension;<br>&nbsp;&nbsp;&nbsp; NTSTATUS status;<br>&nbsp;&nbsp;&nbsp; ULONG i;
<p>&nbsp;&nbsp;&nbsp; PAGED_CODE();<br>&nbsp;&#8230;<br><br>本文摘自《寒江独钓：Windows内核安全编程》</p>
<img src ="http://www.cppblog.com/Alexxu/aggbug/101024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alexxu/" target="_blank">Only Soft</a> 2009-11-15 23:03 <a href="http://www.cppblog.com/Alexxu/archive/2009/11/15/101024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windbg基础篇--window API</title><link>http://www.cppblog.com/Alexxu/archive/2009/08/24/94232.html</link><dc:creator>Only Soft</dc:creator><author>Only Soft</author><pubDate>Mon, 24 Aug 2009 03:20:00 GMT</pubDate><guid>http://www.cppblog.com/Alexxu/archive/2009/08/24/94232.html</guid><wfw:comment>http://www.cppblog.com/Alexxu/comments/94232.html</wfw:comment><comments>http://www.cppblog.com/Alexxu/archive/2009/08/24/94232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alexxu/comments/commentRss/94232.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alexxu/services/trackbacks/94232.html</trackback:ping><description><![CDATA[User32.dll,kernel32.dll,shell32.dll,gdi32.dll,rpcrt4.dll,comctl32.dll,advapi32.dll,version.dll等dll代表了Win32 API的基本提供者；<br>Win32 API中的所有调用最终都转向了ntdll.dll，再由它转发至ntoskrnl.exe。ntdll.dll是本机 API用户模式的终端。真正的接口在ntoskrnl.exe里完成。事实上，内核模式的驱动大部分时间调用这个模块，如果它们请求系统服务。Ntdll.dll的主要作用就是让内核函数的特定子集可以被用户模式下运行的程序调用。Ntdll.dll通过软件中断int 2Eh进入ntoskrnl.exe，就是通过中断门切换CPU特权级。<br>Ntdll.dll 上面的相关API函数原型和参数都没有文档化(Undocumented ):&nbsp; <a href="http://undocumented.ntinternals.net/">http://undocumented.ntinternals.net/</a>&nbsp;这里提供了Ntdll.dll部分未公开函数的原型.<br><br>理解window API及函数原型对我们的调试将是非常重要的: 因为你时常需要去察看一些函数的参数,或者根据参数找到某些输入指针.<br><br>例如:<br>&nbsp; 17&nbsp; Id: a84.cc4 Suspend: 1 Teb: 7ff3a000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>187ffdb8 77845e6c 7782fc72 00001938 00000000 ntdll!KiFastSystemCallRet<br>187ffdbc 7782fc72 00001938 00000000 00000000 ntdll!NtWaitForSingleObject+0xc<br>187ffe20 7782fb56 00000000 00000000 00000000 ntdll!RtlpWaitOnCriticalSection+0x13e<br>187ffe48 01b05d13 0x77c8ba60&nbsp;81fa55ed 028766c8 ntdll!RtlEnterCriticalSection+0x150<br><br>从堆栈可以看出线程17 正在进入某一个临界区.&nbsp; 0x77c8ba60 就是传入的临界值 参数.<br><br>17&gt; !cs 0x77c8ba60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt; !cs 是用来查看临界区信息的命令<br>DebugInfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x77fbde20<br>Critical&nbsp;section&nbsp;&nbsp;&nbsp;=&nbsp;0x77c8ba60&nbsp;(GDI32!semColorSpaceCache+0x0)<br>LOCKED<br>LockCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x0<br>OwningThread&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x00000dd8<br>RecursionCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x1<br>LockSemaphore&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x0<br>SpinCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x00000000<br><br>可以看到 LOCKED 代表临界区是锁定状态. 即被占用.<br>OwningThread&nbsp;&nbsp;&nbsp;即是占用线程.<br><br>临界区信息结构定义在ntdll, 可以使用如下指令进行察看.<br>&gt; dt&nbsp; ntdll!_RTL_CRITICAL_SECTION<br>&nbsp;&nbsp; +0x000 DebugInfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Ptr32 _RTL_CRITICAL_SECTION_DEBUG<br>&nbsp;&nbsp; +0x004 LockCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Int4B<br>&nbsp;&nbsp; +0x008 RecursionCount&nbsp;&nbsp; : Int4B<br>&nbsp;&nbsp; +0x00c OwningThread&nbsp;&nbsp;&nbsp;&nbsp; : Ptr32 Void<br>&nbsp;&nbsp; +0x010 LockSemaphore&nbsp;&nbsp;&nbsp; : Ptr32 Void<br>&nbsp;&nbsp; +0x014 SpinCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Uint4B<br><br>察看某个动态库函数表的指令:<br>x ntdll!*<br>x kernal!*<br><br>察看结构体定义:<br>dt ntdll!*<br><br>任何动态库包括window 32的用户态dll 和用户自定义动态库都是生长在进程内存空间上的.<br>DLL 没有自己的"私有"地址空间. 它们总是被影射到应用程序的虚拟地址空间,在需要时才会被读取到物理内存中. <br>在本系列的其它章节我会谈到虚拟地址空间的内容.<br><br>通过指令可以看到ntdll 被映射到77800000 ~ 7793c000的内存空间中.<br>&gt; x *!<br>77800000 7793c000&nbsp;&nbsp; ntdll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (pdb symbols)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c:\mylocalsymbols\ntdll.pdb\F0164DA71FAF4765B8F3DB4F2D7650EA2\ntdll.pdb<br><br>当你的代码(线程)栈中出现地址范围在 77800000 ~7793c000&nbsp;之间的函数调用都表示在call NTDLL.dll<br>比如:<br>&nbsp;&nbsp; 7&nbsp; Id: a84.c34 Suspend: 1 Teb: 7ff3f000 Unfrozen<br>ChildEBP RetAddr&nbsp; Args to Child&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>089bfe8c 77845e6c 75a0179c 00000d98 00000000 ntdll!KiFastSystemCallRet<br>089bfe90 75a0179c 00000d98 00000000 00000000 ntdll!NtWaitForSingleObject+0xc<br>089bfefc 75c9f003 00000d98 ffffffff 00000000 KERNELBASE!WaitForSingleObjectEx+0x98<br>089bff14 75c9efb2 00000d98 ffffffff 00000000 kernel32!WaitForSingleObjectExImplementation+0x75<br>089bff28 69434fea 00000d98 ffffffff 0780c178 kernel32!WaitForSingleObject+0x12<br>WARNING: Stack unwind information not available. Following frames may be wrong.<br>此线程中WARNING: Stack unwind information not available. Following frames may be wrong.表示windbg无法翻译或者找到对应symbols来显示code stack. 这种错误往往是保存dump file时出现的某种异常信息.window也没有给出合理的解释.<br>以下是MSDN的原话:<br><span style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: +mn-ea; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">In some cases, the stack trace function will fail in the debugger. This can be caused by a call to an invalid address that caused the debugger to lose the location of the return address; or you may have come across a stack pointer for which you cannot directly get a stack trace; or there could be some other debugger problem. In any case, being able to manually walk a stack is often valuable.<br></span><br>这时候你需要手动的进行恢复栈调用. 如果你了解每个动态库的映射地址你就很容易进行分析了.<br><br>察看动态库中每个函数映射的地址可以采用如下指令 :<br>x ntdll!<br><br><br>手动恢复栈的大致原理如下:<br>1. 列出线程环境信息<br>&nbsp;<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">0:000&gt; !</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">teb</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US"> </span>
<p style="MARGIN-TOP: 8pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0.21in; VERTICAL-ALIGN: baseline; DIRECTION: ltr; TEXT-INDENT: -0.21in; LINE-HEIGHT: 18pt; unicode-bidi: embed; TEXT-ALIGN: left; language: en-US; mso-line-height-rule: exactly"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">TEB at 7fffe000</span></p>
<p style="MARGIN-TOP: 8pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0.21in; VERTICAL-ALIGN: baseline; DIRECTION: ltr; TEXT-INDENT: -0.21in; LINE-HEIGHT: 18pt; unicode-bidi: embed; TEXT-ALIGN: left; language: en-US; mso-line-height-rule: exactly"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">ExceptionList</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">:<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>0012ff88</span></p>
<p style="MARGIN-TOP: 8pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0.21in; VERTICAL-ALIGN: baseline; DIRECTION: ltr; TEXT-INDENT: -0.21in; LINE-HEIGHT: 18pt; unicode-bidi: embed; TEXT-ALIGN: left; language: en-US; mso-line-height-rule: exactly"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">StackBase</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">:<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>00130000</span></p>
<p style="MARGIN-TOP: 8pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0.21in; VERTICAL-ALIGN: baseline; DIRECTION: ltr; TEXT-INDENT: -0.21in; LINE-HEIGHT: 18pt; unicode-bidi: embed; TEXT-ALIGN: left; language: en-US; mso-line-height-rule: exactly"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">StackLimit</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">:<span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>00126000</span></p>
<p style="MARGIN-TOP: 8pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0.21in; VERTICAL-ALIGN: baseline; DIRECTION: ltr; TEXT-INDENT: -0.21in; LINE-HEIGHT: 18pt; unicode-bidi: embed; TEXT-ALIGN: left; language: en-US; mso-line-height-rule: exactly"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&#8230;&#8230;&#8230;.<br></span></p>
<p style="MARGIN-TOP: 8pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0.21in; VERTICAL-ALIGN: baseline; DIRECTION: ltr; TEXT-INDENT: -0.21in; LINE-HEIGHT: 18pt; unicode-bidi: embed; TEXT-ALIGN: left; language: en-US; mso-line-height-rule: exactly"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">2. 打开整个线程栈.<br>0:000&gt; </span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">dds</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US"> 00126000 00130000</span></p>
<p style="MARGIN-TOP: 8pt; MARGIN-BOTTOM: 0pt; MARGIN-LEFT: 0.21in; VERTICAL-ALIGN: baseline; DIRECTION: ltr; TEXT-INDENT: -0.21in; LINE-HEIGHT: 18pt; unicode-bidi: embed; TEXT-ALIGN: left; language: en-US; mso-line-height-rule: exactly"><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: zh-CN">3. 察看内存中所有可能是函数返回值</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">.<span style="mso-spacerun: yes">&nbsp;&nbsp;<br></span>&gt;</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US">ln</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: en-US"></span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-bidi-font-family: +mn-cs; mso-color-index: 1; mso-font-kerning: 12.0pt; language: zh-CN">&nbsp;address</span><br><br><br><br></p>
<img src ="http://www.cppblog.com/Alexxu/aggbug/94232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alexxu/" target="_blank">Only Soft</a> 2009-08-24 11:20 <a href="http://www.cppblog.com/Alexxu/archive/2009/08/24/94232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windbg基础篇--异常上下文</title><link>http://www.cppblog.com/Alexxu/archive/2009/08/22/94085.html</link><dc:creator>Only Soft</dc:creator><author>Only Soft</author><pubDate>Sat, 22 Aug 2009 05:47:00 GMT</pubDate><guid>http://www.cppblog.com/Alexxu/archive/2009/08/22/94085.html</guid><wfw:comment>http://www.cppblog.com/Alexxu/comments/94085.html</wfw:comment><comments>http://www.cppblog.com/Alexxu/archive/2009/08/22/94085.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/Alexxu/comments/commentRss/94085.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alexxu/services/trackbacks/94085.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本人进2年来主要在做windbg调试相关的工作, 有一些心得和体会. 我会逐片写在我blog中,希望对大家有用.&nbsp; windbg调试最重要的是要对系统的方方面面有比较深入的了解. 只有了解了系统工作原理才能够顺藤摸瓜.&nbsp; 一步步展开线索.&nbsp;&nbsp; windbg基础篇...&nbsp;&nbsp;<a href='http://www.cppblog.com/Alexxu/archive/2009/08/22/94085.html'>阅读全文</a><img src ="http://www.cppblog.com/Alexxu/aggbug/94085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alexxu/" target="_blank">Only Soft</a> 2009-08-22 13:47 <a href="http://www.cppblog.com/Alexxu/archive/2009/08/22/94085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D中常用的格式</title><link>http://www.cppblog.com/Alexxu/archive/2009/04/04/78904.html</link><dc:creator>Only Soft</dc:creator><author>Only Soft</author><pubDate>Fri, 03 Apr 2009 17:07:00 GMT</pubDate><guid>http://www.cppblog.com/Alexxu/archive/2009/04/04/78904.html</guid><wfw:comment>http://www.cppblog.com/Alexxu/comments/78904.html</wfw:comment><comments>http://www.cppblog.com/Alexxu/archive/2009/04/04/78904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alexxu/comments/commentRss/78904.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alexxu/services/trackbacks/78904.html</trackback:ping><description><![CDATA[<div class=postText>以下是3D中，经常会碰到的一些纹理或者文件格式。仅供参考~~
<p>TXT <br>Update: 2004-2-24&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 无任何格式的ASCII文本文件。 </p>
<p>X文件 <br>Update: 2004-2-24&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 复杂的几何模型通常是由3D建模软体创建并保存到文件中，Microsoft Direct3D使用的网格模型都是载入这些文件中的对象。 </p>
<p>TIFF格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 TIFF（Tag Image File Format有标签的图像文件格式）是Aldus在Mac初期开发的，目的是使扫描图像标准化。它是跨越Mac与PC平台最广泛的图像打印格式。TIFF使用LZW无损压缩，大大减少了图像体积。另外，TIFF格式最令人激动的功能是可以保存通道，这对于你处理图像是非常有好处的。 </p>
<p>JPEG格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 JPEG（由Joint Photographic Experts Group&#8220;联合图形专家组&#8221;命名）是我们平时最常用的图像格式。它是一个最有效、最基本的有损压缩格式，被极大多数的图形处理软件所支持。JPEG格式的图像还广泛用于Web的制作。如果对图像质量要求不高，但又要求存储大量图片，使用JPEG无疑是一个好办法。 </p>
<p>Amiga IFF格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 Amiga是由Commodore开发的，由于该公司已退出计算机市场，因此，Amiga IFF格式也将渐渐地被废弃。 </p>
<p>PCX格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 PCX是DOS下的古老程序PC PaintBrush固有格式的扩展名，因此这个格式已不受欢迎。 </p>
<p>TGA格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 TrueVision的TGA(Targa)和NuVista视频板可将图像和动画转入电视中，PC机上的视频应用软件都广泛支持TGA格式。 </p>
<p>Scitex CT格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 Scitex CT格式支持灰度级图像、RGB图像、CMYK图像。Photoshop可以打开诸如Scitex图像处理设备的数字化图像。 </p>
<p>PDF格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 PDF（Portable Document Format）是由Adobe Systems创建的一种文件格式，允许在屏幕上查看电子文档。PDF文件还可被嵌入到Web的HTML文档中。 </p>
<p>PICT格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 PICT是Mac上常见的数据文件格式之一。如果你要将图像保存成一种能够在Mac上打开的格式，选择PICT格式要比JPEG要好，因为它打开的速度相当快。另外，你如果要在PC机上用Photoshop打开一幅Mac上的PICT文件，建议你在PC机上安装QuickTime，否则，将不能打开PICT图像。 </p>
<p>BMP格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 BMP(Windows Bitmap)是微软开发的Microsoft Pain的固有格式，这种格式被大多数软件所支持。BMP格式采用了一种叫RLE的无损压缩方式，对图像质量不会产生什么影响。 </p>
<p>PNG格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 PNG是专门为Web创造的。PNG格式是一种将图像压缩到Web上的文件格式，和GIF格式不同的是，PNG格式并不仅限于256色。 </p>
<p>GIF格式 <br>Update: 2004-2-23&nbsp;&nbsp;&nbsp;&nbsp; <br>　　 GIF是输出图像到网页最常采用的格式。GIF采用LZW压缩，限定在256色以内的色彩。GIF格式以87a和89a两种代码表示。GIF87a严格支持不透明像素。而GIF89a可以控制那些区域透明，因此，更大地缩小了GIF的尺寸。 </p>
<p>后面的文章将会对Gif格式做一个实现。请期待</p>
</div>
<img src ="http://www.cppblog.com/Alexxu/aggbug/78904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alexxu/" target="_blank">Only Soft</a> 2009-04-04 01:07 <a href="http://www.cppblog.com/Alexxu/archive/2009/04/04/78904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D纹理载入Gif</title><link>http://www.cppblog.com/Alexxu/archive/2009/04/04/78902.html</link><dc:creator>Only Soft</dc:creator><author>Only Soft</author><pubDate>Fri, 03 Apr 2009 17:05:00 GMT</pubDate><guid>http://www.cppblog.com/Alexxu/archive/2009/04/04/78902.html</guid><wfw:comment>http://www.cppblog.com/Alexxu/comments/78902.html</wfw:comment><comments>http://www.cppblog.com/Alexxu/archive/2009/04/04/78902.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Alexxu/comments/commentRss/78902.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Alexxu/services/trackbacks/78902.html</trackback:ping><description><![CDATA[<p>本程序只关注对Gif纹理的实现。不对GIF加解密进行详细的说明。<br>GIF文档解析采用gif89a.h, gif89a.cpp实现。<br><br><a href="http://www.cppblog.com/Files/Alexxu/gif89a.rar"><u>gif89a 代码下载</u></a><br><br>详细纹理生成代码：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;Cmenu::CreateTextureFromGif()<br><img id=Codehighlighter1_36_2718_Open_Image onclick="this.style.display='none'; Codehighlighter1_36_2718_Open_Text.style.display='none'; Codehighlighter1_36_2718_Closed_Image.style.display='inline'; Codehighlighter1_36_2718_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_36_2718_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_36_2718_Closed_Text.style.display='none'; Codehighlighter1_36_2718_Open_Image.style.display='inline'; Codehighlighter1_36_2718_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_36_2718_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_36_2718_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;hr;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;CGif89a</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pGif&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CGif89a();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;bopen&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pGif</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">open(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">110743081.gif</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;index&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;LPCFRAME&nbsp;pFrame&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pGif</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">getFrame(index);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">pFrame)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;BYTE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pColorTable&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pGif</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">getColorTable(index);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">pColorTable)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">create&nbsp;empty&nbsp;Texture.</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;D3DXCreateTexture(m_pDevice,pFrame</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">imageWidth,pFrame</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">imageHeight,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,D3DFMT_X8B8G8R8,D3DPOOL_MANAGED,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">m_pTexture[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(hr))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DSURFACE_DESC&nbsp;textureDesc;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_pTexture[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetLevelDesc(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">textureDesc);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(textureDesc.Format&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;D3DFMT_X8B8G8R8)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;D3DLOCKED_RECT&nbsp;locketrect;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;hr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pTexture[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">LockRect(&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">locketrect,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(FAILED(hr))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;BYTE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pBytes&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(BYTE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)locketrect.pBits;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;lPitch&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;locketrect.Pitch;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;idx_trs&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pFrame</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ctrlExt.trsFlag&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;pFrame</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ctrlExt.trsColorIndex&nbsp;:&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,y</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;sx,&nbsp;sy;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(x</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sx&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sx&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(y</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sy&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">y;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sy&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;width&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pFrame</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">imageWidth;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;pBytes&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;lPitch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">sy;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;DWORD&nbsp;h</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">sy;&nbsp;y</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">h</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">pFrame</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">imageHeight;&nbsp;h</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)<br><img id=Codehighlighter1_1136_2667_Open_Image onclick="this.style.display='none'; Codehighlighter1_1136_2667_Open_Text.style.display='none'; Codehighlighter1_1136_2667_Closed_Image.style.display='inline'; Codehighlighter1_1136_2667_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1136_2667_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1136_2667_Closed_Text.style.display='none'; Codehighlighter1_1136_2667_Open_Image.style.display='inline'; Codehighlighter1_1136_2667_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1136_2667_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1136_2667_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pDstData32&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((DWORD</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)pBytes)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;sx;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WORD</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;pDstData16&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((WORD</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)pBytes)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;sx;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pPixel;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pIdx&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pFrame</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">dataBuf&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;(pFrame</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">imageWidth</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(((y</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">y:</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">h)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;((x</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">x:</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;DWORD&nbsp;w</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">sx;&nbsp;w</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">width;&nbsp;w</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)<br><img id=Codehighlighter1_1691_2632_Open_Image onclick="this.style.display='none'; Codehighlighter1_1691_2632_Open_Text.style.display='none'; Codehighlighter1_1691_2632_Closed_Image.style.display='inline'; Codehighlighter1_1691_2632_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1691_2632_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1691_2632_Closed_Text.style.display='none'; Codehighlighter1_1691_2632_Open_Image.style.display='inline'; Codehighlighter1_1691_2632_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1691_2632_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1691_2632_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pPixel&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pColorTable&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pIdx)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pIdx</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">idx_trs)<br><img id=Codehighlighter1_1756_1877_Open_Image onclick="this.style.display='none'; Codehighlighter1_1756_1877_Open_Text.style.display='none'; Codehighlighter1_1756_1877_Closed_Image.style.display='inline'; Codehighlighter1_1756_1877_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1756_1877_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1756_1877_Closed_Text.style.display='none'; Codehighlighter1_1756_1877_Open_Image.style.display='inline'; Codehighlighter1_1756_1877_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1756_1877_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1756_1877_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">if(&nbsp;32&nbsp;==&nbsp;ddsd.ddpfPixelFormat.dwRGBBitCount&nbsp;)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;pDstData32[w]&nbsp;=&nbsp;0;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">else<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;pDstData16[w]&nbsp;=&nbsp;0;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1890_2610_Open_Image onclick="this.style.display='none'; Codehighlighter1_1890_2610_Open_Text.style.display='none'; Codehighlighter1_1890_2610_Closed_Image.style.display='inline'; Codehighlighter1_1890_2610_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1890_2610_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1890_2610_Closed_Text.style.display='none'; Codehighlighter1_1890_2610_Open_Image.style.display='inline'; Codehighlighter1_1890_2610_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1890_2610_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1890_2610_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;m_nRShiftL&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;DWORD&nbsp;m_nRShiftR&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;m_nGShiftL&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;DWORD&nbsp;m_nGShiftR&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;m_nBShiftL&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;DWORD&nbsp;m_nBShiftR&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;m_nAShiftL&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;DWORD&nbsp;&nbsp;m_nAShiftR&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((DWORD(pPixel[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">])</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">(m_nRShiftL))</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">m_nRShiftR);<br></span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dg&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((DWORD(pPixel[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">])</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">(m_nGShiftL))</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;db&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((DWORD(pPixel[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">])</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">(m_nBShiftL))</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">16</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;da&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((</span><span style="COLOR: #000000">0xff</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">(m_nAShiftL))</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">24</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDstData32[w]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(DWORD)(dr</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">dg</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">db</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">da);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIdx&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pBytes&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;lPitch;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_pTexture[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">UnlockRect(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
如有任何疑问请留言。交流~~
<img src ="http://www.cppblog.com/Alexxu/aggbug/78902.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Alexxu/" target="_blank">Only Soft</a> 2009-04-04 01:05 <a href="http://www.cppblog.com/Alexxu/archive/2009/04/04/78902.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>