IPB

Добро пожаловать, гость ( Вход | Регистрация )

> No-CD для Hand of Fate CD-ROM
Siberian GRemlin
Aug 2 2007, 10:48
Сообщение #1


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Вообщем, решил поиграть во вторую Кирандию, но нормально так и не смог. VDMSound в оконном режиме не работает, а в DOSBox приходится вбивать каждый раз, чтобы он смонтировал образ в свой виртуальный CD-ROM, может конечно это и можно как-то автоматизировать, но эта падлюка после монтирования пытается работать с образом как с основным диском и игра говорит, что нету свободного места на винте и завершает работу. Вообщем, проще отучить от диска игру, чем изучать все премудрости других программ. Но что-то у меня не получается. Если интересно, вот файлик: http://slil.ru/24694340
Ресурсы игра берёт из папки [CD-ROM] :\HOF_CD\, естественно её надо приучить брать файлы из своей папки (папки с игрой) или из любой папки в папке с игрой. И не выводить дурацкое собщение "A CD-ROM device driver is required to run Hand of Fate CD.", а вместо этого нормально запускаться и работать.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
 
Reply to this topicStart new topic
Ответов
Siberian GRemlin
Aug 7 2007, 06:36
Сообщение #2


Advanced Member
***

Группа: CTPAX-X
Сообщений: 533
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Всё работает. Спасибо! Я хочу разместить No-CD у себя на сайте в виде кряка, поэтому предлагаю решить его вопрос сообща.
CODE
program ProjectHoFNoCD;
{$APPTYPE CONSOLE}
{$H-}
uses
  SysUtils,
  Windows,
  Classes;

const
  rus:byte=$EB;

function TestExe:Boolean;
var
  MSTR: TMemoryStream;
begin
  if fileexists(ExtractFilePath(ParamStr(0))+'HOFCD.EXE') then begin
    MSTR:=TMemoryStream.Create;
    Mstr.LoadFromFile(ExtractFilePath(ParamStr(0))+'HOFCD.EXE');
    if Mstr.Size=199284 then result:=true
    else result:=false;
    Mstr.Free;
//
    if fileexists(ExtractFilePath(ParamStr(0))+'MAINDOS.EXE') then begin
      MSTR:=TMemoryStream.Create;
      Mstr.LoadFromFile(ExtractFilePath(ParamStr(0))+'MAINDOS.EXE');
      if Mstr.Size=283328 then result:=true
      else result:=false;
      Mstr.Free;
//
     if fileexists(ExtractFilePath(ParamStr(0))+'MAINWIN.EXE') then begin
        MSTR:=TMemoryStream.Create;
        Mstr.LoadFromFile(ExtractFilePath(ParamStr(0))+'MAINWIN.EXE');
        if Mstr.Size=280000 then result:=true
        else result:=false;
        Mstr.Free;
      end else result:=false;
//
    end else result:=false;
//
  end else result:=false;
end;

procedure Patch(Logo: byte);
var
  MSTR: TFileStream;
begin
  MSTR:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'HOFCD.EXE',fmOpenWrite,fmShareDenyWrite);
  Mstr.Position:=$EE29;
  Mstr.WriteBuffer(Logo,1);
  Mstr.Free;
  MSTR:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'MAINDOS.EXE',fmOpenWrite,fmShareDenyWrite);
  Mstr.Position:=$181CD;
  Mstr.WriteBuffer(Logo,1);
  Mstr.Free;
  MSTR:=TFileStream.Create(ExtractFilePath(ParamStr(0))+'MAINWIN.EXE',fmOpenWrite,fmShareDenyWrite);
  Mstr.Position:=$181CA;
  Mstr.WriteBuffer(Logo,1);
  Mstr.Free;
end;

begin
  Write('                                                              Hand of Fate No-CD');
  Write('                                                             Hack by -=CHE@TER=-');
  Write('                                                       Patch by Siberian GRemlin');
  Write('                                                                  WWW.CTPAX-X.ORG');  
  Write(& #39;____________________________________________________________________________
____');
  if TestExe then begin
    patch(rus);
    WriteLn('All files patched successfuly.');
    WriteLn('Please copy all files exept executables from [CD-ROM]:\HOF_CD to game folder.');    
  end else begin
    WriteLn('Some files of HOFCD.EXE, MAINDOS.EXE, MAINWIN.EXE not found or corrupted!');
    WriteLn('Please reinstall game!');
  end;
  Readln;
end.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Aug 7 2007, 11:11
Сообщение #3


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,355
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 311 раз(а)



Siberian GRemlin!
Предлагаю такой noCD - как их делаю я - универсальный:
CODE
Program KYR2NOCD;
{$APPTYPE CONSOLE}
{$WARNINGS OFF}
Uses SysUtils;
Const
       StTitle = 'Kyrandia II: Hand of Fate (CD version)';
       FlPatch: Array[1..3] Of String[11] = ('HOFCD.EXE', 'MAINDOS.EXE', 'MAINWIN.EXE');
Var
    FTime, FAttr: Cardinal;
     Buff, FName: String;
           CP, I: LongInt;
              Fl: File;

Function Boyer(S, Q: String): Integer;
Var
    N, M, I, J, K: Integer;
                D: Array[0..255] Of Byte;
Begin
  N:=Length(S);
  M:=Length(Q);
  FillChar(D, 256, M);
  For I:=1 To M-1 Do D[Ord(Q[I])]:=M-I;
  I:=M;
  Repeat
    J:=M;
    K:=I;
    While ((J<>0) And ((Q[J]=S[K]) Or (Q[J]=#$FF))) Do
      Begin
        K:=K-1;
        J:=J-1;
      End;
    I:=I + D[Ord(S[I])]
  Until ((J = 0) Or (I>N));
  If J = 0 Then Boyer:=K{+1} Else Boyer:=-1;
End;

Begin
  WriteLn(StTitle + ' Universal noCD');
  WriteLn('(c) CTPAX-X Team 2007');
  WriteLn('Downloaded from: http://www.CTPAX-X.org');
  WriteLn;

  For I:=1 To 3 Do
    If Not FileExists(FlPatch[I]) Then Break;

  If I = 4 Then
    Begin
      For I:=1 To 3 Do
        Begin
          FName:=FlPatch[I];
          FTime:=FileAge(FName);
          FAttr:=FileGetAttr(FName);
          FileSetAttr(FName, faArchive);
          AssignFile(Fl, FName);
          Reset(Fl, 1);
          SetLength(Buff, FileSize(Fl));
          BlockRead(Fl, Buff[1], FileSize(Fl));
          CloseFile(Fl);
          FileSetAttr(FName, FAttr);

          CP:=Boyer(Buff, #$90#$0E#$E8#$FF#$FF#$83#$C4#$0A#$0B#$C0#$75);

          WriteLn(FName, ':');
          If CP<>-1 Then
            Begin
              ReNameFile(FName, 'OLD_' + FName);
              AssignFile(Fl, FName);
              ReWrite(Fl, 1);
              BlockWrite(Fl, Buff[1], Length(Buff));

              Seek(Fl, CP+10);
              CP:=$EB;
              BlockWrite(Fl, CP, 1);

              CloseFile(Fl);
              FileSetDate(FName, FTime);
              FileSetAttr(FName, FAttr);
              WriteLn('File patched.');
            End
          Else
            WriteLn('Not a "' + StTitle + '" file or already patched.');
          WriteLn;
          SetLength(Buff, 0);
        End;
      WriteLn('Note: don''t forget to copy all files except executables from');
      WriteLn('[CD-ROM]:\HOF_CD\ to your game folder or game will not work.');
    End
  Else
    WriteLn('Can''t find "' + FlPatch[I] + '" file.');

  WriteLn;
  Write('PRESS [ENTER] TO EXIT');
  ReadLn;
End.


Плюсы таких Universal noCD:
1) Не привязаны жёстко к какому-либо смещению. Т.е. в случае если есть какие-то переиздания игры, где что-то чуток изменили и твоё смещение для проверки съехало вперёд/назад - то игра всё-равно будет патчиться. Или, например, у тебя вирус .EXE файл покосил - антивирус его восстановил, но некорректно, а дистрибутива игры у тебя нет - в таких случаях патч тоже будет работать.

2) Анализируется код, который будет патчиться - т.е. два раза один и тот же .EXE файл не пропатчится - т.к. ищется всегда кусок кода, который встречается ОДИН раз во всех исполняемых файлах.

3) Твой noCD занимает 41472 байта - мой 23040 байт (оба файла пожаты UPX 3.00) (*улыбается*)

Если замечаний нет - выкладываю на сайт.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Сообщения в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 27th April 2024 - 20:23