??xml version="1.0" encoding="utf-8" standalone="yes"?>超级碰碰碰碰97久久久久,欧美亚洲国产精品久久高清,国产精品视频久久久http://www.shnenglu.com/lapcca/category/13742.html专注于网l协?pȝ底层,服务器Y?/description>zh-cnTue, 06 Nov 2012 19:11:00 GMTTue, 06 Nov 2012 19:11:00 GMT60Linux下makefile教程http://www.shnenglu.com/lapcca/archive/2012/06/06/177838.html阿π阿πWed, 06 Jun 2012 14:57:00 GMThttp://www.shnenglu.com/lapcca/archive/2012/06/06/177838.htmlhttp://www.shnenglu.com/lapcca/comments/177838.htmlhttp://www.shnenglu.com/lapcca/archive/2012/06/06/177838.html#Feedback3http://www.shnenglu.com/lapcca/comments/commentRss/177838.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/177838.html阅读全文

阿π 2012-06-06 22:57 发表评论
]]>
c++ 中关于intQunsigned int , short的跨q_ULhttp://www.shnenglu.com/lapcca/archive/2011/04/15/144302.html阿π阿πFri, 15 Apr 2011 06:02:00 GMThttp://www.shnenglu.com/lapcca/archive/2011/04/15/144302.htmlhttp://www.shnenglu.com/lapcca/comments/144302.htmlhttp://www.shnenglu.com/lapcca/archive/2011/04/15/144302.html#Feedback4http://www.shnenglu.com/lapcca/comments/commentRss/144302.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/144302.html__int16、__int32q种数据cd在所有^C都分配相同的字节。所以在UL上不存在问题?br />所谓的不可UL是指Q在一个^C~写的代码无法拿到另一个^Cq行Ӟ不能辑ֈ期望的运行结?/span>?br />例如Q在32为^CQ所?2位^台是指通用寄存器的数据宽度?2Q编写代码,int cd分配4个字节,而在16位^台是则分?个字节,那么?6位上~译出来的exeQ?br />其中是ؓint分配2字节Q而在32位^Cq行Ӟ会按?个字节来解析Q显然会出错误的Q!

而对于非int行,目前为止Q所有的cd分配的字节数都是兼容的,即不同^台对于同一个类型分配相同的字节敎ͼQ?br />
Q在代码中尽量避免用intcdQ根据不同的需要可以用short,long,unsigned int {代ѝ?br />
下面是各个类型一览表【{?br />

64位指的是cpu通用寄存器的数据宽度?4位的?/p>

数据cd名称字节?/strong>别名取D?/font>
int*signed,signed int?a target="_blank">操作pȝ军_Q即与操作系l的Q字长"有关
unsigned int*unsigned由操作系l决定,即与操作pȝ的"字长Q有?/font>
__int81char,signed char?28 ?127
__int162short,short int,signed short int?2,768 ?32,767
__int324signed,signed int?,147,483,648 ?2,147,483,647
__int648?/font>?,223,372,036,854,775,808 ?9,223,372,036,854,775,807
bool1?/font>false ?true
char1signed char?28 ?127
unsigned char1?/font>0 ?255
short2short int,signed short int?2,768 ?32,767
unsigned short2unsigned short int0 ?65,535
long4long int,signed long int?,147,483,648 ?2,147,483,647
long long8none (but equivalent to __int64)?,223,372,036,854,775,808 ?9,223,372,036,854,775,807
unsigned long4unsigned long int0 ?4,294,967,295
enum*?/font>由操作系l决定,即与操作pȝ的"字长Q有?/font>
float4?/font>3.4E +/- 38 (7 digits)
double8?/font>1.7E +/- 308 (15 digits)
long double8?/font>1.7E +/- 308 (15 digits)
wchar_t2__wchar_t0 ?65,535
cd标识W?/td>cd说明长度
Q字节)
范围备注
char字符?/td>1-128 ~ 127-27 ~ (27 -1)
unsigned char无符字符?/td>10 ~ 2550 ~ (28 -1)
short int短整?/td>2-32768 ~ 327672-15 ~ (215 - 1)
unsigned short int无符短整?/td>20 ~ 655350 ~ (216 - 1)
int整型4-2147483648 ~ 2147483647-231 ~ (231 - 1)
unsigned int无符整型40 ~ 42949672950 ~ (232-1)
float实型Q单_ֺQ?/td>41.18*10-38 ~ 3.40*10387位有效位
double实型Q双_ֺQ?/td>82.23*10-308 ~ 1.79*1030815位有效位
long double实型Q长双精度)103.37*10-4932 ~ 1.18*10493219位有效位




阿π 2011-04-15 14:02 发表评论
]]>
C++中的四种强制cd转换的区?[转]http://www.shnenglu.com/lapcca/archive/2010/11/30/135081.html阿π阿πTue, 30 Nov 2010 07:37:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/11/30/135081.htmlhttp://www.shnenglu.com/lapcca/comments/135081.htmlhttp://www.shnenglu.com/lapcca/archive/2010/11/30/135081.html#Feedback3http://www.shnenglu.com/lapcca/comments/commentRss/135081.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/135081.html使用标准C++的类型{换符Qstatic_cast、dynamic_cast、reinterpret_cast、和const_cast?/p>

 

1 static_cast

用法Qstatic_cast < type-id > ( expression )    

该运符把expression转换为type-idcdQ但没有q行时类型检查来保证转换的安全性。它主要有如下几U用法:

①用于类层次l构中基cd子类之间指针或引用的转换?/p>

  q行上行转换Q把子类的指针或引用转换成基c表C)是安全的Q?/p>

  q行下行转换Q把基类指针或引用{换成子类表示Q时Q由于没有动态类型检查,所以是不安全的?/p>

②用于基本数据类型之间的转换Q如把int转换成charQ把int转换成enum。这U{换的安全性也要开发h员来保证?/p>

③把I指针{换成目标cd的空指针?/p>

④把Mcd的表辑ּ转换成voidcd?/p>

 

注意Qstatic_cast不能转换掉expression的const、volitale、或者__unaligned属性?/p>

 

2 dynamic_cast

用法Qdynamic_cast < type-id > ( expression )

该运符把expression转换成type-idcd的对象。Type-id必须是类的指针、类的引用或者void *Q?/p>

如果type-id是类指针cdQ那么expression也必L一个指针,如果type-id是一个引用,那么expression也必L一个引用?/p>

 

dynamic_cast主要用于cdơ间的上行{换和下行转换Q还可以用于cM间的交叉转换?/p>

在类层次间进行上行{换时Qdynamic_cast和static_cast的效果是一LQ?/p>

在进行下行{换时Qdynamic_casthcd查的功能Q比static_cast更安全?/p>

class B{

public:

       int m_iNum;

       virtual void foo();

};

 

class D:public B{

    public:

       char *m_szName[100];

};

 

void func(B *pb){

    D *pd1 = static_cast<D *>(pb);

    D *pd2 = dynamic_cast<D *>(pb);

}

 

在上面的代码D中Q如果pb指向一个Dcd的对象,pd1和pd2是一LQƈ且对q两个指针执行Dcd的Q何操作都是安全的Q?/p>

但是Q如果pb指向的是一个Bcd的对象,那么pd1是一个指向该对象的指针,对它q行Dcd的操作将是不安全的(如访问m_szNameQ,

而pd2是一个空指针?/p>

 

另外要注意:B要有虚函敎ͼ否则会编译出错;static_cast则没有这个限制?/p>

q是׃q行时类型检查需要运行时cd信息Q而这个信息存储在cȝ虚函数表Q?/p>

关于虚函数表的概念,详细可见<Inside c++ object model>Q中Q只有定义了虚函数的cL有虚函数表,

没有定义虚函数的cL没有虚函数表的?/p>

 

另外Qdynamic_castq支持交叉{换(cross castQ。如下代码所C?/p>

class A{

public:

        int m_iNum;

        virtual void f(){}

};

 

class B:public A{

};

 

class D:public A{

};

 

void foo(){

    B *pb = new B;

    pb->m_iNum = 100;

 

    D *pd1 = static_cast<D *>(pb);    //compile error

    D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL

    delete pb;

}

 

在函数foo中,使用static_castq行转换是不被允许的Q将在编译时出错Q而?dynamic_cast的{换则是允许的Q结果是I指针?/p>

 

3 reinterpret_cast

用法Qreinterpret_cast<type-id> (expression)

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针?/p>

它可以把一个指针{换成一个整敎ͼ也可以把一个整数{换成一个指针(先把一个指针{换成一个整敎ͼ

在把该整数{换成原类型的指针Q还可以得到原先的指针|?/p>

 

该运符的用法比较多?/p>

 

(static_cast .? reinterpret_cast比较Q见下面 )

 

4 const_cast

用法Qconst_cast<type_id> (expression)

该运符用来修改cd的const或volatile属性。除了const 或volatile修饰之外Q?type_id和expression的类型是一L?/p>

帔R指针被{化成非常量指针,q且仍然指向原来的对象;

帔R引用被{换成非常量引用,q且仍然指向原来的对象;帔R对象被{换成非常量对象?/p>

 

Voiatile和constc试。D如下一例:

class B{

public:

     int m_iNum;

}

void foo(){

const B b1;

b1.m_iNum = 100;            //comile error

B b2 = const_cast<B>(b1);

b2. m_iNum = 200;           //fine

}

上面的代码编译时会报错,因ؓb1是一个常量对象,不能对它q行改变Q?/p>

使用const_cast把它转换成一个常量对象,可以对它的数据成员L改变。注意:b1和b2是两个不同的对象?/p>

 

== ===========================================

 

== dynamic_cast .vs. static_cast

== ===========================================

 

class B { ... };

class D : public B { ... };

 

void f(B* pb)

{

 

D* pd1 = dynamic_cast<D*>(pb);

 

D* pd2 = static_cast<D*>(pb);

}

 

If pb really points to an object of type D, then pd1 and pd2 will get the same value. They will also get the same value if pb == 0.

 

If pb points to an object of type B and not to the complete D class, then dynamic_cast will know enough to return zero. However, static_cast relies on the programmer’s assertion that pb points to an object of type D and simply returns a pointer to that supposed D object.

 

即dynamic_cast可用于承体pM的向下{型,卛_基类指针转换为派生类指针Q比static_cast更严格更安全。dynamic_cast在执行效率上比static_cast要差一些,但static_cast在更宽上范围内可以完成映,q种不加限制的映伴随着不安全性。static_cast覆盖的变换类型除cdơ的静态导航以外,q包括无映射变换、窄化变?q种变换会导致对象切?丢失信息)、用VOID*的强制变换、隐式类型变换等...

 

== ===========================================

== static_cast .vs. reinterpret_cast

== ================================================

 

reinterpret_cast是ؓ了映到一个完全不同类型的意思,q个关键词在我们需要把cd映射回原有类型时用到它。我们映到的类型仅仅是Z故弄玄虚和其他目的,q是所有映中最危险的?q句话是C++~程思想中的原话)

 

static_cast ?reinterpret_cast 操作W修改了操作数类型。它们不是互逆的Q?static_cast 在编译时使用cd信息执行转换Q在转换执行必要的检?诸如指针界计算, cd?. 其操作数相对是安全的。另一斚wQreinterpret_cast 仅仅是重新解释了l出的对象的比特模型而没有进行二q制转换Q?例子如下Q?/p>

 

int n=9; double d=static_cast < double > (n);

 

上面的例子中, 我们一个变量从 int 转换?double?q些cd的二q制表达式是不同的?要将整数 9 转换?双精度整?9Qstatic_cast 需要正地为双_ֺ整数 d 补比特位。其l果?9.0。而reinterpret_cast 的行为却不同:

 

int n=9;

double d=reinterpret_cast<double & > (n);

 

q次, l果有所不同. 在进行计以? d 包含无用? q是因ؓ reinterpret_cast 仅仅是复?n 的比特位?d, 没有q行必要的分?

 

因此, 你需要}慎?reinterpret_cast.



阿π 2010-11-30 15:37 发表评论
]]>
c++ 枚D|页http://www.shnenglu.com/lapcca/archive/2010/11/22/134277.html阿π阿πMon, 22 Nov 2010 07:34:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/11/22/134277.htmlhttp://www.shnenglu.com/lapcca/comments/134277.htmlhttp://www.shnenglu.com/lapcca/archive/2010/11/22/134277.html#Feedback1http://www.shnenglu.com/lapcca/comments/commentRss/134277.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/134277.html阅读全文

阿π 2010-11-22 15:34 发表评论
]]>
[收藏]QQ_dll Functionhttp://www.shnenglu.com/lapcca/archive/2010/11/03/132297.html阿π阿πWed, 03 Nov 2010 07:26:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/11/03/132297.htmlhttp://www.shnenglu.com/lapcca/comments/132297.htmlhttp://www.shnenglu.com/lapcca/archive/2010/11/03/132297.html#Feedback5http://www.shnenglu.com/lapcca/comments/commentRss/132297.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/132297.html阅读全文

阿π 2010-11-03 15:26 发表评论
]]>
[分n收藏]IP协议族协议头l构http://www.shnenglu.com/lapcca/archive/2010/11/03/132295.html阿π阿πWed, 03 Nov 2010 07:23:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/11/03/132295.htmlhttp://www.shnenglu.com/lapcca/comments/132295.htmlhttp://www.shnenglu.com/lapcca/archive/2010/11/03/132295.html#Feedback0http://www.shnenglu.com/lapcca/comments/commentRss/132295.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/132295.html//Jurassic 2003.3.6 created.
/*++
TCP Header Format
                                    
    0                   1                   2                   3   
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |           |U|A|P|R|S|F|                               |
   | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
   |       |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                           

attached:完整附g


阿π 2010-11-03 15:23 发表评论
]]>
atoi,atof实现http://www.shnenglu.com/lapcca/archive/2010/11/03/132274.html阿π阿πWed, 03 Nov 2010 03:28:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/11/03/132274.htmlhttp://www.shnenglu.com/lapcca/comments/132274.htmlhttp://www.shnenglu.com/lapcca/archive/2010/11/03/132274.html#Feedback0http://www.shnenglu.com/lapcca/comments/commentRss/132274.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/132274.html
/* ********************************************************************** */
//  int a2i(const char *s) 函数原Ş 
// 功能: 把s所指向的字W串转换成intcd;
// q回|字符串的转换倹{?br /> //
//  double a2f(const char *s) 函数原Ş 
// 功能: 把s所指向的字W串转换成doublecd;
// q回|字符串的转换倹{?/span>
/* ********************************************************************** */

int  a2i( const   char   * s)
{

    
int  sign = 1 ,num = 0
    
if ( * s == ' - ' )
        sign
=- 1 ;
    
else   if ( * s == ' + ' )
        sign
= 1 ;
    s
++ ;

    
while (( * s) != ' \0 ' )
    
{
        num
= num * 10 + ( * s - ' 0 ' );
        s
++ ;
    }
    
    
return  num * sign;
}


double  a2f( const   char   * s)
{
    
bool  bDot = false ;
    
double  result = 0 ;
    
int  sign = 1 ;
    
if  ( * s == ' - ' )
    
{
        sign
=- 1 ;
    }

    
else   if ( * s == ' + ' )
    
{
        sign
= 1 ;
    }

    s
++ ;
    
    
double  temp = 1 ;

    
while  (( * s) != ' \0 ' )
    
{
        
if ( * s == ' . ' )
        
{bDot = true ;s ++ ;}


        
if  ( ! bDot)
        
{
            result
= result * 10 + ( * s - ' 0 ' );
        }

        
else
        
{
            temp
*= 10 ;
            result
= result + ( * s - ' 0 ' ) / temp;
        }

        s
++ ;
    }


    
return  sign * result;

}



阿π 2010-11-03 11:28 发表评论
]]>
c++ web Kit?/title><link>http://www.shnenglu.com/lapcca/archive/2010/10/25/131176.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Mon, 25 Oct 2010 03:57:00 GMT</pubDate><guid>http://www.shnenglu.com/lapcca/archive/2010/10/25/131176.html</guid><wfw:comment>http://www.shnenglu.com/lapcca/comments/131176.html</wfw:comment><comments>http://www.shnenglu.com/lapcca/archive/2010/10/25/131176.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.shnenglu.com/lapcca/comments/commentRss/131176.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lapcca/services/trackbacks/131176.html</trackback:ping><description><![CDATA[<h3> <span>WtQ简?/span> </h3> <p>Wt(韛_'witty')是一个C++库,用以开发交互性Web应用?/p> <p>Wt的API<b>以widgetZ?/b>Q将桌面GUI APIs的良好测试模式引入Web开发?Wt为开发者提供了几乎所有Web实现l节的抽象,其中包括事g处理、图像支持、优雅降U(或渐q增强)、及良好的URL处理?/p> <p>与其他诸多基于页面的开发框架相比,Wt可以创徏状态化的应用,同时实现了高度的交互性和可访问性;其交互性体现在Wt可以l合使用各种技术,如Ajax{;其可讉K性体现在Wt可以使应用在必要的时候支持纯HTML览器;q些Ҏ的获得充分利用了自动的<b>优雅降或渐q增?/b>?/p> <p>Wt库还自带了应用服务器E序Q可配置为独立的Web服务器,当然也允讔R过FastCGIq同其他Web服务器进行整合?/p> <h4>交互性、安全性、可讉K?/h4> <p>Z面的开发框Ӟ如PHP、JSP/JSF、Ruby on Rails{)没有实现底层基础技术的抽象Q这些技术包括HTML/XHTML、JavaScript、CSS、Ajax、Forms、DHTML 、SVG/VML/Canvas{。显ӞZ面的开发框架必要求开发者随时熟悉和掌握q些基本技术,同时当浏览器不支持时Q还要ؓ应用的优雅降U负责。另外,如果应用采取早期HTML面Z心的设计模式Q开发者不仅要实现控制器以告诉用户如何从一个页面蟩转到另一个页面,而且q要在采用一些高UAjax技术时手工设计和维护客L与服务器端的通讯?/p> <p>另一斚wQ就是Ua的Ajax框架Q也要求开发者通过J杂的JavaScript~程来处理浏览器的怪异行ؓ和客L与服务器端间的安全通讯Q这些处理Q何h都不能蟩q去不与理会。同Ӟq些应用通常不能W合可访问性的原则Q也不能很好被搜索机器h索引到?/p> <p>安全斚wQ生成HTML或填充HTML模版很容易导致安全问题,?a >跨站脚本QXSSQ?</a>?a > 跨站h伪造(CSRFQ?/a>QXSS问题一般由Q疏忽)允许嵌入JavaScript代码引vQ?CSRF问题一般由Q相信)CookiesQ可Q作证手D引赗作为开发者,q些安全问题是很难避免的,因ؓ我们有时需要允许用h入自qJavaScript 代码来实现某些功能,但开发框架本w却没提供给我们qo机制?/p> <p>相反Q用Wt来部|Web应用可以完全用C++来开发,Wt自动产生所必须?HTML/XHTML、CSS、Javascript、CGI、SVG/VML/Canvas和Ajax代码Q与此同Ӟ代码的安全性和览器兼Ҏ等问题都将转交lWt。例如,在可能的情况下, Wt最大限度的使用JavaScript和AjaxQ但在Ajax功能受限ӞWt也能保证pȝ功能q行正常。其原理是Wt先启用UHTML/CGI应用Q随后在可能的情况下渐进增强至Ajax应用。另外,Wt提供了内|的安全性考虑?/p> <h4>典型应用NQ?/h4> <ul> <li>׃Wt C++ Web应用服务器占用较的物理I间Q故而可以ؓ<b>嵌入式系l?/b> 提供ZWeb的GUIsQ?/li> <li>Wt可以为需?b>整合现有C++?/b>的应用提供基于Web的GUIs, q些 应用可能包括U学上的或工E上的应用;</li> <li>Wt可以创徏?b>现有C++桌面应用</b>到Web的有效渠道;</li> <li>Wtq可以应用于一?b>高性能、复杂的</b>Web应用Q这L应用 一般具有高度定制、充分利用Ajax的特点,同时h完全的可讉K性和较高?搜烦引擎优化(SEO)需?/li> </ul> <h4>使用Wt的其他好?/h4> <ul> <li>可以使用我们熟悉的桌面GUI模式开发Web应用Q?/li> <li>Wt为我们提供了qK的widgets集,q些widgets可以在环境不支持 JavaScript的情况下照常工作Q当Ӟ如果支持则效果更佻IQ?/li> <li>在Wt中客L与服务器端的验证和事件处理采用同一规范Q?/li> <li>Wt允许开发者选择XHTML和CSS来进行布局和样式编辑;</li> <li>Wt可生成标准的、兼容的HTML或XHTML代码Q?/li> <li>Wt采用内联VML、内联SVG、HTML 5 d或PNG可生成应用于Web的可UL的?反锯齿的囑փQ当然这些图像还可以L渲染为PDF格式Q?/li> <li> </li> <li>Wt可以避免常见的安全问题,因ؓWt拥有对表C层的完全控Ӟq能够主?qo?i>处于zd状态的</i>标签和属性;Wt同时实现了业务逻辑的隐藏,q?通过状态化的设计简化了认证机制Q?/li> <li>ZWt的应用的载入旉极短且占用带宽也很低Q究其原因是Wt中这些特?仅受限于面昄的复杂程度,而不是应用程序自w的寸QWtq实C所有的 常用技巧和ҎQ以优化应用的快速反应,Wt几乎做到了针Ҏ有浏览器的优化;</li> <li>Wt提供了服务器端初始的事g处理Q即<i>服务器推</i>?i>Comet</i>Q?q部分API使用单、稳定且在所有浏览器上均能实玎ͼ</li> <li>Wt在服务器部v上,既可以用内|的httpdQ又可以使用FastCGI/ISAPIQ?当然前者实施v来更便易行?/li> </ul><img src ="http://www.shnenglu.com/lapcca/aggbug/131176.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lapcca/" target="_blank">阿π</a> 2010-10-25 11:57 <a href="http://www.shnenglu.com/lapcca/archive/2010/10/25/131176.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PE文g头的l构?/title><link>http://www.shnenglu.com/lapcca/archive/2010/09/30/128122.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 30 Sep 2010 04:23:00 GMT</pubDate><guid>http://www.shnenglu.com/lapcca/archive/2010/09/30/128122.html</guid><wfw:comment>http://www.shnenglu.com/lapcca/comments/128122.html</wfw:comment><comments>http://www.shnenglu.com/lapcca/archive/2010/09/30/128122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/lapcca/comments/commentRss/128122.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lapcca/services/trackbacks/128122.html</trackback:ping><description><![CDATA[<img src="http://www.shnenglu.com/images/cppblog_com/lapcca/13342/o_PE%e6%96%87%e4%bb%b6%e5%a4%b4%e7%bb%93%e6%9e%84%e5%9b%be1.jpg" /> <br /><br />最q学习PE文gQ《Y件加密技术内q》第一章有详细的讲?br />不过看了半天搞的头到晕了Q结构太多,最后自己查看WINNT.H头文?br />把PE头中的结构画了一张图Q在看书学习的时候边看书边看囑֭习理解较快!<br />有什么错误请高手指正Q谢谢!<br />其次强烈大家看《Y件加密技术内q》第一章配合本图,效果不错哦!<br />附上自己写的一个PE文g查看器,单。里面用了一些《Y件加密技术内q?br />光盘中的代码Q用MFC写的Q?br />错误在所隑օQ恳请大家指正!<br /><br /><br /><a href="/Files/lapcca/PE文g查看?rar">PE文g查看器源?/a><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />转自Q?a >http://bbs.pediy.com/showthread.php?t=62693&highlight=rar</a><img src ="http://www.shnenglu.com/lapcca/aggbug/128122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lapcca/" target="_blank">阿π</a> 2010-09-30 12:23 <a href="http://www.shnenglu.com/lapcca/archive/2010/09/30/128122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DLL在应用程序间׃n数据http://www.shnenglu.com/lapcca/archive/2010/09/17/126860.html阿π阿πFri, 17 Sep 2010 05:38:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/09/17/126860.htmlhttp://www.shnenglu.com/lapcca/comments/126860.htmlhttp://www.shnenglu.com/lapcca/archive/2010/09/17/126860.html#Feedback1http://www.shnenglu.com/lapcca/comments/commentRss/126860.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/126860.html 

#pragma data_seg( " .mydata " )
POINT pPoint
= { 0 , 0 } ; // must initialize
#pragma data_seg()
#pragma comment(linker,
" /SECTION:.mydata,RWS " )


阿π 2010-09-17 13:38 发表评论
]]>
利用斯特?Stirling)公式求解n!http://www.shnenglu.com/lapcca/archive/2010/09/13/126499.html阿π阿πMon, 13 Sep 2010 03:52:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/09/13/126499.htmlhttp://www.shnenglu.com/lapcca/comments/126499.htmlhttp://www.shnenglu.com/lapcca/archive/2010/09/13/126499.html#Feedback0http://www.shnenglu.com/lapcca/comments/commentRss/126499.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/126499.html   



阿π 2010-09-13 11:52 发表评论
]]>
BMP文g头格?bmp文g二进制解?/title><link>http://www.shnenglu.com/lapcca/archive/2010/09/09/126229.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 09 Sep 2010 04:10:00 GMT</pubDate><guid>http://www.shnenglu.com/lapcca/archive/2010/09/09/126229.html</guid><wfw:comment>http://www.shnenglu.com/lapcca/comments/126229.html</wfw:comment><comments>http://www.shnenglu.com/lapcca/archive/2010/09/09/126229.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/lapcca/comments/commentRss/126229.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lapcca/services/trackbacks/126229.html</trackback:ping><description><![CDATA[<p> <span>BMP</span> <span>文g头格?/span> <span> <span>bmp</span> </span> <span>文g二进制解?/span> <span>,bmp</span> <span>文g解析</span> <span>,bmp</span> <span>存储格式</span> <span> </span> </p> <p> <span>下面的表格是我整理的</span> <span>BMP</span> <span>文g头的格式?/span> </p> <p> <span>方便大家查询?/span> </p> <p> </p> <p> <span>Bmp</span> <span>的文件头?/span> <span>54 , </span> <span>以下都是</span> <span>24 bit,</span> </p> <p> <span>如果</span> <span> </span> <span>囑փ大小?/span> <span>720 * 480 ,</span> <span>那么文g大小?/span> <span>: 54 + 720 * 480 *3 </span> <span>很好理解</span> <span>,</span> </p> <p> <span>如果</span> <span> </span> <span>囑փ大小?/span> <span> <span>333 * 333</span> </span> <span>那么文g大小׃?/span> <span>: 54 + 333 * 333 *3 </span> <span>?/span> <span>,</span> <span>奇怪么</span> <span>?,<br /><br />   ȝ引出高h了,我就公布{案吧: <br /><span>   如果</span><span></span><span>囑փ大小?/span><span> <span>1*7  </span></span><span>那么文g大小是</span><span>: 54 + 1*7*3 + 7*n </span><span>?/span><span>,<br /></span><span>   如果</span><span></span><span>囑փ大小?/span><span> <span>3*5  </span></span><span>那么文g大小是</span><span>: 54 + 3*5*3 + 5*n </span><span>?/span><span>,<br /></span><span>   如果</span><span></span><span>囑փ大小?/span><span> 11<span>*77  </span></span><span>那么文g大小是</span><span>: 54 + 11*77*3 + 77*n </span><span>?/span><span>,<br /></span>   M是如果width * high * 3  + high * n Q= 4的倍数Q?那么文g大小是 54 +  width * high * 3 + high*n  了?br /><br />   n的取D围是 0 ~~3   直到下来,size?的倍数?br /><br /><img src="http://www.shnenglu.com/images/cppblog_com/lapcca/13342/o_bmp.jpg" /><br /><br /><br />转自Q?a >http://www.cnitblog.com/dvb-dvb/archive/2009/07/06/59865.aspx</a></span> </p><img src ="http://www.shnenglu.com/lapcca/aggbug/126229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lapcca/" target="_blank">阿π</a> 2010-09-09 12:10 <a href="http://www.shnenglu.com/lapcca/archive/2010/09/09/126229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Application Compatibility - Session 0 Isolationhttp://www.shnenglu.com/lapcca/archive/2010/09/08/126152.html阿π阿πWed, 08 Sep 2010 06:03:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/09/08/126152.htmlhttp://www.shnenglu.com/lapcca/comments/126152.htmlhttp://www.shnenglu.com/lapcca/archive/2010/09/08/126152.html#Feedback0http://www.shnenglu.com/lapcca/comments/commentRss/126152.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/126152.html

In Windows XP, Windows Server 2003, and earlier versions of the Windows operating system, all services run in the same session as the first user who logs on to the console.  This session is called Session 0. Running services and user applications together in Session 0 poses a security risk because services run at elevated privilege and therefore are targets for malicious agents who are looking for a means to elevate their own privilege level.

The Microsoft Windows Vista operating system mitigates this security risk by isolating services in Session 0 and making Session 0 non-interactive.  In Windows Vista (and Windows Longhorn Server), only system processes and services run in Session 0.  The user logs on to Session 1.  On Windows Longhorn Server, subsequent users log on to subsequent sessions (Session 2, Session 3 etc).  This means that services never run in the same session as users' applications and are therefore protected from attacks that originate in application code.

Specific examples of affected driver classes include:

  • Printer drivers, which are loaded by the spooler service
  • All drivers authored with the User Mode Driver Framework (UMDF), because these drivers are hosted by a process in Session 0

Application classes affected by this feature:

  • Services that create a UI
  • A service that tries to use window message functions such as SendMessage and PostMessage to communicate with an application
  • Applications creating globally named objects

Sessions in Windows XP / 2003
OK - so we've already mentioned that Session 0 poses a security risk because services run at elevated privilege.  The first user on the console also runs in Session 0 - which provides the most common attack vector used to target unsuspecting users.

Sessions in Windows Vista
In Windows Vista, Session 0 is created for services and user-mode drivers.  Session 1 is created for the first user who logs in.  Applications for this user run in Session 1.

  • Each time a user logs in, a session is created for that user
  • Each session contains a collection of windows stations
  • The only supported interactive window station is WinSta0, so each session gets one of these
  • WinSta0 contains the keyboard, mouse, and display device
  • Each window station can contain multiple desktops, which have logical display surfaces and can be used to manage windows
  • Messages can only be sent between processes that are on the same desktop (the hook procedure of a process can also only receive messages intended for windows created on the same desktop)
  • Only one desktop at a time is active
  • There are several default desktops ?default, WinLogon (secure), and screen-saver

OK - so what could this actually look like in a real world scenario?  Consider the following example - if a service belonging to an application generates a UI element in Session 0 - for example a dialog box waiting for the user to click "OK" or "Cancel", the application is now waiting on the service, and the UI is not displayed in the user session.  From the user perspective, the application appears to be hung, when in actual fact it is performing quite normally, and patiently waiting for a user response that the user cannot see!

As you can imagine - this presents a problem for users, administrators and developers.  However, there are some quick mitigating factors to consider.

  • If the application's service uses a UI, a built-in mitigation in Windows Vista allows the user to interact with the Session 0 UI in a special desktop.  This will make the UI specific to the application available and not the entire Session 0 desktop.
  • If the application creates globally named objects, then use the Windows XP compatibility mode to ensure that the application will continue to work with the Session 0 services.

When testing applications for compatibility with Windows Vista, consider the following test scenarios:

  • Test and verify the application on Windows XP in a Terminal Server mode or a Fast User Switching (FUS) mode.  If the application works properly on Windows XP in these scenarios, then it is very likely to work under Windows Vista.
  • Verify that the application functions properly after applying the Window XP compatibility mode, which contains mitigation for some of the Session 0 issues.
  • Test the driver in Windows Vista to ensure that it runs properly.  If that is not possible, test the driver in Windows XP with FUS enabled and multiple users logged on.  If the driver works correctly for second and subsequent logged-on users, it is not likely to be affected by the Session 0 changes in Windows Vista.  The only issues that this test does not detect are those related to the absence of the video driver in Session 0 in Windows Vista.

Finally, you can leverage the following Windows Vista capability solutions:

  • Use client or server mechanisms such as remote procedure call (RPC) or named pipes to communicate between services and applications.
  • Use the WTSSendMessage function to create a simple message box on the user's desktop.  This allows the service to give the user a notification and request a simple response.
  • For more complex UI, use the CreateProcessAsUser function to create a process in the user's session.
  • Explicitly choose either the Local\ or Global\ namespace for any named objects, such as events or mapped memory, which the service makes available.

And that will do it for a quick look at how Session 0 isolation affects Application Compatibility in Windows Vista.  The links below contain more information on some of the concepts discussed above.  Until next time ...



阿π 2010-09-08 14:03 发表评论
]]>
学习linux/unix~程Ҏ的徏?学习Linux的四个步?/title><link>http://www.shnenglu.com/lapcca/archive/2010/08/31/125386.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Tue, 31 Aug 2010 03:49:00 GMT</pubDate><guid>http://www.shnenglu.com/lapcca/archive/2010/08/31/125386.html</guid><wfw:comment>http://www.shnenglu.com/lapcca/comments/125386.html</wfw:comment><comments>http://www.shnenglu.com/lapcca/archive/2010/08/31/125386.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/lapcca/comments/commentRss/125386.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lapcca/services/trackbacks/125386.html</trackback:ping><description><![CDATA[<p> <img src="http://www.shnenglu.com/images/cppblog_com/lapcca/13342/o_41__600x100_linux_logo.jpg" /> <br /> <font face="Courier New">假设你是计算机科班出w,计算机系的基本课E如数据l构、操作系l、体pȝ构、编译原理、计机|络你全修过<br />我想大概可以分ؓ4个阶D,水^从低到高<br />从安装?>linux常用命o=>linuxpȝ~程=>内核开发阅d核源?br />其中学习linux常用命o时就要学会自q译内核,优化pȝQ调整参?br />安装和常用命令书太多了,找本E微详细点的okQ其间需要学会正则表辑ּ<br />pȝ~程推荐《高Uunix环境~程》,黑话叫APUE<br />q有《unix|络~程?br />q时候大概还需要看资料理解elf文g格式Q连接器和加载器Qcmu的一本教材中文名为《深入理解计机pȝ》比较好<br />内核开发阅d核源码阶D,从写驱动入手逐渐深入linux内核开?br />参考书如下《linux device drivers》,黑话叫ldd<br />《linux kernel development》,黑话叫lkd<br />《understading the linux kernel》,黑话叫utlk<br />《linux源码情景分析?br />q四本书为搞内核的必Mc?br />最后,W三阶段和第四阶D|重动手,I无益Q光看书也不|,不动手那些东西理解不?br /><br /><strong><font color="#666633" size="4">学习linux/unix~程Ҏ的徏?/font></strong><br />学习路径Q?br />  首先先学学编辑器Qvim, emacs什么的都行?br />然后学make file文gQ只要知道一点就行,q样可以准备编E序了?br />  然后看看《CE序设计语言》K&RQ这样呢Q基本上可以进行一般的~程了,Z找本数据l构的书来看?br />  如果惛_习UNIX/LINUX的编E,《APUE》绝对经典的教材Q加׃下功底,学习《UNP》的W二南这样基本上pȝ斚w的就可以掌握了?br />  然后再看Douglus E. Comer的《用TCP/IPq行|际互连》第一P学习一下网l的知识Q再看《UNP》的W一P不仅学习|络~程Q而且对系l编E的一些常用的技巧就很熟悉了Q如果l网l编E,看《TCP/IPq行|际互连》的W三P里面有很多关于应用协议telnet、ftp{协议的~程?br />如果惛_讑֤驱动E序Q首先您的系l编E的接口比如文g、IPC{必要熟知了,再学习《LDD??br />  对于几本l典教材的评P<br />  《The C Programing Language》K&R l典的C语言E序设计教材Q作者是C语言的发明者,教材内容深入出。虽然有点老,但是必备的一本手册,现在有时候我q常ȝ。篇q比较小Q但是每看一遍,有一遍的收获。另外也可用谭浩强的《C语言E序设计》代ѝ?br />  《Advanced Programing in Unix Envirement?W.Richard StevensQ也是非常经典的书(废话QStevens的书哪有不经典的Q)Q虽然初学者就可以看,但是事实上它是《Unix Network Programing》的一本辅助资料。国内的译的《UNIX环境高~程》的水^不怎么P现在有媄印版Q直接读英文比读中文来得Ҏ?br />  《Unix Network Programing》W.Richard StevensQ第一卯BSD Socket|络~程接口和另外一U网l编E接口的Q不q现在一般都用BSD SocketQ所以这本书只要看大U一半多可以了。第二卷没有设计到网l的东西Q主要讲q程间通讯和PosixU程。所以看了《APUE》以后,可以看它了Q基本上pȝ的东西就由《APUE》和《UNP》vol2概括了。看q《UNP》以后,您就会知道系l编E的l大部分~程技巧,即卷一是讲|络~程的。国内是清华译得《Unix|络~程》,译者得功底也比较高Q翻译地比较好。所以徏议还是看中文版?br />  《TCP/IP解》一׃P卷一讲协议,卷二讲实玎ͼ卷三讲编E应用。我没有怎么看过。,但是据说也很l典的,因ؓ我没有时间看卷二Q所以不便评仗?br />  《用TCP/IPq行|际互连》Douglus.E.Comer 一׃P卷一讲原理,卷二讲实玎ͼ卷三讲高U协议。感觉上q一套要比Stevens的那一套要好,pStevens也不得不承认它的W一卷非常经典。事实上Q第一卷即使你没有一点网l的知识Q看完以后也会对|络的来龙去脉了如指掌。第一卷中q有很多习题也设计得l典和实用,因ؓ作者本w就是一位教师,q且卷一是国外研I生的教材。习题ƈ没有{案Q留l读者思考,因ؓ问题得答案可以让你成Z个中U的HackerQ这些问题的{案可以象Douglus索取Q不q只有他只给教师卷二我没有怎么看,卷三可以作ؓ参考手册,其中C子也很经典。如果您看过Qterm的源代码Q就会知道Qterm的telnet 实现部分大多数就是从q本书的源代码过来的。对于网l原理的书,我推荐它Q而不是Stevens的《TCP/IP解》?br />  《Operating System - Design and Implement》这个是讲操作系l的书,用Minix做的例子。作者母语不是英文,所以英文看h比较晦ӆ。国内翻译的是《操作系l设计与实现》,我没看过中文版,因ؓ译者是晋元,他翻译的《APUE》已l让我失望头了。读了这本书Q对操作pȝ的底层怎么工作的就?br />有一个清晰的认识?br />  《Linux Device Driver?e QؓC多的关于Linux讑֤驱动E序的好书。不q内Ҏ些杂乱,如果您没有一些写驱动的经验,初次看会有些怸着南北。国内翻译的是《Linux讑֤驱动E序》第二版Q第一版,W二版的译者我都有很深的接触,不过M上来_虽然W二版翻译的有些不尽人意Q但是相比第一版来说已l超Z一大截。要读这一本书Q至应该先找一些《计机原理》《计机体系l构》的书来马马虎虎读读Q至应该对g和计机的工作过E有一些了解?br /></font>       </p><img src ="http://www.shnenglu.com/lapcca/aggbug/125386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lapcca/" target="_blank">阿π</a> 2010-08-31 11:49 <a href="http://www.shnenglu.com/lapcca/archive/2010/08/31/125386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本操作的位q算实现http://www.shnenglu.com/lapcca/archive/2010/08/27/124948.html阿π阿πFri, 27 Aug 2010 08:26:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/08/27/124948.htmlhttp://www.shnenglu.com/lapcca/comments/124948.htmlhttp://www.shnenglu.com/lapcca/archive/2010/08/27/124948.html#Feedback0http://www.shnenglu.com/lapcca/comments/commentRss/124948.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/124948.html阅读全文

阿π 2010-08-27 16:26 发表评论
]]>
定位IATq输出导入函数名U和对应的函数地址http://www.shnenglu.com/lapcca/archive/2010/08/23/124404.html阿π阿πMon, 23 Aug 2010 05:22:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/08/23/124404.htmlhttp://www.shnenglu.com/lapcca/comments/124404.htmlhttp://www.shnenglu.com/lapcca/archive/2010/08/23/124404.html#Feedback0http://www.shnenglu.com/lapcca/comments/commentRss/124404.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/124404.html  1 #include  < stdio.h >
 2 #include  < windows.h >
 3
 4 void  main()
 5 {
 6 // 取得L块的模块句柄Q即q程模块基地址Q?/span>
 7 HMODULE hMod  =  GetModuleHandle(NULL);
 8
 9 // 把进E基址赋给pDosHeader,卌v始基址是PE的IMAGE_DOS_HEADER
10 IMAGE_DOS_HEADER *  pDosHeader  =  (IMAGE_DOS_HEADER * )hMod;
11
12 // 定位到PE HEADER
13 // 基址hMod加上IMAGE_DOS_HEADERl构的e_lfanew成员到达IMAGE_NT_HEADERS
14 // NT文g头的?字节是文件签?"PE00" 字符?,然后?0字节的IMAGE_FILE_HEADERl构
15 // 卛_达IMAGE_OPTIONAL_HEADERl构的地址,获取了一个指向IMAGE_OPTIONAL_HEADERl构体的指针
16 IMAGE_OPTIONAL_HEADER  *  pOptHeader  =
17 (IMAGE_OPTIONAL_HEADER  * )((BYTE * )hMod  +  pDosHeader -> e_lfanew  +   24 );
18
19 // 定位到导入表
20 // 通过IMAGE_OPTIONAL_HEADERl构中的DataDirectoryl构数组中的W二个成员中?br /> 21 // VirturalAddress字段定位到IMAGE_IMPORT_DESCRIPTORl构的v始地址
22 // 卌得导入表中第一个IMAGE_IMPORT_DESCRIPTORl构的指?导入表首地址)
23 IMAGE_IMPORT_DESCRIPTOR *  pImportDesc  =  (IMAGE_IMPORT_DESCRIPTOR * )
24 ((BYTE * )hMod  +  pOptHeader -> DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
25
26 while (pImportDesc -> FirstThunk)
27 {
28 // 遍历l构的OriginalFirstThunk字段所指向的IMAGE_IMPORT_BY_NAMEl构得到导出函数?br /> 29 // 遍历IMAGE_IMPORT_DESCRIPTORl构的FirstThunk数组得到每个函数的地址
30
31 // 导出模块的名U?/span>
32 char *  pszDllName  =  ( char * )((BYTE * )hMod  + pImportDesc -> Name);
33 printf( " \n模块名称Q?s \n " , pszDllName);
34
35 //  一个IMAGE_THUNK_DATA是一个双字,它指定了一个导入函?/span>
36 IMAGE_THUNK_DATA *  pThunk  =  (IMAGE_THUNK_DATA * )
37 ((BYTE * )hMod  +  pImportDesc -> OriginalFirstThunk);
38 int  n  =   0 ;
39 while (pThunk -> u1.Function)
40 {
41 //  取得函数名称。hint/name表前两个字节是函数的序号Q后4个字节是函数名称字符串的地址
42 char *  pszFunName  =  ( char * )
43 ((BYTE * )hMod  +  (DWORD)pThunk -> u1.AddressOfData  +   2 );
44 //  取得函数地址。IAT表就是一个DWORDcd的数l,每个成员记录一个函数的地址
45 PDWORD lpAddr  =  (DWORD * )((BYTE * )hMod  +  pImportDesc -> FirstThunk)  +  n;
46
47 //  打印出函数名U和地址
48 printf( "    从此模块导入的函敎ͼ%-25sQ?/span> " , pszFunName);
49 printf( " 函数地址Q?X \n " , lpAddr);
50 n ++ ; pThunk ++ ;
51 }

52
53 pImportDesc ++ ;
54 }

55 MessageBox(NULL, " Test " , " Test " , 0 );
56 }


阿π 2010-08-23 13:22 发表评论
]]>
Hook API 单示?/title><link>http://www.shnenglu.com/lapcca/archive/2010/08/23/124400.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Mon, 23 Aug 2010 05:15:00 GMT</pubDate><guid>http://www.shnenglu.com/lapcca/archive/2010/08/23/124400.html</guid><wfw:comment>http://www.shnenglu.com/lapcca/comments/124400.html</wfw:comment><comments>http://www.shnenglu.com/lapcca/archive/2010/08/23/124400.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/lapcca/comments/commentRss/124400.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lapcca/services/trackbacks/124400.html</trackback:ping><description><![CDATA[<p> </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"> <span style="COLOR: #008080">  1</span> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">#include </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">windows.h</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080">  2</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />#include </span> <span style="COLOR: #000000"><</span> <span style="COLOR: #000000">stdio.h</span> <span style="COLOR: #000000">></span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080">  3</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080">  4</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 挂钩指定模块hMod对MessageBoxA的调?/span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080">  5</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #000000">BOOL SetHook(HMODULE hMod);<br /></span> <span style="COLOR: #008080">  6</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 定义MessageBoxA函数原型</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080">  7</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #000000">typedef </span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> (WINAPI </span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">PFNMESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT uType);<br /></span> <span style="COLOR: #008080">  8</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 保存MessageBoxA函数的真实地址</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080">  9</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #000000">PROC g_orgProc </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (PROC)MessageBoxA;<br /></span> <span style="COLOR: #008080"> 10</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 11</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 12</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />BOOL EnableDebugPrivilege() <br /></span> <span style="COLOR: #008080"> 13</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_281_795_Open_Image" onclick="this.style.display='none'; Codehighlighter1_281_795_Open_Text.style.display='none'; Codehighlighter1_281_795_Closed_Image.style.display='inline'; Codehighlighter1_281_795_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_281_795_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_281_795_Closed_Text.style.display='none'; Codehighlighter1_281_795_Open_Image.style.display='inline'; Codehighlighter1_281_795_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span> <span id="Codehighlighter1_281_795_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_281_795_Open_Text"> <span style="COLOR: #000000">{ <br /></span> <span style="COLOR: #008080"> 14</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />BOOL fOk </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> FALSE; <br /></span> <span style="COLOR: #008080"> 15</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />HANDLE hToken; <br /></span> <span style="COLOR: #008080"> 16</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 17</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000"> (OpenProcessToken(GetCurrentProcess(), <br /></span> <span style="COLOR: #008080"> 18</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />       TOKEN_ADJUST_PRIVILEGES, </span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000">hToken)) <br /></span> <span style="COLOR: #008080"> 19</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_406_756_Open_Image" onclick="this.style.display='none'; Codehighlighter1_406_756_Open_Text.style.display='none'; Codehighlighter1_406_756_Closed_Image.style.display='inline'; Codehighlighter1_406_756_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_406_756_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_406_756_Closed_Text.style.display='none'; Codehighlighter1_406_756_Open_Image.style.display='inline'; Codehighlighter1_406_756_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span id="Codehighlighter1_406_756_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_406_756_Open_Text"> <span style="COLOR: #000000">{ <br /></span> <span style="COLOR: #008080"> 20</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />       TOKEN_PRIVILEGES tp;<br /></span> <span style="COLOR: #008080"> 21</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />       tp.PrivilegeCount </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">1</span> <span style="COLOR: #000000">; <br /></span> <span style="COLOR: #008080"> 22</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />       LookupPrivilegeValue(NULL, SE_DEBUG_NAME, </span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000">tp.Privileges[</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">].Luid); <br /></span> <span style="COLOR: #008080"> 23</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />       tp.Privileges[</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">].Attributes </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> SE_PRIVILEGE_ENABLED; <br /></span> <span style="COLOR: #008080"> 24</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />       AdjustTokenPrivileges(hToken, FALSE, </span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000">tp, </span> <span style="COLOR: #0000ff">sizeof</span> <span style="COLOR: #000000">(tp), NULL, NULL); <br /></span> <span style="COLOR: #008080"> 25</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />       fOk </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (GetLastError() </span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000"> ERROR_SUCCESS); <br /></span> <span style="COLOR: #008080"> 26</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />       CloseHandle(hToken); <br /></span> <span style="COLOR: #008080"> 27</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /></span> <span style="COLOR: #008080"> 28</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> fOk; </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000">提升成功q回TRUEQ失败返回FALSE </span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080"> 29</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span> <span style="COLOR: #000000">}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 30</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 31</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">void</span> <span style="COLOR: #000000"> main()<br /></span> <span style="COLOR: #008080"> 32</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_810_984_Open_Image" onclick="this.style.display='none'; Codehighlighter1_810_984_Open_Text.style.display='none'; Codehighlighter1_810_984_Closed_Image.style.display='inline'; Codehighlighter1_810_984_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_810_984_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_810_984_Closed_Text.style.display='none'; Codehighlighter1_810_984_Open_Image.style.display='inline'; Codehighlighter1_810_984_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span> <span id="Codehighlighter1_810_984_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_810_984_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 33</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(EnableDebugPrivilege())<br /></span> <span style="COLOR: #008080"> 34</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_839_981_Open_Image" onclick="this.style.display='none'; Codehighlighter1_839_981_Open_Text.style.display='none'; Codehighlighter1_839_981_Closed_Image.style.display='inline'; Codehighlighter1_839_981_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_839_981_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_839_981_Closed_Text.style.display='none'; Codehighlighter1_839_981_Open_Image.style.display='inline'; Codehighlighter1_839_981_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span id="Codehighlighter1_839_981_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_839_981_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 35</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 调用原API函数</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080"> 36</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #000000">::MessageBox(NULL, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">原函?/span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Hook Api</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080"> 37</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 挂钩后再调用</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080"> 38</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #000000">SetHook(::GetModuleHandle(NULL));<br /></span> <span style="COLOR: #008080"> 39</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />::MessageBox(NULL, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">原函?/span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Hook Api</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080"> 40</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 41</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 42</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 43</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 44</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 用于替换MessageBoxA的自定义函数</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080"> 45</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff">int</span> <span style="COLOR: #000000"> WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)<br /></span> <span style="COLOR: #008080"> 46</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_1093_1179_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1093_1179_Open_Text.style.display='none'; Codehighlighter1_1093_1179_Closed_Image.style.display='inline'; Codehighlighter1_1093_1179_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_1093_1179_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1093_1179_Closed_Text.style.display='none'; Codehighlighter1_1093_1179_Open_Image.style.display='inline'; Codehighlighter1_1093_1179_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span> <span id="Codehighlighter1_1093_1179_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1093_1179_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 47</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> ((PFNMESSAGEBOX)g_orgProc)(hWnd, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Hook API Sucess!</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">OK</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">, uType);<br /></span> <span style="COLOR: #008080"> 48</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080"> 49</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 50</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 51</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/None.gif" align="top" />BOOL SetHook(HMODULE hMod)<br /></span> <span style="COLOR: #008080"> 52</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_1209_2470_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1209_2470_Open_Text.style.display='none'; Codehighlighter1_1209_2470_Closed_Image.style.display='inline'; Codehighlighter1_1209_2470_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /> <img id="Codehighlighter1_1209_2470_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1209_2470_Closed_Text.style.display='none'; Codehighlighter1_1209_2470_Open_Image.style.display='inline'; Codehighlighter1_1209_2470_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /> </span> <span id="Codehighlighter1_1209_2470_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1209_2470_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 53</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />IMAGE_DOS_HEADER</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> pDosHeader </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (IMAGE_DOS_HEADER</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)hMod;<br /></span> <span style="COLOR: #008080"> 54</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />IMAGE_OPTIONAL_HEADER </span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> pOptHeader </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 55</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />(IMAGE_OPTIONAL_HEADER </span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)((BYTE</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)hMod </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> pDosHeader</span> <span style="COLOR: #000000">-></span> <span style="COLOR: #000000">e_lfanew </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">24</span> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080"> 56</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 57</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />IMAGE_IMPORT_DESCRIPTOR</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> pImportDesc </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (IMAGE_IMPORT_DESCRIPTOR</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)<br /></span> <span style="COLOR: #008080"> 58</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />((BYTE</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)hMod </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> pOptHeader</span> <span style="COLOR: #000000">-></span> <span style="COLOR: #000000">DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);<br /></span> <span style="COLOR: #008080"> 59</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 60</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 在导入表中查找user32.dll模块。因为MessageBoxA函数从user32.dll模块导出</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080"> 61</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">(pImportDesc</span> <span style="COLOR: #000000">-></span> <span style="COLOR: #000000">FirstThunk)<br /></span> <span style="COLOR: #008080"> 62</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_1613_1747_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1613_1747_Open_Text.style.display='none'; Codehighlighter1_1613_1747_Closed_Image.style.display='inline'; Codehighlighter1_1613_1747_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_1613_1747_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1613_1747_Closed_Text.style.display='none'; Codehighlighter1_1613_1747_Open_Image.style.display='inline'; Codehighlighter1_1613_1747_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span id="Codehighlighter1_1613_1747_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1613_1747_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 63</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">char</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> pszDllName </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (</span> <span style="COLOR: #0000ff">char</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)((BYTE</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)hMod </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> pImportDesc</span> <span style="COLOR: #000000">-></span> <span style="COLOR: #000000">Name);<br /></span> <span style="COLOR: #008080"> 64</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(lstrcmpiA(pszDllName, </span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">user32.dll</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">) </span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">)<br /></span> <span style="COLOR: #008080"> 65</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_1721_1730_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1721_1730_Open_Text.style.display='none'; Codehighlighter1_1721_1730_Closed_Image.style.display='inline'; Codehighlighter1_1721_1730_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_1721_1730_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1721_1730_Closed_Text.style.display='none'; Codehighlighter1_1721_1730_Open_Image.style.display='inline'; Codehighlighter1_1721_1730_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span id="Codehighlighter1_1721_1730_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1721_1730_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 66</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">break</span> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080"> 67</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 68</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />pImportDesc</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080"> 69</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 70</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 71</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(pImportDesc</span> <span style="COLOR: #000000">-></span> <span style="COLOR: #000000">FirstThunk)<br /></span> <span style="COLOR: #008080"> 72</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_1778_2454_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1778_2454_Open_Text.style.display='none'; Codehighlighter1_1778_2454_Closed_Image.style.display='inline'; Codehighlighter1_1778_2454_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_1778_2454_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1778_2454_Closed_Text.style.display='none'; Codehighlighter1_1778_2454_Open_Image.style.display='inline'; Codehighlighter1_1778_2454_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span id="Codehighlighter1_1778_2454_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1778_2454_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 73</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> <br /> </span> <span style="COLOR: #008080"> 74</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 一个IMAGE_THUNK_DATA是一个双字,它指定了一个导入函?br /></span> <span style="COLOR: #008080"> 75</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 调入地址表其实是IMAGE_THUNK_DATAl构的数l,也就是DWORD数组</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080"> 76</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #000000">IMAGE_THUNK_DATA</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> pThunk </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (IMAGE_THUNK_DATA</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)<br /></span> <span style="COLOR: #008080"> 77</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />((BYTE</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)hMod </span> <span style="COLOR: #000000">+</span> <span style="COLOR: #000000"> pImportDesc</span> <span style="COLOR: #000000">-></span> <span style="COLOR: #000000">FirstThunk);<br /></span> <span style="COLOR: #008080"> 78</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">while</span> <span style="COLOR: #000000">(pThunk</span> <span style="COLOR: #000000">-></span> <span style="COLOR: #000000">u1.Function)<br /></span> <span style="COLOR: #008080"> 79</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_1979_2452_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1979_2452_Open_Text.style.display='none'; Codehighlighter1_1979_2452_Closed_Image.style.display='inline'; Codehighlighter1_1979_2452_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_1979_2452_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1979_2452_Closed_Text.style.display='none'; Codehighlighter1_1979_2452_Open_Image.style.display='inline'; Codehighlighter1_1979_2452_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span id="Codehighlighter1_1979_2452_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_1979_2452_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 80</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> lpAddr指向的内存保存了函数的地址</span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080"> 81</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #000000">DWORD</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> lpAddr </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (DWORD</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)</span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000">(pThunk</span> <span style="COLOR: #000000">-></span> <span style="COLOR: #000000">u1.Function);<br /></span> <span style="COLOR: #008080"> 82</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">lpAddr </span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000"> (DWORD)g_orgProc)<br /></span> <span style="COLOR: #008080"> 83</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_2084_2440_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2084_2440_Open_Text.style.display='none'; Codehighlighter1_2084_2440_Closed_Image.style.display='inline'; Codehighlighter1_2084_2440_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_2084_2440_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2084_2440_Closed_Text.style.display='none'; Codehighlighter1_2084_2440_Open_Image.style.display='inline'; Codehighlighter1_2084_2440_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span id="Codehighlighter1_2084_2440_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_2084_2440_Open_Text"> <span style="COLOR: #000000">{ <br /></span> <span style="COLOR: #008080"> 84</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />DWORD oldProc;<br /></span> <span style="COLOR: #008080"> 85</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />BOOL VirSu</span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000">VirtualProtect(lpAddr,</span> <span style="COLOR: #0000ff">sizeof</span> <span style="COLOR: #000000">(DWORD),PAGE_READWRITE,</span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000">oldProc);<br /></span> <span style="COLOR: #008080"> 86</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">if</span> <span style="COLOR: #000000">(VirSu</span> <span style="COLOR: #000000">==</span> <span style="COLOR: #000000">TRUE)<br /></span> <span style="COLOR: #008080"> 87</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_2191_2383_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2191_2383_Open_Text.style.display='none'; Codehighlighter1_2191_2383_Closed_Image.style.display='inline'; Codehighlighter1_2191_2383_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_2191_2383_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2191_2383_Closed_Text.style.display='none'; Codehighlighter1_2191_2383_Open_Image.style.display='inline'; Codehighlighter1_2191_2383_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span id="Codehighlighter1_2191_2383_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_2191_2383_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 88</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #008000">//</span> <span style="COLOR: #008000"> 修改IAT表项Q其指向我们自定义的函敎ͼ相当于?lpAddr = (DWORD)MyMessageBoxA;?/span> <span style="COLOR: #008000"> <br /> </span> <span style="COLOR: #008080"> 89</span> <span style="COLOR: #008000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #000000">DWORD</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000"> lpNewProc </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> (DWORD</span> <span style="COLOR: #000000">*</span> <span style="COLOR: #000000">)MyMessageBoxA;<br /></span> <span style="COLOR: #008080"> 90</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />::WriteProcessMemory(::GetCurrentProcess(), <br /></span> <span style="COLOR: #008080"> 91</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />lpAddr, </span> <span style="COLOR: #000000">&</span> <span style="COLOR: #000000">lpNewProc, </span> <span style="COLOR: #0000ff">sizeof</span> <span style="COLOR: #000000">(DWORD), NULL);<br /></span> <span style="COLOR: #008080"> 92</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 93</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">else</span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 94</span> <span style="COLOR: #000000"> <img id="Codehighlighter1_2390_2425_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2390_2425_Open_Text.style.display='none'; Codehighlighter1_2390_2425_Closed_Image.style.display='inline'; Codehighlighter1_2390_2425_Closed_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /> <img id="Codehighlighter1_2390_2425_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2390_2425_Closed_Text.style.display='none'; Codehighlighter1_2390_2425_Open_Image.style.display='inline'; Codehighlighter1_2390_2425_Open_Text.style.display='inline';" src="http://www.shnenglu.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /> </span> <span id="Codehighlighter1_2390_2425_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.shnenglu.com/images/dot.gif" /> </span> <span id="Codehighlighter1_2390_2425_Open_Text"> <span style="COLOR: #000000">{<br /></span> <span style="COLOR: #008080"> 95</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />MessageBox(NULL,</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">Error!</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">a</span> <span style="COLOR: #000000">"</span> <span style="COLOR: #000000">,</span> <span style="COLOR: #000000">0</span> <span style="COLOR: #000000">);<br /></span> <span style="COLOR: #008080"> 96</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 97</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> TRUE;<br /></span> <span style="COLOR: #008080"> 98</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080"> 99</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" />pThunk</span> <span style="COLOR: #000000">++</span> <span style="COLOR: #000000">;<br /></span> <span style="COLOR: #008080">100</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080">101</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> </span> <span style="COLOR: #008080">102</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/InBlock.gif" align="top" /> </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> FALSE;<br /></span> <span style="COLOR: #008080">103</span> <span style="COLOR: #000000"> <img src="http://www.shnenglu.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <p> </p> <p> </p> <p>有个郁闷的问题,?003sp1下,不管是提升进E权限还是修改内存包含属性都成功Qdebug版本能成功!release׃娘的M成功Q郁hQ遍寻高手无着落,暂时{着先。。?/p><img src ="http://www.shnenglu.com/lapcca/aggbug/124400.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lapcca/" target="_blank">阿π</a> 2010-08-23 13:15 <a href="http://www.shnenglu.com/lapcca/archive/2010/08/23/124400.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GINA.dll 各函Cl?/title><link>http://www.shnenglu.com/lapcca/archive/2010/06/18/118184.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Fri, 18 Jun 2010 09:58:00 GMT</pubDate><guid>http://www.shnenglu.com/lapcca/archive/2010/06/18/118184.html</guid><wfw:comment>http://www.shnenglu.com/lapcca/comments/118184.html</wfw:comment><comments>http://www.shnenglu.com/lapcca/archive/2010/06/18/118184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/lapcca/comments/commentRss/118184.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lapcca/services/trackbacks/118184.html</trackback:ping><description><![CDATA[首先介绍一下Winlogon。Windows 2000/NT有三U系l状态:没有用户d状态、用h功登录状态以及工作站锁定状态。Winlogon是Windows 2000/NT操作pȝ提供交互式登录支持的lg。Winlogon有三个组成部分:可执行文件winlogon.exeQ提供图形界面认证功能的动态库 Gina DllQ以及一些网l服务提供动态库Network Provider Dll?<br /><br />   <br /><br /><clk></clk>winlogon.exe处理一些下层导出的接口函数Q而认证策略是在Gina Dll中是<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">独立</nobr>?计的。在pȝ启动ӞGina Dll被winlogon.exe装蝲。Microsoft提供了一个默认的Gina Dll——Winnt\system32\msgina.dllQ提供了标准的用户名、密码认证模式。Gina Dll是可替换的,用户可以设计自己的Gina DllQ以提供其他如智能卡、视|膜、指UҎ其他一些认证机制?<br />开发自定义的Gina Dll。必d现ƈ导出与winlogon.exe交互?8个标准函数接口: <br />l BOOL WINAPI WlxNegotiate(DWORD dwWinLogonVersion, PDWORD pdwDllVersion) <br />// Winlogon.exe调用的gina dll中的W一个函?<br />// 使gina dll认是否支持当前版本的Winlogon.exe <br />// 传递给winlogon.exe需要那个版本的接口函数 <br />l BOOL WINAPI WlxInitialize(LPWSTR lpWinsta, <br />HANDLE hWlx, <br />PVOID pvReserved, <br />PVOID pWinlogonFunctions, <br />PVOID * pWlxContext <br />) <br />// 初始化,winlogon.exe向gina dll传递需要版本的接口函数分配?<br />l BOOL WINAPI WlxActivateUserShell(PVOID pWlxContext, <br />PWSTR pszDesktopName, <br />PWSTR pszMprLogonScript, <br />PVOID pEnvironment) <br />// 用户登陆成功后,Winlogon.exe调用该函数启动用户外壳程?<br />l VOID WINAPI WlxDisplayLockedNotice(PVOID pWlxContext) <br />// 当系l处于锁定状态时QWinlogon.exe调用该函?<br />// 昄一些信息,如锁定者、锁定时间等 <br />l VOID WINAPI WlxDisplaySASNotice(PVOID pWlxContext) <br />// 当没有Q何用L陆时QWinlogon.exe调用该函数显CZ些提CZ?<br />// 可以Ҏ用户的动作模拟SAS事g的发?<br />l BOOL WINAPI WlxDisplayStatusMessage(PVOID pWlxContext, <br />HDESK hDesktop, <br />DWORD dwOptions, <br />PWSTR pTitle, <br />PWSTR pMessage) <br />// 当gina dll要显CZ些信息时QWinlogon.exe调用该函?<br />// 直接q回TRUE表示信息已经昄 <br />l BOOL WINAPI WlxGetStatusMessage(PVOID pWlxContext, <br />DWORD *pdwOptions, <br />PWSTR pMessage, <br />DWORD dwBufferSize) <br />// Winlogon.exe调用该函数得到gina dll昄的状态信?<br />// 直接q回TRUE表示信息已经接收 <br />l BOOL WINAPI WlxIsLockOk(PVOID pWlxContext) <br />// 在试N定工作站之前Winlogon.exe调用该函敎ͼ判断是否可以锁定 <br />// 直接q回FALSE表示不能锁定 <br />l BOOL WINAPI WlxIsLogoffOk(PVOID pWlxContext) <br />// 在试图注销时Winlogon.exe调用该函敎ͼ判断能否注销 <br />// 直接q回FALSE表示不能注销 <br />l int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, <br />DWORD dwSasType, <br />PVOID pReserved) <br />// 当系l处于登陆成功,没有锁定的状态下 <br />// Winlogon接收到SAS事gQ于是调用该函数 <br />// 现屏蔽所有事Ӟ直接q回 <br />l int WINAPI WlxLoggedOutSAS(PVOID pWlxContext, <br />DWORD dwSasType, <br />PLUID pAuthenticationId, <br />PSID pLogonSid, <br />PDWORD pdwOptions, <br />PHANDLE phToken, <br />PWLX_MPR_NOTIFY_INFO pMprNotifyInfo, <br />PVOID * pProfile) <br />// 在没有Q何一个用L陆的情况下,Winlogon.exe接收到SAS事g?/用该函数 <br />l VOID WINAPI WlxLogoff(PVOID pWlxContext) <br />// Winlogon.exe调用该函敎ͼ通知gina dll用户注销操作 <br />// 允许gina dll做出相应的处?<br />l BOOL WINAPI WlxNetworkProviderLoad(PVOID pWlxContext, <br />PWLX_MPR_NOTIFY_INFO pNprNotifyInfo) <br />// Winlogon.exe调用该函数收集有效的认证信息 <br />// q回TRUE表示用户被识?<br />l BOOL WINAPI WlxRemoveStatusMessage(PVOID pWlxContext) <br />// Winlogon.exe调用该函敎ͼ告诉gina dll停止昄状态信?<br />// 直接q回TRUE表示信息已经删除 <br />l BOOL WINAPI WlxScreenSaverNotify(PVOID pWlxContext, BOOL *pSecure) <br />// 在屏保程序启动前一瞬Winlogon.exe调用该函敎ͼ允许gina dll同屏 <br />//保程序交?<br />// q回FALSE表示屏保E序不能启动 <br />l VOID WINAPI WlxShutdown(PVOID pWlxContext, DWORD ShutdownType) <br />// 在系l关闭之前,Winlogon.exe调用该函?<br />// 允许gina dll处理一些系l关闭前的处?<br />l BOOL WINAPI WlxStartApplication(PVOID pWlxContext, <br />PWSTR pszDesktopName, <br />PVOID pEnvironment, <br />PWSTR pszCmdLine) <br />// 当系l要求在用户上下文中启动E序QWinlogon.exe调用该函?<br />// q种情况发生在:览器非正常关闭需要重启或需要启动扩展的d// 理?<br />// 该接口gina dll可以选择性实?<br />l int WINAPI WlxWkstaLockedSAS(PVOID pWlxContext, DWORD dwSasType) <br />// 在锁定状态下QWinlogon.exe接收到SAS事g调用该函?<br /><br />其中WlxNegotiate是winlogon.exe调用的第一个接口函敎ͼq行必要的版本判断,随后调用的是WlxInitializeQ主要完?winlogon.exe特定版本的函数分z表向Gina Dll的传递。最主要的是WlxLoggedOnSAS函数Q这个函C要的功能是,当winlogon在登录成功状态下Q接收到SAS事gQ于是调用这 个函数进行SAS事g的识别以及进行各事g的相应处理?<br /><clk></clk>׃现在只需屏蔽按下Ctrl+Alt+Del时系l不再弹出“Widows<nobr style="COLOR: rgb(102,0,255); BORDER-BOTTOM: rgb(102,0,255) 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" target="_blank">安全</nobr>”对话框。ƈ不需要改变用户名、密码这U标准的认证模式Q所以可以仍然用msgina.dll中导出的函数接口Q而对WlxLoggedOnSAS函数的实现进行必要的改变?<br />int WINAPI WlxLoggedOnSAS(PVOID pWlxContext, <br />DWORD dwSasType, <br />PVOID pReserved) <br />{ <br />if(bLock) //如果处于锁定状态,现屏蔽所有事Ӟ直接q回 <br />return WLX_SAS_ACTION_NONE; <br />else <br />return theApp.MyWlxLoggedOnSAS(pWlxContext, dwSasType, pReserved); <br />//MyWlxLoggedOnSAS为默认gina dll(msgina dll)中的WlxLoggedOnSAS <br />} <br />自定义Gina Dll的用。比如开发的Gina Dll文g名ؓMyGina.dll。将该文件放C下\径:Winnt\system32。ƈ修改注册表,如下Q?<br />Key Name: \HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ Winlogon <br />Value Name: GinaDLL <br />Value Type: [REG_SZ] <br />Value: MyGina.dll <br />重新启动计算机MyGina.dllx入用?img src ="http://www.shnenglu.com/lapcca/aggbug/118184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lapcca/" target="_blank">阿π</a> 2010-06-18 17:58 <a href="http://www.shnenglu.com/lapcca/archive/2010/06/18/118184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堆和栈的区别http://www.shnenglu.com/lapcca/archive/2010/06/10/117528.html阿π阿πThu, 10 Jun 2010 01:38:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/06/10/117528.htmlhttp://www.shnenglu.com/lapcca/comments/117528.htmlhttp://www.shnenglu.com/lapcca/archive/2010/06/10/117528.html#Feedback0http://www.shnenglu.com/lapcca/comments/commentRss/117528.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/117528.html一、预备知识—程序的内存分配 
  一个由C/C++~译的程序占用的内存分ؓ以下几个部分 
  1、栈区(stackQ— ?q译器自动分配释放   Q存攑և数的参数|局部变量的值等。其 
  操作方式cM于数据结构中的栈。?
  2、堆区(heapQ ?— ?一般由E序员分配释放,   若程序员不释放,E序l束时可能由OS回?
  收 ?。注意它与数据结构中的堆是两回事Q分配方式倒是cM于链表,呵呵。?
  3、全局区(静态区Q(staticQ—,全局变量和静态变量的存储是放在一块的Q初始化的?
  全局变量和静态变量在一块区域,   未初始化的全局变量和未初始化的静态变量在盔R的另 
  一块区域。 ?-   E序l束后由pȝ释放。?
  4、文字常量区   —常量字W串是攑֜q里的。 ?E序l束后由pȝ释放 
  5、程序代码区—存攑ևC的二q制代码。?
  
  
  二、例子程序  ?
  q是一个前辈写的,非常详细   
  //main.cpp   
  int   a   =   0;   全局初始化区   
  char   *p1;   全局未初始化区  ?
  main()   
  {   
  int   b;   栈  ?
  char   s[]   =   "abc";   栈  ?
  char   *p2;   栈  ?
  char   *p3   =   "123456";   123456\0在常量区Qp3在栈上。  ?
  static   int   c   =0Q ?全局Q静态)初始化区   
  p1   =   (char   *)malloc(10);   
  p2   =   (char   *)malloc(20);   
  分配得来?0?0字节的区域就在堆区。  ?
  strcpy(p1,   "123456");   123456\0攑֜帔R区,~译器可能会它与p3所指向?123456" 
  优化成一个地斏V  ?
  }   
  
  
  二、堆和栈的理论知识  ?
  2.1甌方式   
  stack:   
  ql自动分配。 ?例如Q声明在函数中一个局部变量 ?int   b;   pȝ自动在栈中ؓb开辟空 
  闾b ?
  heap:   
  需要程序员自己甌Qƈ指明大小Q在c中malloc函数   
  如p1   =   (char   *)malloc(10);   
  在C++中用newq算W  ?
  如p2   =   new   char[10];   
  但是注意p1、p2本n是在栈中的。  ?
  
  
  2.2   
  甌后系l的响应   
  栈:只要栈的剩余I间大于所甌I间Q系l将为程序提供内存,否则报异常提示栈溢 
  出。  ?
  堆:首先应该知道操作pȝ有一个记录空闲内存地址的链表,当系l收到程序的甌Ӟ 
  会遍历该链表Q寻扄一个空间大于所甌I间的堆l点Q然后将该结点从I闲l点链表 
  中删除,q将该结点的I间分配l程序,另外Q对于大多数pȝQ会在这块内存空间中的?
  首地址处记录本ơ分配的大小Q这P代码中的delete语句才能正确的释放本内存I间。?
  另外Q由于找到的堆结点的大小不一定正好等于申L大小Q系l会自动的将多余的那部?
  分重新放入空闲链表中。  ?
  
  2.3甌大小的限制  ?
  栈:在Windows?栈是向低地址扩展的数据结构,是一块连l的内存的区域。这句话的意 
  思是栈顶的地址和栈的最大容量是pȝ预先规定好的Q在WINDOWS下,栈的大小?MQ也有?
  的说?MQM是一个编译时q定的常数Q,如果甌的空间超q栈的剩余空间时Q将 
  提示overflow。因此,能从栈获得的I间较小。  ?
  堆:堆是向高地址扩展的数据结构,是不q箋的内存区域。这是由于系l是用链表来存储 
  的空闲内存地址的,自然是不q箋的,而链表的遍历方向是由低地址向高地址。堆的大?
  受限于计机pȝ中有效的虚拟内存。由此可见,堆获得的I间比较灉|Q也比较大。  ?
  
  
  
  2.4甌效率的比较:   
  栈由pȝ自动分配Q速度较快。但E序员是无法控制的。  ?
  堆是由new分配的内存,一般速度比较慢,而且Ҏ产生内存片,不过用v来最方便.   
  另外Q在WINDOWS下,最好的方式是用VirtualAlloc分配内存Q他不是在堆Q也不是在栈是?
  直接在进E的地址I间中保留一块内存,虽然用v来最不方ѝ但是速度快,也最灉|。?
    
  
  2.5堆和栈中的存储内容  ?
  栈:   在函数调用时Q第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可 
  执行语句Q的地址Q然后是函数的各个参敎ͼ在大多数的C~译器中Q参数是由右往左入栈?
  的,然后是函C的局部变量。注意静态变量是不入栈的。  ?
  当本ơ函数调用结束后Q局部变量先出栈Q然后是参数Q最后栈指针指向最开始存的地 
  址Q也是dC的下一条指令,E序p点l运行。  ?
  堆:一般是在堆的头部用一个字节存攑֠的大。堆中的具体内容q序员安排。  ?
  
  2.6存取效率的比较  ?
  
  char   s1[]   =   "aaaaaaaaaaaaaaa";   
  char   *s2   =   "bbbbbbbbbbbbbbbbb";   
  aaaaaaaaaaa是在q行时刻赋值的Q  ?
  而bbbbbbbbbbb是在~译时就定的;   
  但是Q在以后的存取中Q在栈上的数l比指针所指向的字W串(例如?快。  ?
  比如Q  ?
  #include   
  void   main()   
  {   
  char   a   =   1;   
  char   c[]   =   "1234567890";   
  char   *p   ="1234567890";   
  a   =   c[1];   
  a   =   p[1];   
  return;   
  }   
  对应的汇~代码  ?
  10:   a   =   c[1];   
  00401067   8A   4D   F1   mov   cl,byte   ptr   [ebp-0Fh]   
  0040106A   88   4D   FC   mov   byte   ptr   [ebp-4],cl   
  11:   a   =   p[1];   
  0040106D   8B   55   EC   mov   edx,dword   ptr   [ebp-14h]   
  00401070   8A   42   01   mov   al,byte   ptr   [edx+1]   
  00401073   88   45   FC   mov   byte   ptr   [ebp-4],al   
  W一U在d时直接就把字W串中的元素d寄存器cl中,而第二种则要先把指针D刊W?
  edx中,再根据edxd字符Q显然慢了。  ?
  
  
  2.7结Q  ?
  堆和栈的区别可以用如下的比喻来看出:   
  使用栈就象我们去饭馆里吃饭,只管点菜Q发出申P、付钱、和吃(使用Q,吃饱了就 
  赎ͼ不必理会切菜、洗菜等准备工作和洗、刷锅等扫尾工作Q他的好处是快捷Q但是自 
  由度。  ?
  使用堆就象是自己动手做喜Ƣ吃的菜_比较ȝQ但是比较符合自q口味Q而且自由 
  度大。 ?(l典Q? 


 


在bbs上,堆与栈的区分问题Q似乎是一个永恒的话题Q由此可见,初学者对此往往是؜淆不清的Q所以我军_拿他W一个开刀?br />      首先Q我们D一个例子:
      void f() { int* p=new int[5]; }
      q条短短的一句话包含了堆与栈,看到newQ我们首先就应该惛_Q我们分配了一块堆内存Q那么指针p呢?他分配的是一块栈内存Q所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在E序会先定在堆中分配内存的大小Q然后调用operator new分配内存Q然后返回这块内存的首地址Q放入栈中,他在VC6下的汇编代码如下Q?br />      00401028     push          14h
      0040102A     call          operator new (00401060)
      0040102F     add           esp,4
      00401032     mov           dword ptr [ebp-8],eax
      00401035     mov           eax,dword ptr [ebp-8]
      00401038     mov           dword ptr [ebp-4],eax
      q里Q我们ؓ了简单ƈ没有释放内存Q那么该怎么去释攑֑Q是delete p么?澻I错了Q应该是delete []pQ这是ؓ了告诉编译器Q我删除的是一个数l,VC6׃Ҏ相应的Cookie信息去进行释攑ֆ存的工作?br />      好了Q我们回到我们的主题Q堆和栈I竟有什么区别?
      主要的区别由以下几点Q?br />      1、管理方式不同;
      2、空间大不同;
      3、能否生碎片不同;
      4、生长方向不同;
      5、分配方式不同;
      6、分配效率不同;
      理方式Q对于栈来讲Q是q译器自动理Q无需我们手工控制Q对于堆来说Q释攑ַ作由E序员控ӞҎ产生memory leak?br />      I间大小Q一般来讲在32位系l下Q堆内存可以辑ֈ4G的空_从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲Q一般都是有一定的I间大小的,例如Q在VC6下面Q默认的栈空间大是1MQ好像是Q记不清楚了Q。当Ӟ我们可以修改Q   ?br />      打开工程Q依ơ操作菜单如下:Project->Setting->LinkQ在Category 中选中OutputQ然后在Reserve中设定堆栈的最大值和commit?br />注意Qreserve最gؓ4ByteQcommit是保留在虚拟内存的页文g里面Q它讄的较大会使栈开辟较大的|可能增加内存的开销和启动时间?br />      片问题Q对于堆来讲Q频J的new/delete势必会造成内存I间的不q箋Q从而造成大量的碎片,使程序效率降低。对于栈来讲Q则不会存在q个问题Q因为栈是先q后出的队列Q他们是如此的一一对应Q以至于永远都不可能有一个内存块从栈中间弹出Q在他弹Z前,在他上面的后q的栈内容已l被弹出Q详l的可以参考数据结构,q里我们׃再一一讨论了?br />      生长方向Q对于堆来讲Q生长方向是向上的,也就是向着内存地址增加的方向;对于栈来Ԍ它的生长方向是向下的Q是向着内存地址减小的方向增ѝ?br />      分配方式Q堆都是动态分配的Q没有静态分配的堆。栈?U分配方式:静态分配和动态分配。静态分配是~译器完成的Q比如局部变量的分配。动态分配由alloca函数q行分配Q但是栈的动态分配和堆是不同的,他的动态分配是q译器q行释放Q无需我们手工实现?br />      分配效率Q栈是机器系l提供的数据l构Q计机会在底层Ҏ提供支持Q分配专门的寄存器存放栈的地址Q压栈出栈都有专门的指o执行Q这决定了栈的效率比较高。堆则是C/C++函数库提供的Q它的机制是很复杂的Q例如ؓ了分配一块内存,库函C按照一定的法Q具体的法可以参考数据结?操作pȝQ在堆内存中搜烦可用的够大的I间Q如果没有够大的I间Q可能是׃内存片太多Q,有可能调用pȝ功能d加程序数据段的内存空_q样有Z分到_大小的内存,然后q行q回。显Ӟ堆的效率比栈要低得多?br />      从这里我们可以看刎ͼ堆和栈相比,׃大量new/delete的用,Ҏ造成大量的内存碎片;׃没有专门的系l支持,效率很低Q由于可能引发用h和核心态的切换Q内存的甌Q代价变得更加昂c所以栈在程序中是应用最q泛的,q是函数的调用也利用栈d成,函数调用q程中的参数Q返回地址QEBP和局部变量都采用栈的方式存放。所以,我们推荐大家量用栈Q而不是用堆?br />      虽然栈有如此众多的好处,但是׃和堆相比不是那么灉|Q有时候分配大量的内存I间Q还是用堆好一些?br />      无论是堆q是栈,都要防止界现象的发生(除非你是故意使其界Q,因ؓ界的结果要么是E序崩溃Q要么是摧毁E序的堆、栈l构Q生以想不到的l果,q是在你的E序q行q程中,没有发生上面的问题,你还是要心Q说不定什么时候就崩掉Q那时候debug可是相当困难的:Q?br />      对了Q还有一件事Q如果有人把堆栈合v来说Q那它的意思是栈,可不是堆Q呵呵,清楚了?


阿π 2010-06-10 09:38 发表评论
]]>
q程间通信http://www.shnenglu.com/lapcca/archive/2010/06/10/117526.html阿π阿πThu, 10 Jun 2010 01:27:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/06/10/117526.htmlhttp://www.shnenglu.com/lapcca/comments/117526.htmlhttp://www.shnenglu.com/lapcca/archive/2010/06/10/117526.html#Feedback0http://www.shnenglu.com/lapcca/comments/commentRss/117526.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/117526.html ??随着Z对应用程序的要求来高Q单q程应用在许多场合已不能满Z的要求。编写多q程/多线E程序成为现代程序设计的一个重要特点,在多q程E序设计中,q程间的通信是不可避免的。Microsoft Win32 API提供了多U进E间通信的方法,全面地阐qCq些Ҏ的特点,q加以比较和分析Q希望能l读者选择通信Ҏ提供参考?/font>


1 q程与进E通信

  q程是装入内存ƈ准备执行的程序,每个q程都有U有的虚拟地址I间Q由代码、数据以及它可利用的pȝ资源(如文件、管道等)l成。多q程/多线E是Windows操作pȝ的一个基本特征。Microsoft Win32应用~程接口(Application Programming Interface, API)提供了大量支持应用程序间数据׃n和交换的机制Q这些机制行使的zdUCؓq程间通信(InterProcess Communication, IPC)Q进E通信是指不同进E间q行数据׃n和数据交换?br />  正因Z用Win32 APIq行q程通信方式有多U,如何选择恰当的通信方式成为应用开发中的一个重要问题,下面本文对Win32中进E通信的几U方法加以分析和比较?

2 q程通信Ҏ

2.1 文g映射
  文g映射(Memory-Mapped Files)能ɘq程把文件内容当作进E地址区间一块内存那h对待。因此,q程不必使用文gI/O操作Q只需单的指针操作可d和修Ҏ件的内容?br />  Win32 API允许多个q程讉K同一文g映射对象Q各个进E在它自q地址I间里接收内存的指针。通过使用q些指针Q不同进E就可以L修改文g的内容,实现了对文g中数据的׃n?br />  应用E序有三U方法来使多个进E共享一个文件映对象?br />  (1)l承Q第一个进E徏立文件映对象,它的子进E承该对象的句柄?br />  (2)命名文g映射Q第一个进E在建立文g映射对象时可以给该对象指定一个名?可与文g名不?。第二个q程可通过q个名字打开此文件映对象。另外,W一个进E也可以通过一些其它IPC机制(有名道、邮件槽{?把名字传l第二个q程?br />  (3)句柄复制Q第一个进E徏立文件映对象,然后通过其它IPC机制(有名道、邮件槽{?把对象句柄传递给W二个进E。第二个q程复制该句柄就取得对该文g映射对象的访问权限?br />  文g映射是在多个q程间共享数据的非常有效ҎQ有较好的安全性。但文g映射只能用于本地机器的进E之_不能用于|络中,而开发者还必须控制q程间的同步?br />2.2 ׃n内存
  Win32 API中共享内?Shared Memory)实际是文g映射的一U特D情c进E在创徏文g映射对象时用0xFFFFFFFF来代替文件句?HANDLE)Q就表示了对应的文g映射对象是从操作pȝ面文g讉K内存Q其它进E打开该文件映对象就可以讉K该内存块。由于共享内存是用文件映实现的Q所以它也有较好的安全性,也只能运行于同一计算Z的进E之间?br />2.3 匿名道
  道(Pipe)是一U具有两个端点的通信通道Q有一端句柄的q程可以和有另一端句柄的q程通信。管道可以是单向Q一端是只读的,另一端点是只写的Q也可以是双向的一道的两端点既可M可写?br />  匿名道(Anonymous Pipe)?在父q程和子q程之间Q或同一父进E的两个子进E之间传输数据的无名字的单向道。通常qq程创徏道Q然后由要通信的子q程l承通道的读端点句柄或写 端点句柄Q然后实现通信。父q程q可以徏立两个或更多个承匿名管道读和写句柄的子q程。这些子q程可以使用道直接通信Q不需要通过父进E?br />  匿名道是单Z实现子进E标准I/O重定向的有效ҎQ它不能在网上用,也不能用于两个不相关的进E之间?br />2.4 命名道
  命名道(Named Pipe)是服务器q程和一个或多个客户q程之间通信的单向或双向道。不同于匿名道的是命名道可以在不相关的进E之间和不同计算Z间用,服务器徏立命名管道时l它指定一个名字,Mq程都可以通过该名字打开道的另一端,Ҏl定的权限和服务器进E通信?br />  命名道提供了相对简单的~程接口Q通过|络传输数据q不比同一计算Z两进E之间通信更困难,不过如果要同时和多个q程通信它就力不从心了?br />2.5 邮g?br />  邮g?Mailslots)?供进E间单向通信能力QQ何进E都能徏立邮件槽成ؓ邮g槽服务器。其它进E,UCؓ邮g槽客P可以通过邮g槽的名字l邮件槽服务器进E发送消息。进来的?息一直放在邮件槽中,直到服务器进E读取它为止。一个进E既可以是邮件槽服务器也可以是邮件槽客户Q因此可建立多个邮g槽实现进E间的双向通信?br />  通过邮g槽可以给本地计算Z的邮件槽、其它计机上的邮g槽或指定|络区域中所有计机上有同样名字的邮件槽发送消息。广播通信的消息长度不能超q?00字节Q非q播消息的长度则受邮件槽服务器指定的最大消息长度的限制?br />  邮g槽与命名道怼Q不q它传输数据是通过不可靠的数据?如TCP/IP协议中的UDP?完成的,一旦网l发生错误则无法保证消息正确地接Ӟ而命名管道传输数据则是徏立在可靠q接基础上的。不q邮件槽有简化的~程接口和给指定|络区域内的所有计机q播消息的能力,所以邮件槽不失为应用程序发送和接收消息的另一U选择?br />2.6 剪脓?br />  剪脓?Clipped Board)实质是Win32 API中一l用来传输数据的函数和消息,为Windows应用E序之间q行数据׃n提供了一个中介,Windows已徏立的剪切(复制)Q粘贴的机制Z同应用程序之间共享不同格式数据提供了一条捷径。当用户在应用程序中执行剪切或复制操作时Q应用程序把选取的数据用一U或多种格式攑֜剪脓板上。然后Q何其它应用程序都可以从剪贴板上拾取数据,从给定格式中选择适合自己的格式?br />  剪脓板是一个非常松散的交换媒介Q可以支持Q何数据格式,每一格式׃无符h数标识,Ҏ?预定?剪脓板格式,该值是Win32 API定义的常量;寚w标准格式可以使用Register Clipboard Format函数注册为新的剪贴板格式。利用剪贴板q行交换的数据只需在数据格式上一致或都可以{化ؓ某种格式p。但剪脓板只能在ZWindows的程序中使用Q不能在|络上用?br />2.7 动态数据交?br />  动态数据交?DDE)是用共享内存在应用E序之间q行数据交换的一U进E间通信形式。应用程序可以用DDEq行一ơ性数据传输,也可以当出现新数据时Q通过发送更新值在应用E序间动态交换数据?br />  DDE和剪贴板一h支持标准数据格式(如文本、位囄)Q又可以支持自己定义的数据格式。但它们的数据传输机制却不同Q一个明昑֌别是剪脓板操作几乎L用作对用h定操作的一ơ性应{-如从菜单中选择Paste命o。尽DDE也可以由用户启动Q但它l发挥作用一般不必用戯一步干预。DDE有三U数据交换方式:
  (1) 冷链Q数据交换是一ơ性数据传输,与剪贴板相同?br />  (2) 温链Q当数据交换时服务器通知客户Q然后客户必请求新的数据?br />  (3) 热链Q当数据交换时服务器自动l客户发送数据?br />  DDE交换可以发生在单机或|络中不同计机的应用程序之间。开发者还可以定义定制的DDE数据格式q行应用E序之间特别目的IPCQ它们有更紧密耦合的通信要求。大多数ZWindows的应用程序都支持DDE?br />2.8 对象q接与嵌?br />  应用E序利用对象q接与嵌?OLE)技术管理复合文?由多U数据格式组成的文档)QOLE提供使某应用E序更容易调用其它应用程序进行数据编辑的服务。例如,OLE支持的字处理器可以嵌套电子表|当用戯~辑电子表格时OLE库可自动启动电子表格~辑器。当用户退出电子表格编辑器Ӟ该表格已在原始字处理器文档中得到更新。在q里电子表格~辑器变成了字处理器的扩展,而如果用DDEQ用戯昑ּ地启动电子表格编辑器?br />  同DDE技术相同,大多数基于Windows的应用程序都支持OLE技术?br />2.9 动态连接库
  Win32动态连接库(DLL)中的全局数据可以被调用DLL的所有进E共享,q就又给q程间通信开辟了一条新的途径Q当然访问时要注意同步问题?br />  虽然可以通过DLLq行q程间数据共享,但从数据安全的角度考虑Q我们ƈ不提倡这U方法,使用带有讉K权限控制的共享内存的Ҏ更好一些?br />2.10 q程q程调用
  Win32 API提供的远E过E调?RPC)使应用程序可以用远E调用函敎ͼq在网l上用RPCq行q程通信像函数调用那样单。RPC既可以在单机不同q程间用也可以在网l中使用?br />  ׃Win32 API提供的RPC服从OSF-DCE(Open Software Foundation Distributed Computing Environment)标准。所以通过Win32 API~写的RPC应用E序能与其它操作pȝ上支持DEC的RPC应用E序通信。用RPC开发者可以徏立高性能、紧密耦合的分布式应用E序?br />2.11 NetBios函数
  Win32 API提供NetBios函数用于处理低|络控制Q这主要是ؓIBM NetBiospȝ~写与Windows的接口。除非那些有Ҏ低|络功能要求的应用程序,其它应用E序最好不要用NetBios函数来进行进E间通信?br />2.12 Sockets
  Windows Sockets规范是以U.C.Berkeley大学BSD UNIX中流行的Socket接口例定义的一套Windows下的|络~程接口。除了Berkeley Socket原有的库函数以外Q还扩展了一l针对Windows的函敎ͼ使程序员可以充分利用Windows的消息机制进行编E?br />  现在通过Sockets实现q程通信的网l应用越来越多,q主要的原因是Sockets的跨q_性要比其它IPC机制好得多,另外WinSock 2.0不仅支持TCP/IP协议Q而且q支持其它协?如IPX)。Sockets的唯一~点是它支持的是底层通信操作Q这使得在单机的q程间进行简单数据传递不太方便,q时使用下面介l的WM_COPYDATA消息更合适些?br />2.13 WM_COPYDATA消息
  WM_COPYDATA是一U非常强大却鲜ؓ人知的消息。当一个应用向另一个应用传送数据时Q发送方只需使用调用SendMessage函数Q参数是目的H口的句柄、传递数据的起始地址、WM_COPYDATA消息。接收方只需像处理其它消息那样处理WM_COPY DATA消息Q这h发双方就实现了数据共享?br />  WM_COPYDATA是一U非常简单的ҎQ它在底层实际上是通过文g映射来实现的。它的缺Ҏ灉|性不高,q且它只能用于Windowsq_的单机环境下?

 



阿π 2010-06-10 09:27 发表评论
]]>
关于破解photoshop cs4的自动联|检序列号问题http://www.shnenglu.com/lapcca/archive/2010/05/26/116353.html阿π阿πWed, 26 May 2010 01:16:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/05/26/116353.htmlhttp://www.shnenglu.com/lapcca/comments/116353.htmlhttp://www.shnenglu.com/lapcca/archive/2010/05/26/116353.html#Feedback0http://www.shnenglu.com/lapcca/comments/commentRss/116353.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/116353.htmlq款软g以前l常用,现在用flash居多?/p>

 说实话买正版的的也没有那么多钱Q今天才开始用photoshop的最新版本?/wbr>

在网上搜了几个序列号Q安装的时候能安装但是当你再次启动软g的时候,他就已经和adob官网q行了连接自动检,可想而知Q序列号无效了?/p>

   想用最新版怎么办,破解吧,在网上找C好多U方法,什么关闭防火墙的cs4的联|,不过q个Ҏ没有成功Q可能是我的Ҏ不对。不q下面的Ҏ很实用?/wbr>

  因ؓ官方的Y件权威性比较高所以要安装官方的不q超?00多兆。破解吧。也是借用别h的方法?/wbr>


破解Ҏ 

 用. 本h亲n试过?br />以下为摘抄内?

序列P
1330-1082-3503-2270-3738-6738
1330-1776-8671-6289-7706-2916
1330-1567-6599-8775-4155-3745

l对能用Q!Q!

W一步:下蝲完YӞ要先解压出来?/p>

W二步:安装Q到了输入注册码界面Ӟ选试?0天的选项Q不要输入注册码。安装界面是全中文的Q安装完软g是英文的?/p>

W三步:打开软gQ会跛_输入注册码界面,使用上面的注册码Q输入,点下一步,qY件?/p>

W四步:先退YӞ扑ֈC:\WINDOWS\system32\drivers\etc里面的hosts文g,L其只ȝ属性,双击打开Q选用C本打开Q?/p>

输入127.0.0.1 activate.adobe.comQ中间有个空|Q保存,退? 屏蔽adobeȀzL务器?br />q不攑ֿQ将下面全部|址dq去.

下列网址加入HOSt
127.0.0.1 activate.adobe.com
127.0.0.1 practivate.adobe.com
127.0.0.1 ereg.adobe.com
127.0.0.1 activate.wip3.adobe.com
127.0.0.1 wip3.adobe.com
127.0.0.1 3dns-3.adobe.com
127.0.0.1 3dns-2.adobe.com
127.0.0.1 adobe-dns.adobe.com
127.0.0.1 adobe-dns-2.adobe.com
127.0.0.1 adobe-dns-3.adobe.com
127.0.0.1 ereg.wip3.adobe.com
127.0.0.1 activate-sea.adobe.com
127.0.0.1 wwis-dubc1-vip60.adobe.com
127.0.0.1 activate-sjc0.adobe.com
W五步:再打开软gQok。(若不q行W四步,再启动Y件时Q又会蟩出激zȝ面)?/p>

q个主要是ؓ了屏蔽Y件与官方服务器连接的啊,如果软g惌接的话就让它不要q接官方了,q接本机可以了。避免再ơ出现激zȝ面的啊?/p>

再依ơ打开 H口->扩展功能->q接->三角Ş q接及脱机选项讄不连接网l?/p>

阿π 2010-05-26 09:16 发表评论
]]>
VC++的Unicode~程[转]http://www.shnenglu.com/lapcca/archive/2010/05/06/114684.html阿π阿πThu, 06 May 2010 09:30:00 GMThttp://www.shnenglu.com/lapcca/archive/2010/05/06/114684.htmlhttp://www.shnenglu.com/lapcca/comments/114684.htmlhttp://www.shnenglu.com/lapcca/archive/2010/05/06/114684.html#Feedback0http://www.shnenglu.com/lapcca/comments/commentRss/114684.htmlhttp://www.shnenglu.com/lapcca/services/trackbacks/114684.html
作者:韩耀?

下蝲源代?/a>

一、什么是Unicode

  先从ASCII说vQASCII是用来表C文字W的一U编码规范。每个ASCII字符占用1个字节,因此QASCII~码可以表示的最大字W数?55Q?0H—FFHQ。其实,英文字符q没有那么多Q一般只用前128个(00H?FHQ最高位?Q,其中包括了控制字W、数字、大写字母和其它一些符受而最高位?的另128个字W(80H—FFHQ被UCؓ“扩展ASCII”,一般用来存放英文的制表W、部分音标字W等{的一些其它符受?br />  q种字符~码规则昄用来处理英文没有什么问题。但是面对中文、阿拉伯文等复杂的文字,255个字W显然不够用?br />于是Q各个国家纷U制定了自己的文字编码规范,其中中文的文字编码规范叫做“GB2312?0”,它是和ASCII兼容的一U编码规范,其实是利用扩展ASCII没有真正标准化这一点,把一个中文字W用两个扩展ASCII字符来表C,以区分ASCII码部分?br />  但是q个Ҏ有问题,最大的问题是中文的文字编码和扩展ASCII码有重叠。而很多Y件利用扩展ASCII码的英文制表W来画表|q样的Y件用C文系l中Q这些表格就会被误认作中文字W,出现q?br />  另外Q由于各国和各地区都有自q文字~码规则Q它们互相冲H,q给各国和各地区交换信息带来了很大的ȝ?br />要真正解册个问题,不能从扩展ASCII的角度入手,而必L一个全新的~码pȝQ这个系l要可以中文、法文、d文……等{所有的文字l一h考虑Qؓ每一个文字都分配一个单独的~码?/p>

于是QUnicode诞生了?/p>

  Unicode也是一U字W编码方法,它占用两个字节(0000H—FFFFHQ?容纳65536个字W,q完全可以容U_世界所有语a文字的编码?br />在Unicode里,所有的字符被一视同仁,汉字不再使用“两个扩展ASCII”,而是使用?个Unicode”,也就是说Q所有的文字都按一个字W来处理Q它们都有一个唯一的Unicode码?/p>

二、用Unicode~码的好?/p>

  使用Unicode~码可以使您的工E同时支持多U语aQ您的工程国际化?br />  另外QWindows NT是用Unicodeq行开发的Q整个系l都是基于Unicode的。如果调用一个API函数q给它传递一个ANSIQASCII字符集以及由此派生ƈ兼容的字W集Q如QGB2312Q通常UCؓANSI字符集)字符Ԍ那么pȝ首先要将字符串{换成UnicodeQ然后将Unicode字符串传递给操作pȝ。如果希望函数返回ANSI字符Ԍpȝ׃首先Unicode字符串{换成ANSI字符Ԍ然后结果返回给您的应用E序。进行这些字W串的{换需要占用系l的旉和内存。如果用Unicode来开发应用程序,p够您的应用E序更加有效地运行?br />
下面例D几个字符的编码以单演CANSI和Unicode的区别:

字符 A N ?/td>
ANSI?/td> 41H 4eH cdbaH
Unicode?/td> 0041H 004eH 548cH

三、用C++q行Unicode~程

  对宽字符的支持其实是ANSI C标准的一部分Q用以支持多字节表示一个字W。宽字符和Unicodeq不完全{同QUnicode只是宽字W的一U编码方式?/p>

1、宽字符的定?/p>

  在ANSI中,一个字W(charQ的长度Z个字节(ByteQ。用UnicodeӞ一个字W占据一个字QC++在wchar.h头文件中定义了最基本的宽字符cdwchar_tQ?/p>

typedef unsigned short wchar_t;

从这里我们可以清楚地看到Q所谓的宽字W就是无W号短整数?/p>

2、常量宽字符?/p>

  对C++E序员而言Q构造字W串帔R是一经常性的工作。那么,如何构造宽字符字符串常量呢Q很单,只要在字W串帔R前加上一个大写的L可以了Q比如:

wchar_t *str1=L" Hello";

q个L非常重要Q只有带上它Q编译器才知道你要将字符串存成一个字W一个字。还要注意,在L和字W串之间不能有空根{?/p>

3、宽字符串库函数

Z操作宽字W串QC++专门定义了一套函敎ͼ比如求宽字符串长度的函数?/p>

size_t __cdel wchlen(const wchar_t*);

  Z么要专门定义q些函数呢?最Ҏ的原因是QANSI下的字符串都是以’\0’来标识字符串尾的(Unicode字符串以“\0\0”结束)Q许多字W串函数的正操作均是以此ؓ基础q行。而我们知道,在宽字符的情况下Q一个字W在内存中要占据一个字的空_q就会操作ANSI字符的字W串函数无法正确操作。以”Hello”字W串ZQ在宽字W下Q它的五个字W是Q?br />0x0048 0x0065 0x006c 0x006c 0x006f
在内存中Q实际的排列是:

48 00 65 00 6c 00 6c 00 6f 00

  于是QANSI字符串函敎ͼ如strlenQ在到W一?8后的00Ӟ׃认ؓ字符串到了Q用strlen对宽字符串求长度的结果就永远会是1Q?/p>

4、用宏实现对ANSI和Unicode通用的编E?/p>

  可见QC++有一整套的数据类型和函数实现Unicode~程Q也是_您完全可以用C++实现Unicode~程?br />如果我们惌我们的程序有两个版本QANSI版本和Unicode版本。当Ӟ~写两套代码分别实现ANSI版本和Unicode版本完全是行得通的。但是,针对ANSI字符和Unicode字符l护两套代码是非帔R烦的事情。ؓ了减ȝE的负担QC++定义了一pd的宏Q帮助您实现对ANSI和Unicode的通用~程?br />  C++宏实现ANSI和Unicode的通用~程的本质是Ҏ”_UNICODE”(注意Q有下划U)定义与否Q这些宏展开为ANSI或Unicode字符Q字W串Q?/p>

如下是tchar.h头文件中部分代码摘抄Q?

#ifdef  _UNICODE
typedef wchar_t     TCHAR;
#define __T(x)      L##x
#define _T(x)       __T(x)
#else
#define __T(x)      x
typedef char            TCHAR;
#endif 
  可见Q这些宏Ҏ”_UNICODE?定义与否Q分别展开为ANSI或Unicode字符?tchar.h头文件中定义的宏可以分ؓ两类Q?

A、实现字W和帔R字符串定义的宏我们只列出两个最常用的宏Q?

?未定义_UNICODE(ANSI字符) 定义了_UNICODE(Unicode字符)
TCHAR char wchar_t
_T(x) x L##x

注意Q?br />  ?#”是ANSI C标准的预处理语法Q它叫做“粘贴符号”,表示前面的Ld到宏参数上。也是_如果我们写_T(“Hello?Q展开后即为L“Hello?/p>

B、实现字W串函数调用的宏

C++为字W串函数也定义了一pd宏,同样Q我们只例D几个常用的宏Q?/p>
?未定义_UNICODE(ANSI字符) 定义了_UNICODE(Unicode字符)
_tcschr strchr wcschr
_tcscmp strcmp wcscmp
_tcslen strlen wcslen

四、用Win32 APIq行Unicode~程

Win32 API中定义了一些自q字符数据cd。这些数据类型的定义在winnt.h头文件中。例如:

typedef char CHAR; 
typedef unsigned short WCHAR;    // wc,   16-bit UNICODE character 
typedef CONST CHAR *LPCSTR, *PCSTR; 
Win32 API在winnt.h头文件中定义了一些实现字W和帔R字符串的宏进行ANSI/Unicode通用~程。同P只例丑և个最常用的:
#ifdef  UNICODE 
typedef WCHAR TCHAR, *PTCHAR;
typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR LPCTSTR;
#define __TEXT(quote) L##quote      // r_winnt
#else   /* UNICODE */               // r_winnt
typedef char TCHAR, *PTCHAR;
typedef LPSTR LPTCH, PTCH;
typedef LPSTR PTSTR, LPTSTR;
typedef LPCSTR LPCTSTR;
#define __TEXT(quote) quote         // r_winnt
#endif /* UNICODE */                // r_winnt
  从以上头文g可以看出Qwinnt.hҎ是否定义了UNICODEQ没有下划线Q,q行条g~译?br />   Win32 API也定义了一套字W串函数Q它们根据是否定义了“UNICODE”分别展开为ANSI和Unicode字符串函数。如Qlstrlen。API的字W串操作函数和C++的操作函数可以实现相同的功能Q所以,如果需要的话,您尽可能使用C++的字W串函数Q没必要去花太多_֊再去学习API的这些东ѝ?br />  也许您从来没有注意到QWin32 API实际上有两个版本。一个版本接受MBCS字符Ԍ另一个接受Unicode字符丌Ӏ例如:其实Ҏ没有SetWindowText()q个API函数Q相反,有SetWindowTextA()和SetWindowTextW()。后~A表明q是MBCS函数Q后~W表示q是Unicode版本的函数。这些API函数的头文g在winuser.h中声明,下面例Dwinuser.h中的SetWindowText()函数的声明部分:
#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif // !UNICODE
  可见QAPI函数Ҏ定义UNICODE与否军_指向Unicode版本q是MBCS版本?br />  l心的读者可能已l注意到了UNICODE和_UNICODE的区别,前者没有下划线Q专门用于Windows头文Ӟ后者有一个前~下划U,专门用于Cq行时头文g。换句话_也就是在ANSI C++语言里面Ҏ_UNICODEQ有下划U)定义与否Q各宏分别展开为Unicode或ANSI字符Q在Windows里面ҎUNICODEQ无下划U)定义与否Q各宏分别展开为Unicode或ANSI字符?br />  在后面我们将会看刎ͼ实际使用中我们不加严格区分,同时定义_UNICODE和UNICODEQ以实现UNICODE版本~程?

五、VC++6.0中编写Unicode~码的应用程?

  VC++ 6.0支持Unicode~程Q但默认的是ANSIQ所以开发h员只需要稍微改变一下编写代码的习惯便可以轻杄写支持UNICODE的应用程序?br />  使用VC++ 6.0q行Unicode~程主要做以下几工作:

1、ؓ工程dUNICODE和_UNICODE预处理选项?

  具体步骤Q打开[工程]->[讄…]对话框,如图1所C,在C/C++标签对话框的“预处理E序定义”中去除_MBCSQ加上_UNICODE,UNICODE。(注意中间用逗号隔开Q改动后如图2Q?/p>


图一


图二

  在没有定义UNICODE和_UNICODEӞ所有函数和cd都默认用ANSI的版本;在定义了UNICODE和_UNICODE之后Q所有的MFCcdWindows API都变成了宽字节版本了?br />
2、设|程序入口点

  因ؓMFC应用E序有针对Unicode专用的程序入口点Q我们要讄entry point。否则就会出现连接错误?br />  讄entry point的方法是Q打开[工程]->[讄…]对话框,在Link늚Outputcd的Entry Point里填上wWinMainCRTStartup?/p>


图三

3、用ANSI/Unicode通用数据cd

  微Y提供了一些ANSI和Unicode兼容的通用数据cdQ我们最常用的数据类型有_T QTCHARQLPTSTR,LPCTSTR?br />  Z说一下,LPCTSTR和const TCHAR*是完全等同的。其中L表示long指针Q这是ؓ了兼容Windows 3.1{?6位操作系l遗留下来的Q在Win32 中以及其它的32位操作系l中Qlong指针和near指针及far修饰W都是ؓ了兼容的作用Q没有实际意义。PQpointerQ表C是一个指针;CQconstQ表C是一个常量;T(_T?表示兼容ANSI和UnicodeQSTRQstringQ表C个变量是一个字W串。综上可以看出,LPCTSTR表示一个指向常固定地址的可以根据一些宏定义改变语义的字W串。比如:

TCHAR* szText=_T(“Hello!?;
TCHAR szText[]=_T(“I Love You?;
LPCTSTR lpszText=_T(“大家好Q?;
使用函数中的参数最好也要有变化Q比如:
MessageBox(_T(“你好?);

  其实Q在上面的语句中Q即使您不加_T宏,MessageBox函数也会自动把“你好”字W串q行强制转换。但我还是推荐您使用_T宏,以表C您有Unicode~码意识?

4、修改字W串q算问题

  一些字W串操作函数需要获取字W串的字W数(sizeof(szBuffer)/sizeof(TCHAR))Q而另一些函数可能需要获取字W串的字节数sizeof(szBuffer)。您应该注意该问题ƈ仔细分析字符串操作函敎ͼ以确定能够得到正的l果?br />ANSI操作函数以str开_如strcpy()Qstrcat()Qstrlen()Q?br />Unicode操作函数以wcs开_如wcscpyQwcscpy()Qwcslen()Q?br />ANSI/Unicode操作函数以_tcs开?_tcscpy(Cq行期库)Q?br />ANSI/Unicode操作函数以lstr开?lstrcpy(Windows函数)Q?br />考虑ANSI和Unicode的兼容,我们需要用以_tcs开头或lstr开头的通用字符串操作函数?/p>

六、D个Unicode~程的例?/p>

W一步:
  打开VC++6.0Q新建基于对话框的工EUnicodeQ主对话框IDD_UNICODE_DIALOG中加入一个按钮控Ӟ双击该控件ƈd该控件的响应函数Q?/p>

void CUnicodeDlg::OnButton1() 
{
	TCHAR* str1=_T("ANSI和UNICODE~码试验");
	m_disp=str1;
	UpdateData(FALSE);
}
  d静态文本框IDC_DISPQ用ClassWizardl该控gdCStringcd变量m_disp。用默认ANSI~码环境~译该工E,生成Unicode.exe?

W二步:
  打开“控刉李쀝,单击“日期、时间、语a和区域设|”选项Q在“日期、时间、语a和区域设|”窗口中l箋单击“区域和语言选项”选项Q弹出“区域和语言选项”对话框。在该对话框中,单击“高U”标{,“非Unicode的程序的语言”选项改ؓ“日语”,单击“应用”按钮,如图四:


囑֛

弹出的对话框单击“是”,重新启动计算Z讄生效?br />q行Unicode.exeE序q单几ZButton1”按钮,看,静态文本框出现了ؕ码?/p>

W三步:
  改ؓUnicode~码环境~译该工E,生成Unicode.exe。再ơ运行Unicode.exeE序q单几ZButton1”按钮。看到Unicode~码的优势了吧?/p>

pq些吧,您好运?/p>

阿π 2010-05-06 17:30 发表评论
]]>
谈谈Unicode~码Q简要解释UCS、UTF、BMP、BOM{名?/title><link>http://www.shnenglu.com/lapcca/archive/2010/05/06/114661.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 06 May 2010 08:39:00 GMT</pubDate><guid>http://www.shnenglu.com/lapcca/archive/2010/05/06/114661.html</guid><wfw:comment>http://www.shnenglu.com/lapcca/comments/114661.html</wfw:comment><comments>http://www.shnenglu.com/lapcca/archive/2010/05/06/114661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/lapcca/comments/commentRss/114661.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lapcca/services/trackbacks/114661.html</trackback:ping><description><![CDATA[<div id="gsomg82" class="cnt" id="blog_text"> <br />q是一程序员写给E序员的味ȝ。所谓趣x指可以比较轻村֜了解一些原来不清楚的概念,增进知识Q类g打RPG游戏的升U。整理这文章的动机是两个问题:<br /><br />问题一Q?br /><br />    使用WindowsC本的“另存ؓ”,可以在GBK、Unicode、Unicode big endian和UTF-8q几U编码方式间怺转换。同htxt文gQWindows是怎样识别~码方式的呢Q?br /><br />    我很早前发现Unicode、Unicode big endian和UTF-8~码的txt文g的开头会多出几个字节Q分别是FF、FEQUnicodeQ?FE、FFQUnicode big endianQ?EF、BB、BFQUTF-8Q。但q些标记是基于什么标准呢Q?br />问题二:<br />    最q在|上看到一个ConvertUTF.cQ实CUTF-32、UTF-16和UTF-8q三U编码方式的怺转换。对于Unicode(UCS2)?GBK、UTF-8q些~码方式Q我原来׃解。但q个E序让我有些p涂Q想不v来UTF-16和UCS2有什么关pR?<br /><br />查了查相兌料,ȝ这些问题弄清楚了,带也了解了一些Unicode的细节。写成一文章,送给有过cM疑问的朋友。本文在写作时尽量做到通俗易懂Q但要求读者知道什么是字节Q什么是十六q制?br />0、big endian和little endian<br /><br />big endian和little endian是CPU处理多字节数的不同方式。例如“汉”字的Unicode~码?C49。那么写到文仉ӞI竟是将6C写在前面Q还是将49写在前面Q如果将6C写在前面Q就是big endian。还是将49写在前面Q就是little endian?br /><br />“endian”这个词《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开q是从小?Little-Endian)敲开Q由此曾发生q六ơ叛乱,其中一个皇帝送了命,另一个丢了王位?br /><br />我们一般将endian译成“字节序”,big endian和little endianUC“大䏀和“小䏀?br />1、字W编码、内码,带介绍汉字~码<br /><br />字符必须~码后才能被计算机处理。计机使用的缺省编码方式就是计机的内码。早期的计算Z?位的ASCII~码Qؓ了处理汉字,E序员设计了用于体中文的GB2312和用于繁体中文的big5?br /><br />GB2312(1980q?一共收录了7445个字W,包括6763个汉字和682个其它符受汉字区的内码范围高字节从B0-F7Q低字节从A1-FEQ占用的码位?2*94=6768。其中有5个空位是D7FA-D7FE?br /><br />GB2312 支持的汉字太?995q的汉字扩展规范GBK1.0收录?1886个符P它分为汉字区和图形符号区。汉字区包括21003个字W?000q的 GB18030是取代GBK1.0的正式国家标准。该标准收录?7484个汉字,同时q收录了藏文、蒙文、维向ְ文等主要的少数民族文字。现在的PCq_必须支持GB18030Q对嵌入式品暂不作要求。所以手机、MP3一般只支持GB2312?br /><br />从ASCII?GB2312、GBK到GB18030Q这些编码方法是向下兼容的,卛_一个字W在q些Ҏ中L有相同的~码Q后面的标准支持更多的字W。在q些~码中,英文和中文可以统一地处理。区分中文编码的Ҏ是高字节的最高位不ؓ0。按照程序员的称|GB2312、GBK到GB18030都属于双字节字符?(DBCS)?br /><br />有的中文Windows的缺省内码还是GBKQ可以通过GB18030升包升U到GB18030。不qGB18030相对GBK增加的字W,普通h是很隄到的Q通常我们q是用GBK指代中文Windows内码?br /><br />q里q有一些细节:<br /><br />    *<br /><br />      GB2312的原文还是区位码Q从Z码到内码Q需要在高字节和低字节上分别加上A0?br />    *<br /><br />      在DBCS中,GB内码的存储格式始l是big endianQ即高位在前?br />    *<br /><br />      GB2312 的两个字节的最高位都是1。但W合q个条g的码位只?28*128=16384个。所以GBK和GB18030的低字节最高位都可能不?。不q这不媄响DBCS字符的解析Q在dDBCS字符时Q只要遇到高位ؓ1的字节,可以将下两个字节作Z个双字节~码Q而不用管低字节的高位是什么?br /><br />2、Unicode、UCS和UTF<br /><br />前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容Q更准确地说Q是与ISO-8859-1兼容Q,与GB码不兼容。例如“汉”字的Unicode~码?C49Q而GB码是BABA?br /><br />Unicode 也是一U字W编码方法,不过它是由国际组l设计,可以容纳全世界所有语a文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set"Q简UCؓUCS。UCS可以看作?Unicode Character Set"的羃写?br /><br />Ҏl基癄全书(http: //zh.wikipedia.org/wiki/)的记载:历史上存在两个试囄立设计Unicode的组l,卛_际标准化l织QISOQ和一个Y件制造商的协会(unicode.orgQ。ISO开发了ISO 10646目QUnicode协会开发了Unicode目?br /><br />?991q前后,双方都认识到世界不需要两个不兼容的字W集。于是它们开始合q双方的工作成果Qƈ为创立一个单一~码表而协同工作。从Unicode2.0开始,Unicode目采用了与ISO 10646-1相同的字库和字码?br /><br />目前两个目仍都存在Qƈ独立地公布各自的标准。Unicode协会现在的最新版本是2005q的Unicode 4.1.0。ISO的最新标准是10646-3:2003?br /><br />UCS规定了怎么用多个字节表C各U文字。怎样传输q些~码Q是由UTF(UCS Transformation Format)规范规定的,常见的UTF规范包括UTF-8、UTF-7、UTF-16?br /><br />IETF 的RFC2781和RFC3629以RFC的一贯风|清晰、明快又不失严}地描qCUTF-16和UTF-8的编码方法。我LC得IETF?Internet Engineering Task Force的羃写。但IETF负责l护的RFC是Internet上一切规范的基础?br />3、UCS-2、UCS-4、BMP<br /><br /><br /><br />UCS有两U格式:UCS-2和UCS-4。顾名思义QUCS-2是用两个字节编码,UCS-4是?个字节(实际上只用了31位,最高位必须?Q编码。下面让我们做一些简单的数学游戏Q?br /><br />UCS-2?^16=65536个码位,UCS-4?^31=2147483648个码位?br /><br />UCS -4Ҏ最高位?的最高字节分?^7=128个group。每个group再根据次高字节分?56个plane。每个planeҎW?个字节分?256?(rows)Q每行包?56个cells。当然同一行的cells只是最后一个字节不同,其余都相同?br /><br />group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节ؓ0的码位被UCBMP?br /><br />UCS-4的BMPL前面的两个零字节得CUCS-2。在UCS-2的两个字节前加上两个零字节,得CUCS-4的BMP。而目前的UCS-4规范中还没有M字符被分配在BMP之外?br />4、UTF~码<br /><br /><br /><br />UTF-8是?位ؓ单元对UCSq行~码。从UCS-2到UTF-8的编码方式如下:<br />UCS-2~码(16q制)     UTF-8 字节?二进?<br />0000 - 007F     0xxxxxxx<br />0080 - 07FF     110xxxxx 10xxxxxx<br />0800 - FFFF     1110xxxx 10xxxxxx 10xxxxxx<br /><br />例如“汉”字的Unicode~码?C49?C49?800-FFFF之间Q所以肯定要?字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是Q?110 110001 001001Q?用这个比Ҏ依次代替模板中的xQ得刎ͼ11100110 10110001 10001001Q即E6 B1 89?br /><br />读者可以用C本测试一下我们的~码是否正确?br /><br />UTF -16?6位ؓ单元对UCSq行~码。对于小?x10000的UCS码,UTF-16~码q于UCS码对应的16位无W号整数。对于不于 0x10000的UCS码,定义了一个算法。不q由于实际用的UCS2Q或者UCS4的BMP必然于0x10000Q所以就目前而言Q可以认为UTF -16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题?br />5、UTF的字节序和BOM<br /><br />UTF -8以字节ؓ~码单元Q没有字节序的问题。UTF-16以两个字节ؓ~码单元Q在解释一个UTF-16文本前,首先要弄清楚每个~码单元的字节序。例如收C个“奎”的Unicode~码?94EQ“乙”的Unicode~码?E59。如果我们收到UTF-16字节?94E”,那么q是“奎”还?“乙”?<br /><br />Unicode规范中推荐的标记字节序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。BOM是一个有点小聪明的想法:<br /><br />在UCS ~码中有一个叫?ZERO WIDTH NO-BREAK SPACE"的字W,它的~码是FEFF。而FFFE在UCS中是不存在的字符Q所以不应该出现在实际传输中。UCS规范我们在传输字节流前,先传输字W?ZERO WIDTH NO-BREAK SPACE"?br /><br />q样如果接收者收到FEFFQ就表明q个字节是Big-Endian的;如果收到FFFEQ就表明q个字节是Little-Endian的。因此字W?ZERO WIDTH NO-BREAK SPACE"又被UCBOM?br /><br />UTF -8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字W?ZERO WIDTH NO-BREAK SPACE"的UTF-8~码是EF BB BFQ读者可以用我们前面介绍的编码方法验证一下)。所以如果接收者收CEF BB BF开头的字节,q道这是UTF-8~码了?br /><br />Windows是使用BOM来标记文本文件的~码方式的?br />6、进一步的参考资?br /><br />本文主要参考的资料?"Short overview of ISO-IEC 10646 and Unicode" (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)?br /><br />我还找了两篇看上M错的资料Q不q因为我开始的疑问都找C{案Q所以就没有看:<br /><br />   1. "Understanding Unicode A general introduction to the Unicode Standard" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a)<br />   2. "Character set encoding basics Understanding character set encodings and legacy encodings" (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03) <br /><br />我写qUTF-8、UCS-2、GBK怺转换的Y件包Q包括用Windows API和不使用Windows API的版本。以后有旉的话Q我会整理一下放到我的个Z上(http://www.fmddlmyy.cn)?br /><br />我是x楚所有问题后才开始写q篇文章的,原以Z会儿p写好。没惛_考虑措辞和查证细节花费了很长旉Q竟然从下午1:30写到9:00。希望有读者能从中受益?/div><img src ="http://www.shnenglu.com/lapcca/aggbug/114661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lapcca/" target="_blank">阿π</a> 2010-05-06 16:39 <a href="http://www.shnenglu.com/lapcca/archive/2010/05/06/114661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UNICODE与ANSI的区?/title><link>http://www.shnenglu.com/lapcca/archive/2010/05/06/114649.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 06 May 2010 08:09:00 GMT</pubDate><guid>http://www.shnenglu.com/lapcca/archive/2010/05/06/114649.html</guid><wfw:comment>http://www.shnenglu.com/lapcca/comments/114649.html</wfw:comment><comments>http://www.shnenglu.com/lapcca/archive/2010/05/06/114649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/lapcca/comments/commentRss/114649.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lapcca/services/trackbacks/114649.html</trackback:ping><description><![CDATA[什么是ANSIQ什么又是UNICODE呢?其实q是两种不同的编码方式标准,ANSI中的字符采用8bitQ而UNICODE中的字符采用16bit。(对于字符来说ANSI以单字节存放英文字符Q以双字节存放中文等字符,而Unicode下,英文和中文的字符都以双字节存放)Unicode码也是一U国际标准编码,采用二个字节~码Q与ANSI码不兼容。目前,在网l、Windowspȝ和很多大型Y件中得到应用?bit的ANSI~码只能表示256U字W,表示26个英文字母是lԒ有余的,但是表示汉字Q韩国语{有着成千上万个字W的非西方字W肯定就不够了,正是如此才引入了UNICODE标准。  ?br />     在Y件开发中Q特别是使用C语言的一些有兛_W串处理的函敎ͼANSI和UNICODE是区分是用的Q那么ANSIcd的字W和UNICODEcd的字W如何定义,如何使用呢?ANSI和UNICODE又如何{换呢Q  ?br />   一Q定义部分:  <br />   ANSIQchar    str[1024]; 可用字符串处理函敎ͼstrcpy( ),    strcat( ),   strlen( ){等?br />UNICODEQwchar_t    str[1024]Q可用字W串处理函数   <br />二.可用函数Q?<br />   ANSIQ即charQ可用字W串处理函数Qstrcat(    ),strcpy(    ),    strlen(    ){以str打头的函数。  ?br />   UNICODEQ即wchar_t 可用字符串处理函敎ͼwcscat(),wcscpy(),wcslen(){以wcs打头的函数。  ?br />   三.pȝ支持  <br />      Windows    98    Q只支持ANSI。  ?br />      Windows    2k    Q既支持ANSI又支持UNICODE。  ?br />      Windows    CE    Q只支持UNICODE。  ?br />      说明   <br />      1 在COM里面只支持UNICODE。  ?br />      2QWindows   2000整个OSpȝ都是ZUNICODE的,为此在windows 2000 下用ANSI是需要付ZLQ虽然在~码上不用Q何的转换Q但是这U{化是隐藏的,是占用系l资源的QCPUQ内存)。  ?br />      3 在Windows 98下必M用UNICODEQ则需要自己手动的~码切换。  ?br />    四.如何区分Q  ?br />    在我们Y件开发中往往需要即支持ANSI又支持UNICODEQ不可能在要求类型{换的时候,重新改变字符串的cdQ和使用于字W串上的操作函数。ؓ? 标准Cq行期库和Windows 提供了宏定义的方式。  ?br />    在C语言里面提供?_UNICODE宏(有下划线Q,在Windows里面提供了UNICODE宏(无下划线Q,只要定了_UNICODE宏和UNICODE宏,pȝ׃自动切换到UNICODE版本Q否则,pȝ按照ANSI的方式进行编译和q行。  ?br />    只定义了宏ƈ不能实现自动的{换,他还需要一pd的字W定义支持。  ?br />   1. TCHAR   <br />   如果定义了UNICODE宏则TCHAR被定义ؓwchar_t。  ?br />    typedef    wchar_t    TCHAR;   <br />    否则TCHAR被定义ؓchar   <br />    typedef    char   TCHAR;   <br />   2QLPTSTR   <br />如果定义了UNICODE宏则LPTSTR被定义ؓLPWSTR。(以前一直不知道LPWSTR是什么东东,l于明白了)   <br />   typedef    LPTSTR   LPWSTR;   <br />   否则TCHAR被定义ؓchar   <br />   typedef    LPTSTR   LPSTR;  <br />补充一下:<br />UTF-8是可以用于真正的式传输的,Unicode是一U编码方案  ?br />    我的理解是UTF-8是Unicode的一U具体实现。类似的实现q有UTFQ?6{等? <p><br />ANSI/Unicode字符和字W串 <br />TChar.h是String.h的修改,用于创徏ANSI/Unicode通用字符丌Ӏ?/p><p>Unicode字符串的每个字符都是16位的?/p><p>Win9x只支持ANSIQWin2000/XP/2003支持ANSI/UnicodeQWinCE只支持Unicode<br />       附:有部分Unicode函数也可以在Win9X中用,但可能会出现意想不到错误?/p><p>wchar_t是Unicode字符的数据类型?/p><p>所有的Unicode函数均以wcs开_ANSI函数均以str开_ANSI C规定Cq行期库支持ANSI和Unicode<br />                                 ANSI                                                                              Unicode<br />       char   *strcat(char   *,   const   char   *)                           wchar_t   *wcscat(wchar_t   *,   const   wchar_t   *) <br />       char   *strchr(const   char * , int)                                   wchar_t    *wcschr(const   wchar_t   * , int) <br />       int   strcmp(const   char   *,    const   char   *)                int    wcscmp(const   wchar_t   *, const   wchar_t *)<br />       char *strcpy(char   *,   const   char   *)                           wchar_t   *wcscpy(wchar_t    *,   const   wchar_t    *)<br />       size_t   strlen(const   char   *)                                        wchar_t    wcslen(const   wchar_t   *)</p><p>L" wash " : 用于ANSI字符串{换ؓUnicode字符Ԍ<br />        _TEXT(" wash ")Ҏ是否定义Unicode或_Unicodeq行转换?br />       附:_Unicode用于Cq行库;Unicode用于Windows头文件?/p><p>ANSI/Unicode通用数据cd<br />                        BothQANSI/UnicodeQ                  ?ANSI                       Unicode<br />                               LPCTSTR                                 LPCSTR                   LPCWSTR<br />                               LPTSTR                                    LPSTR                      LPWSTR<br />                               PCTSTR                                   PCSTR                      PCWSTR<br />                               PTSTR                                      PSTR                         PWSTR<br />                               TBYTE(TCHAR)                      CHAR                         WCHAR</p><p>在设计dll时最好提供ANSI和Unicode函数QANSI函数只用于分配内存,字W{换ؓUnicode字符Q然后调用Unicode函数?/p><p>最好用操作系l函敎ͼ用或不实用Cq行期函?br />        egQ操作系l字W串函数QshlWApi.hQ?br />                StrCat(), StrChr(), StrCmp(), StrCpy(){?br />                注意它们区分大小写,也区分ANSI和Unicode版本<br />        附:ANSI版函数在原函数后加大写字母A<br />                Unicode函数在原函数后加大写字母W</p><p>成ؓW合ANSI和Unicode的函?br />        ?文本串视ؓ字符数组Q而不是c h a r s数组或字节数l?br />        ?通用数据cdQ如T C H A R和P T S T RQ用于文本字W和字符丌Ӏ?br />        ?显式数据类型(如B Y T E和P B Y T EQ用于字节、字节指针和数据~存?br />        ?T E X T宏用于原义字W和字符丌Ӏ?br />        ?修改字符串运问??br />          如:sizeof(szBuffer) -> sizeof(szBuffer) / sizeof(TCHAR)<br />                  malloc(charNum) -> malloc(charNum * sizeof(TCHAR))    </p><p>对Unicode字符操作的函数还有:Q也有ANSI和Unicode版本Q?br />       lstrcat() , lstrcmp() / lstrcmpi()[ 它们在内部调用CompareString() ], lstrcpy(), lstrlen()<br />       q些是作为宏实现的?/p><p>          Cq行期函敊W                                    ?windows函数<br />                  tolower()                                  PTSTR   CharLower(PTSTR   pszString)<br />                  toupper()                                 PTSTR   CharUpper(PTSTR   pszString)<br />                  isalpha()                                  BOOL   IsCharAlpha(TCHAR   ch)<br />                                                                   BOOL   ISCharAlphaNumeric(TCHAR   ch)<br />                  islower()                                  BOOL   IsCharLower(TCHAR   ch)<br />                  isupper()                                 BOOL   IsCharUpper(TCHAR   ch)<br />                  print()                                       wsprintf()<br />       转换BufferQDWORD   CharLowerBuffer(PTSTR   pszString , DWORD cchString)<br />                              DWORD CharUpperBuffer(PTSTR   pszString , DWORD   cchString)<br />       也可转换单个字符Q如QTCHAR   cLowerCaseChar = CharLower((PTSTR)szString[0])</p><p>定字符是ANSI或Unicode<br />        BOOL   IsTextUnicode(<br />                     const   VOID   * pBuffer,   //input   buffer   to be   examined<br />                     int   cb,                               //size of input   buffer<br />                     LPINT   lpi                         //options<br />        )<br />       附:此函数在Win9xpȝ中,没有实现代码Q始l返回FALSE</p><p>Unicode与ANSI之间的{?br />        char   szA[40];<br />        wchar   szW[40];<br />        // Normal   sprintf : all   string   are   ANSI<br />        sprintf( szA , " %s " , " ANSI   str ");<br />        // Convert   Unicode   string   to ANSI<br />        sprintf(   szA,   " %S " ,   L" Unicode   str ");<br />        // Normal   swprintf : all string are unicode<br />        swprinf( szW , "%s" , L" Unicode   str ");<br />        // Convert   ANSI   String to Unicode<br />        swprinf( szW, L"%S" , "ANSI str");</p><p>        int   MultiByteToWideChar(<br />              UINT   uCodePage,                   //code page,   0<br />              DWORD   dwFlags,                   //character-type   options,   0<br />              PCSTR   pMultiByte,                  //source   string   Addr<br />              int   cchMultiByte,                       //source   string   byte length<br />              PWSTR   pWideCharStr,          //Dest string   Addr<br />              int   cchWideChar                      //Dest   string char   Nums<br />         )<br />        u C o d e P a g e参数用于标识一个与多字节字W串相关的代码页受d w F l a g s参数用于讑֮另一个控Ӟ它可以用重音W号之类的区分标记来影响字符。这些标志通常q不使用Q在d w F l a g s参数中传?。p M u l t i B y t e S t r参数用于讑֮要{换的字符Ԍ c c h M u l t i B y t e参数用于指明该字W串的长度(按字节计)。如果ؓc c h M u l t i B y t e参数传? 1Q那么该函数用于定源字W串的长度。{换后产生的U n i c o d e版本字符串将被写入内存中的缓存,其地址由p Wi d e C h a r S t r参数指定。必dc c h Wi d e C h a r参数中设定该~存的最大|以字Wؓ计量单位Q。如果调用M u l t i B y t e To Wi d e C h a rQ给c c h Wi d e C h a r参数传?Q那么该参数不执行字符串的转换Q而是q回Z转换取得成功所需要的~存的倹{?/p><p>     可以通过下列步骤多字节字符串{换成U n i c o d e{h字符Ԍ<br />     1) 调用M u l t i B y t e To Wi d e C h a r函数Qؓp Wi d e C h a r S t r参数传递N U L LQؓc c h Wi d e C h a r参数传??br />     2) 分配_的内存块Q用于存放{换后的U n i c o d e字符丌Ӏ该内存块的大小由前面对M u l t B y t e To Wi d e C h a r的调用返回?br />     3) 再次调用M u l t i B y t e To Wi d e C h a rQ这ơ将~存的地址作ؓp Wi d e C h a r S t r参数来传递,q传递第一ơ调用M u l t i B y t e To Wi d e C h a r时返回的~存大小Q作为c c h Wi d e c h a r参数?br />     4) 使用转换后的字符丌Ӏ?br />     5) 释放U n i c o d e字符串占用的内存块?/p><p>    int WideCharToMultiByte(<br />          UINT CodePage,                        // code page<br />          DWORD dwFlags,                      // performance and mapping flags<br />          LPCWSTR lpWideCharStr,      // wide-character string<br />          int cchWideChar,                       // number of chars in string<br />          LPSTR lpMultiByteStr,               // buffer for new string<br />          int cbMultiByte,                           // size of buffer<br />          LPCSTR lpDefaultChar,            // default for unmappable chars<br />          LPBOOL lpUsedDefaultChar   // set when default char used<br />     )</p><img src ="http://www.shnenglu.com/lapcca/aggbug/114649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lapcca/" target="_blank">阿π</a> 2010-05-06 16:09 <a href="http://www.shnenglu.com/lapcca/archive/2010/05/06/114649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ice与CORBA的差?/title><link>http://www.shnenglu.com/lapcca/archive/2010/05/06/114595.html</link><dc:creator>阿π</dc:creator><author>阿π</author><pubDate>Thu, 06 May 2010 04:38:00 GMT</pubDate><guid>http://www.shnenglu.com/lapcca/archive/2010/05/06/114595.html</guid><wfw:comment>http://www.shnenglu.com/lapcca/comments/114595.html</wfw:comment><comments>http://www.shnenglu.com/lapcca/archive/2010/05/06/114595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/lapcca/comments/commentRss/114595.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/lapcca/services/trackbacks/114595.html</trackback:ping><description><![CDATA[<p>首先声明,我们既不惛_起一?CORBA vs Ice"的争论,也不x疑CORBA。相反,我们认ؓCORBA在它的时代是一个很大的成就Q而且QIce也明昑ր用了CORBA的很多思想?/p> <p>我们军_写这比较文章是因ؓ我们期望更多的h能正地询问我们Z他们要用Ice代替CORBA。对q个问题Q我们通常的回{是Qؓ什么不先自p试?Ice呢?我们敢肯定,一旦你使用了Ice有一D|_你就永远不会再想用回CORBA。请怿我们Q很Ҏ会喜Ƣ上IceQ因为它优雅、简单,它的l构一致性,而且最后一点:臛_它没有大量的Ҏ和工具?/p> <p>对于没有旉去试验Ice来了解它的hQ这里有一些原因让我们怿Ice优于CORBAQ?/p> <p>1、Completeness(完备?<br />当我们说到完备性时Q我们的意思是实际产品的完备性,而不是从来未被实现的标准的完备性。我们相信Ice比市ZM单个CORBA更完备。你可以自己做一个检查:市场上有哪个CORBA产品提供了跟Ice可比较的Ҏ?</p> <p>2、Performance(性能)<br />׃hCORBA所没有的结构优点,IcehH出的性能。Ice高效的协议、请求批量化、高效的事g分发都意味着Ice比CORBA ORBq行得更快,同时消耗更的U\带宽?/p> <p>3、No "Design by Committee"(非“委员会设计?<br />Ice׃专业的资深专家所设计。Ice没有设计成适合所有h的“万金a”。而CORBA则充斥着被具有特权的制定者加q到标准里的众多不切实际的特性,却又没有真正考虑到这些特性是否会被真正地实现?/p> <p>通常Qؓ了就CORBA标准达成一致的唯一Ҏ是之前大量实现的Ҏ放在一P生硬地塞q标准里。这D了标准越来越大,也越来越复杂Q超Z实际的需要。这也意味着q_更大更慢Q也因ؓ复杂的APID了难以用。Ice提供的API集小得多Q也更高效,比CORBA的API易于学习使用Qƈ且功能ƈ不少?/p> <p>4、Slice<br />SliceQIce的规范定义语aQ比CORBA IDL更小、更z、更强大。Sliceh更少的语al构Q但却更灉|。例如,一个内建的字典cd提供直接快速访问数据结构,异常的承允许更清晰地媄到支持异常处理的语a。同ӞSlice抛弃了CORBA IDL不需要的复杂性,例如属性,inout参数Q上下文和传值对?Objects-by-Value)的复杂性?/p> <p>5、Language Mappings(语言影射)<br />Ice支持到C++、Java、Python、PHP、C#和Visual Basic的语a影射。我们知道Q何一个CORBA实现提供商都没有提供那么多的语言影射选择?/p> <p>实际上大多数的CORBA提供商只提供C++和Java的媄,如果你想使用其它语言影射Q你p切换C同的提供商的产品或用没有实验支持的CORBA实现?/p> <p>6、Persistence(持久?<br />Sliceq不单单是一个接口定义语a。它也可以用来描qIce对象q行持久的属性,使得很容易写出支持对象持久的服务器端E序?/p> <p>7、Metadata(元数?<br />Slice支持可扩展的元数据设施,它允许Slice为实现应用程序相关的某些目的而用元数据的标记。例如元数据可以用于定制不同于标准Java影射方式的媄来满某些特定E序的要求?/p> <p>8、No any Type(没有any数据cd)<br />Ice 没有CORBA里Anycd的等h据类型。这对于CORBA用户来说可能感到很惊Ӟ因ؓAny数据cd在CORBA标准里被q泛C用。但是,Any 数据cd是多余的Q程序语a象Java和C++q没有Any数据cdQ而且Any数据cd对分布式pȝ来说也不是属于一个良好的设计。Any数据cd通常用在两种情况下:一U是需要在pȝ的中介部分对接收到的数据直接q行传递,而不用关心数据的真实cdQ例如CORBA的Event服务Q另一U是用来作ؓ union(联合l构?的一个等L?/p> <p>Ice可以通过发送和接收"blobs"的请求来满W一U情况,Slice的类l承可以满W二U情cQ何一U情况,Ice的程序都更高效,更加hcd安全Q更加容易设计和实现Q而不会遇C用CORBA Any数据cd时所h的复杂性?/p> <p>9、Ice Core(Ice的核?<br />虽着旉的演化,CORBA的核心变得异常的复杂。一个初U的例子要在POA(CORBA的对象适配?里面正确使用都需要很专业的知识,即你只x持一部分的技术特性。Ice的对象适配器,在另一斚w来说Q更加简单、直观、也跟POA一L功能强大Q定义良好的API使得比POA开发一个可扩展的程序项目需要更的工作?/p> <p>10、Ice Protocol(Ice协议)<br />IIOP是CORBA的弱点之一Q具有太多的设计~陷。例如,没有~少h的封装来防止消息的分发。低效的寚w规则D了多余的数据拯。数据的~码规则复杂Q却没有带来相应的性能的提高,对象引用的编码异常复杂,妨碍了有效的的编码和在内存共享的执行。代码集的协商是在标准下达成Q会遭遇到很多冲H。所有这些复杂性意味着IIOP很难实现Q带来了互操作性和性能上的问题。Ice的协议是单ƈ且更加有效,它提供了一些IIOP没有提供的特性,例如数据压羃和批h扚w化?/p> <p>11、Security(安全?<br />安全性是CORBA的最大的一个难题。OMG已经通过了多个标准,但很多都没有被广泛地实现QCORBA的客户依然没有一个可工作的安全的ORBs。当设计 IceӞ和CORBA相比Q安全性被认ؓ是基本的Ҏ。这是Ice提供一个真正能q作的SSL实现的安全的防火墙的原因?/p> <p>12、C++ Mapping(C++映射)<br />?C++来用CORBA非常困难。即使你是很有经验的C++开发者。CORBA的C++映射在内存管理和异常安全斚w有很多的陷阱和缺陗相较之下,Ice的C++映射非常单和直观。它不会有因为错误而导致内存的泄漏。要C的映规则的数目比CORBA的C++映射得多,而且Ice的C++ 映射是基于工业标准的STL?/p> <p>14、Scalability(可׾~?<br />当你是一个专家时QCORBA是一U可伸羃性很好的技术。但采用IceQQ何h都可以写出高可׾~性的应用。例如,Ice实现了一个持久化的逐出器,你可以用它来很Ҏ地处理上百万的对象,你所做的仅仅是在 Slice的定义里指定对象的数据,剩下的工作Ice一手包办:Iceq行库用高速的数据库来自动加蝲和保存对象?/p> <p>15、Versioning(版本?<br />CORBA没有M机制来支持对象状态的版本化。Freeze是Ice的持久服务,它允许持久数据在Slice的定义中改变Ӟ很容易地q行数据库的UL?/p> <p>16、Software Updates(软g更新)<br />IcePatch是一个允怽更行客户端Y件的工具。它使用压羃来提高数据的传输Qƈ使用校验值来保证一致性。CORBA完全没有提供一个在分布式环境来q行软g更新的机制?/p> <p>17、Typed Event Service(cd化的事g服务)<br />CORBA有一个标准来提供cd化的事g服务Q但很少甚至没有被实现。类型化的事件服务也有很多已知的问题Q事实上它在真正环境的部|是不可用的。Ice从一开始就提供了类型化事g的服务。IceStorm是一个高效、类型化事g服务的实玎ͼ它支持事件联盟?/p> <p>18、Facets(多接?<br />CORBA支持l承QDCOM支持聚合。在q去Q有很多关于那一U是更好的方法的争论。Ice以接口承加上以多接口Ş式的聚合来同时支持这两种方式。Facets允许你在q行的时候用动态的聚合来扩展类型来替代静态的l承?/p> <p>19、Asynchronous Messages(异步消息)<br />CORBA 支持异步消息调用(AMI)Q但很少CORBA产品实现了AMI。Ice一开始就以简单和有效的方式支持AMI。Ice也支持异步消息分?AMD)Q这是CORBA里完全没有的东西。AMD{h于客L的AMIQ不qAMD是用在服务器端的。用AMIQ你可以发送了一个请求,然后在以后的一个事件收到服务器的结果时调用一个回调函数来处理q回的结果。而用AMDQ你可以分发线E归q给IceQƈ在结果已l准备好发送到客户端时再次调用分发U程?AMI和AMD都能被连接v来,q允怽只消耗很的资源p构徏高效的\q序?/p> <p>AMI和AMD对客L和服务器端来说都是透明的。也是Q一个服务器E序不知道一个请求是否通过AMI调用发出的还是同步地调用发出的,客户端程序也不知道一个操作的调用在服务器端是通过AMD分发处理的还是同步地处理的。当需要用AMI和AMDӞ不用修改Slice?/p> <p>l束语:</p> <p>我们希望上面的解释能另你Ȁ发你对Ice的兴。如果你有Q何的问题或解释,我们会邀请你加入我们的邮件列表。我们的目标是不断地改进IceQ因此你的反馈对我们来说是很有h值的?/p> <p>                                                                                    gigaboy译完成?005/7/4 3:02</p> <p> </p><img src ="http://www.shnenglu.com/lapcca/aggbug/114595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/lapcca/" target="_blank">阿π</a> 2010-05-06 12:38 <a href="http://www.shnenglu.com/lapcca/archive/2010/05/06/114595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.vzxu.cn" target="_blank">ݺɫþۺ</a>| <a href="http://www.eastmark.cn" target="_blank">ݺɫþþۺ</a>| <a href="http://www.5678121.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.123822.cn" target="_blank">99þþƷһ</a>| <a href="http://www.jcfw-1.cn" target="_blank">ھƷþþþþĻ</a>| <a href="http://www.bvvnm.com.cn" target="_blank">þ޾ƷƷ</a>| <a href="http://www.transeurope.com.cn" target="_blank">޺ݺۺϾþþþ </a>| <a href="http://www.dgjiajun.net.cn" target="_blank">þþþһƷɫ</a>| <a href="http://www.3secshop.cn" target="_blank">ƷþþþAV</a>| <a href="http://www.91baokao.cn" target="_blank">ҹþӰԺ</a>| <a href="http://www.338z.cn" target="_blank">ֻƬþøպ</a>| <a href="http://www.wenmis.cn" target="_blank">þۺۺϾþۺ</a>| <a href="http://www.anatolia.com.cn" target="_blank"> þۺϾɫۺϾ99</a>| <a href="http://www.0208958.cn" target="_blank">ձþþվ</a>| <a href="http://www.lyscpf.cn" target="_blank">Ʒþþþþ</a>| <a href="http://www.xeqw.cn" target="_blank">㽶þþƷۺ</a>| <a href="http://www.iceplaza.cn" target="_blank">˾Ʒþһ</a>| <a href="http://www.tengfangwang.cn" target="_blank">þ99Ʒ鶹</a>| <a href="http://www.tr78.cn" target="_blank">޹ŮƷþþþá</a>| <a href="http://www.hg795.cn" target="_blank">þ91ᆱƷ2020</a>| <a href="http://www.bettertrade.cn" target="_blank">ɫۺϾþþþۺһ</a>| <a href="http://www.9978217.cn" target="_blank">žžþþƷר</a>| <a href="http://www.transeurope.com.cn" target="_blank">þֻоƷ18</a>| <a href="http://www.mir818.cn" target="_blank">޹Ʒþ</a>| <a href="http://www.17349.cn" target="_blank">þþƷѿ</a>| <a href="http://www.21gou.cn" target="_blank">ɫþþۺ</a>| <a href="http://www.0546bbs.cn" target="_blank">þˬ˾ƷƵ</a>| <a href="http://www.jn928.cn" target="_blank">Ʒþþþþþ</a>| <a href="http://www.efineit.cn" target="_blank">ҹþþþþýӰ</a>| <a href="http://www.fj023.cn" target="_blank">ɫۺϾþþþۺ99</a>| <a href="http://www.xkr-bsc.cn" target="_blank">һձȾþۺ</a>| <a href="http://www.mutian100.cn" target="_blank">þݺҹҹ2O2O</a>| <a href="http://www.cnfeiting.cn" target="_blank">þۺav</a>| <a href="http://www.73sd.cn" target="_blank">ƷþþþþþþĻ</a>| <a href="http://www.dpww.net.cn" target="_blank">޺ݺۺϾþѿ</a>| <a href="http://www.msve.cn" target="_blank">ŷպۺϾþ</a>| <a href="http://www.114jw.cn" target="_blank">91Ʒþþþþ91</a>| <a href="http://www.mmcase.cn" target="_blank">þùɫAVѹۿ</a>| <a href="http://www.coldcha.cn" target="_blank">þùAV䡪ٶ</a>| <a href="http://www.gmve.cn" target="_blank">ٸþĻ </a>| <a href="http://www.huishou399.cn" target="_blank">þþƷ99Ʒ </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>