KAPC的前世今生--(下)下RPCRT4!NMP_SyncSendRecv函數分析

第一部分:nt!KiDeliverApc函數調用nt!IopCompleteRequest函數后準備返回
1: kd> kv
?# ChildEBP RetAddr? Args to Child???????????? ?
00 ba3eec18 80a3c83b 896e4e40 ba3eec64 ba3eec58 nt!IopCompleteRequest+0x3a3 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\io\iomgr\internal.c @ 1568]
01 ba3eec68 80a44106 00000000 00000000 00000000 nt!KiDeliverApc+0xc5 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ke\apcsup.c @ 283]
02 ba3eecac 80a35ea9 00000000 00000000 00000001 nt!KiSwapThread+0x642 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\ke\thredsup.c @ 2004]
03 ba3eece0 80d1f189 894e9800 00000006 ba3eed01 nt!KeWaitForSingleObject+0x2d7 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ke\wait.c @ 1161]
04 ba3eed44 80afbcb2 00000255 00000000 00000000 nt!NtWaitForSingleObject+0xcd (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ob\obwait.c @ 402]
05 ba3eed44 7ffe0304 00000255 00000000 00000000 nt!_KiSystemService+0x13f (FPO: [0,3] TrapFrame @ ba3eed64) (CONV: cdecl) [d:\srv03rtm\base\ntos\ke\i386\trap.asm @ 1328]
06 0006f5e4 77f2fbc8 77e64045 00000255 00000000 SharedUserData!SystemCallStub+0x4 (FPO: [0,0,0])
07 0006f5e8 77e64045 00000255 00000000 00000000 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0]) [d:\srv03rtm\base\ntdll\daytona\obj\i386\usrstubs.asm @ 2371]
08 0006f658 77c6f002 00000255 ffffffff 00000000 kernel32!WaitForSingleObjectEx+0xac (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\win32\client\synch.c @ 1237]
09 0006f678 77c6f1bb 006c1a00 00000000 ffffffff RPCRT4!UTIL_WaitForSyncIO+0x1f (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\com\rpc\runtime\trans\common\util.cxx @ 233]
0a 0006f69c 77c727d8 006c19cc 006c1a00 0006f6c4 RPCRT4!UTIL_GetOverlappedResultEx+0xbf (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\com\rpc\runtime\trans\common\util.cxx @ 370]
0b 0006f6c8 77bf4f4b 000003e5 00000050 006c12b8 RPCRT4!NMP_SyncSendRecv+0xd5 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\com\rpc\runtime\trans\common\nptrans.cxx @ 1995]
0c 0006f6f4 77bf53ce 006dadd0 00000000 00000050 RPCRT4!OSF_CCONNECTION::TransSendReceive+0xb9 (FPO: [Non-Fpo]) (CONV: thiscall) [d:\srv03rtm\com\rpc\runtime\mtrt\osfclnt.cxx @ 3365]
0d 0006f77c 77bf5c76 006c12b8 006c1a90 00000001 RPCRT4!OSF_CCONNECTION::SendFragment+0x32c (FPO: [Non-Fpo]) (CONV: thiscall) [d:\srv03rtm\com\rpc\runtime\mtrt\osfclnt.cxx @ 6012]
0e 0006f7d4 77bfc0ca 00000000 ffffffff 0006f818 RPCRT4!OSF_CCALL::SendNextFragment+0x29b (FPO: [Non-Fpo]) (CONV: thiscall) [d:\srv03rtm\com\rpc\runtime\mtrt\osfclnt.cxx @ 9631]
0f 0006f81c 77bfc397 0006f8b8 0006f860 000006bf RPCRT4!OSF_CCALL::FastSendReceive+0x162 (FPO: [Non-Fpo]) (CONV: thiscall) [d:\srv03rtm\com\rpc\runtime\mtrt\osfclnt.cxx @ 8222]
10 0006f83c 77bfcbac 0006f8b8 0006f860 77e47889 RPCRT4!OSF_CCALL::SendReceiveHelper+0xe1 (FPO: [Non-Fpo]) (CONV: thiscall) [d:\srv03rtm\com\rpc\runtime\mtrt\osfclnt.cxx @ 8539]
11 0006f868 77bf1ca2 006c12d0 0006f8e4 0006f8b8 RPCRT4!OSF_CCALL::SendReceive+0x4c (FPO: [Non-Fpo]) (CONV: thiscall) [d:\srv03rtm\com\rpc\runtime\mtrt\osfclnt.cxx @ 8603]
12 0006f884 77c3f764 0006f8b8 77d80220 0006fc8c RPCRT4!I_RpcSendReceive+0xba (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\com\rpc\runtime\mtrt\msgapi.cxx @ 79]
13 0006f89c 77c7ed10 0006f8e4 006c1308 000b5378 RPCRT4!NdrSendReceive+0x47 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\com\rpc\ndr20\auxilary.cxx @ 1269]
14 0006fc6c 77dc194a 77d80220 77d7f61c 0006fc8c RPCRT4!NdrClientCall2+0x1f7 (FPO: [Non-Fpo]) (CONV: cdecl) [d:\srv03rtm\com\rpc\ndr20\cltcall.cxx @ 1033]
15 0006fc84 77dbec35 006dab50 0006fd8c 00008000 ADVAPI32!ROpenServiceW+0x17 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\screg\sc\client\svcctl_c.c @ 399]
16 0006fccc 77dc10f1 006dab50 0006fd8c 00008000 ADVAPI32!OpenServiceW+0x26 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\screg\sc\client\scwrap.cxx @ 723]
17 0006fd4c 77dc16c1 00000298 0006fd78 00000216 ADVAPI32!ScDispatcherLoop+0x17e (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\screg\sc\client\scapi.cxx @ 910]
18 0006ffac 01003221 00084d00 00000000 00000000 ADVAPI32!StartServiceCtrlDispatcherW+0x121 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\screg\sc\client\scapi.cxx @ 705]
19 0006ffc0 77e62c34 00000000 00000000 7ffdf000 svchost!wmainCRTStartup+0xa2 (FPO: [0,0,3]) (CONV: stdcall) [d:\srv03rtm\base\screg\sc\svchost\svchost.c @ 1369]
1a 0006fff0 00000000 0100317f 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\win32\client\support.c @ 580]

RPC_STATUS
RPC_ENTRY
NMP_SyncSendRecv(
??? IN RPC_TRANSPORT_CONNECTION ThisConnection,
??? IN UINT InputBufferSize,
??? IN BUFFER InputBuffer,
??? OUT PUINT pOutputBufferSize,
??? OUT BUFFER *pOutputBuffer
??? )
{

?? b = TransactNamedPipe(p->Conn.Handle,
????????????????????????? InputBuffer,
????????????????????????? InputBufferSize,
????????????????????????? p->pReadBuffer,
????????????????????????? bytes,
????????????????????????? &bytes,
????????????????????????? &p->Read.ol
????????????????????????? );


??? if (!b)
??????? {
??????? status = GetLastError();
??????? if (status == ERROR_IO_PENDING)
??????????? {
??????????? status = UTIL_GetOverlappedResult(p,
????????????????????????????????????????????? &p->Read.ol,
????????????????????????????????????????????? &bytes);
??????????? }
??????? else
??????????? {
??????????? ASSERT(status != RPC_S_OK);
??????????? }
??????? }
??? else
??????? {
??????? status = RPC_S_OK;
??????? }

??? if (status == RPC_S_OK)
??????? {
??????? // Success - got the whole reply in the transact

??????? *pOutputBuffer = p->pReadBuffer;
??????? p->pReadBuffer = 0;
??????? *pOutputBufferSize = bytes;

??????? ASSERT(bytes == MessageLength((PCONN_RPC_HEADER)*pOutputBuffer));

??????? return(RPC_S_OK);
??????? }


第二部分:設置事件

1: kd> dv
???????? Object = 0x894e9800
???? WaitReason = UserRequest (0n6)
?????? WaitMode = 0n1 ''
????? Alertable = 0x00 ''
??????? Timeout = 0x00000000
??????? DueTime = {-5026319169582360600}
??? CurrentPrcb = 0xf7737120
?? OriginalTime = 0x00000000
?StackSwappable = 1
??????? NewTime = {-2207181079913080607}
1: kd> dt KMUTANT 0x894e9800
GDI32!KMUTANT
?? +0x000 Header?????????? : _DISPATCHER_HEADER
?? +0x010 MutantListEntry? : _LIST_ENTRY [ 0xa060006 - 0x20646156 ]
?? +0x018 OwnerThread????? : 0x89784b8b _KTHREAD
?? +0x01c Abandoned??????? : 0x90 ''
?? +0x01d ApcDisable?????? : 0xe2 ''
1: kd> dx -id 0,0,89838358 -r1 (*((GDI32!_DISPATCHER_HEADER *)0x894e9800))
(*((GDI32!_DISPATCHER_HEADER *)0x894e9800))???????????????? [Type: _DISPATCHER_HEADER]
??? [+0x000] Type???????????? : 0x0 [Type: unsigned char]
??? [+0x001] Absolute???????? : 0x0 [Type: unsigned char]
??? [+0x002] Size???????????? : 0x4 [Type: unsigned char]
??? [+0x003] Inserted???????? : 0x0 [Type: unsigned char]
??? [+0x003] DebugActive????? : 0x0 [Type: unsigned char]
??? [+0x000] Lock???????????? : 262144 [Type: long]
??? [+0x004] SignalState????? : 1 [Type: long]
??? [+0x008] WaitListHead???? [Type: _LIST_ENTRY]
1: kd> dx -id 0,0,89838358 -r1 (*((GDI32!_LIST_ENTRY *)0x894e9808))
(*((GDI32!_LIST_ENTRY *)0x894e9808))???????????????? [Type: _LIST_ENTRY]
??? [+0x000] Flink??????????? : 0x894e9808 [Type: _LIST_ENTRY *]
??? [+0x004] Blink??????????? : 0x894e9808 [Type: _LIST_ENTRY *]


typedef enum _KOBJECTS {
??? EventNotificationObject = 0,
??? EventSynchronizationObject = 1,
??? MutantObject = 2,


第三部分:返回到nt!KeWaitForSingleObject函數后


NTSTATUS
KeWaitForSingleObject (
??? IN PVOID Object,
??? IN KWAIT_REASON WaitReason,
??? IN KPROCESSOR_MODE WaitMode,
??? IN BOOLEAN Alertable,
??? IN PLARGE_INTEGER Timeout OPTIONAL
??? )

{
??????????? //
??????????? // If the signal state is greater than zero, then satisfy the wait.
??????????? //

??????????? } else if (Objectx->Header.SignalState > 0) {
??????????????? KiWaitSatisfyOther(Objectx);
??????????????? WaitStatus = (NTSTATUS)(0);
??????????????? goto NoWait;?? ??? ?//等待事件對象有信號了
??????????? }


#define KiWaitSatisfyOther(_Object_) {?????????????????????????????????????? \
??? if (((_Object_)->Header.Type & DISPATCHER_OBJECT_TYPE_MASK) == EventSynchronizationObject) { \
??????? (_Object_)->Header.SignalState = 0;????????????????????????????????? \
???????????????????????????????????????????????????????????????????????????? \
??? } else if ((_Object_)->Header.Type == SemaphoreObject) {???????????????? \
??????? (_Object_)->Header.SignalState -= 1;???????????????????????????????? \
???????????????????????????????????????????????????????????????????????????? \
??? }??????????????????????????????????????????????????????????????????????? \
}


??????????? InsertTailList(&Objectx->Header.WaitListHead, &WaitBlock->WaitListEntry);


??????????? KiSetContextSwapBusy(Thread);
??????????? KiUnlockDispatcherDatabaseFromSynchLevel();
??????????? WaitStatus = (NTSTATUS)KiSwapThread(Thread, CurrentPrcb);


第四部分:客戶端調用nt!KiUnwaitThread函數里面會調用KiUnlinkThread函數脫鏈


1: kd> kv 4
?# ChildEBP RetAddr? Args to Child???????????? ?
00 f794abbc 80a3cc41 00000001 896e4e40 896e4e40 nt!KiUnwaitThread+0x7 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\ke\waitsup.c @ 158]
01 f794abe0 80a3758e 896e4e00 00000000 00000000 nt!KiInsertQueueApc+0x1a9 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\ke\apcsup.c @ 602]
02 f794abfc 80a26c44 896e4e40 895a7ca8 00000000 nt!KeInsertQueueApc+0x80 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ke\apcobj.c @ 302]
03 f794ac30 baaf531e 895a5038 8979ef68 00000000 nt!IopfCompleteRequest+0x244 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\io\iomgr\iosubs.c @ 3688]

1: kd> dt kTHREAD 89510898
ntdll!KTHREAD
?? +0x000 Header?????????? : _DISPATCHER_HEADER
?? +0x010 MutantListHead?? : _LIST_ENTRY [ 0x895108a8 - 0x895108a8 ]
?? +0x018 InitialStack???? : 0xba3ef000 Void
?? +0x01c StackLimit?????? : 0xba3eb000 Void
?? +0x020 KernelStack????? : 0xba3eec5c Void
?? +0x024 ThreadLock?????? : 0
?? +0x028 ContextSwitches? : 0xa1
?? +0x02c State??????????? : 0x2 ''

?? +0x054 WaitBlockList??? : 0x89510938 _KWAIT_BLOCK

1: kd> dx -id 0,0,89838358 -r1 ((ntdll!_KWAIT_BLOCK *)0x89510938)
((ntdll!_KWAIT_BLOCK *)0x89510938)???????????????? : 0x89510938 [Type: _KWAIT_BLOCK *]
??? [+0x000] WaitListEntry??? [Type: _LIST_ENTRY]
??? [+0x008] Thread?????????? : 0x89510898 [Type: _KTHREAD *]
??? [+0x00c] Object?????????? : 0x894e9800 [Type: void *]
??? [+0x010] NextWaitBlock??? : 0x89510938 [Type: _KWAIT_BLOCK *]?? ??? ?NextWaitBlock??? : 0x89510938
??? [+0x014] WaitKey????????? : 0x0 [Type: unsigned short]
??? [+0x016] WaitType???????? : 0x1 [Type: unsigned short]

VOID
FASTCALL
KiUnwaitThread (
??? IN PRKTHREAD Thread,
??? IN LONG_PTR WaitStatus,
??? IN KPRIORITY Increment
??? )
{

??? //
??? // Unlink thread from the appropriate wait queues and set the wait
??? // completion status.
??? //

??? KiUnlinkThread(Thread, WaitStatus);

??? //
??? // Set unwait priority adjustment parameters.
??? //

??? ASSERT(Increment >= 0);

??? Thread->AdjustIncrement = (SCHAR)Increment;
??? Thread->AdjustReason = (UCHAR)AdjustUnwait;

??? //
??? // Ready the thread for execution.
??? //

??? KiReadyThread(Thread);
??? return;
}


FORCEINLINE
VOID
FASTCALL
KiUnlinkThread (
??? IN PRKTHREAD Thread,
??? IN LONG_PTR WaitStatus
??? )
{

??? PKQUEUE Queue;
??? PKTIMER Timer;
??? PRKWAIT_BLOCK WaitBlock;

??? //
??? // Set wait completion status, remove wait blocks from object wait
??? // lists, and remove thread from wait list.
??? //

??? Thread->WaitStatus |= WaitStatus;
??? WaitBlock = Thread->WaitBlockList;
??? do {
??????? RemoveEntryList(&WaitBlock->WaitListEntry);


第五部分:什么時候設置事件為有信號狀態?

1: kd> dt _irp 0x896e4e40-40
GDI32!_IRP
?? +0x000 Type???????????? : 0n6
?? +0x002 Size???????????? : 0x94
?? +0x004 MdlAddress?????? : (null)
?? +0x008 Flags??????????? : 0x870
?? +0x00c AssociatedIrp??? : __unnamed
?? +0x010 ThreadListEntry? : _LIST_ENTRY [ 0x89510ab0 - 0x89510ab0 ]
?? +0x018 IoStatus???????? : _IO_STATUS_BLOCK
?? +0x020 RequestorMode??? : 1 ''
?? +0x021 PendingReturned? : 0x1 ''
?? +0x022 StackCount?????? : 1 ''
?? +0x023 CurrentLocation? : 3 ''
?? +0x024 Cancel?????????? : 0 ''
?? +0x025 CancelIrql?????? : 0 ''
?? +0x026 ApcEnvironment?? : 0 ''
?? +0x027 AllocationFlags? : 0xc ''
?? +0x028 UserIosb???????? : 0x006c1a00 _IO_STATUS_BLOCK
?? +0x02c UserEvent??????? : 0x894e9800 _KEVENT?? ??? ??? ?UserEvent??????? : 0x894e9800

VOID
IopCompleteRequest(
??? IN PKAPC Apc,
??? IN PKNORMAL_ROUTINE *NormalRoutine,
??? IN PVOID *NormalContext,
??? IN PVOID *SystemArgument1,
??? IN PVOID *SystemArgument2
??? )
{

??????? if (irp->UserEvent) {
??????????? (VOID) KeSetEvent( irp->UserEvent, 0, FALSE );


00 nt!IopCompleteRequest
01 nt!KiDeliverApc
02 nt!KiSwapThread
03 nt!KeWaitForSingleObject
04 nt!NtWaitForSingleObject
05 nt!_KiSystemService
06 SharedUserData!SystemCallStub
07 ntdll!NtWaitForSingleObject
08 kernel32!WaitForSingleObjectEx
09 RPCRT4!UTIL_WaitForSyncIO
0a RPCRT4!UTIL_GetOverlappedResultEx
0b RPCRT4!NMP_SyncSendRecv


1: kd> dt kTHREAD 89510898
ntdll!KTHREAD
?? +0x000 Header?????????? : _DISPATCHER_HEADER
?? +0x010 MutantListHead?? : _LIST_ENTRY [ 0x895108a8 - 0x895108a8 ]
?? +0x018 InitialStack???? : 0xba3ef000 Void
?? +0x01c StackLimit?????? : 0xba3eb000 Void
?? +0x020 KernelStack????? : 0xba3eec5c Void
?? +0x024 ThreadLock?????? : 0
?? +0x028 ContextSwitches? : 0xa1
?? +0x02c State??????????? : 0x2 ''

?? +0x054 WaitBlockList??? : 0x89510938 _KWAIT_BLOCK
?
1: kd> dx -id 0,0,89838358 -r1 ((ntdll!_KWAIT_BLOCK *)0x89510938)
((ntdll!_KWAIT_BLOCK *)0x89510938)???????????????? : 0x89510938 [Type: _KWAIT_BLOCK *]
??? [+0x000] WaitListEntry??? [Type: _LIST_ENTRY]
??? [+0x008] Thread?????????? : 0x89510898 [Type: _KTHREAD *]
??? [+0x00c] Object?????????? : 0x894e9800 [Type: void *]?? ??? ??? ?//Object?????????? : 0x894e9800
??? [+0x010] NextWaitBlock??? : 0x89510938 [Type: _KWAIT_BLOCK *]
??? [+0x014] WaitKey????????? : 0x0 [Type: unsigned short]
??? [+0x016] WaitType???????? : 0x1 [Type: unsigned short]

第六部分:
??? if (status == RPC_S_OK)
??????? {
??????? // Success - got the whole reply in the transact

??????? *pOutputBuffer = p->pReadBuffer;
??????? p->pReadBuffer = 0;
??????? *pOutputBufferSize = bytes;

??????? ASSERT(bytes == MessageLength((PCONN_RPC_HEADER)*pOutputBuffer));

??????? return(RPC_S_OK);
??????? }

1: kd> dt NMP_CONNECTION 006c19cc
RPCRT4!NMP_CONNECTION
?? +0x000 __VFN_table : 0x77bed498
?? +0x004 type???????????? : 0
?? +0x008 id?????????????? : 0n3
?? +0x00c fAborted???????? : 0n0
?? +0x010 ObjectList?????? : _LIST_ENTRY [ 0xbaadf00d - 0xbaadf00d ]
?? +0x018 Conn???????????? : BASE_CONNECTION::__unnamed
?? +0x01c StartingWriteIo? : 0n0
?? +0x020 StartingReadIo?? : 0n0
?? +0x024 iPostSize??????? : 0x400
?? +0x028 maxReadBuffer??? : 0x400
?? +0x02c iLastRead??????? : 0
?? +0x030 Read???????????? : BASE_OVERLAPPED
?? +0x04c pReadBuffer????? : 0x006c1408? "???"
?? +0x050 pAddress???????? : (null)
1: kd> dd 0x006c1408
006c1408? 03020005 00000010 00000030 0000005d
006c1418? 00000018 00000000 00000000 e160751f
006c1428? 45e3ef7f 690413a0 b8ade145 00000000
006c1438? 8a885d04 11c91ceb 0008e89f 6048102b
006c1448? 00000002 0054004e 00410020 00540055
006c1458? 004f0048 00490052 00590054 00000000
006c1468? 00000001 05000000 00000001 000b4ee8
006c1478? 00000001 00000001 000e000c 000b4efc

1: kd> dt rpcconn_common 0x006c1408
RPCRT4!rpcconn_common
?? +0x000 rpc_vers???????? : 0x5 ''
?? +0x001 rpc_vers_minor?? : 0 ''
?? +0x002 PTYPE??????????? : 0x2 ''
?? +0x003 pfc_flags??????? : 0x3 ''
?? +0x004 drep???????????? : [4]? "???"
?? +0x008 frag_length????? : 0x30
?? +0x00a auth_length????? : 0
?? +0x00c call_id????????? : 0x5d

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74583.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74583.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解C++引用:從基礎到現代編程實踐

一、引用的本質與基本特性 1.1 引用定義 引用是為現有變量創建的別名,通過&符號聲明。其核心特點: 必須初始化且不能重新綁定 與被引用變量共享內存地址 無獨立存儲空間(編譯器實現) 類型必須嚴格匹配 int value 42; in…

嵌入式Linux開發環境搭建,三種方式:虛擬機、物理機、WSL

目錄 總結寫前面一、Linux虛擬機1 安裝VMware、ubuntu18.042 換源3 改中文4 中文輸入法5 永不息屏6 設置 root 密碼7 安裝 terminator8 安裝 htop(升級版top)9 安裝 Vim10 靜態IP-虛擬機ubuntu11 安裝 ssh12 安裝 MobaXterm (SSH)…

軟件工程面試題(二十七)

1、j a v a 對象初始化順序 1.類的初始化(initialization class & interface) 2.對象的創建(creation of new class instances) 順序:應為類的加載肯定是第一步的,所以類的初始化在前。大體的初始化順序是: 類初始化 -> 子類構造函數 -> 父類構造函數 -&g…

《AI大模型開發筆記》MCP快速入門實戰(一)

目錄 1. MCP入門介紹 2. Function calling技術回顧 3. 大模型Agent開發技術體系回顧 二、 MCP客戶端Client開發流程 1. uv工具入門使用指南 1.1 uv入門介紹 1.2 uv安裝流程 1.3 uv的基本用法介紹 2.MCP極簡客戶端搭建流程 2.1 創建 MCP 客戶端項目 2.2 創建MCP客戶端…

Java中的正則表達式Lambda表達式

正則表達式&&Lambda表達式 正則表達式和Lambda表達式是Java編程中兩個非常實用的特性。正則表達式用于字符串匹配與處理,而Lambda表達式則讓函數式編程在Java中變得更加簡潔。本文將介紹它們的基本用法,并結合示例代碼幫助理解。同時要注意&…

Talend API Tester

背景 工作中有時會需要調測http接口,postman無疑是最常用最流行的工具,但是有一個致命問題,必須要登錄,而工作經常是私網環境,導致使用非常不方便。因此想找一個Windows系統上的輕量級、無需登錄即可使用的http測試工…

leetcode數組-移除元素

題目 題目鏈接:https://leetcode.cn/problems/remove-element/ 給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等于 val 的元素。元素的順序可能發生改變。然后返回 nums 中與 val 不同的元素的數量。 假設 nums 中不等于 val 的元素數量為…

什么是市盈率,通俗解釋清楚

市盈率就是“股價和公司盈利能力”的一個比例關系,簡單來說,就是你花多少錢買股票,要等多少年才能通過公司賺的錢“回本”。 假設你買了一家公司的股票,花了100塊錢,這家公司每年能賺10塊錢。那市盈率就是100除以10&am…

突破傳統認知:聚類算法的底層邏輯與高階應用全景解析

一、維度革命:重新定義聚類分析的認知邊界 在人工智能的浩瀚星空中,聚類算法猶如一組精密的星際導航儀,幫助我們在無序的數據宇宙中發現隱藏的秩序。這項起源于人類本能分類需求的技術,經歷了從簡單分組到智能識別的蛻變&#xf…

【愚公系列】《高效使用DeepSeek》051-產品創新研發

??【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】?? ??開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! ?? 江湖人稱"愚公搬代碼",用七年如一日的精神深耕技術領域,以"…

網絡編程—Socket套接字(UDP)

上篇文章: 網絡編程—網絡概念https://blog.csdn.net/sniper_fandc/article/details/146923380?fromshareblogdetail&sharetypeblogdetail&sharerId146923380&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目錄 1 概念 2 Soc…

深度學習deeplearn1

import torch # 導入 PyTorch 庫,PyTorch 是一個用于深度學習和張量計算的強大庫x torch.arange(12) # 創建一個包含從 0 到 11 的整數的一維張量 x # torch.arange 函數用于生成一個指定范圍的整數序列print(x) # 打印張量 x 的內容print(x.shape) # 打印張量 x 的…

無線通信技術(三):5G NR通信頻帶劃分與應用場景

目錄 一.5G NR頻帶劃分概述 二.全球運營商5G頻帶分配對比 三.5G頻帶的應用場景 5G網絡的發展離不開頻譜資源的合理分配。不同的頻段決定了5G的覆蓋范圍、傳輸速率和應用場景。本文將系統介紹5G NR頻帶劃分,并結合實際應用場景,理解不同頻段的特性及其適用環境。 …

觀察者模式在Java單體服務中的運用

觀察者模式主要用于當一個對象發生改變時,其關聯的所有對象都會收到通知,屬于事件驅動類型的設計模式,可以對事件進行監聽和響應。下面簡單介紹下它的使用: 1 定義事件 import org.springframework.context.ApplicationEvent;pu…

YOLO 獲取 COCO 指標終極指南 | 從標簽轉換到 COCOAPI 評估 (訓練/驗證) 全覆蓋【B 站教程詳解】

? YOLO 輕松獲取論文 COCO 指標:AP(small,medium,large )| 從標簽轉換到 COCOAPI 評估 (訓練/驗證) 全覆蓋 文章目錄 一、摘要二、為什么需要 COCO 指標評估 YOLO 模型?三、核心挑戰與解決方案 (視頻教程核…

[C/C++]文件輸入輸出

C style FILE * fileptr filename"C:\\file.txt" fopenfclosefprintfC style //指向std::ostream的指針 #include <iostream> #include <fstream>int main() {std::ostream* output &std::cout; // 默認指向控制臺// 輸出到控制臺*output <&l…

【Android】界面布局-線性布局-例子

線性布局&#xff08;LinearLayout&#xff09;是一種重要的界面布局中&#xff0c;也是經常使用到的一種界面布局 ? 在線性布局中&#xff0c;所有的子元素都按照垂直或水平的順序在界面上排列 ?如果垂直排列&#xff0c;則每行僅包含一個界面元素 ?如果水平排列&…

HTML表單屬性1

value 屬性 value 設置輸入字段的初始值&#xff08;默認值&#xff09;,提交表單時&#xff0c;如果用戶未做修改&#xff0c;將發送value中的默認值 <form action"#">First name: <br><input type"text" name"firstname" val…

JavaScrip圖標工具Chart.js之 氣泡圖

氣泡圖用于展示三個變量之間的關系。 氣泡的位置由前兩個變量決定&#xff0c;對應的是 X 軸和 Y 軸&#xff0c;第三個參數為氣泡的大小。 {// X 軸對應值x: number,// Y 軸對應值y: number,// 氣泡半徑&#xff0c;單位為像素r: number } 泡圖的 type 屬性為 bubble &#xf…

Git 教程:從 0 到 1 全面指南 教程【全文三萬字保姆級詳細講解】

目錄 什么是 Git &#xff1f; Git 與 SVN 區別 Git 安裝配置 Linux 平臺上安裝 Centos/RedHat 源碼安裝 Windows 平臺上安裝 使用 winget 工具 Mac 平臺上安裝 Git 配置 用戶信息 文本編輯器 差異分析工具 查看配置信息 生成 SSH 密鑰&#xff08;可選&#xf…