-
-
[求助]tdi过滤驱动怎设置回调例程获取本地IP和端口呢?
-
发表于:
2010-4-9 18:41
9055
-
[求助]tdi过滤驱动怎设置回调例程获取本地IP和端口呢?
不太理解这个回调例程呢?
下面是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直播授课