锘??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美日韩一区在线观看视频,国产精品ⅴa在线观看h,国产精品久久久亚洲一区http://m.shnenglu.com/guojingjia2006/category/8042.htmlPay it forword - 鎴戝茍涓嶈鐨勮嚜璞紝鎴戞墍灝濊瘯鐨勪簨鎯呴兘澶辮觸浜喡仿仿仿仿仿蜂範鎯師鏈敓媧葷殑浜轟笉瀹規槗鏀瑰彉錛屽氨綆楃幇鐘跺緢緋燂紝浠栦滑涔熷緢闅炬敼鍙橈紝鍦ㄨ繃紼嬩腑錛屼粬浠繕鏄斁寮冧簡路路路路路路浠栦滑涓鏀懼純錛屽ぇ瀹跺氨閮芥槸杈撳路路路路路路璁╃埍浼犲嚭鍘伙紝寰堝洶闅撅紝涔熸棤娉曢鏂欙紝浜轟滑闇瑕佹洿緇嗗績鐨勮瀵熷埆浜猴紝瑕侀殢鏃舵敞鎰忔墠鑳戒繚鎶ゅ埆浜猴紝鍥犱負浠栦滑鏈繀鐭ラ亾鑷繁瑕佷粈涔埪仿仿仿仿?/description>zh-cnThu, 21 Mar 2013 21:25:42 GMTThu, 21 Mar 2013 21:25:42 GMT60SEH寮傚父澶勭悊瀛︿範鎬葷粨 http://m.shnenglu.com/guojingjia2006/archive/2013/03/21/198679.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Thu, 21 Mar 2013 07:43:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2013/03/21/198679.htmlhttp://m.shnenglu.com/guojingjia2006/comments/198679.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2013/03/21/198679.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/198679.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/198679.html鍓嶄竴孌墊椂闂達紝鍦ㄧ湅寮傚父澶勭悊涓绔犲唴瀹圭殑鏃跺欙紝鍙戠幇榪欎竴閮ㄥ垎榪樼湡鐨勬尯鏈夊翱姘達細錛夋墍浠ヤ笂緗戞悳浜嗕竴涓嬫湁鍏沖唴瀹癸紝鍛﹀棳錛岃繕鎸轟赴瀵岀殑銆傚綋鐒舵湁浜涜嚜宸辮繕鏄湅涓嶆噦錛岀幇鍦ㄥ氨灝嗚繖浜涘疂璐濇嬁鍑烘潵璺熷ぇ瀹跺叡浜竴涓嬨?br />棣栧厛鎴戜滑鐪嬩竴涓嬩嬌鐢ㄥ紓甯稿鐞嗙殑鍑犵鎯呭喌錛?br />A錛?鐢ㄦ潵澶勭悊闈炶嚧鍛界殑閿欒
B錛?瀵笰PI鍑芥暟鐨勫弬鏁板悎娉曟х殑媯楠岋紙鍋囪鍙傛暟閮芥槸鍚堟硶鐨勶紝鍙湁閬囧埌寮傚父鐨勬椂鍊欒繘琛屽悎娉曟ф楠岋級
C錛?澶勭悊鑷村懡閿欒錛堥鍑烘椂鏈濂界殑閫夋嫨錛屼絾鏄湁鐨勬椂鍊欏彲浠ョ敤寮傚父澶勭悊鍑芥暟鍦ㄧ▼搴忛鍑哄墠閲婃斁璧勬簮錛屽垹闄や復鏃舵枃浠剁瓑錛岀敋鑷沖彲浠ヨ緇嗚褰曚駭鐢熷紓甯哥殑鎸囦護浣嶇疆鍜岀幆澧冿級
D錛?澶勭悊“璁″垝鍐?#8221;鐨勫紓甯革紙鎴戜滑鍙兘鏇村叧蹇冭繖縐嶆儏鍐碉紝鍥犱負鍙互鍋氬緢澶氱殑鎵嬭剼錛屽搱鍝堬級
鎺ョ潃鎴戜滑鐪嬬湅Windows涓嬪紓甯稿鐞嗙殑涓ょ鏂瑰紡錛?浣跨敤絳涢夊櫒2 SEH寮傚父澶勭悊
涓銆?浣跨敤絳涢夊櫒
鍥犱負榪欓噷鎴戣閲嶇偣鍏蟲敞鐨勬槸SEH鐨勫鐞嗘柟寮忥紝鎵浠ヨ繕鏄畝鍗曠殑鎻愪竴涓嬬瓫閫夊櫒澶勭悊鏂瑰紡銆傜瓫閫夊櫒寮傚父澶勭悊鏄氳繃寮傚父鍥炶皟鍑芥暟鏉ユ寚瀹氱▼搴忓鐞嗗紓甯搞傝繖縐嶆柟寮忕殑鍥炶皟鍑芥暟蹇呴』鏄敮涓鐨勶紝璁劇疆鏂扮殑鍥炶皟鍑芥暟鍚庝互鍓嶇殑灝嗗け鏁堛傞傜敤浜庤繘紼嬭寖鍥淬傜湅涓涓嬭繖涓嚱鏁扮殑瀹氫箟
Invoke SetUnhandledExecpionFilter,offset_Handler
Mov lpPrevHandler,eax
(鍏堝埌榪欓噷鍚ф湁浜涢毦鍙楋紝鏄庡ぉ鎺ョ潃鏉?
######棰樺璇濓細鎯寵搗“鍙鎬護”鐨勪竴鍙ヨ瘽錛岃寰楁尯鏈夐亾鐞嗭細鏄庡ぉ涓嶄竴瀹氱編濂斤紝浣嗘槸鏇寸編濂界殑鏄庡ぉ涓瀹氫細鍒版潵錛佺紱忔墍鏈夌殑鏈嬪弸銆?#####

涓婂崍鏈変細錛屼粈涔堜篃娌℃湁鍋氾紝涓嬪崍錛熻繕鏈変細錛屾垜tm鏅曚簡錛屼腑鍗堜笉鐫¤浜嗭紝涓嶆妸浜嬫儏鍋氫笉瀹屽績閲屼笉韙忓疄銆?br />鍥炶皟鍑芥暟鐨勬牸寮忥細
_Handlerproc pExecptionInfo
鐪嬬湅pExecptionInfo榪欎釜鎸囬拡鍙傛暟鎸囧悜鐨勪竴涓暟鎹粨鏋?br />EXCEPTION_POINTERS STRUCT 
              pExceptionRecord  DWORD      ?              
              ContextRecord    DWORD      ? 
            EXCEPTION_POINTERS ENDS
涓嬮潰浠嬬粛 EXCEPTION_RECORD鍜孋ONTEXT緇撴瀯鐨勫畾涔? 
  
;//===================== 浠ヤ笅鏄袱涓垚鍛樼殑璇︾粏緇撴瀯=========================

        EXCEPTION_RECORD STRUCT 
          ExceptionCode        DWORD      ?      ;//寮傚父鐮?nbsp;
          ExceptionFlags        DWORD      ?      ;//寮傚父鏍囧織 
          pExceptionRecord      DWORD      ?      ;//鎸囧悜鍙﹀涓涓狤XCEPTION_RECORD鐨勬寚閽?nbsp;
          ExceptionAddress      DWORD      ?      ;//寮傚父鍙戠敓鐨勫湴鍧 
          NumberParameters      DWORD      ?      ;//涓嬮潰ExceptionInformation鎵鍚湁鐨刣word鏁扮洰 
          ExceptionInformation  DWORD EXCEPTION_MAXIMUM_PARAMETERS dup(?) 
   EXCEPTION_RECORDENDS            ;//EXCEPTION_MAXIMUM_PARAMETERS ==15 

;//=============================鍏蜂綋瑙i噴================================

ExceptionCode 寮傚父綾誨瀷,SDK閲岄潰鏈夊緢澶氱被鍨?浣犲彲浠ュ湪windows.inc閲屾煡鎵維TATUS_鏉ユ壘鍒版洿澶氱殑寮傚父綾誨瀷,涓嬮潰鍙粰鍑篽ex鍊?鍏蜂綋鏍囪瘑瀹氫箟璇鋒煡闃厀indows.inc,浣犳渶鍙兘閬囧埌鐨勫嚑縐嶇被鍨嬪涓? 

              C0000005h----璇誨啓鍐呭瓨鍐茬獊 
              C0000094h----闈炴硶闄? 
              C00000FDh----鍫嗘爤婧㈠嚭鎴栬呰瓚婄晫 
              80000001h----鐢盫irtual Alloc寤虹珛璧鋒潵鐨勫睘鎬ч〉鍐茬獊 
              C0000025h----涓嶅彲鎸佺畫寮傚父,紼嬪簭鏃犳硶鎭㈠鎵ц,寮傚父澶勭悊渚嬬▼涓嶅簲澶勭悊榪欎釜寮?nbsp;    甯?nbsp;
              C0000026h----鍦ㄥ紓甯稿鐞嗚繃紼嬩腑緋葷粺浣跨敤鐨勪唬鐮?濡傛灉緋葷粺浠庢煇涓緥紼嬭帿鍚嶅濡欑殑榪斿洖,鍒欏嚭鐜版浠g爜, 濡傛灉RtlUnwind鏃舵病鏈塃xception Record鍙傛暟涔熷悓鏍蜂細濉叆榪欎釜浠g爜 
              80000003h----璋冭瘯鏃跺洜浠g爜涓璱nt3涓柇 
              80000004h----澶勪簬琚崟姝ヨ皟璇曠姸鎬?nbsp;

              娉?涔熷彲浠ヨ嚜宸卞畾涔夊紓甯鎬唬鐮?閬靛驚濡備笅瑙勫垯: 
              ____________________________________________________________________

              浣?      31~30            29~28          27~16          15~0 
              ____________________________________________________________________
              鍚箟:    涓ラ噸紼嬪害          29浣?nbsp;           鍔熻兘浠g爜        寮傚父浠g爜 
                        0==鎴愬姛        0==Mcrosoft    MICROSOFT瀹氫箟  鐢ㄦ埛瀹氫箟 
                        1==閫氱煡        1==瀹㈡埛 
                        2==璀﹀憡          28浣?nbsp;
                        3==閿欒        琚繚鐣欏繀欏諱負0 
ExceptionFlags 寮傚父鏍囧織 
              0----鍙慨澶嶅紓甯?nbsp;
              1----涓嶅彲淇寮傚父 
              2----姝e湪灞曞紑,涓嶈璇曞浘淇浠涔?闇瑕佺殑璇?閲婃斁蹇呰鐨勮祫婧?nbsp;
pExceptionRecord 濡傛灉紼嬪簭鏈韓瀵艱嚧寮傚父,鎸囧悜閭d釜寮傚父緇撴瀯 
ExceptionAddress 鍙戠敓寮傚父鐨別ip鍦板潃 
ExceptionInformation 闄勫姞娑堟伅,鍦ㄨ皟鐢≧aiseException鍙寚瀹氭垨鑰呭湪寮傚父鍙蜂負C0000005h鍗沖唴瀛樺紓甯告椂鍚箟濡備笅 
              絎竴涓猟word 0==璇誨啿紿?nbsp;1==鍐欏啿紿?nbsp;
              絎簩涓猟word 璇誨啓鍐茬獊鍦板潃 
;//================================瑙i噴緇撴潫============================
                                                          off. 
        CONTEXT STRUCT                   ; _ 
          ContextFlags  DWORD      ?     ;  |            +0 
          iDr0          DWORD      ?       ;  |            +4 
          iDr1          DWORD      ?      ;  |            +8 
          iDr2          DWORD      ?      ;  >璋冭瘯瀵勫瓨鍣?nbsp; +C 
          iDr3          DWORD      ?      ;  |            +10 
          iDr6          DWORD      ?      ;  |            +14 
          iDr7          DWORD      ?      ; _|            +18 
          FloatSave    FLOATING_SAVE_AREA <>  ;嫻偣瀵勫瓨鍣ㄥ尯 +1C~~~88h 
          regGs        DWORD      ?      ;--|            +8C 
          regFs        DWORD      ?      ;  |/孌靛瘎瀛樺櫒    +90  
          regEs        DWORD      ?      ;  |/            +94            
          regDs        DWORD      ?      ;--|            +98 
          regEdi        DWORD      ?      ;____________    +9C 
          regEsi        DWORD      ?      ;      |  閫氱敤  +A0 
          regEbx        DWORD      ?      ;      |  瀵?nbsp;   +A4 
          regEdx        DWORD      ?      ;      |  瀛?nbsp;   +A8 
          regEcx        DWORD      ?      ;      |  鍣?nbsp;   +AC 
          regEax        DWORD      ?      ;_______|___緇刜  +B0      
          regEbp        DWORD      ?      ;++++++++++++++++ +B4 
          regEip        DWORD      ?      ;    |鎺у埗        +B8 
          regCs        DWORD      ?      ;    |瀵勫瓨        +BC 
          regFlag      DWORD      ?      ;    |鍣ㄧ粍        +C0 
          regEsp        DWORD      ?      ;    |            +C4 
          regSs        DWORD      ?      ;++++++++++++++++ +C8 
          ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?) 
        CONTEXT ENDS 
;//============================浠ヤ笂鏄袱涓垚鍛樼殑璇︾粏緇撴瀯============        
紼嬪簭浣跨敤絳涢夊櫒寮傚父澶勭悊鏃跺彲浠ラ氳繃鏌ョ湅涓婇潰緇撴瀯涓殑regEip鏉ユ壘鍒頒駭鐢熷紓甯哥殑鍦板潃錛佽皟璇曠殑鏃跺欏彲浠ユ敼鍙楨IP鐨勫間互杈懼埌瓚婅繃寮傚父紼嬪簭錛岃漿鍒?#8220;瀹夊叏”鐨勫湴鏂廣?br />鏈鍚庣湅涓涓嬬瓫閫夊櫒寮傚父澶勭悊鍥炶皟鍑芥暟鐨勮繑鍥炲?br />EXECPTION_EXECUTE_HANDLER           1錛涜繘紼嬭緇堟錛岀粓姝㈠墠涓嶄細鍑虹幇鎻愮ず閿欒鐨勫璇濇
EXECPTION_CONTINUE_SEARCH 0錛涘悓鏍風粓姝㈢▼搴忥紝鏄劇ず閿欒瀵硅瘽妗?br />EXECPTION_CONTINUE_EXECUTION -1錛涚郴緇熷皢CONTECT璁劇疆鍥炲幓錛岀戶緇墽琛岀▼搴?br />
浣跨敤絳涢夊櫒紼嬪簭鏄渶綆鍗曠殑澶勭悊寮傚父鏂規硶錛屼笉瓚籌細1 涓嶄究浜庡皝瑁呫? 澶勭悊鏄叏灞鎬х殑涔熷氨鏄棤娉曞姣忎釜綰跨▼鎴栧瓙紼嬪簭璁劇疆涓涓鏈夌殑寮傚父澶勭悊紼嬪簭榪涜寮傚父澶勭悊銆?br />榪涘叆姝i錛歋EH寮傚父澶勭悊
棣栧厛瑙i噴涓涓嬩粈涔堟槸SEH寮傚父澶勭悊錛歋EH("Structured Exception Handling",鍗崇粨鏋勫寲寮傚父澶勭悊.鏄搷浣滅郴緇熸彁渚涚粰紼嬪簭璁捐鑰呯殑寮烘湁鍔涚殑澶勭悊紼嬪簭閿欒鎴栧紓甯哥殑姝﹀櫒銆?br />涓嬮潰緇撳悎鍐烽洦椋樺績鐨勪竴涓猄EH寮傚父澶勭悊紼嬪簭鏉ヨ鏄庡叿浣撶殑鐢ㄦ硶錛?br />;//====================================================================
;// ex. 2,by Hume,2001  綰跨▼鐩稿叧鐨勫紓甯稿鐞?nbsp;
;//====================================================================
.386 
.model flat, stdcall 
option casemap :none  ; case sensitive 
include hd.h          ;//鐩稿叧鐨勫ご鏂囦歡錛屼綘鑷繁緇存姢涓涓惂 
;//============================ 
.data 
szCap    db "By Hume[AfO],2001...",0 
szMsgOK db "It's now in the Per_Thread handler!",0 
szMsgERR1 db "It would never Get here!",0 
buff    db 200 dup(0) 

.code 
_start: 
;//========prog begin==================== 
  ASSUME FS:NOTHING 
        push    offset perThread_Handler 
       push    fs:[0]      
        mov    fs:[0],esp          ;//寤虹珛SEH鐨勫熀鏈珽RR緇撴瀯,濡傛灉涓嶆槑鐧?灝變粩緇嗙爺絀朵竴涓嬪惂 
        xor    ecx,ecx                          
        mov    eax,200     
        cdq                錛?/鍙屽瓧鎵╁睍鍒板洓涓瓧鑺傦紝鍥犱負鏄櫎娉?br />       div    ecx 
                                                  ;//浠ヤ笅姘歌繙涓嶄細琚墽琛?nbsp;
 invoke  MessageBox,NULL,addr szMsgERR1,addr szCap,MB_OK+MB_ICONINFORMATION 
        pop    fs:[0] 
        add    esp,4 
        invoke    ExitProcess,NULL        

;//============================ 
perThread_Handler: 
 invoke    MessageBox,NULL,addr szMsgOK,addr szCap,MB_OK+MB_ICONINFORMATION 
        mov    eax,1          ;//ExceptionContinueSearch,涓嶅鐞?鐢卞叾浠栦緥紼嬫垨緋葷粺澶勭悊 
        ;mov    eax,0          ;//ExceptionContinueExecution,琛ㄧず宸茬粡淇CONTEXT,鍙粠寮傚父鍙戠敓澶勭戶緇墽琛?nbsp;
    ret                        ;//榪欓噷濡傛灉榪斿洖0,浣犱細闄峰叆姝誨驚鐜?涓嶆柇璺沖嚭瀵硅瘽妗?... 

;//=============================Prog Ends============== 
end _start
紼嬪簭鏈韓寰堢畝鍗曪紝娉ㄩ噴涔熷緢璇︾粏銆傛垜浠潵鐪嬬湅鏄浣曟敞鍐屽洖璋冨嚱鏁扮殑
push    offset perThread_Handler 
       push    fs:[0]      
        mov    fs:[0],esp 
浠呬粎涓変釜璇彞灝辮В鍐充簡~閭d箞涓轟粈涔堣鐢╢s榪欎釜孌靛瘎瀛樺櫒鍛紵榪欓噷鍙堟秹鍙婁竴涓噸瑕佺殑鍐呭錛歍IB錛圱hread Information Block綰跨▼淇℃伅鍧楋級銆傛垜浠潵鐪嬬湅榪欎釜閲嶈鐨勬暟鎹粨鏋勶紙寮曠敤浜嗐婄綏鑱祬璋堝埄鐢⊿EB瀹炵幇鍙嶈窡韙嬬殑閮ㄥ垎鍐呭錛?br />TEB(Thread Environment Block) 鍦?nbsp;Windows 9x 緋?鍒椾腑琚О涓?nbsp;TIB(Thread Information Block)錛屽畠璁板綍浜嗙嚎紼嬬殑閲嶈淇℃伅錛岃屼笖姣忎竴涓嚎紼嬮兘浼氬搴斾竴涓?nbsp;TEB 緇?鏋勩?nbsp;Matt Pietrek 澶х墰宸茬粡緇欐垜浠垪鍑轟簡瀹冪殑緇撴瀯錛屾垜灝變笉澶氳鍟︼紝瑙佷笅錛氾紙鎽?鑷?nbsp;Matt Pietrek 鐨?nbsp;Under The Hood - MSJ 1996錛?nbsp;

//=========================================================== 
// file: TIB.H 
// Author: Matt Pietrek 
// From: Microsoft Systems Journal "Under the Hood", May 1996 
//=========================================================== 
#pragma pack(1) 

typedef struct _EXCEPTION_REGISTRATION_RECORD 

  struct _EXCEPTION_REGISTRATION_RECORD * pNext; 
  FARPROC                                pfnHandler; 
} EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD; 

typedef struct _TIB 

PEXCEPTION_REGISTRATION_RECORD pvExcept; // 00h Head of exception record list 
PVOID  pvStackUserTop;        // 04h Top of user stack 
PVOID  pvStackUserBase;        // 08h Base of user stack 

union                          // 0Ch (NT/Win95 differences) 

  struct  // Win95 fields 
  { 
      WORD    pvTDB;          // 0Ch TDB 
      WORD    pvThunkSS;      // 0Eh SS selector used for thunking to 16 bits 
      DWORD  unknown1;      // 10h 
  } WIN95; 

  struct  // WinNT fields 
  { 
      PVOID SubSystemTib;    // 0Ch 
      ULONG FiberData;        // 10h 
  } WINNT; 
} TIB_UNION1; 

PVOID  pvArbitrary;            // 14h Available for application use 
struct _tib *ptibSelf;          // 18h Linear address of TIB structure 

union                          // 1Ch (NT/Win95 differences) 

  struct  // Win95 fields 
  { 
      WORD    TIBFlags;          // 1Ch 
      WORD    Win16MutexCount;    // 1Eh 
      DWORD  DebugContext;      // 20h 
      DWORD  pCurrentPriority;  // 24h 
      DWORD  pvQueue;            // 28h Message Queue selector 
  } WIN95; 

  struct  // WinNT fields 
  { 
      DWORD unknown1;            // 1Ch 
      DWORD processID;            // 20h 
      DWORD threadID;            // 24h 
      DWORD unknown2;            // 28h 
  } WINNT; 
} TIB_UNION2; 

PVOID*  pvTLSArray;            // 2Ch Thread Local Storage array 

union                          // 30h (NT/Win95 differences) 

  struct  // Win95 fields 
  { 
      PVOID*  pProcess;      // 30h Pointer to owning process database 
  } WIN95; 
} TIB_UNION3; 

} TIB, *PTIB; 
#pragma pack()
璁╂垜浠姮澶寸湅鐪嬩笂闈㈢殑 Matt Pietrek 鐨勪唬鐮侊紝鍏朵腑鏈夎繖涔堜竴琛岋細 

PEXCEPTION_REGISTRATION_RECORD pvExcept; // 00h Head of exception record list 

娉?鎰忓埌 PEXCEPTION_REGISTRATION_RECORD 榪欎釜瀹氫箟錛屽畠琛ㄧず pvExcept 榪欎釜鍙橀噺姝?鏄?nbsp;exception record list 鐨勫叆鍙o紝榪欎釜鍏ュ彛浣嶄簬鏁翠釜緇撴瀯鐨?nbsp;0 鍋忕Щ澶勩傚悓鏃訛紝 鍦?nbsp;M 鐨?nbsp;Intel i386 Windows NT/2K/XP 鍐呮牳涓紝姣忓綋鍒涘緩涓涓嚎紼嬶紝OS 鍧囦細涓烘瘡涓嚎紼嬪垎閰?nbsp;TEB 錛岃?涓?nbsp;TEB 姘歌繙鏀懼湪 fs 孌甸夋嫨鍣ㄦ寚瀹氱殑鏁版嵁孌電殑 0 鍋忕Щ澶勩?nbsp;
榪欐牱涓鏉ワ紝浣犲氨鏄庣櫧浜?nbsp;SEH 娉ㄥ唽鐨勫亸縐諱負浠涔堟槸鍦?nbsp;fs:[0] 浜嗗惂錛?nbsp;
浜嬪疄涓?nbsp;Windows 緋葷粺閮芥槸閫氳繃榪欑鏂規硶鏉ヤ負搴旂敤紼嬪簭鎻愪緵淇℃伅鐨勶紝姣斿鏈夎繖鏍風殑渚嬪瓙錛?nbsp;
struct _tib *ptibSelf;          // 18h Linear address of TIB structure 
DWORD threadID;                // 24h 

Windows 鎻愪緵浜嗕竴涓?nbsp;API 錛欸etCurrentThreadID()錛屽畠鐨勫唴閮ㄥ伐浣滃師鐞嗗叾瀹炴槸榪欐牱鐨勶細錛堝埄鐢ㄤ簡涓婇潰鐨勮繖涓や釜鍦板潃錛?nbsp;

mov eax, fs:[18h]    ;鍥犱負 18h 鍋忕Щ澶勬槸 TIB 緇撴瀯鐨勭嚎鎬у亸縐誨湴鍧 
mov eax, [eax + 24h] ;鍥犱負 24h 鍋忕Щ澶勬槸 threadID 鐨勫湴鍧 
ret                  ;鎶?nbsp;eax 涓偍瀛樼殑 threadID 鍦板潃榪斿洖
娉細涓轟粈涔堣澹版槑assume fs:nothing?鍥犱負masm緙栬瘧鍣ㄩ粯璁ゅ皢fs孌靛瘎瀛樺櫒瀹氫箟涓篹rror錛屾墍浠ョ▼搴忓湪浣跨敤fs鍓嶅繀欏誨皢瀹冨惎鍔紒
鎺ヤ笅鏉ョ湅鐪婼EH鐨勫洖璋冨嚱鏁?br />_Handler proc _lpExecptionRecord, _lpSEH,lp_context,lp_DispatcherContext
 
_lpExecptionRecord鎸囧悜涓涓狤XECPTION_RECORD緇撴瀯銆?br />lp_context 鎸囧悜涓涓狢ONTEXT緇撴瀯銆?br />_lpSEH  鎸囧悜娉ㄥ唽鍥炶皟鍑芥暟鏃朵嬌鐢ㄧ殑EXXCEPTION_REGISTRATION緇撴瀯鐨勫湴鍧銆?br />榪斿洖鍊兼湁鍥涚鍙栧鹼細
ExecptionContinueExecution ( 0 錛氱郴緇熷皢綰跨▼鐜璁劇疆涓篲lpContext鎸囧悜鐨凜ONTEXT緇撴瀯騫剁戶緇墽琛屻?br />ExceptionContinueSearch錛?錛夛細鍥炶皟鍑芥暟鎷掔粷澶勭悊榪欎釜寮傚父錛岀郴緇熼氳繃EXECPTION_REGISTRATION緇撴瀯鐨刾rev瀛楁寰楀埌鍓嶄竴涓洖璋冨嚱鏁扮殑鍦板潃騫惰皟鐢ㄥ畠銆?br />ExecptionNestedExecption 錛?錛夛細鍙戠敓寮傚父宓屽銆?br />ExecptionCollidedUnwind  錛?錛夛細寮傚父灞曞紑鎿嶄綔銆傝繖涓涓儴鍒嗕笉鍋氬璁詫紝鏈夊叴瓚g殑鍙互鐪嬬湅緗椾簯褰殑涔︼紝鍏跺疄鏄緢閲嶈鐨勪竴閮ㄥ垎銆?br />濡傛灉涓涓▼搴忔棦鏈夌瓫閫夊櫒寮傚父澶勭悊鍙堟湁SEH寮傚父澶勭悊錛岃屼笖緋葷粺榪樻湁榛樿鐨勫紓甯稿鐞嗘満鍒訛紝閭d箞浠栦滑琚皟鐢ㄧ殑鍏堝悗嬈″簭鏄庝箞鏍風殑鍛紵
鍙戠敓寮傚父鏃剁郴緇熺殑澶勭悊欏哄簭(by Jeremy Gordon): 
    1.緋葷粺棣栧厛鍒ゆ柇寮傚父鏄惁搴斿彂閫佺粰鐩爣紼嬪簭鐨勫紓甯稿鐞嗕緥紼?濡傛灉鍐沖畾搴旇鍙戦?騫朵笖鐩爣紼嬪簭姝e湪琚皟璇?鍒欑郴緇熸寕璧風▼搴忓茍鍚戣皟璇曞櫒鍙戦丒XCEPTION_DEBUG_EVENT娑堟伅.鍛靛懙,榪欎笉鏄濂藉彲浠ョ敤鏉ユ帰嫻嬭皟璇曞櫒鐨勫瓨鍦ㄥ悧? 
    2.濡傛灉浣犵殑紼嬪簭娌℃湁琚皟璇曟垨鑰呰皟璇曞櫒鏈兘澶勭悊寮傚父,緋葷粺灝變細緇х畫鏌ユ壘浣犳槸鍚﹀畨瑁呬簡綰跨▼鐩稿叧鐨勫紓甯稿鐞嗕緥紼?濡傛灉浣犲畨瑁呬簡綰跨▼鐩稿叧鐨勫紓甯稿鐞嗕緥紼?緋葷粺灝辨妸寮傚父鍙戦佺粰浣犵殑紼嬪簭seh澶勭悊渚嬬▼,浜ょ敱鍏跺鐞?
    3.姣忎釜綰跨▼鐩稿叧鐨勫紓甯稿鐞嗕緥紼嬪彲浠ュ鐞嗘垨鑰呬笉澶勭悊榪欎釜寮傚父,濡傛灉浠栦笉澶勭悊騫朵笖瀹夎浜嗗涓嚎紼嬬浉鍏崇殑寮傚父澶勭悊渚嬬▼,鍙氦鐢遍摼璧鋒潵鐨勫叾浠栦緥紼嬪鐞? 
    4.濡傛灉榪欎簺渚嬬▼鍧囬夋嫨涓嶅鐞嗗紓甯?濡傛灉紼嬪簭澶勪簬琚皟璇曠姸鎬?鎿嶄綔緋葷粺浠嶄細鍐嶆鎸傝搗紼嬪簭閫氱煡debugger. 
    5.濡傛灉紼嬪簭鏈浜庤璋冭瘯鐘舵佹垨鑰卍ebugger娌℃湁鑳藉澶勭悊,騫朵笖浣犺皟鐢⊿etUnhandledExceptionFilter瀹夎浜嗘渶鍚庡紓 甯稿鐞嗕緥紼嬬殑璇?緋葷粺杞悜瀵瑰畠鐨勮皟鐢? 
6.濡傛灉浣犳病鏈夊畨瑁呮渶鍚庡紓甯稿鐞嗕緥紼嬫垨鑰呬粬娌℃湁澶勭悊榪欎釜寮傚父,緋葷粺浼氳皟鐢ㄩ粯璁ょ殑緋葷粺澶勭悊紼嬪簭,閫氬父鏄劇ず涓涓璇濇, 浣犲彲浠ラ夋嫨鍏抽棴鎴栬呮渶鍚庡皢鍏墮檮鍔犲埌璋冭瘯鍣ㄤ笂鐨勮皟璇曟寜閽?濡傛灉娌℃湁璋冭瘯鍣ㄨ兘琚檮鍔犱簬鍏朵笂鎴栬呰皟璇曞櫒涔熷鐞嗕笉浜?緋葷粺灝辮皟鐢‥xitProcess緇堢粨紼嬪簭. 
    7.涓嶈繃鍦ㄧ粓緇撲箣鍓?緋葷粺浠嶇劧瀵瑰彂鐢熷紓甯哥殑綰跨▼寮傚父澶勭悊鍙ユ焺鏉ヤ竴嬈″睍寮,榪欐槸綰跨▼寮傚父澶勭悊渚嬬▼鏈鍚庢竻鐞嗙殑鏈轟細.

璇翠簡榪欎箞澶氫綘涔熻浼氶棶SEH寮傚父澶勭悊鍒板簳鏈変粈涔堢敤澶勫憿錛熷懙鍛碉紝涓斿惉灝忕敓鎱㈡參閬撴潵~~~
絎竴閬撹彍錛氱梾姣掔▼搴忓閥鐢⊿EH
榪欓噷綆鍗曠殑璇翠竴涓嬪浣曞埄鐢⊿EH寮傚父澶勭悊紼嬪簭鏉ヨ翰閬夸笅姣掕蔣浠剁殑鍙嶇梾姣掑紩鎿庛備竴涓弽鐥呮瘨寮曟搸鍦ㄤ竴涓▼搴忚繍琛岀殑鏃跺欎細妯℃嫙紼嬪簭鐨勪唬鐮侊紝褰撳彂鐜扮▼搴忎唬鐮佺殑鐤戠偣姣旇緝澶氱殑鏃跺欎細鎶ュ憡鎴愮梾姣掋傜湅鐪嬩笅闈㈣繖孌電▼搴忥細
start:call Set_SEH;榪欏彞鍏跺疄灝辨槸 push offset CONTINUE
;      JMP Set_SEH
CONTINUE:mov esp, [esp+8]; [ESP+8]瀛樺偍鐨勬槸鏃х殑鍫嗘爤鍦板潃銆?br />push offset Start_Virus ;----_ 鎶奡tart_Virus 鐨勫湴鍧鍘嬫爤錛屽綋浣滆繑鍥炲湴鍧
ret;----璺沖埌Start_Virus鍘伙紝鏄笉鏄緢magic? 

Set_SEH:sub edx, edx            ;Edx =0 
Assume fs:nothing 
push dword ptr fs:[edx];鎶婃寚鍘?nbsp;_EXCEPTIONAL_REGISTRATION_RECORD 緇撴瀯鐨勬寚閽堝叆鏍?br />mov fs:[edx], esp;瀹夎涓涓猻eh
mov [edx],edx;寮曡搗涓涓唴瀛樿鍐欏啿紿侊紝鍙戠敓寮傚父鍥犱負edx=0 
;濡傛灉鍙嶇梾姣掑紩鎿庝笉澶勭悊寮傚父錛屼笉榪涘叆seh 澶勭悊紼嬪簭(鍗?nbsp;CONTINUE: 錛岀戶緇ā 
;鎷熶笅涓寚浠わ紝涔熷氨鏄痡mp start錛岄偅涔堝氨榪涘叆涓涓寰幆錛屽彲鑳戒細寮曡搗姝繪満銆?nbsp;              
jmp start       
Start_Virus:    .....
鏄笉鏄緢綆鍗曞憿錛熷氨鏄鍙嶇梾姣掑紩鎿庝笉澶勭悊榪欎釜浜轟負鐨勫紓甯告椂榪涘叆姝誨驚鐜瘇錛侊紒
絎簩閬撹彍錛歍EB鍙嶈窡韙垵鎺?br />濡傛灉浣犵殑璁版у濂界殑璇濅竴瀹氳寰椾笂闈粙緇嶈繃鐨凾EB錛圱IB錛夌嚎紼嬩俊鎭潡緇撴瀯涓湁榪欎箞涓鍙ワ細
PVOID*  pProcess;      // 30h Pointer to owning process database 
榪?涓亸縐誨湴鍧澶勭殑鍐呭闈炲父鏈夌敤錛屽畠鎸囧悜鏈嚎紼嬬殑鎷ユ湁鑰呯殑 PDB(Process Database) 鐨勭嚎鎬у湴鍧銆傚綋浣犵敤鍔ㄦ佽皟璇曞櫒錛屼緥 濡?nbsp;OllyDbg 鐨勬椂鍊欙紝璋冭瘯鍣ㄦ槸鎶婅皟璇曠殑瀵硅薄浣滀負涓涓瓙綰跨▼榪涜璺熻釜鐨勶紝鍦ㄨ繖縐嶆儏鍐典笅錛岃璋冭瘯鐨勫璞$殑“鎷ユ湁鑰?#8221;灝辨槸璋冭瘯鍣ㄦ湰韜紝涔熷氨鏄錛屽畠 鐨?nbsp;TEB 鐨?nbsp;30h 澶勭殑鍋忕Щ鎸囧悜鐨勫唴瀹硅偗瀹氫笉涓?nbsp;0 錛岃繖鏍鳳紝鎴戜滑灝卞彲浠ュ埄鐢ㄨ繖涓鐐癸紝鍒ゆ柇 30h 鍋忕Щ鎸囧悜鐨勫唴瀹癸紝鏉ュ垽鏂槸鍚︽湁璋冭瘯鍣ㄨ窡韙?nbsp;
鏈鍚庣粰鍑轟竴涓?nbsp;Anti-Debug 鐨勪緥瀛愮▼搴忥紝鐢?nbsp;MASM 緙栬瘧瀹屾垚鍚庯紝璇風敤 OllyDbg 鏉ュ姞杞借皟璇曚竴涓嬶紝鐪嬬湅涓庢甯哥殑榪愯緇撴灉鏈変粈涔堜笉鍚屻?nbsp;
;********************************************************* 
;紼嬪簭鍚嶇О錛氭紨紺哄埄鐢?nbsp;TEB 緇撴瀯榪涜 Anti-Debug 
;          璇風敤 OllyDbg 榪涜璋冭瘯 
;閫傜敤OS錛歐indows NT/2K/XP 
;浣滆咃細緗楄仾 
;鏃ユ湡錛?003-2-9 
;鍑哄錛?img alt="::URL::" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" hspace="2" />http://www.LuoCong.com錛堣佺綏鐨勭激綰峰ぉ鍦幫級  
;娉ㄦ剰浜嬮」錛氬嬈茶漿杞斤紝璇蜂繚鎸佹湰紼嬪簭鐨勫畬鏁達紝騫舵敞鏄庯細 
;杞澆鑷?#8220;鑰佺綏鐨勭激綰峰ぉ鍦?#8221;錛?img alt="::URL::" src="http://www.blogcn.com/images/aurl.gif" align="absBottom" border="0" hspace="2" />http://www.LuoCong.com錛?/a>  
;********************************************************* 

.386 
.model flat, stdcall 
option casemap:none 

include /masm32/include/windows.inc 
include /masm32/include/kernel32.inc 
include /masm32/include/user32.inc 
includelib /masm32/lib/kernel32.lib 
includelib /masm32/lib/user32.lib 

.data 
szCaption  db  "Anti-Debug Demo by LC, 2003-2-9", 0 
szDebugged  db  "Hah, let me guess... U r dEBUGGINg me! ", 0 
szFine      db  "Good boy, no dEBUGGEr detected!", 0 

.code 
main: 
  assume  fs:nothing
  mov    eax, fs:[30h]              ;鎸囧悜 PDB(Process Database)
  movzx  eax, byte ptr [eax + 2h]錛涙棤絎﹀彿鏁板甫闆舵墿灞?br />  or      al, al
  jz      _Fine
_Debugged:
  push    MB_OK or MB_ICONHAND
  push    offset szCaption
  push    offset szDebugged
  jmp    _Output
_Fine:
  push    MB_OK or MB_ICONINformATION
  push    offset szCaption
  push    offset szFine
_Output: 
  push    NULL
  call    MessageBoxA
  invoke  ExitProcess, 0
 end main
絎笁閬撹彍錛氬埄鐢⊿EH鎵цshellcode
鍋囪寮傚父澶勭悊渚嬬▼鍏ュ彛00401053,紼嬪簭鍒氬紑濮嬫墽琛屾椂esp鏄?012ffc4,浠ュ墠鐨刦s:[0]鏄?012ffe0
寤虹珛浜員IB緇撴瀯鐨勭涓涓垚鍛樺悗鍫嗘爤鐨勬儏鍐靛涓?

  鍐呭瓨浣庡湴鍧
  
| E0 |12ffbc(esp)
| FF |
| 12 |  --ERR緇撴瀯鐨勭涓涓垚鍛?br />|_00_|
| 53 |12ffc0
| 10 |
| 40 |  --ERR緇撴瀯鐨勭浜屼釜鎴愬憳
| 00 |

  鍐呭瓨楂樺湴鍧

  濂戒簡鐒跺悗紼嬪簭CALL涓涓嚱鏁?鍑芥暟閲岄潰鏈変竴涓眬閮ㄥ彉閲忓茍涓斿湪寰鍏跺垎閰嶇殑絀洪棿涓啓鍏ョ殑鏁版嵁鏃朵駭鐢熸孩鍑?榪欐椂鍫嗘爤濡備笅

____
|    |12f000 灞閮ㄥ彉閲忓垎閰嶇殑絀洪棿,騫朵笖鍚?2ffc0鏂瑰悜婧㈠嚭浜?
|    |
....
....
|_EBP|12ffb4 鍑芥暟涓繚瀛樿佺殑EBP
| xx |
| xx |
| xx |
|_EIP|12ffb8 call鍑芥暟鏃禘IP榪涙爤
| xx |
| xx |
|_xx_|
| E0 |12ffbc(esp)   {褰揝EH璧蜂綔鐢ㄧ殑鏃跺橢BX鍒氬ソ鎸囧悜榪欎釜鍦板潃(涔熷彲璇存繪槸鎸囧悜褰撳墠ERR緇撴瀯)}
| FF |
| 12 |  --ERR緇撴瀯鐨勭涓涓垚鍛?br />|_00_|
| 53 |12ffc0
| 10 |
| 40 |  --ERR緇撴瀯鐨勭浜屼釜鎴愬憳
|_00_|
|    |12ffc4
   緇?緇湅,鍋囪婧㈠嚭浠g爜涓鐩村埌浜?2ffc4,鐒跺悗call鐨勫嚱鏁拌榪斿洖浜?鍥犱負淇濆瓨鐨凟IP琚孩鍑轟唬鐮佷唬鏇挎墍浠ョ▼搴忓嚭閿?涓嶄細涓嶅嚭閿欏惂?),榪欐牱ESH寮濮?璧蜂綔鐢ㄤ簡(娉?鍦ㄨ繖鏈熼棿緋葷粺瑕佹墽琛屼竴浜涙搷浣?鎵浠BX鎵嶄細鎸囧悜褰撳墠ERR).榪欐牱涓鏉ョ▼搴忓氨浼氳煩鍒?2ffc0閲岀殑鍦板潃鍘繪墽琛?鑰?2ffc0閲岀殑涓滀笢 鏃╁凡涓嶆槸鍘熸潵鐨?0401053浜?榪欐牱鎴戜滑涓嶅氨鏀瑰彉浜嗙▼搴忕殑嫻佸悜浜嗕箞.12ffc0涓鍐欏叆浠涔堝唴瀹瑰憿?搴旀槸鍐呭瓨涓璊MP EBX鐨勪唬鐮佺殑鍦板潃.榪欐牱璺?浜?涓嬪悗鏈緇堝氨浼氳煩鍒?2ffbc鍘繪墽琛?榪欎釜鍥涘瓧鑺傚彲鏄疂璐電殑鍟?img src="http://www.blogcn.com/images/smile.gif" alt="" border="0" hspace="2" vspace="2" />鐜板湪鍋囪JMP EBX榪欎釜鎸囦護鍦ㄥ唴瀛樹腑鐨勫湴鍧鏄?x77e33f4d
閭d笅鍏蜂綋鐪嬩竴涓嬬幇鍦ㄥ爢鏍堢殑鎯呭喌:

| EB |12ffbc(esp)   {褰揈SH璧蜂綔鐢ㄧ殑鏃跺橢BX鍒氬ソ鎸囧悜榪欎釜鍦板潃(涔熷彲璇存繪槸鎸囧悜褰撳墠ERR緇撴瀯)}
| 06 |
| 90 |  --ERR緇撴瀯鐨勭涓涓垚鍛?鎵цJMP EBX鍚庡氨鍒拌繖鍎挎潵鎵ц浜?EB 06鏄煭璺寵漿JMP 12FFC4鐨勬満鍣ㄧ爜)
|_90_|  鍚庨潰鐨?0鏄痭op絀烘寚浠ょ殑鏈哄櫒鐮?
| 4D |12ffc0
| 3F |
| E3 |  --ERR緇撴瀯鐨勭浜屼釜鎴愬憳,鍑洪敊澶勭悊鍑芥暟鐨勫叆鍙e湴鍧(鐜板湪鎴愪簡JMP EBX鐨勫湴鍧)
|_77_|
|    |12ffc4
....

  濂界幇鍦ㄦ潵鐪嬬湅12ffc4閲岄潰鏈変簺浠涔堜唬鐮?(綆鍗曠殑璇磋繖孌典唬鐮佺殑浣滅敤鏄綆楃湡姝g殑shellcode鐨勮搗濮嬪湴鍧,鐒跺悗璺寵繃鍘繪墽琛?

浣庡湴鍧

|    |12f000(shellcode寮濮嬪湴鍧)
....
....
| 81 |12ffc4
| C3 |  add ebx,FFFFF03Ch(ebx=12ffc4,鎸囦護闀垮害6,浣滅敤璁$畻璁$畻shellcode鍦板潃)
| 3C |
| F0 |
| FF |
| FF |
| FF |12ffca jmp ebx
| D3 |  

楂樺湴鍧

 
嫻嬭瘯紼嬪簭

-------------------------SEH.ASM------------------
.386
.model flat,stdcall
option casemap:none

include        ../include/user32.inc
includelib    ../lib/user32.lib
include        ../include/kernel32.inc
includelib    ../lib/kernel32.lib



.data
hello        db '鍒╃敤涓涓INI鏂囦歡鐨凙PI鏉ユ紨紺篧IN2000鏈湴婧㈠嚭',0
lpFileName    db './seh.ini',0            
lpAppName    db 'iam',0
lpKeyName    db 'czy',0            
lpDefault    db 'ddd',0
szCap     db "SEH TEST",0
szMsgOK db "OK,the exceptoin was handled by final handler!",0
szMsgERR1 db "It would never Get here!",0

.code

testov    proc
    local   lpReturnedString[2224] : byte    ;榪斿洖鐨勫瓧涓叉悶鎴愭湰鍦板彉閲忚繖鏍峰氨鍜孋璇█涓鏍蜂簡,瀹冩槸鍦ㄦ爤涓?nbsp;   
    invoke    GetPrivateProfileString,offset    lpAppName,offset錛宭pKeyName,offset lpDefault,ADDR lpReturnedString,2249,offset lpFileName    
    invoke    MessageBox,0,addr lpReturnedString,addr lpReturnedString,1
    ret 
testov    endp
    
start:
    ASSUME fs:NOTHING
    invoke  MessageBox,0,addr szMsgERR1,addr szCap,30h+1000h ;涓嬫柇鐐?nbsp;   
    push    offset Final_Handler    ;鍘嬪叆姝e父鐨勫嚭閿欏鐞嗙▼搴忓叆鍙e湴鍧
    push    FS:[0]                  ;鎶婂墠涓涓猅IB鐨勫湴鍧鍘嬪叆
    mov    fs:[0],esp
    call    testov    
    pop     fs:[0]                     ;榪樺師FS:[0]     
    
Final_Handler:   ;鐢變簬婧㈠嚭浜嗕笅闈㈢殑浠g爜涓嶄細琚墽琛?
       invoke       MessageBox,0,addr szMsgOK,addr szCap,30h
       invoke       ExitProcess,0
       mov       eax,1
       ret
end start
錚?br />-----------------end-------------

1濡備綍鏇村ソ鐨勫湪鍐呭瓨涓壘JMP EBX鐨勪唬鐮?
     鍦╯oftice涓墽琛孲 10:0 L FFFFFFFF FF D3灝卞彲浠ヤ簡,浣嗗疄闄呬笂榪欐牱鎵懼埌鐨?br />鍦板潃鍙兘涓嶈兘鎵ц浠g爜.鎵浠ョ敤涓嬮潰鐨勬柟娉?
   map32 kernel32(鍦ㄥ綋鍓嶈繘紼嬩腑鏌ユ壘鏄犲皠鐨刱ernel32 DLL鐨勪俊鎭?   
涓鑸湁濡備笅鏄劇ず:
  Owner        Obj Name    Obj#    Address        Size     TYPE
kernel32    .text        0001    001b:77b61000    0005d1ae code RO
......
  鐒跺悗
S 77b61000 L 5d1ae FF D3
濡傛灉鏄劇ず濡備笅璇存槑鎵懼埌浜?
  Pattern Found at 0023:77e61674 ....

2)鍏充簬緙撳啿鍖虹殑澶у皬鐨勯棶棰?
  鍒╃敤SEH鐨勫姙娉曞氨璧風爜瑕佽鎴?000涓瓧鑺傚,浣犵殑shellcode鎵嶄笉浼氳涓嶇煡鍝潵鐨勬暟鎹鐩?
榪欓亾鑿渃zy鍋氱殑涓嶅ソ鍚冿細錛堟垜鎰熻鐞嗚В璧鋒潵鏈変簺鍥伴毦~錛佸洜涓哄叧浜庣紦鍐插尯婧㈠嚭鑷繁鎺ヨЕ鐨勫お灝戯紝涓嶈繃濂戒笢瑗胯淇濈暀鐨勶紝浠ュ悗鍥炶繃澶寸湅錛?br />絎洓閬撹彍錛氱敤 SEH 鎶鏈疄鐜?nbsp;API Hook
榪欎竴閮ㄥ垎涓嶆兂灞曞紑浜嗭紝緇欏ぇ瀹朵竴涓摼鎺ュ惂銆?br />
::URL::
http://www.luocong.com/articles/show_article.asp?Article_ID=25

鏈鍚庝綔涓虹粨鏉熻璇磋鐨勭己鐐瑰惂錛氾級涓涓漢鍙湁姝h鑷繁鐨勭己鐐規墠鑳戒笉鏂湴榪涙錛佸懙鍛?br />鍦?SEH寮傚父澶勭悊閾句腑鏈鍚庝竴涓瑁呰澆鐨凷EH寮傚父澶勭悊紼嬪簭鎬繪槸琚涓涓皟鐢紝鎯蟲兂濡傛灉鑷繁鑺變簡涓涓槦鏈熸墠鍐欏嚭鏉ヤ竴涓紓甯稿鐞嗙▼搴忥紝鑳藉瀹岀編澶勭悊鎵鏈夊紓甯?騫?甯屾湜寮傚父鍏ㄩ儴鐢變綘鏉ュ鐞?浣嗗緢涓嶅垢,姣斿浣犺皟鐢ㄤ簡涓涓閮ㄦā鍧?鑰岃繖涓ā鍧楄嚜宸卞畨瑁呬簡涓涓猽gly鐨剆eh澶勭悊渚嬬▼,浠栫殑鍔ㄤ綔鏄彧瑕佹湁寮傚父鍙戠敓灝辯畝鍗曞湴緇?姝㈢▼搴忥紝鍝堝搱錛岄偅灝辨鎮勬倓浜嗐傚張姣斿浣犳兂鍦ㄤ綘鐨勫姞澹崇▼搴忛噷闈㈠姞瀵嗙洰鏍囩▼搴忎唬鐮佹,鐒跺悗鍙戠敓鏃犳晥鎸囦護寮傚父鐨勬椂鍊欑敤浣犺嚜宸卞畨瑁呯殑澶勭悊鍙ユ焺鏉ヨВ瀵嗕唬鐮佹緇х畫鎵?琛?鍚搗鏉ヨ繖鐨勭‘鏄竴涓ソ涓繪剰,浣嗛仐鎲劇殑鏄ぇ澶氭暟C/C++浠g爜閮界敤_try{}_except{}鍧楁潵淇濊瘉鍏舵紜繍琛?鑰岃繖浜涘紓甯稿鐞嗕緥紼嬫槸鍦ㄤ綘澹蟲敞鍐?鐨勪緥紼嬩箣鍚庡畨瑁呯殑,鍥犺屼篃灝卞湪閾劇殑鍓嶉潰,鏃犳晥鎸囦護涓鎵ц,棣栧厛鏄疌/C++緙栬瘧鍣ㄦ湰韜彁渚涚殑澶勭悊渚嬬▼鎴栬呯▼搴忓叾浠栫殑寮傚父澶勭悊渚嬬▼鏉ュ鐞?鍙兘綆鍗曠粨鏉熺▼搴?鎴栬?...
濂界瘡錛亊~~~~~
鍐欎簡涓ゅぉ錛岄敊浜嗭紝搴旇鏄壀鎺?娑堝寲浜嗕袱澶╋紝鏈夊緢澶氱殑紼嬪簭鍜屾枃瀛楁槸浠巋ume,鑰佺綏錛岃繕鏈塩zy閭i噷“鍓界獌”鐨勶細錛夊笇鏈涢珮鎵嬩滑涓嶈鐢熸皵~~澶╀笅涔︾睄涓澶ф妱銆備綘浠殑蹇呭皢鏄垜鐨勶紝褰撶劧鎴戠殑涔熶細鍏變韓緇欎綘浠殑銆傚懙鍛碉紝鐜板湪榪樹笉琛岋紝綰у埆涓嶅鍟娿?/div>杞嚜:
http://blog.csdn.net/toberooter/article/details/308365


]]>
WINDOWS 7 閰嶇疆椹卞姩寮鍙戠幆澧冿紙wdk7.60錛?/title><link>http://m.shnenglu.com/guojingjia2006/archive/2011/03/19/142211.html</link><dc:creator>灝忔灉瀛?/dc:creator><author>灝忔灉瀛?/author><pubDate>Sat, 19 Mar 2011 08:48:00 GMT</pubDate><guid>http://m.shnenglu.com/guojingjia2006/archive/2011/03/19/142211.html</guid><wfw:comment>http://m.shnenglu.com/guojingjia2006/comments/142211.html</wfw:comment><comments>http://m.shnenglu.com/guojingjia2006/archive/2011/03/19/142211.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://m.shnenglu.com/guojingjia2006/comments/commentRss/142211.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/guojingjia2006/services/trackbacks/142211.html</trackback:ping><description><![CDATA[<div id="hvzpftn" class="postTitle"> <a id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_0" class="postTitle2"><br /></a> </div> <div id="hvzpftn" class="postCon"> <p>1.  瀹夎VS2010,WDK7.60錛圙RMWDK_EN_7600_1錛?/p> <p>2.  鏂板緩VC 鎺у埗鍙伴」鐩?閫夋嫨涓虹┖欏圭洰) </p> <p><a ><img src="http://images.cnblogs.com/cnblogs_com/korykim/201102/201102011957245059.jpg" alt="1_thumb1" title="1_thumb1" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px none;" border="0" height="337" width="544" /></a></p> <p>3.  鏂板緩欏圭洰閰嶇疆“driver” 錛岀偣鍑諱笅鎷夋寜閽?鐐瑰嚮錛堥厤緗鐞嗗櫒錛?/p> <p><a ><img src="http://images.cnblogs.com/cnblogs_com/korykim/201102/201102011957276752.jpg" alt="6_thumb5" title="6_thumb5" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px none;" border="0" height="140" width="311" /></a></p> <p>杈撳叆鍚嶇О錛坉river錛夌偣鍑葷‘瀹氬氨鍙互浜嗭紝鍏朵粬鐨勪笉瑕佸姩鍝︼紒</p> <p><a ><img src="http://images.cnblogs.com/cnblogs_com/korykim/201102/20110201195733934.jpg" alt="3_thumb3" title="3_thumb3" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px none;" border="0" height="355" width="511" /></a></p> <p>瀹屾垚鍚庣殑鏁堟灉錛?/p> <p><a ><img src="http://images.cnblogs.com/cnblogs_com/korykim/201102/201102011957509195.jpg" alt="2_thumb3" title="2_thumb3" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px none;" border="0" height="344" width="504" /></a></p> <p>鐐瑰嚮紜畾鎸夐挳涔嬪悗鍛堢幇鍑烘潵鐨勭敾闈?/p> <p><a ><img src="http://images.cnblogs.com/cnblogs_com/korykim/201102/201102011957596216.jpg" alt="4_thumb6" title="4_thumb6" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px none;" border="0" height="277" width="490" /></a></p> <p>榧犳爣鍙沖嚮鏂板緩鐨刣river灞炴э紝浼氬脊鍑轟互涓嬬獥鍙o紒</p> <p><a ><img src="http://images.cnblogs.com/cnblogs_com/korykim/201102/2011020119582255.jpg" alt="5_thumb1" title="5_thumb1" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px none;" border="0" height="367" width="549" /></a> <br />4.  <span color="#0000ff" style="color: #0000ff;">璁劇疆VC++璺緞 </span></p> <p><<span color="#9b00d3" style="color: #9b00d3;">鎴戞妸wdk瀹夎鍦‥鐩樹笅</span>> <br />a.  閰嶇疆鍙墽琛屾枃浠剁洰褰?E:\WinDDK\7600.16385.1\bin\x86; <br />b.  閰嶇疆鍖呭惈鐩綍錛欵:\WinDDK\7600.16385.1\inc\ddk  <br />                        E:\WinDDK\7600.16385.1\inc\crt<br />                        E:\WinDDK\7600.16385.1\inc\api   <br />c.  閰嶇疆搴撶洰褰?    E:\WinDDK\7600.16385.1\lib\win7\i3865</p> <p><span color="#f79646" style="color: #f79646;"> </span></p> <p><span color="#f79646" style="color: #f79646;">鏂板緩C/C++鏂囦歡 涓嶇劧鏃燙/C++璁劇疆閫夐」</span> </p> <p><鍒氬紑濮嬫垜浠垱寤轟簡涓涓┖鐨勯」鐩墍浠ラ」鐩噷娌℃湁c++鏂囦歡錛岀幇鍦ㄨ鍋氱殑灝辨槸鍦ㄧ┖鐨勯」鐩?婧愭枃浠?娣誨姞涓涓柊寤洪」c++鏂囦歡></p> <p> <span color="#0000ff" style="color: #0000ff;">甯歌  <br /></span>鐩爣鏂囦歡鎵╁睍鍚嶏細.sys          //蹇呴? </p> <p> <br /><span color="#0000ff" style="color: #0000ff;">6.  璁劇疆C/C++閫夐」 <br /></span><span color="#0000ff" style="color: #0000ff;">甯歌閫夐」鍗?/span> <br />1 璋冭瘯淇℃伅鏍煎紡(C7 鍏煎(/Z7)        //鍙? <br />2 璀﹀憡絳夌駭     錛? 綰?/W2)          //鍙? <br />3 灝嗚鍛婅涓洪敊璇?nbsp; (鏄?/wx)         //鍙? <br />  <br /><span color="#0000ff" style="color: #0000ff;">浼樺寲閫夐」鍗?/span> <br />浼樺寲(紱佺敤/Od)                          //鍙? <br />  <br /><span color="#0000ff" style="color: #0000ff;">棰勫鐞嗗櫒</span> <br />棰勫鐞嗗櫒瀹氫箟錛歐IN32=100;_X86_=1;WINVER=0x501;DBG=1         //蹇呴? <br />  <br /><span color="#0000ff" style="color: #0000ff;">浠g爜鐢熸垚 <br /></span>       鍚敤鏈灝忛噸鏂扮敓鎴愶細鍚?nbsp;                                       //鍙?nbsp;    </p> <p>       鍩烘湰榪愯鏃舵鏌ワ細榛樿鍊?nbsp;                                    //鍙? <br />       榪愯鏃跺簱錛氬綰跨▼璋冭瘯(/MTd)  鎴?nbsp; 澶氱嚎紼?/MT)                 //寤鴻閫?span color="#0000ff" style="color: #0000ff;"> <鏈漢閫夋嫨鐨勬槸澶氱嚎紼嬭皟璇?/MTd)> <br /></span>       緙撳啿鍖哄畨鍏ㄦ鏌ワ細鍚?nbsp;                                           //鍙? <br />  (鍙伩鍏嶅嚭鐜?nbsp; LINK : error LNK2001:  鏃犳硶瑙f瀽澶栭儴絎﹀彿  __security_cookie) <br /><span color="#0000ff" style="color: #0000ff;">楂樼駭 <br /></span>     璋冪敤綰﹀畾  __stdcall(/Gz)                                       //蹇呴? <br />  <br /><span color="#0000ff" style="color: #0000ff;">7.  閾炬帴鍣ㄨ緗? <br /></span><span color="#0000ff" style="color: #0000ff;">甯歌</span> <br />     鍚敤澧為噺閾炬帴錛氬惁(/INCREMENTAL:NO)                           //寤鴻 閫変笂 <br />     蹇界暐瀵煎叆搴擄細鏄?nbsp;                                                 // 鍙?nbsp; <br />     ( 璁劇疆涓烘鍊兼椂錛屽繀欏誨湪闄勫姞搴撶洰褰曚腑鍔狅細 E:\WinDDK\7600.16385.1\lib\win7\i3865  榪欐牱欏圭洰灝變笉浼氫緷璧?IDE 鐜鐨勮 緗?  </p> <p>     濡傛灉鍚?nbsp; (  璁劇疆涓烘鍊兼椂錛屽皢渚濊禆  IDE  鐨勭幆澧冪殑鐩稿叧璁劇疆  ) <br />  <br /><span color="#0000ff" style="color: #0000ff;">杈撳叆</span> <br /><span color="#0000ff" style="color: #0000ff;">闄勫姞渚濊禆欏? <br /></span>ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB       //蹇呴?nbsp;   </p> <p>//NT寮忛┍鍔?nbsp; ntoskrnl.lib    WDM寮忛┍鍔?nbsp;   wdm.lib <br />( HalXXX 鍑芥暟鍦℉al.lib錛?WmiXXX 鍑芥暟鍦?nbsp; wmilib.lib  錛?NdisXXX鍑芥暟鍦?nbsp; ndis.lib ) <br />(  蹇呰鏃墮渶瑕佸鍔犲井杞殑鏍囧噯搴?nbsp; MSVCRT.LIB MSVCRTD.LIB(璋冭瘯搴? LIBCMT.LIBIBCMTD.LIB(璋冭瘯搴? ) <br />  (  濡傛灉婧愮爜涓湁  source  鏂囦歡錛岄偅涔堣鏂囦歡鐨?nbsp; TARGETLIBS  瀛楁浼氬垪鍑鴻欏?鐩渶瑕佺殑搴?nbsp; ) </p> <p>蹇界暐鎵鏈夐粯璁ゅ簱錛?nbsp;   鏄?(/NODEFAULTLIB)                 //蹇呴?nbsp;  </p> <p><span color="#0000ff" style="color: #0000ff;">娓呭崟鏂囦歡</span>錛? <br />  鍚敤鐢ㄦ埛璐︽埛鎺у埗錛圲AC錛?nbsp;  鍚?nbsp; //蹇呴?nbsp; </p> <p>涓嶇劧浼氬嚭鐜?nbsp; >LINK : fatal error LNK1295: “/MANIFESTUAC”涓?#8220;/DRIVER”瑙勮寖涓嶅吋瀹癸紱閾炬帴鏃朵笉浣跨敤“/MANIFESTUAC”   <br />  <br />     <span color="#0000ff" style="color: #0000ff;">璋冭瘯</span>錛? <br />鐢熸垚璋冭瘯淇℃伅  鏄?/DEBUG)                                              //鍙? <br />鐢熸垚鏄犲儚鏂囦歡錛氭槸(/MAP)                                               //鍙? <br />鏄犲儚鏂囦歡鍚嶏細$(TargetDir)$(TargetName).map                     //鍙? <br />  <br />    <span color="#0000ff" style="color: #0000ff;">緋葷粺(System) <br /></span>     瀛愮郴緇?  鎺у埗鍙?/SUBSYSTEM:CONSOLE)                                //蹇呴? <br />     鍫嗘爤淇濈暀澶у皬錛?194304                                              //鍙? <br />     鍫嗘爤鎻愪氦澶у皬錛?nbsp; 4096                                                //鍙? <br />     椹卞姩紼嬪簭:    椹卞姩紼嬪簭(/DRIVER)                                        //蹇呴?nbsp;  <br />      <span color="#0000ff" style="color: #0000ff;">楂樼駭錛?/span> <br />    鍏ュ彛鐐癸細DriverEntry                                                    //蹇呴? <br />    闅忔満鍩哄潃:娓呯┖           //<span color="#ff0000" style="color: #ff0000;">鎶婃閲岀殑鏁版嵁鍒犳帀銆傦紙yes涔熶笉鏄痭o涔熶笉鏄氨鏄涓涓共騫插噣鍑鐨勬枃鏈錛?/span>   //蹇呴? <br />    涓嶇劧浼氬嚭鐜?nbsp; e:\xxx.sys : fatal error LNK1295: <br />“/DYNAMICBASE”涓?#8220;/DRIVER”瑙勮寖涓嶅吋瀹癸紱閾炬帴鏃朵笉浣跨敤“/DYNAMICBASE” </p> <p> <br />    鏁版嵁鎵ц淇濇姢(DEP):  娓呯┖ //<span color="#ff0000" style="color: #ff0000;">鎶婃閲岀殑鏁版嵁鍒犳帀銆傦紙yes涔熶笉鏄痭o涔熶笉鏄氨鏄涓涓共騫插噣鍑鐨勬枃鏈錛?/span> //蹇呴?nbsp;  <br />     涓嶇劧浼氬嚭鐜?nbsp; e:\xxx.sys : fatal error LNK1295:        <br />“/NXCOMPAT:NO”涓?#8220;/DRIVER”瑙勮寖涓嶅吋瀹癸紱閾炬帴鏃朵笉浣跨敤“/NXCOMPAT:NO”    </p> <p> </p> <p>璁劇疆鏁堝簲鍜岋細鏄?/RELEASE)                              //鍙? </p> <p>鍩哄潃錛?x10000                                           //寤鴻閫変笂  <br />    <br /> <span color="#d16349" style="color: #d16349;">鍛戒護琛岋細/SECTION:INIT,D /IGNORE:4078</span>        <span color="#ff0000" style="color: #ff0000;">錛堝緩璁笉瑕佸啓榪涘幓錛屼細鎶ラ敊錛侊級</span>                     </p> <p>鏈鍚庣粰鍑轟竴涓秴綰х畝鍗曠殑浠g爜鏉ユ祴璇曚竴涓嬫垜浠厤緗殑鏄惁鎴愬姛錛燂紵</p> <p>#include "ntddk.h"</p> <p>NTSTATUS <br />DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath) <br />{ <br />return STATUS_UNSUCCESSFUL; <br />}</p> <p> </p> <p>濡傛灉娌℃湁鎶ラ敊閭d箞鎭枩浣犻厤緗垚鍔熶簡錛? </p> </div><img src ="http://m.shnenglu.com/guojingjia2006/aggbug/142211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/guojingjia2006/" target="_blank">灝忔灉瀛?/a> 2011-03-19 16:48 <a href="http://m.shnenglu.com/guojingjia2006/archive/2011/03/19/142211.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>PE瀛︿範鎬葷粨http://m.shnenglu.com/guojingjia2006/archive/2010/10/12/129621.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Tue, 12 Oct 2010 09:22:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2010/10/12/129621.htmlhttp://m.shnenglu.com/guojingjia2006/comments/129621.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2010/10/12/129621.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/129621.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/129621.html#include "windows.h"#include <iostream>using namespace std;#define NTSI...  闃呰鍏ㄦ枃

]]>
PE鏂囦歡鏍煎紡(涓?(杞?http://m.shnenglu.com/guojingjia2006/archive/2010/10/12/129615.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Tue, 12 Oct 2010 08:38:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2010/10/12/129615.htmlhttp://m.shnenglu.com/guojingjia2006/comments/129615.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2010/10/12/129615.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/129615.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/129615.html鎽樿

銆銆 Windows NT 3.1寮曞叆浜嗕竴縐嶅悕涓篜E鏂囦歡鏍煎紡鐨勬柊鍙墽琛屾枃浠舵牸寮忋侾E鏂囦歡鏍煎紡鐨勮鑼冨寘鍚湪浜哅SDN鐨凜D涓紙Specs and Strategy, Specifications, Windows NT File Format Specifications錛夛紝浣嗘槸瀹冮潪甯鎬箣鏅︽訂銆?
銆銆 鐒惰岃繖涓鐨勬枃。迤堟湭鎻愪緵鑳鲥鐨勪俊鎭Q屾墍浠ュ紑鍙戣呬滑鏃犳硶寰堝ソ鍦板紕鎳侾E鏍煎紡銆傛湰鏂囨棬鍦ㄨВ鍐寵繖涓闂錛屽畠浼氬鏁翠釜鐨凱E鏂囦歡鏍煎紡浣滀竴涓崄鍒嗗交搴曠殑瑙i噴錛屽彟澶栵紝鏈枃涓繕甯︽湁瀵規墍鏈夊繀闇緇撴瀯鐨勬弿榪頒互鍙婄ず鑼冨浣曚嬌鐢ㄨ繖浜涗俊鎭殑婧愮爜紺轟緥銆?
涓轟簡鑾峰緱PE鏂囦歡涓墍鍖呭惈鐨勯噸瑕佷俊鎭紝鎴戠紪鍐欎簡涓涓悕涓篜EFILE.DLL鐨勫姩鎬侀摼鎺ュ簱錛屾湰鏂囦腑鎵鏈夊嚭鐜扮殑婧愮爜紺轟緥浜﹀潎鎽樿嚜浜庢銆傝繖涓狣LL鍜屽畠鐨勬簮浠? 鐮侀兘浣滀負PEFile紺轟緥紼嬪簭鐨勪竴閮ㄥ垎鍖呭惈鍦ㄤ簡CD涓紙璇戞敞錛氱ず渚嬬▼搴忚鍦∕SDN涓鎵撅紝鏈珯鎭曚笉鎻愪緵錛夛紝浣犲彲浠ュ湪浣犺嚜宸辯殑搴旂敤紼嬪簭涓嬌鐢ㄨ繖涓狣LL錛? 鍚屾牱錛屼綘浜﹀彲浠ヤ緷浣犳墍鎰垮湴浣跨敤騫舵瀯寤哄畠鐨勬簮鐮併傚湪鏈枃鏈熬錛屼綘浼氭壘鍒癙EFILE.DLL鐨勫嚱鏁板鍑哄垪琛ㄥ拰涓涓浣曚嬌鐢ㄥ畠浠殑璇存槑銆傛垜瑙夊緱浣犱細鍙戠幇榪欎簺鍑? 鏁頒細璁╀綘浠庡搴斾粯PE鏂囦歡鏍煎紡鐨勩?

浠嬬粛

Windows鎿嶄綔緋葷粺瀹舵棌鏈榪戝鍔犵殑Windows NT涓哄紑鍙戠幆澧冨拰搴旂敤紼嬪簭鏈韓甯︽潵浜嗗緢澶х殑鏀瑰彉錛岃繖涔嬩腑涓涓渶涓洪噸澶х殑褰撳睘PE鏂囦歡鏍煎紡浜嗐傛柊鐨凱E鏂囦歡鏍煎紡涓昏鏉ヨ嚜浜嶶NIX鎿嶄綔緋葷粺鎵閫氱敤鐨凜OFF 瑙勮寖錛屽悓鏃朵負浜嗕繚璇佷笌鏃х増鏈琈S-DOS鍙奧indows鎿嶄綔緋葷粺鐨勫吋瀹癸紝PE鏂囦歡鏍煎紡涔熶繚鐣欎簡MS-DOS涓偅鐔熸倝鐨凪Z澶撮儴銆?
銆銆 鍦ㄦ湰鏂囦箣涓紝PE鏂囦歡鏍煎紡鏄互鑷《鑰屼笅鐨勯『搴忚В閲婄殑銆傚湪浣犱粠澶村紑濮嬬爺絀舵枃浠跺唴瀹圭殑榪囩▼涔嬩腑錛屾湰鏂囦細璇︾粏璁ㄨPE鏂囦歡鐨勬瘡涓涓粍鎴愰儴鍒嗐?
璁稿鍗曠嫭鐨勬枃浠舵垚鍒嗗畾涔夐兘鏉ヨ嚜浜嶮icrosoft Win32 SDK寮鍙戝寘涓殑WINNT.H鏂囦歡錛屽湪榪欎釜鏂囦歡涓綘浼氬彂鐜扮敤鏉ユ弿榪版枃浠跺ご閮ㄥ拰鏁版嵁鐩綍絳夊悇縐嶆垚鍒嗙殑緇撴瀯綾誨瀷瀹氫箟銆備絾鏄紝鍦╓INNT.H涓己灝戝PE鏂? 浠剁粨鏋勮凍澶熺殑瀹氫箟錛屽湪榪欑鎯呭喌涓嬶紝鎴戝畾涔変簡鑷繁鐨勭粨鏋勬潵瀛樺彇鏂囦歡鏁版嵁銆備綘浼氬湪PEFILE.DLL宸ョ▼鐨凱EFILE.H涓壘鍒拌繖浜涚粨鏋勭殑瀹氫箟錛屾暣濂楃殑 PEFILE.H寮鍙戞枃浠跺寘鍚湪PEFile紺轟緥紼嬪簭涔嬩腑銆?
鏈枃閰嶅鐨勭ず渚嬬▼搴忛櫎浜哖EFILE.DLL紺轟緥浠g爜涔嬪錛岃繕鏈変竴涓崟鐙殑Win32紺轟緥搴旂敤紼嬪簭錛屽悕涓篍XEVIEW.EXE銆傚垱寤鴻繖涓紺轟緥鐩殑鏈変簩錛? 棣栧厛錛屾垜闇瑕佹祴璇昉EFILE.DLL鐨勫嚱鏁幫紝騫朵笖鏌愪簺鎯呭喌瑕佹眰鎴戝悓鏃舵煡鐪嬪涓枃浠訛紱鍏舵錛屽緢澶氳В鍐砅E鏂囦歡鏍煎紡鐨勫伐浣滃拰鐩存帴瑙傜湅鏁版嵁鏈夊叧銆備緥濡傦紝瑕佸紕鎳? 瀵煎叆鍦板潃鍚嶇О琛ㄦ槸濡備綍鏋勬垚鐨勶紝鎴戝氨寰楀悓鏃舵煡鐪?idata孌靛ご閮ㄣ佸鍏ユ槧鍍忔暟鎹洰褰曘佸彲閫夊ご閮ㄤ互鍙婂綋鍓嶇殑.idata孌靛疄浣擄紝鑰孍XEVIEW.EXE灝? 鏄煡鐪嬭繖浜涗俊鎭殑鏈浣崇ず渚嬨?
銆銆 闂茶瘽灝戝彊錛岃鎴戜滑寮濮嬪惂銆?

PE鏂囦歡緇撴瀯

PE鏂囦歡鏍煎紡琚粍緇囦負涓涓嚎鎬х殑鏁版嵁嫻侊紝瀹冪敱涓涓狹S-DOS澶撮儴寮濮嬶紝鎺ョ潃鏄竴涓槸妯″紡鐨勭▼搴忔畫浣欎互鍙婁竴涓狿E鏂囦歡鏍囧織錛岃繖涔嬪悗绱ф帴鐫PE鏂囦歡澶村拰鍙? 澶撮儴銆傝繖浜涗箣鍚庢槸鎵鏈夌殑孌靛ご閮紝孌靛ご閮ㄤ箣鍚庤窡闅忕潃鎵鏈夌殑孌靛疄浣撱傛枃浠剁殑緇撴潫澶勬槸涓浜涘叾瀹冪殑鍖哄煙錛屽叾涓槸涓浜涙販鏉傜殑淇℃伅錛屽寘鎷噸鍒嗛厤淇℃伅銆佺鍙瘋〃淇℃伅銆佽鍙? 淇℃伅浠ュ強瀛椾覆琛ㄦ暟鎹傛垜灝嗘墍鏈夎繖浜涙垚鍒嗗垪浜庡浘1銆?br>
鍥?.PE鏂囦歡鏄犲儚緇撴瀯
浠嶮S-DOS鏂囦歡澶寸粨鏋勫紑濮嬶紝鎴戝皢鎸夌収PE鏂囦歡鏍煎紡鍚勬垚鍒嗙殑鍑虹幇欏哄簭渚濇瀵瑰叾榪涜璁ㄨ錛屽茍涓旇璁虹殑澶ч儴鍒嗘槸浠ョず渚嬩唬鐮佷負鍩虹鏉ョず鑼冨浣曡幏寰楁枃浠剁殑淇℃伅 鐨勩傛墍鏈夌殑婧愮爜鍧囨憳鑷狿EFILE.DLL妯″潡鐨凱EFILE.C鏂囦歡銆傝繖浜涚ず渚嬮兘鍒╃敤浜哤indows NT鏈閰風殑鐗硅壊涔嬩竴鈥斺斿唴瀛樻槧灝勬枃浠訛紝榪欎竴鐗硅壊鍏佽鐢ㄦ埛浣跨敤涓涓畝鍗曠殑鎸囬拡鏉ュ瓨鍙栨枃浠朵腑鎵鍖呭惈鐨勬暟鎹紝鍥犳鎵鏈夌殑紺轟緥閮戒嬌鐢ㄤ簡鍐呭瓨鏄犲皠鏂囦歡鏉ュ瓨鍙朠E鏂囦歡 涓殑鏁版嵁銆?
銆銆 娉ㄦ剰錛氳鏌ラ槄鏈枃鏈熬鍏充簬濡備綍浣跨敤PEFILE.DLL鐨勯偅涓孌點?

MS-DOS澶撮儴/瀹炴ā寮忓ご閮?/strong>

濡備笂鎵榪幫紝PE鏂囦歡鏍煎紡鐨勭涓涓粍鎴愰儴鍒嗘槸MS-DOS澶撮儴銆傚湪PE鏂囦歡鏍煎紡涓紝瀹冨茍闈炰竴涓柊姒傚康錛屽洜涓哄畠涓嶮S-DOS 2.0浠ユ潵灝卞凡鏈夌殑MS-DOS澶撮儴鏄畬鍏ㄤ竴鏍風殑銆備繚鐣欒繖涓浉鍚岀粨鏋勭殑鏈涓昏鍘熷洜鏄紝褰撲綘灝濊瘯鍦╓indows 3.1浠ヤ笅鎴朚S-DOS 2.0浠ヤ笂鐨勭郴緇熶笅瑁呰澆涓涓枃浠剁殑鏃跺欙紝鎿嶄綔緋葷粺鑳藉璇誨彇榪欎釜鏂囦歡騫舵槑鐧藉畠鏄拰褰撳墠緋葷粺涓嶇浉鍏煎鐨勩傛崲鍙ヨ瘽璇達紝褰撲綘鍦∕S-DOS 6.0涓嬭繍琛屼竴涓猈indows NT鍙墽琛屾枃浠舵椂錛屼綘浼氬緱鍒拌繖鏍蜂竴鏉℃秷鎭細“This program cannot be run in DOS mode.”濡傛灉MS-DOS澶撮儴涓嶆槸浣滀負PE鏂囦歡鏍煎紡鐨勭涓閮ㄥ垎鐨勮瘽錛屾搷浣滅郴緇熻杞芥枃浠剁殑鏃跺欏氨浼氬け璐ワ紝騫舵彁渚涗竴浜涘畬鍏ㄦ病鐢ㄧ殑淇℃伅錛屼緥濡傦細“The name specified is not recognized as an internal or external command, operable program or batch file.”
銆銆 MS-DOS澶撮儴鍗犳嵁浜哖E鏂囦歡鐨勫ご64涓瓧鑺傦紝鎻忚堪瀹冨唴瀹圭殑緇撴瀯濡備笅錛?
//WINNT.H
typedef struct _IMAGE_DOS_HEADER { // DOS鐨?EXE澶撮儴
USHORT e_magic; // 欖旀湳鏁板瓧
USHORT e_cblp; // 鏂囦歡鏈鍚庨〉鐨勫瓧鑺傛暟
USHORT e_cp; // 鏂囦歡欏墊暟
USHORT e_crlc; // 閲嶅畾涔夊厓绱犱釜鏁?
USHORT e_cparhdr; // 澶撮儴灝哄錛屼互孌佃惤涓哄崟浣?
USHORT e_minalloc; // 鎵闇鐨勬渶灝忛檮鍔犳
USHORT e_maxalloc; // 鎵闇鐨勬渶澶ч檮鍔犳
USHORT e_ss; // 鍒濆鐨凷S鍊鹼紙鐩稿鍋忕Щ閲忥級
USHORT e_sp; // 鍒濆鐨凷P鍊?
USHORT e_csum; // 鏍¢獙鍜?
USHORT e_ip; // 鍒濆鐨処P鍊?
USHORT e_cs; // 鍒濆鐨凜S鍊鹼紙鐩稿鍋忕Щ閲忥級
USHORT e_lfarlc; // 閲嶅垎閰嶈〃鏂囦歡鍦板潃
USHORT e_ovno; // 瑕嗙洊鍙?
USHORT e_res[4]; // 淇濈暀瀛?
USHORT e_oemid; // OEM鏍囪瘑絎︼紙鐩稿e_oeminfo錛?
USHORT e_oeminfo; // OEM淇℃伅
USHORT e_res2[10]; // 淇濈暀瀛?
LONG e_lfanew; // 鏂癳xe澶撮儴鐨勬枃浠跺湴鍧
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
絎竴涓煙e_magic錛岃縐頒負欖旀湳鏁板瓧錛屽畠琚敤浜庤〃紺轟竴 涓狹S-DOS鍏煎鐨勬枃浠剁被鍨嬨傛墍鏈塎S-DOS鍏煎鐨勫彲鎵ц鏂囦歡閮藉皢榪欎釜鍊艱涓?x5A4D錛岃〃紺篈SCII瀛楃MZ銆侻S-DOS澶撮儴涔嬫墍浠ユ湁鐨勬椂鍊? 琚О涓篗Z澶撮儴錛屽氨鏄繖涓紭鏁呫傝繕鏈夎澶氬叾瀹冪殑鍩熷浜嶮S-DOS鎿嶄綔緋葷粺鏉ヨ閮芥湁鐢紝浣嗘槸瀵逛簬Windows NT鏉ヨ錛岃繖涓粨鏋勪腑鍙湁涓涓湁鐢ㄧ殑鍩熲斺旀渶鍚庝竴涓煙e_lfnew錛屼竴涓?瀛楄妭鐨勬枃浠跺亸縐婚噺錛孭E鏂囦歡澶撮儴灝辨槸鐢卞畠瀹氫綅鐨勩傚浜嶹indows NT鐨凱E鏂囦歡鏉ヨ錛孭E鏂囦歡澶撮儴鏄揣璺熷湪MS-DOS澶撮儴鍜屽疄妯″紡紼嬪簭孌嬩綑涔嬪悗鐨勩?

瀹炴ā寮忔畫浣欑▼搴?/strong>

瀹炴ā寮忔畫浣欑▼搴忔槸涓涓湪瑁呰澆鏃惰兘澶熻MS-DOS榪愯鐨勫疄闄呯▼搴忋傚浜庝竴涓狹S-DOS鐨勫彲鎵ц鏄犲儚鏂囦歡錛屽簲鐢ㄧ▼搴忓氨鏄粠榪欓噷鎵ц鐨勩傚浜? Windows銆丱S/2銆乄indows NT榪欎簺鎿嶄綔緋葷粺鏉ヨ錛孧S-DOS孌嬩綑紼嬪簭灝變唬鏇夸簡涓葷▼搴忕殑浣嶇疆琚斁鍦ㄨ繖閲屻傝繖縐嶆畫浣欑▼搴忛氬父浠涔堜篃涓嶅仛錛岃屽彧鏄緭鍑轟竴琛屾枃鏈紝渚嬪錛?#8220;This program requires Microsoft Windows v3.1 or greater.”褰撶劧錛岀敤鎴峰彲浠ュ湪姝ゆ斁鍏ヤ換浣曠殑孌嬩綑紼嬪簭錛岃繖灝辨剰鍛崇潃浣犲彲鑳界粡甯哥湅鍒板儚榪欐牱鐨勪笢瑗匡細“You can''t run a Windows NT application on OS/2, it''s simply not possible.”
銆銆 褰撲負Windows 3.1鏋勫緩涓涓簲鐢ㄧ▼搴忕殑鏃跺欙紝閾炬帴鍣ㄥ皢鍚戜綘鐨勫彲鎵ц鏂囦歡涓摼鎺ヤ竴涓悕涓篧INSTUB.EXE鐨勯粯璁ゆ畫浣欑▼搴忋備綘鍙互鐢ㄤ竴涓熀浜嶮S-DOS鐨勬湁鏁堢▼搴? 鍙栦唬WINSTUB錛屽茍涓旂敤STUB妯″潡瀹氫箟璇彞鎸囩ず閾炬帴鍣紝榪欐牱灝辮兘澶熷彇浠i摼鎺ュ櫒鐨勯粯璁よ涓恒備負Windows NT寮鍙戠殑搴旂敤紼嬪簭鍙互閫氳繃浣跨敤-STUB:閾炬帴鍣ㄩ夐」鏉ュ疄鐜般?

PE鏂囦歡澶撮儴涓庢爣蹇?/strong>

銆銆 PE鏂囦歡澶撮儴鏄敱MS-DOS澶撮儴鐨別_lfanew鍩熷畾浣嶇殑錛岃繖涓煙鍙槸緇欏嚭浜嗘枃浠剁殑鍋忕Щ閲忥紝鎵浠ヨ紜畾PE澶撮儴鐨勫疄闄呭唴瀛樻槧灝勫湴鍧錛屽氨闇瑕佹坊鍔犳枃浠剁殑鍐呭瓨鏄犲皠鍩哄湴鍧銆備緥濡傦紝浠ヤ笅鐨勫畯鏄寘鍚湪PEFILE.H婧愭枃浠朵箣涓殑錛?
//PEFILE.H
#define NTSIGNATURE(a) ((LPVOID)((BYTE *)a + \
((PIMAGE_DOS_HEADER)a)->e_lfanew))
鍦ㄥ鐞哖E鏂囦歡淇℃伅鐨勬椂鍊欙紝鎴戝彂鐜版枃浠朵箣涓湁浜涗綅緗渶瑕佺粡甯告煡闃呫傛棦鐒惰繖浜涗綅緗粎浠呮槸瀵規枃浠剁殑鍋忕Щ閲忥紝閭d箞鐢ㄥ畯鏉ュ疄鐜拌繖浜涘畾浣嶅氨姣旇緝瀹規槗錛屽洜涓哄畠浠緝涔嬪嚱鏁版湁鏇村ソ鐨勮〃鐜般?
璇鋒敞鎰忚繖涓畯鎵鑾峰緱鐨勬槸PE鏂囦歡鏍囧織錛岃屽茍闈濸E鏂囦歡澶撮儴鐨勫亸縐婚噺銆傞偅鏄敱浜庤嚜Windows涓嶰S/2鐨勫彲鎵ц鏂囦歡寮濮嬶紝.EXE鏂囦歡閮借璧嬩簣浜嗙洰鏍囨搷 浣滅郴緇熺殑鏍囧織銆傚浜嶹indows NT鐨凱E鏂囦歡鏍煎紡鑰岃█錛岃繖涓鏍囧織鍦≒E鏂囦歡澶撮儴緇撴瀯涔嬪墠銆傚湪Windows鍜孫S/2鐨勬煇浜涚増鏈腑錛岃繖涓鏍囧織鏄枃浠跺ご鐨勭涓涓瓧銆傚悓鏍鳳紝瀵逛簬PE鏂囦歡鏍? 寮忥紝Windows NT浣跨敤浜嗕竴涓狣WORD鍊箋?
浠ヤ笂鐨勫畯榪斿洖浜嗘枃浠舵爣蹇楃殑鍋忕Щ閲忥紝鑰屼笉綆″畠鏄摢縐嶇被鍨嬬殑鍙墽琛屾枃浠躲傛墍浠ワ紝鏂囦歡澶撮儴鏄湪DWORD鏍囧織涔嬪悗錛岃繕鏄湪WORD鏍囧織澶勶紝鏄敱榪欎釜鏍囧織鏄惁 Windows NT鏂囦歡鏍囧織鎵鍐沖畾鐨勩傝瑙e喅榪欎釜闂錛屾垜緙栧啓浜咺mageFileType鍑芥暟錛堝涓嬶級錛屽畠榪斿洖浜嗘槧鍍忔枃浠剁殑綾誨瀷錛?
//PEFILE.C
DWORD WINAPI ImageFileType (LPVOID lpFile)
{
/* 棣栧厛鍑虹幇鐨勬槸DOS鏂囦歡鏍囧織 */
if (*(USHORT *)lpFile == IMAGE_DOS_SIGNATURE)
{
/* 鐢盌OS澶撮儴鍐沖畾PE鏂囦歡澶撮儴鐨勪綅緗?*/
if (LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) ==
IMAGE_OS2_SIGNATURE ||
LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) ==
IMAGE_OS2_SIGNATURE_LE)
return (DWORD)LOWORD(*(DWORD *)NTSIGNATURE (lpFile));
else if (*(DWORD *)NTSIGNATURE (lpFile) ==
IMAGE_NT_SIGNATURE)
return IMAGE_NT_SIGNATURE;
else
return IMAGE_DOS_SIGNATURE;
}
else
/* 涓嶆槑鏂囦歡縐嶇被 */
return 0;
}
浠ヤ笂鍒楀嚭鐨勪唬鐮佺珛鍗沖憡璇変簡浣燦TSIGNATURE瀹忔湁澶氫箞鏈夌敤銆傚浜庢瘮杈冧笉鍚屾枃浠剁被鍨嬪茍涓旇繑鍥炰竴涓傚綋鐨勬枃浠剁綾繪潵璇達紝榪欎釜瀹忓氨浼氫嬌榪欎袱浠朵簨鍙樺緱闈炲父綆鍗曘俉INNT.H涔嬩腑瀹氫箟鐨勫洓縐嶄笉鍚屾枃浠剁被鍨嬫湁錛?
//WINNT.H
#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
#define IMAGE_OS2_SIGNATURE 0x454E // NE
#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE
#define IMAGE_NT_SIGNATURE 0x00004550 // PE00
棣栧厛錛學indows鐨勫彲鎵ц鏂囦歡綾誨瀷娌℃湁鍑虹幇鍦ㄨ繖涓鍒楄〃涓紝榪欎竴鐐圭湅璧鋒潵寰堝鎬備絾鏄紝鍦ㄧ◢寰爺絀朵竴涓嬩箣鍚庯紝灝辮兘寰楀埌鍘熷洜浜嗭細闄や簡鎿嶄綔 緋葷粺鐗堟湰瑙勮寖鐨勪笉鍚屼箣澶栵紝Windows鐨勫彲鎵ц鏂囦歡鍜孫S/2鐨勫彲鎵ц鏂囦歡瀹炲湪娌℃湁浠涔堝尯鍒傝繖涓や釜鎿嶄綔緋葷粺鎷ユ湁鐩稿悓鐨勫彲鎵ц鏂囦歡緇撴瀯銆?
銆銆 鐜板湪鎶婃垜浠殑娉ㄦ剰鍔涜漿鍚慦indows NT PE鏂囦歡鏍煎紡錛屾垜浠細鍙戠幇鍙鎴戜滑寰楀埌浜嗘枃浠舵爣蹇楃殑浣嶇疆錛孭E鏂囦歡涔嬪悗灝變細鏈?涓瓧鑺傜浉璺熼殢銆備笅涓涓畯鏍囪瘑浜哖E鏂囦歡鐨勫ご閮細
//PEFILE.C
#define PEFHDROFFSET(a) ((LPVOID)((BYTE *)a + \
((PIMAGE_DOS_HEADER)a)->e_lfanew + \
SIZE_OF_NT_SIGNATURE))
榪欎釜瀹忎笌涓婁竴涓畯鐨勫敮涓涓嶅悓鏄繖涓畯鍔犲叆浜嗕竴涓父閲廠IZE_OF_NT_SIGNATURE銆備笉騫哥殑鏄紝榪欎釜甯擱噺騫舵湭瀹氫箟鍦╓INNT.H涔嬩腑錛屼簬鏄垜灝嗗畠瀹氫箟鍦ㄤ簡PEFILE.H涓紝瀹冩槸涓涓狣WORD鐨勫ぇ灝忋?
銆銆 鏃㈢劧鎴戜滑鐭ラ亾浜哖E鏂囦歡澶寸殑浣嶇疆錛岄偅涔堝氨鍙互媯鏌ュご閮ㄧ殑鏁版嵁浜嗐傛垜浠彧闇瑕佹妸榪欎釜浣嶇疆璧嬪肩粰涓涓粨鏋勶紝濡備笅錛?
PIMAGE_FILE_HEADER pfh;
pfh = (PIMAGE_FILE_HEADER)PEFHDROFFSET(lpFile);
鍦ㄨ繖涓緥瀛愪腑錛宭pFile琛ㄧず涓涓寚鍚戝彲鎵ц鏂囦歡鍐呭瓨鏄犲儚鍩哄湴鍧鐨勬寚閽堬紝榪欏氨鏄懼嚭浜嗗唴瀛樻槧灝勬枃浠剁殑濂藉錛氫笉闇瑕佹墽琛屾枃浠剁殑I/O錛屽彧闇浣跨敤鎸囬拡pfh灝辮兘瀛樺彇鏂囦歡涓殑淇℃伅銆侾E鏂囦歡澶寸粨鏋勮瀹氫箟涓猴細
//WINNT.H
typedef struct _IMAGE_FILE_HEADER {
USHORT Machine;
USHORT NumberOfSections;
ULONG TimeDateStamp;
ULONG PointerToSymbolTable;
ULONG NumberOfSymbols;
USHORT SizeOfOptionalHeader;
USHORT Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
#define IMAGE_SIZEOF_FILE_HEADER 20
璇鋒敞鎰忚繖涓枃浠跺ご閮ㄧ殑澶у皬宸茬粡瀹氫箟鍦ㄨ繖涓寘鍚枃浠朵箣涓簡錛岃繖鏍蜂竴鏉ワ紝鎯寵寰楀埌榪欎釜緇撴瀯鐨勫ぇ灝忓氨寰堟柟渚夸簡銆備絾鏄垜瑙夊緱瀵圭粨鏋勬湰韜嬌鐢? sizeof榪愮畻絎︼紙璇戞敞錛氬師鏂囦負“function”錛夋洿綆鍗曚竴浜涳紝鍥犱負榪欐牱鐨勮瘽鎴戝氨涓嶅繀璁頒綇榪欎釜甯擱噺鐨勫悕瀛? IMAGE_SIZEOF_FILE_HEADER錛岃屽彧闇瑕佽浣忕粨鏋処MAGE_FILE_HEADER鐨勫悕瀛楀氨鍙互浜嗐傚彟涓鏂歸潰錛岃浣忔墍鏈夌粨鏋勭殑鍚嶅瓧 宸茬粡澶熸湁鎸戞垬鎬х殑浜嗭紝灝ゅ叾鍦ㄦ槸榪欎簺緇撴瀯鍙湁WINNT.H涓墠鏈夌殑鎯呭喌涓嬨?
PE鏂囦歡涓殑淇℃伅鍩烘湰涓婃槸涓浜涢珮綰т俊鎭紝榪欎簺淇℃伅鏄鎿嶄綔緋葷粺鎴栬呭簲鐢ㄧ▼搴忕敤鏉ュ喅瀹氬浣曞鐞嗚繖涓枃浠剁殑銆傜涓涓煙鏄敤鏉ヨ〃紺鴻繖涓彲鎵ц鏂囦歡琚瀯寤虹殑鐩爣鏈? 鍣ㄧ綾伙紝渚嬪DEC(R) Alpha銆丮IPS R4000銆両ntel(R) x86鎴栦竴浜涘叾瀹冨鐞嗗櫒銆傜郴緇熶嬌鐢ㄨ繖涓淇℃伅鏉ュ湪璇誨彇榪欎釜鏂囦歡鐨勫叾瀹冩暟鎹箣鍓嶅喅瀹氬浣曞鐞嗗畠銆?
Characteristics鍩熻〃紺轟簡鏂囦歡鐨勪竴浜涚壒寰併傛瘮濡傚浜庝竴涓彲鎵ц鏂囦歡鑰岃█錛屽垎紱昏皟璇曟枃浠舵槸濡備綍鎿嶄綔鐨勩傝皟璇曞櫒閫氬父浣跨敤鐨勬柟娉曟槸灝嗚皟璇曚俊鎭粠 PE鏂囦歡涓垎紱伙紝騫朵繚瀛樺埌涓涓皟璇曟枃浠訛紙.DBG錛変腑銆傝榪欎箞鍋氱殑璇濓紝璋冭瘯鍣ㄩ渶瑕佷簡瑙f槸鍚﹁鍦ㄤ竴涓崟鐙殑鏂囦歡涓鎵捐皟璇曚俊鎭紝浠ュ強榪欎釜鏂囦歡鏄惁宸茬粡灝嗚皟璇? 淇℃伅鍒嗙浜嗐傛垜浠彲浠ラ氳繃娣卞叆鍙墽琛屾枃浠跺茍瀵繪壘璋冭瘯淇℃伅鐨勬柟娉曟潵瀹屾垚榪欎竴宸ヤ綔銆傝浣胯皟璇曞櫒涓嶅湪鏂囦歡涓煡鎵劇殑璇濓紝灝遍渶瑕佺敤鍒? IMAGE_FILE_DEBUG_STRIPPED榪欎釜鐗瑰緛錛屽畠琛ㄧず鏂囦歡鐨勮皟璇曚俊鎭槸鍚﹀凡緇忚鍒嗙浜嗐傝繖鏍蜂竴鏉ワ紝璋冭瘯鍣ㄥ彲浠ラ氳繃蹇熸煡鐪婸E鏂囦歡鐨勫ご閮? 鐨勬柟娉曟潵鍐沖畾鏂囦歡涓槸鍚﹀瓨鍦ㄧ潃璋冭瘯淇℃伅銆?
銆銆 WINNT.H瀹氫箟浜嗚嫢騫插叾瀹冭〃紺烘枃浠跺ご淇℃伅鐨勬爣璁幫紝灝卞拰浠ヤ笂鐨勪緥瀛愬樊涓嶅銆傛垜鎶婄爺絀惰繖浜涙爣璁扮殑浜嬫儏鐣欑粰璇昏呬綔涓虹粌涔狅紝鐢變綘浠潵鐪嬬湅瀹冧滑鏄笉鏄緢鏈夎叮錛岃繖浜涙爣璁頒綅浜嶹INNT.H涓殑IMAGE_FILE_HEADER緇撴瀯涔嬪悗銆?
PE鏂囦歡澶寸粨鏋勪腑鍙︿竴涓湁鐢ㄧ殑鍏ュ彛鏄疦umberOfSections鍩燂紝瀹冭〃紺哄鏋滀綘瑕佹柟渚垮湴鎻愬彇鏂囦歡淇℃伅鐨勮瘽錛屽氨闇瑕佷簡瑙e灝戜釜孌碘斺旀洿鏄庣‘涓鐐規潵 璇達紝鏈夊灝戜釜孌靛ご閮ㄥ拰澶氬皯涓瀹炰綋銆傛瘡涓涓澶撮儴鍜屾瀹炰綋閮藉湪鏂囦歡涓繛緇湴鎺掑垪鐫錛屾墍浠ヨ鍐沖畾孌靛ご閮ㄥ拰孌靛疄浣撳湪鍝噷緇撴潫鐨勮瘽錛屾鐨勬暟鐩槸蹇呴渶鐨勩備互涓嬬殑鍑? 鏁頒粠PE鏂囦歡澶翠腑鎻愬彇浜嗘鐨勬暟鐩細
PEFILE.C
int WINAPI NumOfSections(LPVOID lpFile)
{
/* 鏂囦歡澶撮儴涓墍琛ㄧず鍑虹殑孌墊暟鐩?*/
return (int)((PIMAGE_FILE_HEADER)
PEFHDROFFSET (lpFile))->NumberOfSections);
}
濡備綘鎵瑙侊紝PEFHDROFFSET浠ュ強鍏跺畠瀹忕敤璧鋒潵闈炲父鏂逛究銆?br>
PE鍙夊ご閮?/strong>

銆銆 PE鍙墽琛屾枃浠朵腑鎺ヤ笅鏉ョ殑224涓瓧鑺傜粍鎴愪簡PE鍙夊ご閮ㄣ傝櫧鐒跺畠鐨勫悕瀛楁槸“鍙夊ご閮?#8221;錛屼絾鏄紜俊錛氳繖涓ご閮ㄥ茍闈?#8220;鍙?#8221;錛岃屾槸“蹇呴渶”鐨勩侽PTHDROFFSET瀹忓彲浠ヨ幏寰楁寚鍚戝彲閫夊ご閮ㄧ殑鎸囬拡錛?
//PEFILE.H
#define OPTHDROFFSET(a) ((LPVOID)((BYTE *)a + \
((PIMAGE_DOS_HEADER)a)->e_lfanew + \
SIZE_OF_NT_SIGNATURE + \
sizeof(IMAGE_FILE_HEADER)))
鍙夊ご閮ㄥ寘鍚簡寰堝鍏充簬鍙墽琛屾槧鍍忕殑閲嶈淇℃伅錛屼緥濡傚垵濮嬬殑鍫嗘爤澶у皬銆佺▼搴忓叆鍙g偣鐨勪綅緗侀閫夊熀鍦板潃銆佹搷浣滅郴緇熺増鏈佹瀵歸綈鐨勪俊鎭瓑絳夈侷MAGE_OPTIONAL_HEADER緇撴瀯濡備笅錛?
//WINNT.H
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// 鏍囧噯鍩?
//
USHORT Magic;
UCHAR MajorLinkerVersion;
UCHAR MinorLinkerVersion;
ULONG SizeOfCode;
ULONG SizeOfInitializedData;
ULONG SizeOfUninitializedData;
ULONG AddressOfEntryPoint;
ULONG BaseOfCode;
ULONG BaseOfData;
//
// NT闄勫姞鍩?
//
ULONG ImageBase;
ULONG SectionAlignment;
ULONG FileAlignment;
USHORT MajorOperatingSystemVersion;
USHORT MinorOperatingSystemVersion;
USHORT MajorImageVersion;
USHORT MinorImageVersion;
USHORT MajorSubsystemVersion;
USHORT MinorSubsystemVersion;
ULONG Reserved1;
ULONG SizeOfImage;
ULONG SizeOfHeaders;
ULONG CheckSum;
USHORT Subsystem;
USHORT DllCharacteristics;
ULONG SizeOfStackReserve;
ULONG SizeOfStackCommit;
ULONG SizeOfHeapReserve;
ULONG SizeOfHeapCommit;
ULONG LoaderFlags;
ULONG NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
濡備綘鎵瑙侊紝榪欎釜緇撴瀯涓墍鍒楀嚭鐨勫煙瀹炲湪鏄啑闀垮緱榪囧垎銆備負浜嗕笉璁╀綘瀵規墍鏈夎繖浜涘煙鎰熷埌鍘岀儲錛屾垜浼氫粎浠呰璁烘湁鐢ㄧ殑鈥斺斿氨鏄錛屽浜庢帰絀禤E鏂囦歡鏍煎紡鑰岃█鏈夌敤鐨勩?

鏍囧噯鍩?/strong>

銆銆 棣栧厛錛岃娉ㄦ剰榪欎釜緇撴瀯琚垝鍒嗕負“鏍囧噯鍩?#8221;鍜?#8220;NT闄勫姞鍩?#8221;銆傛墍璋撴爣鍑嗗煙錛屽氨鏄拰UNIX鍙墽琛屾枃浠剁殑COFF鏍煎紡鎵鍏叡鐨勯儴鍒嗐傝櫧鐒舵爣鍑嗗煙淇濈暀浜咰OFF涓畾涔夌殑鍚嶅瓧錛屼絾鏄疻indows NT浠嶇劧灝嗗畠浠敤浣滀簡涓嶅悓鐨勭洰鐨勨斺斿敖綆℃崲涓悕瀛楁洿濂戒竴浜涖?
銆銆 ·Magic銆傛垜涓嶇煡閬撹繖涓煙鏄共浠涔堢殑錛屽浜庣ず渚嬬▼搴廍XEVIEW.EXE紺轟緥紼嬪簭鑰岃█錛岃繖涓兼槸0x010B鎴?67錛堣瘧娉細0x010B涓?EXE錛?x0107涓篟OM鏄犲儚錛岃繖涓俊鎭垜鏄粠eXeScope涓婂緱鏉ョ殑錛夈?
銆銆 ·MajorLinkerVersion銆丮inorLinkerVersion銆傝〃紺洪摼鎺ユ鏄犲儚鐨勯摼鎺ュ櫒鐗堟湰銆傞殢Window NT build 438閰嶅鐨刉indows NT SDK鍖呭惈鐨勯摼鎺ュ櫒鐗堟湰鏄?.39錛堝崄鍏繘鍒朵負2.27錛夈?
銆銆 ·SizeOfCode銆傚彲鎵ц浠g爜灝哄銆?
銆銆 ·SizeOfInitializedData銆傚凡鍒濆鍖栫殑鏁版嵁灝哄銆?
銆銆 ·SizeOfUninitializedData銆傛湭鍒濆鍖栫殑鏁版嵁灝哄銆?
·AddressOfEntryPoint銆傚湪鏍囧噯鍩熶腑錛孉ddressOfEntryPoint鍩熸槸瀵筆E鏂囦歡鏍煎紡鏉ヨ鏈涓烘湁瓚g殑浜嗐傝繖涓煙琛ㄧず搴旂敤紼? 搴忓叆鍙g偣鐨勪綅緗傚茍涓旓紝瀵逛簬緋葷粺榛戝鏉ヨ錛岃繖涓綅緗氨鏄鍏ュ湴鍧琛紙IAT錛夌殑鏈熬銆備互涓嬬殑鍑芥暟紺鴻寖浜嗗浣曚粠鍙夊ご閮ㄨ幏寰梂indows NT鍙墽琛屾槧鍍忕殑鍏ュ彛鐐廣?
//PEFILE.C
LPVOID WINAPI GetModuleEntryPoint(LPVOID lpFile)
{
PIMAGE_OPTIONAL_HEADER poh;
poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile);
if (poh != NULL)
return (LPVOID)poh->AddressOfEntryPoint;
else
return NULL;
}
·BaseOfCode銆傚凡杞藉叆鏄犲儚鐨勪唬鐮侊紙“.text”孌碉級鐨勭浉瀵瑰亸縐婚噺銆?
銆銆 ·BaseOfData銆傚凡杞藉叆鏄犲儚鐨勬湭鍒濆鍖栨暟鎹紙“.bss”孌碉級鐨勭浉瀵瑰亸縐婚噺銆?

Windows NT闄勫姞鍩?/strong>

銆銆 娣誨姞鍒癢indows NT PE鏂囦歡鏍煎紡涓殑闄勫姞鍩熶負Windows NT鐗瑰畾鐨勮繘紼嬭涓烘彁渚涗簡瑁呰澆鍣ㄧ殑鏀寔錛屼互涓嬩負榪欎簺鍩熺殑姒傝堪銆?
銆銆 ·ImageBase銆傝繘紼嬫槧鍍忓湴鍧絀洪棿涓殑棣栭夊熀鍦板潃銆俉indows NT鐨凪icrosoft Win32 SDK閾炬帴鍣ㄥ皢榪欎釜鍊奸粯璁よ涓?x00400000錛屼絾鏄綘鍙互浣跨敤-BASE:linker寮鍏蟲敼鍙樿繖涓箋?
銆銆 ·SectionAlignment銆備粠ImageBase寮濮嬶紝姣忎釜孌甸兘琚浉緇х殑瑁呭叆榪涚▼鐨勫湴鍧絀洪棿涓係ectionAlignment鍒欒瀹氫簡瑁呰澆鏃舵鑳藉鍗犳嵁鐨勬渶灝忕┖闂存暟閲忊斺斿氨鏄錛屾鏄叧浜嶴ectionAlignment瀵歸綈鐨勩?
銆銆 Windows NT铏氭嫙鍐呭瓨綆$悊鍣ㄨ瀹氾紝孌靛榻愪笉鑳藉皯浜庨〉灝哄錛堝綋鍓嶇殑x86騫沖彴鏄?096瀛楄妭錛夛紝騫朵笖蹇呴』鏄垚鍊嶇殑欏靛昂瀵搞?096瀛楄妭鏄痻86閾炬帴鍣ㄧ殑榛樿鍊鹼紝浣嗘槸瀹冨彲浠ラ氳繃-ALIGN: linker寮鍏蟲潵璁劇疆銆?
·FileAlignment銆傛槧鍍忔枃浠墮鍏堣杞界殑鏈灝忕殑淇℃伅鍧楅棿闅斻備緥濡傦紝閾炬帴鍣ㄥ皢涓涓瀹炰綋錛堟鐨勫師濮嬫暟鎹級鍔犻浂鎵╁睍涓烘枃浠朵腑鏈鎺ヨ繎鐨? FileAlignment杈圭晫銆傛棭鍏堟彁鍙婄殑2.39鐗堥摼鎺ュ櫒灝嗘槧鍍忔枃浠朵互0x200瀛楄妭鐨勮竟鐣屽榻愶紝榪欎釜鍊煎彲浠ヨ寮哄埗鏀逛負512鍒?5535榪欎箞澶氥?
銆銆 ·MajorOperatingSystemVersion銆傝〃紺篧indows NT鎿嶄綔緋葷粺鐨勪富鐗堟湰鍙鳳紱閫氬父瀵筗indows NT 1.0鑰岃█錛岃繖涓艱璁句負1銆?
銆銆 ·MinorOperatingSystemVersion銆傝〃紺篧indows NT鎿嶄綔緋葷粺鐨勬鐗堟湰鍙鳳紱閫氬父瀵筗indows NT 1.0鑰岃█錛岃繖涓艱璁句負0銆?
銆銆 ·MajorImageVersion銆傜敤鏉ヨ〃紺哄簲鐢ㄧ▼搴忕殑涓葷増鏈彿錛涘浜嶮icrosoft Excel 4.0鑰岃█錛岃繖涓兼槸4銆?
銆銆 ·MinorImageVersion銆傜敤鏉ヨ〃紺哄簲鐢ㄧ▼搴忕殑嬈$増鏈彿錛涘浜嶮icrosoft Excel 4.0鑰岃█錛岃繖涓兼槸0銆?
銆銆 ·MajorSubsystemVersion銆傝〃紺篧indows NT Win32瀛愮郴緇熺殑涓葷増鏈彿錛涢氬父瀵逛簬Windows NT 3.10鑰岃█錛岃繖涓艱璁句負3銆?
銆銆 ·MinorSubsystemVersion銆傝〃紺篧indows NT Win32瀛愮郴緇熺殑嬈$増鏈彿錛涢氬父瀵逛簬Windows NT 3.10鑰岃█錛岃繖涓艱璁句負10銆?
銆銆 ·Reserved1銆傛湭鐭ョ洰鐨勶紝閫氬父涓嶈緋葷粺浣跨敤錛屽茍琚摼鎺ュ櫒璁句負0銆?
·SizeOfImage銆傝〃紺鴻澆鍏ョ殑鍙墽琛屾槧鍍忕殑鍦板潃絀洪棿涓淇濈暀鐨勫湴鍧絀洪棿澶у皬錛岃繖涓暟瀛楀緢澶х▼搴︿笂鍙桽ectionAlignment鐨勫獎鍝嶃備緥 濡傦紝鑰冭檻涓涓嫢鏈夊浐瀹氶〉灝哄4096瀛楄妭鐨勭郴緇燂紝濡傛灉浣犳湁涓涓?1涓鐨勫彲鎵ц鏂囦歡錛屽畠鐨勬瘡涓閮藉皯浜?096瀛楄妭錛屽茍涓斿叧浜?5536瀛楄妭杈圭晫瀵歸綈錛岄偅 涔圫izeOfImage鍩熷皢浼氳璁句負11 * 65536 = 720896錛?76欏碉級銆傝屽鏋滀竴涓浉鍚岀殑鏂囦歡鍏充簬4096瀛楄妭瀵歸綈鐨勮瘽錛岄偅涔圫izeOfImage鍩熺殑緇撴灉灝嗘槸11 * 4096 = 45056錛?1欏碉級銆傝繖鍙槸涓畝鍗曠殑渚嬪瓙錛屽畠璇存槑姣忎釜孌甸渶瑕佸皯浜庝竴涓〉闈㈢殑鍐呭瓨銆傚湪鐜板疄涓紝閾炬帴鍣ㄩ氳繃涓埆鍦拌綆楁瘡涓鐨勬柟娉曟潵鍐沖畾 SizeOfImage紜垏鐨勫箋傚畠棣栧厛鍐沖畾姣忎釜孌甸渶瑕佸灝戝瓧鑺傦紝騫朵笖鏈鍚庡皢欏甸潰鎬繪暟鍚戜笂鍙栨暣鑷蟲渶鎺ヨ繎鐨凷ectionAlignment杈圭晫錛岀劧鍚庢繪暟 灝辨槸姣忎釜孌典釜鍒渶姹備箣鍜屼簡銆?
銆銆 ·SizeOfHeaders銆傝繖涓煙琛ㄧず鏂囦歡涓湁澶氬皯絀洪棿鐢ㄦ潵淇濆瓨鎵鏈夌殑鏂囦歡澶撮儴錛屽寘鎷琈S-DOS澶撮儴銆丳E鏂囦歡澶撮儴銆丳E鍙夊ご閮ㄤ互鍙奝E孌靛ご閮ㄣ傛枃浠朵腑鎵鏈夌殑孌靛疄浣撳氨寮濮嬩簬榪欎釜浣嶇疆銆?
銆銆 ·CheckSum銆傛牎楠屽拰鏄敤鏉ュ湪瑁呰澆鏃墮獙璇佸彲鎵ц鏂囦歡鐨勶紝瀹冩槸鐢遍摼鎺ュ櫒璁劇疆騫舵楠岀殑銆傜敱浜庡垱寤鴻繖浜涙牎楠屽拰鐨勭畻娉曟槸縐佹湁淇℃伅錛屾墍浠ュ湪姝や笉榪涜璁ㄨ銆?
銆銆 ·Subsystem銆傜敤浜庢爣璇嗚鍙墽琛屾枃浠剁洰鏍囧瓙緋葷粺鐨勫煙銆傛瘡涓彲鑳界殑瀛愮郴緇熷彇鍊煎垪浜嶹INNT.H鐨処MAGE_OPTIONAL_HEADER緇撴瀯涔嬪悗銆?
銆銆 ·DllCharacteristics銆傜敤鏉ヨ〃紺轟竴涓狣LL鏄犲儚鏄惁涓鴻繘紼嬪拰綰跨▼鐨勫垵濮嬪寲鍙婄粓姝㈠寘鍚叆鍙g偣鐨勬爣璁般?
·SizeOfStackReserve銆丼izeOfStackCommit銆丼izeOfHeapReserve銆? SizeOfHeapCommit銆傝繖浜涘煙鎺у埗瑕佷繚鐣欑殑鍦板潃絀洪棿鏁伴噺錛屽茍涓旇礋璐f爤鍜岄粯璁ゅ爢鐨勭敵璇楓傚湪榛樿鎯呭喌涓嬶紝鏍堝拰鍫嗛兘鎷ユ湁1涓〉闈㈢殑鐢寵鍊間互鍙?6涓? 欏甸潰鐨勪繚鐣欏箋傝繖浜涘煎彲浠ヤ嬌鐢ㄩ摼鎺ュ櫒寮鍏?STACKSIZE:涓?HEAPSIZE:鏉ヨ緗?
銆銆 ·LoaderFlags銆傚憡鐭ヨ杞藉櫒鏄惁鍦ㄨ杞芥椂涓鍜岃皟璇曪紝鎴栬呴粯璁ゅ湴姝e父榪愯銆?
銆銆 ·NumberOfRvaAndSizes銆傝繖涓煙鏍囪瘑浜嗘帴涓嬫潵鐨凞ataDirectory鏁扮粍銆傝娉ㄦ剰瀹冭鐢ㄦ潵鏍囪瘑榪欎釜鏁扮粍錛岃屼笉鏄暟緇勪腑鐨勫悇涓叆鍙f暟瀛楋紝榪欎竴鐐歸潪甯擱噸瑕併?
銆銆 ·DataDirectory銆傛暟鎹洰褰曡〃紺烘枃浠朵腑鍏跺畠鍙墽琛屼俊鎭噸瑕佺粍鎴愰儴鍒嗙殑浣嶇疆銆傚畠浜嬪疄涓婂氨鏄竴涓狪MAGE_DATA_DIRECTORY緇撴瀯鐨勬暟緇勶紝浣嶄簬鍙夊ご閮ㄧ粨鏋勭殑鏈熬銆傚綋鍓嶇殑PE鏂囦歡鏍煎紡瀹氫箟浜?6縐嶅彲鑳界殑鏁版嵁鐩綍錛岃繖涔嬩腑鐨?1縐嶇幇鍦ㄥ湪浣跨敤涓?

鏁版嵁鐩綍

WINNT.H涔嬩腑鎵瀹氫箟鐨勬暟鎹洰褰曚負錛?
//WINNT.H
// 鐩綍鍏ュ彛
// 瀵煎嚭鐩綍
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0
// 瀵煎叆鐩綍
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1
// 璧勬簮鐩綍
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
// 寮傚父鐩綍
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
// 瀹夊叏鐩綍
#define IMAGE_DIRECTORY_ENTRY_SECURITY 4
// 閲嶅畾浣嶅熀鏈〃
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
// 璋冭瘯鐩綍
#define IMAGE_DIRECTORY_ENTRY_DEBUG 6
// 鎻忚堪瀛椾覆
#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7
// 鏈哄櫒鍊鹼紙MIPS GP錛?
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8
// TLS鐩綍
#define IMAGE_DIRECTORY_ENTRY_TLS 9
// 杞藉叆閰嶇疆鐩綍
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
鍩烘湰涓婏紝姣忎釜鏁版嵁鐩綍閮芥槸涓涓瀹氫箟涓篒MAGE_DATA_DIRECTORY鐨勭粨鏋勩傝櫧鐒舵暟鎹洰褰曞叆鍙f湰韜槸鐩稿悓鐨勶紝浣嗘槸姣忎釜鐗瑰畾鐨勭洰褰曠綾誨嵈鏄畬鍏ㄥ敮涓鐨勩傛瘡涓暟鎹洰褰曠殑瀹氫箟鍦ㄦ湰鏂囩殑浠ュ悗閮ㄥ垎琚弿榪頒負“棰勫畾涔夋”銆?
//WINNT.H
typedef struct _IMAGE_DATA_DIRECTORY {
ULONG VirtualAddress;
ULONG Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
姣忎釜鏁版嵁鐩綍鍏ュ彛鎸囧畾浜嗚鐩綍鐨勫昂瀵稿拰鐩稿铏氭嫙鍦板潃銆傚鏋滀綘瑕佸畾涔変竴涓壒瀹氱殑鐩綍鐨勮瘽錛屽氨闇瑕佷粠鍙夊ご閮ㄤ腑鐨勬暟鎹洰褰曟暟緇勪腑鍐沖畾鐩稿鐨勫湴鍧錛? 鐒跺悗浣跨敤铏氭嫙鍦板潃鏉ュ喅瀹氳鐩綍浣嶄簬鍝釜孌典腑銆備竴鏃︿綘鍐沖畾浜嗗摢涓鍖呭惈浜嗚鐩綍錛岃孌電殑孌靛ご閮ㄥ氨浼氳鐢ㄤ簬鏌ユ壘鏁版嵁鐩綍鐨勭簿紜枃浠跺亸縐婚噺浣嶇疆銆?
銆銆 鎵浠ヨ鑾峰緱涓涓暟鎹洰褰曠殑璇濓紝閭d箞棣栧厛浣犻渶瑕佷簡瑙f鐨勬蹇點傛垜鍦ㄤ笅闈細瀵瑰叾榪涜鎻忚堪錛岃繖涓璁轟箣鍚庤繕鏈変竴涓湁鍏沖浣曞畾浣嶆暟鎹洰褰曠殑紺轟緥銆?

PE鏂囦歡孌?/strong>

PE鏂囦歡瑙勮寖鐢辯洰鍓嶄負姝㈠畾涔夌殑閭d簺澶撮儴浠ュ強涓涓悕涓?#8220;孌?#8221;鐨勪竴鑸璞$粍鎴愩傛鍖呭惈浜嗘枃浠剁殑鍐呭錛屽寘鎷唬鐮併佹暟鎹佽祫婧愪互鍙婂叾瀹冨彲鎵ц淇℃伅錛屾瘡涓閮芥湁涓涓? 澶撮儴鍜屼竴涓疄浣擄紙鍘熷鏁版嵁錛夈傛垜灝嗗湪涓嬮潰鎻忚堪孌靛ご閮ㄧ殑鏈夊叧淇℃伅錛屼絾鏄瀹炰綋鍒欑己灝戜竴涓弗鏍肩殑鏂囦歡緇撴瀯銆傚洜姝わ紝瀹冧滑鍑犱箮鍙互琚摼鎺ュ櫒鎸変換浣曠殑鏂規硶緇勭粐錛屽彧瑕? 瀹冪殑澶撮儴濉厖浜嗚凍澶熻兘澶熻В閲婃暟鎹殑淇℃伅銆?

孌靛ご閮?/strong>

銆銆 PE鏂囦歡鏍煎紡涓紝鎵鏈夌殑孌靛ご閮ㄤ綅浜庡彲閫夊ご閮ㄤ箣鍚庛傛瘡涓澶撮儴涓?0涓瓧鑺傞暱錛屽茍涓旀病鏈変換浣曠殑濉厖淇℃伅銆傛澶撮儴琚畾涔変負浠ヤ笅鐨勭粨鏋勶細
//WINNT.H
#define IMAGE_SIZEOF_SHORT_NAME 8
typedef struct _IMAGE_SECTION_HEADER {
UCHAR Name[IMAGE_SIZEOF_SHORT_NAME];
union {
ULONG PhysicalAddress;
ULONG VirtualSize;
} Misc;
ULONG VirtualAddress;
ULONG SizeOfRawData;
ULONG PointerToRawData;
ULONG PointerToRelocations;
ULONG PointerToLinenumbers;
USHORT NumberOfRelocations;
USHORT NumberOfLinenumbers;
ULONG Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
浣犲浣曟墠鑳借幏寰椾竴涓壒瀹氭鐨勬澶撮儴淇℃伅錛熸棦鐒舵澶撮儴鏄榪炵畫鐨勭粍緇囪搗鏉ョ殑錛岃屼笖娌℃湁涓涓壒瀹氱殑欏哄簭錛岄偅涔堟澶撮儴蹇呴』鐢卞悕縐版潵瀹氫綅銆備互涓嬬殑鍑芥暟紺鴻寖浜嗗浣曚粠涓涓粰瀹氫簡孌靛悕縐扮殑PE鏄犲儚鏂囦歡涓幏寰椾竴涓澶撮儴錛?
//PEFILE.C
BOOL WINAPI GetSectionHdrByName(LPVOID lpFile, IMAGE_SECTION_HEADER *sh, char *szSection)
{
PIMAGE_SECTION_HEADER psh;
int nSections = NumOfSections (lpFile);
int i;
if ((psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET(lpFile))
!= NULL)
{
/* 鐢卞悕縐版煡鎵炬 */
for (i = 0; i < nSections; i++)
{
if (!strcmp(psh->Name, szSection))
{
/* 鍚戝ご閮ㄥ鍒舵暟鎹?*/
CopyMemory((LPVOID)sh, (LPVOID)psh,
sizeof(IMAGE_SECTION_HEADER));
return TRUE;
}
else
psh++;
}
}
return FALSE;
}
榪欎釜鍑芥暟閫氳繃SECHDROFFSET瀹忓皢絎竴涓澶撮儴瀹氫綅錛岀劧鍚庡畠寮濮嬪湪鎵鏈夋涓驚鐜紝騫跺皢瑕佸鎵劇殑孌靛悕縐板拰姣忎釜孌電殑鍚嶇О鐩告瘮杈冿紝鐩村埌鎵? 鍒頒簡姝g‘鐨勯偅涓涓負姝€傚綋鎵懼埌浜嗘鐨勬椂鍊欙紝鍑芥暟灝嗗唴瀛樻槧鍍忔枃浠剁殑鏁版嵁澶嶅埗鍒頒紶鍏ュ嚱鏁扮殑緇撴瀯涓紝鐒跺悗IMAGE_SECTION_HEADER緇撴瀯鐨勫悇鍩熷氨 鑳藉琚洿鎺ュ瓨鍙栦簡銆?

孌靛ご閮ㄧ殑鍩?/strong>

銆銆 ·Name銆傛瘡涓閮芥湁涓涓?瀛楃闀跨殑鍚嶇О鍩燂紝騫朵笖絎竴涓瓧絎﹀繀欏繪槸涓涓彞鐐廣?
銆銆 ·PhysicalAddress鎴朧irtualSize銆傜浜屼釜鍩熸槸涓涓猽nion鍩燂紝鐜板湪宸蹭笉浣跨敤浜嗐?
·VirtualAddress銆傝繖涓煙鏍囪瘑浜嗚繘紼嬪湴鍧絀洪棿涓瑁呰澆榪欎釜孌電殑铏氭嫙鍦板潃銆傚疄闄呯殑鍦板潃鐢卞皢榪欎釜鍩熺殑鍊煎姞涓婂彲閫夊ご閮ㄧ粨鏋勪腑鐨処mageBase 铏氭嫙鍦板潃寰楀埌銆傚垏璁幫紝濡傛灉榪欎釜鏄犲儚鏂囦歡鏄竴涓狣LL錛岄偅涔堣繖涓狣LL灝變笉涓瀹氫細瑁呰澆鍒癐mageBase瑕佹眰鐨勪綅緗傛墍浠ヤ竴鏃﹁繖涓枃浠惰瑁呰澆榪涘叆浜嗕竴涓繘 紼嬶紝瀹為檯鐨処mageBase鍊煎簲璇ラ氳繃浣跨敤GetModuleHandle鏉ユ楠屻?
·SizeOfRawData銆傝繖涓煙琛ㄧず浜嗙浉瀵笷ileAlignment鐨勬瀹炰綋灝哄銆傛枃浠朵腑瀹為檯鐨勬瀹炰綋灝哄灝嗗皯浜庢垨絳変簬 FileAlignment鐨勬暣鍊嶆暟銆備竴鏃︽槧鍍忚瑁呰澆榪涘叆浜嗕竴涓繘紼嬬殑鍦板潃絀洪棿錛屾瀹炰綋鐨勫昂瀵稿皢浼氬彉寰楀皯浜庢垨絳変簬FileAlignment鐨勬暣鍊嶆暟銆?
銆銆 ·PointerToRawData銆傝繖鏄竴涓枃浠朵腑孌靛疄浣撲綅緗殑鍋忕Щ閲忋?
銆銆 ·PointerToRelocations銆丳ointerToLinenumbers銆丯umberOfRelocations銆丯umberOfLinenumbers銆傝繖浜涘煙鍦≒E鏍煎紡涓笉浣跨敤銆?
銆銆 ·Characteristics銆傚畾涔変簡孌電殑鐗瑰緛銆傝繖浜涘煎彲浠ュ湪WINNT.H鍙婃湰鍏夌洏錛堣瘧娉細MSDN鐨勫厜鐩橈級鐨凱E鏍煎紡瑙勮寖涓壘鍒般?

鍊?        瀹氫箟
0x00000020 浠g爜孌?
0x00000040 宸插垵濮嬪寲鏁版嵁孌?
0x00000080 鏈垵濮嬪寲鏁版嵁孌?
0x04000000 璇ユ鏁版嵁涓嶈兘琚紦瀛?
0x08000000 璇ユ涓嶈兘琚垎欏?
0x10000000 鍏變韓孌?
0x20000000 鍙墽琛屾
0x40000000 鍙孌?
0x80000000 鍙啓孌?

瀹氫綅鏁版嵁鐩綍

銆銆 鏁版嵁鐩綍瀛樺湪浜庡畠浠浉搴旂殑鏁版嵁孌典腑銆傚吀鍨嬪湴鏉ヨ錛屾暟鎹洰褰曟槸孌靛疄浣撲腑鐨勭涓涓粨鏋勶紝浣嗕笉鏄繀闇鐨勩傜敱浜庤繖涓紭鏁咃紝濡傛灉浣犻渶瑕佸畾浣嶄竴涓寚瀹氱殑鏁版嵁鐩綍鐨勮瘽錛屽氨闇瑕佷粠孌靛ご閮ㄥ拰鍙夊ご閮ㄤ腑鑾峰緱淇℃伅銆?
銆銆 涓轟簡璁╄繖涓繃紼嬬畝鍗曚竴鐐癸紝鎴戠紪鍐欎簡浠ヤ笅鐨勫嚱鏁版潵瀹氫綅浠諱綍涓涓湪WINNT.H涔嬩腑瀹氫箟鐨勬暟鎹洰褰曘?
// PEFILE.C
LPVOID WINAPI ImageDirectoryOffset(LPVOID lpFile,
DWORD dwIMAGE_DIRECTORY)
{
PIMAGE_OPTIONAL_HEADER poh;
PIMAGE_SECTION_HEADER psh;
int nSections = NumOfSections(lpFile);
int i = 0;
LPVOID VAImageDir;
/* 蹇呴』涓?鍒?NumberOfRvaAndSizes-1)涔嬮棿 */
if (dwIMAGE_DIRECTORY >= poh->NumberOfRvaAndSizes)
return NULL;
/* 鑾峰緱鍙夊ご閮ㄥ拰孌靛ご閮ㄧ殑鍋忕Щ閲?*/
poh = (PIMAGE_OPTIONAL_HEADER)OPTHDROFFSET(lpFile);
psh = (PIMAGE_SECTION_HEADER)SECHDROFFSET(lpFile);
/* 瀹氫綅鏄犲儚鐩綍鐨勭浉瀵硅櫄鎷熷湴鍧 */
VAImageDir = (LPVOID)poh->DataDirectory
[dwIMAGE_DIRECTORY].VirtualAddress;
/* 瀹氫綅鍖呭惈鏄犲儚鐩綍鐨勬 */
while (i++ < nSections)
{
if (psh->VirtualAddress <= (DWORD)VAImageDir &&
psh->VirtualAddress +
psh->SizeOfRawData > (DWORD)VAImageDir)
break;
psh++;
}
if (i > nSections)
return NULL;
/* 榪斿洖鏄犲儚瀵煎叆鐩綍鐨勫亸縐婚噺 */
return (LPVOID)(((int)lpFile +
(int)VAImageDir. psh->VirtualAddress) +
(int)psh->PointerToRawData);
}
璇ュ嚱鏁伴鍏堢‘璁よ璇鋒眰鐨勬暟鎹洰褰曞叆鍙f暟瀛楋紝鐒跺悗瀹冨垎鍒幏鍙栨寚鍚戝彲閫夊ご閮ㄥ拰絎竴涓澶撮儴鐨勪袱涓寚閽堛傚畠浠庡彲閫夊ご閮ㄥ喅瀹氭暟鎹洰褰曠殑铏氭嫙鍦板潃錛? 鐒跺悗瀹冧嬌鐢ㄨ繖涓兼潵鍐沖畾鏁版嵁鐩綍瀹氫綅鍦ㄥ摢涓瀹炰綋涔嬩腑銆傚鏋滈傚綋鐨勬瀹炰綋宸茬粡琚爣璇嗕簡錛岄偅涔堟暟鎹洰褰曠壒瀹氱殑浣嶇疆灝卞彲浠ラ氳繃灝嗗畠鐨勭浉瀵硅櫄鎷熷湴鍧杞崲涓烘枃浠朵腑 鍦板潃鐨勬柟娉曟潵鎵懼埌銆?

]]>
Windows瀹屾垚绔彛涓嶭inux epoll鎶鏈畝浠?杞澆)http://m.shnenglu.com/guojingjia2006/archive/2010/08/27/124945.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Fri, 27 Aug 2010 07:43:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2010/08/27/124945.htmlhttp://m.shnenglu.com/guojingjia2006/comments/124945.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2010/08/27/124945.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/124945.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/124945.html

WINDOWS瀹屾垚绔彛緙栫▼
1銆佸熀鏈蹇?br> 2銆乄INDOWS瀹屾垚绔彛鐨勭壒鐐?br> 3銆佸畬鎴愮鍙o紙Completion Ports 錛夌浉鍏蟲暟鎹粨鏋勫拰鍒涘緩
4銆佸畬鎴愮鍙g嚎紼嬬殑宸ヤ綔鍘熺悊
5銆乄indows瀹屾垚绔彛鐨勫疄渚嬩唬鐮?br> Linux鐨凟Poll妯″瀷
1銆佷負浠涔坰elect钀藉悗
2銆佸唴鏍鎬腑鎻愰珮I/O鎬ц兘鐨勬柊鏂規硶epoll
3銆乪poll鐨勪紭鐐?br> 4銆乪poll鐨勫伐浣滄ā寮?
5銆乪poll鐨勪嬌鐢ㄦ柟娉?br> 6銆丩inux涓婨POll緙栫▼瀹炰緥
鎬葷粨

WINDOWS瀹屾垚绔彛緙栫▼
        鎽樿錛氬紑鍙戠綉緇滅▼搴忎粠鏉ラ兘涓嶆槸涓浠跺鏄撶殑浜嬫儏錛屽敖綆″彧闇瑕侀伒瀹堝緢灝戠殑涓浜涜鍒?鍒涘緩socket,鍙戣搗榪炴帴錛屾帴鍙楄繛鎺ワ紝鍙戦佸拰鎺ュ彈鏁版嵁銆傜湡姝g殑鍥伴毦鍦ㄤ簬錛? 璁╀綘鐨勭▼搴忓彲浠ラ傚簲浠庡崟鍗曚竴涓繛鎺ュ埌鍑犲崈涓繛鎺ヤ箖鑷充簬涓婁竾涓繛鎺ャ傚埄鐢╓indows騫沖彴瀹屾垚绔彛榪涜閲嶅彔I/O鐨勬妧鏈拰Linux鍦?.6鐗堟湰鐨勫唴鏍鎬腑 寮曞叆鐨凟POll鎶鏈紝鍙互寰堟柟渚垮湪鍦ㄥ湪Windows鍜孡inux騫沖彴涓婂紑鍙戝嚭鏀寔澶ч噺榪炴帴鐨勭綉緇滄湇鍔$▼搴忋傛湰鏂囦粙緇嶅湪Windows鍜孡inux騫沖彴 涓婁嬌鐢ㄧ殑瀹屾垚绔彛鍜孍Poll妯″瀷寮鍙戠殑鍩烘湰鍘熺悊錛屽悓鏃剁粰鍑哄疄闄呯殑渚嬪瓙銆傛湰鏂囦富瑕佸叧娉–/S緇撴瀯鐨勬湇鍔″櫒绔▼搴忥紝鍥犱負涓鑸潵璇達紝寮鍙戜竴涓ぇ瀹歸噺錛屽叿鍙墿灞? 鎬х殑winsock紼嬪簭涓鑸氨鏄寚鏈嶅姟紼嬪簭銆?br>
1銆佸熀鏈蹇?br>
    璁懼---windows鎿嶄綔緋葷粺涓婂厑璁擱氫俊鐨勪換浣曚笢瑗匡紝姣斿鏂囦歡銆佺洰褰曘佷覆琛屽彛銆佸茍琛屽彛銆侀偖浠舵Ы銆佸懡鍚嶇閬撱佹棤鍚嶇閬撱佸鎺ュ瓧銆佹帶鍒跺彴銆侀昏緫紓佺洏銆佺墿鐞? 紓佺洏絳夈傜粷澶у鏁頒笌璁懼鎵撲氦閬撶殑鍑芥暟閮芥槸CreateFile/ReadFile/WriteFile絳夈傛墍浠ユ垜浠笉鑳界湅鍒?*File鍑芥暟灝卞彧鎯沖埌鏂囦歡 璁懼銆備笌璁懼閫氫俊鏈変袱縐嶆柟寮忥紝鍚屾鏂瑰紡鍜屽紓姝ユ柟寮忋傚悓姝ユ柟寮忎笅錛屽綋璋冪敤ReadFile鍑芥暟鏃訛紝鍑芥暟浼氱瓑寰呯郴緇熸墽琛屽畬鎵瑕佹眰鐨勫伐浣滐紝鐒跺悗鎵嶈繑鍥烇紱寮傛鏂瑰紡 涓嬶紝ReadFile榪欑被鍑芥暟浼氱洿鎺ヨ繑鍥烇紝緋葷粺鑷繁鍘誨畬鎴愬璁懼鐨勬搷浣滐紝鐒跺悗浠ユ煇縐嶆柟寮忛氱煡瀹屾垚鎿嶄綔銆?br> 閲嶅彔I/O----欏懼悕鎬濅箟錛屽綋浣犺皟鐢ㄤ簡鏌愪釜鍑芥暟錛堟瘮濡俁eadFile錛夊氨绔嬪埢榪斿洖鍋氳嚜宸辯殑鍏朵粬鍔ㄤ綔鐨勬椂鍊欙紝鍚屾椂緋葷粺涔熷湪瀵笽/0璁懼榪涜浣犺姹傜殑鎿? 浣滐紝鍦ㄨ繖孌墊椂闂村唴浣犵殑紼嬪簭鍜岀郴緇熺殑鍐呴儴鍔ㄤ綔鏄噸鍙犵殑錛屽洜姝ゆ湁鏇村ソ鐨勬ц兘銆傛墍浠ワ紝閲嶅彔I/O鏄敤浜庡紓姝ユ柟寮忎笅浣跨敤I/O璁懼鐨勩? 閲嶅彔I/O闇瑕佷嬌鐢ㄧ殑涓涓潪甯擱噸瑕佺殑鏁版嵁緇撴瀯OVERLAPPED銆?br>
2銆乄INDOWS瀹屾垚绔彛鐨勭壒鐐?br>
   Win32閲嶅彔I/O(Overlapped I/O)鏈哄埗鍏佽鍙戣搗涓涓搷浣滐紝鐒跺悗鍦ㄦ搷浣滃畬鎴愪箣鍚庢帴鍙楀埌淇℃伅銆傚浜庨?U嶉渶瑕佸緢闀挎椂闂存墠鑳藉畬鎴愮殑鎿嶄綔鏉ヨ錛岄噸鍙營O鏈哄埗灝ゅ叾鏈夌敤錛屽洜涓哄彂璧烽噸鍙犳搷浣滅殑綰跨▼ 鍦ㄩ噸鍙犺姹傚彂鍑哄悗灝卞彲浠ヨ嚜鐢辯殑鍋氬埆鐨勪簨鎯呬簡銆傚湪WinNT鍜學in2000涓婏紝鎻愪緵鐨勭湡姝g殑鍙墿灞曠殑I/O妯″瀷灝辨槸浣跨敤瀹屾垚绔彛錛圕ompletion Port錛夌殑閲嶅彔I/O.瀹屾垚绔彛---鏄竴縐峎INDOWS鍐呮牳瀵硅薄銆傚畬鎴愮鍙g敤浜庡紓姝ユ柟寮忕殑閲嶅彔I/0鎯呭喌涓嬶紝褰撶劧閲嶅彔I/O涓嶄竴瀹氶潪浣跨敤瀹屾垚绔彛涓? 鍙紝榪樻湁璁懼鍐呮牳瀵硅薄銆佷簨浠跺璞°佸憡璀/0絳夈備絾鏄畬鎴愮鍙e唴閮ㄦ彁渚涗簡綰跨▼姹犵殑綆$悊錛屽彲浠ラ伩鍏嶅弽澶嶅垱寤虹嚎紼嬬殑寮閿錛屽悓鏃跺彲浠ユ牴鎹瓹PU鐨勪釜鏁扮伒媧葷殑鍐沖畾 綰跨▼涓暟錛岃屼笖鍙互璁╁噺灝戠嚎紼嬭皟搴︾殑嬈℃暟浠庤屾彁楂樻ц兘鍏跺疄綾諱技浜嶹SAAsyncSelect鍜宻elect鍑芥暟鐨勬満鍒舵洿瀹規槗鍏煎Unix錛屼絾鏄毦浠ュ疄鐜? 鎴戜滑鎯寵鐨?#8220;鎵╁睍鎬?#8221;銆傝屼笖windows鐨勫畬鎴愮鍙f満鍒跺湪鎿嶄綔緋葷粺鍐呴儴宸茬粡浣滀簡浼樺寲錛屾彁渚涗簡鏇撮珮鐨勬晥鐜囥傛墍浠ワ紝鎴戜滑閫夋嫨瀹屾垚绔彛寮濮嬫垜浠殑鏈嶅姟鍣ㄧ▼搴忕殑 寮鍙戙?br> 1銆佸彂璧鋒搷浣滀笉涓瀹氬畬鎴愶紝緋葷粺浼氬湪瀹屾垚鐨勬椂鍊欓氱煡浣狅紝閫氳繃鐢ㄦ埛鍦ㄥ畬鎴愮鍙d笂鐨勭瓑寰咃紝澶勭悊鎿嶄綔鐨勭粨鏋溿傛墍浠ヨ鏈夋鏌ュ畬鎴愮鍙o紝鍙栨搷浣滅粨鏋滅殑綰跨▼銆傚湪瀹屾垚绔彛 涓婂畧鍊欑殑綰跨▼緋葷粺鏈変紭鍖栵紝闄ら潪鍦ㄦ墽琛岀殑綰跨▼闃誨錛屼笉浼氭湁鏂扮殑綰跨▼琚縺媧伙紝浠ユ鏉ュ噺灝戠嚎紼嬪垏鎹㈤犳垚鐨勬ц兘浠d環銆傛墍浠ュ鏋滅▼搴忎腑娌℃湁澶鐨勯樆濉炴搷浣滐紝娌℃湁蹇呰 鍚姩澶鐨勭嚎紼嬶紝CPU鏁伴噺鐨勪袱鍊嶏紝涓鑸繖鏍鋒潵鍚姩綰跨▼銆?br> 2銆佹搷浣滀笌鐩稿叧鏁版嵁鐨勭粦瀹氭柟寮忥細鍦ㄦ彁浜ゆ暟鎹殑鏃跺欑敤鎴峰鏁版嵁鎵撶浉搴旂殑鏍囪錛岃褰曟搷浣滅殑綾誨瀷錛屽湪鐢ㄦ埛澶勭悊鎿嶄綔緇撴灉鐨勬椂鍊欙紝閫氳繃媯鏌ヨ嚜宸辨墦鐨勬爣璁板拰緋葷粺鐨勬搷浣滅粨鏋滆繘琛岀浉搴旂殑澶勭悊銆?
3銆佹搷浣滆繑鍥炵殑鏂瑰紡:涓鑸搷浣滃畬鎴愬悗瑕侀氱煡紼嬪簭榪涜鍚庣畫澶勭悊銆備絾鍐欐搷浣滃彲浠ヤ笉閫氱煡鐢ㄦ埛錛屾鏃跺鏋滅敤鎴峰啓鎿嶄綔涓嶈兘椹笂瀹屾垚錛屽啓鎿嶄綔鐨勭浉鍏蟲暟鎹細琚殏瀛樺埌鍒伴潪 浜ゆ崲緙撳啿鍖轟腑錛屽湪鎿嶄綔瀹屾垚鐨勬椂鍊欙紝緋葷粺浼氳嚜鍔ㄩ噴鏀劇紦鍐插尯銆傛鏃跺彂璧峰畬鍐欐搷浣滐紝浣跨敤鐨勫唴瀛樺氨鍙互閲婃斁浜嗐傛鏃跺鏋滃崰鐢ㄩ潪浜ゆ崲緙撳啿澶浼氫嬌緋葷粺鍋滄鍝嶅簲銆?br>
3銆佸畬鎴愮鍙o紙Completion Ports 錛夌浉鍏蟲暟鎹粨鏋勫拰鍒涘緩
    鍏跺疄鍙互鎶婂畬鎴愮鍙g湅鎴愮郴緇熺淮鎶ょ殑涓涓槦鍒楋紝鎿嶄綔緋葷粺鎶婇噸鍙營O鎿嶄綔瀹屾垚鐨勪簨浠墮氱煡鏀懼埌璇ラ槦鍒楅噷錛岀敱浜庢槸鏆撮湶 “鎿嶄綔瀹屾垚”鐨勪簨浠墮氱煡錛屾墍浠ュ懡鍚嶄負“瀹屾垚绔彛”錛圕Ompletion Ports錛夈備竴涓猻ocket琚垱寤哄悗錛屽彲浠ュ湪浠諱綍鏃跺埢鍜屼竴涓畬鎴愮鍙h仈緋昏搗鏉ャ?br> 瀹屾垚绔彛鐩稿叧鏈閲嶈鐨勬槸OVERLAPPED鏁版嵁緇撴瀯
typedef struct _OVERLAPPED {
    ULONG_PTR Internal;//琚郴緇熷唴閮ㄨ祴鍊鹼紝鐢ㄦ潵琛ㄧず緋葷粺鐘舵?
    ULONG_PTR InternalHigh;// 琚郴緇熷唴閮ㄨ祴鍊鹼紝浼犺緭鐨勫瓧鑺傛暟
    union {
        struct {
            DWORD Offset;//鍜孫ffsetHigh鍚堟垚涓涓?4浣嶇殑鏁存暟錛岀敤鏉ヨ〃紺轟粠鏂囦歡澶撮儴鐨勫灝戝瓧鑺傚紑濮?
            DWORD OffsetHigh;//鎿嶄綔錛屽鏋滀笉鏄鏂囦歡I/O鏉ユ搷浣滐紝鍒欏繀欏昏瀹氫負0
        };
        PVOID Pointer;
    };
    HANDLE hEvent;//濡傛灉涓嶄嬌鐢紝灝卞姟蹇呰涓?,鍚﹀垯璇瘋祴涓涓湁鏁堢殑Event鍙ユ焺
} OVERLAPPED, *LPOVERLAPPED;

涓嬮潰鏄紓姝ユ柟寮忎嬌鐢≧eadFile鐨勪竴涓緥瀛?
OVERLAPPED Overlapped;
Overlapped.Offset=345;
Overlapped.OffsetHigh=0;
Overlapped.hEvent=0;
//鍋囧畾鍏朵粬鍙傛暟閮藉凡緇忚鍒濆鍖?
ReadFile(hFile,buffer,sizeof(buffer),&dwNumBytesRead,&Overlapped);
榪欐牱灝卞畬鎴愪簡寮傛鏂瑰紡璇繪枃浠剁殑鎿嶄綔錛岀劧鍚嶳eadFile鍑芥暟榪斿洖錛岀敱鎿嶄綔緋葷粺鍋氳嚜宸辯殑浜嬫儏錛屼笅闈粙緇嶅嚑涓笌OVERLAPPED緇撴瀯鐩稿叧鐨勫嚱鏁?
絳夊緟閲嶅彔I/0鎿嶄綔瀹屾垚鐨勫嚱鏁?
BOOL GetOverlappedResult (
HANDLE hFile,
LPOVERLAPPED lpOverlapped,//鎺ュ彈榪斿洖鐨勯噸鍙營/0緇撴瀯
LPDWORD lpcbTransfer,//鎴愬姛浼犺緭浜嗗灝戝瓧鑺傛暟
BOOL fWait //TRUE鍙湁褰撴搷浣滃畬鎴愭墠榪斿洖錛孎ALSE鐩存帴榪斿洖錛屽鏋滄搷浣滄病鏈夊畬鎴愶紝閫氳繃璋?/鐢℅etLastError ( )鍑芥暟浼氳繑鍥濫RROR_IO_INCOMPLETE
);
瀹廐asOverlappedIoCompleted鍙互甯姪鎴戜滑嫻嬭瘯閲嶅彔I/0鎿嶄綔鏄惁瀹屾垚錛岃瀹忓OVERLAPPED緇撴瀯鐨処nternal鎴愬憳榪涜浜嗘祴璇曪紝鏌ョ湅鏄惁絳変簬STATUS_PENDING鍊箋?/p>

        涓鑸潵璇達紝涓涓簲鐢ㄧ▼搴忓彲浠ュ垱寤哄涓伐浣滅嚎紼嬫潵澶勭悊瀹屾垚绔彛涓婄殑閫氱煡浜嬩歡銆傚伐浣滅嚎紼嬬殑鏁伴噺渚濊禆浜庣▼搴忕殑鍏蜂綋闇瑕併備絾鏄湪鐞嗘兂鐨勬儏鍐典笅錛屽簲璇ュ搴斾竴涓狢PU 鍒涘緩涓涓嚎紼嬨傚洜涓哄湪瀹屾垚绔彛鐞嗘兂妯″瀷涓紝姣忎釜綰跨▼閮藉彲浠ヤ粠緋葷粺鑾峰緱涓涓?#8220;鍘熷瓙”鎬х殑鏃墮棿鐗囷紝杞暘榪愯騫舵鏌ュ畬鎴愮鍙o紝綰跨▼鐨勫垏鎹㈡槸棰濆鐨勫紑閿銆傚湪瀹為檯寮 鍙戠殑鏃跺欙紝榪樿鑰冭檻榪欎簺綰跨▼鏄惁鐗墊秹鍒板叾浠栧牭濉炴搷浣滅殑鎯呭喌銆傚鏋滄煇綰跨▼榪涜鍫靛鎿嶄綔錛岀郴緇熷垯灝嗗叾鎸傝搗錛岃鍒殑綰跨▼鑾峰緱榪愯鏃墮棿銆傚洜姝わ紝濡傛灉鏈夎繖鏍風殑鎯呭喌錛? 鍙互澶氬垱寤哄嚑涓嚎紼嬫潵灝介噺鍒╃敤鏃墮棿銆?br> 搴旂敤瀹屾垚绔彛錛?br>     鍒涘緩瀹屾垚绔彛錛氬畬鎴愮鍙f槸涓涓唴鏍稿璞★紝浣跨敤鏃朵粬鎬繪槸瑕佸拰鑷沖皯涓涓湁鏁堢殑璁懼鍙ユ焺榪涜鍏寵仈錛屽畬鎴愮鍙f槸涓涓鏉傜殑鍐呮牳瀵硅薄錛屽垱寤哄畠鐨勫嚱鏁版槸錛?br> HANDLE CreateIoCompletionPort(
    IN HANDLE FileHandle,
    IN HANDLE ExistingCompletionPort,
    IN ULONG_PTR CompletionKey,
    IN DWORD NumberOfConcurrentThreads
    );

閫氬父鍒涘緩宸ヤ綔鍒嗕袱姝ワ細
絎竴姝ワ紝鍒涘緩涓涓柊鐨勫畬鎴愮鍙e唴鏍稿璞★紝鍙互浣跨敤涓嬮潰鐨勫嚱鏁幫細
       HANDLE CreateNewCompletionPort(DWORD dwNumberOfThreads)
{
          return CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,dwNumberOfThreads);
};
      
絎簩姝ワ紝灝嗗垰鍒涘緩鐨勫畬鎴愮鍙e拰涓涓湁鏁堢殑璁懼鍙ユ焺鍏寵仈璧鋒潵錛屽彲浠ヤ嬌鐢ㄤ笅闈㈢殑鍑芥暟錛?br>        bool AssicoateDeviceWithCompletionPort(HANDLE hCompPort,HANDLE hDevice,DWORD dwCompKey)
{
          HANDLE h=CreateIoCompletionPort(hDevice,hCompPort,dwCompKey,0);
          return h==hCompPort;
};
璇存槑
1錛?CreateIoCompletionPort鍑芥暟涔熷彲浠ヤ竴嬈℃х殑鏃㈠垱寤哄畬鎴愮鍙e璞★紝鍙堝叧鑱斿埌涓涓湁鏁堢殑璁懼鍙ユ焺
2錛?CompletionKey鏄竴涓彲浠ヨ嚜宸卞畾涔夌殑鍙傛暟錛屾垜浠彲浠ユ妸涓涓粨鏋勭殑鍦板潃璧嬬粰瀹冿紝鐒跺悗鍦ㄥ悎閫傜殑鏃跺欏彇鍑烘潵浣跨敤錛屾渶濂借淇濊瘉緇撴瀯閲岄潰鐨勫唴瀛樹笉鏄垎閰嶅湪鏍堜笂錛岄櫎闈炰綘鏈夊崄鍒嗙殑鎶婃彙鍐呭瓨浼氫繚鐣欏埌浣犺浣跨敤鐨勯偅涓鍒匯?br> 3錛? NumberOfConcurrentThreads閫氬父鐢ㄦ潵鎸囧畾瑕佸厑璁稿悓鏃惰繍琛岀殑鐨勭嚎紼嬬殑鏈澶т釜鏁般傞氬父鎴戜滑鎸囧畾涓?錛岃繖鏍風郴緇熶細鏍規嵁CPU鐨勪釜鏁版潵鑷? 鍔ㄧ‘瀹氥傚垱寤哄拰鍏寵仈鐨勫姩浣滃畬鎴愬悗錛岀郴緇熶細灝嗗畬鎴愮鍙e叧鑱旂殑璁懼鍙ユ焺銆佸畬鎴愰敭浣滀負涓鏉$邯褰曞姞鍏ュ埌榪欎釜瀹屾垚绔彛鐨勮澶囧垪琛ㄤ腑銆傚鏋滀綘鏈夊涓畬鎴愮鍙o紝灝變細鏈夊 涓搴旂殑璁懼鍒楄〃銆傚鏋滆澶囧彞鏌勮鍏抽棴錛屽垯琛ㄤ腑鑷姩鍒犻櫎璇ョ邯褰曘?br>
4銆佸畬鎴愮鍙g嚎紼嬬殑宸ヤ綔鍘熺悊

瀹屾垚绔彛鍙互甯姪鎴戜滑綆$悊綰跨▼姹狅紝浣嗘槸綰跨▼姹犱腑鐨勭嚎紼嬮渶瑕佹垜浠嬌鐢╛beginthreadex鏉ュ垱寤猴紝鍑粈涔堥氱煡瀹屾垚绔彛綆$悊鎴戜滑鐨勬柊綰跨▼鍛紵絳旀鍦ㄥ嚱鏁癎etQueuedCompletionStatus銆傝鍑芥暟鍘熷瀷錛?
BOOL GetQueuedCompletionStatus(
    IN HANDLE CompletionPort,
    OUT LPDWORD lpNumberOfBytesTransferred,
    OUT PULONG_PTR lpCompletionKey,
    OUT LPOVERLAPPED *lpOverlapped,
    IN DWORD dwMilliseconds
);
榪欎釜鍑芥暟璇曞浘浠庢寚瀹氱殑瀹屾垚绔彛鐨処/0瀹屾垚闃熷垪涓娊鍙栫邯褰曘傚彧鏈夊綋閲嶅彔I/O鍔ㄤ綔瀹屾垚鐨勬椂鍊欙紝瀹屾垚闃熷垪涓墠鏈夌邯褰曘傚嚒鏄皟鐢ㄨ繖涓嚱鏁扮殑綰跨▼灝嗚鏀懼叆鍒板畬鎴? 绔彛鐨勭瓑寰呯嚎紼嬮槦鍒椾腑錛屽洜姝ゅ畬鎴愮鍙e氨鍙互鍦ㄨ嚜宸辯殑綰跨▼姹犱腑甯姪鎴戜滑緇存姢榪欎釜綰跨▼銆傚畬鎴愮鍙g殑I/0瀹屾垚闃熷垪涓瓨鏀句簡褰撻噸鍙營/0瀹屾垚鐨勭粨鏋?--- 涓鏉$邯褰曪紝璇ョ邯褰曟嫢鏈夊洓涓瓧孌碉紝鍓嶄笁欏瑰氨瀵瑰簲GetQueuedCompletionStatus鍑芥暟鐨?銆?銆?鍙傛暟錛屾渶鍚庝竴涓瓧孌墊槸閿欒淇℃伅 dwError銆傛垜浠篃鍙互閫氳繃璋冪敤PostQueudCompletionStatus妯℃嫙瀹屾垚浜嗕竴涓噸鍙營/0鎿嶄綔銆?
褰揑/0瀹屾垚闃熷垪涓嚭鐜頒簡綰綍錛屽畬鎴愮鍙e皢浼氭鏌ョ瓑寰呯嚎紼嬮槦鍒楋紝璇ラ槦鍒椾腑鐨勭嚎紼嬮兘鏄氳繃璋冪敤GetQueuedCompletionStatus鍑芥暟浣胯嚜 宸卞姞鍏ラ槦鍒楃殑銆傜瓑寰呯嚎紼嬮槦鍒楀緢綆鍗曪紝鍙槸淇濆瓨浜嗚繖浜涚嚎紼嬬殑ID銆傚畬鎴愮鍙d細鎸夌収鍚庤繘鍏堝嚭鐨勫師鍒欏皢涓涓嚎紼嬮槦鍒楃殑ID鏀懼叆鍒伴噴鏀劇嚎紼嬪垪琛ㄤ腑錛屽悓鏃惰綰跨▼灝嗕粠 絳夊緟GetQueuedCompletionStatus鍑芥暟榪斿洖鐨勭潯鐪犵姸鎬佷腑鍙樹負鍙皟搴︾姸鎬佺瓑寰匔PU鐨勮皟搴︺傛墍浠ユ垜浠殑綰跨▼瑕佹兂鎴愪負瀹屾垚绔彛綆$悊鐨勭嚎 紼嬶紝灝卞繀欏昏璋冪敤GetQueuedCompletionStatus鍑芥暟銆傚嚭浜庢ц兘鐨勪紭鍖栵紝瀹為檯涓婂畬鎴愮鍙h繕緇存姢浜嗕竴涓殏鍋滅嚎紼嬪垪琛紝鍏蜂綋緇嗚妭鍙互鍙傝? 銆奧indows楂樼駭緙栫▼鎸囧崡銆嬶紝鎴戜滑鐜板湪鐭ラ亾鐨勭煡璇嗭紝宸茬粡瓚沖浜嗐? 瀹屾垚绔彛綰跨▼闂存暟鎹紶閫掔嚎紼嬮棿浼犻掓暟鎹渶甯哥敤鐨勫姙娉曟槸鍦╛beginthreadex鍑芥暟涓皢鍙傛暟浼犻掔粰綰跨▼鍑芥暟錛屾垨鑰呬嬌鐢ㄥ叏灞鍙橀噺銆備絾鏄畬鎴愮鍙h繕鏈夎嚜 宸辯殑浼犻掓暟鎹殑鏂規硶錛岀瓟妗堝氨鍦ㄤ簬CompletionKey鍜孫VERLAPPED鍙傛暟銆?br> CompletionKey琚繚瀛樺湪瀹屾垚绔彛鐨勮澶囪〃涓紝鏄拰璁懼鍙ユ焺涓涓瀵瑰簲鐨勶紝鎴戜滑鍙互灝嗕笌璁懼鍙ユ焺鐩稿叧鐨勬暟鎹繚瀛樺埌CompletionKey涓紝 鎴栬呭皢CompletionKey琛ㄧず涓虹粨鏋勬寚閽堬紝榪欐牱灝卞彲浠ヤ紶閫掓洿鍔犱赴瀵岀殑鍐呭銆傝繖浜涘唴瀹瑰彧鑳藉湪涓寮濮嬪叧鑱斿畬鎴愮鍙e拰璁懼鍙ユ焺鐨勬椂鍊欏仛錛屽洜姝や笉鑳藉湪浠ュ悗 鍔ㄦ佹敼鍙樸?br> OVERLAPPED鍙傛暟鏄湪姣忔璋冪敤ReadFile榪欐牱鐨勬敮鎸侀噸鍙營/0鐨勫嚱鏁版椂浼犻掔粰瀹屾垚绔彛鐨勩傛垜浠彲浠ョ湅鍒幫紝濡傛灉鎴戜滑涓嶆槸瀵規枃浠惰澶囧仛鎿嶄綔錛岃 緇撴瀯鐨勬垚鍛樺彉閲忓氨瀵規垜浠嚑涔庢鏃犱綔鐢ㄣ傛垜浠渶瑕侀檮鍔犱俊鎭紝鍙互鍒涘緩鑷繁鐨勭粨鏋勶紝鐒跺悗灝哋VERLAPPED緇撴瀯鍙橀噺浣滀負鎴戜滑緇撴瀯鍙橀噺鐨勭涓涓垚鍛橈紝鐒跺悗浼? 閫掔涓涓垚鍛樺彉閲忕殑鍦板潃緇橰eadFile鍑芥暟銆傚洜涓虹被鍨嬪尮閰嶏紝褰撶劧鍙互閫氳繃緙栬瘧銆傚綋GetQueuedCompletionStatus鍑芥暟榪斿洖鏃訛紝鎴? 浠彲浠ヨ幏鍙栧埌絎竴涓垚鍛樺彉閲忕殑鍦板潃錛岀劧鍚庝竴涓畝鍗曠殑寮哄埗杞崲錛屾垜浠氨鍙互鎶婂畠褰撲綔瀹屾暣鐨勮嚜瀹氫箟緇撴瀯鐨勬寚閽堜嬌鐢紝榪欐牱灝卞彲浠ヤ紶閫掑緢澶氶檮鍔犵殑鏁版嵁浜嗐傚お濂戒簡錛? 鍙湁涓鐐硅娉ㄦ剰錛屽鏋滆法綰跨▼浼犻掞紝璇鋒敞鎰忓皢鏁版嵁鍒嗛厤鍒板爢涓婏紝騫朵笖鎺ユ敹绔簲璇ュ皢鏁版嵁鐢ㄥ畬鍚庨噴鏀俱傛垜浠氬父闇瑕佸皢ReadFile榪欐牱鐨勫紓姝ュ嚱鏁扮殑鎵闇瑕佺殑緙? 鍐插尯鏀懼埌鎴戜滑鑷畾涔夌殑緇撴瀯涓紝榪欐牱褰揋etQueuedCompletionStatus琚繑鍥炴椂錛屾垜浠殑鑷畾涔夌粨鏋勭殑緙撳啿鍖哄彉閲忎腑灝卞瓨鏀句簡I/0鎿嶄綔鐨? 鏁版嵁銆侰ompletionKey鍜孫VERLAPPED鍙傛暟錛岄兘鍙互閫氳繃GetQueuedCompletionStatus鍑芥暟鑾峰緱銆?br> 綰跨▼鐨勫畨鍏ㄩ鍑?br>        寰堝綰跨▼涓轟簡涓嶆涓嬈$殑鎵ц寮傛鏁版嵁澶勭悊錛岄渶瑕佷嬌鐢ㄥ涓嬭鍙?br> while (true)
{
       ......
       GetQueuedCompletionStatus(...);
        ......
}
閭d箞濡備綍閫鍑哄憿錛岀瓟妗堝氨鍦ㄤ簬涓婇潰鏇炬彁鍒扮殑PostQueudCompletionStatus鍑芥暟錛屾垜浠彲浠ョ敤瀹冨彂閫佷竴涓嚜瀹氫箟鐨勫寘鍚簡OVERLAPPED鎴愬憳鍙橀噺鐨勭粨鏋勫湴鍧錛岄噷闈㈠寘鍚竴涓姸鎬佸彉閲忥紝褰撶姸鎬佸彉閲忎負閫鍑烘爣蹇楁椂錛岀嚎紼嬪氨鎵ц娓呴櫎鍔ㄤ綔鐒跺悗閫鍑恒?br>
5銆乄indows瀹屾垚绔彛鐨勫疄渚嬩唬鐮侊細
DWORD WINAPI WorkerThread(LPVOID lpParam)
{
ULONG_PTR *PerHandleKey;
OVERLAPPED *Overlap;
OVERLAPPEDPLUS *OverlapPlus,
*newolp;
DWORD dwBytesXfered;
while (1)
{
ret = GetQueuedCompletionStatus(
hIocp,
&dwBytesXfered,
(PULONG_PTR)&PerHandleKey,
&Overlap,
INFINITE);
if (ret == 0)
{
// Operation failed
continue;
}
OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol);
switch (OverlapPlus->OpCode)
{
case OP_ACCEPT:
// Client socket is contained in OverlapPlus.sclient
// Add client to completion port
CreateIoCompletionPort(
(HANDLE)OverlapPlus->sclient,
hIocp,
(ULONG_PTR)0,
0);
// Need a new OVERLAPPEDPLUS structure
// for the newly accepted socket. Perhaps
// keep a look aside list of free structures.
newolp = AllocateOverlappedPlus();
if (!newolp)
{
// Error
}
newolp->s = OverlapPlus->sclient;
newolp->OpCode = OP_READ;
// This function divpares the data to be sent
PrepareSendBuffer(&newolp->wbuf);
ret = WSASend(
newolp->s,
&newolp->wbuf,
1,
&newolp->dwBytes,
0,
&newolp.ol,
NULL);
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
// Error
}
}
// Put structure in look aside list for later use
FreeOverlappedPlus(OverlapPlus);
// Signal accept thread to issue another AcceptEx
SetEvent(hAcceptThread);
break;
case OP_READ:
// Process the data read
// Repost the read if necessary, reusing the same
// receive buffer as before
memset(&OverlapPlus->ol, 0, sizeof(OVERLAPPED));
ret = WSARecv(
OverlapPlus->s,
&OverlapPlus->wbuf,
1,
&OverlapPlus->dwBytes,
&OverlapPlus->dwFlags,
&OverlapPlus->ol,
NULL);
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
// Error
}
}
break;
case OP_WRITE:
// Process the data sent, etc.
break;
} // switch
} // while
} // WorkerThread

鏌ョ湅浠ヤ笂浠g爜錛屾敞鎰忓鏋淥verlapped鎿嶄綔绔嬪埢澶辮觸錛堟瘮濡傦紝榪斿洖SOCKET_ERROR鎴栧叾浠栭潪WSA_IO_PENDING鐨勯敊璇級錛屽垯 娌℃湁浠諱綍瀹屾垚閫氱煡鏃墮棿浼氳鏀懼埌瀹屾垚绔彛闃熷垪閲屻傚弽涔嬶紝鍒欎竴瀹氭湁鐩稿簲鐨勯氱煡鏃墮棿琚斁鍒板畬鎴愮鍙i槦鍒椼傛洿瀹屽杽鐨勫叧浜嶹insock鐨勫畬鎴愮鍙f満鍒訛紝鍙互鍙傝? MSDN鐨凪icrosoft PlatFormSDK錛岄偅閲屾湁瀹屾垚绔彛鐨勪緥瀛愩傝闂?a target="_blank">http://msdn.microsoft.com/library/techart/msdn_servrapp.htm鍙互鑾峰緱鏇村淇℃伅銆?/p>

Linux鐨凟Poll妯″瀷
Linux 2.6鍐呮牳涓彁楂樼綉緇淚/O鎬ц兘鐨勬柊鏂規硶-epoll I/O澶氳礬澶嶇敤鎶鏈湪姣旇緝澶氱殑TCP緗戠粶鏈嶅姟鍣ㄤ腑鏈変嬌鐢紝鍗蟲瘮杈冨鐨勭敤鍒皊elect鍑芥暟銆?br>
1銆佷負浠涔坰elect钀藉悗
棣栧厛錛屽湪Linux鍐呮牳涓紝select鎵鐢ㄥ埌鐨凢D_SET鏄湁闄愮殑錛屽嵆鍐呮牳涓湁涓弬鏁癬_FD_SETSIZE瀹氫箟浜嗘瘡涓狥D_SET鐨勫彞鏌勪釜鏁幫紝鍦ㄦ垜鐢ㄧ殑2.6.15-25-386鍐呮牳涓紝璇ュ兼槸1024錛屾悳绱㈠唴鏍告簮浠g爜寰楀埌錛?br> include/linux/posix_types.h:#define __FD_SETSIZE         1024
涔熷氨鏄錛屽鏋滄兂瑕佸悓鏃舵嫻?025涓彞鏌勭殑鍙鐘舵佹槸涓嶅彲鑳界敤select瀹炵幇鐨勩傛垨鑰呭悓鏃舵嫻?025涓彞鏌勭殑鍙啓鐘舵佷篃鏄笉鍙兘鐨勩傚叾嬈★紝鍐呮牳涓疄 鐜皊elect鏄敤杞鏂規硶錛屽嵆姣忔媯嫻嬮兘浼氶亶鍘嗘墍鏈塅D_SET涓殑鍙ユ焺錛屾樉鐒訛紝select鍑芥暟鎵ц鏃墮棿涓嶧D_SET涓殑鍙ユ焺涓暟鏈変竴涓瘮渚嬪叧緋伙紝 鍗硈elect瑕佹嫻嬬殑鍙ユ焺鏁拌秺澶氬氨浼氳秺璐規椂銆傚綋鐒訛紝鍦ㄥ墠鏂囦腑鎴戝茍娌℃湁鎻愬強poll鏂規硶錛屼簨瀹炰笂鐢╯elect鐨勬湅鍙嬩竴瀹氫篃璇曡繃poll錛屾垜涓漢瑙夊緱 select鍜宲oll澶у悓灝忓紓錛屼釜浜哄亸濂戒簬鐢╯elect鑰屽凡銆?/p>

2銆佸唴鏍鎬腑鎻愰珮I/O鎬ц兘鐨勬柊鏂規硶epoll
epoll鏄粈涔堬紵鎸夌収man鎵嬪唽鐨勮娉曪細鏄負澶勭悊澶ф壒閲忓彞鏌勮屼綔浜嗘敼榪涚殑poll銆傝浣跨敤epoll鍙渶瑕佽繖涓変釜緋葷粺璋冪敤錛歟poll_create(2)錛?epoll_ctl(2)錛?epoll_wait(2)銆?br> 褰撶劧錛岃繖涓嶆槸2.6鍐呮牳鎵嶆湁鐨勶紝瀹冩槸鍦?.5.44鍐呮牳涓寮曡繘鐨?epoll(4) is a new API introduced in Linux kernel 2.5.44)

Linux2.6鍐呮牳epoll浠嬬粛
鍏堜粙緇?鏈功銆奣he Linux Networking Architecture--Design and Implementation of Network Protocols in the Linux Kernel銆嬶紝浠?.4鍐呮牳璁茶ВLinux TCP/IP瀹炵幇錛岀浉褰撲笉閿?浣滀負涓涓幇瀹炰笘鐣屼腑鐨勫疄鐜幫紝寰堝鏃跺欎綘蹇呴』浣滃緢澶氭潈琛★紝榪欐椂鍊欏弬鑰冧竴涓箙緇忚冮獙鐨勭郴緇熸洿鏈夊疄闄呮剰涔夈備婦涓緥瀛?linux鍐? 鏍鎬腑sk_buff緇撴瀯涓轟簡榪芥眰閫熷害鍜屽畨鍏紝鐗虹壊浜嗛儴鍒嗗唴瀛橈紝鎵浠ュ湪鍙戦乀CP鍖呯殑鏃跺欙紝鏃犺搴旂敤灞傛暟鎹澶?sk_buff鏈灝忎篃鏈?72鐨勫瓧鑺?鍏跺疄 瀵逛簬socket搴旂敤灞傜▼搴忔潵璇達紝鍙﹀涓鏈功銆奤NIX Network Programming Volume 1銆嬫剰涔夋洿澶т竴鐐?2003騫寸殑鏃跺欙紝榪欐湰涔﹀嚭浜嗘渶鏂扮殑絎?鐗堟湰錛屼笉榪囦富瑕佽繕鏄慨璁㈢2鐗堟湰銆傚叾涓6绔犮奍/O Multiplexing銆嬫槸鏈閲嶈鐨勩係tevens緇欏嚭浜嗙綉緇淚O鐨勫熀鏈ā鍨嬨傚湪榪欓噷鏈閲嶈鐨勮帿榪囦簬select妯″瀷鍜孉synchronous I/O妯″瀷.浠庣悊璁轟笂璇達紝AIO浼間箮鏄渶楂樻晥鐨勶紝浣犵殑IO鎿嶄綔鍙互绔嬪嵆榪斿洖錛岀劧鍚庣瓑寰卭s鍛婅瘔浣營O鎿嶄綔瀹屾垚銆備絾鏄竴鐩翠互鏉ワ紝濡備綍瀹炵幇灝辨病鏈変竴涓畬緹庣殑鏂? 妗堛傛渶钁楀悕鐨剋indows瀹屾垚绔彛瀹炵幇鐨凙IO,瀹為檯涓婁篃鏄唴閮ㄧ敤綰跨▼姹犲疄鐜扮殑緗簡錛屾渶鍚庣殑緇撴灉鏄疘O鏈変釜綰跨▼姹狅紝浣犲簲鐢ㄤ篃闇瑕佷竴涓嚎紼嬫睜...... 寰堝鏂囨。鍏跺疄宸茬粡鎸囧嚭浜嗚繖甯︽潵鐨勭嚎紼媍ontext-switch甯︽潵鐨勪唬浠楓傚湪linux 騫沖彴涓婏紝鍏充簬緗戠粶AIO涓鐩存槸鏀瑰姩鏈澶氱殑鍦版柟錛?.4鐨勫勾浠e氨鏈夊緢澶欰IO鍐呮牳patch,鏈钁楀悕鐨勫簲璇ョ畻鏄疭GI閭d釜銆備絾鏄竴鐩村埌2.6鍐呮牳鍙戝竷錛岀綉緇? 妯″潡鐨凙IO涓鐩存病鏈夎繘鍏ョǔ瀹氬唴鏍哥増鏈?澶ч儴鍒嗛兘鏄嬌鐢ㄧ敤鎴風嚎紼嬫ā鎷熸柟娉曪紝鍦ㄤ嬌鐢ㄤ簡NPTL鐨刲inux涓婇潰鍏跺疄鍜寃indows鐨勫畬鎴愮鍙e熀鏈笂宸笉澶? 浜?銆?.6鍐呮牳鎵鏀寔鐨凙IO鐗規寚紓佺洏鐨凙IO---鏀寔io_submit(),io_getevents()浠ュ強瀵笵irect IO鐨勬敮鎸?灝辨槸緇曡繃VFS緋葷粺buffer鐩存帴鍐欑‖鐩橈紝瀵逛簬嫻佹湇鍔″櫒鍦ㄥ唴瀛樺鉤紼蟲т笂鏈夌浉褰撳府鍔?銆?br> 鎵浠ワ紝鍓╀笅鐨剆elect妯″瀷鍩烘湰涓婂氨鏄垜浠湪linux涓婇潰鐨勫敮涓閫夋嫨錛屽叾瀹烇紝濡傛灉鍔犱笂no-block socket鐨勯厤緗紝鍙互瀹屾垚涓涓?浼?AIO鐨勫疄鐜幫紝鍙笉榪囨帹鍔ㄥ姏鍦ㄤ簬浣犺屼笉鏄痮s鑰屽凡銆備笉榪囦紶緇熺殑select/poll鍑芥暟鏈夌潃涓浜涙棤娉曞繊鍙楃殑緙? 鐐癸紝鎵浠ユ敼榪涗竴鐩存槸2.4-2.5寮鍙戠増鏈唴鏍哥殑浠誨姟錛屽寘鎷?dev/poll錛宺ealtime signal絳夌瓑銆傛渶緇堬紝Davide Libenzi寮鍙戠殑epoll榪涘叆2.6鍐呮牳鎴愪負姝e紡鐨勮В鍐蟲柟妗?br>
3銆乪poll鐨勪紭鐐?/strong>
<1>鏀寔涓涓繘紼嬫墦寮澶ф暟鐩殑socket鎻忚堪絎?FD)
select 鏈涓嶈兘蹇嶅彈鐨勬槸涓涓繘紼嬫墍鎵撳紑鐨凢D鏄湁涓瀹氶檺鍒剁殑錛岀敱FD_SETSIZE璁劇疆錛岄粯璁ゅ兼槸2048銆傚浜庨偅浜涢渶瑕佹敮鎸佺殑涓婁竾榪炴帴鏁扮洰鐨処M鏈嶅姟鍣ㄦ潵璇存樉 鐒跺お灝戜簡銆傝繖鏃跺欎綘涓鏄彲浠ラ夋嫨淇敼榪欎釜瀹忕劧鍚庨噸鏂扮紪璇戝唴鏍革紝涓嶈繃璧勬枡涔熷悓鏃舵寚鍑鴻繖鏍蜂細甯︽潵緗戠粶鏁堢巼鐨勪笅闄嶏紝浜屾槸鍙互閫夋嫨澶氳繘紼嬬殑瑙e喅鏂規(浼犵粺鐨? Apache鏂規)錛屼笉榪囪櫧鐒秎inux涓婇潰鍒涘緩榪涚▼鐨勪唬浠鋒瘮杈冨皬錛屼絾浠嶆棫鏄笉鍙拷瑙嗙殑錛屽姞涓婅繘紼嬮棿鏁版嵁鍚屾榪滄瘮涓嶄笂綰跨▼闂村悓姝ョ殑楂樻晥錛屾墍浠ヤ篃涓嶆槸涓縐嶅畬 緹庣殑鏂規銆備笉榪? epoll鍒欐病鏈夎繖涓檺鍒訛紝瀹冩墍鏀寔鐨凢D涓婇檺鏄渶澶у彲浠ユ墦寮鏂囦歡鐨勬暟鐩紝榪欎釜鏁板瓧涓鑸繙澶т簬2048,涓句釜渚嬪瓙,鍦?GB鍐呭瓨鐨勬満鍣ㄤ笂澶х害鏄?0涓囧乏 鍙籌紝鍏蜂綋鏁扮洰鍙互cat /proc/sys/fs/file-max瀵熺湅,涓鑸潵璇磋繖涓暟鐩拰緋葷粺鍐呭瓨鍏崇郴寰堝ぇ銆?br> <2>IO鏁堢巼涓嶉殢FD鏁扮洰澧炲姞鑰岀嚎鎬т笅闄?br> 浼犵粺鐨剆elect/poll鍙︿竴涓嚧鍛藉急鐐瑰氨鏄綋浣犳嫢鏈変竴涓緢澶х殑socket闆嗗悎錛屼笉榪囩敱浜庣綉緇滃歡鏃訛紝浠諱竴鏃墮棿鍙湁閮ㄥ垎鐨剆ocket鏄?媧昏穬"鐨勶紝 浣嗘槸select/poll姣忔璋冪敤閮戒細綰挎ф壂鎻忓叏閮ㄧ殑闆嗗悎錛屽鑷存晥鐜囧憟鐜扮嚎鎬т笅闄嶃備絾鏄痚poll涓嶅瓨鍦ㄨ繖涓棶棰橈紝瀹冨彧浼氬"媧昏穬"鐨剆ocket榪涜 鎿嶄綔---榪欐槸鍥犱負鍦ㄥ唴鏍稿疄鐜頒腑epoll鏄牴鎹瘡涓猣d涓婇潰鐨刢allback鍑芥暟瀹炵幇鐨勩傞偅涔堬紝鍙湁"媧昏穬"鐨剆ocket鎵嶄細涓誨姩鐨勫幓璋冪敤 callback鍑芥暟錛屽叾浠杋dle鐘舵乻ocket鍒欎笉浼氾紝鍦ㄨ繖鐐逛笂錛宔poll瀹炵幇浜嗕竴涓?浼?AIO錛屽洜涓鴻繖鏃跺欐帹鍔ㄥ姏鍦╫s鍐呮牳銆傚湪涓浜? benchmark涓紝濡傛灉鎵鏈夌殑socket鍩烘湰涓婇兘鏄椿璺冪殑---姣斿涓涓珮閫烲AN鐜錛宔poll騫朵笉姣攕elect/poll鏈変粈涔堟晥鐜囷紝鐩? 鍙嶏紝濡傛灉榪囧浣跨敤epoll_ctl,鏁堢巼鐩告瘮榪樻湁紼嶅井鐨勪笅闄嶃備絾鏄竴鏃︿嬌鐢╥dle connections妯℃嫙WAN鐜,epoll鐨勬晥鐜囧氨榪滃湪select/poll涔嬩笂浜嗐?br> <3>浣跨敤mmap鍔犻熷唴鏍鎬笌鐢ㄦ埛絀洪棿鐨勬秷鎭紶閫掋?br> 榪欑偣瀹為檯涓婃秹鍙婂埌epoll鐨勫叿浣撳疄鐜頒簡銆傛棤璁烘槸select,poll榪樻槸epoll閮介渶瑕佸唴鏍告妸FD娑堟伅閫氱煡緇欑敤鎴風┖闂達紝濡備綍閬垮厤涓嶅繀瑕佺殑鍐呭瓨鎷瘋礉灝? 寰堥噸瑕侊紝鍦ㄨ繖鐐逛笂錛宔poll鏄氳繃鍐呮牳浜庣敤鎴風┖闂磎map鍚屼竴鍧楀唴瀛樺疄鐜扮殑銆傝屽鏋滀綘鎯蟲垜涓鏍蜂粠2.5鍐呮牳灝卞叧娉╡poll鐨勮瘽錛屼竴瀹氫笉浼氬繕璁版墜宸? mmap榪欎竴姝ョ殑銆?br> <4>鍐呮牳寰皟
榪欎竴鐐瑰叾瀹炰笉綆梕poll鐨勪紭鐐逛簡錛岃屾槸鏁翠釜linux騫沖彴鐨勪紭鐐廣備篃璁鎬綘鍙互鎬鐤憀inux騫沖彴錛屼絾鏄綘鏃犳硶鍥為伩linux騫沖彴璧嬩簣浣犲井璋冨唴鏍哥殑鑳藉姏銆? 姣斿錛屽唴鏍窽CP/IP鍗忚鏍堜嬌鐢ㄥ唴瀛樻睜綆$悊sk_buff緇撴瀯錛岄偅涔堝彲浠ュ湪榪愯鏃舵湡鍔ㄦ佽皟鏁磋繖涓唴瀛榩ool(skb_head_pool)鐨勫ぇ灝?- - 閫氳繃echo XXXX>/proc/sys/net/core/hot_list_length瀹屾垚銆傚啀姣斿listen鍑芥暟鐨勭2涓弬鏁?TCP瀹屾垚3嬈℃彙鎵? 鐨勬暟鎹寘闃熷垪闀垮害)錛屼篃鍙互鏍規嵁浣犲鉤鍙板唴瀛樺ぇ灝忓姩鎬佽皟鏁淬傛洿鐢氳嚦鍦ㄤ竴涓暟鎹寘闈㈡暟鐩法澶т絾鍚屾椂姣忎釜鏁版嵁鍖呮湰韜ぇ灝忓嵈寰堝皬鐨勭壒孌婄郴緇熶笂灝濊瘯鏈鏂扮殑NAPI緗? 鍗¢┍鍔ㄦ灦鏋勩?br> 4銆乪poll鐨勫伐浣滄ā寮?br> 浠や漢楂樺叴鐨勬槸錛?.6鍐呮牳鐨別poll姣斿叾2.5寮鍙戠増鏈殑/dev/epoll綆媧佷簡璁稿錛屾墍浠ワ紝澶ч儴鍒嗘儏鍐典笅錛屽己澶х殑涓滆タ寰寰鏄畝鍗曠殑銆傚敮涓鏈夌偣楹葷儲鏄痚poll鏈?縐嶅伐浣滄柟寮?LT鍜孍T銆?br> LT(level triggered)鏄己鐪佺殑宸ヤ綔鏂瑰紡錛屽茍涓斿悓鏃舵敮鎸乥lock鍜宯o-block socket.鍦ㄨ繖縐嶅仛娉曚腑錛屽唴鏍稿憡璇変綘涓涓枃浠舵弿榪扮鏄惁灝辯華浜嗭紝鐒跺悗浣犲彲浠ュ榪欎釜灝辯華鐨刦d榪涜IO鎿嶄綔銆傚鏋滀綘涓嶄綔浠諱綍鎿嶄綔錛屽唴鏍歌繕鏄細緇х畫閫氱煡浣? 鐨勶紝鎵浠ワ紝榪欑妯″紡緙栫▼鍑洪敊璇彲鑳芥ц灝忎竴鐐廣備紶緇熺殑select/poll閮芥槸榪欑妯″瀷鐨勪唬琛紟
ET (edge-triggered)鏄珮閫熷伐浣滄柟寮忥紝鍙敮鎸乶o-block socket銆傚湪榪欑妯″紡涓嬶紝褰撴弿榪扮浠庢湭灝辯華鍙樹負灝辯華鏃訛紝鍐呮牳閫氳繃epoll鍛婅瘔浣犮傜劧鍚庡畠浼氬亣璁句綘鐭ラ亾鏂囦歡鎻忚堪絎﹀凡緇忓氨緇紝騫朵笖涓嶄細鍐嶄負閭d釜鏂囦歡鎻忚堪 絎﹀彂閫佹洿澶氱殑灝辯華閫氱煡錛岀洿鍒頒綘鍋氫簡鏌愪簺鎿嶄綔瀵艱嚧閭d釜鏂囦歡鎻忚堪絎︿笉鍐嶄負灝辯華鐘舵佷簡(姣斿錛屼綘鍦ㄥ彂閫侊紝鎺ユ敹鎴栬呮帴鏀惰姹傦紝鎴栬呭彂閫佹帴鏀剁殑鏁版嵁灝戜簬涓瀹氶噺鏃跺鑷? 浜嗕竴涓狤WOULDBLOCK 閿欒錛夈備絾鏄娉ㄦ剰錛屽鏋滀竴鐩翠笉瀵硅繖涓猣d浣淚O鎿嶄綔(浠庤屽鑷村畠鍐嶆鍙樻垚鏈氨緇?錛屽唴鏍鎬笉浼氬彂閫佹洿澶氱殑閫氱煡(only once),涓嶈繃鍦═CP鍗忚涓紝ET妯″紡鐨勫姞閫熸晥鐢ㄤ粛闇瑕佹洿澶氱殑benchmark紜銆?br> epoll鍙湁epoll_create,epoll_ctl,epoll_wait 3涓郴緇熻皟鐢紝鍏蜂綋鐢ㄦ硶璇峰弬鑰?a target="_blank">http://www.xmailserver.org/linux-patches/nio-improve.html 錛屽湪http://www.kegel.com/rn/涔熸湁涓涓畬鏁寸殑渚嬪瓙錛屽ぇ瀹朵竴鐪嬪氨鐭ラ亾濡備綍浣跨敤浜?br> Leader/follower妯″紡綰跨▼pool瀹炵幇錛屼互鍙婂拰epoll鐨勯厤鍚堛?br>
5銆?epoll鐨勪嬌鐢ㄦ柟娉?/strong>
    棣栧厛閫氳繃create_epoll(int maxfds)鏉ュ垱寤轟竴涓猠poll鐨勫彞鏌勶紝鍏朵腑maxfds涓轟綘epoll鎵鏀寔鐨勬渶澶у彞鏌勬暟銆傝繖涓嚱鏁頒細榪斿洖涓涓柊鐨別poll鍙ユ焺錛屼箣鍚庣殑鎵鏈夋搷浣? 灝嗛氳繃榪欎釜鍙ユ焺鏉ヨ繘琛屾搷浣溿傚湪鐢ㄥ畬涔嬪悗錛岃寰楃敤close()鏉ュ叧闂繖涓垱寤哄嚭鏉ョ殑epoll鍙ユ焺銆? 涔嬪悗鍦ㄤ綘鐨勭綉緇滀富寰幆閲岄潰錛屾瘡涓甯х殑璋冪敤epoll_wait(int epfd, epoll_event events, int max events, int timeout)鏉ユ煡璇㈡墍鏈夌殑緗戠粶鎺ュ彛錛岀湅鍝竴涓彲浠ヨ錛屽摢涓涓彲浠ュ啓浜嗐傚熀鏈殑璇硶涓猴細
nfds = epoll_wait(kdpfd, events, maxevents, -1);
鍏朵腑kdpfd涓虹敤epoll_create鍒涘緩涔嬪悗鐨勫彞鏌勶紝events鏄竴涓猠poll_event*鐨勬寚閽堬紝褰揺poll_wait榪欎釜鍑芥暟鎿嶄綔鎴? 鍔熶箣鍚庯紝epoll_events閲岄潰灝嗗偍瀛樻墍鏈夌殑璇誨啓浜嬩歡銆俶ax_events鏄綋鍓嶉渶瑕佺洃鍚殑鎵鏈塻ocket鍙ユ焺鏁般傛渶鍚庝竴涓猼imeout鏄? epoll_wait鐨勮秴鏃訛紝涓?鐨勬椂鍊欒〃紺洪┈涓婅繑鍥烇紝涓?1鐨勬椂鍊欒〃紺轟竴鐩寸瓑涓嬪幓錛岀洿鍒版湁浜嬩歡鑼冨洿錛屼負浠繪剰姝f暣鏁扮殑鏃跺欒〃紺虹瓑榪欎箞闀跨殑鏃墮棿錛屽鏋滀竴鐩存病 鏈変簨浠訛紝鍒欒寖鍥淬備竴鑸鏋滅綉緇滀富寰幆鏄崟鐙殑綰跨▼鐨勮瘽錛屽彲浠ョ敤-1鏉ョ瓑錛岃繖鏍峰彲浠ヤ繚璇佷竴浜涙晥鐜囷紝濡傛灉鏄拰涓婚昏緫鍦ㄥ悓涓涓嚎紼嬬殑璇濓紝鍒欏彲浠ョ敤0鏉ヤ繚璇佷富寰幆 鐨勬晥鐜囥?/p>

epoll_wait鑼冨洿涔嬪悗搴旇鏄竴涓驚鐜紝閬嶅埄鎵鏈夌殑浜嬩歡錛?
for(n = 0; n < nfds; ++n) {
                if(events[n].data.fd == listener) { //濡傛灉鏄富socket鐨勪簨浠剁殑璇濓紝鍒欒〃紺烘湁鏂拌繛鎺ヨ繘鍏ヤ簡錛岃繘琛屾柊榪炴帴鐨勫鐞嗐?
                    client = accept(listener, (struct sockaddr *) &local,
                                    &addrlen);
                    if(client < 0){
                        perror("accept");
                        continue;
                    }
                    setnonblocking(client); // 灝嗘柊榪炴帴緗簬闈為樆濉炴ā寮?
                    ev.events = EPOLLIN | EPOLLET; // 騫朵笖灝嗘柊榪炴帴涔熷姞鍏POLL鐨勭洃鍚槦鍒椼?
娉ㄦ剰錛岃繖閲岀殑鍙傛暟EPOLLIN | EPOLLET騫舵病鏈夎緗鍐檚ocket鐨勭洃鍚紝濡傛灉鏈夊啓鎿嶄綔鐨勮瘽錛岃繖涓椂鍊檈poll鏄笉浼氳繑鍥炰簨浠剁殑錛屽鏋滆瀵瑰啓鎿嶄綔涔熺洃鍚殑璇濓紝搴旇鏄疎POLLIN | EPOLLOUT | EPOLLET
                    ev.data.fd = client;
                    if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
// 璁劇疆濂絜vent涔嬪悗錛屽皢榪欎釜鏂扮殑event閫氳繃epoll_ctl鍔犲叆鍒癳poll鐨勭洃鍚槦鍒楅噷闈紝榪欓噷鐢‥POLL_CTL_ADD鏉ュ姞涓涓柊鐨? epoll浜嬩歡錛岄氳繃EPOLL_CTL_DEL鏉ュ噺灝戜竴涓猠poll浜嬩歡錛岄氳繃EPOLL_CTL_MOD鏉ユ敼鍙樹竴涓簨浠剁殑鐩戝惉鏂瑰紡銆?
                        fprintf(stderr, "epoll set insertion error: fd=%d0,
                                client);
                        return -1;
                    }
                }
                else // 濡傛灉涓嶆槸涓籹ocket鐨勪簨浠剁殑璇濓紝鍒欎唬琛ㄦ槸涓涓敤鎴穝ocket鐨勪簨浠訛紝鍒欐潵澶勭悊榪欎釜鐢ㄦ埛socket鐨勪簨鎯咃紝姣斿璇磖ead(fd,xxx)涔嬬被鐨勶紝鎴栬呬竴浜涘叾浠栫殑澶勭悊銆?
                    do_use_fd(events[n].data.fd);
}

瀵癸紝epoll鐨勬搷浣滃氨榪欎箞綆鍗曪紝鎬誨叡涓嶈繃4涓狝PI錛歟poll_create, epoll_ctl, epoll_wait鍜宑lose銆?
濡傛灉鎮ㄥepoll鐨勬晥鐜囪繕涓嶅お浜嗚В錛岃鍙傝冩垜涔嬪墠鍏充簬緗戠粶娓告垙鐨勭綉緇滅紪紼嬬瓑鐩稿叧鐨勬枃绔犮?/p>


浠ュ墠鍏徃鐨勬湇鍔″櫒閮芥槸浣跨敤HTTP榪炴帴錛屼絾鏄繖鏍風殑璇濓紝鍦ㄦ墜鏈虹洰鍓嶇殑緗戠粶鎯呭喌涓嬩笉浣嗘樉寰楅熷害杈冩參錛岃屼笖涓嶇ǔ瀹氥傚洜姝ゅぇ瀹朵竴鑷村悓鎰忕敤SOCKET鏉ヨ繘琛岃繛 鎺ャ傝櫧鐒朵嬌鐢⊿OCKET涔嬪悗錛屽浜庣敤鎴風殑璐圭敤鍙兘浼氬鍔?鐢變簬鏄敤浜咰MNET鑰岄潪CMWAP)錛屼絾鏄紝縐夌潃鐢ㄦ埛浣撻獙鑷充笂鐨勫師鍒欙紝鐩鎬俊澶у榪樻槸鑳藉鎺ュ彈 鐨?甯屾湜閭d簺鐜╁鏈堟湯鏀跺埌甯愬崟涓嶅悗鑳藉淇濇寔鍏嬪埗...)銆?br> 榪欐鐨勬湇鍔″櫒璁捐涓紝鏈閲嶈鐨勪竴涓獊鐮達紝鏄嬌鐢ㄤ簡EPOLL妯″瀷錛岃櫧鐒跺涔嬩篃鏄竴鐭ュ崐瑙o紝浣嗘槸鏃㈢劧鍦ㄥ悇澶C緗戞父涓凡緇忕粡榪囦簡濡傛涓ラ叿鐨勮冮獙錛岀浉淇′粬涓嶄細璁╂垜浠け鏈涳紝浣跨敤鍚庣殑緇撴灉錛岀‘瀹炰篃鏄〃鐜扮浉褰撲笉閿欍傚湪榪欓噷錛屾垜榪樻槸涓昏澶ц嚧浠嬬粛涓涓嬭繖涓ā鍨嬬殑緇撴瀯銆?br> 6銆丩inux涓婨POll緙栫▼瀹炰緥
EPOLL妯″瀷浼間箮鍙湁涓縐嶆牸寮忥紝鎵浠ュぇ瀹跺彧瑕佸弬鑰冩垜涓嬮潰鐨勪唬鐮侊紝灝辮兘澶熷EPOLL鏈夋墍浜嗚В浜嗭紝浠g爜鐨勮В閲婇兘宸茬粡鍦ㄦ敞閲婁腑錛?/p>

while (TRUE)
{
int nfds = epoll_wait (m_epoll_fd, m_events, MAX_EVENTS, EPOLL_TIME_OUT);//絳夊緟EPOLL鏃墮棿鐨勫彂鐢燂紝鐩稿綋浜庣洃鍚紝鑷充簬鐩稿叧鐨勭鍙o紝闇瑕佸湪鍒濆鍖朎POLL鐨勬椂鍊欑粦瀹氥?br> if (nfds <= 0)
continue;
m_bOnTimeChecking = FALSE;
G_CurTime = time(NULL);
for (int i=0; i
{
try
{
if (m_events.data.fd == m_listen_http_fd)//濡傛灉鏂扮洃嫻嬪埌涓涓狧TTP鐢ㄦ埛榪炴帴鍒扮粦瀹氱殑HTTP绔彛錛屽緩绔嬫柊鐨勮繛鎺ャ傜敱浜庢垜浠柊閲囩敤浜哠OCKET榪炴帴錛屾墍浠ュ熀鏈病鐢ㄣ?br> {
OnAcceptHttpEpoll ();
}
else if (m_events.data.fd == m_listen_sock_fd)//濡傛灉鏂扮洃嫻嬪埌涓涓猄OCKET鐢ㄦ埛榪炴帴鍒頒簡緇戝畾鐨凷OCKET绔彛錛屽緩绔嬫柊鐨勮繛鎺ャ?br> {
OnAcceptSockEpoll ();
}
else if (m_events.events & EPOLLIN)//濡傛灉鏄凡緇忚繛鎺ョ殑鐢ㄦ埛錛屽茍涓旀敹鍒版暟鎹紝閭d箞榪涜璇誨叆銆?br> {
OnReadEpoll (i);
}

OnWriteEpoll (i);//鏌ョ湅褰撳墠鐨勬椿鍔ㄨ繛鎺ユ槸鍚︽湁闇瑕佸啓鍑虹殑鏁版嵁銆?br> }
catch (int)
{
PRINTF ("CATCH鎹曡幏閿欒\n");
continue;
}
}
m_bOnTimeChecking = TRUE;
OnTimer ();//榪涜涓浜涘畾鏃剁殑鎿嶄綔錛屼富瑕佸氨鏄垹闄や竴浜涚煭綰跨敤鎴風瓑銆?br> }
鍏跺疄EPOLL鐨勭簿鍗庯紝涔熷氨鏄笂榪扮殑鍑犳鐭煭鐨勪唬鐮侊紝鐪嬫潵鏃朵唬鐪熺殑涓嶅悓浜嗭紝浠ュ墠濡備綍鎺ュ彈澶ч噺鐢ㄦ埛榪炴帴鐨勯棶棰橈紝鐜板湪鍗磋濡傛杞繪澗鐨勬悶瀹氾紝鐪熸槸璁╀漢涓嶅緱涓嶆劅鍙癸紝瀵瑰摢銆?/p>
鎬葷粨
Windows瀹屾垚绔彛涓嶭inux epoll鎶鏈柟妗堟槸榪?涓鉤鍙頒笂瀹炵幇寮傛IO鍜岃璁″紑鍙戜竴涓ぇ瀹歸噺錛屽叿鍙墿灞曟х殑winsock紼嬪簭鎸囨湇鍔$▼搴忕殑寰堝ソ鐨勯夋嫨錛屾湰鏂囧榪?涓妧鏈殑瀹炵幇鍘熺悊鍜屽疄闄呯殑浣跨敤鏂規硶鍋氫簡涓涓緇嗙殑浠嬬粛

]]>
浼彞鏌勮漿鍖栦負鐪熷彞鏌?/title><link>http://m.shnenglu.com/guojingjia2006/archive/2010/04/28/113828.html</link><dc:creator>灝忔灉瀛?/dc:creator><author>灝忔灉瀛?/author><pubDate>Wed, 28 Apr 2010 02:59:00 GMT</pubDate><guid>http://m.shnenglu.com/guojingjia2006/archive/2010/04/28/113828.html</guid><wfw:comment>http://m.shnenglu.com/guojingjia2006/comments/113828.html</wfw:comment><comments>http://m.shnenglu.com/guojingjia2006/archive/2010/04/28/113828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/guojingjia2006/comments/commentRss/113828.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/guojingjia2006/services/trackbacks/113828.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">HANDLE hThreadParent;<br>    </span><span style="color: #008000;">//</span><span style="color: #008000;">CreateThread(NULL,0,ChildThread,(PVOID)hThreadParent,0,NULL);</span><span style="color: #008000;"><br></span><span style="color: #000000;">    DuplicateHandle(GetCurrentProcess(),GetCurrentThread(),GetCurrentProcess(),</span><span style="color: #000000;">&</span><span style="color: #000000;">hThreadParent,<br>        </span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #0000ff;">false</span><span style="color: #000000;">,DUPLICATE_SAME_ACCESS);<br>    _beginthreadex(NULL,</span><span style="color: #000000;">0</span><span style="color: #000000;">,ChildThread,(PVOID)hThreadParent,</span><span style="color: #000000;">0</span><span style="color: #000000;">,NULL);</span></div> <br><img src ="http://m.shnenglu.com/guojingjia2006/aggbug/113828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/guojingjia2006/" target="_blank">灝忔灉瀛?/a> 2010-04-28 10:59 <a href="http://m.shnenglu.com/guojingjia2006/archive/2010/04/28/113828.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鏋氫婦搴旂敤紼嬪簭(杞澆microsoft)http://m.shnenglu.com/guojingjia2006/archive/2010/04/27/113696.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Tue, 27 Apr 2010 04:47:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2010/04/27/113696.htmlhttp://m.shnenglu.com/guojingjia2006/comments/113696.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2010/04/27/113696.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/113696.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/113696.html鏋氫婦欏跺眰紿楀彛濡傛灉灝嗘灇涓捐繘紼嬩笌鏋氫婦妗岄潰涓婄殑欏跺眰紿楀彛榪涜姣旇緝錛岄偅涔堟灇涓鵑《灞傜獥鍙e彲鑳芥洿瀹規槗涓浜涖傝鏋氫婦欏跺眰紿楀彛錛岃浣跨敤 EnumWindows() 鍑芥暟銆備笉瑕佷嬌鐢?nbsp;GetWindo...  闃呰鍏ㄦ枃

]]>
鎿嶄綔緋葷粺鐗堟湰http://m.shnenglu.com/guojingjia2006/archive/2010/04/27/113692.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Tue, 27 Apr 2010 03:10:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2010/04/27/113692.htmlhttp://m.shnenglu.com/guojingjia2006/comments/113692.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2010/04/27/113692.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/113692.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/113692.html#include <windows.h>
#include 
<stdio.h>


BOOL IsWin7 () 
{
   OSVERSIONINFOEX osvi;
   DWORDLONG dwlConditionMask 
= 0;
   
int op=VER_GREATER;

   
// Initialize the OSVERSIONINFOEX structure.

   ZeroMemory(
&osvi, sizeof(OSVERSIONINFOEX));
   osvi.dwOSVersionInfoSize 
= sizeof(OSVERSIONINFOEX);
   osvi.dwMajorVersion 
= 6;
   osvi.dwMinorVersion 
= 1;

   
// Initialize the condition mask.

   VER_SET_CONDITION( dwlConditionMask, VER_MAJORVERSION, op );
   VER_SET_CONDITION( dwlConditionMask, VER_MINORVERSION, op );
  

   
// Perform the test.

   
return VerifyVersionInfo(
      
&osvi, 
      VER_MAJORVERSION 
| VER_MINORVERSION,
      dwlConditionMask);
}

void main()
{
    
if(IsWin7())
        printf(
"yes.\n");
    
else{
        printf(
"no.\n");
    }
}


]]>
榪涚▼鐜鍙橀噺http://m.shnenglu.com/guojingjia2006/archive/2010/04/27/113690.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Tue, 27 Apr 2010 02:47:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2010/04/27/113690.htmlhttp://m.shnenglu.com/guojingjia2006/comments/113690.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2010/04/27/113690.html#Feedback0http://m.shnenglu.com/guojingjia2006/comments/commentRss/113690.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/113690.html#include <iostream>
#include 
<windows.h>
#include 
<iostream>
#include 
<psapi.h>
#include 
<sstream>
#include 
<fstream>

using namespace std;


int _tmain(int argc, _TCHAR* argv[],TCHAR* envp[])
{
    
//PTSTR pEnvBlock=::GetEnvironmentStrings();
    
//TCHAR szName[MAX_PATH];
    
//TCHAR szValue[MAX_PATH];
    int current=0;
    PTSTR
* pElement =(PTSTR*) envp;
    PTSTR pCurrent
=NULL;
    
while(pElement!=NULL){ 
        pCurrent
=(PTSTR)(*pElement);
        
if(pCurrent==NULL){
            pElement
=NULL;
        }
else{
            _tprintf(TEXT(
"[%u] %s\r\n"),current,pCurrent);
            current
++;
            pElement
++;
        }
    }
}


]]>
鏂囦歡杈撳叆杈撳嚭閲嶅畾鍚?/title><link>http://m.shnenglu.com/guojingjia2006/archive/2009/03/11/76212.html</link><dc:creator>灝忔灉瀛?/dc:creator><author>灝忔灉瀛?/author><pubDate>Wed, 11 Mar 2009 05:15:00 GMT</pubDate><guid>http://m.shnenglu.com/guojingjia2006/archive/2009/03/11/76212.html</guid><wfw:comment>http://m.shnenglu.com/guojingjia2006/comments/76212.html</wfw:comment><comments>http://m.shnenglu.com/guojingjia2006/archive/2009/03/11/76212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/guojingjia2006/comments/commentRss/76212.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/guojingjia2006/services/trackbacks/76212.html</trackback:ping><description><![CDATA[<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; FONT-FAMILY: courier new; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">iostream</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://m.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>#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"> 3</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif" align=top>#include </span><span style="COLOR: #000000"><</span><span style="COLOR: #000000">fstream</span><span style="COLOR: #000000">></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000"> std;<br></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> _tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> argc, _TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> argv[])<br></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img id=Codehighlighter1_119_1069_Open_Image onclick="this.style.display='none'; Codehighlighter1_119_1069_Open_Text.style.display='none'; Codehighlighter1_119_1069_Closed_Image.style.display='inline'; Codehighlighter1_119_1069_Closed_Text.style.display='inline';" src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_119_1069_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_119_1069_Closed_Text.style.display='none'; Codehighlighter1_119_1069_Open_Image.style.display='inline'; Codehighlighter1_119_1069_Open_Text.style.display='inline';" src="http://m.shnenglu.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_119_1069_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://m.shnenglu.com/Images/dot.gif"></span><span id=Codehighlighter1_119_1069_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    HANDLE hWrite,hRead;<br></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    SECURITY_ATTRIBUTES sa;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    sa.bInheritHandle</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    sa.nLength</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(sa);<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    sa.lpSecurityDescriptor</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    HANDLE input</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">CreateFile(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">in.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,GENERIC_READ,NULL,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">sa,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    HANDLE output</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">CreateFile(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">out.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,GENERIC_WRITE</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">GENERIC_READ,NULL,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">sa,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">::CreatePipe(&hRead,&hWrite,&sa,0);</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #008000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">    STARTUPINFO si;<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    ZeroMemory(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">si,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(si));<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    si.cb</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(si);<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    ::GetStartupInfo(</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">si);<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    si.dwFlags </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> STARTF_USESHOWWINDOW </span><span style="COLOR: #000000">|</span><span style="COLOR: #000000"> STARTF_USESTDHANDLES;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    si.hStdError</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    si.hStdInput</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">input;<br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    si.hStdOutput</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">output;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    si.wShowWindow</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">SW_HIDE;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    PROCESS_INFORMATION pi;<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    CreateProcess(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">..\\Debug\\test.exe</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">si,</span><span style="COLOR: #000000">&</span><span style="COLOR: #000000">pi);<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">::CloseHandle(hWrite);</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">32</span><span style="COLOR: #008000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">    WaitForSingleObject(pi.hProcess,INFINITE);<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    CloseHandle(input);<br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    CloseHandle(output);<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">char mm[1000];<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #008000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">memset(mm,0,sizeof(mm));<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #008000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">DWORD d;<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #008000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">ReadFile(hRead,mm,1000,&d,0);<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #008000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">40</span><span style="COLOR: #008000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top>    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">cout<<mm<<endl;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">41</span><span style="COLOR: #008000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://m.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">43</span><span style="COLOR: #000000"><img src="http://m.shnenglu.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div> <img src ="http://m.shnenglu.com/guojingjia2006/aggbug/76212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/guojingjia2006/" target="_blank">灝忔灉瀛?/a> 2009-03-11 13:15 <a href="http://m.shnenglu.com/guojingjia2006/archive/2009/03/11/76212.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>win32-絎旇http://m.shnenglu.com/guojingjia2006/archive/2008/08/25/59919.html灝忔灉瀛?/dc:creator>灝忔灉瀛?/author>Mon, 25 Aug 2008 08:05:00 GMThttp://m.shnenglu.com/guojingjia2006/archive/2008/08/25/59919.htmlhttp://m.shnenglu.com/guojingjia2006/comments/59919.htmlhttp://m.shnenglu.com/guojingjia2006/archive/2008/08/25/59919.html#Feedback1http://m.shnenglu.com/guojingjia2006/comments/commentRss/59919.htmlhttp://m.shnenglu.com/guojingjia2006/services/trackbacks/59919.html 

1.鍒涘緩DirectDraw瀵硅薄鐨勬柟娉?鍒涘緩涓籇irectDraw瀵硅薄騫朵嬌鐢≦ueryInterface()寰楀埌涓涓狪DirectDraw7鎺ュ彛.
鎴栬呯洿鎺ョ敤DirectDrawCreateEx()鍒涘緩涓涓狣irectDraw7鐨勬帴鍙?
HRESULT WINAPI DirectDrawCreate(GUID FAR 
*lpGUID,//guid of object
LPDIRECTDRAW FAR *lplpDD,//receives interface
IUnknown FAR *pUnkOuter);//com stuff
LpGUID--NULL,(瑙嗛鍗¢┍鍔ㄧ殑Globally Unique Identifier)
lplpDD
--榪斿洖涓涓狣irectDraw鐨勬帴鍙h屼笉鏄疍irectDraw7鐨勬帴鍙?
pUnkOuter
--NULL(always set to zero)

 

鑷鍙戦佹秷鎭?
1.SendMessage()---send a message which is processed immediately to a window.In fact,
it calls WinProc().
LRESULT SendMessage(HWND hWnd,UINT,WPARAM,LPARAM);

2.PostMessage()---send a message to the messagequeue.just that.if it's succeed,it return a value(!0).
BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

 

1.SetBkMode(hdc,TRANSPARENT);
2.FillRect(hdc,&r,(HBRUSH)GetStockObject(WHITE_BRUSH));
3.CreateSolidBrush(RGB(255,0,0));
4.wchar_t tmp[20];
    GetDlgItemText(hDlg,IDC_EDIT1,tmp,
20);
    ::wstringstream 
is;
    
is<<tmp;
    
is>>size;   
5.InvalidateRect(hWnd,0,1);
6.DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, inputsize);
7.WM_CLOSE is sent before WM_DESTYOY.

//鍒涘緩鍏ㄥ睆(絀虹櫧)妯″紡紿楀彛:
if(!(hWnd = CreateWindowEx(NULL,//extend style
WINDOW_CLASS_NAME,//class
"BX",//title
WS_POP|WS_VISIBLE,
0,0,//initial x,y
GetSystemMetrics(SM_CXSCREEN),//Initial width
GetSystemMetrics(SM_CYSCREEN),//Initial height
NULL,//handle to parent
NULL,//handle to menu
hinstance,//instance of this application
NULL)))//extra creation parms
return (0);


]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              快射av在线播放一区| 亚洲一区二区三区免费观看| 亚洲国语精品自产拍在线观看| 欧美日韩一区二区三区四区在线观看 | 久久九九精品| 久久综合久久综合久久综合| 久久综合给合久久狠狠色| 欧美性色aⅴ视频一区日韩精品| 欧美性猛交99久久久久99按摩 | 在线免费一区三区| 亚洲国产日韩美| 一区二区三区国产| 新狼窝色av性久久久久久| 久久亚洲精品中文字幕冲田杏梨| 欧美激情一区| 亚洲一级二级在线| 久久久天天操| 欧美日韩免费观看一区三区| 国产情侣久久| 99re6这里只有精品视频在线观看| 亚洲视频图片小说| 玖玖玖国产精品| 在线中文字幕一区| 开心色5月久久精品| 国产精品一区二区a| 91久久精品www人人做人人爽 | 国产一区二区三区在线观看免费视频| 在线国产亚洲欧美| 午夜精品一区二区三区在线| 欧美成人视屏| 亚洲欧美一区二区三区在线 | 欧美日韩国产一中文字不卡| 国产一区二区高清| 在线午夜精品自拍| 免费亚洲一区| 欧美一区国产二区| 国产精品高潮呻吟视频| 亚洲美女av在线播放| 久久国产精品高清| 亚洲视频在线观看视频| 欧美激情中文字幕一区二区| 黄网站免费久久| 午夜欧美理论片| 夜夜嗨av一区二区三区四区| 蜜臀av国产精品久久久久| 国产欧美日韩一区| 亚洲女爱视频在线| 一区二区黄色| 欧美色欧美亚洲另类七区| 亚洲免费观看在线视频| 欧美风情在线观看| 狼狼综合久久久久综合网| 国产在线欧美| 久久久激情视频| 性欧美xxxx视频在线观看| 国产日本欧美在线观看| 亚洲欧美国产高清| 在线一区欧美| 国产欧美日韩专区发布| 欧美中文在线免费| 性做久久久久久久久| 亚洲免费影院| 国产精品ⅴa在线观看h| 在线视频欧美一区| 99精品欧美一区二区三区| 欧美激情综合| 一区二区三区四区五区精品| 亚洲美女在线国产| 国产精品成人一区二区三区吃奶| 在线视频欧美日韩| 亚洲网站在线播放| 国产精品高清网站| 欧美一级专区| 久久香蕉国产线看观看网| 亚洲国产日韩欧美在线动漫| 亚洲精美视频| 欧美人与禽性xxxxx杂性| 亚洲性色视频| 午夜精品免费在线| 亚洲国产成人porn| 日韩视频在线一区二区| 国产精品久久久久av免费| 欧美资源在线| 欧美aaa级| 亚洲男人第一网站| 久久久久这里只有精品| 99这里有精品| 欧美影院精品一区| 亚洲精品免费一区二区三区| 一区二区三区日韩欧美精品| 国产日韩欧美a| 亚洲国产免费| 国产欧美日韩视频一区二区三区| 欧美sm视频| 国产精品免费看久久久香蕉| 久久综合伊人77777蜜臀| 欧美日韩一区二区国产| 久久女同互慰一区二区三区| 欧美日韩高清区| 久久成人资源| 欧美日韩综合网| 欧美风情在线| 国产一区二区av| 中国成人亚色综合网站| 亚洲国产中文字幕在线观看| 一区二区三区久久精品| 亚洲国产高清aⅴ视频| 亚洲少妇自拍| 一本色道久久| 榴莲视频成人在线观看| 欧美一区二区三区免费视频| 欧美区一区二| 欧美激情综合| 激情五月综合色婷婷一区二区| 一本色道精品久久一区二区三区| 最近看过的日韩成人| 欧美一区二区在线播放| 亚洲欧美综合精品久久成人| 欧美日韩国产综合新一区| 欧美激情综合| 亚洲国产天堂久久综合| 亚久久调教视频| 欧美一区二区成人6969| 国产精品国产福利国产秒拍| 日韩午夜一区| 99视频精品在线| 欧美激情一区三区| 激情综合中文娱乐网| 亚洲综合精品一区二区| 一区二区av在线| 欧美日韩国产bt| 亚洲国产日韩在线| 亚洲国产精品福利| 久久综合图片| 欧美成人综合一区| 雨宫琴音一区二区在线| 久久久91精品| 欧美电影电视剧在线观看| 在线播放日韩专区| 狂野欧美激情性xxxx欧美| 欧美成人性网| 亚洲精品看片| 欧美日韩精品欧美日韩精品| 亚洲精品一区在线| 亚洲一区3d动漫同人无遮挡| 欧美性开放视频| 午夜精品福利视频| 久久手机免费观看| 91久久精品国产91性色 | 国产日韩精品视频一区二区三区| 亚洲男人天堂2024| 麻豆国产精品777777在线| 91久久精品国产91久久性色tv| 欧美裸体一区二区三区| 亚洲小视频在线| 久久夜色精品国产欧美乱极品| 狠狠色丁香久久婷婷综合丁香| 欧美一区二区三区在线看| 美国十次了思思久久精品导航| 亚洲国产精品免费| 欧美午夜剧场| 久久久久9999亚洲精品| 亚洲激情欧美| 欧美一区三区二区在线观看| 在线免费观看日本一区| 欧美日韩国产亚洲一区| 欧美一区激情| 亚洲黄色三级| 久久精品视频在线播放| 亚洲精品一区在线| 国产日韩欧美在线播放| 欧美精品一区在线播放| 欧美在线播放一区| 亚洲国产精品一区二区久 | 欧美一区二区久久久| 黑人巨大精品欧美一区二区小视频 | 久久精品免费看| 亚洲乱码精品一二三四区日韩在线 | 久久综合久久综合久久综合| 一区二区三区久久网| 狠狠色伊人亚洲综合成人| 欧美日韩国产美女| 久久免费国产| 亚洲在线观看免费| 日韩亚洲不卡在线| 一区二区电影免费观看| 老牛国产精品一区的观看方式| 一区二区三区不卡视频在线观看 | 国产精品一区二区久久久| 欧美成人精品一区二区| 亚洲在线1234| 日韩一本二本av| 亚洲成色www久久网站| 亚洲欧美日韩中文播放| 一区二区欧美视频| 日韩亚洲国产精品| 亚洲人成网站精品片在线观看| 狠狠色丁香婷婷综合影院| 国产三级欧美三级日产三级99| 欧美四级伦理在线|