news 2026/3/11 16:01:08

节点BAT2方法VMPS里面访问\_SB.PCI0.OEMR放到局部变量Local0中返回期间会调用acpi!GetPciAddress

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
节点BAT2方法VMPS里面访问\_SB.PCI0.OEMR放到局部变量Local0中返回期间会调用acpi!GetPciAddress

节点BAT2方法VMPS里面访问\_SB.PCI0.OEMR放到局部变量Local0中返回期间会调用acpi!GetPciAddress

每次访问\_SB.PCI0.OEMR就好调用acpi!GetPciAddress函数就会新建两个_CTXT。

可以用个全局变量把结果

&state->Bus,
&state->Slot

比如全局变量acpi!pci0_state_Bus和全局变量acpi!pci0_state_Slot。能提高一些速度。

if (!interface) {

if (!(state->Flags & PCISUPP_GOT_SLOT_INFO)) {

state->Flags |= PCISUPP_GOT_SLOT_INFO;

status = GetPciAddress(state->PciObj,
PciConfigSpaceHandlerWorker,
(PVOID)state,
&state->Bus,
&state->Slot);


Method (VMPS, 1, NotSerialized)
{
Acquire (OEML, 0xFFFF)
IVOC (0x81, Arg0)
Store (\_SB.PCI0.OEMR, Local0)
Release (OEML)
Return (Local0)
}

1: kd> x ACPI!AcpiGetListEntry
f743b940 ACPI!AcpiGetListEntry = struct _LIST_ENTRY [ 0x899c6328 - 0x899c6328 ]
1: kd> dx -r1 (*((ACPI!_LIST_ENTRY *)0xf743b940))
(*((ACPI!_LIST_ENTRY *)0xf743b940)) [Type: _LIST_ENTRY]
[+0x000] Flink : 0x899c6328 [Type: _LIST_ENTRY *]
[+0x004] Blink : 0x899c6328 [Type: _LIST_ENTRY *]

if (!interface) {

if (!(state->Flags & PCISUPP_GOT_SLOT_INFO)) {

state->Flags |= PCISUPP_GOT_SLOT_INFO;

status = GetPciAddress(state->PciObj,
PciConfigSpaceHandlerWorker,
(PVOID)state,
&state->Bus,
&state->Slot);

1: kd> kc
#
00 ACPI!GetPciAddress
01 ACPI!PciConfigSpaceHandlerWorker
02 ACPI!PciConfigSpaceHandler
03 ACPI!InternalOpRegionHandler
04 ACPI!AccessBaseField
05 ACPI!AccessFieldData
06 ACPI!ReadFieldObj
07 ACPI!RunContext
08 ACPI!DispatchCtxtQueue
09 ACPI!StartTimeSlicePassive
0a ACPI!ACPIWorker
0b nt!PspSystemThreadStartup
0c nt!KiThreadStartup
1: kd> dv
PciObj = 0x899affac
CompletionRoutine = 0xf740d62c
Context = 0x89987378
Bus = 0x899873b0 ""
Slot = 0x899873ac

#define INITIAL_RUN_COMPLETION -1

RtlZeroMemory(state, sizeof(GET_ADDRESS_CONTEXT));

state->PciObject = PciObj;
state->CompletionRoutine = CompletionRoutine;
state->CompletionContext = Context;
state->Bus = Bus;
state->Slot = Slot;
state->RunCompletion = INITIAL_RUN_COMPLETION;

return GetPciAddressWorker(PciObj,
STATUS_SUCCESS,
NULL,
(PVOID)state);

1: kd> kc
#
00 ACPI!GetPciAddressWorker
01 ACPI!GetPciAddress
02 ACPI!PciConfigSpaceHandlerWorker
03 ACPI!PciConfigSpaceHandler
04 ACPI!InternalOpRegionHandler
05 ACPI!AccessBaseField
06 ACPI!AccessFieldData
07 ACPI!ReadFieldObj
08 ACPI!RunContext
09 ACPI!DispatchCtxtQueue
0a ACPI!StartTimeSlicePassive
0b ACPI!ACPIWorker
0c nt!PspSystemThreadStartup
0d nt!KiThreadStartup
1: kd> dv
AcpiObject = 0x899affac
Status = 0n0
Result = 0x00000000
Context = 0x899bf408
buffer = unsigned char [64] ""
1: kd> dt GET_ADDRESS_CONTEXT 0x899bf408
ACPI!GET_ADDRESS_CONTEXT
+0x000 PciObject : 0x899affac _NSObj
+0x004 Bus : 0x899873b0 ""
+0x008 Slot : 0x899873ac _PCI_SLOT_NUMBER
+0x00c ParentBus : 0 ''
+0x010 ParentSlot : _PCI_SLOT_NUMBER
+0x014 Flags : 0
+0x018 Address : 0
+0x01c BaseBusNumber : 0
+0x020 RunCompletion : 0n-1 //#define INITIAL_RUN_COMPLETION -1
+0x024 CompletionRoutine : 0xf740d62c void ACPI!PciConfigSpaceHandlerWorker+0
+0x028 CompletionContext : 0x89987378 Void

//
// First, determine the slot number.
//
if (!(state->Flags & PCISUPP_CHECKED_ADR)) {

//
// Get the _ADR.
//
state->Flags |= PCISUPP_CHECKED_ADR;
status = ACPIGetNSAddressAsync(
state->PciObject,
GetPciAddressWorker,
(PVOID)state,
&(state->Address),
NULL
);


#define PCISUPP_CHECKED_HID 1
#define PCISUPP_CHECKED_PCI_DEVICE 2
#define PCISUPP_CHECKED_ADR 8
#define PCISUPP_IS_PCI_DEVICE 0x10
#define PCISUPP_CHECKED_PARENT 0x20
#define PCISUPP_CHECKED_PCI_BRIDGE 0x40
#define PCISUPP_CHECKED_CID 0x80
#define PCISUPP_GOT_SLOT_INFO 0x100
#define PCISUPP_GOT_BUS_INFO 0x200
#define PCISUPP_CHECKED_CRS 0x400
#define PCISUPP_COMPLETING_IS_PCI 0x800
#define PCISUPP_GOT_SCOPE 0x1000
#define PCISUPP_CHECKED_BBN 0x2000

#define PCISUPP_CHECKED_ADR 8
#define PCISUPP_CHECKED_BBN 0x2000

1: kd> kc
#
00 ACPI!ACPIGet
01 ACPI!GetPciAddressWorker
02 ACPI!GetPciAddress
03 ACPI!PciConfigSpaceHandlerWorker
04 ACPI!PciConfigSpaceHandler
05 ACPI!InternalOpRegionHandler
06 ACPI!AccessBaseField
07 ACPI!AccessFieldData
08 ACPI!ReadFieldObj
09 ACPI!RunContext
0a ACPI!DispatchCtxtQueue
0b ACPI!StartTimeSlicePassive
0c ACPI!ACPIWorker
0d nt!PspSystemThreadStartup
0e nt!KiThreadStartup
1: kd> dv
Target = 0x899affac
ObjectID = 0x5244415f
Flags = 0x48040402
SimpleArgument = 0x00000000
SimpleArgumentSize = 0
CallBackRoutine = 0xf740ceea
CallBackContext = 0x899bf408


1: kd> u f740ceea
ACPI!GetPciAddressWorker [d:\srv03rtm\base\busdrv\acpi\driver\nt\pciopregion.c @ 986]:
f740ceea 55 push ebp
f740ceeb 8bec mov ebp,esp
f740ceed 83ec44 sub esp,44h
f740cef0 a1a88c43f7 mov eax,dword ptr [ACPI!__security_cookie (f7438ca8)]
f740cef5 53 push ebx
f740cef6 56 push esi
f740cef7 8b7514 mov esi,dword ptr [ebp+14h]
f740cefa 85f6 test esi,esi
windbg> .open -a fffffffff740ceea
1: kd> dt GET_ADDRESS_CONTEXT 0x899bf408
ACPI!GET_ADDRESS_CONTEXT
+0x000 PciObject : 0x899affac _NSObj
+0x004 Bus : 0x899873b0 ""
+0x008 Slot : 0x899873ac _PCI_SLOT_NUMBER
+0x00c ParentBus : 0 ''
+0x010 ParentSlot : _PCI_SLOT_NUMBER
+0x014 Flags : 8
+0x018 Address : 0
+0x01c BaseBusNumber : 0
+0x020 RunCompletion : 0n0
+0x024 CompletionRoutine : 0xf740d62c void ACPI!PciConfigSpaceHandlerWorker+0
+0x028 CompletionContext : 0x89987378 Void
1: kd> u f740d62c
ACPI!PciConfigSpaceHandlerWorker [d:\srv03rtm\base\busdrv\acpi\driver\nt\pciopregion.c @ 544]:
f740d62c 55 push ebp
f740d62d 8bec mov ebp,esp
f740d62f 83ec44 sub esp,44h
f740d632 a1a88c43f7 mov eax,dword ptr [ACPI!__security_cookie (f7438ca8)]
f740d637 53 push ebx
f740d638 8b5d14 mov ebx,dword ptr [ebp+14h]
f740d63b 56 push esi
f740d63c 57 push edi
windbg> .open -a fffffffff740d62c
1: kd> dt PCI_CONFIG_STATE 0x89987378
ACPI!PCI_CONFIG_STATE
+0x000 AccessType : 0
+0x004 OpRegion : 0x899b0b50 _NSObj
+0x008 Address : 0xd8
+0x00c Size : 4
+0x010 Data : 0x8997dd84 -> 0
+0x014 Context : 0
+0x018 CompletionHandler : 0xf7420914 Void
+0x01c CompletionContext : 0x8997c0ac Void
+0x020 PciObj : 0x899affac _NSObj
+0x024 ParentObj : (null)
+0x028 CompletionHandlerType : 0
+0x02c Flags : 0x100
+0x030 RunCompletion : 0n0
+0x034 Slot : _PCI_SLOT_NUMBER
+0x038 Bus : 0 ''
+0x039 IsPciDeviceResult : 0 ''
1: kd> u 0xf7420914
ACPI!RestartCtxtCallback [d:\srv03rtm\base\busdrv\acpi\driver\amlinew\sched.c @ 401]:
f7420914 55 push ebp
f7420915 8bec mov ebp,esp
f7420917 56 push esi
f7420918 8b7508 mov esi,dword ptr [ebp+8]
f742091b 57 push edi
f742091c 6a01 push 1
f742091e bf603f43f7 mov edi,offset ACPI!`string' (f7433f60)
f7420923 57 push edi


1: kd> kc
#
00 ACPI!AMLIAsyncEvalObject
01 ACPI!ACPIGet
02 ACPI!GetPciAddressWorker
03 ACPI!GetPciAddress
04 ACPI!PciConfigSpaceHandlerWorker
05 ACPI!PciConfigSpaceHandler
06 ACPI!InternalOpRegionHandler
07 ACPI!AccessBaseField
08 ACPI!AccessFieldData
09 ACPI!ReadFieldObj
0a ACPI!RunContext
0b ACPI!DispatchCtxtQueue
0c ACPI!StartTimeSlicePassive
0d ACPI!ACPIWorker
0e nt!PspSystemThreadStartup
0f nt!KiThreadStartup
1: kd> g
Breakpoint 37 hit
eax=899b00f0 ebx=00000000 ecx=899b00f0 edx=00000000 esi=899b00f0 edi=899050e0
eip=f741f8c9 esp=f791aa94 ebp=f791aac4 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!AsyncEvalObject:
f741f8c9 55 push ebp
1: kd> kc
#
00 ACPI!AsyncEvalObject
01 ACPI!AMLIAsyncEvalObject
02 ACPI!ACPIGet
03 ACPI!GetPciAddressWorker
04 ACPI!GetPciAddress
05 ACPI!PciConfigSpaceHandlerWorker
06 ACPI!PciConfigSpaceHandler
07 ACPI!InternalOpRegionHandler
08 ACPI!AccessBaseField
09 ACPI!AccessFieldData
0a ACPI!ReadFieldObj
0b ACPI!RunContext
0c ACPI!DispatchCtxtQueue
0d ACPI!StartTimeSlicePassive
0e ACPI!ACPIWorker
0f nt!PspSystemThreadStartup
10 nt!KiThreadStartup
1: kd> g
Breakpoint 42 hit
eax=00000000 ebx=899b010c ecx=899b010c edx=89904fe4 esi=f7438ca8 edi=00000000
eip=f74207d4 esp=f791aa70 ebp=f791aa90 iopl=0 nv up ei ng nz ac pe cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000297
ACPI!RestartContext:
f74207d4 55 push ebp

1: kd> kc
#
00 ACPI!RestartContext
01 ACPI!AsyncEvalObject
02 ACPI!AMLIAsyncEvalObject
03 ACPI!ACPIGet
04 ACPI!GetPciAddressWorker
05 ACPI!GetPciAddress
06 ACPI!PciConfigSpaceHandlerWorker
07 ACPI!PciConfigSpaceHandler
08 ACPI!InternalOpRegionHandler
09 ACPI!AccessBaseField
0a ACPI!AccessFieldData
0b ACPI!ReadFieldObj
0c ACPI!RunContext
0d ACPI!DispatchCtxtQueue
0e ACPI!StartTimeSlicePassive
0f ACPI!ACPIWorker
10 nt!PspSystemThreadStartup
11 nt!KiThreadStartup
1: kd> dv
pctxt = 0x89903000
fDelayExecute = 0x00 ''

1: kd> x ACPI!gReadyQueue
f743a928 ACPI!gReadyQueue = struct _ctxtq
1: kd> dx -r1 (*((ACPI!_ctxtq *)0xf743a928))
(*((ACPI!_ctxtq *)0xf743a928)) [Type: _ctxtq]
[+0x000] dwfCtxtQ : 0x0 [Type: unsigned long]
[+0x004] pkthCurrent : 0x89981ca0 [Type: _KTHREAD *]
[+0x008] pctxtCurrent : 0x8997c000 [Type: _ctxt *]
[+0x00c] plistCtxtQ : 0x0 [Type: _List *]
[+0x010] dwmsTimeSliceLength : 0x64 [Type: unsigned long]
[+0x014] dwmsTimeSliceInterval : 0x64 [Type: unsigned long]
[+0x018] pfnPauseCallback : 0x0 [Type: void (__cdecl*)(void *)]
[+0x01c] PauseCBContext : 0x0 [Type: void *]
[+0x020] mutCtxtQ [Type: _mutex]
[+0x028] Timer [Type: _KTIMER]
[+0x050] DpcStartTimeSlice [Type: _KDPC]
[+0x070] DpcExpireTimeSlice [Type: _KDPC]
[+0x090] WorkItem [Type: _WORK_QUEUE_ITEM]


1: kd> kc
#
00 ACPI!RunContext
01 ACPI!DispatchCtxtQueue
02 ACPI!StartTimeSlicePassive
03 ACPI!ACPIWorker
04 nt!PspSystemThreadStartup
05 nt!KiThreadStartup

1: kd> kc
#
00 ACPI!RunContext
01 ACPI!DispatchCtxtQueue
02 ACPI!StartTimeSlicePassive
03 ACPI!ACPIWorker
04 nt!PspSystemThreadStartup
05 nt!KiThreadStartup
1: kd> dv
pctxt = 0x89903000 //新的pctxt = 0x89903000
pctxtSave = 0xf741d711
pkthSave = 0x00000008
rc = 0n-1987039232


1: kd> g
Breakpoint 45 hit
eax=00000000 ebx=f743a948 ecx=f743a948 edx=00002700 esi=89903000 edi=89904fe4
eip=f741d82f esp=f791ad14 ebp=f791ad34 iopl=0 nv up ei ng nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286
ACPI!RunContext+0x11f:
f741d82f ff570c call dword ptr [edi+0Ch] ds:0023:89904ff0={ACPI!ProcessEvalObj (f741ef2b)}


1: kd> kc
#
00 ACPI!ACPIGet
01 ACPI!GetPciAddressWorker
02 ACPI!ACPIGetWorkerForInteger
03 ACPI!AsyncCallBack
04 ACPI!RunContext
05 ACPI!DispatchCtxtQueue
06 ACPI!StartTimeSlicePassive
07 ACPI!ACPIWorker
08 nt!PspSystemThreadStartup
09 nt!KiThreadStartup


//
// Is there a _BBN to run?
//
tempObj = ACPIAmliGetNamedChild(bus, PACKED_BBN);
if (tempObj) {

//
// This device must be the child of a root PCI bus.
//
if (!(state->Flags & PCISUPP_CHECKED_BBN)) {

state->Flags |= PCISUPP_CHECKED_BBN;
status = ACPIGetNSIntegerAsync(
bus,
PACKED_BBN,
GetPciAddressWorker,
(PVOID)state,
&(state->BaseBusNumber),
NULL
);


1: kd> kc
#
00 ACPI!AMLIAsyncEvalObject
01 ACPI!ACPIGet
02 ACPI!GetPciAddressWorker
03 ACPI!ACPIGetWorkerForInteger
04 ACPI!AsyncCallBack
05 ACPI!RunContext
06 ACPI!DispatchCtxtQueue
07 ACPI!StartTimeSlicePassive
08 ACPI!ACPIWorker
09 nt!PspSystemThreadStartup
0a nt!KiThreadStartup
1: kd> dv
pns = 0x899b00ac
pdataResult = 0x89985164
icArgs = 0n0
pdataArgs = 0x00000000
pfnAsyncCallBack = 0xf7407364
pvContext = 0x89985138
pHData = 0x00000008


1: kd> kc
#
00 ACPI!RestartContext
01 ACPI!AsyncEvalObject
02 ACPI!AMLIAsyncEvalObject
03 ACPI!ACPIGet
04 ACPI!GetPciAddressWorker
05 ACPI!ACPIGetWorkerForInteger
06 ACPI!AsyncCallBack
07 ACPI!RunContext
08 ACPI!DispatchCtxtQueue
09 ACPI!StartTimeSlicePassive
0a ACPI!ACPIWorker
0b nt!PspSystemThreadStartup
0c nt!KiThreadStartup
1: kd> dv
pctxt = 0x89901000 //新的pctxt = 0x89901000
fDelayExecute = 0x00 ''

1: kd> kc
#
00 ACPI!RunContext
01 ACPI!DispatchCtxtQueue
02 ACPI!StartTimeSlicePassive
03 ACPI!ACPIWorker
04 nt!PspSystemThreadStartup
05 nt!KiThreadStartup
1: kd> dv
pctxt = 0x89901000
pctxtSave = 0xf741d711
pkthSave = 0x00000008
rc = 0n-1987047424


1: kd> kc
#
00 ACPI!PciConfigSpaceHandlerWorker
01 ACPI!GetPciAddressWorker
02 ACPI!ACPIGetWorkerForInteger
03 ACPI!AsyncCallBack
04 ACPI!RunContext
05 ACPI!DispatchCtxtQueue
06 ACPI!StartTimeSlicePassive
07 ACPI!ACPIWorker
08 nt!PspSystemThreadStartup
09 nt!KiThreadStartup
1: kd> dv
AcpiObject = 0x899b00ac
CompletionStatus = 0n0
Result = 0x00000000
Context = 0x89987378


1: kd> dt PCI_CONFIG_STATE 0x89987378
ACPI!PCI_CONFIG_STATE
+0x000 AccessType : 0
+0x004 OpRegion : 0x899b0b50 _NSObj
+0x008 Address : 0xd8
+0x00c Size : 4
+0x010 Data : 0x8997dd84 -> 0
+0x014 Context : 0
+0x018 CompletionHandler : 0xf7420914 Void
+0x01c CompletionContext : 0x8997c0ac Void
+0x020 PciObj : 0x899affac _NSObj
+0x024 ParentObj : (null)
+0x028 CompletionHandlerType : 0
+0x02c Flags : 0x100 #define PCISUPP_GOT_SLOT_INFO 0x100
+0x030 RunCompletion : 0n0
+0x034 Slot : _PCI_SLOT_NUMBER
+0x038 Bus : 0 ''
+0x039 IsPciDeviceResult : 0 ''


switch (state->AccessType) {
case RSACCESS_READ:

} else {

//
// Do config space op through HAL
//

bytes = HalGetBusDataByOffset(PCIConfiguration,
state->Bus,
state->Slot.u.AsULONG,
state->Data,
state->Address,
state->Size);

1: kd> kc
#
00 hal!HalGetBusDataByOffset
01 ACPI!PciConfigSpaceHandlerWorker
02 ACPI!GetPciAddressWorker
03 ACPI!ACPIGetWorkerForInteger
04 ACPI!AsyncCallBack
05 ACPI!RunContext
06 ACPI!DispatchCtxtQueue
07 ACPI!StartTimeSlicePassive
08 ACPI!ACPIWorker
09 nt!PspSystemThreadStartup
0a nt!KiThreadStartup
1: kd> dv
BusDataType = PCIConfiguration (0n4)
BusNumber = 0
SlotNumber = 0
Buffer = 0x8997dd84
Offset = 0xd8
Length = 4
bus = struct _BUS_HANDLER


1: kd> db 0x8997dd84
8997dd84 00 00 00 00 00 00 00 00-00 00 00 00 20 00 00 00 ............ ...
8997dd94 03 00 00 00 41 43 46 55-18 00 00 00 03 00 01 00 ....ACFU........


1: kd> gu
Breakpoint 23 hit
eax=00000103 ebx=00000000 ecx=00000103 edx=000c0802 esi=89906cd0 edi=899aee58
eip=f73fbc48 esp=f789ef54 ebp=f789ef60 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!ACPIBuildProcessRunMethodPhaseCheckSta+0x4e:
f73fbc48 8bd8 mov ebx,eax
0: kd> db 0x8997dd84
8997dd84 00 00 00 00 00 00 00 00-00 00 00 00 20 00 00 00 ............ ...
8997dd94 03 00 00 00 41 43 46 55-18 00 00 00 03 00 01 00 ....ACFU........
8997dda4 71 9b 41 f7 f4 0b 9b 89-58 c1 97 89 54 45 52 4d q.A.....X...TERM


0: kd> db 0x8997dd84
8997dd84 00 00 00 00 说明不存在BAT2


Method (VMPS, 1, NotSerialized)
{
Acquire (OEML, 0xFFFF)
IVOC (0x81, Arg0)
Store (\_SB.PCI0.OEMR, Local0) //最后会运行ACPI!Store
Release (OEML)
Return (Local0)
}


Device (BAT2)
{
Name (_HID, EisaId ("PNP0C0A")) // _HID: Hardware ID
Name (_UID, 0x02) // _UID: Unique ID
Name (_PCL, Package (0x01) // _PCL: Power Consumer List
{
\_SB
})
Method (_STA, 0, NotSerialized) // _STA: Status
{
Return (VMPS (0x02))
}

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

[从零构建操作系统]10 链接脚本语法简介(一直更新)

1. 基本的架构:由section关键字将各个程序段囊括起来SECTION{ .text:{*(.text) //这里指的是将所有文件的.data字段放在一起 }.rodata{*(.rodata) }.data{*(.data) }.bss{*(.bss) } }2. PROVIDE(s_data .);使用PROVIDE关键字可以使得变量在其它c代码中被引用&#…

作者头像 李华
网站建设 2026/3/11 1:25:21

基于SMO的三相PMSM无速度传感器控制(采用反正切函数法)

基于SMO的三相PMSM无速度传感器控制(基于反正切函数)滑模观测器(SMO)在三相永磁同步电机(PMSM)控制中的应用,就像给电机装了一个"隐形的眼睛"。传统传感器体积大、成本高,…

作者头像 李华
网站建设 2026/3/10 9:18:40

YOLO11一键部署推荐:免配置环境快速启动方案

YOLO11一键部署推荐:免配置环境快速启动方案 YOLO11 是目标检测领域最新一代的高效算法,延续了YOLO系列“又快又准”的核心优势。相比前代版本,它在模型结构、推理速度和小目标检测能力上都有显著提升,适用于工业质检、智能安防、…

作者头像 李华
网站建设 2026/3/11 12:18:39

如何高效查找国外的文献:实用方法与技巧指南

刚开始做科研的时候,我一直以为: 文献检索就是在知网、Google Scholar 里反复换关键词。 直到后来才意识到,真正消耗精力的不是“搜不到”,而是—— 你根本不知道最近这个领域发生了什么。 生成式 AI 出现之后,学术检…

作者头像 李华
网站建设 2026/3/9 15:49:17

Quill富文本编辑器HTML导出功能存在XSS漏洞分析

Quill 因HTML导出功能易受XSS攻击 CVE-2025-15056 GitHub Advisory Database 漏洞详情 包管理器: npm 包名称: quill 受影响版本: 2.0.3 已修补版本: 无 描述: Quill 的 HTML 导出功能中存在数据验证缺失漏洞&am…

作者头像 李华
网站建设 2026/3/10 11:55:36

FBM211 P0916JT控制器模块

BM211 P0916JT 控制器模块简介FBM211 P0916JT 是 Foxboro I/A Series 分布式控制系统中使用的模拟量输入类控制模块组合,主要用于将现场仪表的模拟信号采集并传送至系统控制层,实现稳定可靠的数据处理。模块功能说明:FBM211 为模拟量输入模块…

作者头像 李华