版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
用LPC實(shí)現(xiàn)進(jìn)程通信LPC的概念LPC即是”本地過程調(diào)用(LocalProcedureCall)”。LPC的原理端口是一種面向連接的通信機(jī)制,通信的雙方需要先建立起“連接”。這種連接一般建立在用戶進(jìn)程之間。在建立了連接的雙方之間有幾種交換報文的方法:不帶數(shù)據(jù)的純報文。不大于256字節(jié)的短報文。如果是大于256字節(jié)的長報文,就要在雙方之間建立兩個共享內(nèi)存區(qū)(Section)。雙方通過共享內(nèi)存區(qū)交換數(shù)據(jù),但通過報文進(jìn)行協(xié)調(diào)和同步。Tips:大塊數(shù)據(jù)之所以要通過共享內(nèi)存區(qū)交換,一來是因?yàn)檫@樣就為用于Port機(jī)制的緩沖區(qū)設(shè)置了一個上限,便于內(nèi)存管理。而更重要的是提高了效率,因?yàn)榉駝t便要在發(fā)送端把大塊數(shù)據(jù)搬入內(nèi)核空間,又在接收端把大塊數(shù)據(jù)搬到用戶空間。典型的LPC建立連接和通信過程如下:符號說明:S提供服務(wù)方(服務(wù)端)C請求服務(wù)方(客戶端)S1、服務(wù)線程首先通過NtCreatePort()創(chuàng)建一個命名的連接端口、即Port對象(這個對象名應(yīng)為客戶線程所知).S2、建立上述連接端口后,服務(wù)線程通過NtListenPort()等待接收來自客戶線程的連接請求(服務(wù)線程被阻塞).C1、客戶線程通過NtConnectPort()創(chuàng)建客戶方的無名通信端口,向上述命名的連接端口發(fā)出連接請求(客戶線程阻塞)。S3、服務(wù)線程收到連接請求(被喚醒)后,如果同意連接則通過NtAcceptConnectPort()創(chuàng)建服務(wù)方無名通信端口、接受連接、并返回該無名通信端口的handle。然后通過NtCompleteConnectPort()喚醒客戶線程。C2、客戶線程被喚醒、返回所創(chuàng)建的無名通信端口handle。S4、服務(wù)線程另創(chuàng)建一個新線程負(fù)責(zé)為客戶線程提供服務(wù)。該線程因企圖從上述通信端口接收報文、等待來自客戶端的請求而阻塞。因此、新創(chuàng)建的線程是LPC服務(wù)線程,原來的服務(wù)線程是端口服務(wù)線程。S5、端口服務(wù)線程再次調(diào)用NtListenPort(),等待來自其它客戶的連接請求。(S2S5的循環(huán))C3、客戶線程通過NtRequestWaitReplyPort()向服務(wù)方發(fā)送報文,請求得到LPC服務(wù),并因等待而被阻塞。S6、LPC服務(wù)線程因接收到報文而被喚醒,并根據(jù)報文內(nèi)容提供相應(yīng)的LPC服務(wù)。S7、LPC服務(wù)線程通過NtReplyPort()向客戶方發(fā)送回答報文。客戶線程解除阻塞。LPC服務(wù)端LPC客戶端NtCreatePort()NtListenPortNtCreatePort()NtListenPort()NtAcceptConnectPort()NtCompleteConnectPort()NtConnectPort()發(fā)送連接請求客戶線程阻塞NtReplyPort()NtRequestWaitReplyPort()喚醒客戶線程數(shù)據(jù)傳送NtClose()NtClose()服務(wù)線程阻塞服務(wù)線程被喚醒LPC建立連接和通信典型流程圖LPC通信的報文結(jié)構(gòu)定義如下:////DefineheaderforPortMessage//typedefstruct_PORT_MESSAGE{USHORTDataLength;//傳輸?shù)臄?shù)據(jù)的大小Lengthofdatafollowingtheheader(bytes)USHORTTotalLength;//傳輸?shù)臄?shù)據(jù)加PORT_MESSAGE的大小Lengthofdata+sizeof(PORT_MESSAGE)USHORTType;//傳輸?shù)南⒌念愋蚑ypeofthemessage(SeeLPC_TYPEenum)USHORTVirtualRangesOffset;//OffsetofarrayofvirtualaddressrangesCLIENT_IDClientId;//發(fā)送方進(jìn)程ID和線程IDClientidentifierofthemessagesenderULONGMessageId;//報文消息IDIdentifieroftheparticularmessageinstanceunion{ULONGCallbackId;//ULONGClientViewSize;//發(fā)送方創(chuàng)建的共享區(qū)個數(shù)Size,inbytes,ofsectioncreatedbythesender};}PORT_MESSAGE,*PPORT_MESSAGE;NOTE:請求連接的一方對于將來要發(fā)送多大的數(shù)據(jù)量應(yīng)該是心里有數(shù)的。如果數(shù)據(jù)是不大,那就可以作為附加信息隨同報文(在同一個緩沖區(qū)中)中一起發(fā)送。但是,要是數(shù)據(jù)是比較大(報文總長大于256字節(jié)),那就要通過共享內(nèi)存區(qū)"發(fā)送",(reason:1是傳輸效率低下,2、報文緩沖區(qū)的大小也不好靜態(tài)地安排確定)。因此,在期望發(fā)送數(shù)據(jù)量比較大時要準(zhǔn)備好一個共享內(nèi)存區(qū)(Section)用于數(shù)據(jù)發(fā)送。這是要由請求連接的一方、即客戶方做好準(zhǔn)備,通過調(diào)用參數(shù)傳給NtConnectPort()的??蛻舴揭獪?zhǔn)備好兩個數(shù)據(jù)結(jié)構(gòu),就是PORT_VIEW和REMOTE_PORT_VIEW,把有關(guān)共享內(nèi)存區(qū)的信息寫在前一個數(shù)據(jù)結(jié)構(gòu)中,再把指向這兩個數(shù)據(jù)結(jié)構(gòu)的指針作為參數(shù)傳給NtConnectPort()。這兩個結(jié)構(gòu)定義如下:////Definestructureforinitializingsharedmemoryonthecaller'ssideoftheport寫數(shù)據(jù)//typedefstruct_PORT_VIEW{ULONGLength;//本結(jié)構(gòu)體的大小SizeofthisstructureHANDLESectionHandle;//共享內(nèi)存區(qū)的句柄Handletosectionobjectwith//SECTION_MAP_WRITEandSECTION_MAP_READULONGSectionOffset;//共享內(nèi)存數(shù)據(jù)的偏移量Theoffsetinthesectiontomapaviewfor//theportdataarea.Theoffsetmustbealigned//withtheallocationgranularityofthesystem.ULONGViewSize;//要發(fā)送的數(shù)據(jù)大小Thesizeoftheview(inbytes)PVOIDViewBase;//指向要發(fā)送的數(shù)據(jù)的指針Thebaseaddressoftheviewinthecreator//PVOIDViewRemoteBase;//Thebaseaddressoftheviewintheprocess//connectedtotheport.}PORT_VIEW,*PPORT_VIEW;////Definestructureforsharedmemorycomingfromremotesideoftheport讀數(shù)據(jù)//typedefstruct_REMOTE_PORT_VIEW{ULONGLength;//本結(jié)構(gòu)體的大小SizeofthisstructureULONGViewSize;//要讀取的數(shù)據(jù)的大小Thesizeoftheview(bytes)PVOIDViewBase;//指向要讀取的數(shù)據(jù)的指針Baseaddressoftheview}REMOTE_PORT_VIEW,*PREMOTE_PORT_VIEW;LPC主要API簡介NOTE:參數(shù)說明格式1參數(shù)名2參數(shù)輸入、輸出指示3參數(shù)類型4參數(shù)描述1.函數(shù)原型:NTSTATUSNTAPINtCreatePort(OUTPHANDLEPortHandle,INPOBJECT_ATTRIBUTESObjectAttributes,INULONGMaxConnectionInfoLength,INULONGMaxMessageLength,INULONGMaxPoolUsage);功能描述:創(chuàng)建一個LPCport對象。LPCport的創(chuàng)建者即是LPC通信的服務(wù)端(服務(wù)端)參數(shù):PortHandle輸出PHANDLE是一個指針變量,如果函數(shù)被成功調(diào)用則該變量指向port對象ObjectAttributes輸入POBJECT_ATTRIBUTES指針變量,指向一個描述對象屬性的結(jié)構(gòu)。OBJ_KERNEL_HANDLE,OBJ_OPENLINK,OBJ_EXCLUSIVE,OBJ_PERMANENT及OBJ_INHERIT都不是port對象的合法屬性。MaxConnectionInfoLength輸入ULONG表示通過port發(fā)送的最大數(shù)據(jù)字節(jié)數(shù)。MaxMessageLength輸入ULONG表示通過port發(fā)送的最大消息字節(jié)數(shù)。MaxPoolUsage輸入ULONG表示用于消息存儲的非分頁池的最大數(shù)量。0表示使用默認(rèn)值。ZwCreatePort將驗(yàn)證(MaxDataSize<=0x104)且(MaxMessageSize<=0x148)。2.函數(shù)原型:NTSTATUSNTAPINtConnectPort(OUTPHANDLEPortHandle,INPUNICODE_STRINGPortName,INPSECURITY_QUALITY_OF_SERVICESecurityQos,INOUTPPORT_VIEWClientViewOPTIONAL,OUTPREMOTE_PORT_VIEWServerViewOPTIONAL,OUTPULONGMaxMessageLengthOPTIONAL,INOUTPVOIDConnectionInformationOPTIONAL,INOUTPULONGConnectionInformationLengthOPTIONAL);功能描述:創(chuàng)建一個連接命名port的port(客戶端)參數(shù):PortHandle輸出PHANDLE指針變量,指向客戶端通信端口。PortName輸入PUNICODE_STRING指向一個結(jié)構(gòu)體,該結(jié)構(gòu)體描述了要連接的命名portSecurityQos輸入PSECURITY_QUALITY_OF_SERVICEPointstoastructurethatspecifiesthelevelofimpersonationavailabletotheportlistenerClientView輸入輸出可選參數(shù)PPORT_VIEW指針變量,指向一個結(jié)構(gòu)體。該結(jié)構(gòu)體描述了用于發(fā)送大量數(shù)據(jù)給listener的共享內(nèi)存區(qū),如果調(diào)用成功,該結(jié)構(gòu)將被更新。ServerView輸出可選參數(shù)PREMOTE_PORT_VIEW指針變量,指向一個調(diào)用者分配的緩沖區(qū),該緩沖區(qū)接受由listener用于發(fā)送大量數(shù)據(jù)給調(diào)用者的共享內(nèi)存區(qū)上的消息。MaxMessageLength輸出可選參數(shù)PULONG表示能夠通過port發(fā)送的數(shù)據(jù)的最大字節(jié)數(shù)ConnectionInformation輸入輸出可選參數(shù)PVOID指向一個調(diào)用者分配的內(nèi)緩沖區(qū),該緩沖區(qū)表示要發(fā)送給listener的連接消息并,接收到來自listener的連接消息。ConnectionInformationLength輸入輸出可選參數(shù)PULONG表示發(fā)送給listener的連接數(shù)據(jù)字節(jié)數(shù),接收由listener發(fā)送的連接數(shù)據(jù)的字節(jié)數(shù)。3.函數(shù)原型:NTSTATUSNTAPINtListenPort(INHANDLEPortHandle,OUTPPORT_MESSAGERequestMessage);功能描述:在服務(wù)端一個port上監(jiān)聽連接請求消息(服務(wù)端)參數(shù):PortHandle輸入HANDLEport對象的句柄,該句柄不需要指定任何的訪問規(guī)則ConnectionRequest輸出PPORT_MESSAGE指向一個調(diào)用者分配的緩沖區(qū),該緩沖接受發(fā)送給port的連接消息3.函數(shù)原型:NTSTATUSNTAPINtAcceptConnectPort(OUTPHANDLEPortHandle,INPVOIDPortContextOPTIONAL,INPPORT_MESSAGEConnectionRequest,INBOOLEANAcceptConnection,INOUTPPORT_VIEWServerViewOPTIONAL,OUTPREMOTE_PORT_VIEWClientViewOPTIONAL);功能描述:接受或者拒絕一個連接請求(服務(wù)端)參數(shù):PortHandle輸出PHANDLE如果成功調(diào)用將會得到一個用于通信的port。PortContext輸入可選參數(shù)PVOID一個與port相關(guān)聯(lián)的數(shù)字標(biāo)示。ConnectionRequest輸入PPORT_MESSAGE指向一個調(diào)用者分配的緩沖區(qū),該緩沖區(qū)標(biāo)示了連接請求并且包含有返回給連接的requester的連接數(shù)據(jù)。AcceptConnection輸入BOOLEAN指示是否接受該連接ServerView輸入輸出可選參數(shù)PPORT_VIEW指向一個結(jié)構(gòu)體,該結(jié)構(gòu)體描述了用于發(fā)送大量數(shù)據(jù)給requester的共享內(nèi)存區(qū)。如果成功調(diào)用,該結(jié)構(gòu)體將被更新ClientView輸出可選參數(shù)PREMOTE_PORT_VIEW指向一個調(diào)用者分配的緩沖,該緩沖將接受共享內(nèi)存區(qū)上requester發(fā)送給caller的大量數(shù)據(jù)。4.函數(shù)原型:NTSTATUSNTAPINtCompleteConnectPort(INHANDLEPortHandle);功能描述:服務(wù)端完成連接處理。參數(shù):PortHandle輸入HANDLE指向port對象的句柄。該句柄不需要指定任何的訪問規(guī)則。5.函數(shù)原型:NTSTATUSNTAPINtRequestWaitReplyPort(INHANDLEPortHandle,INPPORT_MESSAGERequestMessage,OUTPPORT_MESSAGEReplyMessage);功能描述:給port發(fā)送一上請求數(shù)據(jù)并等待響應(yīng)(客戶端)參數(shù):PortHandle輸入HANDLE一個port對象的句柄。該句柄不需要指定任何的訪問規(guī)則RequestMessage輸入PPORT_MESSAGE指向一個調(diào)用者分配的緩沖,該緩沖描述了發(fā)送給port的請求消息ReplyMessage輸出PPORT_MESSAGE指向一個調(diào)用者分配的緩沖,該緩沖接發(fā)送給port的響應(yīng)消息。6.函數(shù)原型:NTSTATUSNTAPINtReplyPort(INHANDLEPortHandle,INPPORT_MESSAGEReplyMessage);功能描述:給port發(fā)送一個響應(yīng)消息(服務(wù)端)參數(shù):PortHandle輸入HANDLE一個port對象的句柄。該句柄不需要指定任何的訪問規(guī)則ReplyMessage輸入PPORT_MESSAGE指向一個由調(diào)用者分配的緩沖,該緩沖描述了發(fā)送給port的響應(yīng)肖息。7.函數(shù)原型:NTSTATUSNTAPINtClose(INHANDLEHandle);功能描述:關(guān)閉一個NT句柄參數(shù):Handle輸入表示一個將要被關(guān)閉的句柄。8.函數(shù)原型:NTSTATUSNTAPINtCreateSection(OUTPHANDLESectionHandle,INACCESS_MASKDesiredAccess,INPOBJECT_ATTRIBUTESObjectAttributesOPTIONAL,INPLARGE_INTEGERMaximumSizeOPTIONAL,INULONGSectionPageProtection,INULONGAllocationAttributes,INHANDLEFileHandleOPTIONAL);功能描述:創(chuàng)建一個section對象參數(shù):SectionHandle輸出PHANDLE如果函數(shù)成功調(diào)用將會得到一個section對象的句柄。DesiredAccess輸入ACCESS_MASK表示調(diào)用者調(diào)用者需要的section對象的訪內(nèi)類型。該參數(shù)可以為0,也可以是以下標(biāo)志的組合:SECTION_QUERY -查詢訪問 SECTION_MAP_WRITE -當(dāng)被關(guān)聯(lián)時(mapped)可被寫入 SECTION_MAP_READ -當(dāng)被關(guān)聯(lián)時(mapped)可被讀取 SECTION_MAP_EXECUTE -當(dāng)被關(guān)聯(lián)時(mapped)可被執(zhí)行 SECTION_EXTEND_SIZE -擴(kuò)展訪問 SECTION_ALL_ACCESS -上面全部訪問類型+STANDARD_RIGHTS_REQUIREDObjectAttributes輸入可選參數(shù)POBJECT_ATTRIBUTES指向一個結(jié)構(gòu)體,該結(jié)構(gòu)表示了對象的屬性。OBJ_OPENLINK是不合法的屬性對于section對象而言。MaximunSize輸入可選參數(shù)PLARGE_INTEGER表示section的字節(jié)數(shù)。如果FileHandle為0,這個值必需指定,否則,它將默認(rèn)為由FileHandle指示的文件的大小。SectionPageProtection輸入ULONG表示頁面保護(hù)的類型當(dāng)section被關(guān)聯(lián)時(mapped)。這個參數(shù)可以是以值中的任意一個:PAGE_READONLY PAGE_READWRITE PAGE_WRITECOPY PAGE_EXECUTE PAGE_EXECUTE_READ PAGE_EXECUTE_READWRITE PAGE_EXECUTE_WRITECOPYAllocationAttributes輸入ULONG表示了section的屬性。該參數(shù)可以是下面這些值的組合: SEC_BASED 0x00200000//在每個進(jìn)程中關(guān)聯(lián)(map)section到同一地址 SEC_NO_CHANGE0x00400000//禁止頁面保護(hù)的改變 SEC_IMAGE 0x01000000//關(guān)聯(lián)(map)section為一個映象(image) SEC_VLM 0x02000000//在VLM區(qū)內(nèi)關(guān)聯(lián)(map)section SEC_RESERVE 0x04000000//保留不用分配頁面文件存儲Reservewithoutallocatingpagefilestorage SEC_COMMIT 0x08000000//提交頁(Commitpages);默認(rèn)的形為 SEC_NOCACHE 0x10000000//標(biāo)記頁為無緩沖區(qū)的Markpagesasnon-cacheableFileHandle輸入可選參數(shù)HANDLE指示用于創(chuàng)建section對象的文件。該文件被打開的訪問方式要與由保護(hù)參數(shù)指定的保護(hù)類型標(biāo)志相兼容。如果FileHan
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 46813-2025新能源多場站短路比計算導(dǎo)則
- 廣東省珠海市金灣區(qū)2025-2026學(xué)年度第一學(xué)期期末七年級地理試題(無答案)
- 養(yǎng)老院入住資格審核制度
- 信息安全與保密管理制度
- 空調(diào)公司管理制度廣告宣傳管理規(guī)定樣本
- 乙烯裝置操作工崗后知識考核試卷含答案
- 我國上市公司獨(dú)立董事薪酬激勵制度:現(xiàn)狀、問題與優(yōu)化路徑
- 我國上市公司換股合并中股東主動退出制度的多維審視與完善路徑
- 助聽器驗(yàn)配師持續(xù)改進(jìn)考核試卷含答案
- 硅烷法多晶硅制取工崗前創(chuàng)新實(shí)踐考核試卷含答案
- 2025年黑龍江省大慶市中考數(shù)學(xué)試卷
- 2025年廣西職業(yè)師范學(xué)院招聘真題
- 山東煙草2026年招聘(197人)考試備考試題及答案解析
- 中遠(yuǎn)海運(yùn)集團(tuán)筆試題目2026
- 扦插育苗技術(shù)培訓(xùn)課件
- 妝造店化妝品管理制度規(guī)范
- 婦產(chǎn)科臨床技能:新生兒神經(jīng)行為評估課件
- 基本農(nóng)田保護(hù)施工方案
- 股骨頸骨折患者營養(yǎng)護(hù)理
- 二級醫(yī)院醫(yī)療設(shè)備配置標(biāo)準(zhǔn)
- 北師大版(2024)小學(xué)數(shù)學(xué)一年級上冊期末綜合質(zhì)量調(diào)研卷(含答案)
評論
0/150
提交評論