版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第四章基于NDIS的網(wǎng)絡(luò)編程1內(nèi)容WindowsNT網(wǎng)絡(luò)體系結(jié)構(gòu)NDIS的基本概念小端口網(wǎng)卡驅(qū)動程序NDIS中間驅(qū)動程序VPacketPacket32WinDis32技術(shù)2一、WindowsNT網(wǎng)絡(luò)體系結(jié)構(gòu)
WindowsNT網(wǎng)絡(luò)體系結(jié)構(gòu)是基于OSI/RM七層網(wǎng)絡(luò)概念模型的。WindowsNT和Win32操作系統(tǒng)下的網(wǎng)絡(luò)驅(qū)動程序都符合這一網(wǎng)絡(luò)體系構(gòu)架。Windows下的的網(wǎng)絡(luò)驅(qū)動程序?qū)崿F(xiàn)了OSI網(wǎng)絡(luò)體系結(jié)構(gòu)的最低四層服務(wù)和服務(wù)之間的接口。3圖1Windows網(wǎng)絡(luò)結(jié)構(gòu)體系與協(xié)議模型的對照SPI:ServiceProviderInterface;TDI:TransferDriverInterface
NDIS:NetworkDriverInterfaceSpecification
應(yīng)用層應(yīng)用層物理層數(shù)據(jù)鏈路層網(wǎng)絡(luò)層傳輸層會話層表示層傳輸層網(wǎng)際層網(wǎng)絡(luò)接口層應(yīng)用程序網(wǎng)卡網(wǎng)卡驅(qū)動NDISTDISPI(DLL)WinsockAPIOSI7層協(xié)議模型Windows網(wǎng)絡(luò)結(jié)構(gòu)TCP/IP協(xié)議模型4二、NDIS的基本概念NDIS概述網(wǎng)絡(luò)驅(qū)動程序接口規(guī)范(NetworkDriverInterfaceSpecification,簡稱NDIS)是微軟公司和3COM合作開發(fā)的網(wǎng)絡(luò)驅(qū)動接口規(guī)范,是在基于X86平臺操作系統(tǒng)(主要是DOS和WINDOWS)上開發(fā)網(wǎng)卡驅(qū)動程序和網(wǎng)絡(luò)協(xié)議驅(qū)動程序必須遵守的設(shè)計框架。5NDIS是一個較為成熟的網(wǎng)絡(luò)驅(qū)動接口標(biāo)準(zhǔn),包含:局域網(wǎng)網(wǎng)卡驅(qū)動程序標(biāo)準(zhǔn)廣域網(wǎng)絡(luò)驅(qū)動程序標(biāo)準(zhǔn)中間驅(qū)動程序標(biāo)準(zhǔn)6NDIS定義了操作系統(tǒng)網(wǎng)絡(luò)傳輸模塊的一個抽象環(huán)境,在這個環(huán)境中,各層驅(qū)動程序?qū)嶓w之間沒有直接的通信機(jī)制。NDIS負(fù)責(zé)上下層驅(qū)動程序之間服務(wù)原語和實(shí)際驅(qū)動程序相應(yīng)調(diào)用入口之間的轉(zhuǎn)換,分派消息通知。NDIS驅(qū)動程序一般在主入口函數(shù)DriverEntry中根據(jù)驅(qū)動程序類型使用不同注冊函數(shù)注冊自己的輸出函數(shù)集的入口。7WindowsNT網(wǎng)絡(luò)組件的體系結(jié)構(gòu)TransportDriverInterface(TDI)NIC驅(qū)動程序(miniport)內(nèi)核模式LANMediaTypeIntermediateDriver(中間驅(qū)動程序)LANProtocolDriver用戶模式User-ModeClient(應(yīng)用程序)NDISInterfaceNativeMediaAwareProtocolNetbios
Kernel-ModeDriverKernel-ModeTDIClient(IncludingNTRedirector)Sockets
Kernel-ModeDriverNetbios
User-ModeDLLSockets
User-ModeDLLNetworkCard
NativeMediaType
8WindowsNT支持三種網(wǎng)絡(luò)驅(qū)動程序:網(wǎng)卡驅(qū)動程序(與硬件打交道)中間協(xié)議驅(qū)動程序(在不同協(xié)議之間進(jìn)行轉(zhuǎn)換)傳輸驅(qū)動程序(執(zhí)行具體的通信協(xié)議,如TCP/IP,IPX/SPX等)9NDIS驅(qū)動程序的分類
1、網(wǎng)卡驅(qū)動程序網(wǎng)卡驅(qū)動程序(NICDriver,又稱MACDriver)通過NDIS提供的調(diào)用來訪問和管理網(wǎng)卡,負(fù)責(zé)接收來自網(wǎng)卡的數(shù)據(jù)包并傳遞給上層驅(qū)動程序,把上層要發(fā)送的數(shù)據(jù)包發(fā)給網(wǎng)卡。10發(fā)送:NIC驅(qū)動程序通過NDIS從上層驅(qū)動程序接收數(shù)據(jù)包,根據(jù)實(shí)際網(wǎng)卡的不同特點(diǎn)和要求,將數(shù)據(jù)送入網(wǎng)卡的發(fā)送緩沖區(qū)。接收:將網(wǎng)卡接收緩沖區(qū)中接收到的數(shù)據(jù),通過NDIS傳送到相應(yīng)的協(xié)議驅(qū)動程序。11NDIS接收或發(fā)送包包格式轉(zhuǎn)換及數(shù)據(jù)處理中斷、DMA或編程I/O網(wǎng)卡(NIC)網(wǎng)卡驅(qū)動程序的數(shù)據(jù)處理流程12根據(jù)從NDIS接口庫得到的幫助的多少,NIC驅(qū)動程序可分類為小端口驅(qū)動程序或全網(wǎng)卡驅(qū)動程序。早期的網(wǎng)卡驅(qū)動程序需要自己管理有關(guān)硬件細(xì)節(jié)、同步、排隊等方面的事情,稱為全網(wǎng)卡驅(qū)動程序。而小端口驅(qū)動程序,這些事情都由NDIS來做。小端口驅(qū)動程序包括兩種類型:局域網(wǎng)小端口驅(qū)動程序廣域網(wǎng)小端口驅(qū)動程序132、協(xié)議驅(qū)動程序
協(xié)議驅(qū)動程序執(zhí)行具體的網(wǎng)絡(luò)協(xié)議,為上層客戶程序提供服務(wù),接收來自網(wǎng)卡或中間驅(qū)動程序的信息。
NDIS要求協(xié)議驅(qū)動程序?qū)崿F(xiàn)一組向下層驅(qū)動提供的下邊界函數(shù)集和一組向上層驅(qū)動提供的上邊界函數(shù)集(傳輸驅(qū)動程序接口TDI)。14傳輸驅(qū)動程序接口所有的WindowsNT傳輸驅(qū)動程序都通過傳輸驅(qū)動程序接口(TDI)為內(nèi)核模式網(wǎng)絡(luò)客戶程序提供服務(wù)。TDI規(guī)范定義支持基于連接的和非連接的協(xié)議的低級接口,為所有傳輸驅(qū)動程序提供一個共同的接口,簡化了傳輸驅(qū)動程序和它們支持的客戶程序的實(shí)現(xiàn)。它負(fù)責(zé)接受上層數(shù)據(jù),打包,再調(diào)用NDIS庫函數(shù)將數(shù)據(jù)發(fā)送至下層驅(qū)動程序。153、中間層驅(qū)動程序中間層驅(qū)動程序位于網(wǎng)卡驅(qū)動程序和協(xié)議驅(qū)動程序之間。NDIS中間驅(qū)動程序主要用于進(jìn)行協(xié)議轉(zhuǎn)換。中間層驅(qū)動程序向上提供小端口(Miniport)函數(shù)集,向下提供協(xié)議(Protocol)函數(shù)集。一個中間層驅(qū)動程序可疊加在另一中間層驅(qū)動程序上。16傳輸驅(qū)動程序(比如:TCP)Protocol接口Miniport接口網(wǎng)卡驅(qū)動程序傳輸驅(qū)動程序(比如:TCP)Protocol接口Miniport接口網(wǎng)卡驅(qū)動程序中間驅(qū)動程序Miniport接口Protocol接口17傳輸驅(qū)動程序Protocol接口中間驅(qū)動程序Miniport接口Protocol接口Miniport接口網(wǎng)卡驅(qū)動程序NDIS18三、小端口網(wǎng)卡驅(qū)動程序NDIS小端口驅(qū)動程序(也稱為小端口NIC驅(qū)動程序)有兩種基本功能:管理一個網(wǎng)絡(luò)接口卡(NIC),包括通過NIC發(fā)送和接收數(shù)據(jù)與高級驅(qū)動程序通信,例如和中間驅(qū)動程序。19NDIS庫對小端口的支持。過濾數(shù)據(jù)包同步和多處理器支持支持多包發(fā)送和接收支持全雙工操作
小端口必須支持NDIS定義的媒質(zhì)類型。而且要滿足以下需要:簡便性多處理器支持功能需求20
a.當(dāng)一個傳輸驅(qū)動程序需傳輸一個數(shù)據(jù)包時,它調(diào)用一個由NDIS庫導(dǎo)出的NdisXxx函數(shù)。然后NDIS通過調(diào)用適當(dāng)?shù)腘disXxx函數(shù)將這個數(shù)據(jù)包傳至小端口。接著小端口通過調(diào)用適當(dāng)?shù)腘disXxx函數(shù)將數(shù)據(jù)包傳至NIC來傳輸。
b.當(dāng)一個NIC接到一個數(shù)據(jù)包時,它可以發(fā)布一個硬件中斷讓由NDIS或NIC的小端口來進(jìn)行處理。NDIS通過調(diào)用適當(dāng)?shù)腗iniportXxx函數(shù)來通知NIC的小端口。小端口對來自NIC的數(shù)據(jù)建立傳輸,然后通過調(diào)用適當(dāng)?shù)腘disXxx函數(shù)標(biāo)識接收到的數(shù)據(jù)來綁定到高層驅(qū)動程序上。小端口驅(qū)動程序與NDIS和高層驅(qū)動程序之間的交互21小端口驅(qū)動程序的結(jié)構(gòu)一個小端口驅(qū)動程序包括驅(qū)動程序?qū)ο?、?qū)動程序代碼和NDIS庫代碼。WindowsNTDDK提供ndis.h
作為小端口的主頭文件。這個頭文件定義了小端口的入口、NDIS庫函數(shù)和公有數(shù)據(jù)結(jié)構(gòu)。22小端口網(wǎng)卡驅(qū)動程序的函數(shù)函數(shù)說明DriverEntry由操作系統(tǒng)調(diào)用,以激活和初始化網(wǎng)卡驅(qū)動程序MiniportInitialize初始化網(wǎng)卡MiniportCheckForHang檢查網(wǎng)卡內(nèi)部的狀態(tài)MiniportDisableInterrupt禁止網(wǎng)卡產(chǎn)生中斷MiniportEnableInterrupt允許網(wǎng)卡產(chǎn)生中斷MiniportReset向網(wǎng)卡發(fā)送硬件復(fù)位MiniportSendPackets通過網(wǎng)卡向網(wǎng)絡(luò)傳送一組數(shù)據(jù)包23主要的小端口函數(shù)調(diào)用:入口函數(shù)初始化狀態(tài)信息處理數(shù)據(jù)操作中斷處理特殊情況24NDIS小端口驅(qū)動程序設(shè)計NDIS小端口驅(qū)動程序設(shè)計的方法和步驟。初始化NDIS庫以及注冊驅(qū)動程序25注冊網(wǎng)卡26發(fā)送數(shù)據(jù)27接收數(shù)據(jù)28中斷處理傳輸終結(jié)處理29四、NDIS中間驅(qū)動程序IMDriver概述NDIS中間驅(qū)動程序(intermediatedriver,簡稱IMDriver)是處于小端口驅(qū)動程序和傳輸驅(qū)動程序之間的驅(qū)動程序。對上層TCP/IP協(xié)議表現(xiàn)為一個虛擬網(wǎng)卡,并且提供小端口函數(shù)接口;對下層表現(xiàn)為Protocol,并提供Protocol函數(shù)調(diào)用接口。所有出入網(wǎng)卡的數(shù)據(jù)幀均會被該驅(qū)動程序捕獲,可以對數(shù)據(jù)幀進(jìn)行過濾。30傳輸驅(qū)動程序Protocol接口中間驅(qū)動程序Miniport接口Protocol接口Miniport接口網(wǎng)卡驅(qū)動程序NDIS31對下端,一個中間驅(qū)動程序?qū)С鰠f(xié)議實(shí)體指針(ProtocolXxx函數(shù)),讓NDIS調(diào)用來完成與底層小端口的通訊請求。對于一個下層小端口驅(qū)動程序來說,一個中間驅(qū)動程序就像一個協(xié)議驅(qū)動程序一樣。對上端,一個中間驅(qū)動程序?qū)С鲂《丝趯?shí)體指針(MiniportXxx函數(shù)),讓NDIS調(diào)用來和一個或多個上面的協(xié)議驅(qū)動程序進(jìn)行通訊。對于一個上面的協(xié)議驅(qū)動程序,一個中間驅(qū)動程序就像一個小端口驅(qū)動程序。32NDIS中間驅(qū)動程序的工作原理
1、初始化為了加載程序能夠正確識別,必須將中間驅(qū)動程序的初始入口函數(shù)明確指為DriverEntry的形式。其他導(dǎo)出函數(shù)集的名稱可以自定義,但內(nèi)核模式的驅(qū)動程序的入口函數(shù)必須為DriverEntry。NTSTATUSDriverEntry( INPDRIVER_OBJECTDriverObject, INPUNICODE_STRINGRegistryPath);33在中間層驅(qū)動程序中,DriverEntry必須完成下面的工作:(1)調(diào)用NdisMInitializeWrapper函數(shù)注冊miniport設(shè)備,得到設(shè)備句柄NdisWrapperHandle。(2)利用第(1)步得到的句柄調(diào)用NdisIMRegisterLayeredMiniport函數(shù),注冊MiniportXxx功能函數(shù)以開放出為上層協(xié)議驅(qū)動程序提供的接口。34(3)調(diào)用NdisRegisterProtocol函數(shù),注冊ProtocolXxx功能函數(shù)以開放出為底層Miniport驅(qū)動提供的接口,并將自身綁定到底層驅(qū)動程序上。(4)調(diào)用NdisIMAssociateMiniport函數(shù)并通知NDIS庫,這樣既為底層的Miniport提供了ProtocolXxx功能函數(shù)接口,又為上層的Protocol提供了MiniportXxx功能函數(shù)接口。352、IMDriver的注冊
注冊中間層驅(qū)動程序的MiniportXxx功能函數(shù)。NDIS_STATUSNdisIMRegisterLayeredMiniport( INNDIS_HANDLENdisWrapperHandle, INPNDIS_MINIPORT_CHARACTERISTICS MiniportCharacteristics, INUINTcharacteristicslength, OUTPNDIS_HANDLEDriverHandle);36中間層驅(qū)動程序必須完成的操作:初始化一個NDIS_MINIPORT_CHARACTERISTICS結(jié)構(gòu)。
保存所有驅(qū)動程序?qū)С龅膹?qiáng)制性和非強(qiáng)制性的MiniportXxx功能函數(shù)的地址。373、協(xié)議驅(qū)動的注冊
注冊中間層驅(qū)動程序的ProtocolXxx功能函數(shù)。VOIDNdisRegisterProtocol( OUTPNDIS_STATUSStatus, OUTPNDIS_HANDLENdisProtocolHandler, INNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, INUINTCharacteristicsLength);38在調(diào)用NdisRegisterProtocol函數(shù)之前,中間層驅(qū)動程序必須完成的操作:初始化一個NDIS_PROTOCOL_CHARACTERISTCIS結(jié)構(gòu)。保存所有驅(qū)動程序提供的強(qiáng)制性和非強(qiáng)制性的ProtocolXxx功能函數(shù)的地址。394、動態(tài)綁定
NDIS調(diào)用ProtocolBindAdapter函數(shù)綁定中間驅(qū)動程序到一個網(wǎng)卡上。VOIDProtocolBindAdapter( OUTPNDIS_STATUSStatus, INNDIS_HANDLEBindContext, INPNDIS_STRINGDeviceName, INPVOIDSystemSpecific1,INPVOIDSystemSpecific2);40中間層協(xié)議NDIS_OPEN_BLOCK1ProtocolBindingContext網(wǎng)卡小端口ADAPTBindingHandleMiniportHandle協(xié)議驅(qū)動NDIS_OPEN_BLOCK2中間層小端口DeviceContext41在ProtocolBindAdapter函數(shù)中,先分配了一個ADAPT結(jié)構(gòu),然后調(diào)用函數(shù)NdisOpenAdapter進(jìn)行綁定時,是以&Adapt->BindingHandle作為參數(shù)傳遞的。這樣函數(shù)調(diào)用返回后,Adapt->BindingHandle就指向了NDIS_OPEN_BLOCK1。接著在函數(shù)ProtocolBindAdapter中會調(diào)用函數(shù)NdisIMInitializeDeviceInstance,而后者函數(shù)會調(diào)用InitializeHandler指向的函數(shù)。在InitializeHandler函數(shù)中會將中間層驅(qū)動程序初始化的Miniport設(shè)備指針分配給Adapt->MiniportHandle。42在函數(shù)NdisIMInitializeDeviceInstance中也將NDIS_MINIPORT_BLOCK_DeviceContext指向了前面提到的ADAPT結(jié)構(gòu)。即完成了ADAPT和中間層驅(qū)動初始化的小端口之間的雙向綁定。因此可以通過函數(shù)NdisIMGetDeviceContext得到ADAPT結(jié)構(gòu)。在函數(shù)NdisOpenAdapter中也將NDIS_OPEN_BLOCK1->ProtocolBindingContext指向了ADAPT結(jié)構(gòu),即實(shí)現(xiàn)了ADAPT結(jié)構(gòu)同中間層驅(qū)動程序注冊的協(xié)議驅(qū)動接口的綁定。435、IMDriver的數(shù)據(jù)包管理
當(dāng)采用NDIS驅(qū)動程序截獲到網(wǎng)絡(luò)封包時,NDIS交給中間層驅(qū)動程序?qū)嶋H上是一個包描述符(packetdescriptors)。每個封包都是由結(jié)構(gòu)為NDIS_PACKET的包描述符來標(biāo)識的,中間層所看到的網(wǎng)絡(luò)封包結(jié)構(gòu)是一種類似于單向鏈表的形式,而包描述符相當(dāng)于整個鏈表的表頭指針。44typedefstruct_NDIS_PACKET{
NDIS_PACKET_PRIVATEPrivate;
union{struct{
UCHARMiniportReserved[2*sizeof(PVOID)];
UCHARWrapperReserved[2*sizeof(PVOID)];};
……};
……
}NDIS_PACKET,*PNDIS_PACKET,**PPNDIS_PACKET;4546一個完整的網(wǎng)絡(luò)封包是由以下三部分組成的:包描述符。它包含了此數(shù)據(jù)包的一些整體信息如數(shù)據(jù)包的大小、占用的物理內(nèi)存頁的頁數(shù)及指向第一個緩存描述符的指針。一系列的緩存描述符。緩存描述符主要用來記錄每個緩存的虛擬地址及它們的偏移量,在緩存描述符中還有指向下一個緩存描述符的指針。虛擬地址空間。這些虛擬地址的空間會被映射到數(shù)據(jù)包所占用的真正的物理內(nèi)存中去。47由于下層驅(qū)動程序傳遞上來的網(wǎng)絡(luò)封包在內(nèi)存中的存儲地址并不是連續(xù)的,所以在進(jìn)行封包處理之前需要先把數(shù)據(jù)包中的所有數(shù)據(jù)拷貝到一個連續(xù)的內(nèi)存中才能進(jìn)行使用。當(dāng)對其進(jìn)行的操作完成后,再用自己創(chuàng)建的包描述符,將封包交給上層進(jìn)行處理。而此時包描述符指向的緩沖描述符只有一個,而后者指向一塊連續(xù)的內(nèi)存。48當(dāng)將一個數(shù)據(jù)包的所有數(shù)據(jù)拷貝到一個連續(xù)的內(nèi)存中后,封包截獲模塊可以按照與數(shù)據(jù)進(jìn)入?yún)f(xié)議棧進(jìn)行封裝時相反的順序讀入數(shù)據(jù)包的信息,即以太網(wǎng)頭部->IP頭部->傳輸層頭部的順序。496、接收和發(fā)送
MiniportdriverlayerProtocoldriverlayerNdisReturnPacketMPReturnPacket54NdisMXxxIndicateRecceiveCompletePtReceiveComplete67MPTransferData98NdisTransferDataPtTransferDataComplete1011NdisTransferDataCompleteNdisMIndicateReceivePacketNdisMXxxIndicateReceivePtReceive/PtReceivePacket21350(1)底層驅(qū)動使用NdisMIndicateReceivePacket/NdisMXxxIndicateReceive通知上層已經(jīng)收到數(shù)據(jù)報文同時向NDIS傳遞一部分?jǐn)?shù)據(jù)。(2)在PtReceive中如果通過NdisGetReceivedPacket得到了一個完整的packet,就分配自己的MyPacket,根據(jù)底下傳上來的packet設(shè)置MyPacket,然后調(diào)用NdisMIndicateReceivePacket通知NDIS,NDIS會接著調(diào)用上層協(xié)議驅(qū)動的相應(yīng)PtReceive例程。51MiniportdriverlayerProtocoldriverlayerNdisReturnPacketMPReturnPacket54NdisMXxxIndicateRecceiveCompletePtReceiveComplete67MPTransferData98NdisTransferDataPtTransferDataComplete1011NdisTransferDataCompleteNdisMIndicateReceivePacketNdisMXxxIndicateReceivePtReceive/PtReceivePacket21352(3)在PtReceive中如果通過NdisGetReceivedPacket不能得到一個完整的packet,那就直接調(diào)用NdisMIndicateReceive等函數(shù)通知NDIS。(4)當(dāng)上層協(xié)議驅(qū)動得到了一個完整的數(shù)據(jù)報文并且處理完畢以后,它會調(diào)用NdisReturnPacket,然后NDIS會調(diào)用MPReturnPacket。53MiniportdriverlayerProtocoldriverlayerNdisReturnPacketMPReturnPacket54NdisMXxxIndicateRecceiveCompletePtReceiveComplete67MPTransferData98NdisTransferDataPtTransferDataComplete1011NdisTransferDataCompleteNdisMIndicateReceivePacketNdisMXxxIndicateReceivePtReceive/PtReceivePacket21354(5)在MPReturnPacket中,釋放自己分配的MyPacket,然后同樣的向下層調(diào)用NdisReturnPacket。下層會釋放他們自己分配的packet。(6)如果(3)發(fā)生,當(dāng)?shù)讓觤iniport驅(qū)動收到了一個完整的數(shù)據(jù)報文,它會調(diào)用NdisMXxxIndicateReceiveComplete,然后NDIS會調(diào)用PtReceiveComplete。55MiniportdriverlayerProtocoldriverlayerNdisReturnPacketMPReturnPacket54NdisMXxxIndicateRecceiveCompletePtReceiveComplete67MPTransferData98NdisTransferDataPtTransferDataComplete1011NdisTransferDataCompleteNdisMIndicateReceivePacketNdisMXxxIndicateReceivePtReceive/PtReceivePacket21356(7)
PtReceiveComplete會通知上層“已經(jīng)收到了完整的報文”。(8)當(dāng)上層協(xié)議驅(qū)動得知底層已經(jīng)收到了完整的數(shù)據(jù)報文以后,則會調(diào)用NdisTransferData,要求下層把剩余的數(shù)據(jù)傳上來。57MiniportdriverlayerProtocoldriverlayerNdisReturnPacketMPReturnPacket54NdisMXxxIndicateRecceiveCompletePtReceiveComplete67MPTransferData98NdisTransferDataPtTransferDataComplete1011NdisTransferDataCompleteNdisMIndicateReceivePacketNdisMXxxIndicateReceivePtReceive/PtReceivePacket21358(9)8的調(diào)用會導(dǎo)致NDIS調(diào)用MPTransferData例程。在MPTransferData中,做同樣的調(diào)用NdisTransferData。注意該函數(shù)的返回值:如果返回success,說明剩余的數(shù)據(jù)立刻就傳上來了,此時會立即返回。10、11兩步驟就不會調(diào)用;如果返回pending,表明底層在此阻塞,底層會在稍后的時候調(diào)用10。59MiniportdriverlayerProtocoldriverlayerNdisReturnPacketMPReturnPacket54NdisMEthIndicateRecceiveCompletePtReceiveComplete67MPTransferData98NdisTransferDataPtTransferDataComplete1011NdisTransferDataCompleteNd
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年岳麓版選修6歷史下冊階段測試試卷含答案
- 2025年華師大版選修2地理下冊階段測試試卷
- 2025年北師大新版選修5歷史上冊階段測試試卷含答案
- 2025年外研版三年級起點(diǎn)選擇性必修3歷史上冊月考試卷含答案
- 2025年浙教版選修6歷史下冊月考試卷
- 二零二五版面料行業(yè)標(biāo)準(zhǔn)制定與采購合同范本3篇
- 二零二五年度生物制藥項目與派遣公司研發(fā)人員派遣合同4篇
- 二零二五版派遣人力資源管理顧問人才派遣與咨詢合同4篇
- 二零二五版商業(yè)綜合體租賃合同范本4篇
- 二零二五年度個人汽車租賃貸款合同范本3篇
- 南安市第三次全國文物普查不可移動文物-各鄉(xiāng)鎮(zhèn)、街道分布情況登記清單(表五)
- 選煤廠安全知識培訓(xùn)課件
- 項目前期選址分析報告
- 急性肺栓塞搶救流程
- 《統(tǒng)計學(xué)-基于Python》 課件全套 第1-11章 數(shù)據(jù)與Python語言-時間序列分析和預(yù)測
- 《形象價值百萬》課件
- 紅色文化教育國內(nèi)外研究現(xiàn)狀范文十
- 中醫(yī)基礎(chǔ)理論-肝
- 小學(xué)外來人員出入校門登記表
- 《土地利用規(guī)劃學(xué)》完整課件
- GB/T 25283-2023礦產(chǎn)資源綜合勘查評價規(guī)范
評論
0/150
提交評論