文件名称:基于TDI 的 TCP数据传输
文件大小:81.3MB
文件格式:ZIP
更新时间:2020-12-06 04:14:01
TDI TCP
基于TDI 的 TCP数据传输 1.上位机 上位机包括tcp和tcp.cpp 1.1 对外函数说明 HANDLE TdiTcpOpen(); TdiTcpOpen用于打开设备,成功返回有效的句柄,失败返回INVALID_HANDLE_VALUE. BOOL TdiTcpClose(HANDLE hDevice); TdiTcpClose用于关闭设备,成功返回TRUE,失败返回FALSE; hDevice为TdiTcpOpen返回的句柄 BOOL TdiTcpConnect(HANDLE hDevice,const PCHAR pIpAddres,USHORT uPort); TdiTcpConnect用于与服务器建链,pIpAddres为服务器IP地址,uPort为服务器端口地址。 hDevice为TdiTcpOpen返回的句柄 pIpAddres为IP地址,如”10.0.0.20” uPort为端口地址 BOOL TdiTcpSend(HANDLE hDevice,PVOID pBuff,ULONG nLen,PULONG pRtn); TdiTcpSend用于给服务器发送数据. hDevice为TdiTcpOpen返回的句柄 pBuff接向发送数据的指针 nLen发送数据长度 pRtn发送成功长度 BOOL TdiTcpRcv(HANDLE hDevice,PVOID pBuff,ULONG nLen,PULONG pRtn); TdiTcpRcv用于从服务器接收数据 hDevice为TdiTcpOpen返回的句柄 pBuff接收数据缓冲区 nLen接收数据缓冲区长度 pRtn实际接收数据长度指针 BOOL TdiTcpSetRcvTimeOut(HANDLE hDevice,ULONG ulSecond); TdiTcpSetRcvTimeOut用于设置接收数据超时时间,默认为3秒。 hDevice为TdiTcpOpen返回的句柄 ulSecond为超时时间 2.下位机 下位机包括D1603.h D1603.cpp和Tdifun.cpp TdiFun.h 2.1 关键数据结构 驱动与应用连接服务器结构体 typedef struct _CONNECT_STRUCT { ULONG ip; //服务器IP地址 USHORT port; //服务器端口 }CONNECT_STRUCT,*PCONNECT_STRUCT; //设备展结构体 typedef struct _DEVICE_EXTENSION { PDEVICE_OBJECT pDeviceObject; //设备指针 UNICODE_STRING wstrDeviceName ; //设备名 UNICODE_STRING wstrSymbolicLinkName;//设备链接名 }DEVICE_EXTENSION,*PDEVICE_EXTENSION; 读数据链接 typedef struct _RCV_IPR_LIST { PIRP pIrp; //指向读IPR LIST_ENTRY ListEntry; //链表 }RCV_IPR_LIST,*PRCV_IPR_LIST; 当前链接上下文 typedef struct _SOCKET_CONTEXT { HANDLE TransportAddressHandle; //传输地址句柄 FILE_OBJECT* pTrasnportAddressFile;//传输地址指针 HANDLE ConnectionHandle;//连接地址句柄 FILE_OBJECT* pConnectionFile;//连接地址指针 LIST_ENTRY RcvHead; //接收IRP链表头 KEVENT event; //接收数据同步事件 ULONG uTimeOut; // 接收数据超时 }SOCKET_CONTEXT,*PSOCKET_CONTEXT; 2.2 外函数说明 驱动装载主入口函数 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath); 驱动卸载函数 VOID D1603Unload(PDRIVER_OBJECT DriverObject); 默认IRP回调函数 NTSTATUS D1603Dispatch(PDEVICE_OBJECT DeviceObject,PIRP Irp); TdiTcpOpen对应的IPR函数 NTSTATUS D1603Create(PDEVICE_OBJECT DeviceObject,PIRP Irp); 创建当设备上下文并初始化 TdiTcpClose应对的回调函数 NTSTATUS D1603Close(PDEVICE_OBJECT DeviceObject,PIRP Irp); 释放当前设备上下文 TdiTcpSend对应的回调函数 NTSTATUS D1603Read(PDEVICE_OBJECT DeviceObject,PIRP Irp); TdiTcpRcv对应的回调函数 NTSTATUS D1603Write(PDEVICE_OBJECT DeviceObject,PIRP Irp); 清除退出对应的回调函数 NTSTATUS CleanUp(PDEVICE_OBJECT DeviceObject,PIRP Irp); 设置接收数据超时和与服务器建接函数对应的回调函数 NTSTATUS D1603DeviceIoControl(PDEVICE_OBJECT DeviceObject,PIRP Irp); 打开传输地址 NTSTATUS OpenTransportAddress(PHANDLE pTdiHandle,PFILE_OBJECT *pFileObject); 打开连接地址 NTSTATUS OpenConnection(PHANDLE pTdiHandle, PFILE_OBJECT *pFileObject); 关链传输地址和连接地址 NTSTATUS AssociateTransportAndConnection(HANDLE hTransportAddress, PFILE_OBJECT pfoConnection); 与服务器建链 NTSTATUS ConnectServer(PFILE_OBJECT pfoConnection, ULONG uiAddress, USHORT uiPort) ; 发送数据 NTSTATUS SendData(PFILE_OBJECT pfoConnection, PVOID pData,ULONG uiSendLength, ULONG *pDataSent); 设置系统事件,只注册了接收数据事件 NTSTATUS SetEventHandler(PFILE_OBJECT pfoTdiFileObject,LONG InEventType, PVOID InEventHandler, PVOID InEventContext); 接收数据回调函数 NTSTATUS ClientEventReceive(PVOID TdiEventContext, CONNECTION_CONTEXT ConnectionContext, ULONG ReceiveFlags, ULONG BytesIndicated, ULONG BytesAvailable, ULONG *BytesTaken, PVOID Tsdu, PIRP *IoRequestPacket); 断开与服务器建的链 NTSTATUS DisconnectServer(PFILE_OBJECT pfoConnection); 断开传输与连接地址 NTSTATUS DisAssociateTransportAndConnection(PFILE_OBJECT pfoConnection); 关闭句柄 NTSTATUS CloseTdiOpenHandle(HANDLE hTdiHandle, PFILE_OBJECT pfoTdiFileObject);