阅读:1518回复:4
蓝屏!大家帮我看看!
这是一个MpSendPackets()调用的函数用来修改数据包,但是执行到NdisMoveMemory()系统就蓝屏!提示DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)!
BOOLEAN TransOut(PUCHAR pcontent) { PIP_Header pIPHeader = (PIP_Header)(pcontent+14); NDIS_STATUS Status; NDIS_PHYSICAL_ADDRESS phyaddr = {-1}; PVOID checkbuff = NULL; //pIPHeader->ip_saddr = RtlUlongByteSwap(192.168.1.101); PSD_Header psdhdr; unsigned short iphdrlen = (pIPHeader->ip_verlen & 0x0f) * sizeof(ULONG); Status = NdisAllocateMemory((PVOID)&checkbuff, 2014, 0, phyaddr); if (NDIS_STATUS_SUCCESS != Status) return FALSE; NdisZeroMemory(checkbuff, 2014); if(pIPHeader->ip_protocol == 6) { PTCP_Header pTCPHeader; USHORT tcphdrlen; pTCPHeader = (PTCP_Header)(pcontent+14+iphdrlen); //tcphdrlen = ((pTCPHeader->dataoffset & 0xf0) >> 4) * sizeof(ULONG); tcphdrlen = k_htons(pIPHeader->ip_totallength) - iphdrlen; //为修改check做准备 //修改源地址和校验和 //pIPHeader->ip_saddr = k_htonl(19); pIPHeader->ip_checksum = 0; pTCPHeader->tcp_checksum = 0; //填充TCP伪首部 psdhdr.saddr = pIPHeader->ip_saddr; psdhdr.daddr = pIPHeader->ip_daddr; psdhdr.len = k_htons(tcphdrlen); psdhdr.mbz = 0; psdhdr.protc = 6; //计算TCP首部校验和 NdisMoveMemory((UCHAR*)checkbuff,&psdhdr,sizeof(psdhdr)); NdisMoveMemory((UCHAR*)checkbuff+sizeof(psdhdr),pTCPHeader,tcphdrlen); pTCPHeader->tcp_checksum = checksum((USHORT *)checkbuff,sizeof(psdhdr)+tcphdrlen); //计算IP首部校验和 pIPHeader->ip_checksum = checksum((USHORT *)pIPHeader,iphdrlen); NdisFreeMemory(checkbuff, 2014, 0); return TRUE; } else if(pIPHeader->ip_protocol == 17) { PUDP_Header pUDPHeader; USHORT udplen; pUDPHeader = (PUDP_Header)(pcontent+14+iphdrlen); udplen = k_htons(pUDPHeader->udp_len); //为修改check做准备 //修改源地址校验和 //pIPHeader->ip_saddr = benji; pIPHeader->ip_checksum = 0; pUDPHeader->udp_checksum = 0; //填充UDP伪首部 psdhdr.saddr = pIPHeader->ip_saddr; psdhdr.daddr = pIPHeader->ip_daddr; psdhdr.len = pUDPHeader->udp_len; psdhdr.mbz = 0; psdhdr.protc = 17; //计算UDP校验和,包括所有UDP数据 NdisMoveMemory((UCHAR*)checkbuff,&psdhdr,sizeof(psdhdr)); NdisMoveMemory((UCHAR*)checkbuff+sizeof(psdhdr),pUDPHeader,udplen); pUDPHeader->udp_checksum = checksum((USHORT *)checkbuff,sizeof(psdhdr)+udplen); //计算IP首部校验和 pIPHeader->ip_checksum = checksum((USHORT *)pIPHeader,iphdrlen); NdisFreeMemory(checkbuff, 2014, 0); return TRUE; } else NdisFreeMemory(checkbuff, 2014, 0); return FALSE; } |
|
|
沙发#
发布于:2007-05-31 14:19
不知道该怎么改!
|
|
|
板凳#
发布于:2007-05-31 14:32
用户被禁言,该主题自动屏蔽! |
|
地板#
发布于:2007-05-31 14:58
没有过期!
|
|
|
地下室#
发布于:2007-05-31 21:36
解决了!函数放的地方不对!
|
|
|