Цитата mbgroot:
Что-то не так... Патчер отрабатывает прекрасно - ядра патчатся. Но получается, что аддон несовсем корректен - патчатся файлы в папке UpdatePack-XPSP3-Rus\Files - один раз и навсегда. И ядра не обрабатываются modifype.exe - зачем он тогда в аддоне? Может корректнее переделать аддон таким образом, что бы ядра в папке UpdatePack-XPSP3-Rus\Files оставались оригинальными? И без обработки ядер программой modifype.exe установщик винды отказался их копировать с компат-диска... »
|
SOLON7,
Дабавте правку CRC в PE заголовке файла. Для драйверов и файлов ядра это жизненно важно. строчек 10 кода.
Код:

function CorrectLdrChecSumm(FileName:string):boolean;
var
hFile: THandle ;
hFileMapping: THandle;
pBaseAddress: pointer;
pStartAddress: pointer;
dwHeaderSize: DWORD;
dwFileLengt: DWORD ;
dwHeaderSum: DWORD ; // Checksum as stated by Header
dwCheckSum: DWORD ; // Calculated Checksum
pNtheader: PIMAGE_NT_HEADERS;
I: integer;
begin
result:=false;
hFile := CreateFile(PChar(Filename),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0 );
if hFile <> INVALID_HANDLE_VALUE then begin
dwFileLengt:=GetFileSize(hFile, nil);
hFileMapping := CreateFileMapping(hFile, 0, PAGE_READWRITE, 0, 0, 0);
if hFileMapping <> 0 then begin
pBaseAddress := MapViewOfFile( hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if pBaseAddress <> nil then begin
dwHeaderSize:=0;
pStartAddress:= Pointer(LongInt(pBaseAddress));
for I := 0 to dwFileLengt div $10 do begin
if PDword(pStartAddress)^ = PE_SIGNATURE_VS then break;
if PDword(pStartAddress)^ = PE_SIGNATURE_DE then break;
pStartAddress:= Pointer(LongInt(pStartAddress)+$10);
inc(dwHeaderSize,$10);
end;
pNtheader:=nil;
pNtheader:= CheckSumMappedFile(pStartAddress, dwFileLengt - dwHeaderSize, &dwHeaderSum, &dwCheckSum );
if pNtheader<> nil then begin
pNtheader.OptionalHeader.CheckSum:=dwCheckSum;
result:=true;
end;
UnmapViewOfFile(pBaseAddress);
end;
CloseHandle(hFileMapping);
end;
CloseHandle(hFile);
end;
end;