




已閱讀5頁,還剩44頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
標(biāo) 題: 【原創(chuàng)】NDIS中間層驅(qū)動(dòng)開發(fā)在Win7系統(tǒng)下和Windows XP系統(tǒng)下的區(qū)別作 者: tianhz時(shí) 間: 2011-07-21,14:58:04鏈 接: /showthread.php?t=137545NDIS中間層驅(qū)動(dòng)的開發(fā)在Win7系統(tǒng)上和Windows XP系統(tǒng)上有差別。我把NDIS中間層的討論分成2塊。 windows 7系統(tǒng)和Windows XP系統(tǒng)。(一)在 Windows XP系統(tǒng)上進(jìn)行開發(fā)平時(shí)很多朋友包括我在內(nèi),我們都在XP系統(tǒng)上使用NDIS5.1的框架來進(jìn)行程序開發(fā)。我們都使用Microsoft WDK提供的 NDIS 的 Passthru例子,在這個(gè)例子上做進(jìn)一步的修改,來達(dá)到我們的目地。在Passthru工程的 DriverEntry函數(shù)里面,我們都看見如下的代碼:NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)NDIS_STATUS Status;NDIS_PROTOCOL_CHARACTERISTICS PChars;NDIS_MINIPORT_CHARACTERISTICS MChars;PNDIS_CONFIGURATION_PARAMETER Param;NDIS_STRING Name;NDIS_HANDLE WrapperHandle;UNICODE_STRING nameString, linkString; UINT FuncIndex;PDEVICE_OBJECT MyDeviceObject; PDRIVER_DISPATCH MajorFunctionIRP_MJ_MAXIMUM_FUNCTION + 1;Status = NDIS_STATUS_SUCCESS;/申請自旋鎖 以到達(dá)資源共享的同步訪問NdisAllocateSpinLock(&GlobalLock);/調(diào)用NdisMInitializeWrapper函數(shù)來保存在NdisWrapperHandle返回的句柄NdisMInitializeWrapper(&NdisWrapperHandle, DriverObject, RegistryPath, NULL);do/調(diào)用NdisMInitializeWrapper函數(shù)來保存在WrapperHandle返回的句柄NdisMInitializeWrapper(&WrapperHandle, DriverObject, RegistryPath, NULL);/對于MiniportCharacteristics組件,如果驅(qū)動(dòng)程序不用導(dǎo)出MiniportXxx這樣的函數(shù),則必須賦值為NULL。/如果要導(dǎo)出任何新版本的V4.0或V5.0的MiniportXxx函數(shù),那么中間層驅(qū)動(dòng)程序的主版本必須是V4.0,并且提供4.0或5.0版本的MiniportCharacteristics組件.NdisZeroMemory(&MChars, sizeof(NDIS_MINIPORT_CHARACTERISTICS);MChars.MajorNdisVersion = PASSTHRU_MAJOR_NDIS_VERSION;MChars.MinorNdisVersion = PASSTHRU_MINOR_NDIS_VERSION;/*下面開始注冊中間層驅(qū)動(dòng)程序的 MiniportXxx函數(shù) */MChars.HaltHandler = MPHalt;MChars.InitializeHandler = MPInitialize;MChars.QueryInformationHandler = MPQueryInformation;MChars.SetInformationHandler = MPSetInformation;MChars.ResetHandler = MPReset;MChars.SendHandler = NULL;MChars.SendPacketsHandler = MPSendPackets;MChars.TransferDataHandler = MPTransferData;MChars.ReturnPacketHandler = MPReturnPacket;MChars.CheckForHangHandler = NULL;#ifdef NDIS51_MINIPORTMChars.CancelSendPacketsHandler = MPCancelSendPackets;MChars.PnPEventNotifyHandler = MPDevicePnPEvent;MChars.AdapterShutdownHandler = MPAdapterShutdown;#endif / NDIS51_MINIPORT /*傳遞上一步保存的句柄,并調(diào)用NdisIMRegisterLayeredMiniport函數(shù)來注冊驅(qū)動(dòng)程序的MiniportXxx系列函數(shù)。其中句柄NdisWrapperHandle是由先前的NdisMInitializeWrapper函數(shù)返回的。當(dāng)驅(qū)動(dòng)程序調(diào)用NdisIMInitializeDeviceInstance函數(shù),請求中間層驅(qū)動(dòng)程序的MiniportInitialize函數(shù)對虛擬NIC進(jìn)行初始化時(shí),需要把句柄NdisWrapperHandle傳入NDIS當(dāng)中間層驅(qū)動(dòng)程序成功地綁定到一個(gè)或者多個(gè)NIC驅(qū)動(dòng)程序上的時(shí)候, 或者是綁定到一個(gè)非NIC驅(qū)動(dòng)程序上的時(shí)候也會(huì)調(diào)用NdisIMInitializeDeviceInstance函數(shù)。這樣做使得中間層驅(qū)動(dòng)程序可以初始化Miniport組件來接受虛擬NIC上的I/O請求*/Status = NdisIMRegisterLayeredMiniport(NdisWrapperHandle, &MChars, sizeof(MChars), &DriverHandle);if (Status != NDIS_STATUS_SUCCESS)break;#ifndef WIN9XNdisMRegisterUnloadHandler(NdisWrapperHandle, PtUnload);#endif/中間層驅(qū)動(dòng)程序要做的事情:/初始化NDIS_PROTOCOL_CHARACTERISTICS類型的結(jié)構(gòu). NDIS不再支持3.0版本的協(xié)議驅(qū)動(dòng)./能夠使用4.0或5.0版本的ProtocolCharacteristic結(jié)構(gòu)體,協(xié)議驅(qū)動(dòng)必須支持PNP即插即用功能.NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS);PChars.MajorNdisVersion = PASSTHRU_PROT_MAJOR_NDIS_VERSION;PChars.MinorNdisVersion = PASSTHRU_PROT_MINOR_NDIS_VERSION;NdisInitUnicodeString(&Name, LPassthru); PChars.Name = Name;/* 下面開始注冊中間層驅(qū)動(dòng)程序的 ProtocolXxx函數(shù) 這里主要是注冊-下邊界面向無連接的中間層驅(qū)動(dòng)程序的ProtocolXxx函數(shù) */PChars.OpenAdapterCompleteHandler = PtOpenAdapterComplete;PChars.CloseAdapterCompleteHandler = PtCloseAdapterComplete;PChars.SendCompleteHandler = PtSendComplete;PChars.TransferDataCompleteHandler = PtTransferDataComplete;PChars.ResetCompleteHandler = PtResetComplete;PChars.RequestCompleteHandler = PtRequestComplete;PChars.ReceiveHandler = PtReceive;PChars.ReceivePacketHandler = PtReceivePacket;PChars.ReceiveCompleteHandler = PtReceiveComplete;PChars.StatusHandler = PtStatus;PChars.StatusCompleteHandler = PtStatusComplete;PChars.BindAdapterHandler = PtBindAdapter;PChars.UnbindAdapterHandler = PtUnbindAdapter;PChars.UnloadHandler = PtUnloadProtocol;PChars.PnPEventHandler= PtPNPHandler;/*如果驅(qū)動(dòng)程序隨后要綁定到底層的NDIS驅(qū)動(dòng)程序上,則調(diào)用NdisRegisterProtocol函數(shù)來注冊驅(qū)動(dòng)程序的ProtocolXxx函數(shù)。全局變量ProtHandle是在NDIS協(xié)議驅(qū)動(dòng)里面的NdisRegisterProtocol函數(shù)里面初始化的,然后中間層驅(qū)動(dòng)必須保存protHandle的值,并在將來NDIS中間層驅(qū)動(dòng)程序的協(xié)議部分的函數(shù)調(diào)用中作為輸入?yún)?shù)來傳遞.*/NdisRegisterProtocol(&Status, &ProtHandle,&PChars,sizeof(NDIS_PROTOCOL_CHARACTERISTICS);if (Status != NDIS_STATUS_SUCCESS)NdisIMDeregisterLayeredMiniport(DriverHandle);break;/如果驅(qū)動(dòng)程序?qū)С隽薓iniportXxx和ProtocolXxx這一些列的函數(shù),那么就調(diào)用NdisIMAssociateMiniport函數(shù)向NDIS通告有關(guān)驅(qū)動(dòng)程序的微端口低邊界和協(xié)議高邊界信息NdisIMAssociateMiniport(DriverHandle, ProtHandle);while (FALSE);/- 創(chuàng)建設(shè)備對象與符號(hào)連接-RtlInitUnicodeString(&nameString, LDeviceMyPassthru ); RtlInitUnicodeString(&linkString, L?MyPassthru); for(FuncIndex = 0; FuncIndex =IRP_MJ_MAXIMUM_FUNCTION; FuncIndex+)MajorFunctionFuncIndex = NULL;MajorFunctionIRP_MJ_CREATE = MydrvDispatch;MajorFunctionIRP_MJ_CLOSE = MydrvDispatch;MajorFunctionIRP_MJ_DEVICE_CONTROL = MydrvDispatchIoctl;Status = NdisMRegisterDevice(WrapperHandle, &nameString,&linkString,MajorFunction,&MyDeviceObject,&NdisDeviceHandle);if(Status != STATUS_SUCCESS)DbgPrint(NdisMRegisterDevice failed!n);return(Status);然后,我們就開始實(shí)現(xiàn)相應(yīng)的回調(diào)函數(shù)。 然而為了收、發(fā)網(wǎng)絡(luò)數(shù)據(jù)包,對它們進(jìn)行控制,我們基本上只會(huì)去修改以下的回調(diào)函數(shù):下面我把相關(guān)的函數(shù)的功能給羅列出來。/*MPSend函數(shù)的功能是: 發(fā)送單個(gè)數(shù)據(jù)包。 若中間層驅(qū)動(dòng)不支持MiniportSendPackets,那么MPSend函數(shù)必須實(shí)現(xiàn)。 參數(shù)說明: MiniportAdapterContext 它是適配器。 PacketArray 它是包描述符指針。 Flags 它未被使用。 */NDIS_STATUSMPSend(IN NDIS_HANDLE MiniportAdapterContext,IN PNDIS_PACKET Packet,IN UINT Flags)/*MPSendPackets函數(shù)的功能是: 用于指定網(wǎng)絡(luò)上傳輸數(shù)據(jù)包的包描述符指針數(shù)組。該函數(shù)可以用來發(fā)送多個(gè)數(shù)據(jù)包。而不是只發(fā)送單個(gè)數(shù)據(jù)包。除非中間層驅(qū)動(dòng)程序綁定到低層WAN NIC驅(qū)動(dòng)程序上,并提供MiniportWanSend函數(shù),否則驅(qū)動(dòng)程序應(yīng)提供對MPSendPackets函數(shù)的支持, 而不是對MPSend函數(shù)的支持。參數(shù)說明:MiniportAdapterContext 它是適配器。 PacketArray 它是包描述符數(shù)組。 NumberOfPackets 它是PacketArray的長度。 每個(gè)數(shù)據(jù)包發(fā)送完成后無論是否成功都要調(diào)用 NdisMSendComplete函數(shù)。讓上層的協(xié)議驅(qū)動(dòng)能夠收到SendCompleteHandler來判斷數(shù)據(jù)包的完成狀態(tài)。 */VOIDMPSendPackets(IN NDIS_HANDLE MiniportAdapterContext,IN PPNDIS_PACKET PacketArray,IN UINT NumberOfPackets)/*MPTransferData函數(shù)的功能: 該函數(shù)用于傳輸在前視緩沖區(qū)中沒有指示的接收數(shù)據(jù)包的剩余部分。前視緩沖區(qū)由 中間層驅(qū)動(dòng)程序傳遞給 NdisMXxxIndicateReceive函數(shù)。這個(gè)被指示的數(shù)據(jù)包可以是 中間層驅(qū)動(dòng)程序的ProtocolReceive函數(shù)或者是ProtocolReceivePackets處理程序接收的 轉(zhuǎn)換數(shù)據(jù)包。 如果中間層驅(qū)動(dòng)程序通過調(diào)用NdisMXxxIndicateReceive函數(shù)向上層驅(qū)動(dòng)程序指示接收 數(shù)據(jù)包,那么MPTransferData函數(shù)必須提供。 如果中間層通過調(diào)用驅(qū)動(dòng)程序總是NdisMIndicateReceive函數(shù)向上層驅(qū)動(dòng)程序指示接收 數(shù)據(jù)包,那么MPTransferData函數(shù)可以不必提供。即 NdisMIndicateReceivePacket指示接收數(shù)據(jù)包,那么傳遞給ProtocoltReceive函數(shù) 的前視緩沖區(qū)將總是獲得完整的數(shù)據(jù)包。 */NDIS_STATUSMPTransferData(OUT PNDIS_PACKET Packet, /目的數(shù)據(jù)包OUT PUINT BytesTransferred,/復(fù)制了多少數(shù)據(jù)IN NDIS_HANDLE MiniportAdapterContext,/適配器結(jié)構(gòu)體IN NDIS_HANDLE MiniportReceiveContext,/上下文IN UINT ByteOffset,/指向拷貝數(shù)據(jù)包的偏移IN UINT BytesToTransfer/實(shí)際傳輸了多少字節(jié)的數(shù)據(jù))/*PtTransferDataComplete函數(shù)的功能: 它是MPTransferData()的異步完成函數(shù)。 當(dāng)ProtocolReceive函數(shù)需要調(diào)用NdisTransferData函數(shù),那么我們必須實(shí)現(xiàn)PtTransferDataComplete的代碼。當(dāng)NdisTransferData調(diào)用之后,并且返回值是NDIS_STATUS_PENDING,在數(shù)據(jù)包傳輸完成了以后,會(huì)去調(diào)用PtTransferDataComplete函數(shù)用來表明一個(gè)數(shù)據(jù)包的傳輸完成。這時(shí)就會(huì)得到一個(gè)完整的數(shù)據(jù)包。 */VOIDPtTransferDataComplete(IN NDIS_HANDLE ProtocolBindingContext,IN PNDIS_PACKET Packet,IN NDIS_STATUS Status,IN UINT BytesTransferred)/* PtReceive函數(shù)的功能是: 該函數(shù)以指向包含網(wǎng)絡(luò)接收數(shù)據(jù)的前視緩沖區(qū)的指針為參數(shù)被調(diào)用執(zhí)行。如果這個(gè)前視緩沖區(qū)沒有包含完整的網(wǎng)絡(luò)數(shù)據(jù)包,那么ProtocolReceive函數(shù)將以包描述符作為參數(shù),調(diào)用NdisTransferData函數(shù)。 當(dāng)NdisTransferData調(diào)用之后,數(shù)據(jù)包傳輸完成了以后,會(huì)去調(diào)用ProtocolTransferDataComplete函數(shù)以用來表明一個(gè)數(shù)據(jù)包的傳輸完成。這時(shí)就會(huì)得到一個(gè)完整的數(shù)據(jù)包。 如果低層驅(qū)動(dòng)程序調(diào)用了 NdisMIndicateReceivePacket指示接收數(shù)據(jù)包,那么傳遞給PtReceive函數(shù)的前視緩沖區(qū)將總是獲得完整的數(shù)據(jù)包。 如果中間層驅(qū)動(dòng)不需要完整的數(shù)據(jù)包時(shí),可以調(diào)用NdisMXxxIndicateReceice函數(shù)向上通知,這樣就省略了獲取完整數(shù)據(jù)包的過程。前視緩沖區(qū):考慮數(shù)據(jù)包的接收,如果我們只需要看見數(shù)據(jù)內(nèi)容的前幾個(gè)字節(jié)(如TCP頭)就可以決定這個(gè)包是否是本協(xié)議所需要處理的,那么顯然下層驅(qū)動(dòng)就沒有必要提交整個(gè)數(shù)據(jù)包,只提供一個(gè)包開始的幾個(gè)字節(jié)就可以了。 參數(shù)說明: ProtocolBindingContext 在綁定是得到的綁定句柄,即它是在NdisOpenAdapter被調(diào)用時(shí)設(shè)置的。 MacReceiveContext 它指向一個(gè)不透明的環(huán)境變量,由底層NIC驅(qū)動(dòng)傳入,它用此句柄與從網(wǎng)絡(luò)上收到的Packet關(guān)聯(lián)。當(dāng)調(diào)用NdisGetReceivePacket函數(shù)取得低層驅(qū)動(dòng)上面的包描述符時(shí),需要用到這個(gè)參數(shù)。當(dāng)NDIS協(xié)議驅(qū)動(dòng)的ProtocolReceive函數(shù)的實(shí)現(xiàn)中,可能要調(diào)用NdisTransferData函數(shù),那么也會(huì)用到這個(gè)參數(shù)。 HeaderBuffer 它是一個(gè)以太網(wǎng)幀,就是以太網(wǎng)的包頭。它是個(gè)虛擬的地址,只能在當(dāng)前函數(shù)中有效, 它不能被存儲(chǔ)而作為全局變量來使用。 HeaderBufferSize 它是包頭的長度,它的值一般為14 LookAheadBuffer 它是前視緩沖區(qū)指針。 LookAheadBufferSize LookAheadBuffer的大小。 PacketSize 它是完整的數(shù)據(jù)包長度(不包括包頭)。 當(dāng)PtReceive函數(shù)被調(diào)用了以后,系統(tǒng)將會(huì)去調(diào)用完成函數(shù)PtReceiveComplete 如果傳遞給PtReceive的數(shù)據(jù)是通過NdisMXxxIndicateReceive進(jìn)行指示的,那么傳遞給PtReceive的前視緩沖區(qū)的長度不會(huì)超過用OID_GEN_CURRENT_LOOKAHEAD調(diào)用NdisRequest返回的值。 如果PtReceive的調(diào)用執(zhí)行在NdisMIndicateReceivePacket之前進(jìn)行,那么底層驅(qū)動(dòng)程序把包數(shù)組中的一個(gè)或者多個(gè)包狀態(tài)設(shè)置為 NDIS_STATUS_RESOURCES,那么前視緩沖區(qū)的大小總是等于整個(gè)網(wǎng)絡(luò)數(shù)據(jù)包的大小。所以中間層驅(qū)動(dòng)程序可以不必調(diào)用NdisTransferData函數(shù)。 */NDIS_STATUSPtReceive(IN NDIS_HANDLE ProtocolBindingContext,IN NDIS_HANDLE MacReceiveContext,IN PVOID HeaderBuffer,IN UINT HeaderBufferSize,IN PVOID LookAheadBuffer,IN UINT LookAheadBufferSize,IN UINT PacketSize)/* PtReceivePacket函數(shù)的功能是: 這是一個(gè)可選函數(shù)。 如果中間層驅(qū)動(dòng)程序所基于的NIC驅(qū)動(dòng)程序指示的是數(shù)據(jù)包描述符指針數(shù)組,或者調(diào)用NdisMIndicateReceivePacket函數(shù)指示接收帶外數(shù)據(jù),那么驅(qū)動(dòng)程序應(yīng)該提供PtReceivePacket函數(shù)。 如果開發(fā)者不能夠確定中間層驅(qū)動(dòng)程序的執(zhí)行環(huán)境,也應(yīng)該提供該函數(shù),因?yàn)樵谀軌虍a(chǎn)生多包指示的底層NIC驅(qū)動(dòng)程序上,中間層驅(qū)動(dòng)程序?qū)@得更好的性能。 */INTPtReceivePacket(IN NDIS_HANDLE ProtocolBindingContext,IN PNDIS_PACKET Packet)我們可以在這幾個(gè)回調(diào)函數(shù)里面來處理、過濾、分析 捕捉到的數(shù)據(jù)包。防火墻軟件一般也都是在這幾個(gè)回調(diào)函數(shù)里面進(jìn)行編程。其它的回調(diào)函數(shù)的代碼,我們基本上不用去修改。NDIS Passthru的例子很多,在網(wǎng)絡(luò)上搜索一下,就有很多源代碼例子,也有很多相關(guān)的技術(shù)說明。 下面,我想重點(diǎn)的說明在Windows 7系統(tǒng)下,(當(dāng)然是Win7 32/64位系統(tǒng))如何做NDIS中間層驅(qū)動(dòng)程序的開發(fā),代碼和之前老的Windows操作系統(tǒng)提供的Passthru例子的區(qū)別。(二)在 Windows 7系統(tǒng)上進(jìn)行開發(fā)在Win7系統(tǒng)下開發(fā)驅(qū)動(dòng)程序,需要數(shù)字證書,還需要驅(qū)動(dòng)簽名認(rèn)證。由于Win7系統(tǒng)的內(nèi)核做了大幅度的修改,它和XP系統(tǒng)的內(nèi)核起了很大的變化,最顯著的就是剛才說的:需要簽名和證書。 還有就是:不能隨意的HOOK SSDT了。在開發(fā)NDIS驅(qū)動(dòng)程序的時(shí)候,WDK開發(fā)包提供了一個(gè)新的框架,叫著NDIS FilterNDIS Filter是一個(gè)例子工程。假入我把WDK安裝在E盤,那么這個(gè)工程代碼就在:E:WinDDK7600.16385.1srcnetworkndisfilter目錄下。把這個(gè)例子工程和原來的Passthru工程代碼做比較,您會(huì)發(fā)現(xiàn),原來需要導(dǎo)出來的2種類型的回調(diào)函數(shù)MiniportXXX和ProtocolXXX 在新的框架里面被全部隱藏起來了。微軟提供了新的函數(shù)。 一起來看看,微軟提供了什么。在這里,為了方便分析, 我把函數(shù)代碼都做了功能注釋,請大家一起看看。代碼如下:#pragma NDIS_INIT_FUNCTION(DriverEntry)#define LITTLE_ENDIAN (1)/ Global variables/ NDIS_HANDLE FilterDriverHandle; / NDIS handle for filter driverNDIS_HANDLE FilterDriverObject;NDIS_HANDLE NdisFilterDeviceHandle = NULL;PDEVICE_OBJECT DeviceObject = NULL;FILTER_LOCK FilterListLock;LIST_ENTRY FilterModuleList;PWCHAR InstanceStrings = NULL;NDIS_FILTER_PARTIAL_CHARACTERISTICS DefaultChars = 0, 0, 0,0,FilterSendNetBufferLists,FilterSendNetBufferListsComplete,NULL,FilterReceiveNetBufferLists,FilterReturnNetBufferLists; typedef struct in_addr union struct UCHAR s_b1,s_b2,s_b3,s_b4; S_un_b;struct USHORT s_w1,s_w2; S_un_w;ULONG S_addr; S_un; IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;#pragma push(1)typedef struct IP_HEADER#if LITTLE_ENDIANunsigned char ip_hl:4; /* 頭長度 */unsigned char ip_v:4; /* 版本號(hào) */#elseunsigned char ip_v:4;unsigned char ip_hl:4; #endifunsigned char TOS; / 服務(wù)類型unsigned short TotLen; / 封包總長度,即整個(gè)IP包的長度unsigned short ID; / 封包標(biāo)識(shí),唯一標(biāo)識(shí)發(fā)送的每一個(gè)數(shù)據(jù)報(bào)unsigned short FlagOff; / 標(biāo)志unsigned char TTL; / 生存時(shí)間,就是TTLunsigned char Protocol; / 協(xié)議,可能是TCP、UDP、ICMP等unsigned short Checksum; / 校驗(yàn)和struct in_addr iaSrc; / 源IP地址struct in_addr iaDst; / 目的PI地址IP_HEADER, *PIP_HEADER;typedef struct tcp_headerunsigned short src_port; /源端口號(hào)unsigned short dst_port; /目的端口號(hào)unsigned int seq_no; /序列號(hào)unsigned int ack_no; /確認(rèn)號(hào)#if LITTLE_ENDIANunsigned char reserved_1:4; /保留6位中的4位首部長度unsigned char thl:4; /tcp頭部長度unsigned char flag:6; /6位標(biāo)志unsigned char reseverd_2:2; /保留6位中的2位#elseunsigned char thl:4; /tcp頭部長度unsigned char reserved_1:4; /保留6位中的4位首部長度unsigned char reseverd_2:2; /保留6位中的2位unsigned char flag:6; /6位標(biāo)志 #endifunsigned short wnd_size; /16位窗口大小unsigned short chk_sum; /16位TCP檢驗(yàn)和unsigned short urgt_p; /16為緊急指針TCP_HEADER,*PTCP_HEADER;typedef struct udp_header USHORT srcport; / 源端口USHORT dstport; / 目的端口USHORT total_len; / 包括UDP報(bào)頭及UDP數(shù)據(jù)的長度(單位:字節(jié))USHORT chksum; / 校驗(yàn)和UDP_HEADER,*PUDP_HEADER;#pragma push()#define IP_OFFSET 0x0E/IP 協(xié)議類型#define PROT_ICMP 0x01 #define PROT_TCP 0x06 #define PROT_UDP 0x11 USHORT UTIL_htons( USHORT hostshort )PUCHAR pBuffer;USHORT nResult;nResult = 0;pBuffer = (PUCHAR )&hostshort;nResult = ( (pBuffer 0 DriverEntry.n);RtlInitUnicodeString(&ServiceName, FILTER_SERVICE_NAME);RtlInitUnicodeString(&FriendlyName, FILTER_FRIENDLY_NAME);RtlInitUnicodeString(&UniqueName, FILTER_UNIQUE_NAME);FilterDriverObject = DriverObject;doNdisZeroMemory(&FChars, sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS); /*大多數(shù)的NDIS6.0數(shù)據(jù)結(jié)構(gòu)中包含的對象頭結(jié)構(gòu)的成員,即NDIS_OBJECT_HEADER結(jié)構(gòu)。對象頭有三個(gè)成員:類型,大小和修改。如果頭信息是不正確的,那么調(diào)用NDIS6.0函數(shù)將失敗。*/FChars.Header.Type = NDIS_OBJECT_TYPE_FILTER_DRIVER_CHARACTERISTICS;FChars.Header.Size = sizeof(NDIS_FILTER_DRIVER_CHARACTERISTICS);FChars.Header.Revision = NDIS_FILTER_CHARACTERISTICS_REVISION_1;FChars.MajorNdisVersion = FILTER_MAJOR_NDIS_VERSION;FChars.MinorNdisVersion = FILTER_MINOR_NDIS_VERSION;FChars.MajorDriverVersion = 1;FChars.MinorDriverVersion = 0;FChars.Flags = 0;FChars.FriendlyName = FriendlyName;FChars.UniqueName = UniqueName;FChars.ServiceName = ServiceName;/*NDIS_FILTER_DRIVER_CHARACTERISTICS結(jié)構(gòu)中Mandatory例程*/FChars.AttachHandler = FilterAttach;FChars.DetachHandler = FilterDetach;FChars.RestartHandler = FilterRestart;FChars.PauseHandler = FilterPause;/*NDIS_FILTER_DRIVER_CHARACTERISTICS結(jié)構(gòu)中Optional且不能在運(yùn)行時(shí)變更的例程*/FChars.SetOptionsHandler = FilterRegisterOptions;FChars.SetFilterModuleOptionsHandler = FilterSetModuleOptions;FChars.OidRequestHandler = FilterOidRequest;FChars.OidRequestCompleteHandler = FilterOidRequestComplete;FChars.StatusHandler = FilterStatus;FChars.DevicePnPEventNotifyHandler = FilterDevicePnPEventNotify;FChars.NetPnPEventHandler = FilterNetPnPEvent; FChars.CancelSendNetBufferListsHandler = FilterCancelSendNetBufferLists;/*DIS_FILTER_DRIVER_CHARACTERISTICS結(jié)構(gòu)中Optional且能在運(yùn)行時(shí)變更的例程。下面這4個(gè)例程也被定義在NDIS_FILTER_PARTIAL_CHARACTERISTICS中,這個(gè)結(jié)構(gòu)指定的例程可以在運(yùn)行時(shí)的FilterSetModuleOptions例程中調(diào)用NdisSetOptionHandles來改變。如果過濾驅(qū)動(dòng)要在例程中修改自身的一個(gè)特性,那么必須提供FilterSetModuleOptions例程。*/FChars.SendNetBufferListsHandler = FilterSendNetBufferLists; FChars.SendNetBufferListsCompleteHandler = FilterSendNetBufferListsComplete;FChars.ReturnNetBufferListsHandler = FilterReturnNetBufferLists;FChars.ReceiveNetBufferListsHandler = FilterReceiveNetBufferLists;/FChars.CancelOidRequestHandler = FilterCancelOidRequest; DriverObject-DriverUnload = FilterUnload;FilterDriverHandle = NULL;FILTER_INIT_LOCK(&FilterListLock);InitializeListHead(&FilterModuleList);/ 把Filter驅(qū)動(dòng)注冊給NDISStatus = NdisFRegisterFilterDriver(DriverObject,(NDIS_HANDLE)FilterDriverObject,&FChars, &FilterDriverHandle);if (Status != NDIS_STATUS_SUCCESS)DEBUGP(DL_WARN, (MSFilter: Register filter driver failed.n); break;/ Initilize spin locks/Status = FilterRegisterDevice();if (Status != NDIS_STATUS_SUC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025高一數(shù)學(xué)教學(xué)資源整合計(jì)劃
- 無人駕駛供應(yīng)商管理辦法范文
- 供電設(shè)備故障診斷流程
- 制藥行業(yè)安全生產(chǎn)教育培訓(xùn)年度計(jì)劃
- 智能健康監(jiān)測下危急值報(bào)告自動(dòng)流程制度他
- 名校小學(xué)培優(yōu)輔差工作計(jì)劃
- 義務(wù)教育三年級道德與法治教學(xué)計(jì)劃
- 新員工師徒結(jié)對師傅計(jì)劃
- 危重病人搶救護(hù)理流程指南他
- 2025年小學(xué)心理健康教育個(gè)案輔導(dǎo)計(jì)劃
- 材料科學(xué)基礎(chǔ)第七章:二元相圖及其合金的凝固
- 某煤礦雙軌運(yùn)輸水平大巷斷面及爆破設(shè)計(jì)
- 小學(xué)班主任班級管理 四年級家長會(huì) 課件
- 2022-2023學(xué)年北京市通州區(qū)高一期末語文試卷及答案解析
- 電力建設(shè)安全工作規(guī)程完整
- 大力加強(qiáng)依法治校推進(jìn)學(xué)校治理體系與治理能力現(xiàn)代化課件
- 病媒生物監(jiān)測方案
- 山東省煙臺(tái)招遠(yuǎn)市(五四制)2022-2023學(xué)年八年級下學(xué)期期末語文試題(解析版)
- 山東工商學(xué)院馬克思主義基本原理期末復(fù)習(xí)題及參考答案
- 深圳市寶安區(qū)教育系統(tǒng)非正編人員聘用合同書
- 2023-2024學(xué)年河北省武安市小學(xué)語文六年級期末高分提分卷附參考答案和詳細(xì)解析
評論
0/150
提交評論