На днях попросили разобраться с Native API и написать для начала "Hello, world"
Краткий ликбез от hex.pp.ua
Native приложения — это программы, предназначенные для выполнения на операционных системах Windows семейства NT (NT/2000/XP/2003/Vista/7), способные запускаться на раннем этапе загрузки Windows, до окна входа в систему и даже до запуска каких-либо подсистем Windows. Синий экран при загрузке Windows XP, в котором, например, происходит проверка диска и есть тот самый режим. Native приложения используют только Native API, они могут использовать только функции, экспортируемые из библиотеки ntdll.dll. Для них недоступны функции WinAPI.
Native приложения запускаются на экране, который возникает до появления окна входа в систему. Примером native приложения является приложение chkdsk, которое запускается перед входом в Windows, если предварительно была запущена проверка системного раздела на ошибки и отложена до перезагрузки. Приложение работает, выводя сообщения экран, а затем происходит обычный запуск Windows.
Преимущества использования этого режима: большая часть компонентов Windows ещё не запущена, отсутствуют многие ограничения. Этот режим, например, используется в приложениях, которые хотят что-то сделать с системным разделом Windows, но не могут, пока запущена операционная система: дефрагментаторы, конверторы файловой системы, и тому подобные утилиты.
Чтобы начать писать такие программы необходимо скачать Windows Driver Kit (WDK, WinDDK)
Установить WinDDK
Прописать переменные окружения
Мой компьютер - Свойства - Дополнительно - Переменные среды - Переменные среды для пользователя Username
DDK_LIB_PATH
c:\winddk\7600.16385.1\lib\wxp\i386
MINWIN_SDK_LIB_PATH
c:\winddk\7600.16385.1\lib\wxp\i386
NTMAKEENV
C:\WinDDK\7600.16385.1\bin
Запустить среду разработки (так сказать)
Пуск - программы - Windows Drivers Kits - WDK7600.16385.1 - Build Environments - WindowsXP - x86 Free Build Environment
Версия WDK и Windows, естественно, может отличаться.
Перейти в папку с кодом и выполнить команду build
Теперь чуть подробнее о коде.
Свой код писал в папке C:\WinDDK\7600.16385.1\src
Создал папку с именем MyTest
Создаю файл makefile (без расширения)
!INCLUDE $(NTMAKEENV)\makefile.def
Файл sources (без расширения)
TARGETNAME=helloworld
TARGETTYPE=PROGRAM
USE_NTDLL=1
INCLUDES=..\..\inc\ddk
SOURCES = hello.c
nt.h вспомогательный заголовочный файл
//#define NtCurrentProcess() ( (HANDLE) -1 )
// structures...
typedef struct {
ULONG Unknown[21];
UNICODE_STRING CommandLine;
UNICODE_STRING ImageFile;
} ENVIRONMENT_INFORMATION, *PENVIRONMENT_INFORMATION;
typedef struct {
ULONG Unknown[3];
PENVIRONMENT_INFORMATION Environment;
} STARTUP_ARGUMENT, *PSTARTUP_ARGUMENT;
// function definitions..
NTSTATUS NTAPI NtDisplayString(PUNICODE_STRING String ); // similar to win32
// sleep function
NTSTATUS NTAPI NtDelayExecution(IN BOOLEAN Alertable,
IN PLARGE_INTEGER DelayInterval ); // like sleep
NTSTATUS NTAPI NtTerminateProcess(HANDLE ProcessHandle,
LONG ExitStatus ); // terminate own process
//VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString,
// PCWSTR SourceString); // initialization of unicode string
Файл с кодом hello.c
#include <ntddk.h>
#include <nt.h>
// just to make life easier, we create our own sleep like function
// with argument in seconds
void NtProcessStartup( PSTARTUP_ARGUMENT Argument )
{ // entry point
UNICODE_STRING dbgMessage; // unicode string
RtlInitUnicodeString(&dbgMessage, L"Hello from Native :)\n"); // lets initialize it
NtDisplayString( &dbgMessage ); // print message
NtTerminateProcess( NtCurrentProcess(), 0 ); // terminate our own process and
// return control to session manager subsystem
}
Автозапуск приложений
Автозапуск приложений режима native (так называемого синего загрузочного экрана Windows) задаётся в ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager. Там есть два ключа, позволяющих запустить приложение на этапе загрузки системы. Обычно присутствует только один из них, BootExecute. Это мультистроковый параметр, содержащий строку «autocheck autochk *». После неё можно добавить свою команду запуска. Например, можно поместить native.exe в папку %systemroot%\system32, а в BootExecute прописать строку «native». В результате native.exe запустится сразу после autochk.exe при запуске системы. Здесь же можно указать командную строку процесса, например «native -some -command». Чтобы запустить программу из любого каталога системы, нужно указать полный путь к исполняемому файлу, без NT-префикса, то есть в обычном формате (например, C:\tmp\native.exe).
Стоит помнить о том, что запуск обычных прикладных программ через BootExecute невозможен. В этом ключе могут быть прописаны только специально написанные программы, способные запускаться в native-режиме. Обычные приложения Windows к ним не относятся. Примерами программ, которые могут запускаться через BootExecute могут служить chkdsk (утилита проверки диска) и Native Shell (специально написанный шелл для загрузочного режима Windows).
mytest.zip (56,09 kb)