首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写Windows NT子系统

编写Windows NT子系统
EN

Stack Overflow用户
提问于 2010-12-08 02:23:23
回答 2查看 4.2K关注 0票数 50

出于纯粹的教育目的,我想尝试在Windows7上编写我自己的最小NT子系统--类似于微软子系统中用于基于Unix应用程序的posix.exe的基本功能。

但我似乎找不到任何关于这个主题的公开文档。子系统需要实现什么API?它如何在Windows中注册?如何构建子系统映像(需要在PE头中设置哪些标志,等等)?

我最想找到一本关于整个主题的概述的书或网站,甚至是别人写的"hello world“NT子系统的源代码。但是如果你能在这里给我指出正确的方向,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-11 09:46:43

以下是子系统的主要组件:

  • 用户模式服务器。服务器创建(A)LPC端口,侦听并处理客户端requests.
  • User-mode客户端动态链接库。在DLL_INIT_ROUTINE中,您可以连接到服务器设置的端口。此动态链接库将公开您的子系统的应用程序接口,并且某些函数将需要与server.
  • Kernel-mode支持驱动程序进行通信(您可能不需要这样做)。

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

最后,如果您使用的是XP或更低版本,则可以添加新的系统调用。您可以通过调用KeAddSystemServiceTable来完成此操作。要从用户模式调用系统调用,您需要像这样创建存根(对于x86):

代码语言:javascript
复制
; 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/。我认为它与你正在寻找的东西非常相似,并且使用了我提到的很多东西。

票数 19
EN

Stack Overflow用户

发布于 2011-01-09 17:37:30

我也痴迷于原生API。:)

我很高兴地说,它并不像一些人所说的那样危险,也没有记录在案。:]

"Hello,world“没有源代码,因为原生应用程序接口不容易与控制台交互,因为它是Win32子系统的一部分,需要通过端口进行客户端/服务器通信。如果您需要编写控制台应用程序,则需要直接与CSRSS通信,CSRSS的消息格式没有文档记录(尽管它的一些格式可以在ReactOS's source中找到--如果您熟悉ReactOS,它会给您带来很多好处)。

我将很快在这里发布一个您可能会感兴趣的示例;现在,请注意,您唯一的选择是链接到NTDLL.dll,为此,您需要驱动程序开发工具包(因为您需要lib文件)。

更新:查看这一点!

(我有一种感觉,没有人会发布像这样叛逆的东西。使用本机API显示GUI?!我一定是疯了!)

代码语言:javascript
复制
#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那样在每个进程中加载它(因此会有一个新的子系统),我只想让您知道,我认为这是不可能的。这非常类似于我几天前问过的this question,似乎你不能扩展NT PE Loader来了解新的子系统,所以我认为这是不可能的。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4380159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档