Winsock服務(wù)提供者接口SPI概述(共42頁(yè)).ppt_第1頁(yè)
Winsock服務(wù)提供者接口SPI概述(共42頁(yè)).ppt_第2頁(yè)
Winsock服務(wù)提供者接口SPI概述(共42頁(yè)).ppt_第3頁(yè)
Winsock服務(wù)提供者接口SPI概述(共42頁(yè)).ppt_第4頁(yè)
Winsock服務(wù)提供者接口SPI概述(共42頁(yè)).ppt_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第七章 Winsock服務(wù)提供者接口(SPI)*1內(nèi)容提要 SPI概述 Winsock協(xié)議目錄 分層服務(wù)提供者(LSP) 基于SPI的數(shù)據(jù)包過(guò)濾實(shí)例*2 Winsock 2 是圍繞著Windows開(kāi)放系統(tǒng)架構(gòu)(Windows Open System Architecture,WOSA)來(lái)設(shè)計(jì)的,WOSA在Winsock和Winsock應(yīng)用程序之間有一個(gè)標(biāo)準(zhǔn)API;在Winsock和Winsock服務(wù)提供者(比如TCP/IP)之間有一個(gè)標(biāo)準(zhǔn)的SPI。概述*3圖7-1 Winsock 2的WOSA架構(gòu)*4 傳輸服務(wù)提供者傳輸服務(wù)提供者(Transport Service providers,一般稱(chēng)

2、作協(xié)議棧,比如TCP/IP)即能夠提供建立通信、傳輸數(shù)據(jù)、日常數(shù)據(jù)流控制和錯(cuò)誤控制等功能的服務(wù)。類(lèi)型:分層的(Layered),基礎(chǔ)的(Base)基礎(chǔ)服務(wù)提供者負(fù)責(zé)實(shí)現(xiàn)傳輸協(xié)議的真正細(xì)節(jié),導(dǎo)出Winsock接口,此接口直接實(shí)現(xiàn)協(xié)議。分層服務(wù)提供者將自己安裝到Winsock目錄中的基礎(chǔ)提供者上面,截取來(lái)自應(yīng)用程序的Winsock API調(diào)用。*5 分層服務(wù)提供者僅實(shí)現(xiàn)更高層的定制通信函數(shù),它依靠現(xiàn)存的底層基礎(chǔ)提供者來(lái)與遠(yuǎn)程終端作實(shí)際的數(shù)據(jù)交換, 分層服務(wù)提供者位于基礎(chǔ)服務(wù)提供者之上,依靠它來(lái)實(shí)現(xiàn)各種功能。Winsock 2 APIWS2_32.DLLSPILayeredProtocolSPILa

3、yeredProtocolSPIBase ProtocolTransportNamespace圖8-2 協(xié)議層次*6 名字空間提供者把一個(gè)網(wǎng)絡(luò)協(xié)議的地址屬性和一個(gè)或多個(gè)用戶(hù)友好名關(guān)聯(lián)到一起,以便啟用與協(xié)議無(wú)關(guān)的名字解析方案。命名空間提供者在命名空間目錄安裝自己,當(dāng)應(yīng)用程序執(zhí)行名字解析時(shí)將會(huì)被調(diào)用。*7SPI命名規(guī)則:前綴標(biāo)示nWSP(Winsock提供者):用于傳輸服務(wù)提供者函數(shù)。nNSP(名字空間提供者):用于名字空間提供者函數(shù)。nWPU(Winsock提供者上調(diào)):供服務(wù)提供者調(diào)用的支持函數(shù)(分層服務(wù)提供者使用的支持函數(shù)。)nWSC(Winsock配置):供在Winsock 2中安裝服務(wù)提

4、供者的函數(shù)使用。*8Winsock協(xié)議目錄 SPI提供3種協(xié)議:分層協(xié)議、基礎(chǔ)協(xié)議、協(xié)議鏈基礎(chǔ)協(xié)議是能夠獨(dú)立、安全地和遠(yuǎn)程端點(diǎn)實(shí)現(xiàn)數(shù)據(jù)通信的協(xié)議。分層協(xié)議在基礎(chǔ)協(xié)議的上層,依靠底層基礎(chǔ)協(xié)議實(shí)現(xiàn)更高層的通信服務(wù)。協(xié)議鏈?zhǔn)菍⒁幌盗械幕A(chǔ)協(xié)議和分層協(xié)議按特定的順序連接在一起的鏈狀結(jié)構(gòu)。*9 協(xié)議信息系統(tǒng)安裝了哪些協(xié)議以及這些協(xié)議的特性,通常為協(xié)議信息。如果一個(gè)協(xié)議支持多種行為,每類(lèi)行為在系統(tǒng)中都有各自的目錄條目。例如,如果系統(tǒng)中安裝了TCP/IP,系統(tǒng)中就會(huì)有兩個(gè)IP條目:TCP和UDP。Winsock采用WSAPROTOCOL_INFO結(jié)構(gòu)描述特定協(xié)議的完整信息。具體定義如下:*10WSAPROT

5、OCOL_INFO結(jié)構(gòu)定義如下:結(jié)構(gòu)定義如下:typedef struct WSAPROTOCOL_INFODWORD dwServiceFlags1;DWORD dwServiceFlags2;DWORD dwServiceFlags3;DWORD dwServiceFlags4;DWORD dwProviderFlags;GUID ProviderId;/服務(wù)提供者廠商安排的服務(wù)提供者廠商安排的GUIDDWORD dwCatalogEntryId;/為該結(jié)構(gòu)體安排的唯一標(biāo)示符(目錄入口)為該結(jié)構(gòu)體安排的唯一標(biāo)示符(目錄入口)WSAPROTOCOLCHAIN ProtocolChain;/協(xié)

6、議鏈結(jié)構(gòu)體協(xié)議鏈結(jié)構(gòu)體int iVersion;int iAddressFamily;/地址家族地址家族int iMaxSockAddr;int iMinSockAddr;int iSocketType;/套接字類(lèi)型套接字類(lèi)型int iProtocol;/協(xié)議協(xié)議int iNetworkByteOrder;int iSecurityScheme;DWORD dwMessageSize;DWORD dwProviderReserved;CHAR szProtocolWSAPROTOCOL_LEN+1;WSAPROTOCOL_INFO,*LPWSAPROTOCOL_INFO;*11 獲取協(xié)議信息使

7、用Winsock API函數(shù)WSAEnumProtocols();使用Winsock SPI函數(shù)WSCEnumProtocols();*12int WSAEnumProtocols(LPINT lpiProtocols,/整型數(shù)組,指定要枚舉的協(xié)議,可選。指定為NULL則返回所有的協(xié)議。LPWSAPROTOCOL_INFO lpProtocolBuffer,/存放協(xié)議信息的緩沖區(qū)LPDWORD lpdwBufferLength/緩沖區(qū)長(zhǎng)度);n枚舉指定的網(wǎng)絡(luò)協(xié)議信息,將具體的協(xié)議信息填充到WSAPROTOCOL_INFO結(jié)構(gòu)體中。nWSAEnumProtocols函數(shù)僅能枚舉基礎(chǔ)協(xié)議和協(xié)議鏈,

8、不能枚舉分層協(xié)議。n返回值:成功為協(xié)議個(gè)數(shù),失敗為SOCKET_ERROR 。n注:創(chuàng)建套接字時(shí)使用WSAEnumProtocols函數(shù)枚舉系統(tǒng)中安裝的協(xié)議,根據(jù)傳遞的參數(shù)找到一個(gè)與之匹配的協(xié)議,然后調(diào)用此協(xié)議的提供者導(dǎo)出的函數(shù)來(lái)完成各種Winsock調(diào)用。*13WSAEnumProtocols函數(shù)的使用方法:首先以lpProtocolBuffer為NULL,lpdwBufferLength為0調(diào)用WSAEnumProtocols ,該調(diào)用會(huì)以WSAENBUFS失敗,此時(shí)lpdwBufferLength參數(shù)包含了所需的緩沖區(qū)長(zhǎng)度。以lpdwBufferLength包含的緩沖區(qū)長(zhǎng)度分配內(nèi)存空間再

9、次以分配的內(nèi)存空間調(diào)用WSAEnumProtocols實(shí)例*14WSCEnumPtotocols(LPINT lpiProtocols,LPWSAPROTOCOL_INFOW lpProtocolBuffer,LPDWORD lpdwBufferLength,LPINT lpErrno/取得調(diào)用出錯(cuò)后的出錯(cuò)代碼); 該函數(shù)能夠枚舉各種協(xié)議,包括分層協(xié)議、基礎(chǔ)協(xié)議和協(xié)議鏈。 協(xié)議信息存放在WSAPROTOCOL_INFOW結(jié)構(gòu)體中,支持UNICODE。 使用方法同WSAEnumProtocols 實(shí)例*15typedef struct _WSAPROTOCOL_INFOW DWORD dwSer

10、viceFlags1; DWORD dwServiceFlags2; DWORD dwServiceFlags3; DWORD dwServiceFlags4; DWORD dwProviderFlags; GUID ProviderId; DWORD dwCatalogEntryId; WSAPROTOCOLCHAIN ProtocolChain; int iVersion;int iAddressFamily; int iMaxSockAddr; int iMinSockAddr; int iSocketType; int iProtocol; int iProtocolMaxOffset

11、; int iNetworkByteOrder; int iSecurityScheme; DWORD dwMessageSize; DWORD dwProviderReserved; WCHAR szProtocolWSAPROTOCOL_LEN+1;/UNICODE字符串字符串 WSAPROTOCOL_INFOW, *LPWSAPROTOCOL_INFOW;*16分層服務(wù)提供者(LSP) 分層提供者的體系結(jié)構(gòu)圖7-2分層提供者的體系結(jié)構(gòu)*17 加載下層服務(wù)提供者,利用下層服務(wù)提供者導(dǎo)出的函數(shù)實(shí)現(xiàn)其內(nèi)部API函數(shù)。 被WS2_32加載的下層服務(wù)提供者,由調(diào)用基礎(chǔ)服務(wù)提供者(或者其下層服務(wù)提供

12、者)提供的服務(wù)實(shí)現(xiàn)其內(nèi)部SPI函數(shù)。 用戶(hù)創(chuàng)建套接字時(shí), 套接字創(chuàng)建函數(shù)(如socket)在Winsock目錄尋找合適的協(xié)議; 此協(xié)議的提供者導(dǎo)出的函數(shù)完成各種功能 編寫(xiě)分層服務(wù)提供者并安裝可以截獲Winsock調(diào)用*18運(yùn)行原理 安裝LSP安裝LSP實(shí)質(zhì)就是安裝一個(gè)WSAPROTOCOL_INFOW結(jié)構(gòu),該結(jié)構(gòu)定義了分層提供者的特性和LSP是如何填寫(xiě)鏈的。安裝LSP后在Winsock目錄中就有了一個(gè)WSAPROTOCOL_INFOW結(jié)構(gòu),讓創(chuàng)建套接字的應(yīng)用程序可以枚舉到它。*19協(xié)議鏈協(xié)議鏈描述了分層提供者加入Winsock目錄的順序,也就是在協(xié)議鏈中的位置。協(xié)議鏈由嵌入在WSAPROTOC

13、OL_INFOW結(jié)構(gòu)中的WSAPROTOCOLCHAIN結(jié)構(gòu)中的數(shù)據(jù)指定,結(jié)構(gòu)定義如下: typedef struct _WSAPROTOCOLCHAIN int ChainLen; /0表示分層協(xié)議,1表示基礎(chǔ)協(xié)議, /1表示協(xié)議鏈 DWORD ChainEntriesMAX_PROTOCOL_CHAIN; /目錄ID數(shù)組 WSAPROTOCOLCHAIN, FAR * LPWSAPROTOCOLCHAIN;*20當(dāng)ChianLen是0或1時(shí),包含在ChianEntries數(shù)組中的數(shù)據(jù)是無(wú)意義的。當(dāng)ChianLen大于1時(shí),形成協(xié)議鏈的各個(gè)服務(wù)提供者的目錄ID都包含在ChianEntries

14、數(shù)組中。LSP在協(xié)議鏈中位置的影響: 頂層:被加載 非頂層:被鏈中位于它上層的LSP加載LSP被加載后的動(dòng)作:1) 首先調(diào)用LSP導(dǎo)出的函數(shù)WSPStartup()2) 將包含協(xié)議鏈的WSAPROTOCOL_INFOW結(jié)構(gòu)傳遞給這個(gè)函數(shù)3) LSP再找到協(xié)議鏈中位于自己下方的提供者,進(jìn)而加載它*21安裝LSP時(shí),必須在Winsock目錄中安裝兩種協(xié)議:分層協(xié)議、協(xié)議鏈安裝分層協(xié)議是為了獲取Winsock目錄分配的目錄ID,以便在協(xié)議鏈中標(biāo)識(shí)自己。協(xié)議鏈?zhǔn)荳insock目錄中LSP的真正入口,鏈中包含了自己分層協(xié)議的目錄ID號(hào)和下層提供者的目錄ID號(hào),這些目錄ID構(gòu)成ChainEntries,進(jìn)

15、而構(gòu)建一個(gè)WSAPROTOCOL_INFOW結(jié)構(gòu)安裝函數(shù)n需要為該函數(shù)提供LSP的GUID、DLL位置、描述LSP支持協(xié)議的一個(gè)或多個(gè)WSAPROTOCOL_INFOW結(jié)構(gòu)。*22 函數(shù)定義 int WSCInstallProvider( const LPGUID lpProviderId, / 要安裝的提供者的GUID const LPWSTR lpszProviderDllPath, / 指定提供者DLL路徑 const LPWSAPROTOCOL_INFO lpProtocolInfoList, / 指向一個(gè)WSAPROTOCOL_INFOW結(jié)構(gòu)數(shù)組 DWORD dwNumberOfEn

16、tries, / lpProtocolInfoList數(shù)組中條目數(shù)量,即數(shù)組大小 LPINT lpErrno / 返回可能的失敗代碼);/ 只有UNICODE版本,失敗則返回SOCKET_ERROR*23 lpProviderId: GUID可以通過(guò)命令行工具UUIDGEN或者編程中使用UuidCreate函數(shù)生成。 lpszProviderDllPath: UNICODE字符串,包含環(huán)境變量。如 %SYSTEMROOT% lpProtocolInfoList: WSAPROTOCOL_INFOW結(jié)構(gòu)的數(shù)組,每個(gè)數(shù)組成員是一個(gè)要安裝的單獨(dú)目錄,即可一次安裝多個(gè)服務(wù)提供者 通常從它要分層的下層提

17、供者拷貝,兩種情況例外: 第一,szProtocol域要修改,以包含新提供者的名稱(chēng) 第二,如有XP1_IFS_HANDLES標(biāo)志,從dwServiceFlags1域中移除XP1_IFS_HANDLES標(biāo)志,該標(biāo)志表示此提供者返回的句柄是真正地操作系統(tǒng)句柄,在該句柄上會(huì)引起user/kernel 模式的轉(zhuǎn)換。*24LSP Socket Creation and IFS Handles socket 句柄有三類(lèi):由 base providers 返回給 LSP 的 socket 句柄;由 LSP 返 回給 ws2_32.dll 的 socket 句柄;用戶(hù)程序中由 ws2_32.dll 返回的句柄

18、。 ws2_32.dll 維護(hù)了一個(gè)關(guān)聯(lián)列表,表中相關(guān)聯(lián)的是從 LSP 取得的 socket 句柄和返 回給用戶(hù)程序的 socket 句柄。 LSP 也應(yīng)該用類(lèi)似的做法并維護(hù)一個(gè)從 base provider 取得的 socket 句柄和返回給 ws2_32.dll 的 socket 句柄的關(guān)聯(lián)列表。 這樣就使得給定某一層的 socket 句柄,LSP 能找到相應(yīng)低層的 socket,而且當(dāng) LSP 被卸載時(shí)還能保證所有的 base socket 句柄能被正確地關(guān)閉*25 當(dāng) socket 有 IFS 句柄時(shí),此句柄 可用在文件 I/O 函數(shù)中來(lái)完成 Winsock 的 recv 和 send

19、 調(diào)用。 在 Windows NT下,IFS 句柄可以加到 IOCP實(shí)現(xiàn)可伸縮性。這是由帶 有 IFS 句柄的 providers 通過(guò) WSAPROTOCOL_INFOW 結(jié)構(gòu)體中的 XP1_IFS_HANDLES 屬性位來(lái)指示的。 所有 Microsoft 的 base providers 都將 sockets 實(shí)現(xiàn)為 IFS 句柄。LSP 不能創(chuàng)建本身是真正的 IFS 句柄的 socket 句柄, 因?yàn)樵?LSP 中不能實(shí)現(xiàn) IFS。但通過(guò)調(diào)用 WPUCreateSocketHandle 或 WPUModifyIFSHandle 返回給 ws2_32.dll 的 socket 句柄都可以

20、在文件 I/O 調(diào) 用中使用。 *26 安裝LSP的步驟1、用WSCInstallProvider來(lái)安裝分層提供者以獲取目錄ID2、利用WSCEnumProtocols列舉出所有的目錄條目,獲得安裝之后為這個(gè)分層服務(wù)提供者分配的目錄ID;3、用該目錄ID來(lái)設(shè)置一個(gè)協(xié)議鏈目錄條目,將要安裝分層提供者和另外提供者連接起來(lái)組成協(xié)議鏈;4、調(diào)用WSCInstallProvider來(lái)安裝該協(xié)議鏈*27重新為目錄排序新的提供者安裝到Winsock目錄之后,在枚舉時(shí)默認(rèn)出現(xiàn)在Winsock目錄的結(jié)尾。如果LSP模仿TCP/IP提供者,則永遠(yuǎn)不會(huì)被默認(rèn)調(diào)用,因原來(lái)的MSAFD TCP/IP提供者總是出現(xiàn)在新安

21、裝的提供者LSP入口之前,系統(tǒng)不會(huì)默認(rèn)加載它。重新為目錄排序可使新安裝的LSP首先出現(xiàn)。由函數(shù)WSCWriteProviderOrder函數(shù)完成排序。*28函數(shù)定義int WSCWriteProviderOrder(LPDWORD lpdwCatalogEntryId,/CatalogEntryId數(shù)組DWORD dwNumberOfEntries/數(shù)組大小);*29 移除LSP移除LSP時(shí),只需為移除LSP的函數(shù)傳遞要移除的提供者的GUID即可函數(shù)定義int WSCDeInstallProvider(LPGUID lpProviderId,LPINT lpErrno);移除LSP時(shí),要根據(jù)分

22、層協(xié)議的GUID號(hào)找到其目錄ID號(hào),然后逐個(gè)移除各協(xié)議鏈,最后再移除分層協(xié)議的提供者。實(shí)例*30編寫(xiě)LSP 每個(gè)LSP必須實(shí)現(xiàn)和導(dǎo)出WSPStartup()函數(shù) WSPStartup函數(shù)Winsock 2傳輸服務(wù)提供者隨標(biāo)準(zhǔn)的Windows動(dòng)態(tài)鏈接庫(kù)模塊一起執(zhí)行,必須把DllMain函數(shù)導(dǎo)入這個(gè)動(dòng)態(tài)鏈接庫(kù)模塊中,還必須導(dǎo)入一個(gè)名為WSPStartup函數(shù)條目。在調(diào)用者調(diào)用WSPStartup時(shí),通過(guò)一個(gè)被當(dāng)作參數(shù)傳送的函數(shù)派遣表打開(kāi)另外的30個(gè)SPI函數(shù),傳輸服務(wù)提供者便由這30個(gè)函數(shù)組成。*31*32調(diào)用WSAStartup期間,Winsock根據(jù)WSASocket調(diào)用的地址家族、套接字類(lèi)型

23、和協(xié)議參數(shù),決定需要加載哪個(gè)服務(wù)提供者。只有在一個(gè)應(yīng)用程序通過(guò)socket或WSASocket API調(diào)用建立一個(gè)套接字時(shí), Winsock才會(huì)調(diào)用一個(gè)服務(wù)提供者。函數(shù)定義int WSPStartup(WORD wVersionRequested,/調(diào)用者可使用的版本號(hào)LPWSPDATA lpWSPData,/獲取提供者的詳細(xì)信息LPWSAPROTOCOL_INFO lpProtoclInfo,/指定想得到的協(xié)議特征WSPUPCALLTABLE UpcallTable,/向上調(diào)用的函數(shù)表 LPWSPPROC_TABLE lpProcTable/指向SPI的函數(shù)表);*33 描述分派表的WSPP

24、ROC_TABLE結(jié)構(gòu)定義了必須在LSP實(shí)現(xiàn)的函數(shù),定義如下:typedef struct _WSPPROC_TABLE LPWSPACCEPT lpWSPAccept; LPWSPADDRESSTOSTRING lpWSPAddressToString; LPWSPASYNCSELECT lpWSPAsyncSelect; LPWSPBIND lpWSPBind; LPWSPCANCELBLOCKINGCALL lpWSPCancelBlockingCall; LPWSPCLEANUP lpWSPCleanup; LPWSPCLOSESOCKET lpWSPCloseSocket; LPWS

25、PCONNECT lpWSPConnect; LPWSPDUPLICATESOCKET lpWSPDuplicateSocket; LPWSPENUMNETWORKEVENTS lpWSPEnumNetworkEvents; LPWSPEVENTSELECT lpWSPEventSelect; *34LPWSPGETOVERLAPPEDRESULT lpWSPGetOverlappedResult; LPWSPGETPEERNAME lpWSPGetPeerName; LPWSPGETSOCKNAME lpWSPGetSockName; LPWSPGETSOCKOPT lpWSPGetSock

26、Opt; LPWSPGETQOSBYNAME lpWSPGetQOSByName; LPWSPIOCTL lpWSPIoctl; LPWSPJOINLEAF lpWSPJoinLeaf; LPWSPLISTEN lpWSPListen; LPWSPRECV lpWSPRecv; LPWSPRECVDISCONNECT lpWSPRecvDisconnect;*35 LPWSPRECVFROM lpWSPRecvFrom; LPWSPSELECT lpWSPSelect; LPWSPSEND lpWSPSend; LPWSPSENDDISCONNECT lpWSPSendDisconnect; LPWSPSENDTO lpWSPSendTo; LPWSPSETSOCKOPT lpWSPSetSockOpt; LPWSPSHUTDOWN lpWSPShutdown; LPWSPSOCKET lpWSPSocket; LPWSPSTRINGTOADDRESS lpWSPStringToAddress; WSPPROC_TABLE, FAR * LPWSPPROC_TABLE;*36WSPStartup()函數(shù)的作用1)根據(jù)協(xié)議鏈找到下層提供者,調(diào)用其WSPStartup函數(shù)初始化下層提供者,這是一個(gè)不斷向下遞歸的過(guò)程2)取得SPI服務(wù)函數(shù)的指針,在向上返回這些指針之前,可以用自定義的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論