当前位置: 首页 > news >正文

微软开源库 Detours 详细介绍与使用实例分享

目录

1、Detours概述

2、Detours功能特性

3、Detours工作原理

4、Detours应用场景

5、Detours兼容性

6、Detours具体使用方法

7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截


C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931C/C++实战进阶(专栏文章已更新400多篇,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.htmlWindows C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_2276111.html       微软Detours是微软官方推出并开源的一个工具库,主要用于在运行时动态地拦截和修改Windows平台上的Win32 API函数调用。下面从Detours的功能、特性、工作原理、应用场景、兼容性以及使用方法等方面,详细介绍一下Detours。

1、Detours概述

       Detours是微软开发的一个开源库,它允许开发者在不需要重新编译或修改原始代码的情况下,轻松地修改其他进程中的函数调用行为。这一特性使得Detours成为调试、监控、性能测试、安全检测以及插件扩展等场景下的强大工具。Detours通过Hook技术(也称为“钩子”技术)实现其功能,能够在运行时“绕道”目标函数,将控制流转向自定义的处理函数,并在适当的时候恢复到原函数的执行。

Detours提供了高效的API,支持32位和64位系统,Detours通过修改目标函数在内存中的代码,实现拦截Win32函数的目的,同时它还支持将任意的DLL或数据片段(称之为有效载荷)注入到任意Win32二进制文件中。

       微软已经将Detours源码开源,可以到github上去下载完整源码:

https://github.com/microsoft/Detoursicon-default.png?t=N7T8https://github.com/microsoft/Detours

2、Detours功能特性

       Detours的主要功能特性如下:

  • 高效API支持:Detours提供了一套高效的API,支持在32位和64位Windows操作系统上拦截和修改Win32函数,降低了使用难度。开发者可以轻松地通过Detours API实现函数拦截、修改和重定向,而无需深入了解底层汇编语言。
  • 灵活性强:Detours不仅可以拦截函数,还可以拦截向特定地址的内存写入操作,为开发者提供了前所未有的运行时行为控制力。
  • 内存和线程安全:Detours提供了内存安全的接口,避免了因动态内存分配和释放不当导致的问题。同时,它针对多线程环境进行了优化,保证了在多线程环境下的正确性和可靠性。
  • 跨平台支持:Detours支持在x86、x64、IA64以及ARM和ARM64等架构的Windows系统上运行,为开发者提供了广泛的平台兼容性。
  • 高效稳定:Detours基于汇编语言实现,确保了高效性和兼容性。同时,经过微软多年内部使用的验证,Detours具有高度可靠性和稳定性,能够稳定运行在各种Windows操作系统上。
  • 丰富的应用场景:Detours广泛应用于调试、监控、性能分析、安全检测、插件系统等领域。开发者可以利用Detours对应用程序进行扩展,如添加日志记录、性能测试、错误检查等。

3、Detours工作原理

       Detours的工作原理基于汇编语言实现,通过修改目标函数在内存中的二进制映像来达到拦截和修改函数调用的目的。具体来说,Detours会替换目标函数的前几条指令为一个无条件跳转指令(JMP),将控制流引导到用户提供的拦截函数(Detour函数)。同时,Detours会将被替换的指令保存在一个被称为“Trampoline”的函数中,以便在需要时恢复目标函数的原始行为。

       当程序执行到目标函数时,它会直接跳转到拦截函数执行。拦截函数可以执行自定义的代码,如修改参数、记录日志等,并可以选择直接返回或调用Trampoline函数来恢复目标函数的原始行为。拦截函数执行完毕后,控制流会返回到源函数调用处,完成整个拦截过程。


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:(该精品技术专栏的订阅量已达到500多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:  

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏3:(本专栏涵盖了多方面的内容,是当前重点打造的专栏,专栏文章已经更新到400多篇,持续更新中...)

C/C++实战进阶(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5: 

Windows C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=N7T8https://blog.csdn.net/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了Windows C++ 应用软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


4、Detours应用场景

       Detours在多个领域都有广泛的应用,以下是一些典型的应用场景:

  • 调试和监控:在不修改源代码的情况下,开发者可以在关键点插入跟踪代码,观察程序行为。这对于调试复杂的应用程序或监控应用程序的运行状态非常有用。
  • 性能分析:通过插入计时器来测量函数的执行时间,Detours可以帮助开发者找到性能瓶颈,优化程序性能。
  • 安全检测:监控敏感函数调用,防止恶意活动。例如,可以拦截系统API调用以检测潜在的恶意软件行为。
  • 插件系统:为无插件支持的应用程序添加插件功能。通过拦截和修改函数调用,Detours可以扩展应用程序的功能而无需修改其源代码。
  • 应用增强:为旧版软件添加新特性或修复已知问题。通过拦截和修改函数调用,Detours可以使旧版软件焕发新生。

5、Detours兼容性

       Detours兼容Windows NT家族的操作系统,包括Windows NT、Windows XP、Windows Server 2003以及更高版本的Windows操作系统(如Windows 7、Windows 8、Windows 10等)。

       然而,需要注意的是,Windows Store应用程序只能使用Win32 API的一个子集,且Detours需要使用的某些Win32 API在Windows应用程序认证中是被禁止的,因此Windows Store新应用程序不能使用Detours,这一点有待验证。

6、Detours具体使用方法

       使用Detours需要遵循一定的步骤和规则。首先,需要下载并安装Detours库及其依赖项。然后,在项目中包含Detours的头文件和库文件,并编写自定义的拦截函数。接下来,通过调用Detours提供的API函数(如DetourAttach、DetourDetach等)来挂载和卸载拦截函数。最后,编译并运行项目以验证拦截效果。

       具体来说,使用Detours的步骤如下:

  • 1)包含Detours头文件和库文件:在项目中包含Detours的头文件(如detours.h)和库文件(如detours.lib),以便使用Detours提供的API。
  • 2)定义目标函数和detour函数:确定要拦截的目标函数,并定义一个与之具有相同参数和返回类型的detour函数。在detour函数中编写自定义的代码逻辑。
  • 3)初始化Detours:在程序的适当位置(如DllMain函数的DLL_PROCESS_ATTACH阶段)调用DetourTransactionBegin()函数开始一个事务,并通过DetourUpdateThread()函数更新当前线程的Detours状态。
  • 4)挂接detour函数:使用DetourAttach()函数将detour函数挂接到目标函数上。DetourAttach()函数的第一个参数是指向目标函数地址的指针,第二个参数是指向detour函数的指针。
  • 5)提交事务:调用DetourTransactionCommit()函数提交事务,使detour函数生效。如果挂接成功,DetourTransactionCommit()将返回NO_ERROR;否则,将返回错误码。
  • 6)卸载Detours:在程序的适当位置(如DllMain函数的DLL_PROCESS_DETACH阶段)调用DetourTransactionBegin()、DetourDetach()和DetourTransactionCommit()函数来卸载Detours,并恢复目标函数的原始行为。

7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截

        当程序中发生异常,系统感知到,如果异常是不可恢复的、致命的异常且当前是非调试状态,最终会走到系统库的UnhandledExceptionFilter接口中。为了让我们的程序有效感知并拦截程序中发生的异常,我们直接将系统库中的UnhandledExceptionFilter给hook掉,在自定义函数中添加相关的处理代码。下面给出hook系统库中UnhandledExceptionFilter接口的代码实现:

1)我们定义了一个hook类CHookUnhandledExceptionFilter,在类的构造函数中去hook系统库接口UnhandledExceptionFilter;
2)在CHookUnhandledExceptionFilter类的析构函数中去卸载对UnhandledExceptionFilter接口的hook;
3)使用这个CHookUnhandledExceptionFilter类时,只要用该类定义一个全局变量即可,类对象构造时设置hook,类对象析构时卸载hook。

       CHookUnhandledExceptionFilter类的头文件定义:

//用来hook 系统库中的UnhandledExceptionFilter
class CHookUnhandledExceptionFilter
{
public:CHookUnhandledExceptionFilter(void);~CHookUnhandledExceptionFilter(void);private:void* m_lpUnhandledExceptionFilter;
};

        CHookUnhandledExceptionFilter类的cpp源文件如下:

// 将系统函数hook成该函数
LONG WINAPI NewUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo )
{// 处理代码省略
}// 1、在构造函数中设置对UnhandledExceptionFilter的hook,将之hook成NewUnhandledExceptionFilter
CHookUnhandledExceptionFilter::CHookUnhandledExceptionFilter(void)
{m_lpUnhandledExceptionFilter = NULL;do {SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);if ( IsWindowsVersionGreater( HIBYTE( _WIN32_WINNT_WIN10 ), LOBYTE( _WIN32_WINNT_WIN10 ), 0 ) ){m_lpUnhandledExceptionFilter = DetourFindFunction( "KERNELBASE.DLL", "UnhandledExceptionFilter" );}else{m_lpUnhandledExceptionFilter = DetourFindFunction( "KERNEL32.DLL", "UnhandledExceptionFilter" );}if ( NULL == m_lpUnhandledExceptionFilter ) {WriteCrashLog(_T("DetourFindFunction return null"));break;}CString strErr;LONG lRes = NO_ERROR;lRes = DetourTransactionBegin();if ( NO_ERROR != lRes ) {strErr.Format( _T("DetourTransactionBegin fails ret:%d"), lRes );WriteCrashLog( strErr.GetBuffer(0) );break;}lRes = DetourAttach( &m_lpUnhandledExceptionFilter, NewUnhandledExceptionFilter );if ( NO_ERROR != lRes ) {strErr.Format( _T("DetourAttach fails ret:%d"), lRes );WriteCrashLog( strErr.GetBuffer(0) );break;}lRes = DetourTransactionCommit();if ( NO_ERROR != lRes ) {strErr.Format( _T("DetourTransactionCommit fails ret:%d"), lRes );WriteCrashLog( strErr.GetBuffer(0) );break;}} while (0);
}// 2、在析构函数中卸载对UnhandledExceptionFilter的hook
CHookUnhandledExceptionFilter::~CHookUnhandledExceptionFilter(void)
{if ( m_lpUnhandledExceptionFilter ) {do {LONG lRes = NO_ERROR;lRes = DetourTransactionBegin();if ( NO_ERROR != lRes ) {break;}lRes = DetourDetach( &m_lpUnhandledExceptionFilter, NewUnhandledExceptionFilter );if ( NO_ERROR != lRes ) {break;}lRes = DetourTransactionCommit();if ( NO_ERROR != lRes ) {break;}} while (0);}
}

相关文章:

微软开源库 Detours 详细介绍与使用实例分享

目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截 C软件异常排查从入门到精通…...

js中的getElementById的使用方法

在JavaScript中,document.getElementById()是一种用于通过元素的id属性获取DOM元素的方法。它的作用是返回与指定id匹配的HTML元素。 使用document.getElementById()可以通过元素的id属性直接获取该元素的引用,然后可以使用该引用对元素进行各种操作。例…...

设计模式 - 桥接模式

💝💝💝首先,欢迎各位来到我的博客!本文深入理解设计模式原理、应用技巧、强调实战操作,提供代码示例和解决方案,适合有一定编程基础并希望提升设计能力的开发者,帮助读者快速掌握并灵活运用设计模式。 💝💝💝如有需要请大家订阅我的专栏【设计模式】哟!我会定…...

LeetCode530 二叉搜索树的最小绝对差

前言 题目: 530. 二叉搜索树的最小绝对差 文档: 代码随想录——二叉搜索树的最小绝对差 编程语言: C 解题状态: 成功解决! 思路 注意题目中的二叉搜索树,这个条件暗示每个节点的左子节点肯定小于该节点&am…...

【STM32 FreeRTOS】信号量与互斥锁

二值信号量 二值信号量的本质是一个队列长度为1的队列,该队列就只有空和满两种情况,这就是二值。 二值信号量通常用于互斥访问或任务同步,与互斥信号量比较类似,但是二值信号量有可能会导致优先级翻转的问题,所以二值…...

SP:eric 靶场复现【附代码】(权限提升)

靶机下载地址: https://www.vulnhub.com/entry/sp-eric,274/https://www.vulnhub.com/entry/sp-eric,274/ 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24|grep -B 2 08:00:27:75:19:80 1.2. 端口扫描 nmap 192.168.7.104 -p…...

SpringBoot项目启动直接结束--已解决

点击启动类&#xff0c;项目启动了&#xff0c;但是却直接停止了。遇到这个问题如何解决呢&#xff1f; 想要项目一直启动是要部署在tomcat服务器上面了&#xff0c;说明现在项目没有运行在tomcat服务器上面。 解决方案: 添加springweb的starter依赖。 <dependency><…...

【笔记】从零开始做一个精灵龙女-画贴图阶段(下)

补充四点&#xff0c;第一&#xff0c;前期画体积用一号或十三号笔刷&#xff0c;压力60&#xff0c;硬度80&#xff0c;体积大一点 2号笔刷比较适合画过渡和软一点的东东 第二&#xff0c; 游戏里面角色原画海报都是发光很亮很透。但是在bp不能画那么亮&#xff0c;因为你进…...

React 学习——react项目中加入echarts图

实现的代码如下&#xff1a; import * as echarts from echarts import { useEffect, useRef } from react; const Home ()>{const chartRef useRef(null);useEffect(()>{// const chartDom document.getElementById(main);//使用id获取节点const chartDom chartRef…...

链表算法题一

​ 旋转链表 旋转链表 首先考虑特殊情况 若给定链表为空表或者单个节点,则直接返回head,不需要旋转操作.题目给定条件范围: 0 < k < 2 ∗ 1 0 9 0 < k < 2 * 10^9 0<k<2∗109,但是受给定链表长度的限制,比如示例2中,k4与k1的效果等价. 那么可以得出kk%l…...

Unity(2022.3.38LTS) - 基础概念

目录 一. 场景 二. 游戏对象 三. 组件 四. 标签 五. 静态游戏对象 六. 保存 一. 场景 Unity 场景是游戏或应用开发中的一个重要概念。 Unity 场景的组成元素&#xff1a; 它通常包含了各种游戏对象&#xff0c;比如 3D 模型、灯光、摄像机、脚本组件、音频源等等。 作用…...

无人机之飞手必看篇

一、熟悉无人机设备 了解你的无人机&#xff1a;熟悉无人机的各个部分&#xff0c;包括遥控器、电池、螺旋桨和摄像头等。 预飞行检查&#xff1a;在每次飞行前进行预检查&#xff0c;确保所有部件正常工作&#xff0c;螺旋桨牢固&#xff0c;电池充满电。 二、选择适当的飞…...

数据结构(11)——二叉搜索树

欢迎来到博主的专栏&#xff1a;数据结构 博主ID:代码小豪 文章目录 二叉搜索树二叉搜索树的声明与定义二叉搜索树的查找二叉搜索树的插入二叉搜索树的中序遍历二叉搜索树的删除 二叉搜索树 二叉搜索树也称二叉排序树&#xff0c;是具备以下特征的二叉树 &#xff08;1&#x…...

如何使用和配置 AWS CLI 环境变量?

欢迎来到雲闪世界。环境变量在配置和保护应用程序方面起着至关重要的作用&#xff0c;在使用 AWS CLI&#xff08;命令行界面&#xff09;时&#xff0c;它们的使用尤其重要。在这篇博客文章中&#xff0c;我们将深入探讨环境变量的世界&#xff0c;探索它们的用途、它们在 AWS…...

七、流程控制

if语句 在go语言中if语句的写法是比较简单的&#xff0c;也是很常见的 func main() {a : trueif a {fmt.Println("a is true")} }if else 语句 func main() {a : trueif !a {fmt.Println("a is true")} else {fmt.Println("a is false")} }el…...

【通过python启动指定的文件】

通过python启动指定的文件 在 Python 中&#xff0c;可以使用os模块的startfile函数&#xff08;在 Windows 系统中&#xff09;或者subprocess模块来启动指定的文件。 以下是使用os模块在 Windows 系统中的示例&#xff1a; import osfile_path "C:\\path\\to\\your\…...

区块链开源的项目有哪些?

区块链领域有许多开源项目&#xff0c;它们覆盖了从基础设施到应用层的不同方面。以下是一些著名的区块链开源项目&#xff1a; 1. Bitcoin (比特币)&#xff1a;第一个去中心化的加密货币&#xff0c;源代码在 GitHub 上开源。它实现了区块链技术的基本概念。 2. Ethereum (…...

3152. 特殊数组 II(24.8.14)

题目 如果数组的每一对相邻元素都是两个奇偶性不同的数字&#xff0c;则该数组被认为是一个 特殊数组 。 你有一个整数数组 nums 和一个二维整数矩阵 queries&#xff0c;对于 queries[i] [fromi, toi]&#xff0c;请你帮助你检查 子数组 nums[fromi…toi] 是不是一个 特殊数组…...

Android 全系统版本文件读写最佳适配,CV 即用(适配到 Android 14)

结合着Android的历史问题&#xff0c;我们需要这样写才行&#xff1a; 首先 manifest 部分 <manifest><!-- Devices running Android 12L (API level 32) or lower --><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" a…...

【日记】朋友和他女朋友领证了(368 字)

正文 一定程度上感受到了驻场运维的水深火热&#xff0c;感觉成天到晚都在救火。今天下午就给人修了四五台机器…… 回想了一下&#xff0c;今天貌似还真没干什么。毕竟早上睁眼就是 8:35 了&#xff0c;给人吓得半死。 &#xff08;感觉 AI 也很智障&#xff0c;当初就是发现音…...

行业大模型:信用评分大模型、生产优化大模型、库存管理大模型、物流行业大模型、零售行业大模型

金融行业大模型&#xff1a;信用评分大模型 信用评分模型在金融行业中扮演着至关重要的角色&#xff0c;它通过对个人或企业的信用状况进行评估&#xff0c;帮助金融机构有效控制风险&#xff0c;提高业务效率。以下是信用评分模型的特点及案例介绍&#xff1a; 信用评分模型…...

VSCode 搭配 Windows 下各种 C/C++ 编译器使用

Visual Studio Code(简称 VSCode)是一款由微软开发的免费、开源的代码编辑器,它支持多种编程语言,包括 C 和 C++。VSCode 提供了丰富的扩展和定制功能,使得开发者能够根据自己的需求进行个性化设置。在 Windows 环境下,搭配合适的 C/C++ 编译器,VSCode 能够成为一个强大…...

【JavaEE】线程池和定时器

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 ✏️一.线程池 在Java中&#xff0c;线程池&#xff08;Thread Pool&#xff09;是一种用于管理并发线程的机制&#xff0c;它提供了一种创建、复用和管理一组…...

《Unity3D网络游戏实战》通用服务器框架

服务端程序的两大核心是处理客户端的消息和存储玩家数据 模块划分 游戏流程 连接阶段&#xff1a;客户端调用Connect连接服务端即为连接阶段。连接后双端即可通信&#xff0c;但服务端还不知道玩家控制的是哪个角色。于是客户端需要发送一条登录协议&#xff0c;协议中包含用户…...

LeetCode404 左叶子之和

前言 题目&#xff1a; 404. 左叶子之和 文档&#xff1a; 代码随想录——左叶子之和 编程语言&#xff1a; C 解题状态&#xff1a; 成功解答&#xff01; 思路 注意左叶子节点的定义&#xff1a;节点A的左孩子不为空&#xff0c;且左孩子的左右孩子都为空&#xff08;说明是…...

nodejs操作redis的工具类

const Redis require("ioredis");async function generateStreamID() {// 生成时间戳&#xff08;毫秒级&#xff09;const timestamp Date.now();// 生成唯一的序列号const sequenceNumber Math.random() * 1000; // 根据需要生成唯一的序列号// 构建 Stream ID&…...

关于wsl2与win11互联互通的问题

首先搞清楚使用场景。我是在win11上写go做后端api&#xff0c;在WSL2 的Linux上写前端页面。 我发现在windows 里写go语言没啥问题&#xff0c;我的后端api部署在win11上。但是在win11上写前端经常会遇到莫名其妙的故障&#xff0c;一会npm包下不来一会说包之间的依赖结构出问题…...

C++ 类型转换

目录 0.前言 1.C语言类型转换 1.1隐式类型转换 1.2显式类型转换 2.C强制类型转换 2.1 static_cast 2.2 reinterpret_cast 2.3 const_cast 2.4 dynamic_cast 3.为什么C需要4种强制类型转换 3.1类型转换的多样性需求 3.2提高类型转换的安全性 3.3提供更明确的语义 3.4支持高级编程…...

2024挖漏洞给报酬的网站汇总,兼职副业3天收益2k

文章目录 一、众测平台(国内)二、前沿漏洞研究奖励计划三、行业SRC四、企业应急响应中心-SRC-汇总 1、互联网企业2、生活服务、住宿、购物相关企业3、物流、出行、旅游4、金融相关企业5、视频游戏直播社交娱乐6、教育、问答、知识付费7、泛科技通讯物联网云服务8、安全企业9、其…...

0到1学习Google广告(2):掌握展示位置及排名规则丨出海笔记

大家好, 我是专注谷歌广告和谷歌SEO的谷哥哥哥&#xff0c;感谢出海笔记Alan邀请。今天我们来聊聊广告界的大拿——谷歌广告。在这个数字营销的黄金时代&#xff0c;无论是B2B、B2C还是品牌类客户&#xff0c;谷歌广告都是一个不容忽视的战场。那么&#xff0c;如何在这个战场上…...

专门做反季的网站/百度权重1

近来遇到一些网络编程方面的问题&#xff0c;涉及到了一些常见的概念&#xff0c;如&#xff1a;阻塞、非阻塞、异步I/O等等&#xff0c;百度的结果是惨不忍睹的&#xff0c;当然这也不能怪百度。没有办法还是得看英文&#xff0c;翻教材。后来发现阻塞和非阻塞的概念也并不难以…...

网站建设首页突出什么/看广告赚钱的平台

/*********************************************************************** Buildroot stress-ng Linux系统压力测试* 说明&#xff1a;* 之前有使用lmbench对整板进行一些测试&#xff0c;如果相对某一部分专门进行测试&#xff0c;* 就可以参考使用stree-ng…...

建设企业网站的目的/线上推广的渠道有哪些

点击下面链接&#xff0c;来测测您的javaScript水平吧。 JavaScript Puzzlers! 21. function f() {} var a f.prototype, b Object.getPrototypeOf(f); a b; //false f.prototype输出Object {constructor: function}&#xff0c;是f的实例对象的原型&#xff08;实例对象就是…...

四川城乡建设部网站首页/全球网络营销公司排行榜

删除文件&#xff1a;del &#xff08;deldelete 命令erase与del一样的效果.&#xff09; D:\>del /?删除一个或数个文件。DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] namesERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names names 指定一个或数个文件或目…...

专业建站公司服务/关键词排名提升工具

这是一个基于MVCDAO的留言管理系统&#xff0c;包含增删改查&#xff0c;其中查询&#xff0c;有全部查询和按关键字进行模糊查询的功能。文章底部附件是源码程序。大家共同学习&#xff0c;共同进步。具体如下&#xff1a; NoteDAO.java package cn.mldn.lxh.note.dao ;import…...

广州做网站怎么样/seo成功案例分析

STL 故名思意标准模板库&#xff08;Standard Template Library&#xff09; #include <bits/stdc.h> //万能头文件常见使用方式&#xff1a; pair pair 是 一种模版类型。每个pair 可以存储两个值。这两种值无限制。也可以将自己写的struct的对象放进去。&#xff08;…...