我正在努力深入了解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编号向它发送适当的进程,然后解析它.
我知道好像我正在回答我自己的问题,但我真的不确定自己这个并且想要一些关闭,所以我可以继续处理更多有趣的事情.
我接近了吗?
我是一名应用程序开发人员,主要在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)
请帮助.
我曾经使用VirtualKD,WinDBG和单个虚拟机来调试Windows内核.
最近我得到了一台Linux机器,现在我想知道 - 当主机无法运行VirtualKD/WinDBG*时,调试Windows内核的最简单方法是什么?
我假设该解决方案将需要两台虚拟机,但我宁愿在我的实际机器上托管两个实例,而不是让一个实例驻留在另一个虚拟实例中...
反正有没有做到这一点?
提前致谢!
*出于稳定性原因,葡萄酒是最后的选择......
我在比较从用户模式类型 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_ENTRY
是UNICODE_STRING
. 我想将此 UNICODE_STRING 与我的 LPWSTR 进行比较。
我尝试了以下方法,但没有奏效:
{
UNICODE_STRING …
Run Code Online (Sandbox Code Playgroud) 我的符号文件有问题.我尝试使用符号文件路径并按如下方式设置路径:
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版本的新1位漏洞使用处理滚动条的内核代码中的错误.这让我思考.为什么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)
某些进程必须使用NtSetTimerResolution
5000(0.5ms)的值调用,但如何确定哪一个?我看到英特尔有一个名为电池寿命分析器的工具,它显示每个进程的当前计时器分辨率,但该工具仅供英特尔合作伙伴使用.是否有其他工具或通过WinDbg查看它的方法?注意:似乎在启动时发生,因为设置断点不起作用(调试器启动时分辨率已经很高).
如何从Windows Solaris for Linux(WSL)中的Linux二进制文件调用Windows API函数?我很确定没有记录的方法可以这样做,但尝试它可能会很有趣.
我有兴趣调用Win32函数,或者如果不可能,至少是Windows NT本机API(Nt*,Zw*).本机API至少应该是可用的,因为运行Linux进程的组件(lxss)依赖于这些API.
可能需要构建一个类似自定义LoadLibrary的函数来加载Windows DLL.另一个想法是在进程内存中搜索已知的内核函数(即它们的用户模式入口点).
有人试过这个并想分享一个解决方案吗?
我需要知道加载nt和win32k的基地址.我可以通过在启用内核调试的情况下启动系统来查找此信息,启动内核调试会话,然后运行该命令lm
以获取已加载模块的列表.
我想要做的是以编程方式确定加载这两个模块的位置,而无需启动到调试模式和使用内核调试器.我需要基本地址来解析Windows事件跟踪日志文件中的系统调用.
我正在使用的系统运行Windows Server 2008 R2.
问题
我正在使用.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(使用了其他计时器,但我们没有注意到太大差异):
创建一个单独的线程并赋予它高优先级
结果:无效(使用可怕的Thread.Sleep()
,没有它并使用连续轮询)
使用 C# 任务(线程池)
结果:改进很小
使用 1ms 周期的多媒体定时器 …