LoadableTransportInfo函数分析之RPCRT4!LOADABLE_TRANSPORT::LOADABLE_TRANSPORT初始化过程

news2025/4/18 9:09:04

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

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

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

相关文章

蓝宝石狼组织升级攻击工具包,利用新型紫水晶窃密软件瞄准能源企业

网络安全专家发现,被称为"蓝宝石狼"(Sapphire Werewolf)的威胁组织正在使用升级版"紫水晶"(Amethyst)窃密软件,对能源行业企业发起复杂攻击活动。此次攻击标志着该组织能力显著提升&am…

关于我的服务器

最近我买了台腾讯云服务器,然后新手小白只会用宝塔。。。 安装完之后默认的端口是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题】完整版+代码+结果

# 问题一&#xff1a;随机森林回归from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 问题二&#xff1a;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 安装 可参考:

JWT令牌:实现安全会话跟踪与登录认证的利器

摘要&#xff1a;本文深入探讨了JWT令牌在实现会话跟踪和登录认证方面的应用&#xff0c;详细介绍了JWT令牌的概念、组成、生成与校验方法&#xff0c;以及在实际案例中如何通过JWT令牌进行会话跟踪和登录认证的具体实现步骤&#xff0c;为系统的安全认证机制提供了全面且深入的…

springboot+tabula解析pdf中的表格数据

场景 在日常业务需求中&#xff0c;往往会遇到解析pdf数据获取文本的需求&#xff0c;常见的做法是使用 pdfbox 来做&#xff0c;但是它只适合做一些简单的段落文本解析&#xff0c;无法处理表格这种复杂类型&#xff0c;因为单元格中的文本有换行的情况&#xff0c;无法对应到…

阿里FPGA XCKU3P开箱- 25G 光纤

阿里FPGA XCKU3P开箱 - Hello-FPGA - 博客园 25G 光纤 板子有2个SFP的光纤接口&#xff0c;最大支持25G速率&#xff0c;使用ibert 进行验证&#xff0c;SFP在BANK227的GTY 接口。 ibert 配置如下&#xff1a; 测试 测试符合预期&#xff0c;确认了SFP的具体位置 和 支持的速…

.NET Core DI(依赖注入)的生命周期及应用场景

在.NET中&#xff0c;依赖注入&#xff08;DI&#xff0c;Dependency Injection&#xff09;是一种设计模式&#xff0c;它通过将依赖关系注入到类中&#xff0c;而不是让类自己创建依赖项&#xff0c;来降低类之间的耦合度。这使得代码更加模块化、灵活和易于测试。在.NET中&a…

新技术学习方法

新技术学习方法 学习新技术的路线需要结合系统性规划与实践验证&#xff0c;以下是基于行业经验和学习科学整理的高效路径框架&#xff0c;适用于编程语言、开发框架、前沿技术等领域&#xff1a; 一、明确学习目标与动机&#xff08;战略层&#xff09; 场景化需求分析 明确…

内网dns权威域名服务器搭建

目录 一、背景 二、dns简介 1、dns服务器类型 1、缓存域名服务器 2、主域名服务器 3、从域名服务器 2、dns解析过程 1、递归查询 2、迭代查询&#xff1a; 3、dns服务器类型 1、根域名服务器 2、顶级域名服务器 顶级域名可分为两类 顶级域名服务器的重要性体现在…

爱普生SG2520VGN差分晶振5G基站的时钟解决方案

在 5G 通信时代&#xff0c;数据流量呈爆发式增长&#xff0c;5G 基站作为信号的核心中转枢纽&#xff0c;承载着前所未有的数据传输与处理重任。从海量的物联网设备连接&#xff0c;到高速移动用户的数据交互&#xff0c;每一个环节都对基站的性能提出了严苛要求。而精准稳定的…

Linux中设置文件开机自启

###方法有很多&#xff0c;这里只分享一个systemd的方法 1.创建service文件 在/etc/systemd/system/下创建&#xff0c;自己命名&#xff0c;后缀是.service 创建方式有两种&#xff1a; 进入/etc/systemd/system创建&#xff0c;创建后使用sudo vim编辑使用sudo nano /etc/…

AWTK-MVVM 如何让多个View复用一个Model记录+关于app_conf的踩坑

前言 有这么一个业务&#xff0c;主界面点击应用窗口进入声纳显示界面&#xff0c;声纳显示界面再通过按钮进入菜单界面&#xff0c;菜单界面有很多关于该声纳显示界面的设置项&#xff0c;比如量程&#xff0c;增益&#xff0c;时间显示&#xff0c;亮度&#xff0c;对比度等…

kotlin音乐之自定义唱片组件(简单版本)

代码地址 import android.animation.ObjectAnimator import android.animation.ValueAnimator import android.content.Context import android.os.Binder import android.util.AttributeSet import android.view.animation.LinearInterpolator import androidx.appcompat.widg…

Redis 版本变更的变化

Redis 版本变更的变化 以下是 Redis 主要版本的清单及其核心功能变化的梳理&#xff0c;按时间顺序整理关键版本演进 8版本没有整理&#xff1a; Redis 1.0 (2009) 初始版本&#xff1a;发布首个稳定版本&#xff0c;支持基本键值存储。 核心特性&#xff1a; 支持字符串&…

文本纠错WPS插件:提升文档质量的利器

文本纠错WPS插件&#xff1a;提升文档质量的利器 引言 在数字化办公日益普及的今天&#xff0c;文档的质量直接影响到我们的工作效率和形象。一个错别字或标点错误&#xff0c;可能就会让我们的专业形象大打折扣。今天&#xff0c;我要向大家介绍一款强大的WPS插件——文本纠…

多光谱相机与高光谱相机的区别

多光谱相机与高光谱相机均属于光谱成像设备&#xff0c;但两者在‌光谱分辨率、波段数量、数据维度及应用场景‌上存在显著差异。以下是详细的对比分析&#xff1a; ‌一、核心差异对比 二、工作原理差异‌ ‌多光谱相机‌ ‌波段选择‌&#xff1a;根据目标物特性‌预设特定…

MVCC详细介绍及面试题

目录 1.什么是mvcc&#xff1f; 2.问题引入 3. MVCC实现原理&#xff1f; 3.1 隐藏字段 3.2 undo log 日志 3.2.1 undo log版本链 3.3 readview 3.3.1 当前读 ​编辑 3.3.2 快照读 3.3.3 ReadView中4个核心字段 3.3.4 版本数据链访问的规则&#xff08;了解&#x…