LoadableTransportInfo函数分析之RPCRT4!LOADABLE_TRANSPORT::LOADABLE_TRANSPORT初始化过程
LoadableTransportInfo函数分析
第一部分:
RPC_STATUS
LoadableTransportInfo (
IN RPC_CHAR * DllName,
IN RPC_CHAR PAPI * RpcProtocolSequence,
OUT TRANS_INFO * PAPI *pTransInfo
)
{
。。。。。。。
pTransportInterface = (*TransportLoad)(RpcProtocolSequence);
if ( pTransportInterface == 0 )
{
ClearGlobalMutex();
delete LoadableTransportDll;
return RPC_S_PROTSEQ_NOT_SUPPORTED;
}
if ( pTransportInterface->TransInterfaceVersion
> RPC_TRANSPORT_INTERFACE_VERSION )
{
ClearGlobalMutex();
delete LoadableTransportDll;
return RPC_S_PROTSEQ_NOT_SUPPORTED;
}
//
// When we reach here, we have successfully loaded and initialized
// the loadable transport DLL. Now we need to create the client
// loadable transport and stick it in the dictionary.
//
LoadableTransport = new LOADABLE_TRANSPORT(
pTransportInterface,
DllName,
RpcProtocolSequence,
LoadableTransportDll,
GetHandleForThread,
ReleaseHandleForThread,
&Status,
pTransInfo);
第二部分:
1: kd> kc
#
00 RPCRT4!LoadableTransportInfo
01 RPCRT4!OsfMapRpcProtocolSequence
02 RPCRT4!RPC_SERVER::UseRpcProtocolSequence
03 RPCRT4!I_RpcServerUseProtseqEp2W
04 RPCRT4!RpcServerUseProtseqEpExW
05 RPCRT4!RpcServerUseProtseqEpW
06 LSASRV!RpcpAddInterface
07 LSASRV!LsapRPCInit
08 LSASRV!LsapInitLsa
09 lsass!main
0a lsass!mainNoCRTStartup
0b kernel32!BaseProcessStart
//
// When we reach here, we have successfully loaded and initialized
// the loadable transport DLL. Now we need to create the client
// loadable transport and stick it in the dictionary.
//
LoadableTransport = new LOADABLE_TRANSPORT(
pTransportInterface,
DllName,
RpcProtocolSequence,
LoadableTransportDll,
GetHandleForThread,
ReleaseHandleForThread,
&Status,
pTransInfo);
1: kd> kc
#
00 RPCRT4!LOADABLE_TRANSPORT::LOADABLE_TRANSPORT
01 RPCRT4!LoadableTransportInfo
02 RPCRT4!OsfMapRpcProtocolSequence
03 RPCRT4!RPC_SERVER::UseRpcProtocolSequence
04 RPCRT4!I_RpcServerUseProtseqEp2W
05 RPCRT4!RpcServerUseProtseqEpExW
06 RPCRT4!RpcServerUseProtseqEpW
07 LSASRV!RpcpAddInterface
08 LSASRV!LsapRPCInit
09 LSASRV!LsapInitLsa
0a lsass!main
0b lsass!mainNoCRTStartup
0c kernel32!BaseProcessStart
1: kd> dv
this = 0x77c8376c
pTransportInterface = 0x77bece00
DllName = 0x009436a0
ProtocolSequence = 0x73304bd0
LoadableTransportDll = 0x00943700
GetHandleForThread = 0x77c661e1
ReleaseHandleForThread = 0x77c66278
Status = 0x0006fe10
TransInfo = 0x0006fe4c
1: kd> dx -id 0,0,897f4020 -r1 ((RPCRT4!RPC_TRANSPORT_INTERFACE_HEADER *)0x77bece00)
((RPCRT4!RPC_TRANSPORT_INTERFACE_HEADER *)0x77bece00) : 0x77bece00 [Type: RPC_TRANSPORT_INTERFACE_HEADER *]
[+0x000] TransInterfaceVersion : 0x2004 [Type: unsigned int]
[+0x004] TransId : 0xf [Type: unsigned short]
[+0x006] TransAddrId : 0x11 [Type: unsigned short]
[+0x008] ProtocolSequence : 0x77bd2264 : 0x6e [Type: unsigned short *]
[+0x00c] WellKnownEndpoint : 0x77becea8 : "\pipe\epmapper" [Type: char *]
[+0x010] ProcessCalls : 0x77c66ea4 [Type: long (*)(int,unsigned int *,long *,void * *,unsigned int *,void * *,void * *)]
[+0x014] PnpNotify : 0x77c66e6f [Type: void (*)()]
[+0x018] PnpListen : 0x77c66d26 [Type: void (*)()]
[+0x01c] TowerConstruct : 0x77c6b290 [Type: long (*)(char *,char *,char *,unsigned short *,unsigned long *,unsigned char * *)]
[+0x020] TowerExplode : 0x77c6b5c7 [Type: long (*)(unsigned char *,unsigned char *,unsigned long,char * *,char * *,char * *)]
[+0x024] PostEvent : 0x77c66be8 [Type: long (*)(unsigned long,void *)]
[+0x028] fDatagram : 0 [Type: int]
[+0x02c] GetNetworkAddressVector : 0x77c71869 [Type: NETWORK_ADDRESS_VECTOR * (*)(void *)]
第三部分:
*TransInfo = new TRANS_INFO(pTransportInterface,
ProtocolSequence,
this) ;
1: kd> dt TRANS_INFO
RPCRT4!TRANS_INFO
+0x000 pTransportInterface : Ptr32 RPC_TRANSPORT_INTERFACE_HEADER
+0x004 LoadableTrans : Ptr32 LOADABLE_TRANSPORT
+0x008 RpcProtocolSequence : [257] Uint2B
1: kd> dt RPCRT4!LOADABLE_TRANSPORT 00943a80
+0x000 ThreadsStarted : 0n-1163005939
+0x004 DllName : [257] 0x72
+0x208 NumThreads : 0n-1163005939
+0x20c LoadedDll : 0xbaadf00d DLL
+0x210 ProtseqDict : TRANS_INFO_DICT
+0x22c ThreadsDoingLongWait : INTERLOCKED_INTEGER
+0x230 Reserved0 : [7] 0n-1163005939
+0x24c ProcessCallsFunc : 0xbaadf00d long +ffffffffbaadf00d
+0x250 nOptimalNumberOfThreads : 0n-1163005939
+0x254 PnpListen : 0xbaadf00d void +ffffffffbaadf00d
+0x258 GetHandleForThread : 0xbaadf00d void* +ffffffffbaadf00d
+0x25c ReleaseHandleForThread : 0xbaadf00d void +ffffffffbaadf00d
+0x260 Reserved1 : [3] 0n-1163005939
+0x26c Reserved2 : [7] 0n-1163005939
+0x288 nThreadsAtCompletionPort : INTERLOCKED_INTEGER
+0x28c Reserved3 : [7] 0n-1163005939
+0x2a8 nActivityValue : 0n-1163005939
1: kd> dx -id 0,0,897f4020 -r1 (*((RPCRT4!TRANS_INFO_DICT *)0x943c90))
(*((RPCRT4!TRANS_INFO_DICT *)0x943c90)) [Type: TRANS_INFO_DICT]
[+0x000] DictSlots : 0x943c9c [Type: void * *]
[+0x004] cDictSlots : 0x4 [Type: unsigned int]
[+0x008] cDictSize : 0x0 [Type: unsigned int]
[+0x00c] InitialDictSlots [Type: void * [4]]
1: kd> dx -id 0,0,897f4020 -r1 (*((RPCRT4!void * (*)[4])0x943c9c))
(*((RPCRT4!void * (*)[4])0x943c9c)) [Type: void * [4]]
[0] : 0x0 [Type: void *]
[1] : 0x0 [Type: void *]
[2] : 0x0 [Type: void *]
[3] : 0x0 [Type: void *]
1: kd> p
RPCRT4!LOADABLE_TRANSPORT::LOADABLE_TRANSPORT+0x51:
001b:77c1905d e8b1f0ffff call RPCRT4!TRANS_INFO::TRANS_INFO (77c18113)
1: kd> t
RPCRT4!TRANS_INFO::TRANS_INFO:
001b:77c18113 55 push ebp
1: kd> kc
#
00 RPCRT4!TRANS_INFO::TRANS_INFO
01 RPCRT4!LOADABLE_TRANSPORT::LOADABLE_TRANSPORT
02 RPCRT4!LoadableTransportInfo
03 RPCRT4!OsfMapRpcProtocolSequence
04 RPCRT4!RPC_SERVER::UseRpcProtocolSequence
05 RPCRT4!I_RpcServerUseProtseqEp2W
06 RPCRT4!RpcServerUseProtseqEpExW
07 RPCRT4!RpcServerUseProtseqEpW
08 LSASRV!RpcpAddInterface
09 LSASRV!LsapRPCInit
0a LSASRV!LsapInitLsa
0b lsass!main
0c lsass!mainNoCRTStartup
0d kernel32!BaseProcessStart
inline
TRANS_INFO::TRANS_INFO (
IN RPC_TRANSPORT_INTERFACE pTransportInterface,
IN RPC_CHAR *ProtocolSeq,
IN LOADABLE_TRANSPORT *LoadableTrans
)
{
this->pTransportInterface = pTransportInterface ;
RpcpStringCopy(RpcProtocolSequence, ProtocolSeq) ;
this->LoadableTrans = LoadableTrans ;
}
1: kd> dv
this = 0x77c8376c
pTransportInterface = 0x77bece00
ProtocolSeq = 0x73304bd0
LoadableTrans = 0x00943a80
1: kd> dx -id 0,0,897f4020 -r1 ((RPCRT4!LOADABLE_TRANSPORT *)0x943a80)
((RPCRT4!LOADABLE_TRANSPORT *)0x943a80) : 0x943a80 [Type: LOADABLE_TRANSPORT *]
[+0x000] ThreadsStarted : -1163005939 [Type: long]
[+0x004] DllName [Type: unsigned short [257]]
[+0x208] NumThreads : -1163005939 [Type: long]
[+0x20c] LoadedDll : 0x943700 [Type: DLL *]
[+0x210] ProtseqDict [Type: TRANS_INFO_DICT]
[+0x22c] ThreadsDoingLongWait [Type: INTERLOCKED_INTEGER]
[+0x230] Reserved0 [Type: long [7]]
[+0x24c] ProcessCallsFunc : 0xbaadf00d [Type: long (*)(int,unsigned int *,long *,void * *,unsigned int *,void * *,void * *)]
[+0x250] nOptimalNumberOfThreads : -1163005939 [Type: long]
[+0x254] PnpListen : 0xbaadf00d [Type: void (*)()]
[+0x258] GetHandleForThread : 0xbaadf00d [Type: void * (*)()]
[+0x25c] ReleaseHandleForThread : 0xbaadf00d [Type: void (*)(void *)]
[+0x260] Reserved1 [Type: long [3]]
[+0x26c] Reserved2 [Type: long [7]]
[+0x288] nThreadsAtCompletionPort [Type: INTERLOCKED_INTEGER]
[+0x28c] Reserved3 [Type: long [7]]
[+0x2a8] nActivityValue : -1163005939 [Type: int]
第四部分:
1: kd> dv
this = 0x73304be2
pTransportInterface = 0x77bece00
DllName = 0x009436a0
ProtocolSequence = 0x73304bd0
LoadableTransportDll = 0x00943700
GetHandleForThread = 0x77c661e1
ReleaseHandleForThread = 0x77c66278
Status = 0x0006fe10
TransInfo = 0x0006fe4c
1: kd> dx -id 0,0,897f4020 -r1 ((RPCRT4!TRANS_INFO * *)0x6fe4c)
((RPCRT4!TRANS_INFO * *)0x6fe4c) : 0x6fe4c [Type: TRANS_INFO * *]
0x943d70 [Type: TRANS_INFO *]
1: kd> dx -id 0,0,897f4020 -r1 ((RPCRT4!TRANS_INFO *)0x943d70)
((RPCRT4!TRANS_INFO *)0x943d70) : 0x943d70 [Type: TRANS_INFO *]
[+0x000] pTransportInterface : 0x77bece00 [Type: RPC_TRANSPORT_INTERFACE_HEADER *]
[+0x004] LoadableTrans : 0x943a80 [Type: LOADABLE_TRANSPORT *]
[+0x008] RpcProtocolSequence [Type: unsigned short [257]]
1: kd> dx -id 0,0,897f4020 -r1 ((RPCRT4!LOADABLE_TRANSPORT *)0x943a80)
((RPCRT4!LOADABLE_TRANSPORT *)0x943a80) : 0x943a80 [Type: LOADABLE_TRANSPORT *]
[+0x000] ThreadsStarted : -1163005939 [Type: long]
[+0x004] DllName [Type: unsigned short [257]]
[+0x208] NumThreads : -1163005939 [Type: long]
[+0x20c] LoadedDll : 0x943700 [Type: DLL *]
[+0x210] ProtseqDict [Type: TRANS_INFO_DICT]
[+0x22c] ThreadsDoingLongWait [Type: INTERLOCKED_INTEGER]
[+0x230] Reserved0 [Type: long [7]]
[+0x24c] ProcessCallsFunc : 0xbaadf00d [Type: long (*)(int,unsigned int *,long *,void * *,unsigned int *,void * *,void * *)]
[+0x250] nOptimalNumberOfThreads : -1163005939 [Type: long]
[+0x254] PnpListen : 0xbaadf00d [Type: void (*)()]
[+0x258] GetHandleForThread : 0xbaadf00d [Type: void * (*)()]
[+0x25c] ReleaseHandleForThread : 0xbaadf00d [Type: void (*)(void *)]
[+0x260] Reserved1 [Type: long [3]]
[+0x26c] Reserved2 [Type: long [7]]
[+0x288] nThreadsAtCompletionPort [Type: INTERLOCKED_INTEGER]
[+0x28c] Reserved3 [Type: long [7]]
[+0x2a8] nActivityValue : -1163005939 [Type: int]
1: kd> dx -id 0,0,897f4020 -r1 (*((RPCRT4!TRANS_INFO_DICT *)0x943c90))
(*((RPCRT4!TRANS_INFO_DICT *)0x943c90)) [Type: TRANS_INFO_DICT]
[+0x000] DictSlots : 0x943c9c [Type: void * *]
[+0x004] cDictSlots : 0x4 [Type: unsigned int]
[+0x008] cDictSize : 0x0 [Type: unsigned int]
[+0x00c] InitialDictSlots [Type: void * [4]]
1: kd> dx -id 0,0,897f4020 -r1 (*((RPCRT4!void * (*)[4])0x943c9c))
(*((RPCRT4!void * (*)[4])0x943c9c)) [Type: void * [4]]
[0] : 0x0 [Type: void *]
[1] : 0x0 [Type: void *]
[2] : 0x0 [Type: void *]
[3] : 0x0 [Type: void *]
if (ProtseqDict.Insert(*TransInfo) == -1)
1: kd> dx -id 0,0,897f4020 -r1 (*((RPCRT4!void * (*)[4])0x943c9c))
(*((RPCRT4!void * (*)[4])0x943c9c)) [Type: void * [4]]
[0] : 0x943d70 [Type: void *]
[1] : 0x0 [Type: void *]
[2] : 0x0 [Type: void *]
[3] : 0x0 [Type: void *]
第五部分:
ThreadsStarted = 0;
nActivityValue = 0;
nOptimalNumberOfThreads = gNumberOfProcessors + 1;
ProcessCallsFunc = pTransportInterface->ProcessCalls;
1: kd> dt RPCRT4!LOADABLE_TRANSPORT 00943a80
+0x000 ThreadsStarted : 0n0
+0x004 DllName : [257] 0x72
+0x208 NumThreads : 0n-1163005939
+0x20c LoadedDll : 0x00943700 DLL
+0x210 ProtseqDict : TRANS_INFO_DICT
+0x22c ThreadsDoingLongWait : INTERLOCKED_INTEGER
+0x230 Reserved0 : [7] 0n-1163005939
+0x24c ProcessCallsFunc : 0x77c66ea4 long RPCRT4!COMMON_ProcessCalls+0 RPCRT4!COMMON_ProcessCalls+0
+0x250 nOptimalNumberOfThreads : 0n3
+0x254 PnpListen : 0xbaadf00d void +ffffffffbaadf00d
+0x258 GetHandleForThread : 0xbaadf00d void* +ffffffffbaadf00d
+0x25c ReleaseHandleForThread : 0xbaadf00d void +ffffffffbaadf00d
+0x260 Reserved1 : [3] 0n-1163005939
+0x26c Reserved2 : [7] 0n-1163005939
+0x288 nThreadsAtCompletionPort : INTERLOCKED_INTEGER
+0x28c Reserved3 : [7] 0n-1163005939
+0x2a8 nActivityValue : 0n0
1: kd> dt RPCRT4!LOADABLE_TRANSPORT 00943a80
+0x000 ThreadsStarted : 0n0
+0x004 DllName : [257] 0x72
+0x208 NumThreads : 0n0
+0x20c LoadedDll : 0x00943700 DLL
+0x210 ProtseqDict : TRANS_INFO_DICT
+0x22c ThreadsDoingLongWait : INTERLOCKED_INTEGER
+0x230 Reserved0 : [7] 0n-1163005939
+0x24c ProcessCallsFunc : 0x77c66ea4 long RPCRT4!COMMON_ProcessCalls+0
+0x250 nOptimalNumberOfThreads : 0n3
+0x254 PnpListen : 0x77c66d26 void RPCRT4!COMMON_ListenForPNPNotifications+0
+0x258 GetHandleForThread : 0x77c661e1 void* RPCRT4!GetCompletionPortHandleForThread+0
+0x25c ReleaseHandleForThread : 0x77c66278 void RPCRT4!ReleaseCompletionPortHandleForThread+0
+0x260 Reserved1 : [3] 0n-1163005939
+0x26c Reserved2 : [7] 0n-1163005939
+0x288 nThreadsAtCompletionPort : INTERLOCKED_INTEGER
+0x28c Reserved3 : [7] 0n-1163005939
+0x2a8 nActivityValue : 0n0
1: kd> kc
#
00 RPCRT4!LOADABLE_TRANSPORT::LOADABLE_TRANSPORT
01 RPCRT4!LoadableTransportInfo
02 RPCRT4!OsfMapRpcProtocolSequence
03 RPCRT4!RPC_SERVER::UseRpcProtocolSequence
04 RPCRT4!I_RpcServerUseProtseqEp2W
05 RPCRT4!RpcServerUseProtseqEpExW
06 RPCRT4!RpcServerUseProtseqEpW
07 LSASRV!RpcpAddInterface
08 LSASRV!LsapRPCInit
09 LSASRV!LsapInitLsa
0a lsass!main
0b lsass!mainNoCRTStartup
0c kernel32!BaseProcessStart
相关文章:
LoadableTransportInfo函数分析之RPCRT4!LOADABLE_TRANSPORT::LOADABLE_TRANSPORT初始化过程
LoadableTransportInfo函数分析 第一部分: RPC_STATUS LoadableTransportInfo ( IN RPC_CHAR * DllName, IN RPC_CHAR PAPI * RpcProtocolSequence, OUT TRANS_INFO * PAPI *pTransInfo ) { 。。。。。。。 pTransportInterface (*TransportLo…...
大模型预标注和自动化标注在OCR标注场景的应用
OCR,即光学字符识别,简单来说就是利用光学设备去捕获图像并识别文字,最终将图片中的文字转换为可编辑和可搜索的文本。在数字化时代,OCR(光学字符识别)技术作为处理图像中文字信息的关键手段,其…...
Zookeeper 命令返回数据的含义
下面详细讲解这三个 Zookeeper 命令返回数据的含义: 1. ls /path - 列出子节点 命令功能: 列出指定路径下的所有直接子节点名称(不包含孙子节点) 示例返回: [child1, child2, child3] 输出解析: 返回…...
蓝宝石狼组织升级攻击工具包,利用新型紫水晶窃密软件瞄准能源企业
网络安全专家发现,被称为"蓝宝石狼"(Sapphire Werewolf)的威胁组织正在使用升级版"紫水晶"(Amethyst)窃密软件,对能源行业企业发起复杂攻击活动。此次攻击标志着该组织能力显著提升&am…...
2025蓝桥杯python A组省赛 题解
真捐款去了,好长时间没练了,感觉脑子和手都不转悠了。 B F BF BF 赛时都写假了, G G G 也只写了爆搜。 题解其实队友都写好了,我就粘一下自己的代码,稍微提点个人的理解水一篇题解 队友题解 2025蓝桥杯C A组省赛 题…...
JMeter重要的是什么
重要特性 支持多种协议: JMeter支持对多种协议进行性能测试,包括HTTP、HTTPS、FTP、JDBC(数据库)、LDAP、JMS、SOAP、REST等。这使得它能够适应各种不同的测试场景。强大的负载模拟能力: JMeter能够模拟大量的虚拟用户…...
深入探索如何压缩 WebAssembly
一、初始体积:默认 Release 构建 我们从最基础的构建开始,不开启调试符号,仅使用默认的 release 模式: $ wc -c pkg/wasm_game_of_life_bg.wasm 29410 pkg/wasm_game_of_life_bg.wasm这是我们优化的起点 —— 29,410 字节。 二…...
浅谈SQL Server系统内核管理机制
浅谈SQL Server系统内核管理机制 应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Microsoft SQL Server 2019 - 15.0.2130.3 (X64)SQL Server Management Studio -18.6 laster 文章目录 浅谈SQL Server系统内核管理机制数据库和文件服务器管理视图系统目录…...
关于我的服务器
最近我买了台腾讯云服务器,然后新手小白只会用宝塔。。。 安装完之后默认的端口是8888,打开面板就会提示我有风险。然后 我改了端口之后,怎么都打不开。 于是 学到了几句命令可以使用: //查看端口是否已经修改成功 cat www/se…...
vue + element-plus自定义表单验证(修改密码业务)
写一个vue组件Password.vue 没有表单验证只有3个表单项 <template><div><el-form><el-form-item label"旧密码"><el-input></el-input></el-form-item><el-form-item label"新密码"><el-input>&l…...
2025年第十八届“认证杯”数学中国数学建模网络挑战赛【BC题】完整版+代码+结果
# 问题一:随机森林回归from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 问题二:LSTM时间序列预测from tensorflow.keras.models import Sequentialmodel_lstm Sequential()model…...
一、小白如何用Pygame制作一款跑酷类游戏(成品展示+添加背景图和道路移动效果)
小白如何用Pygame制作一款跑酷类游戏 文章目录 小白如何用Pygame制作一款跑酷类游戏前言一、游戏最终效果展示二、创建项目并加载pygame模块1.创建项目2.下载pygame模块3. 项目结构安排 三、添加背景图和实现道路移动效果1.引入库2.窗口设置和资源加载3.游戏主循环和程序入口4.…...
基础知识:Dify 安装
官方指南:https://docs.dify.ai/zh-hans/getting-started/install-self-hosted docker & docker-compose 安装 可参考:...
关闭谷歌浏览器(Google Chrome)的自动更新可以通过以下方法实现。具体操作步骤取决于你的操作系统。
关闭谷歌浏览器(Google Chrome)的自动更新可以通过以下方法实现。具体操作步骤取决于你的操作系统。 1. 在 Windows 上关闭 Chrome 自动更新2. 在 macOS 上关闭 Chrome 自动更新3. 在 Linux 上关闭 Chrome 自动更新4. 注意事项1. 在 Windows 上关闭 Chro…...
【MCAL】AUTOSAR架构下基于SPI通信的驱动模块详解-以TJA1145为例
目录 前言 正文 1.TJA1145驱动代码中的SPI协议设计 1.1 对SPI Driver的依赖 1.2 对SPI配置的依赖 1.2.1 SpiExternalDevice 1.2.2 Channel_x 1.2.3 Job_x 1.2.4 Sequence N 1.2.5 Sequence M 1.2.6 Sequence L 1.2.7 小结 2.基于Vector驱动代码的SPI配置 2.1 SPI引…...
如何在vue3项目中使用 AbortController取消axios请求
在 Vue3 项目中通过 AbortController 取消 Axios 请求,可以通过以下 结构化步骤 实现。我们结合组合式 API(Composition API)和现代前端实践演示: 一、基础实现(单个请求) 1. 创建组件逻辑 <script s…...
监控docker中的java应用
1)进入指定的容器 docker exec -it demo /bin/bash 2)下载curl root89a67e345354:/# apt install curl -y 3)下载arthas root89a67e345354:/# curl -O https://arthas.aliyun.com/arthas-boot.jar 4)运行 root89a67e345354:/# java -jar arthas-boot.jar 5)监控 […...
JWT令牌:实现安全会话跟踪与登录认证的利器
摘要:本文深入探讨了JWT令牌在实现会话跟踪和登录认证方面的应用,详细介绍了JWT令牌的概念、组成、生成与校验方法,以及在实际案例中如何通过JWT令牌进行会话跟踪和登录认证的具体实现步骤,为系统的安全认证机制提供了全面且深入的…...
VS 中Git 中本地提交完成,没有推送,修改的内容如何还原
在 Visual Studio 中撤销本地提交但未推送的修改,可以通过以下方法实现: 一、保留修改内容(仅撤销提交记录) 使用 git reset --soft 在 VS 的 Git 终端中执行: git reset --soft HEAD~1作用:撤销最后一次提…...
springboot+tabula解析pdf中的表格数据
场景 在日常业务需求中,往往会遇到解析pdf数据获取文本的需求,常见的做法是使用 pdfbox 来做,但是它只适合做一些简单的段落文本解析,无法处理表格这种复杂类型,因为单元格中的文本有换行的情况,无法对应到…...
Ubuntu18.04 ROS Melodic安装
环境配置:Ubuntu18.04 ROS Melodic安装_ubuntu18.04安装ros melodic-CSDN博客 1 设置安装源 为了安装ROS Melodic,首先需要在Ubuntu 18.04 LTS上添加安装源到source.list,方法如下: 国外的: sudo sh -c echo "deb http://…...
阿里FPGA XCKU3P开箱- 25G 光纤
阿里FPGA XCKU3P开箱 - Hello-FPGA - 博客园 25G 光纤 板子有2个SFP的光纤接口,最大支持25G速率,使用ibert 进行验证,SFP在BANK227的GTY 接口。 ibert 配置如下: 测试 测试符合预期,确认了SFP的具体位置 和 支持的速…...
ArrayList vs LinkedList,HashMap vs TreeMap:如何选择最适合的集合类?
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 在 Java 开发中,集合类的选择直接影响程序的性能和代码的可维护性。不同的数据结构适用于不同的场景,盲目使用可能导致内存浪费、性能…...
uniapp的h5,打开的时候,标题会一闪而过应用名称,再显示当前页面的标题
问题: 微信小程序,通过webview打开了uniapp创建的h5,但是打开h5时,会先显示h5的应用名称,然后才切换为该页面的标题。 过程: 查过很多资料,有说修改应用名称,有说设置navigationS…...
玩转Docker | 使用Docker搭建Van-Nav导航站
玩转Docker | 使用Docker搭建Van-Nav导航站 前言一、Van-Nav介绍van-nav 简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Van-Nav服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问Van-Nav应用访问Van-Nav首页登录后台管理五、添…...
Margin和Padding在WPF和CSS中的不同
CSS和WPF中 margin 与 padding 在方向上的规定基本一致,但在使用场景和一些细节上有所不同。 CSS - 方向规定: margin 和 padding 属性可以分别指定上、右、下、左四个方向的值。例如 margin:10px 20px 30px 40px; 表示上外边距为10px、右外边距为20…...
.NET Core DI(依赖注入)的生命周期及应用场景
在.NET中,依赖注入(DI,Dependency Injection)是一种设计模式,它通过将依赖关系注入到类中,而不是让类自己创建依赖项,来降低类之间的耦合度。这使得代码更加模块化、灵活和易于测试。在.NET中&a…...
新技术学习方法
新技术学习方法 学习新技术的路线需要结合系统性规划与实践验证,以下是基于行业经验和学习科学整理的高效路径框架,适用于编程语言、开发框架、前沿技术等领域: 一、明确学习目标与动机(战略层) 场景化需求分析 明确…...
内网dns权威域名服务器搭建
目录 一、背景 二、dns简介 1、dns服务器类型 1、缓存域名服务器 2、主域名服务器 3、从域名服务器 2、dns解析过程 1、递归查询 2、迭代查询: 3、dns服务器类型 1、根域名服务器 2、顶级域名服务器 顶级域名可分为两类 顶级域名服务器的重要性体现在…...
爱普生SG2520VGN差分晶振5G基站的时钟解决方案
在 5G 通信时代,数据流量呈爆发式增长,5G 基站作为信号的核心中转枢纽,承载着前所未有的数据传输与处理重任。从海量的物联网设备连接,到高速移动用户的数据交互,每一个环节都对基站的性能提出了严苛要求。而精准稳定的…...
