Question

Je voudrais essayer d'écrire mon propre sous-système NT minimal sur Windows 7 à des fins purement éducatives -. Quelque chose comme un bare-bones équivalent du sous-système dans Posix.exe de Microsoft pour les applications Unix

Mais je ne peux pas sembler trouver toute la documentation publique sur ce sujet. Qu'est-ce que l'API fait nécessaire de mettre en œuvre du sous-système? Comment est-elle enregistrée avec Windows? Comment l'image du sous-système ont besoin d'être construit (ce que les drapeaux doivent être mis dans l'en-tête PE, etc.)?

Je ressemble le plus à trouver un livre ou d'un site Web avec un aperçu de l'ensemble du sujet, ou même le code source pour un « Bonjour tout le monde » sous-système NT que quelqu'un d'autre a écrit. Mais quoi que ce soit serait apprécié si vous pouvez me diriger dans la bonne direction ici ...

Était-ce utile?

La solution

Voici les principaux composants d'un sous-système:

  • serveur en mode utilisateur. Le serveur crée un (A) et le port du PLC pour Ecoutes et traite les requêtes client.
  • en mode utilisateur DLL client. Dans le DLL_INIT_ROUTINE, vous pouvez connecter au port mis en place par le serveur. Cette DLL exposera l'API de votre sous-système, et certaines fonctions nécessiteront une communication avec le serveur.
  • pilote de support en mode noyau (vous ne pouvez pas besoin de ce).

Vous voulez processus de stockage ou de l'état de fil soit dans votre serveur ou pilote. Si vous stockez dans le serveur, vous pourriez avoir besoin quelque chose comme NtRegisterThreadTerminatePort pour vous assurer de nettoyer quand un processus se termine ou fil. Si vous utilisez un pilote, vous devez PsSetCreateProcessNotifyRoutine .

Et enfin, si vous êtes sur XP et ci-dessous, vous pouvez ajouter de nouveaux appels système. Vous pouvez le faire en appelant KeAddSystemServiceTable. Pour appeler les appels système à partir du mode utilisateur, vous devez créer des talons comme celui-ci (pour x86):

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

Sur Vista et au-dessus, vous ne pouvez plus ajouter de nouvelles tables de service du système, car il n'y a qu'une place pour deux:. Les appels système de noyau et les appels système de win32k

Après un peu de recherche sur Google, je trouve ceci: http://winntposix.sourceforge.net/ . Je pense qu'il est très semblable à ce que vous cherchez, et utilise beaucoup de choses que je viens de mentionner.

Autres conseils

Je suis aussi obsédé par l'API native. :)

Et je suis heureux de dire qu'il est loin d'être aussi dangereux ou non documenté que certaines personnes font paraître. :]

Il n'y a pas de code source pour « Bonjour, monde » parce que l'API native ne pas interagi si facilement avec la console, car il fait partie du sous-système Win32 et nécessite une communication client / serveur avec ports. Si vous devez écrire une application console, vous devez communiquer directement avec CSRSS, dont les formats sont sans papier un message (bien que certains de son format peut être trouvé dans source ReactOS - il vous ferait beaucoup d'avantages si vous familiariser avec ReactOS)

.

Je posterai un exemple ici bientôt que vous pourriez trouver intéressant; pour l'instant, ne soyez conscients que votre uniquement est jamais lien avec NTDLL.DLL, et que, pour cela, vous avez besoin du kit de développement pilote (car vous avez besoin du fichier lib).


Mise à jour : Check this out

(j'ai le sentiment que personne d'autre affichera quelque chose tout aussi rebelle que cela. GUI Affichage avec l'API native ?! je dois être fou!)

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

Si vous avez des questions, ne hésitez pas à demander! Je ne suis pas peur de l'API native! :)


Edit 2:

Si vous essayez de faire votre propre version de DLL de Kernel32 et avoir comme charge Kernel32 fait avec tous les processus (donc un nouveau sous-système), je voulais juste vous dire que je ne pense pas qu'il soit possible. Il est assez similaire à cette question que j'ai demandé il y a quelques jours, et il semble que vous ne pouvez pas étendre le NT Loader PE à savoir sur les nouveaux sous-systèmes, donc je ne pense pas que ce sera possible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top