Pregunta

Me gustaría probar a escribir mi propio subsistema mínima NT en Windows 7 para fines puramente educativos -. Algo así como un escueto equivalentes del Posix.exe en el subsistema de Microsoft para aplicaciones basadas en UNIX

Pero me parece que no puede encontrar ninguna documentación pública sobre este tema. Lo que hace un API necesidad subsistema de poner en práctica? ¿Cómo podría ser registrado con Windows? ¿De qué manera la necesidad imagen subsistema de que se construirá (lo banderas necesita ser colocada en la cabecera PE, etc.)?

Me había más parecido a encontrar un libro o sitio web con una visión general de todo el tema, o incluso el código fuente de un "hola mundo" subsistema de NT que alguien más ha escrito. Pero nada en absoluto sería apreciada si me puede apuntar aquí en la dirección correcta ...

¿Fue útil?

Solución

Estos son los principales componentes de un subsistema es:

  • servidor en modo de usuario. El servidor crea un puerto LPC (A) y se detecta y gestiona las peticiones de los clientes.
  • User-mode DLL cliente. En el DLL_INIT_ROUTINE, se puede conectar al puerto establecido por el servidor. Esta DLL expondrá API de su subsistema, y ??algunas funciones requerirá una comunicación con el servidor.
  • controlador de modo de núcleo de soporte (puede que no necesite esto).

Usted tendrá que guardar el estado del proceso o hilo, ya sea en el servidor o en el controlador. Si va a almacenar en el servidor, es posible que tenga algo así como NtRegisterThreadTerminatePort para asegurarse de obtener a limpiar cuando un proceso o hilo salidas. Si estás utilizando un controlador, debe PsSetCreateProcessNotifyRoutine .

Y por último, si estás en XP y a continuación, puede agregar nuevas llamadas al sistema. Puede hacerlo llamando KeAddSystemServiceTable. Para invocar las llamadas al sistema de modo de usuario, es necesario crear talones como esta (para x86):

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

En Vista y por encima de que ya no puede agregar nuevas tablas de servicio del sistema, porque sólo hay espacio para dos:. Llamadas al sistema del kernel y las llamadas al sistema de win32k

Después de un poco de google he encontrado esto: http://winntposix.sourceforge.net/ . Creo que es muy similar a lo que estás buscando, y utiliza una gran cantidad de las cosas que he mencionado.

Otros consejos

También estoy obsesionada con la API nativa. :)

Y estoy feliz de decir que es ni de lejos tan peligroso o como indocumentado como algunas personas lo hacen parecer. :]

No hay código fuente de "Hola, mundo" porque la API nativa no interactúa con tanta facilidad con la consola, ya que es parte del subsistema Win32 y requiere de cliente / servidor de la comunicación con los puertos. Si tiene que escribir una aplicación de consola, es necesario comunicarse directamente con CSRSS, cuyos formatos de mensaje son indocumentados (aunque algunos de su formato se pueden encontrar en fuente de ReactOS - que le haría muchos beneficios si se familiarice con ReactOS)

.

Voy a publicar un ejemplo aquí pronto que le puede resultar interesante; por ahora, no ser consciente de que su solamente opción siempre es establecer un vínculo con ntdll.dll, y que, para ello, necesita el controlador Development Kit (ya que se necesita el archivo lib).


Actualizar :! Mira esto

(Tengo la sensación de que nadie más va a publicar algo tan rebeldes como esto. Mostrando interfaz gráfica de usuario con la API nativa ?! debo estar loco!)

#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 tienes alguna pregunta, no dude en preguntar! No tengo miedo de la API nativa! :)


Editar 2:

Si usted está tratando de hacer su propia versión de DLL Kernel32 y hacer que cargue como Kernel32 hace con todos los procesos (de ahí un nuevo subsistema), Sólo quería hacerle saber que yo no creo que sea posible. Es bastante similar a esta pregunta que le pregunté a un par de días atrás, y parece que no se puede extender el cargador PE NT saber sobre los nuevos subsistemas, así que no creo que sea posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top