- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 NDIS 6.x LWF
驱动程序,可以在 Windows 上捕获和发送数据包。这是 WinPcap 从 NDIS 5 到 NDIS 6 的更新。
此驱动程序从用户模式应用程序接收数据包数据,并使用 NdisFSendNetBufferLists
将其发送出去(请参阅 https://github.com/nmap/npcap/blob/master/packetWin7/npf/npf/Write.c 中的第 631 行)。我发现,如果在发送数据包时,我会在网络连接(又名 ncpa.cpl)中禁用相应的适配器。然后系统就蓝屏了。我分析了小型转储文件,输出如下:
0: kd> !analyze -v
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
SYSTEM_SERVICE_EXCEPTION (3b)
An exception happened while executing a system service routine.
Arguments:
Arg1: 00000000c0000005, Exception code that caused the bugcheck
Arg2: fffff80745e9de30, Address of the instruction which caused the bugcheck
Arg3: ffffa38002702de0, Address of the context record for the exception that caused the bugcheck
Arg4: 0000000000000000, zero.
Debugging Details:
------------------
*** WARNING: Unable to verify timestamp for npf.sys
DUMP_CLASS: 1
DUMP_QUALIFIER: 400
BUILD_VERSION_STRING: 14267.1000.amd64fre.rs1_release.160213-0213
SYSTEM_MANUFACTURER: Dell Inc.
SYSTEM_PRODUCT_NAME: OptiPlex 7010
SYSTEM_SKU: OptiPlex 7010
SYSTEM_VERSION: 01
BIOS_VENDOR: Dell Inc.
BIOS_VERSION: A14
BIOS_DATE: 06/10/2013
BASEBOARD_MANUFACTURER: Dell Inc.
BASEBOARD_PRODUCT: 09PR9H
BASEBOARD_VERSION: A01
DUMP_TYPE: 2
BUGCHECK_P1: c0000005
BUGCHECK_P2: fffff80745e9de30
BUGCHECK_P3: ffffa38002702de0
BUGCHECK_P4: 0
EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.
FAULTING_IP:
ndis!NdisFSendNetBufferLists+c0
fffff807`45e9de30 4c8b5818 mov r11,qword ptr [rax+18h]
CONTEXT: ffffa38002702de0 -- (.cxr 0xffffa38002702de0)
rax=6b49534e02130018 rbx=6b49534e02130019 rcx=0000000000000001
rdx=0000000000000000 rsi=ffffd50728240030 rdi=ffffd5072c4ac8d0
rip=fffff80745e9de30 rsp=ffffa380027037e0 rbp=0000000000000000
r8=0000000000000000 r9=0000000000000000 r10=0000000000000000
r11=0000000000060001 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0 nv up ei pl nz na po nc
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00010206
ndis!NdisFSendNetBufferLists+0xc0:
fffff807`45e9de30 4c8b5818 mov r11,qword ptr [rax+18h] ds:002b:6b49534e`02130030=????????????????
Resetting default scope
CPU_COUNT: 4
CPU_MHZ: c79
CPU_VENDOR: GenuineIntel
CPU_FAMILY: 6
CPU_MODEL: 3a
CPU_STEPPING: 9
CPU_MICROCODE: 6,3a,9,0 (F,M,S,R) SIG: 1B'00000000 (cache) 1B'00000000 (init)
CUSTOMER_CRASH_COUNT: 1
DEFAULT_BUCKET_ID: WIN8_DRIVER_FAULT
BUGCHECK_STR: 0x3B
PROCESS_NAME: EapolLogin.exe
CURRENT_IRQL: 0
ANALYSIS_SESSION_HOST: AKISN0W-PC
ANALYSIS_SESSION_TIME: 02-26-2016 13:42:06.0762
ANALYSIS_VERSION: 10.0.10586.567 amd64fre
LAST_CONTROL_TRANSFER: from fffff807476f67f8 to fffff80745e9de30
STACK_TEXT:
ffffa380`027037e0 fffff807`476f67f8 : 00000000`00000000 00000000`00000000 00000000`00000001 ffffd507`3a613570 : ndis!NdisFSendNetBufferLists+0xc0
ffffa380`02703860 fffff803`8c698c05 : ffffd507`3a6134a0 00000000`00000000 00000000`00000001 fffff680`00003140 : npf!NPF_Write+0x214 [j:\npcap\packetwin7\npf\npf\write.c @ 324]
ffffa380`027038d0 fffff803`8c69840a : ffffd507`39edba60 ffffd507`3a6134a0 ffffd507`2871aef0 ffffa380`02703b80 : nt!IopSynchronousServiceTail+0x1a5
ffffa380`02703990 fffff803`8c3d2f83 : ffff8208`1164b160 00000000`00000000 00000000`00000000 00000000`00000000 : nt!NtWriteFile+0x67a
ffffa380`02703a90 00007fff`94c21034 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : nt!KiSystemServiceCopyEnd+0x13
00000000`0014e248 00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : 0x00007fff`94c21034
THREAD_SHA1_HASH_MOD_FUNC: 8de63a100febe6f9f89153a5a9abc9ba86d452de
THREAD_SHA1_HASH_MOD_FUNC_OFFSET: c12fe9b8d789ae102dec8036452ef91cdcd180b3
THREAD_SHA1_HASH_MOD: bccfea03237cfde6486a55b63bb95e3341833378
FOLLOWUP_IP:
npf!NPF_Write+214 [j:\npcap\packetwin7\npf\npf\write.c @ 324]
fffff807`476f67f8 8b6c2478 mov ebp,dword ptr [rsp+78h]
FAULT_INSTR_CODE: 78246c8b
FAULTING_SOURCE_LINE: j:\npcap\packetwin7\npf\npf\write.c
FAULTING_SOURCE_FILE: j:\npcap\packetwin7\npf\npf\write.c
FAULTING_SOURCE_LINE_NUMBER: 324
FAULTING_SOURCE_CODE:
320: NDIS_DEFAULT_PORT_NUMBER,
321: SendFlags);
322: }
323:
> 324: numSentPackets ++;
325: }
326: else
327: {
328: //
329: // no packets are available in the Transmit pool, wait some time. The
SYMBOL_STACK_INDEX: 1
SYMBOL_NAME: npf!NPF_Write+214
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: npf
IMAGE_NAME: npf.sys
DEBUG_FLR_IMAGE_TIMESTAMP: 56c2d58e
STACK_COMMAND: .cxr 0xffffa38002702de0 ; kb
BUCKET_ID_FUNC_OFFSET: 214
FAILURE_BUCKET_ID: 0x3B_npf!NPF_Write
BUCKET_ID: 0x3B_npf!NPF_Write
PRIMARY_PROBLEM_CLASS: 0x3B_npf!NPF_Write
TARGET_TIME: 2016-02-26T02:30:30.000Z
OSBUILD: 14267
OSSERVICEPACK: 0
SERVICEPACK_NUMBER: 0
OS_REVISION: 0
SUITE_MASK: 272
PRODUCT_TYPE: 1
OSPLATFORM_TYPE: x64
OSNAME: Windows 10
OSEDITION: Windows 10 WinNt TerminalServer SingleUserTS
OS_LOCALE:
USER_LCID: 0
OSBUILD_TIMESTAMP: 2016-02-13 20:56:11
BUILDDATESTAMP_STR: 160213-0213
BUILDLAB_STR: rs1_release
BUILDOSVER_STR: 10.0.14267.1000.amd64fre.rs1_release.160213-0213
ANALYSIS_SESSION_ELAPSED_TIME: 127c9
ANALYSIS_SOURCE: KM
FAILURE_ID_HASH_STRING: km:0x3b_npf!npf_write
FAILURE_ID_HASH: {2eb5e15e-9853-313b-618d-2ac277a2bfb5}
Followup: MachineOwner
上述转储分析报告中指出的源代码行不是很精确。它实际上是上面的行 numSentPackets++;
因此下面的代码会触发 BSoD。
NdisFSendNetBufferLists(Open->AdapterHandle,
pNetBufferList,
NDIS_DEFAULT_PORT_NUMBER,
SendFlags);
适配器的禁用行为导致此 BSoD 是可以理解的,就像您禁用了适配器一样,您应该无法向其发送数据包。我无法阻止用户在使用我的驱动程序时禁用其适配器。但我认为在这种情况下唯一应该发生的事情就是发送操作失败。 BSoD 太过分了。
那么,我想知道的是,根据 NDIS 的设计,让我的司机阻止这种情况的正确方法是什么?谢谢!
<小时/>更新
我按照 Jeffrey 的建议修改了代码,但同样的 BSoD 仍然发生。我的代码位于:https://github.com/nmap/npcap/commit/f68b20fca345ca195d0862856ed8ac6c0f65c957
<小时/>更新2
嗨。我还有两个问题。
1) 为什么不在FilterPause
的else分支中设置me->PausePending = TRUE;
?在 FilterPause
中返回 NDIS_STATUS_SUCCESS
是否意味着什么?如果我的驱动程序在 FilterPause
中返回 NDIS_STATUS_SUCCESS
后仍然调用 NdisFSendNetBufferLists
(这由用户模式应用控制)怎么办?
2) 我应该在 NPF_Restart
(FilterRestart
) 例程中设置 Open->PausePending = TRUE;
吗?
最佳答案
当 NIC 被禁用时:
FilterPause
调用。FilterDetach
调用。完成第 2 步后,您将无法发起新的 NBL。完成步骤 #3 后,您将无法发起任何内容(OID、状态指示等),并且您可以删除过滤器模块上下文。
我浏览了 GitHub 代码,注意到 NPF_Pause
例程是一个空操作。这就是这个错误的原因。发起 NBL 的 LWF 驱动程序必须处理暂停。 FilterPause
的一种典型实现如下所示:
NDIS_STATUS FilterPause(. . .)
{
NDIS_STATUS status;
AcquireDatapathLock();
if (me->NumberOfOriginatedSendPackets > 0 ||
me->NumberOfOriginatedReceivePackets > 0)
{
me->PausePending = TRUE;
status = NDIS_STATUS_PENDING;
}
else
{
status = NDIS_STATUS_SUCCESS;
}
ReleaseDatapathLock();
return status;
}
当发起的 NBL 数量降至零时,您的 NBL 完成处理程序应完成暂停:
VOID CompleteSendNbl(. . .)
{
BOOLEAN CompletePause = FALSE;
AcquireDatapathLock();
me->NumberOfOriginatedSendPackets -= 1;
if (me->NumberOfOriginatedSendPackets == 0 &&
me->PausePending)
{
CompletePause = TRUE;
}
ReleaseDatapathLock();
if (CompletePause)
{
NdisFPauseComplete(. . .);
}
}
最后,请确保暂停后不要发起新的 NBL:
NDIS_STATUS TrySendPacket(. . .)
{
NDIS_STATUS status;
AcquireDatapathLock();
if (me->PausePending)
{
status = NDIS_STATUS_PAUSED;
}
else
{
status = NDIS_STATUS_SUCCESS;
me->NumberOfOriginatedSendPackets++;
}
ReleaseDatapathLock();
if (status == NDIS_STATUS_SUCCESS)
{
. . .
NdisFSendNetBufferLists(. . .);
}
}
当然,上面的优化还有几种方法。但首先要让它发挥作用。如果它对于您的需求来说太慢,那么也许可以让它更快。
关于c - 禁用适配器时 NdisFSendNetBufferLists 导致 BSoD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35670093/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!