首页 > 编程知识 正文

通信网络的主要作用是(移为通信)

时间:2023-05-05 00:08:09 阅读:74348 作者:2257

在许多情况下,一些用户需要与底层驱动程序进行交互,因此他们需要找到能够使APP应用程序和驱动程序有效通信的体系结构。 Microsoft Windows系列操作系统通过发送I/o请求包(IRP )与驱动程序进行通信。 因此今天,我将向您介绍Windows如何使用设备iocontrol和IRP在用户层和密钥层之间交换数据。

首先,为了比较完整地介绍这一部分,让我们来看看一些准备。 要访问底层驱动程序,必须首先获得该驱动程序可以访问的句柄(Handle )。 这里使用了函数CreateFile。

handle create file (lpctstr lpfilename,//文件名DWORD dwDesiredAccess,//访问方式DWORD dwShareMode, //共享模式LP security _ attributeslpsecurity ) attributes//nulldworddwcreationdisposition,//创建方法DWORD dwFlagsAndAttributes 然后,我将简要介绍IOCTL。 IOCTL通常用于驱动与APP交流,而不仅仅是读写数据。 在更多情况下,驱动程序定义了几列IOCTL和数据结构以满足通信需求。 简单来说,用户级别中与IOCIL相关的信息可以视为Windows信息,通知驱动程序用户完成某些预定义的请求。 然后,一个IOCTL. IOCTL是小于32的数字,前两位的一个传输类型(METHOD_OUT_DIRECT,METHOD_IN_DIRECT,method _ bufferedormethod 定义用于查询MiniPort版本号(5.1、6.0、6.20 ) win7的IOCTL。

# define _ ndis _ control _ code (请求,方法) CTL_code ) file_device_physical_netcard,请求, request FILE_ANY_ACCESS ) # define ioctl _ filter _ query _ driver _ version _ ndis _ control _ code (18,方法这些数据(包括ioctl代码等)必须通过函数DeviceIoControl传递给基本驱动程序。 想更详细地了解的人请看看IRP。 这是因为底层驱动程序从IRP数据结构中找到用户预定义的数据,并通过驱动程序时间表运行,从而完成用户请求。

/* * rturnsndisversionofthecurrentdriveruses @ return-true-success,false-failure */boolfilterwrapper 3360360 query pers Dword字节写入=0; //allocatenewbuffertostoremacinfodwordversionlengthbuffer=(dword ) sizeof(ushort ); versionfobuffer=new byte [ versionlengthbuffer ]; if (versionfobuffer==null ({ goto exit; //passanewiocontroltounderlyingdrivertocreateanewmacif (! dvice iocontrol (m _ h滤波器,ioctl _ filter _ query _ driver _ version,' requestfromusermodetogerndisversion. n n ) )、versionfoBuffer、versionLengthBuffer、bytesWritten、NULL ) )。 goto Exit; } printf (successfyllygetndisversion! 与版本信息

:n"); if(!ParseVersionBuffer(versionfoBuffer, bytesWritten)) goto Exit; result = TRUE;Exit: delete[] versionfoBuffer; return result;;}

 接下来,我们看看底层驱动是如何调度执行的。刚才说过了,所有的数据都会保存在一个叫做IRP的数据结构里,并且完成状态也是保存在IRP结构中。

NTSTATUSFilterDeviceIoControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ){PIO_STACK_LOCATION IrpSp; NTSTATUS Status = STATUS_SUCCESS; PFILTER_DEVICE_EXTENSION FilterDeviceExtension; PUCHAR InputBuffer; PUCHAR OutputBuffer; ULONG InputBufferLength, OutputBufferLength; PLIST_ENTRY Link; PUCHAR pInfo; ULONG InfoLength = 0; PMS_FILTER pFilter = NULL; UINT iCnt = 0, iPCnt = 0; PUCHAR temp;//Following variables are add by leyond NDIS_OID Oid; USHORT VersionBuffer = 0;//USHORT for getting versionULONG MethodId = 0;ULONG BytesProcessed = 0; UNREFERENCED_PARAMETER(DeviceObject); DEBUGP(DL_TEST,("==>Filter IO Control dispatchn")); IrpSp = IoGetCurrentIrpStackLocation(Irp); if (IrpSp->FileObject == NULL) { return(STATUS_UNSUCCESSFUL); } FilterDeviceExtension = (PFILTER_DEVICE_EXTENSION)NdisGetDeviceReservedExtension(DeviceObject); ASSERT(FilterDeviceExtension->Signature == 'FTDR'); Irp->IoStatus.Information = 0; switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) {case IOCTL_FILTER_QUERY_DRIVER_VERSION://get ndsi version InputBuffer = OutputBuffer = (PUCHAR)Irp->AssociatedIrp.SystemBuffer; InputBufferLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength; OutputBufferLength = IrpSp->Parameters.DeviceIoControl.OutputBufferLength;//pInfo = OutputBuffer;DEBUGP(DL_TEST,("The input length is %u, and inputdata is %s ",InputBufferLength,InputBuffer)); InfoLength = sizeof(USHORT);NdisZeroMemory(OutputBuffer, OutputBufferLength); Link = FilterModuleList.Flink; pFilter = CONTAINING_RECORD(Link, MS_FILTER, FilterModuleLink);/*Check Version */ Oid = OID_GEN_DRIVER_VERSION; Status = filterDoInternalRequest(pFilter, NdisRequestQueryInformation, Oid, &VersionBuffer, sizeof(VersionBuffer), sizeof(VersionBuffer), MethodId, &BytesProcessed); if(Status == NDIS_STATUS_SUCCESS){ DEBUGP(DL_TEST,("Get Ndis Version successfully!n")); VersionHighByte = (VersionBuffer & 0xFF00) >> 8; VersionLowByte = (VersionBuffer & 0x00FF); DEBUGP(DL_TEST,("Ndis version:High %d, and Low: %dn",VersionHighByte,VersionLowByte)); if(InfoLength <= OutputBufferLength) { temp = OutputBuffer; *(PUSHORT)OutputBuffer += VersionBuffer;OutputBuffer += sizeof(USHORT);OutputBuffer = temp; }else { Status = STATUS_BUFFER_TOO_SMALL; }Irp->IoStatus.Information = InfoLength;}else{ DEBUGP(DL_TEST,("Get Version Failn")); }break; default: break; } Irp->IoStatus.Status = Status; Irp->IoStatus.Information = InfoLength; IoCompleteRequest(Irp, IO_NO_INCREMENT); DEBUGP(DL_TEST,("Filter IO Control dispatch<====n")); return Status; }

 总会调用IoCompleteRequest来结束IRP,返回执行结果给用户。

大概就是这样一个简单的介绍~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。