我想尝试在Windows 7上编写自己的最小NT子系统出于纯粹的教育目的 - 类似于Microsoft子系统中的Posix.exe的裸露,用于基于UNIX的应用程序。

但是我似乎找不到有关此主题的任何公开文档。子系统需要实施什么API?如何使用Windows注册?如何构建子系统图像(在PE标题中需要设置哪些标志等)?

我最想找到一个书籍或网站,概述了整个主题,甚至是其他人所写的“ Hello World” NT子系统的源代码。但是,如果您可以在这里指向正确的方向,那么任何事情都将不胜感激...

有帮助吗?

解决方案

这是子系统的主要组成部分:

  • 用户模式服务器。该服务器创建一个(A)LPC端口,并聆听和处理客户端请求。
  • 用户模式客户端DLL。在DLL_INIT_ROUTINE中,您可以连接到服务器设置的端口。该DLL将揭示您的子系统的API,并且某些功能将需要与服务器进行通信。
  • 内核模式支持驱动程序(您可能不需要此)。

您将需要将流程或线程状态存储在服务器或驱动程序中。如果您将其存储在服务器中,则可能需要类似 NtRegisterThreadTerminatePort 为了确保在过程或线程退出时可以清理。如果您正在使用驱动程序,则需要 pssetCreateProcessNotifyRoutine.

最后,如果您在XP及以下,则可以添加新的系统调用。您可以通过打电话来做到这一点 KeAddSystemServiceTable. 。要调用来自用户模式的系统调用,您需要创建像这样的存根(x86):

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

在Vista及以上,您无法再添加新的系统服务表,因为只有两个空间:内核的系统调用和Win32K的系统调用。

经过一番谷歌搜索后,我发现了以下内容: http://winntposix.sourceforge.net/. 。我认为这与您想要的内容非常相似,并使用了很多我提到的东西。

其他提示

我也对本地API着迷。 :)

我很高兴地说,它与某些人所说的那样危险或无证件。 :]

没有针对“ Hello,World”的源代码,因为本机API与控制台不太容易交互,因为它是Win32子系统的一部分,并且需要与端口的客户端/服务器通信。如果您需要编写控制台应用程序,则需要直接与CSRS进行通信,CSRS的消息格式是无证的(尽管它的某些格式可以在 ReactOS的来源 - 如果您熟悉ReactOS,它将为您带来很多好处)。

我很快就会在这里发布一个示例,您可能会发现有趣的;现在,请注意您的 只要 选项曾经是与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:

如果您想制作自己的DLL版本的kernel32,并像kernel32一样加载它(因此是一个新子系统),我只是想让您知道我认为这是不可能的。这与 这个问题 几天前我问过,看来您无法扩展NT PE加载程序以了解新的子系统,因此我认为这是不可能的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top