首页
社区
课程
招聘
7
[原创]使用TDI与WinSock进行客户端服务器编程
发表于: 2010-12-24 18:47 12886

[原创]使用TDI与WinSock进行客户端服务器编程

2010-12-24 18:47
12886

题目:使用TDI与WinSock进行客户端服务器编程


日期:2010年12月24日


作者:Cryin' (

)



简介:



在本文中,您将了解到使用传输驱动程序接口TDI与应用层套接字WinSock客户端服务器应用程序内核级编程实现细节。介绍常用的TDI函数并提供编写TDI与WinSock(TCP)应用程序的详细说明。最后还提供了源代码以演示编写程序的步骤。



开始之前:



在开始学习本文内容之前,假设读者以具备以下基础:


        • Windows 内核级编程的知识和经验


        • 网络编程概念及应用层Socket编程经验


        • 了解并安装有Microsoft DDK



WinSock(服务器):



应用层套接字编程流程比较简单,这里简单介绍:


        • 加载套接字库并创建Socket(socket())


        • 绑定套接字到指定端口和IP(bind())


        • 设置套接字进行监听以等待连接请求(listen())


        • 接受连接请求(accept())


        • 发送或接收信息(send()/recv())


        • 关闭套接字(closesocket())         



TDI(客户端):



TDI 定义在传输协议栈中较高级别公开的内核模式网络接口,如下图:



图:传输协议栈


TDI应用程序可以分为两种类型,与基于Socket的应用程序类似:


        • 面向连接(使用TCP协议,通信可靠)


        • 面向误连接(使用UDP协议,通信不可靠)



常用TDI函数:



这里讨论一些比较常用的TDI,以便实现基于传输驱动程序接口TDI与WinSock客户端服务器编程。



打开TDI设备:



VOID  InitializeObjectAttributes(


    OUT POBJECT_ATTRIBUTES  InitializedAttributes,


    IN PUNICODE_STRING  ObjectName,


    IN ULONG  Attributes,


    IN HANDLE  RootDirectory,


    IN PSECURITY_DESCRIPTOR  SecurityDescriptor


        );


所附带的参数:


InitializedAttributes


        要初始化的OBJECT_ATTRIBUTES结构的指针


ObjectName


        Unicode 设备名称,对于无连接的情况为 device\UDP,对于本文是面向连接的通信,则为 device\TCP。此 ObjectName必须为 Unicode 字符串。该 Unicode 字符串可以使用 RtlInitUnicodeString 库调用进行初始化。


Attributes


        只需填写为OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE即可


RootDirectory


        此处为NULL


SecurityDescriptor


        设置安全描述符。由于笔者总是打开内核句柄,所以很少设置这个参数


       


        接下来需要打开本地传输地址的文件对象,客户端应用程序必须调用ZwCreateFile函数并在扩展属性中传递此地址。当ZwCreateFile成功调用时,将返回传输文件(表示连接端点)的句柄。客户端必须调用ObReferenceObjectByHandle函数,该函数将返回相应的传输文件对象。该传输文件对象将用于向远程服务端发送数据或接收数据。此外客户端必须事件处理例程以接收各种网络事件,如接收数据、断开连接、错误等。


NTSTATUS ObReferenceObjectByHandle(


    IN HANDLE  Handle,


    IN ACCESS_MASK  DesiredAccess,


    IN POBJECT_TYPE  ObjectType  OPTIONAL,


    IN KPROCESSOR_MODE  AccessMode,


    OUT PVOID  *Object,


    OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL


        );


所附带的参数:


Handle


        为对象指定一个打开句柄。此句柄由 ZwCreateFile 返回。


DesiredAccess


        指定所请求的对象访问权限类型。此字段的解释取决于对象类型。


ObjectType


        指向对象类型的指针。可以为 *IoFileObjectType 或 *ExEventObjectType。如果         AccessMode 为 KernelMode,此参数可以为 NULL。


AccessMode


        指定要为访问检查使用的访问模式。必须为 UserMode 或 KernelMode。对于底层驱动        程序,应指定 KernelMode。


Object


        指向接收对象指针的变量。


HandleInformation


        驱动程序会将此参数设置为 NULL。


       


VOID KeInitializeEvent(


    IN PRKEVENT  Event,


    IN EVENT_TYPE  Type,


    IN BOOLEAN  State


        );


所附带的参数:


Event


        指向事件对象地址的指针


Type


        事件类型,NotificationEvent 或者SynchronizationEvent


State


        事件初始化信号状态


       


IoSetCompletionRoutine函数将向基础驱动程序注册回调函数,以在链中底层驱动程序完成了对 IRP 的请求时进行调用。将在 IRP 完成(成功或失败)和取消 IRP 请求时调用回调例程。


VOID IoSetCompletionRoutine(


    IN PIRP  Irp,


    IN PIO_COMPLETION_ROUTINE  CompletionRoutine,


    IN PVOID  Context,


    IN BOOLEAN    InvokeOnSuccess,


    IN BOOLEAN  InvokeOnError,


    IN BOOLEAN  InvokeOnCancel


        );


所附带的参数:


Irp


        指向驱动程序希望跟踪的 IRP 的指针


CompletionRoutine



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

上传的附件:
收藏
免费 7
支持
分享
赞赏记录
参与人
雪币
留言
时间
Youlor
为你点赞~
2024-5-31 05:06
伟叔叔
为你点赞~
2024-3-8 00:19
心游尘世外
为你点赞~
2024-1-21 01:03
QinBeast
为你点赞~
2024-1-20 04:50
shinratensei
为你点赞~
2024-1-16 00:10
飘零丶
为你点赞~
2024-1-14 04:27
PLEBFE
为你点赞~
2023-3-14 01:50
最新回复 (2)
雪    币: 312
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
抢个头版!
楼主又是一头大牛!
2010-12-24 21:13
0
雪    币: 221
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不是很了解,不过很感兴趣!
2010-12-24 23:25
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册