Strip Reloc v1.13 - Open Source
2 participantes
Página 1 de 1
Strip Reloc v1.13 - Open Source
Programinha interessante. Vou resumir tudo sem muitos detalhes. Ele remove partes do executável consideradas "inúteis" pelo Windows, em resumo, partes que nunca serão usadas nem pra alocar recurso nem pra codificar instruções.
Ele não reduz muito, mas considerando que app de console é bem pequeno, qualquer ganho de 5 KB já é ótimo, pra uma linguagem igual Pascal.
Obs: Na hora de criar um projeto novo escolha aplicativo de console (linha de comando)
O programa é Open Source
Ele não reduz muito, mas considerando que app de console é bem pequeno, qualquer ganho de 5 KB já é ótimo, pra uma linguagem igual Pascal.
Obs: Na hora de criar um projeto novo escolha aplicativo de console (linha de comando)
O programa é Open Source
- Código:
program StripReloc;
{$APPTYPE CONSOLE}
{
StripReloc v1.13
Strip relocation section from Win32 PE files
Copyright (C) 1999-2005 Jordan Russell. All rights reserved.
http://www.jrsoftware.org/
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
$jrsoftware: stripreloc/StripReloc.dpr,v 1.16 2005/02/13 05:03:42 jr Exp $
}
uses
Windows, SysUtils, Classes;
{x$R *.RES}
const
Version = '1.13';
var
KeepBackups: Boolean = True;
WantValidChecksum: Boolean = False;
ForceStrip: Boolean = False;
ImageHlpHandle: THandle;
CheckSumMappedFile: function(BaseAddress: Pointer; FileLength: DWORD;
var HeaderSum: DWORD; var CheckSum: DWORD): PImageNtHeaders; stdcall;
function CalcChecksum(const FileHandle: THandle): DWORD;
var
Size: DWORD;
H: THandle;
M: Pointer;
OldSum: DWORD;
begin
Size := GetFileSize(FileHandle, nil);
H := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, Size, nil);
if H = 0 then
RaiseLastWin32Error;
try
M := MapViewOfFile(H, FILE_MAP_READ, 0, 0, Size);
if M = nil then
RaiseLastWin32Error;
try
Win32Check(CheckSumMappedFile(M, Size, OldSum, Result) <> nil);
finally
UnmapViewOfFile(M);
end;
finally
CloseHandle(H);
end;
end;
procedure Strip(const Filename: String);
const
IMAGE_NT_OPTIONAL_HDR32_MAGIC = $10b;
type
PPESectionHeaderArray = ^TPESectionHeaderArray;
TPESectionHeaderArray = array[0..$7FFFFFFF div SizeOf(TImageSectionHeader)-1] of TImageSectionHeader;
var
BackupFilename: String;
F, F2: File;
EXESig: Word;
PEHeaderOffset, PESig: Cardinal;
PEHeader: TImageFileHeader;
PEOptHeader: TImageOptionalHeader;
PESectionHeaders: PPESectionHeaderArray;
BytesLeft, Bytes: Cardinal;
Buf: array[0..8191] of Byte;
I: Integer;
RelocVirtualAddr, RelocPhysOffset, RelocPhysSize: Cardinal;
OldSize, NewSize: Cardinal;
TimeStamp: TFileTime;
begin
PESectionHeaders := nil;
try
RelocPhysOffset := 0;
RelocPhysSize := 0;
BackupFilename := Filename + '.bak';
Write(Filename, ': ');
AssignFile(F, Filename);
FileMode := fmOpenRead or fmShareDenyWrite;
Reset(F, 1);
try
OldSize := FileSize(F);
GetFileTime(TFileRec(F).Handle, nil, nil, @TimeStamp);
BlockRead(F, EXESig, SizeOf(EXESig));
if EXESig <> $5A4D {'MZ'} then begin
Writeln('File isn''t an EXE file (1).');
Exit;
end;
Seek(F, $3C);
BlockRead(F, PEHeaderOffset, SizeOf(PEHeaderOffset));
if PEHeaderOffset = 0 then begin
Writeln('File isn''t a PE file (1).');
Exit;
end;
Seek(F, PEHeaderOffset);
BlockRead(F, PESig, SizeOf(PESig));
if PESig <> $00004550 {'PE'#0#0} then begin
Writeln('File isn''t a PE file (2).');
Exit;
end;
BlockRead(F, PEHeader, SizeOf(PEHeader));
if not ForceStrip and (PEHeader.Characteristics and IMAGE_FILE_DLL <> 0) then begin
Writeln('Skipping; can''t strip a DLL.');
Exit;
end;
if PEHeader.Characteristics and IMAGE_FILE_RELOCS_STRIPPED <> 0 then begin
Writeln('Relocations already stripped from file (1).');
Exit;
end;
PEHeader.Characteristics := PEHeader.Characteristics or IMAGE_FILE_RELOCS_STRIPPED;
if PEHeader.SizeOfOptionalHeader <> SizeOf(PEOptHeader) then begin
Writeln('File isn''t a valid 32-bit image (1).');
Exit;
end;
BlockRead(F, PEOptHeader, SizeOf(PEOptHeader));
if PEOptHeader.Magic <> IMAGE_NT_OPTIONAL_HDR32_MAGIC then begin
Writeln('File isn''t a valid 32-bit image (2).');
Exit;
end;
if (PEOptHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = 0) or
(PEOptHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = 0) then begin
Writeln('Relocations already stripped from file (2).');
Exit;
end;
RelocVirtualAddr := PEOptHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
PEOptHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress := 0;
PEOptHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size := 0;
if not WantValidChecksum then
PEOptHeader.CheckSum := 0;
GetMem(PESectionHeaders, PEHeader.NumberOfSections * SizeOf(TImageSectionHeader));
BlockRead(F, PESectionHeaders^, PEHeader.NumberOfSections * SizeOf(TImageSectionHeader));
for I := 0 to PEHeader.NumberOfSections-1 do
with PESectionHeaders[I] do
if (VirtualAddress = RelocVirtualAddr) and (SizeOfRawData <> 0) then begin
RelocPhysOffset := PointerToRawData;
RelocPhysSize := SizeOfRawData;
SizeOfRawData := 0;
Break;
end;
if RelocPhysOffset = 0 then begin
Writeln('Relocations already stripped from file (3).');
Exit;
end;
if RelocPhysSize = 0 then begin
Writeln('Relocations already stripped from file (4).');
Exit;
end;
for I := 0 to PEHeader.NumberOfSections-1 do
with PESectionHeaders[I] do begin
if PointerToRawData > RelocPhysOffset then
Dec(PointerToRawData, RelocPhysSize);
if PointerToLinenumbers > RelocPhysOffset then
Dec(PointerToLinenumbers, RelocPhysSize);
if PointerToRelocations <> 0 then begin
{ ^ I don't think this field is ever used in the PE format.
StripRlc doesn't handle it. }
Writeln('Cannot handle this file (1).');
Exit;
end;
end;
if PEOptHeader.ImageBase < $400000 then begin
Writeln('Cannot handle this file -- the image base address is less than 0x400000.');
Exit;
end;
finally
CloseFile(F);
end;
if FileExists(BackupFilename) then
Win32Check(DeleteFile(BackupFilename));
Rename(F, BackupFilename);
try
FileMode := fmOpenRead or fmShareDenyWrite;
Reset(F, 1);
try
AssignFile(F2, Filename);
FileMode := fmOpenWrite or fmShareExclusive;
Rewrite(F2, 1);
try
BytesLeft := RelocPhysOffset;
while BytesLeft <> 0 do begin
Bytes := BytesLeft;
if Bytes > SizeOf(Buf) then Bytes := SizeOf(Buf);
BlockRead(F, Buf, Bytes);
BlockWrite(F2, Buf, Bytes);
Dec(BytesLeft, Bytes);
end;
Seek(F, Cardinal(FilePos(F)) + RelocPhysSize);
BytesLeft := FileSize(F) - FilePos(F);
while BytesLeft <> 0 do begin
Bytes := BytesLeft;
if Bytes > SizeOf(Buf) then Bytes := SizeOf(Buf);
BlockRead(F, Buf, Bytes);
BlockWrite(F2, Buf, Bytes);
Dec(BytesLeft, Bytes);
end;
Seek(F2, PEHeaderOffset + SizeOf(PESig));
BlockWrite(F2, PEHeader, SizeOf(PEHeader));
BlockWrite(F2, PEOptHeader, SizeOf(PEOptHeader));
BlockWrite(F2, PESectionHeaders^, PEHeader.NumberOfSections * SizeOf(TImageSectionHeader));
if WantValidChecksum then begin
PEOptHeader.CheckSum := CalcChecksum(TFileRec(F2).Handle);
{ go back and rewrite opt. header with new checksum }
Seek(F2, PEHeaderOffset + SizeOf(PESig) + SizeOf(PEHeader));
BlockWrite(F2, PEOptHeader, SizeOf(PEOptHeader));
end;
NewSize := FileSize(F2);
SetFileTime(TFileRec(F2).Handle, nil, nil, @TimeStamp);
finally
CloseFile(F2);
end;
finally
CloseFile(F);
end;
except
DeleteFile(Filename);
AssignFile(F, BackupFilename);
Rename(F, Filename);
raise;
end;
Writeln(OldSize, ' -> ', NewSize, ' bytes (',
OldSize - NewSize, ' difference)');
if not KeepBackups then
if not DeleteFile(BackupFilename) then
Writeln('Warning: Couldn''t delete backup file ', BackupFilename);
finally
FreeMem(PESectionHeaders);
end;
end;
var
SR: TSearchRec;
S: String;
FilesList: TStringList;
P, I: Integer;
HasFileParameter: Boolean = False;
NumFiles: Integer = 0;
label 1;
begin
try
Writeln('StripReloc v' + Version + ', Copyright (C) 1999-2005 Jordan Russell, www.jrsoftware.org');
if ParamCount = 0 then begin
Writeln('Strip relocation section from Win32 PE files');
Writeln;
1:Writeln('usage: stripreloc [switches] filename.exe');
Writeln;
Writeln('switches: /B don''t create .bak backup files');
Writeln(' /C write a valid checksum in the header (instead of zero)');
Writeln(' /F force stripping DLLs instead of skipping them. do not use!');
Halt(1);
end;
Writeln;
for P := 1 to ParamCount do begin
S := ParamStr(P);
if S[1] <> '/' then
Continue;
Delete(S, 1, 1);
I := 1;
while I <= Length(S) do begin
case UpCase(S[I]) of
'?': goto 1;
'B': begin
KeepBackups := False;
if I < Length(S) then begin
{ For backward compatibility, do keep backups if the character
following 'B' is a '+'. }
if S[I+1] = '+' then begin
KeepBackups := True;
Inc(I);
end
else if S[I+1] = '-' then
Inc(I);
end;
end;
'C': if not WantValidChecksum then begin
ImageHlpHandle := LoadLibrary('imagehlp.dll');
if ImageHlpHandle = 0 then begin
Writeln('Error: Unable to load imagehlp.dll.');
Writeln(' It is required when using the /C parameter.');
Halt(1);
end;
CheckSumMappedFile := GetProcAddress(ImageHlpHandle, 'CheckSumMappedFile');
if @CheckSumMappedFile = nil then begin
Writeln('Error: Unable to get address of CheckSumMappedFile in imagehlp.dll.');
Writeln(' It is required when using the /C parameter.');
Halt(1);
end;
WantValidChecksum := True;
end;
'F': ForceStrip := True;
else
Writeln('Invalid parameter: /', S[I]);
Halt(1);
end;
Inc(I);
end;
end;
for P := 1 to ParamCount do begin
S := ParamStr(P);
if S[1] = '/' then
Continue;
HasFileParameter := True;
FilesList := TStringList.Create;
try
FilesList.Sorted := True;
if LastDelimiter('*?', S) = 0 then begin
if GetFileAttributes(PChar(S)) and FILE_ATTRIBUTE_DIRECTORY <> 0 then begin
{ This'll catch non-existant files as well as directory names }
Writeln(S, ': File not found.');
Continue;
end;
FilesList.Add(S);
end
else begin
if FindFirst(S, 0, SR) <> 0 then begin
Writeln('No files matching "', S, '" found.');
Continue;
end;
try
repeat
if CompareText(ExtractFileExt(SR.Name), '.bak') <> 0 then
FilesList.Add(ExtractFilePath(S) + SR.Name);
until FindNext(SR) <> 0;
finally
FindClose(SR);
end;
end;
for I := 0 to FilesList.Count-1 do
Strip(FilesList[I]);
Inc(NumFiles);
finally
FilesList.Free;
end;
end;
if not HasFileParameter then
goto 1;
if NumFiles = 0 then
Halt(2);
except
on E: Exception do begin
Writeln('Fatal error: ', E.Message);
Halt(3);
end;
end;
end.
Ninja8086- Membro
- Mensagens : 5
Data de inscrição : 19/04/2011
Re: Strip Reloc v1.13 - Open Source
Código do AlienHEX: (salve como RAR)
- Código:
526172211A0700CF907300000D000000000000006A5B7420803500550C0000FD310000024BBCA3AAA0094C321D3515002000000070726F6A656374537472697052656C6F632E647072A7187004273CFC05616A5C31BEC862C06B46688D190CD7EBA08A17F41B14CEA472C9520850886CA263CA64096FDB0B9F5FF6EE09D8D25A631C507CD67506E04A25B0D1559F45F09068298514409F0AB6B5FAF4FEF94D835656050D92AD871E8217BD1A0DD47C954C25336A906D18DDA5F21508924F0BE2591251039D6FAB2C2907C560060D0517039FEE5FDF01CB5981DED50CDAB1B276184E5A91F3220F0BCB00AA65CD7B977CB90ED82EB51E467FB74C57A0FA8D038CE8558592832453C20BD769108D56A391F37005ACCF634709918DD60A3DFAFFF2D0F7DCAFB9726231DE2BF7F4453ED593F17C67FDA8BB7D09B2DFB2EE985FFDBDA9FA135F44A14ADCCE9454C8FB01CD6692F08FB03635340622C3660D0A44EDCD06EF9BA48C7510D4FC3BC65DF71B963EF92FCE70799700F1E89CE6EEBF403EB3B05E6EFA43B923D78A0E3DAC7CA53DD7EC8B533D4C5EC52E69B1CBC3DB67F38E6EE277FAC47B1CF809A19F339A82E5508CE66C3D2604F19FA8293D4605D84078EB6FA433F198CBBF40A84B92CB1A48048B7DD04451988BC9D728FB204B433E064C67B12089201417604739BAC06E8C4506958A89ABD7D3730744AB9D8BBF6B4B45454E719A1366BE673572D41096C3F6A9D848DCD614952823C4B27206B8067FA9CADCB49C297253D36ACDE356AAB915D8A0BBBB59420C9068A4623E599F83B4DDF6285EE5ED2D1D2C3115E0426E5605D53B0DA1BA8D7F70DE3DE25C5C9EDEAB224B12986C9999779E9C82069D8778D5ECA0DCE46530D48F11E44EE3B66985181B3131C08AD7D2335976849051A2098DB0454654FA07E84AB32A10CC00CD10DA5B8F1BABA96894844948187C67E2BCA3D8F0CB9319A70983D94B72FE6072708F600307B2CAAA1136C7B764853A85D225A4CC47CE22AAF146B64503935A6C4E6D0FD4864082A5F61F0764D9ACA5992E2835A387EB68A360F6F724F5F12A0F282872108E0DF8E7EFA8591888989649529762CE67EB64C32C050E284A1B8688C24F8E32B45AC5078C7F44AC2B668C55D72137CE709A67558FFF1BCD7C9FAB73A191BB89A00D70223D64EA97CFF8C69128ECEEBCDF4AF7F9706274F27F43F1B05C9FF06381F32460FE049B47F51E325375504359C720D61339534AA48A13DD37CDED1D90777A7142F0B524B3FC9AD26AC7959466AAE97F642D9B867959B1D996765E9D592495E719DACEF2C900E4FE875DFD2F07D1CCB5B9F30CDD1FF6AF2EA0C56404E4C135F8B7C73779EECAB773D28467753AA4E25DEF921525A3F71DE64E84AB493B8EA5A4AFEFC35C824FCAC53D91340B582E5AE8179ACD6E5C1B86F0C16678A623A373B234F8D7EB71FF310720A747D727DE1E32EE504F5DC98A084486F8CA8F2341E36E3D51CB9DEB0F3A76FBE07DBC298F8B9F39D6D3D30589ACED1427AF2C1A74C7A17CC5B2A9AF7DE88545422EA3C4292D444EF4674BD0588C972E2087A4D5D12D0C4FD901E00CEEA5615065DF6A288A409A943D28F8436992C3A6FDB7419B9EB291DED0B070D11999538FFBEE55B9D65A6B5373C21027D92B26571CF7264EE06E91CF88D27A470D2B74B3AFD5E552BD102EA06F5FB6A174711D60B587C6FEDCCDA8C1161372FB6E97342C127F5E19312CB0031B8F457D268E3758C4CC0E8B7797FD44DAAECBAD65635C25648E3EAE4A34A95FFEE46C3DA945943D8DAC09413D86928D045CEFCADAFA2DFF6A3F39AF519345D41B36E7DD5FE2FF87941FA3FC8D22F81C8095EB1BBC9A1F31C9FE6F7B245C4F558D4DFF1B41AE4D2B79D07C11F9FAB5DB44C8C4291561A6DE48F9A1D2589DDB6C249B423D4CD9302C3CBB39E0A301755E958FFBA927DE53949458FA0C7B86AD3D2062FF02B99CCA44B8DA6F84813E8968D407B4CF84F88D34D39A31E7397DDF3E6ED399B6D999CD380A194C7097372ED825C6620FEAC6339ECD92D87502E33AC6F7A05349E828A70A7ACA7AFB2FB1FE4685FE55DF7397F12387FF191E5072838ADA7565DA54AFAE6AA2EBFECED51B7E83A88CA0F5B4D072FAF827289C4E7AF7017704CCB8D333B35CDC5690FDE9D75CC2043D8E4077A0EDA080223C37F6AF4C29839B2614B8EC18F891DF4CE591F1B872B22B849349F476144F7226E1DC7E7EB8698F90F0840AB076E0F40D9A9034A1CD1B1DDDF00EFB9D7D999EC5B2C2FD603E0F469D650438E9DD2FCE39B518A5B85F13F57DFB858700614C923CE59C9887491AA87D33A72325EF8A207E640556ECE101A5745F90EAB1A6A6F072F23832BF54FCCA6FC1C5597F3ACA8C9FE828EC7574D06A08297C90D75DC2C87F75173B784EE536C339607F9F800E1DD9D14C9FBFE21EB2B839A2A2EFADDAB3B1BDD843B5A36E67E0FE57FA693310DEFE341233640D8BD771CF35E536774192E7E4F2D4B7F1A892EDEEBCF4296ADF4EBA09FAEDDB573C673FF233234414DA83B1D36A6896E8257A76D6045907CE6A99FA48E91A711BCB3D43A429660DA403327DCFA29F8E99EA36923CF4EDC68F5C2CAA9A2A1E71C265B4A38DEE2BBB0E3828B0C8ECFB5B7291134EC5580C69BD0C7C8383405B4EBC43A2552791D39A78F18364B3E2A42A8F8097EE3E2A15037E453CC93539E568935917CCFDD89F59AE85308084453898E3240D7E969B336D6A95F1487AC67E9A2A9BA426FC654A56EAE70D2733DD663BE88451879904013F091A31B8570577C1A2FA1BF2A0B5350AA6B50A09D8808895CA1809DFA1808AEE6E34A6478E6A86114AB83B1B135476B7FED905201FB9AC9C01937BAE5085073488E610E81F6F65670DBFA4DEE9402B2D8B2EAF4B1D28A05E16C758FF976800F6E39045F04EEF9995359DEE09A7E1F567AAFAC5C7F4B73895F6E0134DC6B2D8B2F1BB363A2576928E140DCB3E51552B24520FA6E8DBC91F9D21176635178A90EC1896FD6A029E978E3B670BAB454E948A4FF3CFC7B64B4E7C0D641FA9992443604B3C7297E613395E06FC8795036A87776E8F0C26561E14655F7FCF729C30609390700E22B9FBFE600C8A1B8AB0FAE798EDFF5C119804C7B1296BBFB8837E7B9B8A7D8F4CB5CBA1E3496D09F4913BD9C6809BFF11F11F311ACE139F84688DF77DD5A8AAC0EAC1E664F6490E989C3F8CDC81A2112271713503673EC4E331DAD409154008E3A9EA5B8226C4431E9E630CAB9F5B5F0EB572CB61B62D9AD791FCF6126EF391C66BDFA1A16EAD3EB629725A8F481F8B8CF000C3F48DC2E58796A2428387D648DC1B8A003753442CE6B49E3401A389E7689291D629C4EE1068ACC6AA1F2F6008E657AEF665192089496E45F2705E7BC9048D8277AFDA507C9EDFA925810BE039005AB00A05A95FD0A9797D8D065EE73FCAADCA5B129C67BA28A48FDB44B6572CE30C730B64C074BE5E9943F2C4C038F5D7C3102CCC6111CC06DAC3F61DEA65250EF0B77A665A5B7098A66B0814383371D3D47087C52AD4C4839236540864BBA79EA457FB3BE0400FC39029442F876E0A7C4FFBB22C2366FB1F75A574C67EEE2889CC0CDC1E520AC67E297398D52DE4583B867BD74711EDA9E18B275D3F7542FFCE1164E346C8F654EBC22ECEDDB3D9A947DF9475224D92377EB13019D1E21161A01FB1DAC7CEC5151F4A97891D2637F6E662E3A0D4B44D40C6CDD212D0E2A3B8BB9B561C0E2310C921237519FAA6ED42375C7328B7E86CF96783769F9B73EB1A13C915014A99CDAEF91823850BCE278EBF84EFACB24CDAB5CC2C84D047D1349544E9566ADE997D228E939C5339739C18DE7ECF08A067A7D8E94D57C7114ACBD0E05B906459D021B3EFD22E488EB312BDF8CFE6FA60AF41714D99E6347514474F50A6BD4AA166AEA7F8D8AC769943FE3D739CC0BC1D2C8D8569ABC1172293A1E42A28E15EF288BF11411D9DB881C3FF8797DDA4635CBAB69C07ADB7BDF0F5E6EDE2FB975542C66A1699071880028F1B1FACF47C730E41D7C2133FF68044E536E9E87315A54E47472104D9FA1D5E451495A0029B2E72408490978917C856A4C44FA0ECF45CFEC1E74BDEB43E67D25BF9D5FDABCEA0CFEE858FA9ADBA08966C6BD0715E515BF451CD2C48939352155882A596E9AD7BE545566C616387EAF6DCC9D0888F0C44D6E6A60138A551A20A7348A274DFBCE22B38ED4219755AFA4A7C137988F9652164373DFD9B7482E127AA2D027C6DD442FA3ED58D3D15C04F3837CCB2884BC825517364D86F74C1C4DB305D888394E676B69D9F3B86100F272727EE07F30CF4C4D91AD06C108652EB0AC769C2F776D80B74A0DADC82603D33BA8FB899D6B14597F6FB296CEF8F5AD8AD9A684958604E83AB779982CFC5954AA1E85DD46F25E7C72320D7AF2588A82DCA1BBD8360046E6519B33D0BF2CDAFD928897A556F6174B60BFE54333FD7D03D5E53866A802D25B3D09CBAF6B6949FFD9B0C7FD3768FCDFB4D085E1517B769055431E1BC24A71E2C550000BF8867F6A9FFD4C43D7B00400700
Ninja8086- Membro
- Mensagens : 5
Data de inscrição : 19/04/2011
Re: Strip Reloc v1.13 - Open Source
Achei bem util a source, ela tambem é muito boa para entender os arquivos executaveis (PE File).
E obrigado por usar o AlienHEX.
E obrigado por usar o AlienHEX.
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
Seg Jul 27, 2015 11:42 am por Fredyffp
» Fontes Sistema Store Protheus 7.0 - Versão completa Delphi XE7
Sáb Jul 18, 2015 10:18 am por storeprotheus
» Fontes Sistema Store Protheus 7.0 - Versão completa Delphi XE7
Sáb Jul 18, 2015 10:17 am por storeprotheus
» Como gravar um campo Blob no FireBird + Delphi de um campo tipo imagem no MS-ACCESS ?
Qui maio 14, 2015 3:41 pm por ant.carlos/sp
» Exception EBDEngineError
Sex Fev 27, 2015 6:52 am por luan_cpd
» Exception EBDEngineError
Sex Fev 27, 2015 6:49 am por luan_cpd
» Componente Delphi Brasil
Sex Jan 23, 2015 11:51 am por pedrosilva
» Erro no Delphi “A linha não pode ser localizada para atualiz
Sex Out 24, 2014 11:47 am por Edson
» Fontes Automação Comercial 8.5 - Retaguarda c/ PDV, PAF 1.10, TEF, ECF, Sintegra, SpedFiscal, Google Maps e muito mas...
Ter Out 14, 2014 9:55 am por john marcos