锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 1. 瀹夎VS2010,WDK7.60錛圙RMWDK_EN_7600_1錛?/p>
2. 鏂板緩VC 鎺у埗鍙伴」鐩?閫夋嫨涓虹┖欏圭洰) 3. 鏂板緩欏圭洰閰嶇疆“driver” 錛岀偣鍑諱笅鎷夋寜閽?鐐瑰嚮錛堥厤緗鐞嗗櫒錛?/p>
杈撳叆鍚嶇О錛坉river錛夌偣鍑葷‘瀹氬氨鍙互浜嗭紝鍏朵粬鐨勪笉瑕佸姩鍝︼紒 瀹屾垚鍚庣殑鏁堟灉錛?/p>
鐐瑰嚮紜畾鎸夐挳涔嬪悗鍛堢幇鍑烘潵鐨勭敾闈?/p>
榧犳爣鍙沖嚮鏂板緩鐨刣river灞炴э紝浼氬脊鍑轟互涓嬬獥鍙o紒 <鎴戞妸wdk瀹夎鍦‥鐩樹笅> 鏂板緩C/C++鏂囦歡 涓嶇劧鏃燙/C++璁劇疆閫夐」 <鍒氬紑濮嬫垜浠垱寤轟簡涓涓┖鐨勯」鐩墍浠ラ」鐩噷娌℃湁c++鏂囦歡錛岀幇鍦ㄨ鍋氱殑灝辨槸鍦ㄧ┖鐨勯」鐩?婧愭枃浠?娣誨姞涓涓柊寤洪」c++鏂囦歡> 甯歌 鍩烘湰榪愯鏃舵鏌ワ細榛樿鍊?nbsp; //鍙? 濡傛灉鍚?nbsp; ( 璁劇疆涓烘鍊兼椂錛屽皢渚濊禆 IDE 鐨勭幆澧冪殑鐩稿叧璁劇疆 ) //NT寮忛┍鍔?nbsp; ntoskrnl.lib WDM寮忛┍鍔?nbsp; wdm.lib 蹇界暐鎵鏈夐粯璁ゅ簱錛?nbsp; 鏄?(/NODEFAULTLIB) //蹇呴?nbsp; 娓呭崟鏂囦歡錛? 涓嶇劧浼氬嚭鐜?nbsp; >LINK : fatal error LNK1295: “/MANIFESTUAC”涓?#8220;/DRIVER”瑙勮寖涓嶅吋瀹癸紱閾炬帴鏃朵笉浣跨敤“/MANIFESTUAC” 璁劇疆鏁堝簲鍜岋細鏄?/RELEASE) //鍙? 鍩哄潃錛?x10000 //寤鴻閫変笂 鏈鍚庣粰鍑轟竴涓秴綰х畝鍗曠殑浠g爜鏉ユ祴璇曚竴涓嬫垜浠厤緗殑鏄惁鎴愬姛錛燂紵 #include "ntddk.h" NTSTATUS 濡傛灉娌℃湁鎶ラ敊閭d箞鎭枩浣犻厤緗垚鍔熶簡錛? WINDOWS瀹屾垚绔彛緙栫▼ WINDOWS瀹屾垚绔彛緙栫▼
涓鑸潵璇達紝涓涓簲鐢ㄧ▼搴忓彲浠ュ垱寤哄涓伐浣滅嚎紼嬫潵澶勭悊瀹屾垚绔彛涓婄殑閫氱煡浜嬩歡銆傚伐浣滅嚎紼嬬殑鏁伴噺渚濊禆浜庣▼搴忕殑鍏蜂綋闇瑕併備絾鏄湪鐞嗘兂鐨勬儏鍐典笅錛屽簲璇ュ搴斾竴涓狢PU
鍒涘緩涓涓嚎紼嬨傚洜涓哄湪瀹屾垚绔彛鐞嗘兂妯″瀷涓紝姣忎釜綰跨▼閮藉彲浠ヤ粠緋葷粺鑾峰緱涓涓?#8220;鍘熷瓙”鎬х殑鏃墮棿鐗囷紝杞暘榪愯騫舵鏌ュ畬鎴愮鍙o紝綰跨▼鐨勫垏鎹㈡槸棰濆鐨勫紑閿銆傚湪瀹為檯寮
鍙戠殑鏃跺欙紝榪樿鑰冭檻榪欎簺綰跨▼鏄惁鐗墊秹鍒板叾浠栧牭濉炴搷浣滅殑鎯呭喌銆傚鏋滄煇綰跨▼榪涜鍫靛鎿嶄綔錛岀郴緇熷垯灝嗗叾鎸傝搗錛岃鍒殑綰跨▼鑾峰緱榪愯鏃墮棿銆傚洜姝わ紝濡傛灉鏈夎繖鏍風殑鎯呭喌錛?
鍙互澶氬垱寤哄嚑涓嚎紼嬫潵灝介噺鍒╃敤鏃墮棿銆?br>
搴旂敤瀹屾垚绔彛錛?br>
鍒涘緩瀹屾垚绔彛錛氬畬鎴愮鍙f槸涓涓唴鏍稿璞★紝浣跨敤鏃朵粬鎬繪槸瑕佸拰鑷沖皯涓涓湁鏁堢殑璁懼鍙ユ焺榪涜鍏寵仈錛屽畬鎴愮鍙f槸涓涓鏉傜殑鍐呮牳瀵硅薄錛屽垱寤哄畠鐨勫嚱鏁版槸錛?br>
HANDLE CreateIoCompletionPort( 鏌ョ湅浠ヤ笂浠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妯″瀷 2銆佸唴鏍鎬腑鎻愰珮I/O鎬ц兘鐨勬柊鏂規硶epoll Linux2.6鍐呮牳epoll浠嬬粛 epoll_wait鑼冨洿涔嬪悗搴旇鏄竴涓驚鐜紝閬嶅埄鎵鏈夌殑浜嬩歡錛? 瀵癸紝epoll鐨勬搷浣滃氨榪欎箞綆鍗曪紝鎬誨叡涓嶈繃4涓狝PI錛歟poll_create, epoll_ctl, epoll_wait鍜宑lose銆? while (TRUE) OnWriteEpoll (i);//鏌ョ湅褰撳墠鐨勬椿鍔ㄨ繛鎺ユ槸鍚︽湁闇瑕佸啓鍑虹殑鏁版嵁銆?br>
}
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 />
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>杞嚜:
]]>
a. 閰嶇疆鍙墽琛屾枃浠剁洰褰?E:\WinDDK\7600.16385.1\bin\x86;
b. 閰嶇疆鍖呭惈鐩綍錛欵:\WinDDK\7600.16385.1\inc\ddk
E:\WinDDK\7600.16385.1\inc\crt
E:\WinDDK\7600.16385.1\inc\api
c. 閰嶇疆搴撶洰褰? E:\WinDDK\7600.16385.1\lib\win7\i3865
鐩爣鏂囦歡鎵╁睍鍚嶏細.sys //蹇呴?
6. 璁劇疆C/C++閫夐」
甯歌閫夐」鍗?/span>
1 璋冭瘯淇℃伅鏍煎紡(C7 鍏煎(/Z7) //鍙?
2 璀﹀憡絳夌駭 錛? 綰?/W2) //鍙?
3 灝嗚鍛婅涓洪敊璇?nbsp; (鏄?/wx) //鍙?
浼樺寲閫夐」鍗?/span>
浼樺寲(紱佺敤/Od) //鍙?
棰勫鐞嗗櫒
棰勫鐞嗗櫒瀹氫箟錛歐IN32=100;_X86_=1;WINVER=0x501;DBG=1 //蹇呴?
浠g爜鐢熸垚
鍚敤鏈灝忛噸鏂扮敓鎴愶細鍚?nbsp; //鍙?nbsp;
榪愯鏃跺簱錛氬綰跨▼璋冭瘯(/MTd) 鎴?nbsp; 澶氱嚎紼?/MT) //寤鴻閫?span color="#0000ff" style="color: #0000ff;"> <鏈漢閫夋嫨鐨勬槸澶氱嚎紼嬭皟璇?/MTd)>
緙撳啿鍖哄畨鍏ㄦ鏌ワ細鍚?nbsp; //鍙?
(鍙伩鍏嶅嚭鐜?nbsp; LINK : error LNK2001: 鏃犳硶瑙f瀽澶栭儴絎﹀彿 __security_cookie)
楂樼駭
璋冪敤綰﹀畾 __stdcall(/Gz) //蹇呴?
7. 閾炬帴鍣ㄨ緗?
甯歌
鍚敤澧為噺閾炬帴錛氬惁(/INCREMENTAL:NO) //寤鴻 閫変笂
蹇界暐瀵煎叆搴擄細鏄?nbsp; // 鍙?nbsp;
( 璁劇疆涓烘鍊兼椂錛屽繀欏誨湪闄勫姞搴撶洰褰曚腑鍔狅細 E:\WinDDK\7600.16385.1\lib\win7\i3865 榪欐牱欏圭洰灝變笉浼氫緷璧?IDE 鐜鐨勮 緗?
杈撳叆
闄勫姞渚濊禆欏?
ntoskrnl.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib;ndis.lib;MSVCRT.LIB;LIBCMT.LIB //蹇呴?nbsp;
( HalXXX 鍑芥暟鍦℉al.lib錛?WmiXXX 鍑芥暟鍦?nbsp; wmilib.lib 錛?NdisXXX鍑芥暟鍦?nbsp; ndis.lib )
( 蹇呰鏃墮渶瑕佸鍔犲井杞殑鏍囧噯搴?nbsp; MSVCRT.LIB MSVCRTD.LIB(璋冭瘯搴? LIBCMT.LIBIBCMTD.LIB(璋冭瘯搴? )
( 濡傛灉婧愮爜涓湁 source 鏂囦歡錛岄偅涔堣鏂囦歡鐨?nbsp; TARGETLIBS 瀛楁浼氬垪鍑鴻欏?鐩渶瑕佺殑搴?nbsp; )
鍚敤鐢ㄦ埛璐︽埛鎺у埗錛圲AC錛?nbsp; 鍚?nbsp; //蹇呴?nbsp;
璋冭瘯錛?
鐢熸垚璋冭瘯淇℃伅 鏄?/DEBUG) //鍙?
鐢熸垚鏄犲儚鏂囦歡錛氭槸(/MAP) //鍙?
鏄犲儚鏂囦歡鍚嶏細$(TargetDir)$(TargetName).map //鍙?
緋葷粺(System)
瀛愮郴緇? 鎺у埗鍙?/SUBSYSTEM:CONSOLE) //蹇呴?
鍫嗘爤淇濈暀澶у皬錛?194304 //鍙?
鍫嗘爤鎻愪氦澶у皬錛?nbsp; 4096 //鍙?
椹卞姩紼嬪簭: 椹卞姩紼嬪簭(/DRIVER) //蹇呴?nbsp;
楂樼駭錛?/span>
鍏ュ彛鐐癸細DriverEntry //蹇呴?
闅忔満鍩哄潃:娓呯┖ //鎶婃閲岀殑鏁版嵁鍒犳帀銆傦紙yes涔熶笉鏄痭o涔熶笉鏄氨鏄涓涓共騫插噣鍑鐨勬枃鏈錛?/span> //蹇呴?
涓嶇劧浼氬嚭鐜?nbsp; e:\xxx.sys : fatal error LNK1295:
“/DYNAMICBASE”涓?#8220;/DRIVER”瑙勮寖涓嶅吋瀹癸紱閾炬帴鏃朵笉浣跨敤“/DYNAMICBASE”
鏁版嵁鎵ц淇濇姢(DEP): 娓呯┖ //鎶婃閲岀殑鏁版嵁鍒犳帀銆傦紙yes涔熶笉鏄痭o涔熶笉鏄氨鏄涓涓共騫插噣鍑鐨勬枃鏈錛?/span> //蹇呴?nbsp;
涓嶇劧浼氬嚭鐜?nbsp; e:\xxx.sys : fatal error LNK1295:
“/NXCOMPAT:NO”涓?#8220;/DRIVER”瑙勮寖涓嶅吋瀹癸紱閾炬帴鏃朵笉浣跨敤“/NXCOMPAT:NO”
鍛戒護琛岋細/SECTION:INIT,D /IGNORE:4078 錛堝緩璁笉瑕佸啓榪涘幓錛屼細鎶ラ敊錛侊級
DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
return STATUS_UNSUCCESSFUL;
}
]]>
]]>
銆銆 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暟瀛楋紝鐒跺悗瀹冨垎鍒幏鍙栨寚鍚戝彲閫夊ご閮ㄥ拰絎竴涓澶撮儴鐨勪袱涓寚閽堛傚畠浠庡彲閫夊ご閮ㄥ喅瀹氭暟鎹洰褰曠殑铏氭嫙鍦板潃錛?
鐒跺悗瀹冧嬌鐢ㄨ繖涓兼潵鍐沖畾鏁版嵁鐩綍瀹氫綅鍦ㄥ摢涓瀹炰綋涔嬩腑銆傚鏋滈傚綋鐨勬瀹炰綋宸茬粡琚爣璇嗕簡錛岄偅涔堟暟鎹洰褰曠壒瀹氱殑浣嶇疆灝卞彲浠ラ氳繃灝嗗畠鐨勭浉瀵硅櫄鎷熷湴鍧杞崲涓烘枃浠朵腑
鍦板潃鐨勬柟娉曟潵鎵懼埌銆?
]]>
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緙栫▼瀹炰緥
鎬葷粨
鎽樿錛氬紑鍙戠綉緇滅▼搴忎粠鏉ラ兘涓嶆槸涓浠跺鏄撶殑浜嬫儏錛屽敖綆″彧闇瑕侀伒瀹堝緢灝戠殑涓浜涜鍒?鍒涘緩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>
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
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>
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)
鍏堜粙緇?鏈功銆奣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>
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鐨勬晥鐜囪繕涓嶅お浜嗚В錛岃鍙傝冩垜涔嬪墠鍏充簬緗戠粶娓告垙鐨勭綉緇滅紪紼嬬瓑鐩稿叧鐨勬枃绔犮?/p>
浠ュ墠鍏徃鐨勬湇鍔″櫒閮芥槸浣跨敤HTTP榪炴帴錛屼絾鏄繖鏍風殑璇濓紝鍦ㄦ墜鏈虹洰鍓嶇殑緗戠粶鎯呭喌涓嬩笉浣嗘樉寰楅熷害杈冩參錛岃屼笖涓嶇ǔ瀹氥傚洜姝ゅぇ瀹朵竴鑷村悓鎰忕敤SOCKET鏉ヨ繘琛岃繛
鎺ャ傝櫧鐒朵嬌鐢⊿OCKET涔嬪悗錛屽浜庣敤鎴風殑璐圭敤鍙兘浼氬鍔?鐢變簬鏄敤浜咰MNET鑰岄潪CMWAP)錛屼絾鏄紝縐夌潃鐢ㄦ埛浣撻獙鑷充笂鐨勫師鍒欙紝鐩鎬俊澶у榪樻槸鑳藉鎺ュ彈
鐨?甯屾湜閭d簺鐜╁鏈堟湯鏀跺埌甯愬崟涓嶅悗鑳藉淇濇寔鍏嬪埗...)銆?br>
榪欐鐨勬湇鍔″櫒璁捐涓紝鏈閲嶈鐨勪竴涓獊鐮達紝鏄嬌鐢ㄤ簡EPOLL妯″瀷錛岃櫧鐒跺涔嬩篃鏄竴鐭ュ崐瑙o紝浣嗘槸鏃㈢劧鍦ㄥ悇澶C緗戞父涓凡緇忕粡榪囦簡濡傛涓ラ叿鐨勮冮獙錛岀浉淇′粬涓嶄細璁╂垜浠け鏈涳紝浣跨敤鍚庣殑緇撴灉錛岀‘瀹炰篃鏄〃鐜扮浉褰撲笉閿欍傚湪榪欓噷錛屾垜榪樻槸涓昏澶ц嚧浠嬬粛涓涓嬭繖涓ā鍨嬬殑緇撴瀯銆?br>
6銆丩inux涓婨POll緙栫▼瀹炰緥
EPOLL妯″瀷浼間箮鍙湁涓縐嶆牸寮忥紝鎵浠ュぇ瀹跺彧瑕佸弬鑰冩垜涓嬮潰鐨勪唬鐮侊紝灝辮兘澶熷EPOLL鏈夋墍浜嗚В浜嗭紝浠g爜鐨勮В閲婇兘宸茬粡鍦ㄦ敞閲婁腑錛?/p>
{
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);
}
catch (int)
{
PRINTF ("CATCH鎹曡幏閿欒\n");
continue;
}
}
m_bOnTimeChecking = TRUE;
OnTimer ();//榪涜涓浜涘畾鏃剁殑鎿嶄綔錛屼富瑕佸氨鏄垹闄や竴浜涚煭綰跨敤鎴風瓑銆?br>
}
鍏跺疄EPOLL鐨勭簿鍗庯紝涔熷氨鏄笂榪扮殑鍑犳鐭煭鐨勪唬鐮侊紝鐪嬫潵鏃朵唬鐪熺殑涓嶅悓浜嗭紝浠ュ墠濡備綍鎺ュ彈澶ч噺鐢ㄦ埛榪炴帴鐨勯棶棰橈紝鐜板湪鍗磋濡傛杞繪澗鐨勬悶瀹氾紝鐪熸槸璁╀漢涓嶅緱涓嶆劅鍙癸紝瀵瑰摢銆?/p>
鎬葷粨
Windows瀹屾垚绔彛涓嶭inux epoll鎶鏈柟妗堟槸榪?涓鉤鍙頒笂瀹炵幇寮傛IO鍜岃璁″紑鍙戜竴涓ぇ瀹歸噺錛屽叿鍙墿灞曟х殑winsock紼嬪簭鎸囨湇鍔$▼搴忕殑寰堝ソ鐨勯夋嫨錛屾湰鏂囧榪?涓妧鏈殑瀹炵幇鍘熺悊鍜屽疄闄呯殑浣跨敤鏂規硶鍋氫簡涓涓緇嗙殑浠嬬粛
//CreateThread(NULL,0,ChildThread,(PVOID)hThreadParent,0,NULL);
DuplicateHandle(GetCurrentProcess(),GetCurrentThread(),GetCurrentProcess(),&hThreadParent,
0,false,DUPLICATE_SAME_ACCESS);
_beginthreadex(NULL,0,ChildThread,(PVOID)hThreadParent,0,NULL);
]]>
]]>
#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");
}
}
]]>
#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++;
}
}
}
]]>
#include <iostream>
2
#include <windows.h>
3
#include <fstream>
4
5
using namespace std;
6
int _tmain(int argc, _TCHAR* argv[])
7

{
8
HANDLE hWrite,hRead;
9
SECURITY_ATTRIBUTES sa;
10
sa.bInheritHandle=true;
11
sa.nLength=sizeof(sa);
12
sa.lpSecurityDescriptor=NULL;
13
14
HANDLE input=CreateFile(L"in.txt",GENERIC_READ,NULL,&sa,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
15
HANDLE output=CreateFile(L"out.txt",GENERIC_WRITE|GENERIC_READ,NULL,&sa,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
16
17
//::CreatePipe(&hRead,&hWrite,&sa,0);
18
STARTUPINFO si;
19
ZeroMemory(&si,sizeof(si));
20
si.cb=sizeof(si);
21
::GetStartupInfo(&si);
22
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
23
si.hStdError=0;
24
si.hStdInput=input;
25
si.hStdOutput=output;
26
si.wShowWindow=SW_HIDE;
27
28
PROCESS_INFORMATION pi;
29
30
CreateProcess(L"..\\Debug\\test.exe",0,0,0,true,0,0,0,&si,&pi);
31
//::CloseHandle(hWrite);
32
WaitForSingleObject(pi.hProcess,INFINITE);
33
CloseHandle(input);
34
CloseHandle(output);
35
//char mm[1000];
36
//memset(mm,0,sizeof(mm));
37
//DWORD d;
38
//ReadFile(hRead,mm,1000,&d,0);
39
40
//cout<<mm<<endl;
41
42
return 0;
43
}
]]>