TDI 编程--kernel socket 源码---DrvMain.cpp

本文介绍了一个Windows驱动程序的初始化过程及卸载流程。在初始化过程中,通过创建设备对象并设置相应的I/O请求包(IRP)处理例程来完成设备的注册;而在卸载流程中,则会删除符号链接及设备对象。

#include "KernelHeader.h"
#include "DrvMain.h"
#include "function.h"

 

#include "NetDrv.h"

 

extern "C"
{
VOID TDIFunLib_DriverUnload(PDRIVER_OBJECT  DriverObject);
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING  pRegistryPath);

}


#pragma alloc_text( INIT, DriverEntry )
#pragma alloc_text( PAGE, TDIFunLib_DriverUnload)

 

/**********************************************************
 *
 * Fun: DriverEntry
 *
 *
 **********************************************************/

NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING  pRegistryPath)
{
 NTSTATUS NtStatus = STATUS_SUCCESS; 
 UNICODE_STRING usDriverName = {0};
 UNICODE_STRING usSymbolicLinkName = {0};
 PDEVICE_OBJECT pControlDeviceObject = NULL;
 UINT uiIndex = 0;

 RtlInitUnicodeString( &usDriverName, TDIFunLib_DEVICE_NAME);
 RtlInitUnicodeString( &usSymbolicLinkName, TDIFunLib_DOSDEVICE_NAME);
 

 /*
  * Create Named Control Device Object
  */

 NtStatus = IoCreateDevice( DriverObject, sizeof(TDIFunLib_DEVICE_EXTENSION), &usDriverName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN,FALSE, &pControlDeviceObject);
 if ( NtStatus != STATUS_SUCCESS ) 
 {
  return NtStatus ;
 }

 /*
  * Assign Dispatch Routine
  */
  
 for (uiIndex=0; uiIndex < IRP_MJ_MAXIMUM_FUNCTION; uiIndex++)
 {
  DriverObject->MajorFunction[uiIndex] = TDIFunLib_CommonDispatch;
 }
 
 DriverObject->MajorFunction[ IRP_MJ_CREATE ] = TDIFunLib_CreateDispatch;
 DriverObject->MajorFunction[ IRP_MJ_READ ]  = TDIFunLib_ReadDispatch;
 DriverObject->MajorFunction[ IRP_MJ_WRITE ]  = TDIFunLib_WriteDispatch;
 DriverObject->MajorFunction[ IRP_MJ_CLEANUP ] = TDIFunLib_CleanUpDispatch;
 DriverObject->MajorFunction[ IRP_MJ_CLOSE ]  = TDIFunLib_CloseDispatch;
 DriverObject->MajorFunction[ IRP_MJ_DEVICE_CONTROL ] = TDIFunLib_IoControlDispatch;
 DriverObject->MajorFunction[ IRP_MJ_INTERNAL_DEVICE_CONTROL ] = TDIFunLib_IoControlInternal;
 
 /*
  * If this Fun is missing, Driver can't be dynamically Unloaded.
  */

 DriverObject->DriverUnload = TDIFunLib_DriverUnload;
 

 /*
  * Set Flag On ControlDeviceObject to determin type of IO.  IO Manager Copy Data from Databuffer
  * given by user-mode app to sysBuffer On behalf of driver.
  */

 pControlDeviceObject->Flags |= DO_BUFFERED_IO;
 

 /*
  * Driver  Iniitalizing OK !!
  */

 pControlDeviceObject->Flags &= (~DO_DEVICE_INITIALIZING);
 

 /*
  * Create symbolicLink to ControlDeviceObject
  */
 
 IoCreateSymbolicLink(&usSymbolicLinkName, &usDriverName); 

 

 return NtStatus;
}

 

/**********************************************************
 *
 * Fun: TDIFunLib_DriverUnload
 *
 *
 **********************************************************/

VOID TDIFunLib_DriverUnload(PDRIVER_OBJECT  DriverObject)
{
 UNICODE_STRING usSymbolicLinkName;


 /*
  * Delete SymbolicLinkName
  */

 RtlInitUnicodeString( &usSymbolicLinkName, TDIFunLib_DOSDEVICE_NAME );

 IoDeleteSymbolicLink( &usSymbolicLinkName );


 /*
  * Delete DeviceObject
  */
 
  IoDeleteDevice( DriverObject->DeviceObject );
 
 
  /*
   *
   * Release Other resouces
   *
   */

 

基于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.cppTdifun.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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blue_Dream_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值