标签: windows-kernel

http.sys究竟是如何工作的

我正在努力深入了解IIS的工作原理.

我理解的http.sys是其主要组成部分之一.但是,我一直无法找到容易消化的信息.在听说WSK之前,我无法获得良好的心理模型,然后我认为这一切都已落实到位.

从大量随机谷歌搜索一点点实验,这是我目前对其存在的原因及其如何实现的高层次理解.

为什么:

端口共享和更高性能的缓存.

怎么样:

用户模式进程使用WinSock api打开侦听端口的套接字以访问网络子系统,例如tcp/ip.像http.sys驱动程序这样的Kernal模式软件使用Winsock Kernal套接字(WSK)API来使用与WinSock api相同的TCP端口号池来实现相同的目的.

IIS,Web服务或任何想要使用http的内容都使用唯一的URL /端口组合向http.sys注册.http.sys使用WSK在此端口上打开一个套接字(如果它还没有用于具有相同端口的另一个url/port组合)并监听.

当传输层(tcpip.sys)重新构建一个ip数据包负载回到客户端发送的http请求时,它会通过请求中的端口将其提供给http.sys.Http.sys使用url/port编号向它发送适当的进程,然后解析它.

我知道好像我正在回答我自己的问题,但我真的不确定自己这个并且想要一些关闭,所以我可以继续处理更多有趣的事情.

我接近了吗?

iis tcp http http.sys windows-kernel

34
推荐指数
0
解决办法
3万
查看次数

如何从Windows内核编程开始?

我是一名应用程序开发人员,主要在C#工作.我对C/C++有一些了解.我非常着迷并对windows Kernel Development感兴趣.我勾勒出一个布局来学习这个.

1. Understand Windows internals(By books)
2. Try Simple Modules and keep expanding.
Run Code Online (Sandbox Code Playgroud)

为实现这一目标,我需要一些帮助:

1. The books I should read.
2. The Websites I should follow.
3. Setting up my dev environment.(Most important as I can start realizing.)
Run Code Online (Sandbox Code Playgroud)

请帮助.

kernel windows-kernel

17
推荐指数
1
解决办法
2万
查看次数

从Linux调试Windows内核

我曾经使用VirtualKD,WinDBG和单个虚拟机来调试Windows内核.

最近我得到了一台Linux机器,现在我想知道 - 当主机无法运行VirtualKD/WinDBG*时,调试Windows内核的最简单方法是什么?

我假设该解决方案将需要两台虚拟机,但我宁愿在我的实际机器上托管两个实例,而不是让一个实例驻留在另一个虚拟实例中...

反正有没有做到这一点?

提前致谢!

*出于稳定性原因,葡萄酒是最后的选择......

windbg virtual-machine windows-kernel

13
推荐指数
1
解决办法
7572
查看次数

无法将 C# 字符串从用户空间传递到内核模式 C 并使用它来查找特定的 LDR_DATA_TABLE_ENTRY

我在比较从用户模式类型 LPWSTR 传递到 LDR 表条目类型 UNICODE_STRING 的字符串时遇到困难

内核 C:

struct {
    int pid;
    int user_pid;
    int size;
    int protection_mode;
    int allocation_type;
    void* address;
    void* write_buffer;
    LPWSTR module_name;
}
userland_operation;
Run Code Online (Sandbox Code Playgroud)

这个结构体通过 deviceiocontrol 传递给内核。对应的用户空间结构如下:

public struct MemOperation
{
    public int Pid;
    public int UserPid;
    public int Size;
    public int protection_mode;
    public int allocation_type;
    public IntPtr Addr;
    public IntPtr WriteBuffer;
    [MarshalAs(UnmanagedType.LPWStr)] public String ModuleName;
}
Run Code Online (Sandbox Code Playgroud)

字符串在哪里 ModuleName被编组为 LPWStr。

ModuleName是进程中加载​​模块的所需搜索词。现在,事情变得棘手了。我可以通过访问的字符串_LDR_DATA_TABLE_ENTRYUNICODE_STRING. 我想将此 UNICODE_STRING 与我的 LPWSTR 进行比较。

我尝试了以下方法,但没有奏效:

{
    UNICODE_STRING …
Run Code Online (Sandbox Code Playgroud)

c c# deviceiocontrol windows-kernel

10
推荐指数
1
解决办法
119
查看次数

Windbg和符号文件

我的符号文件有问题.我尝试使用符号文件路径并按如下方式设置路径:

srv*c:\symbols*http://msdl.microsoft.com/download/symbols;C:\Users\myuser\Desktop\driver2\objchk_win7_x86\i386
Run Code Online (Sandbox Code Playgroud)

但之后我将其更改为以下内容:

srv*c:\symbols*http://msdl.microsoft.com/download/symbols;C:\Users\myuser\Desktop\mydriver\objchk_win7_x86\i386
Run Code Online (Sandbox Code Playgroud)

我在路径中使用mydriver更改了driver2:这是我的驱动程序的.pdb文件所在的路径.问题是.sympath打印正确的路径,如下所示:

kd> .sympath
Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols;C:\Users\myuser\Desktop\mydriver\objchk_win7_x86\i386
Expanded Symbol search path is: srv*c:\symbols*http://msdl.microsoft.com/download/symbols;c:\users\myuser\desktop\mydriver\objchk_win7_x86\i386
Run Code Online (Sandbox Code Playgroud)

但仍未找到驱动程序的符号.如果我运行.reload命令,我们可以看到WinDbg在driver2 /目录中寻找.pdb而不是mydriver /目录.

kd> .reload /f mydriver.sys
SYMSRV:  c:\symbols\mydriver.pdb\3D655E533B0449A38D7AB0AF637CE9201\mydriver.pdb not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/mydriver.pdb/3D655E533B0449A38D7AB0AF637CE9201/mydriver.pdb not found
SYMSRV:  c:\users\myuser\desktop\mydriver\objchk_win7_x86\i386\mydriver.pdb\3D655E533B0449A38D7AB0AF637CE9201\mydriver.pdb not found
DBGHELP: c:\users\myuser\desktop\driver2\objchk_win7_x86\i386\mydriver.pdb - file not found
*** ERROR: Module load completed but symbols could not be loaded for mydriver.sys
DBGHELP: mydriver - no symbols loaded
Run Code Online (Sandbox Code Playgroud)

我删除了所有工作区,关闭了WinDbg,重新启动了Windows,但是驱动程序2 /条目仍然存在:它必须位于默认工作区的缓存中或某处.如何删除WinDbg的整个个人设置,包括那些缓存,所以我可以重新启动WinDbg并使用driver2/path并使其使用mydriver /.

我也可以通过将mydriver /目录重命名为driver2 /来解决问题,但我不想解决这个问题.我想了解发生了什么,并尽我所能解决它.

windows windbg windows-kernel

9
推荐指数
1
解决办法
1万
查看次数

为什么Windows在内核中处理滚动条?

"所有"Windows版本的新1位漏洞使用处理滚动条的内核代码中的错误.这让我思考.为什么Windows在内核中处理滚动条而不是用户模式?历史原因?有没有其他操作系统这样做?

windows operating-system kernel scrollbar windows-kernel

9
推荐指数
1
解决办法
2454
查看次数

如何判断哪个进程在Windows中设置了高计时器分辨率

我的系统正在遭受高计时器分辨率(NtQueryTimerResolution返回0.5ms).

Maximum timer interval: 15.600 ms
Minimum timer interval: 0.500 ms
Current timer interval: 0.500 ms
Run Code Online (Sandbox Code Playgroud)

某些进程必须使用NtSetTimerResolution5000(0.5ms)的值调用,但如何确定哪一个?我看到英特尔有一个名为电池寿命分析器的工具,它显示每个进程的当前计时器分辨率,但该工具仅供英特尔合作伙伴使用.是否有其他工具或通过WinDbg查看它的方法?注意:似乎在启动时发生,因为设置断点不起作用(调试器启动时分辨率已经很高).

windows windows-kernel

8
推荐指数
1
解决办法
2045
查看次数

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

如何从Windows Solaris for Linux(WSL)中的Linux二进制文件调用Windows API函数?我很确定没有记录的方法可以这样做,但尝试它可能会很有趣.

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

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

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

windows-kernel windows-subsystem-for-linux

8
推荐指数
1
解决办法
823
查看次数

如何获取内核模块nt和win32k的地址?

我需要知道加载nt和win32k的基地址.我可以通过在启用内核调试的情况下启动系统来查找此信息,启动内核调试会话,然后运行该命令lm以获取已加载模块的列表.

我想要做的是以编程方式确定加载这两个模块的位置,而无需启动到调试模式和使用内核调试器.我需要基本地址来解析Windows事件跟踪日志文件中的系统调用.

我正在使用的系统运行Windows Server 2008 R2.

windows windbg etw windows-server-2008 windows-kernel

7
推荐指数
1
解决办法
3622
查看次数

实现实时 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 ms 容错的时序约束。

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

尝试的解决方案

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

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

  2. 使用 C# 任务(线程池)
    结果:改进很小

  3. 使用 1ms 周期的多媒体定时器 …

c# windows multithreading rtos windows-kernel

7
推荐指数
1
解决办法
6484
查看次数