Je suis aussi obsédé par l'API native :)
Et je suis heureux de dire que c'est loin d'être aussi dangereux ou sans papiers que certaines personnes le font croire :]
Il n'y a pas de code source pour "Hello, world" parce que l'API native n'interagit pas si facilement avec la console, puisqu'elle fait partie du sous-système Win32 et nécessite une communication client/serveur avec des ports. Si vous avez besoin d'écrire une application console, vous devez communiquer directement avec le CSRSS, dont les formats de messages ne sont pas documentés (bien que certains de ses formats puissent être trouvés dans le fichier Les sources de ReactOS -- cela vous ferait beaucoup de bien de vous familiariser avec ReactOS).
Je publierai bientôt ici un exemple qui pourrait vous intéresser ; pour l'instant, sachez que votre uniquement La seule option possible est de lier avec NTDLL.dll, et pour cela, vous avez besoin du Driver Development Kit (puisque vous avez besoin du fichier lib).
Mise à jour : Regardez ça !
(J'ai le sentiment que personne d'autre ne postera quelque chose d'aussi rebelle que cela. Montrer une interface graphique 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, n'hésitez pas à les poser ! Je n'ai pas peur de l'API native ! :)
Edit 2 :
Si vous essayez de créer votre propre version DLL de Kernel32 et de la faire charger comme Kernel32 le fait avec chaque processus (donc un nouveau sous-système), je voulais juste vous faire savoir que je ne pense pas que ce soit possible. C'est plutôt similaire à cette question que j'ai demandé il y a quelques jours, et il semble que vous ne pouvez pas étendre le chargeur PE de NT pour connaître les nouveaux sous-systèmes, donc je ne pense pas que ce sera possible.