Domanda

Mi piacerebbe provare a scrivere il mio sottosistema minimo NT su Windows 7 per scopi puramente educativi -. Qualcosa come un bare-bones equivalenti della Posix.exe nel sottosistema di Microsoft per le applicazioni basate su Unix

Ma io non riesco a trovare alcuna documentazione pubblica su questo argomento. Che cosa fa un API necessità sottosistema di attuare? Come ottenere registrato con Windows? In che modo la necessità immagine sottosistema da costruire (quali flag deve essere impostato nell'intestazione PE, ecc.)?

mi piacerebbe più come trovare un libro o un sito web con una panoramica di tutto il soggetto, o anche il codice sorgente di un "ciao mondo" sottosistema NT che qualcun altro ha scritto. Ma nulla sarebbe apprezzato se mi si può puntare nella giusta direzione qui ...

È stato utile?

Soluzione

Ecco i componenti principali di un sottosistema:

  • Server in modalità utente. Il server crea una (A) LPC porta e intercetta e gestisce le richieste dei clienti.
  • in modalità utente DLL client. Nel DLL_INIT_ROUTINE, è possibile collegare alla porta, istituito con il server. Questa DLL esporrà API del sottosistema, e alcune funzioni richiede la comunicazione con il server.
  • il supporto driver in modalità kernel (potrebbe non essere necessario questo).

Si vuole memorizzare processo o stato del thread o nel vostro server o driver. Se stai riporlo nel server, potrebbe essere necessario qualcosa di simile NtRegisterThreadTerminatePort per assicurarsi di avere a ripulire quando un processo o thread uscite. Se si utilizza un driver, è necessario PsSetCreateProcessNotifyRoutine .

E, infine, se siete su XP e di seguito, è possibile aggiungere nuove chiamate di sistema. È possibile farlo chiamando KeAddSystemServiceTable. Per richiamare le chiamate di sistema da modalità utente, è necessario creare stub come questo (per x86):

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

Su Vista e, soprattutto, non è più possibile aggiungere nuove tabelle dei servizi di sistema perché non v'è spazio solo per due:. Chiamate di sistema del kernel e le chiamate di sistema di Win32k

Dopo un po 'di usare Google ho trovato questo: http://winntposix.sourceforge.net/ . Penso che sia molto simile a quello che stai cercando, e usa un sacco di cose che ho menzionato.

Altri suggerimenti

Sono anche ossessionato con l'API native. :)

E sono felice di dire che è in nessun posto vicino come pericoloso o senza documenti come alcune persone fanno sembrare. :]

Non c'è il codice sorgente per "Ciao, mondo", perché l'API native non interagisce così facilmente con la console, visto che è parte del sottosistema Win32 e richiede client / server di comunicazione con le porte. Se è necessario scrivere un'applicazione console, è necessario comunicare direttamente con CSRSS, i cui formati di messaggi sono privi di documenti (anche se alcuni del suo formato può essere trovato in di ReactOS fonte - ti farebbe molti vantaggi se si ottiene familiarità con ReactOS)

.

Vi posto un esempio qui a breve che potreste trovare interessante; per ora, non essere consapevoli del fatto che il solo mai è quello di collegare con NTDLL.dll, e che, per questo, è necessario il driver Development Kit (in quanto è necessario il file lib).


Aggiorna :! Check this out

(Ho la sensazione che nessun altro lo postare qualcosa altrettanto ribelle come questa. Mostrando interfaccia grafica con l'API native ?! Devo essere pazza!)

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

Se avete domande, non esitate a chiedere! Non ho paura delle API native! :)


Modifica 2:

Se si sta cercando di rendere la propria versione DLL Kernel32 e l'abbiano in carico come Kernel32 fa con ogni processo (quindi un nuovo sottosistema), volevo solo farvi sapere che io non credo sia possibile. E 'piuttosto simile a questa domanda che ho chiesto un paio di giorni fa, e sembra che non è possibile estendere il PE Loader NT a conoscere i nuovi sottosistemi, quindi non credo che sarà possibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top