日期:2014-05-17 浏览次数:21008 次
在Win8系统下开发驱动程序,需要数字证书,还需要驱动签名认证。不能像XP下面那样疯狂滴耍流氓了。
由于Win8系统的内核做了大幅度的修改,它和XP系统的内核起了很大的变化,最显著的就是刚才说的:需要签名和证书。 还有就是:不能随意的HOOK SSDT了。
在开发NDIS驱动程序的时候,WDK开发包提供了一个新的框架,叫着NDIS Filter
NDIS Filter是一个例子工程。
假入我把WDK安装在E盘,那么这个工程代码就在:
C:\WinDDK\8600.16385.1\src\network\ndis\filter目录下。
把这个例子工程和原来的Passthru工程代码做比较,您会发现,原来需要导出来的2种类型的回调函数MiniportXXX和ProtocolXXX 在新的框架里面被全部隐藏起来了。
微软提供了新的函数。 一起来看看,微软提供了什么。
在这里,为了方便分析, 我把函数代码都做了功能注释,请大家一起看看。
代码如下:
#pragma NDIS_INIT_FUNCTION(DriverEntry) #define LITTLE_ENDIAN (1) // // Global variables // NDIS_HANDLE FilterDriverHandle; // NDIS handle for filter driver NDIS_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_ENDIAN unsigned char ip_hl:4; /* 头长度 */ unsigned char ip_v:4; /* 版本号 */ #else unsigned char ip_v:4; unsigned char ip_hl:4; #endif unsigned char TOS; // 服务类型 unsigned short TotLen; // 封包总长度,即整个IP包的长度 unsigned short ID; // 封包标识,唯一标识发送的每一个数据报 unsigned short FlagOff; // 标志 unsigned char TTL; // 生存时间,就是TTL unsigned char Protocol; // 协议,可能是TCP、UDP、ICMP等 unsigned short Checksum; // 校验和 struct in_addr iaSrc; // 源IP地址 struct in_addr iaDst; // 目的PI地址 }IP_HEADER, *PIP_HEADER; typedef struct tcp_header { unsigned short src_port; //源端口号 unsigned short dst_port; //目的端口号 unsigned int seq_no; //序列号 unsigned int ack_no; //确认号 #if LITTLE_ENDIAN unsigned char reserved_1:4; //保留6位中的4位首部长度 unsigned char thl:4; //tcp头部长度 unsigned char flag:6; //6位标志 unsigned char reseverd_2:2; //保留6位中的2位 #else unsigned char thl:4; //tcp头部长度 unsigned char reserved_1:4; //保留6位中的4位首部长度 unsigned char reseverd_2:2; //保留6位中的2位 unsigned char flag:6; //6位标志 #endif unsigned 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数据的长度(单位:字节) USHORT chksum; // 校验和 }UDP_HEADER,*PUDP_HEADER; #pragma push() #define IP_OFFSET 0x0E //IP 协议类型 #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 ] << 8) & 0xFF00) | (pBuffer[ 1 ] & 0x00FF); return( nResult ); } /*UTIL_ntohs把网络字节顺序转换成主机字节顺序*/ USHORT UTIL_ntohs( USHORT netshort ) { return( UTIL_htons( netshort ) ); } NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { NDIS_STATUS Status; NDIS_FILTER_DRIVER_CHARACTERISTICS FChars; NDIS_STRING ServiceName; NDIS_STRING UniqueName; NDIS_STRING FriendlyName; BOOLEAN