站长工具网站备案百度网址收录入口

diannao/2026/1/23 11:12:18/文章来源:
站长工具网站备案,百度网址收录入口,电商支付网站建设费进什么科目,买衣服app排行榜前十名http://blog.csdn.net/charlesprince/article/details/5924376 TDI FILTER 过滤驱动的功能一般用来进行整个系统中的所有网络流量的分析#xff0c;记录和管理#xff0c;可以实现非常强大的管理功能#xff0c;这里就将讨论它的设计架构#xff0c;和具体实现的方法。  … http://blog.csdn.net/charlesprince/article/details/5924376   TDI FILTER 过滤驱动的功能一般用来进行整个系统中的所有网络流量的分析记录和管理可以实现非常强大的管理功能这里就将讨论它的设计架构和具体实现的方法。  进行系统级网络数据包的过滤很明显第一步需要在系统内核中截取到网络数据包那么在WINDOWS平台下应该如何实现这样的功能   在WINDOWS内核中数据的通信载体是IRP包如果希望截取到IRP数据包当然必须生成核模块以驱动的方式加载至内核之中。如果只是需要用来进行IRP数据包的截取进而进行数据的分析及下一步工作的控制。比较合适的方式就是使用TDI FILTER驱动的方式。 它在内核中的结构如图所示TDI FILTER ( 你的DRIVER ) TDI DRIVER ( AFD.SYS ) 附加至TDI设备的方法   在DriverEntry时生成两个设备将其附加至(Attach)至Tdi驱动的Udp和Tcp设备实现IRP包过滤功能具体代码如下 #define UDP_DEVICE_NAME   L//Device//Udp #define TCP_DEVICE_NAME   L//Device//Tcp #define TDI_FILTER_DEVICE_NAME   L//Device//TdiFiltertypedef struct __TDI_FILTER_DEVICE_EXTENSION {//过滤设备至少需要记录下真正Tdi网络设备的指针来调用真正的TDI设备功能。PDEVICE_OBJECT pTdiDeviceObject; } TDI_FILTER_DEVICE_EXTENSION, *PTDI_FILTER_DEVICE_EXTENSION;DriverEntry( PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath ) {UNICODE_STRING TdiDeviceName;......RtlInitUnicodeString( ( PUNICODE_STRING )TdiDeviceName, UDP_DEVICE_NAME );ntStatus IoCreateDevice( DriverObject, sizeof( TDI_FILTER_DEVICE_EXTENSION ), //指定设备扩展长度NULL, FILE_DEVICE_NETWORK, //网络类型设备0, 0, DeviceObject ); //生成一个无名、网络类型设备附加至TDI TCP/UDP设备实现过滤功能。if( NT_SUCCESS( ntStatus ) ){DeviceObject-Flags | DO_DIRECT_IO; //生成新的页表将同样的用户内存空间映射至系统虚拟内存空间来进行通信ntStatus IoAttachDevice( DeviceObject, TdiDeviceName, ( PDEVICE_OBJECT* )DeviceObject-DeviceExtension //附加至的设备的指针将会输出至此参数中这样就将真正的TDI设备的指针记录在过滤设备的扩展中); } }   TDI驱动的组织结构分为两个部分 1.庞大的INTERNAL IO CONTROL子功能包括以下功能   TDI_ASSOCIATE_ADDRESS 可以通过它截取出自己和对端的套接字信息一般就是IP地址端口号可以在此IRP功能响应中进行套接字信息的记录。   TDI_DISASSOCIATE_ADDRESS 它的IRP包是在closesocket函数时发生的所以如果我们在     TDI_ASSOCIATE_ADDRESS中记录了信息需要在此IRP的功能响应中取消之前的记录。   TDI_CONNECT主动连接   TDI_LISTEN   TDI_ACCEPT   TDI_DISCONNECT   TDI_SEND 它的IRP包是在调用send函数时发生的必然对它的响应将会实现对基于TCP协议的网络上传流量的截取。   TDI_RECEIVE 它的IRP包是在调用recv函数时发生的必然对它的响应将会实现对基于TCP协议的网络下载流量的截取。   TDI_SEND_DATAGRAM 它的IRP包是在调用sendto函数时发生的必然对它的响应将会实现对基于UDP协议的网络上传流量的截取。   TDI_RECEIVE_DATAGRAM 它的IRP包是在调用recvfrom函数时发生的必然对它的响应将会实现对基于UDP协议的网络下载流量的截取。   TDI_SET_EVENT_HANDLER 它的IRP包是在TDI驱动中注册一些回调用函数当接收到数据包时将会首先执行它们它的具体功能将会在下一步讲述。   TDI_QUERY_INFORMATION   TDI_SET_INFORMATION   TDI_ACTION   TDI_DIRECT_SEND   TDI_DIRECT_SEND_DATAGRAM 在TDI_SET_EVENT_HANDLER子功能中可以注册以下回调涵数   TDI_EVENT_CONNECT被动连接   TDI_EVENT_DISCONNECT   TDI_EVENT_ERROR   TDI_EVENT_RECEIVE 对应于recv函数有返回数据时将会调用此回调函数。   TDI_EVENT_RECEIVE_DATAGRAM 对应于recvfrom函数接收到数据时将会调用此回调函数。   TDI_EVENT_RECEIVE_EXPEDITED 对应于函数接收到带外数据时将会调用此回调函数。( 带外数也就是OOB数据, 在全部IRP数据包中会优先进行发送或接收TCP协议功能 )   TDI_EVENT_SEND_POSSIBLE   以下将讲述数据具体传输回调功能的过滤方法 4.实现事件回调函数挂钩的方法   响应IRP_MJ_INTERNAL_DEVICE_CONTROL中的TDI_SET_EVENT_HANDLER子功能记录下原始的注册事件回调函数和参数但真正注册的是自己的回调函数来截取所有的事件回调函数调用实现过滤功能。 具体代码如下 typedef struct __TDI_EVENT_CONTEXT_WRAP {DWORD dwEventContextMark; //对自己生成的结构实例加一个四字节的标志可以不使用。DWORD dwEventType; //记录事件回调函数的类型PVOID pOrgEventHandler; //记录原始的事件回调函数PVOID pOrgEventContext; //记录原始的事件回调函数参数PFILE_OBJECT pAssocAddr; //记录事件回调函数所绑定的本机套接字PDEVICE_OBJEXT pDeviceObjext; //记录注册事件IRP所发送至的TDI设备 } TDI_EVENT_HANDLER_WRAP, *PTDI_EVENT_HANDLER_WRAP;typedef struct __TDI_EVENT_HANDLER_LINK {LIST_ENTRY List; //将事件回调钩子记录以链表形式进行管理PTDI_EVENT_HANDLER_WRAP pTdiEventHandlerWrap; } TDI_EVENT_HANDLER_LIST, *PTDI_EVENT_HANDLER_LIST;LIST_ENTRY g_TdiEventHandlerInfoList;NTSTATUS DeviceInternalIoControl( PDEVICE_OBJECT DeviceObject, PIRP Irp ) {PKIRQL OldIrql;PLIST_ENTRY pListEntry;PIO_STACK_LOCATION IrpSp;PTDI_EVENT_HANDLER_WRAP pTdiEventHandlerWrap;PTDI_EVENT_HANDLER_LIST pTdiEventHandlerList;PTDI_EVENT_HANDLER_WRAP pTdiEventHandlerWrap_;PTDI_EVENT_HANDLER_LIST pTdiEventHandlerList_;PTDI_FILTER_DEVICE_EXTENSION pTdiDeviceExtension; pTdiDeviceExtension ( PTDI_FILTER_DEVICE_EXTENSION )DeviceObject-DeviceExtension;switch( IrpSp-MinorFunction ){case TDI_SET_EVENT_HANDLER:pTdiSetEvent ( PTDI_REQUEST_KERNEL_SET_EVENT )pIrpSp-Parameters;if( TDI_EVENT_RECEIVE pTdiSetEvent-EventType )//|| TDI_EVENT_RECEIVE_EXPEDITED pTdiSetEvent-EventType || TDI_EVENT_CHAINED_RECEIVE pTdiSetEvent-EventType || TDI_EVENT_CHAINED_RECEIVE_EXPEDITED pTdiSetEvent-EventType || TDI_EVENT_RECEIVE_DATAGRAM pTdiSetEvent-EventType ){pTdiEventHandlerList NULL;pTdiEventHandlerWrap NULL;pProcessNetWorkTrafficInfo NULL;if( NULL pTdiSetEvent-EventHandler ){//注意如果注册的事件回调函数是NULL的话它表示的取消之前曾经注册过的事件回调函数, 这里当然不能挂钩可以加入释放钩子资源的操作。goto CALL_PDO_DRIVER;}KeAcquireSpinLock( g_SpLockTdiEventHandlerInfo, OldIrql ); //对事件回调函数钩子列表写操作加锁保护pListEntry g_TdiEventHandlerInfoList.Flink;for( ; ; ){if( pListEntry g_TdiEventHandlerInfoList ){pTdiEventHandlerWrap_ NULL;break;}pTdiEventHandlerList_ ( PTDI_EVENT_HANDLER_LIST )pListEntry;pTdiEventHandlerWrap_ pTdiEventHandlerList_-pTdiEventHandlerWrap;if( pTdiEventHandlerWrap_-pAssocAddr pFileObject pTdiEventHandlerWrap_-dwEventType dwEventType ) //如果此本机套接字对象的相应事件回调函数已经存在则直接对其进行修改就可以了而不是不断的新建事件件回调钩子{pTdiEventHandlerWrap_-pOrgEventHandler pEventHandler;pTdiEventHandlerWrap_-pOrgEventContext pEventContext;break;}}if( NULL pTdiEventHandlerWrap_ ) //没有找到加入新的事件回调函数钩子{pTdiEventHandlerWrap ( PTDI_EVENT_HANDLER_WRAP )ExAllocatePoolWithTag( NonPagedPool, sizeof( TDI_EVENT_HANDLER_WRAP ), 0 );if( NULL pTdiEventHandlerWrap ){goto RELEASE_RESOURCE;}pTdiEventHandlerList ( PTDI_EVENT_HANDLER_LIST )ExAllocatePoolWithTag( NonPagedPool, sizeof( TDI_EVENT_HANDLER_LIST ), 0 );if( NULL pTdiEventHandlerList ){goto RELEASE_RESOURCE;}pTdiEventHandlerWrap-dwEventContextMark TDI_EVENT_CONTEXT_MARK;pTdiEventHandlerWrap-dwEventType dwEventType;pTdiEventHandlerWrap-pOrgEventHandler pEventHandler;pTdiEventHandlerWrap-pOrgEventContext pEventContext;pTdiEventHandlerWrap-pAssocAddr pFileObject;pTdiEventHandlerWrap-pDeviceObject pTdiDeviceExtension-pTdiDeviceObject;pTdiEventHandlerList-pTdiEventHandlerWrap pTdiEventHandlerWrap;InsertTailList( g_TdiEventHandlerInfoList, pTdiEventHandlerList );}else{pTdiEventHandlerWrap pTdiEventHandlerWrap_;pTdiEventHandlerList pTdiEventHandlerList_;}KeReleaseSpinLock( g_SpLockTdiEventHandlerInfo, OldIrql ); //释放事件回调钩子列表锁if( TDI_EVENT_RECEIVE pTdiSetEvent-EventType || TDI_EVENT_RECEIVE_EXPEDITED pTdiSetEvent-EventType ){pTdiSetEvent-EventHandler TdiFilterRecvEventHandler; //加入自己的事件过滤回调函数}else if( TDI_EVENT_CHAINED_RECEIVE pTdiSetEvent-EventType ||TDI_EVENT_CHAINED_RECEIVE_EXPEDITED pTdiSetEvent-EventType ){pTdiSetEvent-EventHandler TdiFilterChainedRecvHandler;}else{pTdiSetEvent-EventHandler TdiFilterRecvDatagramEventHandler;}pTdiSetEvent-EventContext pTdiEventHandlerWrap;IoSkipCurrentIrpStackLocation( pIrp );ntStatus IoCallDriver( pDeviceExtension-pTdiDeviceObject, pIrp );if( !NT_SUCCESS( ntStatus ) ){if( NULL pTdiEventHandlerWrap_ ){//如果是新加入的事件回调函数钩子可以在出错时将其释放, 也可以保留至套接字关闭时再进行释放KeAcquireSpinLock( g_SpLockTdiEventHandlerInfo, OldIrql ); //对事件回调函数钩子列表写操作加锁保护RemoveEntryList( ( PLIST_ENTRY )pTdiEventHandlerList );ExFreePoolWithTag( pTdiEventHandlerWrap );ExFreePoolWithTag( pTdiEventHandlerList );KeReleaseSpinLock( g_SpLockTdiEventHandlerInfo, OldIrql ); //释放事件回调钩子列表锁}}return ntStatus;}break;default:goto CALL_PDO_DRIVER;break;}RELEASE_RESOURCE:if( NULL ! pTdiEventHandlerWrap ){ExFreePoolWithTag( pTdiEventHandlerWrap, NonPagedPool );}if( NULL ! pTdiEventHandlerList ){ExFreePoolWithTag( pTdiEventHandlerList, NonPagedPool );}CALL_PDO_DRIVER:IoSkipCurrentIrpStackLocation( pIrp );return IoCallDriver( pDeviceExtension-pTdiDeviceObject, pIrp ); }     以上对事件回调函数加入了钩子下一步必须考虑对其释放的问题否则当原始回调函数对应的套接字释放后你的系统将会崩溃以下为具体代码 在套接字关闭后要在IRP_MJ_CLEANUP功能函数中将相关的事件回调钩子释放掉 NTSTATUS TdiFilterCleanUp(PDEVICE_OBJECT DeviceObject, PIRP pIrp ) {NTSTATUS ntStatus;KIRQL OldIrql;PTDI_EVENT_HANDLER_LIST pTdiEventHandlerList;PTDI_EVENT_HANDLER_WRAP pTdiEventHandlerWrap;PFILE_OBJECT pFileObject;TDI_FILTER_DEVICE_EXTENSION *pDeviceExtension;PIO_STACK_LOCATION pIrpSp;pDeviceExtension ( TDI_FILTER_DEVICE_EXTENSION* )DeviceObject-DeviceExtension;pIrpSp IoGetCurrentIrpStackLocation( pIrp );pFileObject pIrpSp-FileObject;...//如果是主控制设备要将调用IoCompleteIrp完成Irp, 如果是过滤设备调用PDO设备驱动 IoSkipCurrentIrpStackLocation( pIrp );ntStatus IoCallDriver( pDeviceExtension-pTdiDeviceObject, pIrp );if( !NT_SUCCESS( ntStatus ) ){DebugPrintEx( CLEANUP_INFO,netmon TdiFilterCleanUp IoCallDriver return ERROR/n );return ntStatus;}//下一步释放套接字对应的事件回调钩子KeAcquireSpinLock( g_SpLockTdiEventHandlerInfo, OldIrql );FIND_LIST_AGAIN:pListEntry g_TdiEventHandlerInfoList.Flink;for( ; ; ){if( pListEntry g_TdiEventHandlerInfoList ){break;}pTdiEventHandlerList ( PTDI_EVENT_HANDLER_LIST )pListEntry;pTdiEventHandlerWrap pTdiEventHandlerList-pTdiEventHandlerWrap;if( pTdiEventHandlerWrap-pAssocAddr pFileObject ){RemoveEntryList( pListEntry );ExFreePoolWithTag( pTdiEventHandlerWrap, 0 );ExFreePoolWithTag( pTdiEventHandlerList, 0 );goto FIND_LIST_AGAIN;}pListEntry pListEntry-Flink;}KeReleaseSpinLock( g_SpLockTdiEventHandlerInfo, OldIrql );return ntStatus; }   那么可以在事件回调过滤钩子函数对数据进行处理了 NTSTATUS TdiFilterRecvEventHandler( IN PVOID TdiEventContext,IN CONNECTION_CONTEXT ConnectionContext,IN ULONG ReceiveFlags,IN ULONG BytesIndicated,IN ULONG BytesAvailable,OUT ULONG *BytesTaken,IN PVOID Tsdu,OUT PIRP *IoRequestPacket) {NTSTATUS ntStatus;PIO_STACK_LOCATION pIrpSp;PTDI_EVENT_HANDLER_WRAP pEventHandlerWrap;PTDI_COMPLETION_WRAP pCompletionWrap;LARGE_INTEGER RecvedDataSize;pEventHandlerWrap ( PTDI_EVENT_HANDLER_WRAP )TdiEventContext;if( FALSE g_bFiltering ) //是否进行过滤{goto CALL_ORIGINAL_EVENT_HANDLER;}if( FALSE ! bStopRecv ){ ntStatus STATUS_DATA_NOT_ACCEPTED;goto RELEASE_PROCESS_IO_INFO_RETURN;}ntStatus ( ( ClientEventReceive )pEventHandlerWrap-pOrgEventHandler )( pEventHandlerWrap-pOrgEventContext, ConnectionContext, ReceiveFlags, BytesIndicated, BytesAvailable, BytesTaken, Tsdu, IoRequestPacket );if( NULL ! BytesTaken 0 ! *BytesTaken ){//这里对数据进行处理, 比如可以进行通信数据量的统计}if( STATUS_MORE_PROCESSING_REQUIRED ! ntStatus ){goto RELEASE_PROCESS_IO_INFO_RETURN;}if( NULL *IoRequestPacket ){goto RELEASE_PROCESS_IO_INFO_RETURN;}//IoRequestPacket表示当前接收IRP中的数据如果并不完整, 并且认为接下来的数据是有价值需要接收的话那么需要自己新建一个IRP包将其指针传入此参数中并返回STATUS_MORE_PROCESSING_REQUIRED通知IO管理不终止此IRPTDI驱动将继续接收接下来的数据。//所以如果此IRP包存在可以截取它的信息具体方法下一步讲述。return ntStatus;CALL_ORIGINAL_EVENT_HANDLER:return ( ( ClientEventReceive )pEventHandlerWrap-pOrgEventHandler )( //直接调用原始的IRP钩子函数不进行处理pEventHandlerWrap-pOrgEventContext, ConnectionContext, ReceiveFlags, BytesIndicated, BytesAvailable, BytesTaken, Tsdu, IoRequestPacket); }   上面讲述了使用事件回调函数钩子的方式进行通信数据的截取方法下面讲述直接IRP包数据传输方式也就是以下4个子功能的截取方法   TDI_SEND   TDI_RECEIVE   TDI_SEND_DATAGRAM   TDI_RECEIVE_DATAGRAM   在IRP_MJ_INTERNAL_DEVICE_CONTROL函数中响应以上子功能时确认参数DeviceObject为TDI过滤设备对所有截取到的IRP加入自己的完成函数在此IRP被完成时( 调用IoCompleteRequest )此完成函数被调用取得IRP处理的返回结果进行处理。具体数据的处理对应于TDI_SEND子功能可以在IoCallDriver之前得到因为它是应用程序传给你的而TDI_RECEIVE子功能应该在TDI事件回调函数或Completion回调函数中取得。相关代码如下 typedef struct __TDI_COMPLETION_WRAP {...//可以加入用来记录/处理数据的成员, 比如通信标志, 流量统计等PIO_COMPLETION_ROUTINE pCompletionRoutine;LPVOID pContext; } TDI_COMPLETION_WRAP, *PTDI_COMPLETION_WRAP; 加入自定义的CompletionRoutine的方法 if( TDI_SEND MinorFunction ||TDI_SEND_DATAGRAM MinorFunction || TDI_RECEIVE MinorFunction || TDI_RECEIVE_DATAGRAM MinorFunction ) {if( TDI_RECEIVE MinorFunction TDI_RECEIVE_PEEK ( ULONG )pIrpSp-Parameters.Others.Argument2 ){//TDI_RECEIVE_PEEK不会真正接收数据可以不需要对其进行过滤。goto SKIP_CURRENT_STACK_LOCATION;}pCompletionWrap ( PTDI_COMPLETION_WRAP )ExAllocateFromNPagedLookasideList( g_CompletionWrapList ); //可以使用链表或HASH等数据结构来管理所有的CompletionRoutine包装信息这里使用了NPAGED_LOOKASIDE_LIST它的优势在于系统中所有的NPAGED_LOOKASIDE_LIST资源的最大占用量将会被内存管理器动态管理if( NULL pCompletionWrap ){goto SKIP_CURRENT_STACK_LOCATION;}//这里可以设置CompletionRoutine的具体工作参数比如具体操作的类型原始的Completion函数等在用户层传送至的IRP中是不会设置CompletionRoutine函数的但其它驱动传送至的IRP中可能会进行设置如在Receive事件回调函数中的IoRequestPacket参数IoCopyCurrentIrpStackLocationToNext( pIrp ); //设置下一个设备栈工作参数 IoSetCompletionRoutine( pIrp, TdiFilterCompletion, pCompletionWrap, TRUE, TRUE, TRUE);//这里就为这个IRP加入自己的CompletionRoutine函数goto CALL_PDO_DRIVER;SKIP_CURRENT_STACK_LOCATION:IoSkipCurrentIrpStackLocation( pIrp );CALL_PDO_DRIVER:return IoCallDriver( pDeviceExtension-pTdiDeviceObject, pIrp ); } 具体的Completion函数的工作: NTSTATUS TdiFilterCompletion( PDEVICE_OBJECT pDeviceObject, PIRP pIrp, LPVOID pContext ) {NTSTATUS ntStatus;PTDI_COMPLETION_WRAP pCompletionWrap;LARGE_INTEGER TransferredDataSize;PIRP pMasterIrp;PIO_STACK_LOCATION pIrpSp;ntStatus pIrp-IoStatus.Status;pCompletionWrap ( PTDI_COMPLETION_WRAP )pContext;if( NT_SUCCESS( ntStatus ) ){//可以在这里对成功传输的数据进行处理}//这里可以调用原始的Completion函数RETURN_SUCCESS:return ntStatus; }     需要注意的是如果为IRP包加入了CompletionRoutine之后那么在驱动卸载( Unload )之前必须保证所有IRP已经执行过此Completion函数, 如果在驱动被从内存中卸载后才执行, 将会使系统崩溃。处理方法为  1.不实现DriverUnload函数使驱动只有在系统关闭底层设备被卸载时才能完成真正的卸载。这是的一般    FILTER驱动的工作方式  2.使用线程同步的方法保证Completion函数的执行Windows XP或之后的系统也提供了一个API,         SetCompletionRoutineEx来保证驱动在Completion函数完成前不被卸载。   至此讲述TDI过滤驱动组织框架可以为它添加一些更加完善的功能。 转载于:https://www.cnblogs.com/himessage/archive/2013/01/15/2860834.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/88959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何对网站的图片做cdn免费软件加速器

找到一个可靠的步骤,点开链接:http://blog.csdn.net/kevindr/article/details/22154323

做封面的软件ps下载网站iis的网站登录没反应

个人主页:Lei宝啊 愿所有美好如期而遇 目录 你是否听过Linux下一切皆文件? 在哪里我们体悟到了Linux下一切皆文件? 文件是什么? 在哪里体悟到的? 常见疑惑 怎么办到的Linux下一切皆文件? 我们抛出…

怎么看网站被降权征婚网站开发

算法-快速幂 时间复杂度 O(logk) //求 m^k mod p int qmul(int m,int k,int p) {int res1%p;while(k){if(k&1){res*m;res%p;}m*m;m%p;k>>1;}return res; }

用html5做网站的优点建筑工程公司有哪些岗位

1、取得控制台应用程序的根目录方法 方法1、Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径 方法2、AppDomain.CurrentDomain.BaseDirectory 获取基目录,它由程序集冲突解决程序用来探测程序集 2、取得Web应用程序的根目录方法 方法1、HttpRun…

西安 网站建设 培训班wordpress全站伪静态

Lua 是一个功能强大、高效、轻量级、可嵌入的脚本语言。它支持程序编程、面向对象程序设计、函数式编程、数据驱动编程和数据描述。 Lua的官方网站上只提供了源码,需要使用Make进行编译,具体的编译方法为 curl -R -O http://www.lua.org/ftp/lua-5.4.6.…

网站如何做地面推广企航网络推广

1 必须修改端口号 port 323422 2 必须设置密码,并且有一定的复杂度 requirepass dske#123 3 绑定bind ip bind 127.0.0.1 4 使用无登录权限的用户运行redis 配置文件路径 /www/server/redis/redis.conf 一般都是安装文件里 如果忘记密码和端口号也可以去配置文件…

做网站备案是什么意思杭州公积金网站查询系统

1.电子商务最重要的是( ) A.商务 B.网站 C.货物 D.信息技术 正确 正确答案:左边查询 学生答案:A 2.目前菜鸟网络依赖大数据和云计算已实现了哪些功能( ) A.自动化仓库 B.智能发货 C.物流云加速 D.以上都正确…

班级网站怎么做自己做网站怎么让字体居中

文章目录 Spring Security OAuth2如何自定义返回的 Token 信息定制不透明令牌的信息Springsecurity-oauth2之TokenEndPoint参考Spring Security OAuth2如何自定义返回的 Token 信息 Spring Boot+OAuth2,如何自定义返回的 Token 信息? 参考URL: https://www.jianshu.com/p/b7…

北京公司响应式网站建设价位北京品牌建设网站公司

作者:老齐对于初学Python者,除了看书(《跟老齐学Python:轻松入门》或者《Python大学实用教程》,均为电子工业出版社出版)、或者看视频(网易云课堂、CSDN上均有老齐的视频课程),还要进行专题性总结。比如本文&#xff0…

做产品推广得网站网站建设 蔬菜配送

明理信息科技知识付费saas租户平台 在当今的知识付费时代,我们面临着一个重要的问题:如何从众多的知识付费平台中选择适合自己的平台?本文将为您提供一些实用的建议,帮助您做出正确的选择。 首先,我们需要了解自己的…

实施网站推广的最终目的太湖网站建设

1:ARPG类型游戏 2:MMORPG 3:MOBA 4:卡牌类 5:棋盘类 转载于:https://www.cnblogs.com/like-minded/p/8297718.html

自己做的网站加载不出验证码网站和微信同步建设

1.关于MITK: MITK的全称是”The Medical Imaging Interaction Toolkit”。它是一款开源的交互式医学图像处理软件开发和应用平台。MITK将ITK和VTK整合为一个应用框架。该软件由德国一个研究室开发。官网地址为:http://mitk.org/wiki/MITK 。 与MITK同名…

建网站代理最近发生的热点事件

作为一名资深记者,我始终关注并报道科技如何助力特殊群体克服生活挑战的创新实践。近期,我有幸深入了解了一款专为盲人设计的辅助应用叫做蝙蝠避障,它以实时避障系统为核心,为视障人士独自出行提供了强有力的支持,悄然…

网站快速注册网站开发流程的8个步骤

首先写在最前面,MyCAT1.4的alpha版本已经发布了,这里面修复了不少的bug,也完善了一细节,之前两篇博客已经做了一些修改---------------------------------------------------------------------------------这才是本体~----------…

企业网站建设可行性分析 技能训练公司logo查询网站

2019千锋好程序员全新Python教程,深入浅出的讲解Python语言的基础语法,注重基本编程能力训练,深入解析面向对象思想,数据类型和变量、运算符、流程控制、函数、面向对象、模块和包、生成器和迭代器。教程列表:千锋Pyth…

网站百度地图提交H5平台网站建设

1.质量属性效用树 1.主要关注性能,可用性,安全性和可修改性(升级)进行分析 2.架构风格 2.1.分类 1. 解释器(interpreter):灵活性最高,建模为有向无环图,采用工作流方…

网站 竞争分析咸阳做企业网站

实验8 SQL Server 的存储过程一、实验目的 1.掌握使用T-SQL编程的方法 2.掌握使用T-SQL语句创建一个存储过程并验证 3.掌握创建和执行带参数的存储过程 4.熟练使用系统存储过程、系统函数 二、实验要求 1.创建一个不带参数的存储过程。 2.创建一个带参数的存储过程p_count。 三…

有效的小企业网站建设超链接到网站怎么做视频文件下载

一、前言 微信小程序如期发布,开发者在接入微信小程序过程中,会遇到以下问题: 小程序要求必须通过 HTTPS 完成与服务端通信,若开发者选择自行搭建 HTTPS 服务,那需要自行 SSL 证书申请、部署,完成 https …

网站最常用字体雅安市住房和城乡建设局网站

题目: 一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。 本题要求编写程序,求一个给定的n阶方阵的鞍点。 输入格式: 输入第一行给出一个正整数n(1≤n≤6)。随后n行,每行给出n个…

个人做电商网站icp免费下载app软件安装

如果您的系统调用只应报告统计信息,则可以使用内核中已有的上下文切换计数代码.struct rusage {...long ru_nvcsw; /* voluntary context switches */long ru_nivcsw; /* involuntary context switches */};您可以通过运行来尝试:$/usr/bin/time -v /bin/ls -R....V…