Операционная система Windows предоставляет разработчикам возможность использования альтернативного файла ядра. Прежде всего, это необходимо для того, чтобы заменить обычное ядро ОС на checked build.
В ОС Windows 2000, Windows XP и Windows 2003 для этого необходимо отредактировать файл boot.ini. Для ОС Windows Vista и Windows 7 необходимо использовать команду bcdedit. Полное описание процедуры находится в MSDN.
В документации ясно сказано, что имя альтернативного файла ядра должно удовлетворять требованию 8.3 (имя_файла.расширение):
kernel file
Directs the operating system loader to load an alternate kernel. The specified file must be located in the %SystemRoot%\system32 directory, and its file name must conform to 8.3−character format.
Проведем эксперимент с Windows XP и Windows Vista.
Для Windows XP необходимо отредактировать файл boot.ini. Скопируем ядро в %system32% (у меня это ntoskrnl.exe) в файл 12345678.exe и пропишем его в boot.ini:
[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=»Microsoft Windows XP Professional» /noexecute=optin /fastdetect /debug /debugport=COM1: /baudrate=115200 /kernel=12345678.exe
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=»Microsoft Windows XP Professional» /noexecute=optin /fastdetect
Перезагружаем компьютер с активным отладчиком ядра и смотрим первый загруженный модуль:
kd> dd PsLoadedModuleList L2
8055b1c0 81bfc390 81bf1780
kd> dt nt!_LDR_DATA_TABLE_ENTRY 81bfc390
+0×000 InLoadOrderLinks : _LIST_ENTRY [ 0x81bfc328 - 0x8055b1c0 ]
+0×008 InMemoryOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0×010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0×018 DllBase : 0x804d7000
+0x01c EntryPoint : 0x806aeb2c
+0×020 SizeOfImage : 0×216680
+0×024 FullDllName : _UNICODE_STRING «\WINDOWS\system32\12345678.EXE»
+0x02c BaseDllName : _UNICODE_STRING «ntoskrnl.exe»
+0×034 Flags : 0×4004000
+0×038 LoadCount : 1
+0x03a TlsIndex : 0
+0x03c HashLinks : _LIST_ENTRY [ 0x0 - 0x2247c2 ]
+0x03c SectionPointer : (null)
+0×040 CheckSum : 0x2247c2
+0×044 TimeDateStamp : 0
+0×044 LoadedImports : (null)
+0×048 EntryPointActivationContext : (null)
+0x04c PatchInformation : 0x0074006e
Отлично, мы смогли загрузить альтернативное ядро. Теперь изменим имя файла на более длинное, например, на 123456789.exe и повторим эксперимент.
kd> dd PsLoadedModuleList L2
8055b1c0 81bfc390 81bf1780
kd> dt nt!_LDR_DATA_TABLE_ENTRY 81bfc390
+0×000 InLoadOrderLinks : _LIST_ENTRY [ 0x81bfc328 - 0x8055b1c0 ]
+0×008 InMemoryOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0×010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0×018 DllBase : 0x804d7000
+0x01c EntryPoint : 0x806aeb2c
+0×020 SizeOfImage : 0×216680
+0×024 FullDllName : _UNICODE_STRING «\WINDOWS\system32\ntoskrnl.exe»
+0x02c BaseDllName : _UNICODE_STRING «ntoskrnl.exe»
+0×034 Flags : 0×4004000
+0×038 LoadCount : 1
+0x03a TlsIndex : 0
+0x03c HashLinks : _LIST_ENTRY [ 0x0 - 0x2247c2 ]
+0x03c SectionPointer : (null)
+0×040 CheckSum : 0x2247c2
+0×044 TimeDateStamp : 0
+0×044 LoadedImports : (null)
+0×048 EntryPointActivationContext : (null)
+0x04c PatchInformation : 0x0074006e
Очевидно, что операционная система проигнорировала длинное имя файла ядра.
Теперь повторим эксперимент на Windows Vista. Скопируем ядро (у меня это ntkrnlpa.exe) в файл 12345678.exe, установим альтернативное ядро и перезагрузим компьютер с активным отладчиком ядра.
C:\Windows\System32>bcdedit /set kernel 12345678.exe
The operation completed successfully.C:\Windows\System32>bcdedit /enum
Windows Boot Loader
——————-
identifier {current}
device partition=C:
path \Windows\system32\winload.exe
description DebugEntry
locale en-US
inherit {bootloadersettings}
osdevice partition=C:
systemroot \Windows
kernel 12345678.exe
resumeobject {603268e3-3922-11de-a356-966f5237e32f}
nx OptIn
detecthal No
usefirmwarepcisettings No
debug Yes
kd> dd PsLoadedModuleList L2
81952c70 82f69bb8 82f6f7b0
kd> dt nt!_LDR_DATA_TABLE_ENTRY 82f69bb8
+0×000 InLoadOrderLinks : _LIST_ENTRY [ 0x82f69b48 - 0x81952c70 ]
+0×008 InMemoryOrderLinks : _LIST_ENTRY [ 0x818f0ae4 - 0x14 ]
+0×010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0×018 DllBase : 0x8183b000
+0x01c EntryPoint : 0x819274b0
+0×020 SizeOfImage : 0x3b9000
+0×024 FullDllName : _UNICODE_STRING «\SystemRoot\system32\12345678.exe»
+0x02c BaseDllName : _UNICODE_STRING «ntoskrnl.exe»
+0×034 Flags : 0×4000
+0×038 LoadCount : 1
+0x03a TlsIndex : 0
+0x03c HashLinks : _LIST_ENTRY [ 0x0 - 0x372038 ]
+0x03c SectionPointer : (null)
+0×040 CheckSum : 0×372038
+0×044 TimeDateStamp : 0
+0×044 LoadedImports : (null)
+0×048 EntryPointActivationContext : (null)
+0x04c PatchInformation : (null)
+0×050 ForwarderLinks : _LIST_ENTRY [ 0x0 - 0x74006e ]
+0×058 ServiceTagLinks : _LIST_ENTRY [ 0x73006f - 0x72006b ]
+0×060 StaticLinks : _LIST_ENTRY [ 0x6c006e - 0x65002e ]
Результат как на Windows XP. Повторим эксперимент с длинным именем файла ядра.
kd> dd PsLoadedModuleList L2
81919c70 82f69bb8 82f6f7b0
kd> dt nt!_LDR_DATA_TABLE_ENTRY 82f69bb8
+0×000 InLoadOrderLinks : _LIST_ENTRY [ 0x82f69b48 - 0x81919c70 ]
+0×008 InMemoryOrderLinks : _LIST_ENTRY [ 0x818b7ae4 - 0x14 ]
+0×010 InInitializationOrderLinks : _LIST_ENTRY [ 0x0 - 0x0 ]
+0×018 DllBase : 0×81802000
+0x01c EntryPoint : 0x818ee4b0
+0×020 SizeOfImage : 0x3b9000
+0×024 FullDllName : _UNICODE_STRING «\SystemRoot\system32\123456789.exe»
+0x02c BaseDllName : _UNICODE_STRING «ntoskrnl.exe»
+0×034 Flags : 0×4000
+0×038 LoadCount : 1
+0x03a TlsIndex : 0
+0x03c HashLinks : _LIST_ENTRY [ 0x0 - 0x372038 ]
+0x03c SectionPointer : (null)
+0×040 CheckSum : 0×372038
+0×044 TimeDateStamp : 0
+0×044 LoadedImports : (null)
+0×048 EntryPointActivationContext : (null)
+0x04c PatchInformation : (null)
+0×050 ForwarderLinks : _LIST_ENTRY [ 0x0 - 0x74006e ]
+0×058 ServiceTagLinks : _LIST_ENTRY [ 0x73006f - 0x72006b ]
+0×060 StaticLinks : _LIST_ENTRY [ 0x6c006e - 0x65002e ]
Очевидно, что ОС Windows Vista и Windows 7 умеют работать с длинными именами, которые не удовлетворяют требованию 8.3.
В очередной раз повторю, что полагаться на документацию не стоит, а стоит проверять все самостоятельно.
Хорошо что в позитивную сторону неточность ;) Было бы куда хуже, если бы заявили что с 8.3 на ура,а на деле… ;)