首页
社区
课程
招聘
[求助]tdi过滤驱动怎设置回调例程获取本地IP和端口呢?
发表于: 2010-4-9 18:41 9055

[求助]tdi过滤驱动怎设置回调例程获取本地IP和端口呢?

2010-4-9 18:41
9055
不太理解这个回调例程呢?
下面是IRP_MJ_CREATE的分发例程:
NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObject, PIRP pIrp)
{
	
	if(pDevObject == tcpfltobj)
	{
		PFILE_FULL_EA_INFORMATION ea;
		COMPLETION completion;
		memset(&completion, 0, sizeof(COMPLETION));
		ea = (PFILE_FULL_EA_INFORMATION)pIrp->AssociatedIrp.SystemBuffer;
		if(ea != NULL)
		{
			if(	ea->EaNameLength == TDI_TRANSPORT_ADDRESS_LENGTH&&
				memcmp(ea->EaName,TdiTransportAddress,TDI_TRANSPORT_ADDRESS_LENGTH)==0)
			{
				//这里解析得到本地IP和端口
				KdPrint(("Get Local\n"));
				//得到进程 本地IP 端口
				tdi_create(pIrp,&completion);
			}
			else if(ea->EaNameLength == TDI_CONNECTION_CONTEXT_LENGTH&&
				    memcmp(ea->EaName,TdiConnectionContext,TDI_CONNECTION_CONTEXT_LENGTH) == 0)
			{
				//这里解析远程IP 和端口
				KdPrint(("Get Remote\n"));
			}
			
		}
		IoSkipCurrentIrpStackLocation (pIrp);
		return IoCallDriver( tcpoldobj, pIrp ); 
	}
	return STATUS_SUCCESS;
}

下面是tdi_create
VOID tdi_create(PIRP irp,COMPLETION* completion)
{
	/*进程信息*/
	ULONG pid;
	CHAR name[126]={0};
	CHAR path[256]={0};
	/*获取地址*/
	/*创建查询IRP*/
	PIRP query_irp;
	GetCurrentProcess(&pid, name, path);
	query_irp = TdiBuildInternalDeviceControlIrp(	TDI_QUERY_INFORMATION,
													tcpoldobj, 
													irps->FileObject, 
													NULL, 
													NULL);
	if (query_irp == NULL) 
	{
		KdPrint(("[tdi_fw] tdi_create: TdiBuildInternalDeviceControlIrp\n"));
		return ;
	}
	/*设置completion*/
	completion->routine = tdi_create_addrobj_complete;      //生成请求的完成函数
	completion->context = query_irp;
	/*设置回调例程*/
	IoSetCompletionRoutine(irp,completion->routine,completion->context, TRUE, TRUE, TRUE);

	/*打印信息*/
	KdPrint(("pid:%d\n",pid));
	KdPrint(("name:%s\n",name));
	KdPrint(("path:%s\n",path));

}

下面是设置的生成请求后的完成函数
NTSTATUS tdi_create_addrobj_complete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
{
	//发送查询query_irp
	KdPrint(("CallBack\n"));
	return STATUS_SUCCESS;
}

以上全是我根据寒江独钓的理解,自己尝试的。如何获取这个本地IP和端口呢?按我这样写,这个完成函数没得到执行  那位大哥做过或者了解,麻烦您帮助下。
我想做的就是得到如下信息;
PID 名字 路径 本地IP 端口 远程IP 端口

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
如何取得本地IP 端口 远程IP 端口呢
2010-4-9 18:42
0
雪    币: 127
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
错误和异常检查自己慢慢做吧,这里给出思路代码

NTSTATUS tdi_create_addrobj_complete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
{
PBYTE pBuffer = (PBYTE)(Irp->AssociatedIrp.SystemBuffer);
PFILE_FULL_EA_INFORMATION pFullEaInfomation = (PFILE_FULL_EA_INFORMATION)pBuffer;
UCHAR EaNameLength = pFullEaInfomation->EaNameLength;
PVOID pAddress = (PVOID)(pFullEaInfomation->EaName + EaNameLength + 1);//这是地址
ULONG uAddress;
USHORT uPort;

uAddress = GetIPFormTransportAddr(pAddress);
uPort = GetPortFormTransportAddr(pAddress);
return STATUS_SUCCESS;
}

ULONG GetIPFormTransportAddr(PVOID pAddress)
{
PTA_IP_ADDRESS pTA_IP_Address = (PTA_IP_ADDRESS)pAddress;
ULONG uIPAddress = pTA_IP_Address->Address[0].Address[0].in_addr;

return uIPAddress;
}

USHORT GetPortFormTransportAddr(PVOID pAddress)
{
PTA_IP_ADDRESS pTA_IP_Address = (PTA_IP_ADDRESS)pAddress;
USHORT uPort = pTA_IP_Address->Address[0].Address[0].sin_port;

uPort = my_ntohs(uPort);

return uPort;
}

USHORT my_ntohs(USHORT uPort)
{
USHORT a = (uPort << 8) & 0xFF00;
USHORT b = (uPort >> 8) & 0x00FF;

return (a | b);
}
2010-6-19 00:14
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
多谢了
2010-6-19 13:22
0
雪    币: 12
活跃值: (142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主,请问你最终实现了吗?
2017-12-12 16:45
0
游客
登录 | 注册 方可回帖
返回
//