问题标签 [windows-kernel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
42 浏览

driver - 在 Windows 上使用内核级驱动程序锁定屏幕

有没有办法使用内核级驱动程序锁定 Windows 工作站?

我需要在内核中执行此操作,以实现尽可能多的保护并避免绕过。

心电图

0 投票
1 回答
1782 浏览

windows-kernel - 从 Windows 子系统为 Linux 进程调用 Win32/NT-Native API?

如何从适用于 Linux 的 Windows 子系统 (WSL) 中的 Linux 二进制文件调用 Windows API 函数?我很确定没有记录的方法可以这样做,但是尝试一下可能会很有趣。

我有兴趣调用 Win32 函数,或者如果这不可能,至少是 Windows NT 原生 API(Nt*、Zw*)。本机 API 至少应该是可用的,因为运行 Linux 进程 (lxss) 的组件依赖于这些 API。

可能需要构建一个自定义的类似 LoadLibrary 的函数来加载 Windows DLL。另一个想法是在进程内存中搜索已知的内核函数片段(即它们的用户模式入口点)。

有没有人尝试过这个并想分享一个解决方案?

0 投票
2 回答
586 浏览

debugging - WinDBG的命令分类?

我看到了一些关于 WinDBG commnads 的参考资料和教程。他们中的一些人喜欢这个lm、这个.echo、这个!running和这个nt!_PDB

这些类别之间有什么区别

  • xxx
  • .xxx
  • !xxx
  • xxx!yyy

?

他们看起来很困惑。

0 投票
0 回答
468 浏览

javascript - 为什么 Javascript 中没有 PrintScreen 的 keydown 事件?

这是一个非常直截了当的问题,其答案似乎很难追查。

为什么javascript中的printscreen没有keydown事件?

我试图查看一些火狐的源代码,看看它是否故意以不同的方式处理 VK_SNAPSHOT,使其无法通过设计捕获,但我没有找到任何东西。

这似乎在 Windows 操作系统堆栈中走得很远,因为 C# 也有这个问题(KeyDown 事件不在 PrintScreen Key 上工作)这个答案提到“printscreen 被操作系统捕获”,但没有为该声明提供任何文档。我试图用谷歌搜索仍然无法找到任何支持文档。

printscreen keydown 事件是否由内核直接处理并且永远不会像 Ctrl-alt-delete 中断一样到达用户空间?这是否发生在键盘驱动程序中,并且不同的键盘驱动程序可能会将其向上传递给 javascript?我是否离基地很远,javascript可以捕捉到keydown事件,而这个问题现在看起来真的很愚蠢?

(顺便说一句,在试图找到这个问题的答案时,我偶然发现了这篇简洁的文章,它教会了我一些关于 SysRq 按钮的历史 - http://royal.pingdom.com/2012/06/26/sysadmin-needs -sysrq-magic/ )


带有“我不知道为什么但是...”的问题链接列表

KeyDown 事件不适用于 PrintScreen Key c#

https://gamedev.stackexchange.com/questions/20446/does-vk-snapshot-not-send-a-wm-keydown-only-wm-keyup C-ish 语言?

在 Keyboard Tester 应用程序 VB NET VB.NET中检测 Print Screen keyup 和 keydown

0 投票
1 回答
366 浏览

c - Windows:从内核终止进程的不同方法

有一个特定的进程我不能直接用 ZwTerminateProcess 终止,因为它的驱动程序为所述函数注册了一个回调来保护自己。

其他方法:

  • 注入 DLL 并调用 ExitProcess
  • 使用 KeAttachProcess 附加到其地址空间,然后调用 ZwTerminateProcess(导致 BSOD IRQL_NOT_LESS_OR_EQUAL)
  • MmUnmapViewOfSection(导致 BSOD,因为程序试图写入不可读的内存)

进程黑客是如何做到的?

0 投票
2 回答
6981 浏览

c# - 在不受线程调度影响的情况下实现 1 毫秒的实时准确事件

问题

我正在使用.Net 4.5创建一个基于 Windows 7 的 C# WPF应用程序,它的一个主要功能是调用某些函数,这些函数与具有一组用户定义的周期时间的自定义硬件接口。例如,用户可以选择每 10 或 20 毫秒调用两个函数,每 500 毫秒调用另一个函数。用户可以选择的最小循环时间为 1 毫秒。

起初,时间似乎是准确的,并且根据需要每 1 毫秒调用一次函数。但我们后来注意到,大约1-2%的时间不准确,有些函数被调用时仅延迟了 5 毫秒,而其他函数可能延迟了 100 毫秒。即使循环时间大于 1 毫秒,我们也面临线程在它应该调用外部函数的时间休眠的问题(20 毫秒的函数可能会延迟 50 毫秒,因为线程正在休眠并且没有调用该函数)

经过分析,我们得出结论,这些延迟是零星的,没有明显的模式,并且这些延迟背后的主要原因可能是操作系统调度和线程上下文切换,换句话说,我们的线程并没有像我们需要的那样一直处于唤醒状态.

由于 Windows 7 不是 RTOS,我们需要确定是否可以以某种方式解决此问题。但我们确实知道这个问题在 Windows 上是可以解决的,因为我们使用具有类似功能的其他工具可以满足最大 0.7 毫秒容错的时序约束。

我们的应用程序是多线程的,最多同时运行大约 30 个线程,其当前的峰值 CPU 使用率约为 13%

尝试的解决方案

我们尝试了很多不同的东西,主要是使用秒表计时器测量计时,并且IsHighResolution是正确的(使用了其他计时器,但我们没有发现太大差异):

  1. 创建一个单独的线程并赋予它高优先级
    结果:无效(使用可怕的Thread.Sleep(),没有它并使用连续轮询)

  2. 使用 C# 任务(线程池)
    结果:几乎没有改进

  3. 使用具有 1ms 周期的多媒体计时器
    结果:无效或更糟,多媒体计时器在唤醒操作系统时是准确的,但操作系统可能会选择运行另一个线程,没有 1ms 保证,但即便如此,延迟有时可能会更大

  4. 创建了一个单独的独立 C# 项目,其中仅包含一个 while 循环和秒表计时器
    结果:大多数情况下,即使在微秒内,精度也很好,但偶尔线程会休眠

  5. 重复第 4 点,但将进程优先级设置为 Realtime/High
    结果:非常好的数字,几乎没有一条消息有明显的延迟。

结论:

从前面我们发现我们有 5 种可能的行动方案,但我们需要有此类问题经验的知识渊博的人来为我们指明正确的方向:

  1. 我们的工具可以进行优化,并以某种方式管理线程以确保 1 毫秒的实时要求。也许优化的一部分是将工具的进程优先级设置为高或实时,但这似乎不是一个明智的决定,因为用户可能同时使用多个其他工具。

  2. 我们将我们的工具分为两个进程,一个包含 GUI 和所有非时间关键操作,另一个包含最少量的时间关键操作并将其设置为高/实时优先级,并使用 IPC(如 WCF)来进程之间的通信。这可以通过两种方式使我们受益

    1. 由于发生的操作少得多,其他进程出现饥饿的可能性更小。

    2. 该进程将具有更少的线程,因此(更少或没有)线程休眠的可能性

注意:接下来的两点将涉及内核空间,请注意我对内核空间和编写驱动程序的信息很少,所以我可能对如何使用它做出了一些错误的假设。

  1. 在内核空间中创建一个驱动程序,该驱动程序每 1ms 使用较低级别的中断来触发一个事件,该事件迫使线程在进程中执行其指定的任务。

  2. 将时间关键组件移至内核空间,与程序主体的任何接口都可以通过 API 和回调来完成。

  3. 也许所有这些都无效,我们可能需要使用 Windows RTOS 扩展,如 IntervalZero RTOS 平台?

问题本身

我正在寻找两个答案,我希望它们得到良好资源的支持。

  1. 这真的是一个线程和上下文切换问题吗?还是我们一直在遗漏一些东西?

  2. 5 个选项中的哪一个可以保证解决这个问题,如果有几个,哪个是最简单的?如果这些选项都不能解决它,那有什么可以解决的呢?请记住,我们基准测试过的其他工具在 windows 上确实达到了所需的计时精度,并且当 CPU 处于重负载下时,100,000 次中的一到两次可能会关闭不到 2 毫秒,这是非常可以接受的。

0 投票
2 回答
3890 浏览

memory-management - Windows 7下如何在内核模式下设置内存区域的保护

本质上,我正在寻找一个可以为内核模式做的功能,就像VirtualProtect为用户模式做的一样。

我使用以下简化代码示例的逻辑分配内存。

和标志仅对 Win8+ 有效 MdlMappingNoExecute。此外,仅使用我不能为内存区域分配例如保护。MdlMappingNoWrite
MmGetSystemAddressForMdlSafeNoAccess

我可以使用任何其他或替代的 API 来修改分配内存的页面保护吗?
黑客也可以这样做,因为目前此功能不会在生产代码中使用。

0 投票
0 回答
667 浏览

debugging - 为什么 USBview 在我的 PC 上显示“是否支持端口调试”为“否”?

我正在尝试通过 USB 3.0 传输设置 Windows 内核调试。这篇 MSDN 文章说我必须先用 USBview.exe 检查我的电脑,并且它需要“是否支持端口调试”才能说是。但是,在 Acer R7 笔记本电脑(Intel Ivy Bridge Core i5 3337U)上的 Windows 10 x64 系统上,“是否支持端口调试”对每个 USB 3.0 端口都表示不支持。为什么会这样?

usbview - 是否支持端口调试.png

0 投票
1 回答
1649 浏览

windows - Windows _EPROCESS 结构

是否有任何来源可以找到_EPROCESS结构中每个字段的详细信息?我正在做一个VM内省项目,我试图获取每个正在运行的进程的详细信息。我可以读取每个字段的数据,但我真的不知道这些字段代表什么。我找不到任何解释这些字段的链接,可能是因为Windows是封闭源OS

我知道我可能无法找到每个字段的详细信息,但如果我能至少获得其中的一些,这对我真的很有帮助。

0 投票
0 回答
234 浏览

winapi - Windows VAD 树和 GDT LDT 关系 X86

我正在搜索 Windows 内存如何与 X86 一起工作,我学到了一些东西,但我进退两难,这是真的还是假的。我没有找到任何关于 VAD 和 GDT 之间的互联网关系的文档

Windows 操作系统使用 VAD(虚拟地址描述符)从 LDT 或 GDT 数组分配地址。

正如我所读到的,每个 VAD 条目只是一个“页表”

所以 :

对于进程,每个页表都是 LDT 条目 对于内核,每个页表都是 GDT 条目

NTOSKRNL.EXE 操作系统启动时通过调用 RtlInitializeGenericTable 初始化 VAD 该函数生成二叉树,每个节点包含空闲的 LDT 或 GDT 条目。这个二叉树根存储在 GDT 本身中。

当我们从用户模式 ​​malloc 分配内存时,二叉树从 LDT 池和 VAD 树根中减去一个 LDT 节点。

我的第二个问题:Windows 可以运行的进程数是 GDT 条目的限制 x86 可以有 16 位 GDT 条目,所以我们可以添加 65536 个 LDT 条目,每个进程可以有 1 个 LDT 条目。所以 GDT 最多可以包含 60K 个条目。这意味着 Windows 最多可以运行 ~60k 进程,这是真的吗?