<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://t4ctech.hyperion-roleplay.com/index.php?action=history&amp;feed=atom&amp;title=Reverse-engineering_du_fichier_Npc_Stoneheim.dll</id>
	<title>Reverse-engineering du fichier Npc Stoneheim.dll - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://t4ctech.hyperion-roleplay.com/index.php?action=history&amp;feed=atom&amp;title=Reverse-engineering_du_fichier_Npc_Stoneheim.dll"/>
	<link rel="alternate" type="text/html" href="https://t4ctech.hyperion-roleplay.com/index.php?title=Reverse-engineering_du_fichier_Npc_Stoneheim.dll&amp;action=history"/>
	<updated>2026-07-10T07:03:52Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://t4ctech.hyperion-roleplay.com/index.php?title=Reverse-engineering_du_fichier_Npc_Stoneheim.dll&amp;diff=38&amp;oldid=prev</id>
		<title>FunJp : Page créée avec « == Modification du nombre maximum de renaissances (Serveur 1.25) == Cette modification de la DLL NPC Stoneheim permet de modifier le nombre de renaissances maximum sur un... »</title>
		<link rel="alternate" type="text/html" href="https://t4ctech.hyperion-roleplay.com/index.php?title=Reverse-engineering_du_fichier_Npc_Stoneheim.dll&amp;diff=38&amp;oldid=prev"/>
		<updated>2017-04-23T19:30:44Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « == Modification du nombre maximum de renaissances (Serveur 1.25) == Cette modification de la DLL NPC Stoneheim permet de modifier le nombre de renaissances maximum sur un... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Modification du nombre maximum de renaissances (Serveur 1.25) ==&lt;br /&gt;
Cette modification de la DLL NPC Stoneheim permet de modifier le nombre de renaissances maximum sur un serveur T4C qui par défaut sont limitées à 3.&lt;br /&gt;
&lt;br /&gt;
Nous savons que le nombre de renaissances d&amp;#039;un joueur est stocké dans le flag &amp;quot;Number Of Remorts&amp;quot; (30419).&lt;br /&gt;
&lt;br /&gt;
Il suffit donc d&amp;#039;ouvrir la DLL dans le désassembleur de votre choix, et une fois le désassemblage terminé, de rechercher la valeur 30419 en hexadécimal (0x76D3) dans le listing.&lt;br /&gt;
&lt;br /&gt;
Ce qui nous donne :&lt;br /&gt;
 .text:10087060&lt;br /&gt;
 .text:10087060 loc_10087060:                           ; CODE XREF: sub_10086CD0+387�j&lt;br /&gt;
 .text:10087060                 mov     edx, [esi]&lt;br /&gt;
 .text:10087062                 mov     ecx, esi&lt;br /&gt;
 .text:10087064                 call    dword ptr [edx+194h]&lt;br /&gt;
 .text:1008706A&lt;br /&gt;
 .text:1008706A loc_1008706A:                           ; CODE XREF: sub_10086CD0+38E�j&lt;br /&gt;
 .text:1008706A                 push    offset aReborn  ; &amp;quot;REBORN&amp;quot;&lt;br /&gt;
 .text:1008706F                 push    eax&lt;br /&gt;
 .text:10087070                 push    225Bh&lt;br /&gt;
 .text:10087075                 call    ?GetString@IntlText@@SAPBDKGPBD@Z ; IntlText::GetString(ulong,ushort,char const *)&lt;br /&gt;
 .text:1008707A                 push    eax&lt;br /&gt;
 .text:1008707B                 lea     eax, [ebp+var_14]&lt;br /&gt;
 .text:1008707E                 push    eax&lt;br /&gt;
 .text:1008707F                 call    ?NPCKeyWord@@YA_NABVCString@@PBD@Z ; NPCKeyWord(CString const &amp;amp;,char const *)&lt;br /&gt;
 .text:10087084                 add     esp, 14h&lt;br /&gt;
 .text:10087087                 test    al, al&lt;br /&gt;
 .text:10087089                 jz      loc_100871FE&lt;br /&gt;
 .text:1008708F                 cmp     dword_1012B33C, edi&lt;br /&gt;
 .text:10087095                 jnz     loc_100871FE&lt;br /&gt;
 .text:1008709B                 push    offset unk_101127D8&lt;br /&gt;
 .text:100870A0                 lea     ecx, [ebp+var_10]&lt;br /&gt;
 .text:100870A3                 call    ??YCString@@QAEABV0@PBD@Z ; CString::operator+=(char const *)&lt;br /&gt;
 .text:100870A8                 mov     edx, [esi]&lt;br /&gt;
 .text:100870AA                 push    edi&lt;br /&gt;
 .text:100870AB                 push    76D0h&lt;br /&gt;
 .text:100870B0                 mov     ecx, esi&lt;br /&gt;
 .text:100870B2                 call    dword ptr [edx+0Ch]&lt;br /&gt;
 .text:100870B5                 cmp     eax, 1&lt;br /&gt;
 .text:100870B8                 jnz     loc_10087F55&lt;br /&gt;
 .text:100870BE                 mov     eax, [esi]&lt;br /&gt;
 .text:100870C0                 push    edi&lt;br /&gt;
 .text:100870C1                 push    76D3h&lt;br /&gt;
 .text:100870C6                 mov     ecx, esi&lt;br /&gt;
 .text:100870C8                 call    dword ptr [eax+0Ch]&lt;br /&gt;
 .text:100870CB                 cmp     eax, 03h&lt;br /&gt;
 .text:100870CE                 jl      short loc_10087106&lt;br /&gt;
 .text:100870D0                 cmp     esi, edi&lt;br /&gt;
 .text:100870D2                 jnz     short loc_100870DB&lt;br /&gt;
 .text:100870D4                 call    ?GetDefaultLng@IntlText@@SAGXZ ; IntlText::GetDefaultLng(void)&lt;br /&gt;
 .text:100870D9                 jmp     short loc_100870E5&lt;br /&gt;
 .text:100870DB ; ---------------------------------------------------------------------------&lt;br /&gt;
Examinons de plus près ce passage :&lt;br /&gt;
 .text:100870BE                 mov     eax, [esi]&lt;br /&gt;
 .text:100870C0                 push    edi&lt;br /&gt;
 .text:100870C1                 push    76D3h&lt;br /&gt;
 .text:100870C6                 mov     ecx, esi&lt;br /&gt;
 .text:100870C8                 call    dword ptr [eax+0Ch]&lt;br /&gt;
 .text:100870CB                 cmp     eax, 03h&lt;br /&gt;
 .text:100870CE                 jl      short loc_10087106&lt;br /&gt;
Ici on récupère la valeur du flag 30419 (76d3 hex) du joueur et on la stocke dans le registre eax :&lt;br /&gt;
 .text:100870BE                 mov     eax, [esi]&lt;br /&gt;
 .text:100870C0                 push    edi&lt;br /&gt;
 .text:100870C1                 push    76D3h           ; Flag Number Of Remorts (30419)&lt;br /&gt;
 .text:100870C6                 mov     ecx, esi&lt;br /&gt;
 .text:100870C8                 call    dword ptr [eax+0Ch]&lt;br /&gt;
Autrement dit, on lit le nombre de renaissances du joueur et on la met de côté.&lt;br /&gt;
&lt;br /&gt;
Ensuite, on compare cette valeur avec un entier fixe, ici 3 (03 hex), et on va brancher le programme à l&amp;#039;adresse virtuelle 10087106 (loc_10087106) dans la section &amp;quot;.text&amp;quot; si cette valeur est moindre (jl, soit &amp;#039;&amp;#039;jump if less than&amp;#039;&amp;#039;) ; sinon, on continue le programme :&lt;br /&gt;
 .text:100870CB                 cmp     eax, 03h        ; Max number of remorts&lt;br /&gt;
 .text:100870CE                 jl      short loc_10087106&lt;br /&gt;
Autrement dit, on vient de comparer le nombre de renaissances du joueur avec 3, et suivant que ce nombre est moindre ou pas, le programme ne se comportera pas de la même manière. Il ne faut pas être un génie pour comprendre que cette valeur fixe est la valeur qui limite le nombre de renaissances.&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;adresse de cette instruction est l&amp;#039;adresse virtuelle (&amp;#039;&amp;#039;Virtual Address&amp;#039;&amp;#039; ou VA) dans la section de l&amp;#039;exécutable nommée &amp;quot;.text&amp;quot;. Si vous utilisez le [http://www.hex-rays.com/idapro désassembleur IDA], l&amp;#039;offset correspondant dans le fichier est indiqué juste à côté en bas à gauche (merci Ikar pour le tuyau ;)). Sinon, il faut le calculer. Corrigez-moi si je me trompe : (--Sorkvild 17 mars 2008 à 17:06 (MSK))&lt;br /&gt;
 FileOffset = VirtualAddress - VirtualOffset + RawOffset&lt;br /&gt;
* VirtualAddress est notre addresse VA, 0x100870CB + 2 octets (pour l&amp;#039;instruction &amp;#039;&amp;#039;cmp eax&amp;#039;&amp;#039;), soit &amp;#039;&amp;#039;&amp;#039;0x100870CD&amp;#039;&amp;#039;&amp;#039; de la section &amp;#039;&amp;#039;&amp;#039;.text&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* VirtualOffset est l&amp;#039;adresse où démarre notre section &amp;#039;&amp;#039;&amp;#039;.text&amp;#039;&amp;#039;&amp;#039;. Cette valeur se trouve dans les informations de l&amp;#039;en-tête des sections (&amp;#039;&amp;#039;sections header&amp;#039;&amp;#039; dans votre désassembleur). Celui-ci nous renseigne : la section .text commence à 0x10001000.&lt;br /&gt;
* RawOffset est un décalage arbitraire dans le fichier binaire à partir duquel les sections commencent. Le désassembleur nous renseigne encore : dans notre DLL, il vaut 0x00001000.&lt;br /&gt;
Ce qui nous donne :&lt;br /&gt;
 FileOffset = 0x100870CD - 0x10001000 + 0x00001000 = 0x000870cd = 553165&lt;br /&gt;
On récupère donc son offset dans le fichier : 553165.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez davantage d&amp;#039;informations sur le format PE sur cette page.&lt;br /&gt;
&lt;br /&gt;
Une fois cette adresse trouvée, il vous suffira de développer un petit logiciel de patch ou bien de modifier à l&amp;#039;aide d&amp;#039;un éditeur hexadécimal la valeur du nombre de renaissances directement dans le fichier.&lt;br /&gt;
&lt;br /&gt;
=== Exemple d&amp;#039;un patcheur pour cette DLL en Delphi ===&lt;br /&gt;
 (* -------------------------------------------------------------------------- *)&lt;br /&gt;
 (* T4C Reborn Patcher v1.25 By Mestoph *)&lt;br /&gt;
 (* -------------------------------------------------------------------------- *)&lt;br /&gt;
 Unit Patcheur;&lt;br /&gt;
 &lt;br /&gt;
 Interface&lt;br /&gt;
 &lt;br /&gt;
 Uses&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; Dialogs, StdCtrls, ExtCtrls, WinSkinData;&lt;br /&gt;
 &lt;br /&gt;
 Type&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; TForm1 = Class(TForm)&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   SkinData1: TSkinData;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   GroupBox1: TGroupBox;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   OpenDialog1: TOpenDialog;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Lbl_Port: TLabel;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Edit_Port: TEdit;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Edit_Fichier: TEdit;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Btn_Ouvrir: TButton;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Btn_Patch: TButton;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Btn_Fermer: TButton;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   GroupBox3: TGroupBox;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Lbl_Taille: TLabel;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Bevel1: TBevel;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Procedure Btn_OuvrirClick(Sender: TObject);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Procedure Btn_FermerClick(Sender: TObject);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Procedure Btn_PatchClick(Sender: TObject);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Procedure Edit_PortKeyPress(Sender: TObject; Var Key: Char);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; Private&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   { Déclarations privées }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; Public&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   { Déclarations publiques }&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; End;&lt;br /&gt;
 &lt;br /&gt;
 Var&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; Form1: TForm1;&lt;br /&gt;
 &lt;br /&gt;
 Implementation&lt;br /&gt;
 &lt;br /&gt;
 {$R *.dfm}&lt;br /&gt;
 &lt;br /&gt;
 (* -------------------------------------------------------------------------- *)&lt;br /&gt;
 (* Ouverture du fichier *)&lt;br /&gt;
 (* -------------------------------------------------------------------------- *)&lt;br /&gt;
 Procedure TForm1.Btn_OuvrirClick(Sender: TObject);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; Var Taille_Fichier : LongInt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Donnees, Emplacement : Pbyte;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Fichier : File;&lt;br /&gt;
 Begin&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; If OpenDialog1.Execute = True Then&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Begin&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Edit_Fichier.Text := OpenDialog1.FileName;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     AssignFile(Fichier, OpenDialog1.filename);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Reset(Fichier,1);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Taille_Fichier := FileSize(Fichier);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     GetMem(Donnees,Taille_Fichier);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     BlockRead(Fichier,Donnees^,Taille_Fichier);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Emplacement := Donnees;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Emplacement := Pointer(LongInt(Emplacement) + 553165);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Edit_Port.Text := IntToStr(PByte(LongInt(Emplacement))^);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     FreeMem(Donnees);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Lbl_Taille.Caption := IntToStr(Filesize(Fichier)) + &amp;#039; Octets&amp;#039;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     CloseFile(Fichier);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   End;&lt;br /&gt;
 End;&lt;br /&gt;
 (* -------------------------------------------------------------------------- *)&lt;br /&gt;
 (* Fermeture du programme *)&lt;br /&gt;
 (* -------------------------------------------------------------------------- *)&lt;br /&gt;
 Procedure TForm1.Btn_FermerClick(Sender: TObject);&lt;br /&gt;
 Begin&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; Application.Terminate;&lt;br /&gt;
 End;&lt;br /&gt;
 (* -------------------------------------------------------------------------- *)&lt;br /&gt;
 (* Patche du fichier *)&lt;br /&gt;
 (* -------------------------------------------------------------------------- *)&lt;br /&gt;
 Procedure TForm1.Btn_PatchClick(Sender: TObject);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; Var Taille_Fichier : LongInt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Donnees, Emplacement : Pbyte;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Fichier : File;&lt;br /&gt;
 Begin&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; If Edit_Fichier.Text &amp;lt;&amp;gt; &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt; Then&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Begin&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     If Edit_Port.Text &amp;lt;&amp;gt; &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt; Then&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       Begin&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         If (StrToInt(Copy(Lbl_Taille.Caption,1,Length(Lbl_Taille.Caption)-7)) &amp;gt;= 1196100) then&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           Begin&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             AssignFile(Fichier,Edit_Fichier.Text);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             Reset(Fichier,1);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             Taille_Fichier := FileSize(Fichier);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             // On alloue une nouvelle zone mémoire&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             GetMem(Donnees,Taille_Fichier);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             // On mets les données du fichier en mémoire&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             BlockRead(Fichier,Donnees^,Taille_Fichier);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             Emplacement := Donnees;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             // On Patch a l&amp;#039;offset 003f75a&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             Emplacement := Pointer(LongInt(Donnees) + 553165);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             PByte(LongInt(Emplacement))^ := StrToInt(Edit_Port.Text);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             CloseFile(Fichier);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             // On fait une copie du fichier en cas de problème.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             RenameFile(Edit_Fichier.Text,Edit_Fichier.Text+&amp;#039;.bak&amp;#039;);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             AssignFile(Fichier,Edit_Fichier.Text);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             Rewrite(Fichier,1);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             // On mets les données de la mémore dans le fichier&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             BlockWrite(Fichier,Donnees^,Taille_Fichier);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             CloseFile(Fichier);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             // On libère la mémoire&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             FreeMem(Donnees);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             ShowMessage(&amp;#039;Le fichier : &amp;#039; + #13 + Edit_Fichier.Text + #13 + &amp;#039;a été patché avec succès !&amp;#039;);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             Edit_Port.Text := &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             Edit_Fichier.Text := &amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;             Lbl_Taille.Caption := &amp;#039;0 Octets&amp;#039;;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;           End&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;         Else ShowMessage(&amp;#039;Le fichier ne correspont pas au fichier NPC Stoneheim.dll de base !&amp;#039;);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;       End&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Else ShowMessage(&amp;#039;Vous n&amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;avez pas rempli de façon correct les informations requises !&amp;#039;);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   End&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; Else ShowMessage(&amp;#039;Vous devez ouvrir le fichier NPC Stoneheim.dll !&amp;#039;);&lt;br /&gt;
 End;&lt;br /&gt;
 (* -------------------------------------------------------------------------- *)&lt;br /&gt;
 (* Detection des touche clavier *)&lt;br /&gt;
 (* -------------------------------------------------------------------------- *)&lt;br /&gt;
 Procedure TForm1.Edit_PortKeyPress(Sender: TObject; Var Key: Char);&lt;br /&gt;
 Begin&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; If Key In [&amp;#039;0&amp;#039;..&amp;#039;9&amp;#039;, Chr(VK_BACK), Chr(VK_DELETE)] Then&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt; Else&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   Begin&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     showmessage(&amp;#039;Uniquement les chiffres de 0 à 9 sont autorisés !&amp;#039;);&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;     Key:=#0;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; &amp;lt;/nowiki&amp;gt;   End;&lt;br /&gt;
 End;&lt;br /&gt;
 &lt;br /&gt;
 End.&lt;br /&gt;
--Mestoph 17 mars 2008 à 05:04 (MSK)&lt;/div&gt;</summary>
		<author><name>FunJp</name></author>
	</entry>
</feed>