Показать полную графическую версию : Внутренности Установщика WinXP
Страниц :
[
1]
2
3
4
5
6
7
Mr dUSHA
13-05-2008, 01:16
DEL.
Mr dUSHA
17-06-2008, 14:14
UPD
Mr dUSHA
23-06-2008, 16:00
1. Обновления в описаниях.
2. Вопрос к общественности: Кто-нибудь знает, в каких случаях и какими утилитами используется ключ установщика -plugplay ?
В оригинальном установщике, запущенном такой строкой setup.exe -plugplay не происходит запуска инсталлятора ОС функцией InstallWindowsNt.
Вместо этого запускается функция, устанавливающая драйвера устройств. Но вот кем и когда это используется?
Otvertochnik
24-06-2008, 12:55
Насколько я не в курсе - setup во время поиска устройств пишет "может потребоваться/случиться перезагрузка"
Что именно он имеет в виду не совсем понятно. То ли запуск устройсва породит кучку новых устройств и надо перезагрузиться, чтоб ничего не пропустить. То ли если будут проблемы при запуске драйвера устройства - рестарт сетапа с этого места, с пропуском неподходящего драйвера :dont-know
Наверное сюда. Устанавливаю английскую версию Windows XP SP3. Хочу всего лишь переименовать названия этапов, появляющихся над прогрэсс-баром в левом нижнем углу во время графического этапа установки. Всё это разбросано в файле syssetup.dll. Может есть у кого что-то вроде таблицы, какой русурс, какая строка и её перевод?
Mr dUSHA
03-07-2008, 10:56
Может есть у кого что-то вроде таблицы, какой русурс, какая строка и её перевод? »
Resource Hacker'ом нужные строки из русской версии этой длл в твою английскую перенеси.
Resource Hacker'ом нужные строки »
Строки в студию! Я и сам могу воспользоваться редактором ресурсов. Но разбросаны эти строки по файлу. Сидеть тупо перед монитором и смотреть что пишется на экране у меня времени нет - работа, знаете ли. Поэтому и спросил, есть ли у кого что готовое. Достаточно просто перечисления номеров ресурсов. Остальное сам найду.
Mr dUSHA
03-07-2008, 13:28
Достаточно просто перечисления номеров ресурсов. Остальное сам найду. »
Строковые таблици 73 и 74. В них все нужные строки и лежат.
Строковые таблици 73 и 74 »
Не только там...
Кто знает по какому алгоритму вычислют контрольную сумму установочным файлам (напр setupldr.exe)?? В PE заголовке есть поле CheckSum котое содержит загадочное число, возможно это CRC32 но не всего файла? тогда что не пропускать? потому-что программы умеющие вычислять CRC32 выдают другие данные
Mr dUSHA
06-07-2008, 16:11
Кто знает по какому алгоритму вычислют контрольную сумму установочным файлам »
DWORD MapFileAndCheckSum(
PTSTR Filename,
PDWORD HeaderSum,
PDWORD CheckSum
);
Копирайт MSDN
;)
Mr dUSHA
06-07-2008, 18:46
Содержимое этого поста перенесено сюда:
http://forum.oszone.net/thread-110577.html
Mr dUSHA, Про использование API функции MapFileAndCheckSum, для этих целей стало известно в первую очередь, меня же интересует по какому алгоритму посчитана контрольная сумма, насколько я понял это не CRC32 не СRС16, наверняка не MD5 ;), ну и вот что-за там контрольная сумма, кстати MapFileAndCheckSum считает по такому-же алгоритму(в описании говорится что она считает CRC32 вроде), тоглда результат не сама контрольная сумма, или они считают сумму не всего файла, а каких-то участков, инфы нету че-то, я в программировании конечно ноль, но все-же интересно...
Mr dUSHA
09-07-2008, 11:18
или они считают сумму не всего файла, а каких-то участков, »
Он считает КС всего файла, за исключением того DWORDа, в котором в заголовке собственно сама КС и прописывается.
Mr dUSHA, 2. Вопрос к общественности: Кто-нибудь знает, в каких случаях и какими утилитами используется ключ установщика -plugplay ?
В оригинальном установщике, запущенном такой строкой setup.exe -plugplay не происходит запуска инсталлятора ОС функцией InstallWindowsNt.
Вместо этого запускается функция, устанавливающая драйвера устройств. Но вот кем и когда это используется?Вобщем-то, тоже очень интересно. Хотелось бы получить что-то вроде сиспрепа для определения оборудования на новом компе (клонирование), но без перегрузки в самом конце - сделать ее позднее самостоятельно.
На MSFN.ORG был найдет такой рег-файл:Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\Setup]
"SetupType"=dword:00000001
"SystemSetupInProgress"=dword:00000001
"CmdLine"=hex(7):73,00,65,00,74,00,75,00,70,00,2e,00,65,00,78,00,65,00,20,00,\
2d,00,6e,00,65,00,77,00,73,00,65,00,74,00,75,00,70,00,20,00,2d,00,6d,00,69,\
00,6e,00,69,00,00,00,00,00
"MiniSetupDoPnP"=dword:00000001
"MiniSetupInProgress"=dword:00000001В ключе "CmdLine" там стоит "setup.exe -newsetup -mini" и при применении этого файла к обычной системе после перезагрузки начинается миниустановка как при использовании SysPrep (причем, самой утилиты на компе просто нет), только все параметры приходится вбивать вручную (не знаю как привязать сюда SysPrep.inf).
Я пытался заменить "setup.exe -newsetup -mini" на "setup.exe -plugplay", но после перезагрузки и лого Винды просто черный экран с указателем мышки на несколько секундр, потом перегрузка и при следующей загрузке сообщение, что система не установлена до конца, надо опять переставить. Т.е. что-то не работает (как хотелось бы...). Пробовал применять файл без двух последних ключей с мини-установкой. Тоже не работает...
Можно вопрос? А есть ли теоретическа возможность отключить насильственную перегрузку компа в конце этой процедуры сетапа (в моем случае для мини-установки)? Извиняюсь, если влез не туда :) Тогда просто проигнорируйте :)
Mr dUSHA
04-08-2008, 16:44
В ключе "CmdLine" там стоит "setup.exe -newsetup -mini" и при применении этого файла к обычной системе после перезагрузки начинается миниустановка как при использовании SysPrep »
SysPrep просто прописывает эти параметры в реестр, а дальше миниустановку за него все делает сам стандартный установщик InstallWindowsNt из библиотеки Syssetup.dll. Именно его в таком случае setup.exe и запускает, а сам больше ничего не делает.
"setup.exe -plugplay" запускает только процедуру установки драйверов устройств. Эта процедура находится прямо в теле setup.exe.
А есть ли теоретическа возможность отключить насильственную перегрузку компа в конце этой процедуры сетапа
Можно написать свой setup.exe, который кроме вызова InstallWindowsNt будет реализовать и другой, нужный вам функционал до или после основного процеса установки. Так сделал я, и так например сделал BoaSoft для своего драйверного аддона. Суть в том, что перезагрузка происходит только когда завершается setup.exe.
Mr dUSHA
Спасибо за ответ. Но написать самому не получится - не тот уровень... А вот если бы можно было хотя бы перегрузку отключить правкой какого-нибудь файлика, то можно было бы попробовать :) Причем, речь идет об уже установленной системе, там где не полная установка, а только минисетап запускается. В идеале бы только определение драйверов и устройсв запускать, а все остальное нафик...
Mr dUSHA
04-08-2008, 18:55
А вот если бы можно было хотя бы перегрузку отключить правкой какого-нибудь файлика »
Этого не знаю. Не задавался такой целью.
Boa Soft
07-08-2008, 15:52
MS, как всегда, немного врет. Только что попробовал применить волшебный рег-файл к Home edishn.
Мини - установка запустилась и прошла полностью нормально. Хотя, MS пишет, что мини-утановка невозможна для хомяка. Поэтому и я не заморачивался при работе с образами по поводу мини-setup.
Так что, наверное в новой версии для заливки напишу свой фейк-сетап и буду использовать его.
sysprep не дает на хомке выставить ключик -mini, но внести рег-файл перед завершением работы запечатаного образа не проблема.
Oleg_II, В идеале бы только определение драйверов и устройсв запускать, а все остальное нафик... »
UpdatePnpDeviceDrivers();
Пути к драйверам должны уже быть внесены в реестр.
function IsNtOs:boolean;
var
ver: TOSVERSIONINFO;
begin
ver.dwOSVersionInfoSize := Sizeof(ver);
GetVersionEx(ver);
result:= ver.dwPlatformId=VER_PLATFORM_WIN32_NT;
end;
function AdjustDriverPrivileges:boolean;
var
handle, ph: THandle;
pid, n: DWORD;
luid: TLargeInteger;
priv: TTokenPrivileges;
dummy: PTokenPrivileges;
Err: DWORD;
begin
if IsNtOs then begin
result:=false;
pid := GetCurrentProcessId;
ph := OpenProcess(PROCESS_ALL_ACCESS, false, pid);
if not OpenProcessToken(ph, TOKEN_ADJUST_PRIVILEGES, handle) then exit;
if not LookupPrivilegeValue(nil, 'SeLoadDriverPrivilege', luid) then exit;
priv.PrivilegeCount := 1;
priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
priv.Privileges[0].Luid := luid;
dummy := nil;
AdjustTokenPrivileges(handle, false, priv, 0, dummy^, n);
Err := GetLastError;
if Err <> ERROR_SUCCESS then exit;
end;
result:=true;
end;
function CleanupPfantom: boolean;
var
hAllDevices: H_DEV;
dwInfo: DWORD;
Data: SP_DEVINFO_DATA;
Status: DWORD;
ProbNumer: DWORD;
rmdParams:TSPRemoveDeviceParams;
begin
result:=false;
hAllDevices := SetupDiGetClassDevsEx(nil, nil, 0,
DIGCF_ALLCLASSES, nil, nil, 0);
if DWORD(hAllDevices) <> INVALID_HANDLE_VALUE then
try
FillChar(Data, SizeOf(SP_DEVINFO_DATA), 0);
Data.cbSize := SizeOf(SP_DEVINFO_DATA);
dwInfo := 0;
if SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) then
begin
while SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) do
begin
if CM_Get_DevNode_Status(@Status, @ProbNumer, Data.DevInst, 0) = CR_NO_SUCH_DEVNODE then
if Status = 0 then begin
rmdParams.ClassInstallHeader.cbSize := sizeof(SP_CLASSINSTALL_HEADER);
rmdParams.ClassInstallHeader.InstallFunction := DIF_REMOVE;
rmdParams.Scope := DI_REMOVEDEVICE_GLOBAL;
rmdParams.HwProfile := 0;
SetupDiSetClassInstallParams(hAllDevices, @Data, @rmdParams.ClassInstallHeader, sizeof(TSPRemoveDeviceParams));
SetupDiCallClassInstaller(DIF_REMOVE,hAllDevices,@Data);
{CM_Uninstall_DevNode( Data.DevInst,0); }
result:=true;
end;
Inc(dwInfo);
end;
end;
finally
if DWORD(hAllDevices) <> INVALID_HANDLE_VALUE then
SetupDiDestroyDeviceInfoList(hAllDevices);
end;
end;
function IsProblemPresent:boolean;
var
hAllDevices: H_DEV;
dwInfo: DWORD;
Data: SP_DEVINFO_DATA;
Status: DWORD;
ProbNumer: DWORD;
begin
result:=false;
hAllDevices := SetupDiGetClassDevsEx(nil, nil, 0,
DIGCF_PRESENT or DIGCF_ALLCLASSES, {hDev} nil, nil, 0);
if DWORD(hAllDevices) <> INVALID_HANDLE_VALUE then
try
FillChar(Data, SizeOf(SP_DEVINFO_DATA), 0);
Data.cbSize := SizeOf(SP_DEVINFO_DATA);
dwInfo := 0;
if SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) then
begin
while SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) do
begin
if CM_Get_DevNode_Status(@Status, @ProbNumer, Data.DevInst, 0) = CR_SUCCESS then
if (Status and DN_HAS_PROBLEM)<>0 then begin
result:=true;
exit;
end;
Inc(dwInfo);
end;
end;
finally
if DWORD(hAllDevices) <> INVALID_HANDLE_VALUE then
SetupDiDestroyDeviceInfoList(hAllDevices);
end;
end;
function DeleteProblemDevice: boolean;
var
hAllDevices: H_DEV;
dwInfo: DWORD;
Data: SP_DEVINFO_DATA;
Status: DWORD;
ProbNumer: DWORD;
rmdParams:TSPRemoveDeviceParams;
begin
result:=false;
hAllDevices := SetupDiGetClassDevsEx(nil, nil, 0,
DIGCF_PRESENT or DIGCF_ALLCLASSES, nil, nil, 0);
if DWORD(hAllDevices) <> INVALID_HANDLE_VALUE then
try
FillChar(Data, SizeOf(SP_DEVINFO_DATA), 0);
Data.cbSize := SizeOf(SP_DEVINFO_DATA);
dwInfo := 0;
if SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) then
begin
while SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) do
begin
if CM_Get_DevNode_Status(@Status, @ProbNumer, Data.DevInst, 0) = CR_SUCCESS then
if (Status and DN_HAS_PROBLEM)<>0 then begin
rmdParams.ClassInstallHeader.cbSize := sizeof(SP_CLASSINSTALL_HEADER);
rmdParams.ClassInstallHeader.InstallFunction := DIF_REMOVE;
rmdParams.Scope := DI_REMOVEDEVICE_GLOBAL;
rmdParams.HwProfile := 0;
SetupDiSetClassInstallParams(hAllDevices, @Data, @rmdParams.ClassInstallHeader, sizeof(TSPRemoveDeviceParams));
SetupDiCallClassInstaller(DIF_REMOVE,hAllDevices,@Data);
{CM_Uninstall_DevNode( Data.DevInst,0); }
result:=true;
end;
Inc(dwInfo);
end;
end;
finally
if DWORD(hAllDevices) <> INVALID_HANDLE_VALUE then
SetupDiDestroyDeviceInfoList(hAllDevices);
end;
end;
function Enumerate:boolean;
var
dwInfo: DWORD;
Status: DWORD;
begin
Status:= CM_Locate_DevNode(dwInfo ,nil, CM_LOCATE_DEVNODE_NORMAL);
result:= CM_Reenumerate_DevNode(Status, CM_REENUMERATE_NORMAL) = CR_SUCCESS;
end;
function WaitEndPnp(WaitProc: TWaitMsgProc): boolean;
var
WaitTime:integer;
begin
WaitTime:=100;
result:=false;
if CMP_WaitNoPendingInstallEvents(0) = WAIT_OBJECT_0 then exit;
if CMP_WaitNoPendingInstallEvents(0) = WAIT_FAILED then exit;
while (CMP_WaitNoPendingInstallEvents(100) = WAIT_TIMEOUT) and
(WaitTime>0) do begin
if @WaitProc<>nil then WaitProc;
dec(WaitTime);
result:=true;
end;
end;
function UpdatePnpDrivers(WaitProc: TWaitMsgProc):boolean;
begin
if AdjustDriverPrivileges then begin
DeleteProblemDevice;
Enumerate;
sleep(1000);
WaitEndPnp(WaitProc);
result:= UpdatePnpDeviceDrivers = 0;
WaitEndPnp(WaitProc);
end else result:=false;
end;
Boa Soft
Вот спинным мозгом чувствую, что это то, чего хотелось :) , а признаться стыдно, что не совсем понимаю, куда это применить... Не подскажете в общих чертах куда и как это применить?
Еще раз напомню, чего хотелолсь бы получить: у меня этот регфайл тоже работает, но хотелось бы чтобы автоопределение устройств начиналось автоматом и компьютер потом не перегружался. В идеале - только определение устройств и все! Все остальные процессы (установка сети, компонентов и прочее) желательно бы пропустить вообще.
Почему автоматом - столкнулся с тем, что на некоторых компах мышь и клавиатура при переносе имиджа не работают. Поковырял и вроде нашел способ поддержки мыши в образе в такой ситуации, но срабатывает он только если есть сиспреп и файл ответов или вообще без применения мини-установки через некоторое время после полной загрузки системы. Хотелось бы того же, что происходит при мини-установке для нормального определения драйверов (но тоже не полной - читайте дальше :)
Почему не перегружать... Хм... Тут немножко антинаучные мысли - сильно уменьшенная система запускается сразу в РАМ и там желательно чтобы подхватила все новые устройства как это делает BartPE, а такое возможно только при PNP установщика оси, насколько я понимаю... Соответственно, раз система загружается в РАМ, то перегрузки допускать нельзя - изменения все равно не сохранятся... Вобщем-то все и так работает, новые устройства находятся в самой системе, но есть проблемы с некоторыми контроллерами жестких дисков (САТА), не видит, гад... Т.е. надо как-то по другому их инициировать (хочется надеятся, что процедура мини-установки их найдет).
ЗЫ Про заливки. Сейчас на Руборде я ковыряю китайскую заливку (выложил там самую последнюю версию от одного известного сборщика и будет еще одна от серьезного форума, копаюсь и делюсь впечатлениями). Китайцы добились очень хороших успехов в этой области - их заливки встают практически на любое железо с правильным определением любых ХАЛов, драйверов контроллеров (включая и "проблемные" AHCI), не имеют проблем с мышами и клавиатурами, да и решения вообще интересные, можно сказать даже изящные - образ полной необрезанной системы (даже длл-кэш присутствует) вместе с МС Офисом и еще кучей софта занимает всего 650МВ ;) Если интересно, то загляните :)
Кстати, на этом форуме тоже есть топик по заливкам-клонированию? Было бы интересно почитать :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC