msh*_*yer 47 windows windows-nt subsystem
我想尝试写我自己最小的NT子系统在Windows 7上的纯粹的教育目的 - 有点像一个最基本的等效posix.exe在微软的子系统基于UNIX的应用.
但我似乎无法找到有关此主题的任何公开文档.子系统需要实现什么API?它是如何在Windows注册的?如何构建子系统映像(需要在PE头中设置哪些标志等)?
我最希望找到一本书或网站,其中包含整个主题的概述,甚至是其他人编写的"hello world"NT子系统的源代码.但是,如果你能指出我正确的方向,那么任何事情都会受到赞赏......
wj3*_*j32 18
以下是子系统的主要组件:
您需要在服务器或驱动程序中存储进程或线程状态.如果您将其存储在服务器中,则可能需要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
Run Code Online (Sandbox Code Playgroud)
在Vista及以上版本中,您无法再添加新的系统服务表,因为只有两个空间:内核的系统调用和win32k的系统调用.
经过一段谷歌搜索,我发现了这个:http://winntposix.sourceforge.net/.我认为它与您正在寻找的非常相似,并且使用了我提到的很多东西.
Meh*_*dad 13
我也痴迷于原生API.:)
而且我很高兴地说它远没有一些人看起来那么危险或无证据.:]
"Hello,world"没有源代码,因为本机API不能与控制台轻松交互,因为它是Win32子系统的一部分,需要客户端/服务器与端口通信.如果您需要编写控制台应用程序,则需要直接与CSRSS进行通信,CSRSS的消息格式未记录(尽管其某些格式可以在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;
}
Run Code Online (Sandbox Code Playgroud)
如果您有任何问题随时问!我不怕本机API!:)
编辑2:
如果您正在尝试制作自己的Kernel32 DLL版本并让它像Kernel32一样加载每个进程(因此是一个新的子系统),我只是想让您知道我认为它不可能.这是相当类似的这个问题,我问过前两天,似乎你不能延长NT PE加载器来了解新的子系统,所以我不认为这将是可能的.
| 归档时间: |
|
| 查看次数: |
3872 次 |
| 最近记录: |