Native приложения. Первые шаги
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, но не могут, пока запущена операционная система: дефрагментаторы, конверторы файловой системы, и тому подобные утилиты.
Моя программа Native shell запускается до экрана входа в систему и предоставляет интерфейс командной строки с возможностью перемещаться по файловой системе Windows, копировать и удалять файлы, просматривать некоторую информацию об операционной системе и запускать другие процессы, способные выполняться в native-режиме, такие как autochk.exe и autoconv.exe. Доступны исходные коды программы на языке Си.
Загрузочные экраны native режима разных версий Windows:
| |
| |
Что нужно знать:
Native приложения компилируются с помощью WDK — Windows Driver Kit (также известный, как DDK). Есть возможность делать их и в какой-то другой среде разработки, но в WDK проще всего.
Native приложения используют Native API. Оно частично документировано в MSDN для использования при написании драйверов. Но документированы не все функции. Информацию по остальным нужно брать из неофициальных источников. Например, на сайте http://undocumented.ntinternals.net/
Функции в ntdll.dll имеют префиксы Zw и Nt, а также некоторые другие. Видно, что у Zw и Nt функции дублируются названия. На самом деле это одни и те же функции. Если искать в сети пример использования какой-либо функции, стоит поискать сначала с одним префиксом, потом с другим, иначе можно что-то упустить. Почему у них разные префиксы — отдельная история, для программирования native приложений существенной роли не играет.
Для программирования нужны прототипы функций Native API, но в заголовочных файлах WDK присутствуют не все определения. Нужно использовать альтернативные заголовочные файлы, содержащие в том числе и определения недокументированных функций и типов данных. Например, можно воспользоваться заголовочными файлами Native Development Kit (NDK), которые доступны здесь.
Программировать на чистом Native API неудобно. Не обойтись без библиотеки, в которой уже реализованы некоторые рутинные действия. Существует библиотека с открытым кодом — ZenWINX, можно пользоваться ей. Ещё на страничке NDK анонсирована некая библиотека NDL, но на сайте её нет.
Чтобы native приложение запустилось при запуске Windows, надо положить его в каталог system32, а в ключ реестра HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute прописать его имя файла, и аргументы, если они есть. Ключ имеет тип MULTI_SZ, может содержать несколько строк. Первой строкой там идёт Autocheck Autochk * . После неё можно прописывать свою программу. Программа, прописанная в этом ключе, имеет свойство запускаться даже в безопасном режиме Windows (safe mode), так что нужно быть осторожным. Ошибка в программе — и система не запустится. Но можно внутри приложения отслеживать факт запуска в safe mode и обрабатывать этот режим отдельно, например сделать завершение программы, если она обнаружила себя запущенной в safe mode. Кроме того, несмотря на то, что программа запускается и может выполнять какие-то действия, в этом режиме не работает вывод на консоль. Невозможно взаимодействие с пользователем. Это следует учитывать.
При необходимости, native-приложение можно запустить и не перезагружая компьютер. Для этого следует воспользоваться утилитой nrun.exe. Но загрузочный экран от этого не появится, и вам следует придумать, как ещё взаимодействовать с вашим приложением, если нужна интерактивность. В исходном коде nrun можно посмотреть, как реализован запуск native-процессов с использованием недокументированных функций Native API.
У native приложений точка входа не main и не wmain, а NtProcessStartup. В PE-заголовке EXE-файла есть специальное поле, означающее подсистему, в которой выполняется приложение. У native приложений в это поле установлено специальное значение, означающее, что EXE не требует подсистемы. У обычных приложений ставится значение, соответствующее подсистемам «Windows GUI» или «Windows console». Native приложения не запускаются в обычном режиме работы Windows. При попытке запустить программу Windows выдаёт сообщение «Приложение нельзя запустить в режиме Win32».
Вывод кириллицы на экран по-умолчанию в этом режиме не поддерживается. Есть способ обойти это ограничение, впрочем, способ сложный и пока работает только на Windows XP.
Заготовка проекта Native приложения
Я создал заготовку проекта Native приложения — набор файлов, который можно использовать в качестве базы для разработки собственного Native приложения. Заготовка содержит файл native.c , содержащий точку входа в приложение. Остальные файлы — это файлы библиотеки ZenWINX, которые модифицированы так, что используют определения функций из NDK, а не из своего файла с определениями. Это позволяет использовать как функции самой библиотеки, так и функции Native API, которые разработчики ZenWINX забыли включить в собственный заголовочный файл. Фактически, NDK — более полный каталог Native API функций, чем файл, поставляемый с ZenWINX. Компилировать заготовку нужно утилитой build из состава WinDDK (я использую версию WinDDK 1.1.6001.000). Следует подключать заголовочные файлы NDK, прописав пути к каталогу с ними.
Возможно также разрабатывать и собирать Native-приложения прямо в Visual Studio, без использования компилятора WDK. О том, как это сделать, написано в статье Сборка Native API-приложения в Visual Studio 2010.
Нативный язык для windows
Что такое нативный язык программирования?
Delphi, Java, JavaScript, AS3, C++, Object-C, Python, pHp, LUA.
Какой из них нативный, а какой вэбовский чтоле?
← →
stas © ( 2012-06-13 16:26 ) [1]
Переводим — родной.
т.е. для Windows родной будет С# например.
← →
Юрий Зотов © ( 2012-06-13 16:36 ) [2]
> для Windows родной будет С# например.
А для Windows, которые были до появления С# ?
:o)
← →
Kerk © ( 2012-06-13 16:39 ) [3]
Нативным не бывает язык, нативным бывает код.
> stas © (13.06.12 16:26) [1]
> Переводим — родной.
> т.е. для Windows родной будет С# например.
Классный троллинг 🙂
← →
tesseract © ( 2012-06-13 16:52 ) [4]
> Какой из них нативный, а какой вэбовский чтоле?
Да все. С-скрипт таки есть в природе 🙂
Это код бывает бинарным (нативным) т.е платформо зависимым, интерпретируемым и байт-кодом.
Native — родной, исконно присущий, коренной. Так что, только бинарный ;D Даже ассемблер надстройка )
← →
Давайте будем жрать! ( 2012-06-13 17:19 ) [6]
Может это политкорректное название языка, на котором программируют индейцы?
← →
картман © ( 2012-06-13 17:53 ) [7]
a Native API & Win32 API — тута в чем отличие?
← →
Давайте будем жрать! ( 2012-06-13 18:06 ) [8]
А слабо прочесть http://en.wikipedia.org/wiki/Native_API ?
← →
картман © ( 2012-06-13 18:09 ) [9]
слабо — я по ихнему не понимат
Тогда какого хрена везде говорят мол нативный язык ля-ля?
Ведь все почти нативное.
← →
SergeyIT © ( 2012-06-13 18:18 ) [11]
На форуме по Дельфи — нативный язык — Дельфи
← →
Хригорий ( 2012-06-13 18:20 ) [12]
Приведите пример не нативного языка для WIndows.
← →
asail © ( 2012-06-13 18:22 ) [13]
> Хригорий (13.06.12 18:11) [10]
> Тогда какого хрена везде говорят мол нативный язык ля-ля?
>
> Ведь все почти нативное.
Нет, не все. Тут, скорее, подразумевают, код генерируемый компилятором языка. Он нативный, ежели может бежать под ОС без использования всяких там фрэймворков и виртуальных машин. В таком контексте, Джава, например, уже не нативный язык для винды, а Дельфи — нативный.
← →
asail © ( 2012-06-13 18:23 ) [14]
> Хригорий (13.06.12 18:20) [12]
> Приведите пример не нативного языка для WIndows.
Смотри
> asail © (13.06.12 18:22) [13]
Отварной говяжий язык с хреном
← →
Хригорий ( 2012-06-13 18:32 ) [16]
> RDen © (13.06.12 18:25) [15]
>
> Отварной говяжий язык с хреном
← →
RDen © ( 2012-06-13 18:45 ) [17]
>Хригорий (13.06.12 18:32) [16]
ну не знаю, меня улыбнуло даже
← →
Хригорий ( 2012-06-13 18:50 ) [18]
> RDen © (13.06.12 18:45) [17]
>
> >Хригорий (13.06.12 18:32) [16]
>
> ну не знаю, меня улыбнуло даже
Открой программу Блокнот и пиши туда для себя любимого, приколист.
← →
tesseract © ( 2012-06-13 19:29 ) [19]
> Приведите пример не нативного языка для WIndows.
любой компилирующий в .Net или Jvm — таки не нативный байт-код.
← →
Inovet © ( 2012-06-13 19:34 ) [20]
> [15] RDen © (13.06.12 18:25)
> Отварной говяжий язык с хреном
Под кислосладким нативным соусом.
← →
Омлет © ( 2012-06-13 19:41 ) [21]
Если есть нативный, то должен быть и альтернативный?
← →
RDen © ( 2012-06-13 19:43 ) [22]
>Хригорий (13.06.12 18:50) [18]
приколист — это ты, с вопросом в [0]
все известные тебе языки нам перечислил и решил, что мы выбрать должны?
← →
Ega23 © ( 2012-06-13 19:47 ) [23]
Опять розведчег перед собеседованием балуеццо?
← →
sniknik © ( 2012-06-13 19:53 ) [24]
самый родной для винды это бейсик. его сам Гейтс написал. он вообще не компилируется, так, по словям выполняется.
← →
Inovet © ( 2012-06-13 20:10 ) [25]
> [21] Омлет © (13.06.12 19:41)
> Если есть нативный, то должен быть и альтернативный?
Вот не надо снова про них.
← →
Давайте будем жрать! ( 2012-06-13 20:18 ) [26]
Я не знаю, о чём вы, но ехать таки надо!
← →
_VirEx_ ( 2012-06-13 20:18 ) [27]
> [12] Хригорий (13.06.12 18:20)
> Приведите пример не нативного языка для WIndows.
русский
← →
Дмитрий С © ( 2012-06-13 20:19 ) [28]
> .Net
Чего это, он разве не является частью ОС в какой-нибудь 7ке?
← →
Anatoly Podgoretsky © ( 2012-06-13 20:26 ) [29]
← →
Kerk © ( 2012-06-13 21:06 ) [30]
> Дмитрий С © (13.06.12 20:19) [28]
>
> > .Net
>
> Чего это, он разве не является частью ОС в какой-нибудь
> 7ке?
А причем тут ОС? Нативное — это то, что в машинный код компилится.
← →
oxffff © ( 2012-06-13 21:24 ) [31]
> Что такое нативный язык программирования?
Это выражение выдрано из контекста, поскольку в обособленном виде вызывает путаницу.
Что собственно и наблюдается.
← →
Омлет © ( 2012-06-13 21:41 ) [32]
> sniknik © (13.06.12 19:53) [24]
> самый родной для винды это бейсик.
Бейсик — наивный язык.
← →
tesseract © ( 2012-06-13 22:04 ) [33]
Тащем-то он со времен DOS байт-код использует и даже круче — со времен Sinclair Basic! Задолго до Java.
← →
Дмитрий С © ( 2012-06-13 22:08 ) [34]
> А причем тут ОС? Нативное — это то, что в машинный код
> компилится.
Exe файл получается — получается, exe файл содержит машинный код — содержит и выполняется => net нативный. А если он не нативный, то и не нативный любой код, выполнение которого зависит от ресурсов.
← →
tesseract © ( 2012-06-13 22:12 ) [35]
> Exe файл получается — получается, exe файл содержит машинный
> код — содержит и выполняется => net нативный.
Не надо путать jit компиляцию и нативный код — jit разумеется произведет нативный код — как и любой компилер javascript — хром сразу отфигачит натив ie10 для начала прогонит через .net — но в любом случае код будет не нативным — тот же llvm может выдавать как байт-код так и натив-код.
← →
Омлет © ( 2012-06-13 22:33 ) [36]
> tesseract © (13.06.12 22:04) [33]
В [32] опечаток нет )
← →
Inovet © ( 2012-06-13 22:36 ) [37]
Вот нативные языки
http://demotivators.to/p/837182/sobaki-yazyikidostavaki.htm
← →
Anatoly Podgoretsky © ( 2012-06-14 07:43 ) [38]
> Омлет (13.06.2012 21:41:32) [32]
Роднее некуда, вначале он вообще в ПЗУ шел
← →
Anatoly Podgoretsky © ( 2012-06-14 07:45 ) [39]
> tesseract (13.06.2012 22:04:33) [33]
← →
Давайте будем жрать! ( 2012-06-14 07:52 ) [40]