编写Windows NT子系统

我想尝试在Windows 7上编写我自己的最小的NT子系统纯粹用于教育目的 – 就像微软的基于Unix的应用程序子系统中的posix.exe。

但是我似乎无法find关于这个话题的公开文件。 子系统需要实现哪些API? 它如何注册Windows? 如何构build子系统映像(需要在PE头中设置哪些标志等)?

我最想find一本书或网站,其中包含整个主题的概述,甚至是其他人编写的“hello world”NT子系统的源代码。 但是,如果你能指出我在这个正确的方向,任何东西都将不胜感激。

以下是一个子系统的主要组成部分:

  • 用户模式服务器。 服务器创build(A)LPC端口并侦听并处理客户端请求。
  • 用户模式的客户端DLL。 在DLL_INIT_ROUTINE中,可以连接到服务器设置的端口。 这个DLL会暴露你的子系统的API,有些function需要与服务器通信。
  • 内核模式支持驱动程序(你可能不需要这个)。

您将要在您的服务器或驱动程序中存储进程或线程状态。 如果您将其存储在服务器中,则可能需要使用NtRegisterThreadTerminatePort类的NtRegisterThreadTerminatePort以确保在进程或线程退出时进行清理。 如果您使用的是驱动程序,则需要PsSetCreateProcessNotifyRoutine 。

最后,如果您使用的是XP及以下版本,则可以添加新的系统调用。 你可以通过调用KeAddSystemServiceTable来做到这KeAddSystemServiceTable 。 要从用户模式调用系统调用,您需要像这样创build存根(对于x86):

 ; XyzCreateFooBar(__out PHANDLE FooBarHandle, __in ACCESS_MASK DesiredAccess, ...) mov eax, SYSTEM_CALL_NUMBER mov edx, 0x7ffe0300 call [edx] retn 4 

在Vista和以上,你不能再添加新的系统服务表,因为只有两个空间:内核的系统调用和win32k的系统调用。

谷歌search后,我发现这个: http : //winntposix.sourceforge.net/ 。 我想这跟你要找的东西非常相似,并且使用了我提到的很多东西。

我也痴迷于本地API。 🙂

我很高兴地说,它远不如有些人所看到的那样危险或无证。 :]

没有“Hello,world”的源代码,因为本地API不与控制台交互,因为它是Win32子系统的一部分,需要与端口进行客户端/服务器通信。 如果您需要编写控制台应用程序,则需要直接与CSRSS进行通信,而CSRSS的消息格式没有logging(虽然其中一些格式可以在ReactOS的源代码中find – 如果熟悉ReactOS,您将获得很多好处)。

我会很快发表一个例子,你可能会觉得有趣; 现在,请注意,您唯一的select是与NTDLL.dll链接,为此,您需要驱动程序开发工具包(因为您需要lib文件)。


更新 :看看这个!

(我有一种感觉,没有其他人会发布一些像这样反叛的东西。用本地API来显示GUI?!我一定是疯了!

 #include <Windows.h> typedef DWORD NTSTATUS; //These are from ReactOS typedef enum _HARDERROR_RESPONSE_OPTION { OptionAbortRetryIgnore, OptionOk, OptionOkCancel, OptionRetryCancel, OptionYesNo, OptionYesNoCancel, OptionShutdownSystem } HARDERROR_RESPONSE_OPTION, *PHARDERROR_RESPONSE_OPTION; typedef enum _HARDERROR_RESPONSE { ResponseReturnToCaller, ResponseNotHandled, ResponseAbort, ResponseCancel, ResponseIgnore, ResponseNo, ResponseOk, ResponseRetry, ResponseYes, ResponseTryAgain, ResponseContinue } HARDERROR_RESPONSE, *PHARDERROR_RESPONSE; typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *PUNICODE_STRING; //You'll need to link to NTDLL.lib //which you can get from the Windows 2003 DDK or any later WDK NTSYSAPI VOID NTAPI RtlInitUnicodeString(IN OUT PUNICODE_STRING DestinationString, IN PCWSTR SourceString); NTSYSAPI NTSTATUS NTAPI NtRaiseHardError(IN NTSTATUS ErrorStatus, IN ULONG NumberOfParameters, IN ULONG UnicodeStringParameterMask, IN PULONG_PTR Parameters, IN HARDERROR_RESPONSE_OPTION ValidResponseOptions, OUT PHARDERROR_RESPONSE Response); #define STATUS_SERVICE_NOTIFICATION_2 0x50000018 int main() { HARDERROR_RESPONSE response; ULONG_PTR items[4] = {0}; UNICODE_STRING text, title; RtlInitUnicodeString(&text, L"Hello, NT!\r\nDo you like this?\r\n" L"This is just about as pretty as the GUI will get.\r\n" L"This message will self-destruct in 5 seconds..."); RtlInitUnicodeString(&title, L"Native Message Box!"); items[0] = (ULONG_PTR)&text; items[1] = (ULONG_PTR)&title; items[2] = (ULONG_PTR)OptionYesNo; items[3] = (ULONG_PTR)5000; NtRaiseHardError(STATUS_SERVICE_NOTIFICATION_2, ARRAYSIZE(items), 0x1 | 0x2 /*First two parameters are UNICODE_STRINGs*/, items, OptionOk /*This is ignored, since we have a custom message box.*/, &response); return 0; } 

如果你有任何问题随时问! 我不害怕本地API! 🙂


编辑2:

如果你正在试图制作你自己的Kernel32的DLL版本,并且像Kernel32一样加载每一个进程(因此是一个新的子系统),我只是想让你知道我不认为这是可能的。 这个问题和我之前提到的这个问题很相似,似乎你不能扩展NT PE Loader来了解新的子系统,所以我不认为这是可能的。