Frage

Ich mag mein eigenes minimal NT-Subsystem auf Windows 7 für rein pädagogische Zwecke, um versuchen zu schreiben -. So etwas wie ein Barebone-Äquivalent des Posix.exe in Microsofts Subsystem für Unix-basierte Anwendungen

Aber ich kann nicht scheinen, jede öffentliche Dokumentation zu diesem Thema zu finden. Was API funktioniert ein Subsystem Notwendigkeit zu implementieren? Wie funktioniert das mit Windows registriert werden? Wie funktioniert das Subsystem Bild Bedarf gebaut werden (welche Flags im PE-Header festgelegt werden müssen, etc.)?

würde ich am liebsten ein Buch oder eine Web-Seite finden einen Überblick über das gesamte Thema, oder sogar den Quellcode für ein „Hallo Welt“ NT-Subsystem, dass jemand anderes geschrieben hat. Aber alles in allem würde schätzen, wenn Sie mich in der richtigen Richtung zeigen können hier ...

War es hilfreich?

Lösung

Hier sind die Hauptkomponenten eines Subsystems:

  • User-Mode-Server. Der Server erzeugt eine (A) LPC-Port und lauscht und Griffe Client-Anforderungen.
  • User-Modus-Client-DLL. Im DLL_INIT_ROUTINE, können Sie an den Anschluss an den vom Server einrichten. Diese DLL wird Ihr Subsystem API aussetzen, und einige Funktionen wird die Kommunikation mit dem Server.
  • Kernel-Modus-Unterstützung Treiber (Sie könnte dies nicht brauchen).

Sie wollen Prozess speichern oder Thread-Zustand in entweder dem Server oder Treiber. Wenn Sie es auf dem Server sind zu speichern, könnten Sie so etwas wie NtRegisterThreadTerminatePort müssen Sie, wenn ein Prozess oder Thread beendet, um aufzuräumen zu gewährleisten zu bekommen. Wenn Sie einen Treiber verwenden, müssen Sie PsSetCreateProcessNotifyRoutine .

Und schließlich, wenn Sie auf XP sind und unten, können Sie neue Systemaufrufe hinzufügen. Sie können dies tun, indem KeAddSystemServiceTable aufrufen. Um die Systemaufrufe von Benutzer-Modus aufrufen, müssen Sie Stubs wie folgt aus (für x86) erstellen:

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

Unter Vista und oben nicht mehr kann neue System Service-Tabellen hinzugefügt werden, da es nur Platz für zwei ist. Das System der Kernel-Anrufe und win32k System Anrufe

Nach ein bisschen Googeln fand ich dies: http://winntposix.sourceforge.net/ . Ich denke, dass es sehr ähnlich ist zu dem, was Sie suchen, und verwendet eine Menge Dinge, die ich erwähnt habe.

Andere Tipps

Ich bin auch mit dem nativen API besessen. :)

Und ich bin froh zu sagen, dass es bei weitem nicht so gefährlich ist oder als nicht dokumentiert, wie manche Leute es scheinen machen. :]

Es gibt keinen Quellcode für „Hallo, Welt“, weil die native API nicht interact so leicht mit der Konsole, da sie den Teil des Win32-Subsystems und erfordern Client / Server-Kommunikation mit Ports. Wenn Sie eine Konsolenanwendung schreiben müssen, müssen Sie direkt mit CSRSS kommunizieren, deren Nachrichtenformate sind nicht dokumentiert (obwohl einige seiner Format kann in ReactOS der Quelle - es würde viele Vorteile tun, wenn Sie mit ReactOS vertraut)

.

Ich werde ein Beispiel hier posten bald, dass Sie interessant finden könnten; für jetzt, nicht bewusst sein, dass Ihre nur Option immer mit NTDLL.dll zu Link ist, und dass dafür benötigen Sie die Driver Development Kit (da Sie die Lib-Datei benötigen).


Aktualisieren : Check this out

(Ich habe das Gefühl, niemand sonst etwas ganz so rebellisch wie dies veröffentlichen wird. Es werden GUI mit der nativen API ?! Ich muss verrückt sein!)

#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;
}

Wenn Sie irgendwelche Fragen haben, fühlen Sie sich frei zu fragen! Ich bin nicht der nativen API Angst! :)


Edit 2:

Wenn Sie versuchen, Ihre eigene DLL-Version von Kernel32 zu machen und hat es laden wie Kernel32 bei jedem Prozess tut (und damit ein neues Subsystem), ich wollte nur, damit Sie wissen, dass ich glaube nicht, es möglich ist. Es ist ziemlich ähnlich wie diese Frage , dass ich vor ein paar Tagen gefragt, und es scheint, dass Sie nicht den NT PE Loader erweitern können über neue Subsysteme zu wissen, so glaube ich nicht, dass es möglich sein wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top