Windows native что это

Время на прочтение9 мин

Количество просмотров5K

Сегодня продолжаем рассказ о том, как мы вместе с ребятами из Университета Иннополис разрабатываем технологию Active Restore, чтобы позволить пользователю как можно раньше начать работу на своей машине после сбоя. Речь пойдет о нативных приложениях Windows, включая особенности их создания и запуска. Под катом – немного о нашем проекте, а также практическое руководство как писать нативные приложения.

В прошлых постах мы уже рассказывали о том, что такое Active Restore, и как студенты из Иннополиса разрабатывают сервис. Сегодня я хочу остановиться на нативных приложениях, до уровня которых мы хотим “закопать” наш сервис активного восстановления. Если все получится, то мы сможем:

  • Намного раньше запустить сам сервис
  • Намного раньше связаться с облаком, в котором лежит бэкап
  • Намного раньше понять, в каком режиме находится система – нормальной загрузки или восстановления
  • Намного меньше файлов восстанавливать заранее
  • Позволить пользователю приступить к работе еще быстрее.

Что вообще такое нативное приложение?

Чтобы ответить на этот вопрос, давайте взглянем на последовательность вызовов, которые совершает система, например, если программист в своем приложении пытается создать файл.

Pavel Yosifovich — Windows Kernel Programming (2019)

Программист использует функцию CreateFile, которая объявлена в заголовочном файле fileapi.h и реализована в Kernel32.dll. Однако сама эта функция не занимается созданием файла, она лишь проверяет аргументы на входе и вызывает функцию NtCreateFile (приставка Nt как раз свидетельствует о том, что функция нативная). Данная функция объявлена в заголовочном файле winternl.h и реализована в ntdll.dll. Она производит подготовку к прыжку в ядерное пространство, после чего совершает системный вызов для создания файла. В данном случае получается, что Kernel32 – всего лишь обертка для Ntdll. Одна из причин для чего это сделано, Microsoft таким образом имеет возможность изменять функции нативного мира, но при этом не трогать стандартные интерфейсы. Microsoft не рекомендует напрямую вызывать нативные функции и не документирует большую часть из них. Кстати, недокументированные функции можно найти тут.

Основное преимущество нативных приложений заключается в том, что ntdll загружается в систему значительно раньше kernel32. Это логично, ведь kernel32 требует наличия ntdll для работы. Как следствие, приложения, использующие нативные функции, могут начать работу значительно раньше.

Таким образом, Windows Native Applications – это программы, способные запускаться на раннем этапе загрузки Windows. Они используют ТОЛЬКО функции из ntdll. Пример такого приложения: autochk который исполняет chkdisk utility для проверки диска на ошибки еще до запуска основных сервисов. Именно на таком уровне мы и хотим видеть наш Active Restore.

Что нам понадобится?

  • DDK (Driver Development Kit), ныне также известный под названием WDK 7 (Windows Driver Kit).
  • Виртуальная машина (например, Windows 7 x64)
  • Не обязательно, но могут помочь заголовочные файлы которые можно скачать тут

Что же в коде?

Давайте немного потренируемся и для примера напишем небольшое приложение которое:

  1. Выводит сообщение на экран
  2. Аллоцирует немного памяти
  3. Ждет ввода с клавиатуры
  4. Освобождает занятую память

В нативных приложениях точкой входа является не main или winmain, а функция NtProcessStartup, так как мы фактически напрямую запускаем новые процесс в системе.

Начнем с вывода сообщения на экран. Для этого у нас есть нативная функция NtDisplayString, которая в качестве аргумента принимает указатель на объект структуры UNICODE_STRING. Инициализировать его нам поможет RtlInitUnicodeString. В результате, для вывода текста на экран мы можем написать вот такую небольшую функцию:

//usage: WriteLn(L"Here is my text\n");
void WriteLn(LPWSTR Message)
{
    UNICODE_STRING string;
    RtlInitUnicodeString(&string, Message);
    NtDisplayString(&string);
}

Так как нам доступны только функции из ntdll, и других библиотек в памяти просто еще нет, у нас обязательно возникнут проблемы с тем как аллоцировать память. Оператора new ещё не существует (потому что он родом из слишком высокоуровнего мира C++), также нет функции malloc (для нее нужны библиотеки runtime C). Можно конечно пользоваться лишь стэком. Но если нам нужно динамически аллоцировать память, делать это придется в куче (т.е. heap). Поэтому давайте создадим для себя кучу и будем брать из нее память когда нам потребуется.

Для этой задачи подойдет функция RtlCreateHeap. Далее, используя RtlAllocateHeap и RtlFreeHeap, мы будем занимать и освобождать память когда нам это будет нужно.

PVOID memory = NULL;
PVOID buffer = NULL;
ULONG bufferSize = 42;

// create heap in order to allocate memory later
memory = RtlCreateHeap(
  HEAP_GROWABLE, 
  NULL, 
  1000, 
  0, NULL, NULL
);

// allocate buffer of size bufferSize
buffer = RtlAllocateHeap(
  memory, 
  HEAP_ZERO_MEMORY, 
  bufferSize
);

// free buffer (actually not needed because we destroy heap in next step)
RtlFreeHeap(memory, 0, buffer);

RtlDestroyHeap(memory);

Перейдем к ожиданию ввода с клавиатуры.

// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
  USHORT UnitId;
  USHORT MakeCode;
  USHORT Flags;
  USHORT Reserved;
  ULONG  ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;

//...

HANDLE hKeyBoard, hEvent;
UNICODE_STRING skull, keyboard;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK Iosb;
LARGE_INTEGER ByteOffset;
KEYBOARD_INPUT_DATA kbData;

// inialize variables
RtlInitUnicodeString(&keyboard, L"\\Device\\KeyboardClass0");
InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);

// open keyboard device
NtCreateFile(&hKeyBoard,
			SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
			&ObjectAttributes,
			&Iosb,
			NULL,
			FILE_ATTRIBUTE_NORMAL,
			0,
			FILE_OPEN,FILE_DIRECTORY_FILE,
			NULL, 0);

// create event to wait on
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);

while (TRUE)
{
	NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
	NtWaitForSingleObject(hEvent, TRUE, NULL);

	if (kbData.MakeCode == 0x01)    // if ESC pressed
	{
			break;
	}
}

Все что нам нужно – это использовать NtReadFile на открытом устройстве, и ждать, пока клавиатура не вернет нам какое либо нажатие. В случае, если нажата клавиша ESC, мы продолжим работу. Чтобы открыть устройство, нам потребуется вызвать функцию NtCreateFile (открыть нужно будет \Device\KeyboardClass0). Также мы вызовем NtCreateEvent, чтобы инициализировать объект для ожидания. Мы самостоятельно объявим структуру KEYBOARD_INPUT_DATA, которая представляет данные клавиатуры. Это облегчит нам работу.

Работа нативного приложения завершается вызовом функции NtTerminateProcess, потому что мы просто убиваем свой собственный процесс.

Весь код нашего небольшого приложения:

#include "ntifs.h" // \WinDDK\7600.16385.1\inc\ddk
#include "ntdef.h"

//------------------------------------
// Following function definitions can be found in native development kit
// but I am too lazy to include `em so I declare it here
//------------------------------------

NTSYSAPI
NTSTATUS
NTAPI
NtTerminateProcess(
  IN HANDLE               ProcessHandle OPTIONAL,
  IN NTSTATUS             ExitStatus
);

NTSYSAPI 
NTSTATUS
NTAPI
NtDisplayString(
	IN PUNICODE_STRING String
);

NTSTATUS 
NtWaitForSingleObject(
  IN HANDLE         Handle,
  IN BOOLEAN        Alertable,
  IN PLARGE_INTEGER Timeout
);

NTSYSAPI 
NTSTATUS
NTAPI
NtCreateEvent(
    OUT PHANDLE             EventHandle,
    IN ACCESS_MASK          DesiredAccess,
    IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
    IN EVENT_TYPE           EventType,
    IN BOOLEAN              InitialState
);



// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
  USHORT UnitId;
  USHORT MakeCode;
  USHORT Flags;
  USHORT Reserved;
  ULONG  ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;

//----------------------------------------------------------
// Our code goes here
//----------------------------------------------------------

// usage: WriteLn(L"Hello Native World!\n");
void WriteLn(LPWSTR Message)
{
    UNICODE_STRING string;
    RtlInitUnicodeString(&string, Message);
    NtDisplayString(&string);
}

void NtProcessStartup(void* StartupArgument)
{
	// it is important to declare all variables at the beginning
	HANDLE hKeyBoard, hEvent;
	UNICODE_STRING skull, keyboard;
	OBJECT_ATTRIBUTES ObjectAttributes;
	IO_STATUS_BLOCK Iosb;
	LARGE_INTEGER ByteOffset;
	KEYBOARD_INPUT_DATA kbData;
	
	PVOID memory = NULL;
	PVOID buffer = NULL;
	ULONG bufferSize = 42;

	//use it if debugger connected to break
	//DbgBreakPoint();

	WriteLn(L"Hello Native World!\n");

	// inialize variables
	RtlInitUnicodeString(&keyboard, L"\\Device\\KeyboardClass0");
	InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);

	// open keyboard device
	NtCreateFile(&hKeyBoard,
				SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
				&ObjectAttributes,
				&Iosb,
				NULL,
				FILE_ATTRIBUTE_NORMAL,
				0,
				FILE_OPEN,FILE_DIRECTORY_FILE,
				NULL, 0);

	// create event to wait on
	InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
	NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);
	
	WriteLn(L"Keyboard ready\n");
	
	// create heap in order to allocate memory later
	memory = RtlCreateHeap(
	  HEAP_GROWABLE, 
	  NULL, 
	  1000, 
	  0, NULL, NULL
	);
	
	WriteLn(L"Heap ready\n");

	// allocate buffer of size bufferSize
	buffer = RtlAllocateHeap(
	  memory, 
	  HEAP_ZERO_MEMORY, 
	  bufferSize
	);
	
	WriteLn(L"Buffer allocated\n");

	// free buffer (actually not needed because we destroy heap in next step)
	RtlFreeHeap(memory, 0, buffer);

	RtlDestroyHeap(memory);
	
	WriteLn(L"Heap destroyed\n");
	
	WriteLn(L"Press ESC to continue...\n");

	while (TRUE)
	{
		NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
		NtWaitForSingleObject(hEvent, TRUE, NULL);

		if (kbData.MakeCode == 0x01)    // if ESC pressed
		{
				break;
		}
	}

	NtTerminateProcess(NtCurrentProcess(), 0);
}

PS: Мы можем запросто использовать в коде функцию DbgBreakPoint() для остановки в дебаггере. Правда нужно будет подключить WinDbg к виртуальной машине для кернельной отладки. Инструкцию как это сделать можно найти тут или просто использовать VirtualKD.

Компиляция и сборка

Самый простой способ собрать нативное приложение – это использовать DDK (Driver Development Kit). Нам нужна именно древняя седьмая версия, так как более поздние версии имеют несколько иной подход и тесно работают с Visual Studio. Если же использовать DDK, то нашему проекту нужны всего лишь Makefile и sources.

Makefile

!INCLUDE $(NTMAKEENV)\makefile.def

sources:

TARGETNAME			= MyNative
TARGETTYPE			= PROGRAM
UMTYPE				= nt
BUFFER_OVERFLOW_CHECKS 		= 0
MINWIN_SDK_LIB_PATH		= $(SDK_LIB_PATH)
SOURCES 			= source.c

INCLUDES 			= $(DDK_INC_PATH); \
				  C:\WinDDK\7600.16385.1\ndk;

TARGETLIBS 			= $(DDK_LIB_PATH)\ntdll.lib	\
				  $(DDK_LIB_PATH)\nt.lib

USE_NTDLL			= 1

Ваш Makefile будет точно таким же, на sources же давайте остановимся чуть подробнее. В данном файле указываются исходники вашей программы (файлы .c), опции сборки и другие параметры.

  • TARGETNAME – имя исполняемого файла, который должен получиться в итоге.
  • TARGETTYPE – тип исполняемого файла, это может быть драйвер (.sys), тогда значение поля должно быть DRIVER, если библиотека (.lib), то значение LIBRARY. В нашем случае нужен исполняемый файл (.exe), поэтому мы устанавливаем значение PROGRAM.
  • UMTYPE – возможные значения этого поля: console для консольного приложения, windows для работы в оконном режиме. Но нам необходимо указать nt, чтобы получить нативное приложение.
  • BUFFER_OVERFLOW_CHECKS – проверка стэка на переполнение буфера, к сожалению не наш случай, выключаем.
  • MINWIN_SDK_LIB_PATH – данное значение ссылается на переменную SDK_LIB_PATH, не стоит переживать что у вас не объявлена подобная системная переменная, в момент когда мы запустим checked build из DDK, данная переменная будет объявлена и будет указывать на необходимые библиотеки.
  • SOURCES – список исходников вашей программы.
  • INCLUDES – заголовочные файлы, которые необходимы для сборки. Тут обычно указывают путь к файлам, которые идут в комплекте с DDK, но вы можете указать дополнительно любые другие.
  • TARGETLIBS – список библиотек, которые необходимо линковать.
  • USE_NTDLL – обязательное поле, которое необходимо установить в положение 1. По вполне очевидным причинам.
  • USER_C_FLAGS – любые флаги, которые вы сможете использовать в препроцессорных директивах при подготовке кода приложения.

Итак для сборки нам необходимо запустить x86 (или x64) Checked Build, сменить рабочий каталог на папку с проектом и выполнить команду Build. Результат на скриншоте показывает что у нас собрался один исполняемый файл.

Build

Данный файл не получится так просто запустить, система ругается и отправляет нас думать о своем поведении со следующей ошибкой:

Error

Как запустить нативное приложение?

В момент старта autochk последовательность запуска программ определяется значением ключа реестра:

HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute

Менеджер сессии поочередно исполняет программы из этого списка. Сами же исполняемые файлы менеджер сессии ищет в директории system32. Формат значения ключа реестра следующий:

autocheck autochk *MyNative

Значение должно быть в шестнадцатеричном формате, а не в привычном ASCII, следовательно ключ, представленный выше, будет иметь формат:

61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00

Чтобы конвертировать название, можно использовать онлайн-сервис, например, этот.

Получается, чтобы запустить нативное приложение, нам необходимо:

  1. Скопировать исполняемый файл в папку system32
  2. Добавить в реестр ключ
  3. Перезагрузить машину

Для удобства вот вам готовый скрипт для установки нативного приложения:

install.bat

@echo off
copy MyNative.exe %systemroot%\system32\.
regedit /s add.reg
echo Native Example Installed
pause

add.reg

REGEDIT4

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]
"BootExecute"=hex(7):61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00

После установки и перезагрузки еще до появления экрана выбора пользователей мы получим следующую картину:

result

Итог

На примере вот такого маленького приложения мы убедились, что запустить приложение на уровне Windows Native вполне возможно. Дальше мы с ребятами из Университета Иннополис продолжим строить сервис, который будет инициировать процесс взаимодействия с драйвером намного раньше, чем в предыдущей версии нашего проекта. А с появлением оболочки win32 логично будет передать управление полноценному сервису, который уже был разработан (об этом подробнее здесь).

В очередной статье мы коснемся еще одного компонента сервиса Active Restore, а именно UEFI драйвера. Подписывайтесь на наш блог, чтобы не пропустить следующий пост.

Программирование с использованием Native API функций ntdll.dll

Командная строка Windows Native Mode

Native shell — командная строка для экспериментов с native режимом Windows

Коммандный интерпретатор NCMD, утилиты XCOPY REG n7z nMount nCab nDrv nList

Комманды поддерживаемые коммандным интерпретатором NCMD
[more]List of all available commands (+ description)

command /? For more information on a specific command

? List all available commands (without description).
ATTRIB Displays or changes file attributes.
CALL Calls one batch program from another.
CD Displays the name of or changes the current directory.
NCMD Starts a new instance of the Native command interpreter.
COPY Copies one or more files to another location.
DATE Displays or sets the date.
DELETE Deletes one or more files.
DIR Displays a list of files and subdirectories in a directory.
ECHO Displays messages, or turns command echoing on or off.
ERASE Deletes one or more files.
EXIT Quits the CMD.EXE program (command interpreter).
FOR Runs a specified command for each file in a set of files.
FREE (free) disc space.
GOTO Directs the Native command interpreter to a labeled line in
a batch program.
HELP Provides Help information for Native commands.
IF Performs conditional processing in batch programs.
LABEL Creates, changes, or deletes the volume label of a disk.
MD Creates a directory.
MKDIR Creates a directory.
MKLINK Creates a filesystem link object.
MOVE Moves one or more files from one directory to another
directory.
PATH Displays or sets a search path for executable files.
PAUSE Suspends processing of a batch file and displays a message.
POPD Restores the previous value of the current directory saved by
PUSHD.
PROMPT Changes the command prompt.
PUSHD Saves the current directory then changes it.
RD Removes a directory.
REM Records comments (remarks) in batch files.
REN Renames a file or files.
RENAME Renames a file or files.
REPLACE Replaces files.
RMDIR Removes a directory.
SET Displays, sets, or removes Native environment variables.
SHIFT Shifts the position of replaceable parameters in batch files.
TIME Displays or sets the system time.
TIMER Allow the use of ten stopwatches.
TYPE Displays the contents of a text file.
VER Displays the system version.
VERIFY Tells Native Cmd whether to verify that your files are written
correctly to a disk.
VOL Displays a disk volume label and serial number.
Displays or changes file attributes.

ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] file …
[/S [/D]]

+ Sets an attribute
— Clears an attribute
R Read-only file attribute
A Archive file attribute
S System file attribute
H Hidden file attribute
/S Processes matching files in the current directory
and all subdirectories
/D Processes directories as well

Type ATTRIB without a parameter to display the attributes of all files.
Calls one batch program from another.

CALL [drive:][path]filename [batch-parameter]

batch-parameter Specifies any command-line information required by the
batch program.Changes the current directory or displays it’s name

CHDIR [/D][drive:][path]
CHDIR[..|.]
CD [/D][drive:][path]
CD[..|.]

.. parent directory
. current directory
/D Will change current drive and current directory.

Type CD drive: to display the current directory on the specified drive.
Type CD without a parameter to display the current drive and directory.
Copies one or more files to another location.

COPY [/V][/Y|/-Y][/A|/B] source [/A|/B]
[+ source [/A|/B] [+ …]] [destination [/A|/B]]

source Specifies the file or files to be copied.
/A Indicates an ASCII text file.
/B Indicates a binary file.
destination Specifies the directory and/or filename for the new file(s).
/V Verifies that new files are written correctly.
/Y Suppresses prompting to confirm you want to overwrite an
existing destination file.
/-Y Causes prompting to confirm you want to overwrite an
existing destination file.

The switch /Y may be present in the COPYCMD environment variable.

Displays or sets the date.

DATE [/T][date]

/T display only

Type DATE without parameters to display the current date setting and
a prompt for a new one. Press ENTER to keep the same date.
Deletes one or more files.

DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file …
DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file …
ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file …

file Specifies the file(s) to delete.

/N Nothing.
/P Prompt. Ask before deleting each file.
/T Total. Display total number of deleted files and freed disk space.
/Q Quiet.
/W Wipe. Overwrite the file with random numbers before deleting it.
/Y Yes. Kill even *.* without asking.
/F Force Delete hidden, read-only and system files.
/S Delete file from all sub directory
/A Select files to be deleted based on attributes.
attributes
R Read Only files
S System files
A Archiveable files
H Hidden Files
— prefix meaning not
DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

[drive:][path][filename]
Specifies drive, directory, and/or files to list.

/A Displays files with specified attributes.
attributes D Directories R Read-only files
H Hidden files A Files ready for archiving
S System files — Prefix meaning not
/B Uses bare format (no heading information or summary).
/C Display the thousand separator in file sizes. This is the
default. Use /-C to disable display of separator.
/D Same as wide but files are list sorted by column.
/L Uses lowercase.
/N New long list format where filenames are on the far right.
/O List by files in sorted order.
sortorder N By name (alphabetic) S By size (smallest first)
E By extension (alphabetic) D By date/time (oldest first)
G Group directories first — Prefix to reverse order
/P Pauses after each screenful of information.
/Q Display the owner of the file.
/S Displays files in specified directory and all subdirectories.
/T Controls which time field displayed or used for sorting
timefield C Creation
A Last Access
W Last Written
/W Uses wide list format.
/X This displays the short names generated for non-8dot3 file
names. The format is that of /N with the short name inserted
before the long name. If no short name is present, blanks are
displayed in its place.
/4 Displays four-digit years

Switches may be preset in the DIRCMD environment variable. Override
preset switches by prefixing any switch with — (hyphen)—for example, /-W.
Displays a message or switches command echoing on or off.

ECHO [ON | OFF]
ECHO [message]
ECHO. prints an empty line

Type ECHO without a parameter to display the current ECHO setting.Deletes one or more files.

DEL [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file …
DELETE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file …
ERASE [/N /P /T /Q /S /W /Y /Z /A[[:]attributes]] file …

file Specifies the file(s) to delete.

/N Nothing.
/P Prompt. Ask before deleting each file.
/T Total. Display total number of deleted files and freed disk space.
/Q Quiet.
/W Wipe. Overwrite the file with random numbers before deleting it.
/Y Yes. Kill even *.* without asking.
/F Force Delete hidden, read-only and system files.
/S Delete file from all sub directory
/A Select files to be deleted based on attributes.
attributes
R Read Only files
S System files
A Archiveable files
H Hidden Files
— prefix meaning not
Exits the command line interpreter.

EXIT [/b] [ExitCode]

/B Exits a batch file only.
If run outside of a batch file it will exit cmd.exe
ExitCode This value will be assigned to ERRORLEVEL on exit
Runs a specified command for each file in a set of files

FOR variable IN (set) DO command [parameters]

variable Specifies a replaceable parameter.
(set) Specifies a set of one or more files. Wildcards may be used.
command Specifies the command to carry out for each file.
parameters Specifies parameters or switches for the specified command.

To use the FOR command in a batch program, specify %variable instead of
variable.
Displays drive information.

FREE [drive: …]
Directs CMD to a labeled line in a batch script.

GOTO label

label Specifies a text string used in a batch script as a label.

You type a label on a line by itself, beginning with a colon.Performs conditional processing in batch programs.

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
IF [NOT] DEFINED variable command

NOT Specifies that CMD should carry out the command only if
the condition is false
ERRORLEVEL number Specifies a true condition if the last program run returned
an exit code equal or greater than the number specified.
command Specifies the command to carry out if the condition is met.
string1==string2 Specifies a true condition if the specified text strings
match.
EXIST filename Specifies a true condition if the specified filename exists.
DEFINED variable Specifies a true condition if the specified variable is
defined.
Displays or changes drive label.

LABEL [drive:][label]
Creates a directory.

MKDIR [drive:]path
MD [drive:]pathCreates a directory.

MKDIR [drive:]path
MD [drive:]pathCreates a filesystem link object.

MKLINK [/D | /H | /J] linkname target

/D Indicates that the symbolic link target is a directory.
/H Create a hard link.
/J Create a directory junction.

If neither /H or /J is specified, a symbolic link is created.
Moves files and renames files and directories.

To move one or more files:
MOVE [/N][drive:][path]filename1[,…] destination

To rename a directory:
MOVE [/N][drive:][path]dirname1 dirname2

[drive:][path]filename1 Specifies the location and name of the file
or files you want to move.
/N Nothing. Do everything but move files or directories.

Current limitations:
— You can’t move a file or directory from one drive to another.
Displays or sets a search path for executable files.

PATH [[drive:]path[;…]]
PATH ;

Type PATH ; to clear all search-path settings and direct the command shell
to search only in the current directory.
Type PATH without parameters to display the current path.
Stops the execution of a batch file and shows the following message:
‘Press any key to continue…’ or a user defined message.

PAUSE [message]Changes to the directory stored by the PUSHD command.

POPD
Stores the current directory for use by the POPD command, then
changes to the specified directory.

PUSHD [path | ..]

path Specifies the directory to make the current directory

Changes the command prompt.

PROMPT [text]

text Specifies a new command prompt.

Prompt can be made up of normal characters and the following special codes:

$A & (Ampersand)
$B | (pipe)
$C ( (Left parenthesis)
$D Current date
$E Escape code (ASCII code 27)
$F ) (Right parenthesis)
$G > (greater-than sign)
$H Backspace (erases previous character)
$L < (less-than sign)
$N Current drive
$P Current drive and path
$Q = (equal sign)
$T Current time
$V OS version number
$_ Carriage return and linefeed
$$ $ (dollar sign)
$+ Displays the current depth of the directory stack
Type PROMPT without parameters to reset the prompt to the default setting.Stores the current directory for use by the POPD command, then
changes to the specified directory.

PUSHD [path | ..]

path Specifies the directory to make the current directory

Removes a directory.

RMDIR [drive:]path
RD [drive:]path
/S            Deletes all files and folders within target
/Q            Doesnt prompt for user
Starts a comment line in a batch file.

REM [Comment]Renames a file/directory or files/directories.

RENAME [/E /N /P /Q /S /T] old_name … new_name
REN [/E /N /P /Q /S /T] old_name … new_name

/E No error messages.
/N Nothing.
/P Prompts for confirmation before renaming each file.
(Not implemented yet!)
/Q Quiet.
/S Rename subdirectories.
/T Display total number of renamed files.

Note that you cannot specify a new drive or path for your destination. Use
the MOVE command for that purpose.
Renames a file/directory or files/directories.

RENAME [/E /N /P /Q /S /T] old_name … new_name
REN [/E /N /P /Q /S /T] old_name … new_name

/E No error messages.
/N Nothing.
/P Prompts for confirmation before renaming each file.
(Not implemented yet!)
/Q Quiet.
/S Rename subdirectories.
/T Display total number of renamed files.

Note that you cannot specify a new drive or path for your destination. Use
the MOVE command for that purpose.
Replaces files.

REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W]
REPLACE [drive1:][path1]filename [drive2:][path2] [/P] [/R] [/S] [/W] [/U]

[drive1:][path1]filename Specifies the source file or files.
[drive2:][path2] Specifies the directory where files are to be
replaced.
/A Adds new files to destination directory. Cannot
use with /S or /U switches.
/P Prompts for confirmation before replacing a file or
adding a source file.
/R Replaces read-only files as well as unprotected
files.
/S Replaces files in all subdirectories of the
destination directory. Cannot use with the /A
switch.
/W Waits for you to insert a disk before beginning.
/U Replaces (updates) only files that are older than
source files. Cannot use with the /A switch.
Removes a directory.

RMDIR [drive:]path
RD [drive:]path
/S            Deletes all files and folders within target
/Q            Doesnt prompt for user
Displays, sets, or removes environment variables.

SET [variable[=][string]]

variable Specifies the environment-variable name.
string Specifies a series of characters to assign to the variable.

Type SET without parameters to display the current environment variables.
Changes the position of replaceable parameters in a batch file.

SHIFT [DOWN]Displays or sets the system time.

TIME [/T][time]

/T display only

Type TIME with no parameters to display the current time setting and a prompt
for a new one. Press ENTER to keep the same time.
allow the use of ten stopwatches.

TIMER [ON|OFF] [/S] [/n] [/Fn]

ON set stopwatch ON
OFF set stopwatch OFF
/S Split time. Return stopwatch split
time without changing its value
/n Specifiy the stopwatch number.
Stopwatches available are 0 to 9
If it is not specified default is 1
/Fn Format for output
n can be:
0 milliseconds
1 hhђmmђssђdd

if none of ON, OFF or /S is specified the command
will toggle stopwatch state

Displays the contents of text files.

TYPE [drive:][path]filename
/P          Shows one screen of output at a time.
Displays shell version information
This command is just a dummy!!
Sets whether to verify that your files are written correctly to a
disk.

VERIFY [ON | OFF]

Type VERIFY without a parameter to display the current VERIFY setting.
Displays the disk volume label and serial number, if they exist.

VOL [drive:]
————— пример——————

Цитата:

@echo off
for %%i in (C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z) do if exist %%i:\SVPE\winpe.wim set LETTER=%%i
if defined %LETTER% (
ECHO FileSystem not found
NCMD
) ELSE (
ECHO %LETTER%:\ copy…
FOR /F %%I IN (‘DIR /S /B /A:-D %LETTER%:\I386’) DO copy %%I X:%%~pnxI>nul
FOR /F %%I IN (‘DIR /S /B %LETTER%:\Programs’) DO copy %%I X:%%~pnxI>nul
)

[/more]
прим. вместо CMD NCMD, комманда DEFINED работает как UNDEFINED, SETLOCAL ENDLOCAL, SETLOCAL ENABLEDELAYEDEXPANSION и вывод части строки поддерживается. на ELSE ошибка не выдается но команда не работает. не работает NOT DEFINED вместо нее можно использовать if [NOT] «%VALUE%»==»»

Коммандный интепретатор Native Shell (дописан открытый код)
cd,md,copy,poweroff,dir,del,reboot,devtree,shutdown,exit,sysinfo,lm,vid,lp,move,if,load,expand, mount

Утилита нативного режима для установки драйверов Nloadsys
Nloadsys.exe default vmscsi.sys
Nloadsys.exe default vmscsi.sys system32\drivers

Ultra Defrag дефрагментатор нативного режима

Srdelayed.exe утилита копирования файлов для ядра Windows 7

компоненты Windows нативного режима AUTOCHK, AUTOFMT, AUTOCONV

Программы PendMoves и MoveFile. Интерфейс перемещения системных и занятых процессом файлов

Операционная система нативного режима OO Bluecon XXL Enu *таблетки нет

Установка и использование консоли восстановления в Windows XP
Пропатченная консоль восстановления

native.zip 35,2 КБ (36 110 байт)
NativeCmd.zip 199 КБ (204 484 байт)
NativeApps.zip 66,4 КБ (68 034 байт)
Nloadsys.zip 4,86 КБ (4 983 байт)
defrag_native.zip 58,1 КБ (59 592 байт)
AUTO.zip 653 КБ (669 595 байт)

Автор: ashumov
Дата сообщения: 25.04.2012 23:31

Цитата:

Пропатченная консоль восстановления

изменённый spcmdcon.sys не нужен
cmdcons.iso образ для usb flash
Portable Windows XP SP3 Recovery Console
добавлена эмуляция Windows XP: папки cmdcons\system32\drivers — пустая, cmdcons\system32\config c файлами sam и security(без ввода пароля)
При загрузке всегда выбирать в качестве папки windows
X:\cmdcons

Автор: bomzzz
Дата сообщения: 25.04.2012 23:37

надо же я думал никто никогда ничего не напишет. это в шапке просто все что удалось собрать по нативу вообще, включая и околонативные темы

а я вот сделал сборку win pe для компьютеров поддерживающих загрузку с юсб 1.1, но через виндовый драйвер контроллеры выдающих 2.0. вот только все собраться не могу чета написать сюда про это в приличном виде. вся инфа в теме про сборки осталась.

http://rghost.ru/37767902

еще могу добавить что Nloadsys.exe может загрузить только один драйвер, если нужно загрузить второй то надо перезагрузить native — выйти и запустить еще одну копию из реестра. китайцы код дописывают, надо следить за версиями заходить читать китайскую грамоту

вот я еще установочную дискету делал. собрал во едино под запуск грубом все шесть дискет, интегрировал драйвер winvblock, включил поддержку больших винтов, и добавил утилиту для форматирования — тоже полноценная консоль восстановления и установочная дискета — например для случая сата сд приводов без эмуляции.
http://rghost.ru/37771879

Автор: ashumov
Дата сообщения: 26.04.2012 00:05

Попробую из шапки что запускается в моей сборке windows native
Собрал 1.44 win32 для ntfs
DOS для NTFS

Автор: bomzzz
Дата сообщения: 26.04.2012 00:09

дос с нтфс у меня в процесе доработки.
может подрежешь чего полезного
http://rghost.ru/37772152
здесь последняя версия парагоновского нтфс драйвера, выдрана из тотал дефрага 2010

Автор: ashumov
Дата сообщения: 26.04.2012 00:13

Цитата:

интегрировал драйвер winvblock

WVBlk32.sys поподробнее если можно…

Добавлено:

Цитата:

последняя версия парагоновского нтфс драйвера

драйвер Paragon ntfs4dos с встроенным DPMI сервером с помощью D3X by Daniel Borca
win32 для ntfs на основе HX by Japheth
файловый менеджер FAR версия 1.70

Автор: bomzzz
Дата сообщения: 26.04.2012 00:19

в теме GRUB4DOS он проживает. http://reboot.pro/ автор тут отписывается
драйвер виртуальный устройств создаваемых grub и syslinux+memdisk. чтоб собрать все флоппи дискеты вместе пришлось создать нестандартную флоппи дискеты на 8 или там 10 мб, ее можно запустить только грубом, а винда увидит ее только через драйвер — вот для этого туда винвблок и засунут

Добавлено:
в досе всё меню на горячих клавишах F1 F2 F3 ALT+F3 SHIFT+F3 F4 F5 F6 F7 F8 F9 F10 F11 F12

Автор: bomzzz
Дата сообщения: 26.04.2012 08:19

у тебя на сайте есть некоторые вещи которые мне не удалось подтвердить
http://www.multiboot.ru/dos8.htm

Цитата:

Сервисы HIMEM и SMARTDRV, отдельные файлы Windows 98, загружаемые во время установки теперь встроены в ядро ОС: файл Io.sys, сжатый и уменьшенный по размеру для быстрой загрузки.

при установке винды из под 8-го доса требуется SMARTDRV, он запускается и устанавливается, так что возможно HIMEM в IO.SYS есть, а вот SMARTDRV нету. возможно его надо активировать дополнительно, но ничего об этом найти не удалось. NCACHE — Norton Cache тоже ставиться и винда просить SMARTDRV перестает. А вот установить HIMEM.SYS не получается — пишет что менеджер памяти уже установлен

Цитата:

После выхода в сентябре 2000 года последней версии 4.90.3000 Windows 98, более известной как Windows Millennium Edition ME с заблокированным режимом загрузки native/real/true/pure MS-DOS mode с жесткого диска в интернете появилась соответствующая заплатка Real DOS-Mode Patch for Windows ME v1.3 устраняющая эту преднамеренную ошибку Microsoft.

В дистрибутиве Windows ME в папке \Tools\NetTools\FAC\ лежит файл ltools.dta, это архив внутри которого лежит command.com и io.sys с разлоченной загрузкой с жесткого диска и с разлоченным использованием MSDOS.SYS — точно сейчас не сформулирую в чем трабла с этим MSDOS.SYS но с этим COMMAND.COM ее нет.

http://rghost.ru/37773906 от Windows ME Rus. распаковывается 7zip и RAR

Автор: ashumov
Дата сообщения: 26.04.2012 15:27

Русская версия статьи о ДОС 8 очень давно не обновлялась
Наиболее полная информация на английской странице и в PDF файле
http://www.multiboot.ru/msdos8.pdf
himem.sys встроенный в IO.SYS версии 8.00 имеет версию 3.99
подробности http://reboot.pro/5497/page__st__50

Цитата:

SMARTDRV

Цитата:

возможно его надо активировать дополнительно

Просмотр текстовых строк расжатого io.sys(Uncompressed by IO8DCOMP
Copyright (C) 2010 by Rudolph R. Loew) показал дополнительный параметр
файла msdos.sys (winboot.ini)
BOOTPERF
не описанный в Complete MSDOS.SYS Reference и скорее всего нигде
Кроме того есть информация о замедлении работы io.sys после применения
Real DOS-Mode Patch for Windows Millennium v1.3 By Reines [MFD] , 2000
http://www.computing.net/answers/windows-me/real-dosmode/36206.html

У меня есть все варианты файла IO.SYS и COMMAND.COM 8-й версии от Microsoft

Merged real mode drivers in Io.sys. Services such as HIMEM and SMARTDRV, which are separate files in Windows 98 that must be loaded during boot, are now built into the Windows Me Io.sys file. This improves read performance of the hard disk during boot. Io.sys is compressed, which reduces disk size and makes it faster to load.
Осталось только для Китайцев
http://www.microsoft.com/taiwan/whdc/archive/fast-boot.mspx

http://search.microsoft.com/en-US/results.aspx?qsc0=0&q=%22Merged+real+mode+drivers%22&x=14&y=14

Автор: bomzzz
Дата сообщения: 26.04.2012 17:03

BOOTPERF так как его использовать этот параметр?

Автор: ashumov
Дата сообщения: 26.04.2012 18:55

Цитата:

BOOTPERF так как его использовать этот параметр?

boot performance эффективность загрузки
Этот же вопрос я хотел задать на англоязычных MSFN или Reboot

[Paths]
;;This part may be needed if Windows is to be loaded after booting DOS mode
WinDir=C:\
;;;;;;;;;;;;;;;;;;;;

[Options]

DisableLog=1
SystemReg=0
BootPerf=1

winboot.sys 118 784
io.sys 116 736
OEM версии 2000 г. больший для HDD второй для дискет скорее всего BootPerf=1
хотя бы на одном будет работать
io.sys из diskcopy.dll cо старым патчем 2000 г. скорее всего нет — computing.net
io.sys из diskcopy.dll c моим новым патчем http://www.multiboot.ru/download/Patch8.zip
Decompressed & Reduced IO.SYS version 8.0 Size 130 832
не знаю как проверить…
http://groups.google.com/group/fido7.ru.dos/browse_thread/thread/f556211ea4697224
Packed IO.SYS 7.10
» Нет, детально с числами и смещениями описывать конечно не буду.
Все манипуляции с файлами я делал руками в hiew (без hiew — как
без рук) и почти ничего не записывал, записал только смещения по
которым правятся умолчания, изменяемые в msdos.sys.»
«
Цитата:

Или вам нужны смещения по которым правятся умолчания? Если нужно кину.

»
Alexander Karmanov
Непризнанный гений…

Автор: bomzzz
Дата сообщения: 26.04.2012 19:10

я тоже hiew люблю

Автор: ashumov
Дата сообщения: 26.04.2012 20:18

Некто mamaich написал статью возвращение дос в миллениум где подробно описал редактирование command.com в hiew
на данный момент статьи уже нет в интернете, была на бесплатном хостинге
в свое время повторил его манипуляции и в итоге
«Another Russian path for COMMAND.COM by mamaich turn off any checks
12 8B 16 08 —>> 44 8B 16 08″
это не проверка загрузки с флоппи или хд

Добавлено:

Цитата:

нужны смещения по которым правятся умолчания

для того чтобы не использовать msdos.sys a хотя бы забить в io.sys

Цитата:

DisableLog=1

Автор: LEX1
Дата сообщения: 26.04.2012 22:11

Автор: ashumov
Дата сообщения: 26.04.2012 22:23

Цитата:

LEX1

Большое спасибо, хотя копия у меня есть но на своей странице могу дать живую ссылку
Some features of MS-DOS 8.0

Автор: ashumov
Дата сообщения: 27.04.2012 23:16

Цитата:

Коммандный интерпретатор NCMD

ncmd.exe работает вместе с kernel.dll антивирус определяет его как вирус, схожая ситуация с dkrnl32.dll от Japheth HX DOS extender набор встроенных команд меньше чем у blue console

Цитата:

Утилита нативного режима для установки драйверов Nloadsys

в моей сборке Windows XP native portable (standalone)

Цитата:

Командная строка Windows Native Mode

не работает, пытался запустить winkey.sys Passware (Windows Key)
txtsetup.sif
[ScsiClass.Load]
;winkey.sys=winkey.sys
bomzzz на китайском сайте давал информацию о нормальной работе Nloadsys с командной строки, но проверял в режиме BootExecute

Цитата:

NativeApps

N7z.exe Ncab.exe Nlist.exe Nmount.exe запускаются но подробно не тестировались на Windows XP native portable (standalone)

Автор: bomzzz
Дата сообщения: 27.04.2012 23:22

Цитата:

набор встроенных команд меньше чем у blue console

но блю кон (кроме того что лично мне не удалось на него ключа найти) не позволяет после себя запускать винду. это просто отдельная система (оболочка в виде командной строки, интерпретатора), а ncmd запускается между ядром и оболочкой винды

Добавлено:

Цитата:

не работает, пытался запустить winkey.sys Passware (Windows Key)

прекрасно работает. ложишь native.exe в SYSTEM32 и добавляешь в реестр в запуск

Добавлено:
у меня тут уже от Perfect Disk-а дефрагментатор добавлен PDBoot.exe, но он почему то конфликтует, поэтому если сюда чета пихать его нужно убирать вообще, а то если он по этой цепочке запустится то потом работать перестает

Автор: ashumov
Дата сообщения: 27.04.2012 23:51

Цитата:

в режиме BootExecute

я же испытывал
Цитата:

Windows XP native portable standalone

Здесь же есть и oobc.lic
Цитата:

лично мне не удалось на него ключа на

и winkey.sys

Автор: ashumov
Дата сообщения: 29.04.2012 21:39

Загрузка образа native.img с помощью grub4dos в командную строку A>
Встроен драйвер WVBlk32.sys
Имеется баг после загрузки A> dir не работает(издержки программирования для запуска из установленной OC Windows и запуска из реестра)
После cd c: и cd a: все работает
работающие внешние команды:
bluecon.exe
defrag.exe
n7z.exe
ncab.exe
ndrv.exe
nlist.exe
nmount.exe

Автор: bomzzz
Дата сообщения: 29.04.2012 21:52

чета я bluecon.exe не смог запустить, на виртуалке пробовал диска С не было вообще. а че ncmd не положил?

Добавлено:
а почему bluecon т в корне и в систем32 лежит?

Добавлено:
да фигня какая то с корневой директорией. что ж это такое не пойму. в вин пе работает нормально

Автор: ashumov
Дата сообщения: 29.04.2012 22:16

Цитата:

а почему bluecon т в корне и в систем32 лежит?

точно не помню, но кажется по другому не запускается

Цитата:

а че ncmd не положил?

надоело антивирус отключать
kernel.dll определяет как вирус, такая же ситуация с dkrnl32.dll HX от jafet

http://forum.old-dos.ru/viewtopic.php?f=4&p=1746#p1746
спасибо за WVBlk32.sys но в твоей XPBOOT.IMA две ошибки не встроен iastor и старый pci.sys на современном железе не работает в с свое время собирал из SP2 Microsoft 6 установочных дискет: Unofficial Windows XP Pro SP3 Setup disks for Floppy Boot Install

Добавлено:

Цитата:

на виртуалке пробовал диска С не было вообще

Цитата:

После cd c: и cd a: все работает

испытываю практически все реально

Добавлено:

Цитата:

С не было вообще

у меня hdd driver iastor.sys для моего железа

Добавлено:
для запуска passware windows key
— в txtsetup.sif ;winkey.sys=winkey.sys убрать ;
— в system32 восстановить оригинальный smss.exe из usetup.exe в корне

Автор: bomzzz
Дата сообщения: 29.04.2012 23:47

Цитата:

надоело антивирус отключать

в исключения включи файл. или пошли им в лабараторию с припиской что не вирус пусть исправят базу

Цитата:

XPBOOT.IMA две ошибки

он скачан с сайта микрософта
http://www.microsoft.com/downloads/ru-ru/details.aspx?FamilyID=55820edb-5039-4955-bcb7-4fed408ea73f&pf=true
iastor.sys в хп не входит вообще, насчет pci.sys ничего не могу сказать как было так и осталось. установку с сд он запускает. этих iastor-ов не напасешься, одних интеловских сата контролеров 5 6 7 8 9 10. сборки с поддержкой сата включают по 100 мб сата дров — это сколько дискет надо

Цитата:

После cd c: и cd a: все работает

на виртуалке не было диска С. на железе после смена катарого появилось приглашение
A:>
получается что если с неразбитым на разделы диском ее запустить будет борода.

Добавлено:
PCI.SYS в дискете лежит

Автор: ashumov
Дата сообщения: 30.04.2012 00:43

Как получить загрузочные дискеты для установки Windows XP
Твоя сборка сделана из первой gold редакции XP, я за исходные взял
Windows XP Professional с пакетом обновления 2 (SP2)
http://www.microsoft.com/downloads/details.aspx?FamilyId=535D248D-5E10-49B5-B80C-0A0205368124&amp;displaylang=en
и заменил вручную все файлы в ima образах на SP3
PCI.SYS у тебя версии 5.1.2600.0
а последний 5.1.2600.5512
Цитата:

с неразбитым на разделы диском

Portable Windows XP SP3 Recovery Console запускается c HDD или USB Flash
файлы в открытом виде
эмуляция Windows XP: папки cmdcons\system32\drivers — пустая, cmdcons\system32\config c файлами sam и security(без ввода пароля)
каталог windows всегда X:\cmdcons
Fdisk.exe — встроенная в консоль Windows XP SP3 команда diskpart текстовый интерфейс
аналог sys.com команда fixboot
аналог fdisk.exe/mbr команда fixmbr)

Автор: bomzzz
Дата сообщения: 30.04.2012 01:21

версии погоды не делают. вин пе все на сп2, от подмены файлов толку немного.
только я подумал что ты на сервере 2003 сделал потому что картинка серая

Добавлено:
а как ты запустил из дискеты native? я добавляю bootexecute и нифига не запускается

Автор: bomzzz
Дата сообщения: 30.04.2012 08:14

блин да ты все попеределал.

у тебя дискета аж 15 мб. при этом в ней 4.5 мбайта пустого места и она неправильной конфигурации — груб когда ее запускает выдает предупреждение. дискету можно сделать практически любого размера с помощью UltraISO, а конфигурацию поправить с помощью WinImage (изменить формат), хотя бы просто для того чтоб груб не ругался. в WinImage же можно было изменить размер сектора на 512 байт (у тебя 8 кбайт) это освободит кучу места в среднем по 3.5 кбайта на файл, а файлов там хватает — 160 штук пол мегабайта может освободится.

что я тут с ней и проделал. 10.5 мб размер. 192 кбайта свободного места.
http://rghost.ru/37836333

и вообще такое впечатление, и сетупрегхив другой и тктстоемсиф , что это из установочного диска сделано сервера 2003

Автор: ashumov
Дата сообщения: 30.04.2012 08:25

всегда использую ntldr и setupldr.bin от 2003
ntldr работает даже без boot.ini загружая XP с первого активного раздела
оба файла это склейка из двух бинарных первый из которых DPMI сервер
на бутленде был пост в котором предлагалось замена в xp ntldr этим stub-ом пост назывался стань хозяином своего компьютера , без никаких обьяснений
второй бинарный в ntldr osloader.exe отрезал ресурсхакером данные о версии и названии , все равно после copy /b stub+osloader.exe ntldr
по аналогии всегда использую setupldr.bin от 2003
stub можно получить hex-editor-ом отрезав от первого MZ до конца

Автор: bomzzz
Дата сообщения: 30.04.2012 08:31

с блюконом это и есть самая маленькая вин пе. делают пикосборки всегда предупреждая что она может косячно нтфс писать\читать. она получается 25 мб размером. а эта в сжатом виде (вин пе то сжато в вим) будет мб 7-8

Добавлено:
да еще с сата драйвером на интел. не знаешь этот IASTOR будет работать с сата контролером от пятого южного моста ICH5 то есть? вообще у интела один драйвер или на каждый контролер отдельный??

Добавлено:
только этот косяк обидный с корневой папкой. я пока не понял как она вообще работает. поправить бы. вообще кроме блюкона тама ниче не надо. винду то грузить дальше смысла нет

Автор: ashumov
Дата сообщения: 30.04.2012 08:38

>>сетупрегхив другой и тктстоемсиф
сетупрегхив из твоей сборки просто
makecab setupreg.hiv
makecab 1997 года ничего не портит
txtsetup.sif правил вручную, удалял лишнее по образцу проекта tinykernel кажется был на бетаархиве
img — файлы проверяю на совместимость unimg.com( новогодний релиз freedos)
grub4dos-0.4.5c не ругается или так быстро что не успеваю прочитать

Код:
timeout 0

map —mem /native.img (fd0)
map —hook
chainloader (fd0)+1
rootnoverify (fd0)

Автор: bomzzz
Дата сообщения: 30.04.2012 08:42

чтоб прочитать что пишет груб. нужно запустить сборку на виртуальной машине микрософта, когда на окно виртуальной машины нажимаешь мышкой (на синюю полоску окна наверху) она замирает и можно спокойно рассмотреть всю загрузку чего угодно, и поправить сектора согласно предупреждению

Автор: ashumov
Дата сообщения: 30.04.2012 08:42

Цитата:

сата контролером от пятого южного моста ICH5

железо знаю плохо

Цитата:

кроме блюкона тама ниче не надо

все его файлы в system32 и переименовать в smss.exe
внешние команды не запускаются

Форум Ru-Board.club — поднят 15-09-2016 числа. Цель — сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.

The Native API is a lightweight application programming interface (API) used by Windows NT’s kernel and user mode applications. This API is used in the early stages of Windows NT startup process, when other components and APIs are still unavailable. Therefore, a few Windows components, such as the Client/Server Runtime Subsystem (CSRSS), are implemented using the Native API. The Native API is also used by subroutines such as those in kernel32.dll that implement the Windows API, the API based on which most of the Windows components are created.

Most of the Native API calls are implemented in ntoskrnl.exe and are exposed to user mode by ntdll.dll. The entry point of ntdll.dll is LdrInitializeThunk. Native API calls are handled by the kernel via the System Service Descriptor Table (SSDT).

The Native API comprises many functions. They include C runtime functions that are needed for a very basic C runtime execution, such as strlen(), sprintf(), memcpy() and floor(). Other common procedures like malloc(), printf(), scanf() are missing (the first because it does not specify a heap to allocate memory from and the second and third because they use the console, accessed only via KERNEL32.DLL). The vast majority of other Native API routines, by convention, have a 2 or 3 letter prefix, which is:

  • Nt or Zw are system calls declared in ntdll.dll and ntoskrnl.exe. When called from ntdll.dll in user mode, these groups are almost exactly the same; they execute an interrupt into kernel mode and call the equivalent function in ntoskrnl.exe via the SSDT. When calling the functions directly in ntoskrnl.exe (only possible in kernel mode), the Zw variants ensure kernel mode, whereas the Nt variants do not.[1] The Zw prefix does not stand for anything.[2]
  • Rtl is the second largest group of ntdll calls. These comprise the (extended) C Run-Time Library, which includes many utility functions that can be used by native applications, yet don’t directly involve kernel support.
  • Csr are client-server functions that are used to communicate with the Win32 subsystem process, csrss.exe (csrss stands for client/server runtime sub-system).
  • Dbg are debugging functions such as a software breakpoint.
  • Ki are upcalls from kernel mode for events like APC dispatching.
  • Ldr are loader functions for PE file handling and starting of new processes.
  • Nls for National Language Support (similar to code pages).
  • Pfx for prefix handling.
  • Tp for threadpool handling.

user32.dll and gdi32.dll include several other calls that execute an interrupt into kernel mode. These were not part of the original Windows NT design, as can be seen in Windows NT 3.5. However, due to performance issues of hardware of that age, it was decided to move the graphics subsystem into kernel mode. As such, system call in the range of 0x1000-0x1FFF are satisfied by win32k.sys (instead of ntoskrnl.exe as done for 0-0x0FFF), and are declared in user32.dll and gdi32.dll. These functions have the NtUser and NtGdi prefix (e.g. NtUserLockWorkStation and NtGdiEnableEudc).

Uses of Native API functions includes but not limited to:

  • Enabling and disabling privileges (RtlAdjustPrivilege)
  • Creating remote threads within processes that are running in different session (RtlCreateUserThread)
  • Running native applications (RtlCreateUserProcess)
  • Performing a forced shutdown (NtShutdownSystem)
  • Causing a BSOD in User mode (NtRaiseHardError)
  • Displaying a string in Native Mode (NtDisplayString)
  • List of Microsoft Windows components
  1. ^ The NT Insider (August 27, 2003). «Nt vs. Zw — Clearing Confusion On The Native API». OSR Online. 10 (4). OSR Open Systems Resources. Retrieved 2013-09-16.
  2. ^ Raymond Chen (2009). «The Old New Thing : What does the «Zw» prefix mean?». Microsoft Corporation. Retrieved 2009-06-13.
  • A website that documents most of the Native API functions Archived 2017-10-25 at the Wayback Machine
  • Inside Native Applications
  • Inside the Native API
  • Open source native applications development framework
  • Compiling Free Pascal programs for the native API
  • Windows NT Native Tools — A free native applications development util
  • Native shell — Windows command prompt which can start before Winlogon and Win32 subsystem Archived 2015-08-11 at the Wayback Machine

Привет, друзья. Это статья из серии «Выживаем на слабом ПК» — серии публикаций, посвящённых оптимизации производительности и подборке ПО на слабых и старых компьютерах. Если у вас древняя сборка ПК, но вы пока ещё по каким-то причинам не готовы отправить её на свалку истории, юзайте тег «Выживание на слабом ПК». В этой тематической подборке статей вы найдёте рекомендации, какую операционную систему лучше установить на старое слабое устройство, какой браузер лучше использовать, как оптимизировать работу с системой за счёт RAM-диска и т.п. В этой небольшой публикации рассмотрим ещё один способ выживания на старом ПК – при устранении на нём неполадок с помощью аварийного LiveDisk’а от Sergei Strelec.

Выживаем на слабом ПК: режим Native на LiveDisk’е от Sergei Strelec

LiveDisk от Сергея Стрельца – это среда WinPE с огромнейшей подборкой годного софта для работы с Windows вне её среды, в частности, с целью её реанимации. Более детально об этом LiveDisk’е, о том, какие с его помощью операции можно производить с компьютером, смотрите в отдельной публикации «LiveDisk by Sergei Strelec и прочие «живые» диски». Примечательной особенностью этого реанимационного инструмента является то, что он оптимизирован для работы со старыми слабыми устройствами. Загрузившись с LiveDisk’а, в его меню загрузки в числе вариантов увидим «Boot USB Sergei Strelec Win8.0 (x86) Native (Old PC)».

Это и есть реализация особенности LiveDisk’а — режим Native, специальный режим WinPE, заточенный под работу со старым слабым железом. Он базируется на 32-разрядном WinPE 8, и чтобы мы его не путали с обычным режимом запуска среды WinPE 8, запуск режима Native отмечен не голубым привычным логотипом Windows, а жёлтым.

В режиме Native сначала происходит загрузка системного ядра без графической оболочки, а потом отрабатывается скрипт поиска DVD-диска или флешки с LiveDisk’ом для запуска полноценного ядра WinPE. Это сделано с целью ускорения запуска LiveDisk’а на компьютерах с портами USB 1.0/1.1, на которых обычная среда WinPE может запускаться минут 10. Режим Native потребляет меньше оперативной памяти, чем обычный режим WinPE 8. У Native пониженные требования к процессору: допускаются процессоры, начиная с Intel Pentium 4 и AMD Athlon, не поддерживаются NX-инструкции (отключена проверка NX-бита). Для совместимости со старыми процессорами отключена поддержка мультиядерности и режима РАЕ.

Режим Native – это решение для старых компьютеров, но не слабых современных устройств. Этот режим, как упоминалось, базируется на 32-битном WinPE 8, следовательно, доступен только при загрузке с Legacy-носителей. При загрузке с флешек UEFI мы его не обнаружим. На слабых современных устройствах лучше использовать обычные режимы запуска LiveDisk’а, базирующиеся на WinPE 8 и WinPE 10.

Помимо самого режима Native, в среде WinPE 8 можно использовать хорошо знакомый владельцам слабых ПК способ оптимизации Windows – отключение визуальных эффектов. На рабочем столе запускаем ярлык «Параметры быстродействия». Отмечаем галочкой пункт «Обеспечить наилучшее быстродействие» и жмём «Применить».

С чего начать программирование native приложений для Windows

  • Загрузочные экраны
  • Что нужно знать
  • Заготовка 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.

Приложение нельзя запустить в режиме Win32

Приложение нельзя запустить в режиме Win32

Заготовка проекта 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.

Программы режима Native API

  • Скачать заготовку Native приложения Windows (RAR-архив, 46 Кб)
  • Перейти на страницу программы Native shell

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Касперский для windows server 2012
  • На какую кнопку нажать чтобы заработала клавиатура на компьютере windows
  • Windows 10 pro несколько rdp сессий
  • Windows 2012 сервер wsus
  • Где лежит файл реестра windows 10