Цитата: BoaSoft - снова небольшое предложение. А если сделать логгирование действий myfactory.exe? Т.е. пишем лог например в c:\myfactory.log - если на ПнП стадии имеем затык - прерываем процесс в диспетчере задач и смотрим логи - что поломато. А если все прошло удачно то в firstboot.cmd лог стираем.
Оно и так теперь пишет, если не дождалась за отвкеенное время создания event с именем PNP_Create_Pipe_Event и если за отведенное время не завершилось PnP (CMP_WaitNoPendingInstallEvents возратило 0). Я бы с удовольстием добавил бы в лог подробностей, но там всего пара виндовых функций....
[more]
procedure StartPnP(WaitTime:integer);
const
PNPMytexName = 'PNP_Create_Pipe_Event';
var
DesiredAccess: DWord;
InheritHandle: boolean;
HEvent: LongInt;
Count: LongInt;
begin
DesiredAccess:=SEMAPHORE_MODIFY_STATE;
InheritHandle:=false;
HEvent:= OpenEvent(DesiredAccess,InheritHandle,PChar(PNPMytexName));
Count:=WaitTime * 1000 div 100;
while (HEvent = INVALID_HANDLE_VALUE) or (Count > 0) do begin
Sleep(100);
HEvent:= OpenEvent(DesiredAccess,InheritHandle,PChar(PNPMytexName));
Dec(count);
end;
if HEvent <> INVALID_HANDLE_VALUE then begin
SetEvent(HEvent);
CloseHandle(HEvent);
end
else
WriteLog('ERROR: MyFactory unable StartPnP');
end;
function WaitEndPnp(WaitProc: TWaitMsgProc; WaitTime:integer): boolean;
var
Count:integer;
begin
if WaitTime = 0 then WaitTime:= $FFFF;
result:=false;
Count:= WaitTime*1000 div 100;
if CMP_WaitNoPendingInstallEvents(0) = WAIT_OBJECT_0 then exit;
if CMP_WaitNoPendingInstallEvents(0) = WAIT_FAILED then exit;
while (CMP_WaitNoPendingInstallEvents(100) = WAIT_TIMEOUT) and
(Count>0) do begin
if @WaitProc<>nil then WaitProc;
dec(Count);
result:=true;
end;
end;
function UpdatePnpDrivers(WaitProc: TWaitMsgProc):boolean;
begin
if AdjustDriverPrivileges then begin
DeleteProblemDevice;
Enumerate;
sleep(1000);
result:= UpdatePnpDeviceDrivers = 0;
end else result:=false;
end;
[/more]
Остется смотреть только на setupapi.log