news 2026/4/16 11:25:36

nt!IopPnPDispatch函数分析之有对CmResourceTypeBusNumber资源类型的接口--重要

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
nt!IopPnPDispatch函数分析之有对CmResourceTypeBusNumber资源类型的接口--重要

nt!IopPnPDispatch函数分析之有对CmResourceTypeBusNumber资源类型的接口--重要
0: kd> kc
#
00 nt!IopPnPDispatch
01 nt!IofCallDriver
02 nt!IopSynchronousCall
03 nt!IopQueryResourceHandlerInterface
04 nt!IopSetupArbiterAndTranslators
05 nt!IopResourceRequirementsListToReqList
06 nt!IopAllocateBootResourcesInternal
07 nt!IopAllocateBootResources
08 nt!IopReportBootResources
09 nt!PiQueryAndAllocateBootResources
0a nt!PiProcessNewDeviceNode
0b nt!PipProcessDevNodeTree
0c nt!PipDeviceActionWorker
0d nt!PipRequestDeviceAction
0e nt!IopInitializeBootDrivers
0f nt!IoInitSystem
10 nt!Phase1Initialization
11 nt!PspSystemThreadStartup
12 nt!KiThreadStartup
0: kd> dv
DeviceObject = 0x899c5d08 Device for "\Driver\PnpManager"
Irp = 0x899c5468
information = 0x899c5d08
length = 8
uiNumber = 0xf789a0d0
id = 0x00000000
separatorCount = 0x80cb0b36
0: kd> !Irp 0x899c5468
Irp is active with 1 stacks 1 is current (= 0x899c54d8)
No Mdl: No System Buffer: Thread 899a1020: Irp stack trace.
cmd flg cl Device File Completion-Context
>[IRP_MJ_PNP(1b), IRP_MN_QUERY_INTERFACE(8)]
0 0 899c5d08 00000000 00000000-00000000
\Driver\PnpManager
Args: f789a144 00000018 e1278768 00000006


case IRP_MN_QUERY_INTERFACE:
status = Irp->IoStatus.Status;
deviceNode = (PDEVICE_NODE)DeviceObject->DeviceObjectExtension->DeviceNode;
if (deviceNode == IopRootDeviceNode) {
if ( IopCompareGuid((PVOID)irpSp->Parameters.QueryInterface.InterfaceType, (PVOID)&GUID_ARBITER_INTERFACE_STANDARD)) {
status = STATUS_SUCCESS;
arbiterInterface = (PARBITER_INTERFACE) irpSp->Parameters.QueryInterface.Interface;
arbiterInterface->ArbiterHandler = ArbArbiterHandler;
switch ((UCHAR)((ULONG_PTR)irpSp->Parameters.QueryInterface.InterfaceSpecificData)) {
case CmResourceTypePort:
arbiterInterface->Context = (PVOID) &IopRootPortArbiter;
break;
case CmResourceTypeMemory:
arbiterInterface->Context = (PVOID) &IopRootMemArbiter;
break;
case CmResourceTypeInterrupt:
arbiterInterface->Context = (PVOID) &IopRootIrqArbiter;
break;
case CmResourceTypeDma:
arbiterInterface->Context = (PVOID) &IopRootDmaArbiter;
break;
case CmResourceTypeBusNumber:
arbiterInterface->Context = (PVOID) &IopRootBusNumberArbiter;
break;

default:
status = STATUS_INVALID_PARAMETER;
break;
}
} else if ( IopCompareGuid((PVOID)irpSp->Parameters.QueryInterface.InterfaceType, (PVOID)&GUID_TRANSLATOR_INTERFACE_STANDARD)) {
translatorInterface = (PTRANSLATOR_INTERFACE) irpSp->Parameters.QueryInterface.Interface;
translatorInterface->TranslateResources = IopTranslatorHandlerCm;
translatorInterface->TranslateResourceRequirements = IopTranslatorHandlerIo;
status = STATUS_SUCCESS;
}
}
break;

0: kd> bp nt!IopRootBusNumberArbiter
0: kd> x nt!ArbArbiterHandler
80dc51ee nt!ArbArbiterHandler (void *, _ARBITER_ACTION, struct _ARBITER_PARAMETERS *)
0: kd> u 80dc51ee
nt!ArbArbiterHandler [d:\srv03rtm\base\ntos\arb\arbiter.c @ 1461]:
80dc51ee 55 push ebp
80dc51ef 8bec mov ebp,esp
80dc51f1 53 push ebx
80dc51f2 56 push esi
80dc51f3 8b350831a080 mov esi,dword ptr [nt!_imp__KeGetCurrentIrql (80a03108)]
80dc51f9 57 push edi
80dc51fa ffd6 call esi
80dc51fc 3c01 cmp al,1


0: kd> dv
DeviceObject = 0x00000000
Irp = 0x899c5468
information = 0x00000000
length = 0x386
uiNumber = 0
id = 0x00000001
separatorCount = 8
0: kd> dd 0x899c5468
899c5468 00940006 00000000 00000000 00000000
899c5478 899a1238 899a1238 c00000bb 00000000
899c5488 01010000 04000000 f789a0f4 f789a0e4
899c5498 00000000 00000000 00000000 00000000
899c54a8 00000000 00000000 00000000 00000000
899c54b8 899a1020 00000000 00000000 00000000
899c54c8899c54d800000000 00000000 00000000
899c54d8 0000081b f789a144 00000018 e1278768
0: kd> dt IO_STACK_LOCATION 899c54d8
nt!IO_STACK_LOCATION
+0x000 MajorFunction : 0x1b ''
+0x001 MinorFunction : 0x8 ''
+0x002 Flags : 0 ''
+0x003 Control : 0 ''
+0x004 Parameters : __unnamed
+0x014 DeviceObject : 0x899c5d08 _DEVICE_OBJECT
+0x018 FileObject : (null)
+0x01c CompletionRoutine : (null)
+0x020 Context : (null)
0: kd> dt IO_STACK_LOCATION 899c54d8 -r
nt!IO_STACK_LOCATION
+0x000 MajorFunction : 0x1b ''
+0x001 MinorFunction : 0x8 ''
+0x002 Flags : 0 ''
+0x003 Control : 0 ''
+0x004 Parameters : __unnamed
+0x000 QueryInterface : __unnamed
+0x000 InterfaceType : 0xf789a144 _GUID {e644f185-8c0e-11d0-becf-08002be2092f}
+0x004 Size : 0x18
+0x006 Version : 0
+0x008 Interface : 0xe1278768 _INTERFACE

0: kd> dt _INTERFACE
hal!_INTERFACE
+0x000 Size : Uint2B
+0x002 Version : Uint2B
+0x004 Context : Ptr32 Void
+0x008 InterfaceReference : Ptr32 void
+0x00c InterfaceDereference : Ptr32 void

arbiterInterface = (PARBITER_INTERFACE) irpSp->Parameters.QueryInterface.Interface;
arbiterInterface->ArbiterHandler = ArbArbiterHandler;
switch ((UCHAR)((ULONG_PTR)irpSp->Parameters.QueryInterface.InterfaceSpecificData)) {

case CmResourceTypeBusNumber:
arbiterInterface->Context = (PVOID) &IopRootBusNumberArbiter;
break;

0: kd> p
eax=e1278768 ebx=00000010 ecx=00000000 edx=899c5468 esi=899c54d8 edi=00000000
eip=80cb0c84 esp=f789a098 ebp=f789a0b4 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!IopPnPDispatch+0x14e:
80cb0c84 c74004a0f2b180 mov dword ptr [eax+4],offset nt!IopRootBusNumberArbiter (80b1f2a0) ds:0023:e127876c=00000000

0: kd> dt ARBITER_INTERFACE e1278768
nt!ARBITER_INTERFACE
+0x000 Size : 0x18
+0x002 Version : 0
+0x004 Context : (null)
+0x008 InterfaceReference : (null)
+0x00c InterfaceDereference : (null)
+0x010 ArbiterHandler : 0x80dc51ee long nt!ArbArbiterHandler+0
+0x014 Flags : 0

0: kd> gu
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=899c5468 edi=899c5d08
eip=80a2675c esp=f789a0c4 ebp=f789a0d0 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!IofCallDriver+0x62:
80a2675c 5f pop edi
0: kd> gu
eax=00000000 ebx=899c5d08 ecx=00000000 edx=00000000 esi=f789a144 edi=899c54fc
eip=80c95e00 esp=f789a0d8 ebp=f789a100 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!IopSynchronousCall+0x1aa:
80c95e00 8bf0 mov esi,eax
0: kd> gu
eax=00000000 ebx=00000018 ecx=00000008 edx=00000000 esi=e1278768 edi=00000000
eip=80c969ff esp=f789a114 ebp=f789a154 iopl=0 nv up ei ng nz ac po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000293
nt!IopQueryResourceHandlerInterface+0x10d:
80c969ff 8bd8 mov ebx,eax
0: kd> gu
Breakpoint 22 hit
eax=00000000 ebx=e12be0b8 ecx=00000008 edx=00000000 esi=00000040 edi=899c5bc8
eip=80ca1263 esp=f789a16c ebp=f789a198 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!IopSetupArbiterAndTranslators+0xfd:
80ca1263 6609b7de000000 or word ptr [edi+0DEh],si ds:0023:899c5ca6=0004
0: kd> dv interface
interface = 0xe1278768
0: kd> dx -r1 ((ntkrnlmp!_INTERFACE *)0xe1278768)
((ntkrnlmp!_INTERFACE *)0xe1278768) : 0xe1278768 [Type: _INTERFACE *]
[+0x000] Size : 0x18 [Type: unsigned short]
[+0x002] Version : 0x0 [Type: unsigned short]
[+0x004] Context : 0x80b1f2a0 [Type: void *]
[+0x008] InterfaceReference : 0x0 [Type: void (*)(void *)]
[+0x00c] InterfaceDereference : 0x0 [Type: void (*)(void *)]


status = IopQueryResourceHandlerInterface(ResourceArbiter,
deviceNode->PhysicalDeviceObject,
resourceType,
&interface);
deviceNode->QueryArbiterMask |= resourceMask;

0: kd> dt _device_Node 899c5bc8
nt!_DEVICE_NODE
+0x000 Sibling : (null)
+0x004 Child : 0x899c5850 _DEVICE_NODE
+0x008 Parent : (null)
+0x00c LastChild : 0x89983478 _DEVICE_NODE
+0x010 Level : 0
+0x014 Notify : (null)
+0x018 State : 308 ( DeviceNodeStarted )
+0x01c PreviousState : 30d ( DeviceNodeEnumerateCompletion )
+0x020 StateHistory : [20] 301 ( DeviceNodeUninitialized )
+0x070 StateHistoryEntry : 5
+0x074 CompletionStatus : 0n0
+0x078 PendingIrp : (null)
+0x07c Flags : 0x131
+0x080 UserFlags : 0
+0x084 Problem : 0
+0x088 PhysicalDeviceObject : 0x899c5d08 _DEVICE_OBJECT
+0x08c ResourceList : (null)
+0x090 ResourceListTranslated : (null)
+0x094 InstancePath : _UNICODE_STRING "HTREE\ROOT\0"
+0x09c ServiceName : _UNICODE_STRING ""
+0x0a4 DuplicatePDO : (null)
+0x0a8 ResourceRequirements : (null)
+0x0ac InterfaceType : 0xffffffff (No matching name)
+0x0b0 BusNumber : 0xffffffff
+0x0b4 ChildInterfaceType : 0xffffffff (No matching name)
+0x0b8 ChildBusNumber : 0xffffffff
+0x0bc ChildBusTypeIndex : 0xffff
+0x0be RemovalPolicy : 0 ''
+0x0bf HardwareRemovalPolicy : 0 ''
+0x0c0 TargetDeviceNotify : _LIST_ENTRY [ 0x899c5c88 - 0x899c5c88 ]
+0x0c8 DeviceArbiterList : _LIST_ENTRY [ 0xe127f3b0 - 0xe127f3b0 ]
+0x0d0 DeviceTranslatorList : _LIST_ENTRY [ 0x899c5c98 - 0x899c5c98 ]
+0x0d8 NoTranslatorMask : 0
+0x0da QueryTranslatorMask : 0
+0x0dc NoArbiterMask : 0
+0x0de QueryArbiterMask : 4
+0x0e0 OverUsed1 : __unnamed
+0x0e4 OverUsed2 : __unnamed
+0x0e8 BootResources : (null)
+0x0ec CapabilityFlags : 0
+0x0f0 DockInfo : __unnamed
+0x100 DisableableDepends : 0
+0x104 PendedSetInterfaceState : _LIST_ENTRY [ 0x899c5ccc - 0x899c5ccc ]
+0x10c LegacyBusListEntry : _LIST_ENTRY [ 0x899c5cd4 - 0x899c5cd4 ]


变为:

0: kd> dt _device_Node 899c5bc8
nt!_DEVICE_NODE
+0x000 Sibling : (null)
+0x004 Child : 0x899c5850 _DEVICE_NODE
+0x008 Parent : (null)
+0x00c LastChild : 0x89983478 _DEVICE_NODE
+0x010 Level : 0
+0x014 Notify : (null)
+0x018 State : 308 ( DeviceNodeStarted )
+0x01c PreviousState : 30d ( DeviceNodeEnumerateCompletion )
+0x020 StateHistory : [20] 301 ( DeviceNodeUninitialized )
+0x070 StateHistoryEntry : 5
+0x074 CompletionStatus : 0n0
+0x078 PendingIrp : (null)
+0x07c Flags : 0x131
+0x080 UserFlags : 0
+0x084 Problem : 0
+0x088 PhysicalDeviceObject : 0x899c5d08 _DEVICE_OBJECT
+0x08c ResourceList : (null)
+0x090 ResourceListTranslated : (null)
+0x094 InstancePath : _UNICODE_STRING "HTREE\ROOT\0"
+0x09c ServiceName : _UNICODE_STRING ""
+0x0a4 DuplicatePDO : (null)
+0x0a8 ResourceRequirements : (null)
+0x0ac InterfaceType : 0xffffffff (No matching name)
+0x0b0 BusNumber : 0xffffffff
+0x0b4 ChildInterfaceType : 0xffffffff (No matching name)
+0x0b8 ChildBusNumber : 0xffffffff
+0x0bc ChildBusTypeIndex : 0xffff
+0x0be RemovalPolicy : 0 ''
+0x0bf HardwareRemovalPolicy : 0 ''
+0x0c0 TargetDeviceNotify : _LIST_ENTRY [ 0x899c5c88 - 0x899c5c88 ]
+0x0c8 DeviceArbiterList : _LIST_ENTRY [ 0xe127f3b0 - 0xe127f3b0 ]
+0x0d0 DeviceTranslatorList : _LIST_ENTRY [ 0x899c5c98 - 0x899c5c98 ]
+0x0d8 NoTranslatorMask : 0
+0x0da QueryTranslatorMask : 0
+0x0dc NoArbiterMask : 0
+0x0de QueryArbiterMask : 0x44
+0x0e0 OverUsed1 : __unnamed
+0x0e4 OverUsed2 : __unnamed
+0x0e8 BootResources : (null)
+0x0ec CapabilityFlags : 0
+0x0f0 DockInfo : __unnamed
+0x100 DisableableDepends : 0
+0x104 PendedSetInterfaceState : _LIST_ENTRY [ 0x899c5ccc - 0x899c5ccc ]
+0x10c LegacyBusListEntry : _LIST_ENTRY [ 0x899c5cd4 - 0x899c5cd4 ]


+0x0de QueryArbiterMask : 0x44

100 0100

resourceMask = 1 << resourceType; resourceMask = 1 << 6=0x40;


if (found == FALSE) {
arbiterEntry = (PPI_RESOURCE_ARBITER_ENTRY)ExAllocatePoolAE(
PagedPool | POOL_COLD_ALLOCATION,
sizeof(PI_RESOURCE_ARBITER_ENTRY));
if (!arbiterEntry) {
status = STATUS_INSUFFICIENT_RESOURCES;
return status;
}
IopInitializeArbiterEntryState(arbiterEntry);
InitializeListHead(&arbiterEntry->DeviceArbiterList);
arbiterEntry->ResourceType = resourceType;
arbiterEntry->Level = deviceNode->Level;
listHead = &deviceNode->DeviceArbiterList;
InsertTailList(listHead, &arbiterEntry->DeviceArbiterList);

arbiterEntry->ArbiterInterface = (PARBITER_INTERFACE)interface;
if (!interface) {

0: kd> dv arbiterEntry
arbiterEntry = 0xe12979d0

一个是对arbiterEntry赋值,一个是对deviceNode=899c5bc8进行赋值
0: kd> dt _device_Node 899c5bc8
nt!_DEVICE_NODE
+0x000 Sibling : (null)
+0x004 Child : 0x899c5850 _DEVICE_NODE
+0x008 Parent : (null)
+0x00c LastChild : 0x89983478 _DEVICE_NODE
+0x010 Level : 0
+0x014 Notify : (null)
+0x018 State : 308 ( DeviceNodeStarted )
+0x01c PreviousState : 30d ( DeviceNodeEnumerateCompletion )
+0x020 StateHistory : [20] 301 ( DeviceNodeUninitialized )
+0x070 StateHistoryEntry : 5
+0x074 CompletionStatus : 0n0
+0x078 PendingIrp : (null)
+0x07c Flags : 0x131
+0x080 UserFlags : 0
+0x084 Problem : 0
+0x088 PhysicalDeviceObject : 0x899c5d08 _DEVICE_OBJECT
+0x08c ResourceList : (null)
+0x090 ResourceListTranslated : (null)
+0x094 InstancePath : _UNICODE_STRING "HTREE\ROOT\0"
+0x09c ServiceName : _UNICODE_STRING ""
+0x0a4 DuplicatePDO : (null)
+0x0a8 ResourceRequirements : (null)
+0x0ac InterfaceType : 0xffffffff (No matching name)
+0x0b0 BusNumber : 0xffffffff
+0x0b4 ChildInterfaceType : 0xffffffff (No matching name)
+0x0b8 ChildBusNumber : 0xffffffff
+0x0bc ChildBusTypeIndex : 0xffff
+0x0be RemovalPolicy : 0 ''
+0x0bf HardwareRemovalPolicy : 0 ''
+0x0c0 TargetDeviceNotify : _LIST_ENTRY [ 0x899c5c88 - 0x899c5c88 ]
+0x0c8 DeviceArbiterList : _LIST_ENTRY [ 0xe127f3b0 - 0xe12979d0 ]
+0x0d0 DeviceTranslatorList : _LIST_ENTRY [ 0x899c5c98 - 0x899c5c98 ]
+0x0d8 NoTranslatorMask : 0
+0x0da QueryTranslatorMask : 0
+0x0dc NoArbiterMask : 0
+0x0de QueryArbiterMask : 0x44
+0x0e0 OverUsed1 : __unnamed
+0x0e4 OverUsed2 : __unnamed
+0x0e8 BootResources : (null)
+0x0ec CapabilityFlags : 0
+0x0f0 DockInfo : __unnamed
+0x100 DisableableDepends : 0
+0x104 PendedSetInterfaceState : _LIST_ENTRY [ 0x899c5ccc - 0x899c5ccc ]
+0x10c LegacyBusListEntry : _LIST_ENTRY [ 0x899c5cd4 - 0x899c5cd4 ]
0: kd> dx -id 0,0,899a2278 -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x899c5c90))
(*((ntkrnlmp!_LIST_ENTRY *)0x899c5c90)) [Type: _LIST_ENTRY]
[+0x000] Flink : 0xe127f3b0 [Type: _LIST_ENTRY *]
[+0x004] Blink :
0xe12979d0[Type: _LIST_ENTRY *]Blink : 0xe12979d0新添加的。
0: kd> dx -id 0,0,899a2278 -r1 ((ntkrnlmp!_LIST_ENTRY *)0xe127f3b0)
((ntkrnlmp!_LIST_ENTRY *)0xe127f3b0) : 0xe127f3b0 [Type: _LIST_ENTRY *]
[+0x000] Flink : 0xe12979d0 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0x899c5c90 [Type: _LIST_ENTRY *]

0: kd> dv arbiterEntry
arbiterEntry = 0xe12979d0
0: kd> dx -r1 ((ntkrnlmp!_PI_RESOURCE_ARBITER_ENTRY *)0xe12979d0)
((ntkrnlmp!_PI_RESOURCE_ARBITER_ENTRY *)0xe12979d0) : 0xe12979d0 [Type: _PI_RESOURCE_ARBITER_ENTRY *]
[+0x000] DeviceArbiterList [Type: _LIST_ENTRY]
[+0x008] ResourceType : 0x6 [Type: unsigned char]
[+0x00c] ArbiterInterface : 0xe1278768 [Type: _ARBITER_INTERFACE *]
[+0x010] Level : 0x0 [Type: unsigned long]
[+0x014] ResourceList [Type: _LIST_ENTRY]
[+0x01c] BestResourceList [Type: _LIST_ENTRY]
[+0x024] BestConfig [Type: _LIST_ENTRY]
[+0x02c] ActiveArbiterList [Type: _LIST_ENTRY]
[+0x034] State : 0x0 [Type: unsigned char]
[+0x035] ResourcesChanged : 0x0 [Type: unsigned char]
0: kd> dx -r1 ((ntkrnlmp!_ARBITER_INTERFACE *)0xe1278768)
((ntkrnlmp!_ARBITER_INTERFACE *)0xe1278768) : 0xe1278768 [Type: _ARBITER_INTERFACE *]
[+0x000] Size : 0x18 [Type: unsigned short]
[+0x002] Version : 0x0 [Type: unsigned short]
[+0x004] Context : 0x80b1f2a0 [Type: void *]
[+0x008] InterfaceReference : 0x0 [Type: void (*)(void *)]
[+0x00c] InterfaceDereference : 0x0 [Type: void (*)(void *)]
[+0x010] ArbiterHandler : 0x80dc51ee [Type: long (*)(void*,_ARBITER_ACTION,_ARBITER_PARAMETERS *)]
[+0x014] Flags : 0x0 [Type: unsigned long]
0: kd> u 80dc51ee
nt!ArbArbiterHandler [d:\srv03rtm\base\ntos\arb\arbiter.c @ 1461]:
80dc51ee 55 push ebp
80dc51ef 8bec mov ebp,esp
80dc51f1 53 push ebx
80dc51f2 56 push esi
80dc51f3 8b350831a080 mov esi,dword ptr [nt!_imp__KeGetCurrentIrql (80a03108)]
80dc51f9 57 push edi
80dc51fa ffd6 call esi
80dc51fc 3c01 cmp al,1


//
// If there is an desired resourcetype arbiter in the device node, make sure
// it handle this resource requriements.
//

if (arbiterEntry) {
arbiterFound = TRUE;
if (arbiterEntry->ArbiterInterface->Flags & ARBITER_PARTIAL) { 不符合

//
// If the arbiter is partial, ask if it handles the resources
// if not, goto its parent.
//

status = IopCallArbiter(
arbiterEntry,
ArbiterActionQueryArbitrate,
ReqDesc->TranslatedReqDesc,
NULL,
NULL
);
if (!NT_SUCCESS(status)) {
arbiterFound = FALSE;
}
}
}
if (arbiterFound) {
ReqDesc->u.Arbiter = arbiterEntry;

//
// Initialize the arbiter entry
//

arbiterEntry->State = 0;
arbiterEntry->ResourcesChanged = FALSE;
}

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 13:03:09

格式总出错?AI论文工具 千笔ai写作 VS 灵感ai,本科生专属利器!

随着人工智能技术的迅猛迭代与普及&#xff0c;AI辅助写作工具已逐步渗透到高校学术写作场景中&#xff0c;成为本科生完成毕业论文不可或缺的辅助手段。越来越多的学生在面对繁重的论文写作任务时&#xff0c;开始依赖各类AI工具来提升效率、简化流程。然而&#xff0c;市场上…

作者头像 李华
网站建设 2026/4/16 13:00:49

2026 大专大数据技术专业证书含金量排名大专适用!

进入2026年&#xff0c;数字化转型的浪潮已非未来趋势&#xff0c;而是当下各行各业的生存常态。大数据技术作为核心驱动力&#xff0c;创造了海量人才需求。对于大专院校大数据技术专业的学生而言&#xff0c;身处学历与技能双重竞争的环境中&#xff0c;如何精准发力&#xf…

作者头像 李华
网站建设 2026/4/16 3:53:08

光速AI:玻璃纤维如何替代硅基大脑

AI at light speed: How glass fibers could replace silicon brains 想象一下不依赖电子而使用光来更快、更高效执行任务的计算机。来自芬兰某大学和法国某大学两个研究团队的合作&#xff0c;现已展示了一种利用光和光纤处理信息的新方法&#xff0c;为构建超快计算机开辟了可…

作者头像 李华
网站建设 2026/4/16 12:46:35

C语言鼠标钩子源码实现与全局监控教程

鼠标钩子是Windows系统提供的一种机制&#xff0c;允许应用程序监视或拦截系统中的鼠标消息。理解其源码实现&#xff0c;对于开发需要全局鼠标监控、自定义鼠标行为或制作辅助工具的程序至关重要。本文将围绕C语言实现鼠标钩子的几个核心环节展开。 鼠标钩子是什么 从编程角度…

作者头像 李华