Native API "Hello, World" program

28. октября 2011 13:37 by Admin in Программирование  //  Tags: , , ,   //   Комментарии (0)

 

На днях попросили разобраться с 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)

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading

Свежачок

Календарь

<<  Февраль 2012  >>
повтсрчепясуво
303112345
6789101112
13141516171819
20212223242526
2728291234
567891011

View posts in large calendar