




已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
標(biāo) 題: 【原創(chuàng)】NDIS中間層驅(qū)動開發(fā)在Win7系統(tǒng)下和Windows XP系統(tǒng)下的區(qū)別作 者: tianhz時 間: 2011-07-21,14:58:04鏈 接: /showthread.php?t=137545NDIS中間層驅(qū)動的開發(fā)在Win7系統(tǒng)上和Windows XP系統(tǒng)上有差別。我把NDIS中間層的討論分成2塊。 windows 7系統(tǒng)和Windows XP系統(tǒng)。(一)在 Windows XP系統(tǒng)上進行開發(fā)平時很多朋友包括我在內(nèi),我們都在XP系統(tǒng)上使用NDIS5.1的框架來進行程序開發(fā)。我們都使用Microsoft WDK提供的 NDIS 的 Passthru例子,在這個例子上做進一步的修改,來達(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ǎo)出MiniportXxx這樣的函數(shù),則必須賦值為NULL。/如果要導(dǎo)出任何新版本的V4.0或V5.0的MiniportXxx函數(shù),那么中間層驅(qū)動程序的主版本必須是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ū)動程序的 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ū)動程序的MiniportXxx系列函數(shù)。其中句柄NdisWrapperHandle是由先前的NdisMInitializeWrapper函數(shù)返回的。當(dāng)驅(qū)動程序調(diào)用NdisIMInitializeDeviceInstance函數(shù),請求中間層驅(qū)動程序的MiniportInitialize函數(shù)對虛擬NIC進行初始化時,需要把句柄NdisWrapperHandle傳入NDIS當(dāng)中間層驅(qū)動程序成功地綁定到一個或者多個NIC驅(qū)動程序上的時候, 或者是綁定到一個非NIC驅(qū)動程序上的時候也會調(diào)用NdisIMInitializeDeviceInstance函數(shù)。這樣做使得中間層驅(qū)動程序可以初始化Miniport組件來接受虛擬NIC上的I/O請求*/Status = NdisIMRegisterLayeredMiniport(NdisWrapperHandle, &MChars, sizeof(MChars), &DriverHandle);if (Status != NDIS_STATUS_SUCCESS)break;#ifndef WIN9XNdisMRegisterUnloadHandler(NdisWrapperHandle, PtUnload);#endif/中間層驅(qū)動程序要做的事情:/初始化NDIS_PROTOCOL_CHARACTERISTICS類型的結(jié)構(gòu). NDIS不再支持3.0版本的協(xié)議驅(qū)動./能夠使用4.0或5.0版本的ProtocolCharacteristic結(jié)構(gòu)體,協(xié)議驅(qū)動必須支持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ū)動程序的 ProtocolXxx函數(shù) 這里主要是注冊-下邊界面向無連接的中間層驅(qū)動程序的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ū)動程序隨后要綁定到底層的NDIS驅(qū)動程序上,則調(diào)用NdisRegisterProtocol函數(shù)來注冊驅(qū)動程序的ProtocolXxx函數(shù)。全局變量ProtHandle是在NDIS協(xié)議驅(qū)動里面的NdisRegisterProtocol函數(shù)里面初始化的,然后中間層驅(qū)動必須保存protHandle的值,并在將來NDIS中間層驅(qū)動程序的協(xié)議部分的函數(shù)調(diào)用中作為輸入?yún)?shù)來傳遞.*/NdisRegisterProtocol(&Status, &ProtHandle,&PChars,sizeof(NDIS_PROTOCOL_CHARACTERISTICS);if (Status != NDIS_STATUS_SUCCESS)NdisIMDeregisterLayeredMiniport(DriverHandle);break;/如果驅(qū)動程序?qū)С隽薓iniportXxx和ProtocolXxx這一些列的函數(shù),那么就調(diào)用NdisIMAssociateMiniport函數(shù)向NDIS通告有關(guān)驅(qū)動程序的微端口低邊界和協(xié)議高邊界信息NdisIMAssociateMiniport(DriverHandle, ProtHandle);while (FALSE);/- 創(chuàng)建設(shè)備對象與符號連接-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);然后,我們就開始實現(xiàn)相應(yīng)的回調(diào)函數(shù)。 然而為了收、發(fā)網(wǎng)絡(luò)數(shù)據(jù)包,對它們進行控制,我們基本上只會去修改以下的回調(diào)函數(shù):下面我把相關(guān)的函數(shù)的功能給羅列出來。/*MPSend函數(shù)的功能是: 發(fā)送單個數(shù)據(jù)包。 若中間層驅(qū)動不支持MiniportSendPackets,那么MPSend函數(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ā)送多個數(shù)據(jù)包。而不是只發(fā)送單個數(shù)據(jù)包。除非中間層驅(qū)動程序綁定到低層WAN NIC驅(qū)動程序上,并提供MiniportWanSend函數(shù),否則驅(qū)動程序應(yīng)提供對MPSendPackets函數(shù)的支持, 而不是對MPSend函數(shù)的支持。參數(shù)說明:MiniportAdapterContext 它是適配器。 PacketArray 它是包描述符數(shù)組。 NumberOfPackets 它是PacketArray的長度。 每個數(shù)據(jù)包發(fā)送完成后無論是否成功都要調(diào)用 NdisMSendComplete函數(shù)。讓上層的協(xié)議驅(qū)動能夠收到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ū)動程序傳遞給 NdisMXxxIndicateReceive函數(shù)。這個被指示的數(shù)據(jù)包可以是 中間層驅(qū)動程序的ProtocolReceive函數(shù)或者是ProtocolReceivePackets處理程序接收的 轉(zhuǎn)換數(shù)據(jù)包。 如果中間層驅(qū)動程序通過調(diào)用NdisMXxxIndicateReceive函數(shù)向上層驅(qū)動程序指示接收 數(shù)據(jù)包,那么MPTransferData函數(shù)必須提供。 如果中間層通過調(diào)用驅(qū)動程序總是NdisMIndicateReceive函數(shù)向上層驅(qū)動程序指示接收 數(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/實際傳輸了多少字節(jié)的數(shù)據(jù))/*PtTransferDataComplete函數(shù)的功能: 它是MPTransferData()的異步完成函數(shù)。 當(dāng)ProtocolReceive函數(shù)需要調(diào)用NdisTransferData函數(shù),那么我們必須實現(xiàn)PtTransferDataComplete的代碼。當(dāng)NdisTransferData調(diào)用之后,并且返回值是NDIS_STATUS_PENDING,在數(shù)據(jù)包傳輸完成了以后,會去調(diào)用PtTransferDataComplete函數(shù)用來表明一個數(shù)據(jù)包的傳輸完成。這時就會得到一個完整的數(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í)行。如果這個前視緩沖區(qū)沒有包含完整的網(wǎng)絡(luò)數(shù)據(jù)包,那么ProtocolReceive函數(shù)將以包描述符作為參數(shù),調(diào)用NdisTransferData函數(shù)。 當(dāng)NdisTransferData調(diào)用之后,數(shù)據(jù)包傳輸完成了以后,會去調(diào)用ProtocolTransferDataComplete函數(shù)以用來表明一個數(shù)據(jù)包的傳輸完成。這時就會得到一個完整的數(shù)據(jù)包。 如果低層驅(qū)動程序調(diào)用了 NdisMIndicateReceivePacket指示接收數(shù)據(jù)包,那么傳遞給PtReceive函數(shù)的前視緩沖區(qū)將總是獲得完整的數(shù)據(jù)包。 如果中間層驅(qū)動不需要完整的數(shù)據(jù)包時,可以調(diào)用NdisMXxxIndicateReceice函數(shù)向上通知,這樣就省略了獲取完整數(shù)據(jù)包的過程。前視緩沖區(qū):考慮數(shù)據(jù)包的接收,如果我們只需要看見數(shù)據(jù)內(nèi)容的前幾個字節(jié)(如TCP頭)就可以決定這個包是否是本協(xié)議所需要處理的,那么顯然下層驅(qū)動就沒有必要提交整個數(shù)據(jù)包,只提供一個包開始的幾個字節(jié)就可以了。 參數(shù)說明: ProtocolBindingContext 在綁定是得到的綁定句柄,即它是在NdisOpenAdapter被調(diào)用時設(shè)置的。 MacReceiveContext 它指向一個不透明的環(huán)境變量,由底層NIC驅(qū)動傳入,它用此句柄與從網(wǎng)絡(luò)上收到的Packet關(guān)聯(lián)。當(dāng)調(diào)用NdisGetReceivePacket函數(shù)取得低層驅(qū)動上面的包描述符時,需要用到這個參數(shù)。當(dāng)NDIS協(xié)議驅(qū)動的ProtocolReceive函數(shù)的實現(xiàn)中,可能要調(diào)用NdisTransferData函數(shù),那么也會用到這個參數(shù)。 HeaderBuffer 它是一個以太網(wǎng)幀,就是以太網(wǎng)的包頭。它是個虛擬的地址,只能在當(dāng)前函數(shù)中有效, 它不能被存儲而作為全局變量來使用。 HeaderBufferSize 它是包頭的長度,它的值一般為14 LookAheadBuffer 它是前視緩沖區(qū)指針。 LookAheadBufferSize LookAheadBuffer的大小。 PacketSize 它是完整的數(shù)據(jù)包長度(不包括包頭)。 當(dāng)PtReceive函數(shù)被調(diào)用了以后,系統(tǒng)將會去調(diào)用完成函數(shù)PtReceiveComplete 如果傳遞給PtReceive的數(shù)據(jù)是通過NdisMXxxIndicateReceive進行指示的,那么傳遞給PtReceive的前視緩沖區(qū)的長度不會超過用OID_GEN_CURRENT_LOOKAHEAD調(diào)用NdisRequest返回的值。 如果PtReceive的調(diào)用執(zhí)行在NdisMIndicateReceivePacket之前進行,那么底層驅(qū)動程序把包數(shù)組中的一個或者多個包狀態(tài)設(shè)置為 NDIS_STATUS_RESOURCES,那么前視緩沖區(qū)的大小總是等于整個網(wǎng)絡(luò)數(shù)據(jù)包的大小。所以中間層驅(qū)動程序可以不必調(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ù)的功能是: 這是一個可選函數(shù)。 如果中間層驅(qū)動程序所基于的NIC驅(qū)動程序指示的是數(shù)據(jù)包描述符指針數(shù)組,或者調(diào)用NdisMIndicateReceivePacket函數(shù)指示接收帶外數(shù)據(jù),那么驅(qū)動程序應(yīng)該提供PtReceivePacket函數(shù)。 如果開發(fā)者不能夠確定中間層驅(qū)動程序的執(zhí)行環(huán)境,也應(yīng)該提供該函數(shù),因為在能夠產(chǎn)生多包指示的底層NIC驅(qū)動程序上,中間層驅(qū)動程序?qū)@得更好的性能。 */INTPtReceivePacket(IN NDIS_HANDLE ProtocolBindingContext,IN PNDIS_PACKET Packet)我們可以在這幾個回調(diào)函數(shù)里面來處理、過濾、分析 捕捉到的數(shù)據(jù)包。防火墻軟件一般也都是在這幾個回調(diào)函數(shù)里面進行編程。其它的回調(diào)函數(shù)的代碼,我們基本上不用去修改。NDIS Passthru的例子很多,在網(wǎng)絡(luò)上搜索一下,就有很多源代碼例子,也有很多相關(guān)的技術(shù)說明。 下面,我想重點的說明在Windows 7系統(tǒng)下,(當(dāng)然是Win7 32/64位系統(tǒng))如何做NDIS中間層驅(qū)動程序的開發(fā),代碼和之前老的Windows操作系統(tǒng)提供的Passthru例子的區(qū)別。(二)在 Windows 7系統(tǒng)上進行開發(fā)在Win7系統(tǒng)下開發(fā)驅(qū)動程序,需要數(shù)字證書,還需要驅(qū)動簽名認(rèn)證。由于Win7系統(tǒng)的內(nèi)核做了大幅度的修改,它和XP系統(tǒng)的內(nèi)核起了很大的變化,最顯著的就是剛才說的:需要簽名和證書。 還有就是:不能隨意的HOOK SSDT了。在開發(fā)NDIS驅(qū)動程序的時候,WDK開發(fā)包提供了一個新的框架,叫著NDIS FilterNDIS Filter是一個例子工程。假入我把WDK安裝在E盤,那么這個工程代碼就在:E:WinDDK7600.16385.1srcnetworkndisfilter目錄下。把這個例子工程和原來的Passthru工程代碼做比較,您會發(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; /* 版本號 */#elseunsigned char ip_v:4;unsigned char ip_hl:4; #endifunsigned char TOS; / 服務(wù)類型unsigned short TotLen; / 封包總長度,即整個IP包的長度unsigned short ID; / 封包標(biāo)識,唯一標(biāo)識發(fā)送的每一個數(shù)據(jù)報unsigned short FlagOff; / 標(biāo)志unsigned char TTL; / 生存時間,就是TTLunsigned char Protocol; / 協(xié)議,可能是TCP、UDP、ICMP等unsigned short Checksum; / 校驗和struct in_addr iaSrc; / 源IP地址struct in_addr iaDst; / 目的PI地址IP_HEADER, *PIP_HEADER;typedef struct tcp_headerunsigned short src_port; /源端口號unsigned short dst_port; /目的端口號unsigned int seq_no; /序列號unsigned int ack_no; /確認(rèn)號#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檢驗和unsigned short urgt_p; /16為緊急指針TCP_HEADER,*PTCP_HEADER;typedef struct udp_header USHORT srcport; / 源端口USHORT dstport; / 目的端口USHORT total_len; / 包括UDP報頭及UDP數(shù)據(jù)的長度(單位:字節(jié))USHORT chksum; / 校驗和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)。對象頭有三個成員:類型,大小和修改。如果頭信息是不正確的,那么調(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且不能在運行時變更的例程*/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且能在運行時變更的例程。下面這4個例程也被定義在NDIS_FILTER_PARTIAL_CHARACTERISTICS中,這個結(jié)構(gòu)指定的例程可以在運行時的FilterSetModuleOptions例程中調(diào)用NdisSetOptionHandles來改變。如果過濾驅(qū)動要在例程中修改自身的一個特性,那么必須提供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ū)動注冊給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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 孕前中醫(yī)特色護理課件
- 車輛贈與及二手車置換服務(wù)協(xié)議
- 事業(yè)單位停薪留職人員原單位知識產(chǎn)權(quán)保護協(xié)議
- 無人機測繪項目保密及責(zé)任承擔(dān)合同
- 畢業(yè)生就業(yè)實習(xí)與就業(yè)培訓(xùn)協(xié)議書
- 怎么拿八桂教學(xué)通的課件
- 黨紀(jì)處分與黨員權(quán)利義務(wù)等知識綜合測試試卷
- 杭州vr教學(xué)課件廠家
- 企業(yè)環(huán)保培訓(xùn)與能力建設(shè)計劃考核試卷
- 高原氣象站電力系統(tǒng)抗風(fēng)沙能力研究考核試卷
- 人工智能技術(shù)創(chuàng)新對產(chǎn)業(yè)高質(zhì)量發(fā)展的推動作用
- 2024年中國中高端電子鋁箔行業(yè)市場調(diào)查報告
- 2025年中國征信行業(yè)發(fā)展監(jiān)測及投資戰(zhàn)略規(guī)劃研究報告
- Unit 1 Happy Holiday 第6課時(Project Reading Plus) 2025-2026學(xué)年人教版英語八年級下冊
- 部編人教版三年級上冊語文必記必背
- 2025年中國PHA可降解塑料行業(yè)市場全景分析及前景機遇研判報告
- 《學(xué)習(xí)雷鋒精神爭主題班會》課件
- 2025江蘇省射陽中等專業(yè)學(xué)校工作人員招聘考試真題
- 河南開封工程職業(yè)學(xué)院招聘筆試真題2024
- 2025河南省豫地科技集團有限公司社會招聘169人筆試參考題庫附帶答案詳解析集合
- 開標(biāo)室使用管理制度
評論
0/150
提交評論