untUtils by ErazerZ
Post date: Sep 28, 2010 4:48:50 PM
{
NonVCL Delphi Utils
by ErazerZ
25 Juni, 2006
05 - 23 Juni, 2006:
Alle Funktionen
24 Juni, 2006:
GetPointerSize
MyGetProcAddress
MyLoadLibrary
ShowMessageIcon
25 Juni, 2006:
SaveToFile
GetEOFData - Edited Version (Faster one, just using API and working with Pointers)
}
unit untUtils;
interface
uses Windows, WinSock;
{
Normal in CommCtrl deklariert
}
type
TOpenFilename = packed record
lStructSize: DWORD;
hWndOwner: HWND;
hInstance: HINST;
lpstrFilter: PAnsiChar;
lpstrCustomFilter: PAnsiChar;
nMaxCustFilter: DWORD;
nFilterIndex: DWORD;
lpstrFile: PAnsiChar;
nMaxFile: DWORD;
lpstrFileTitle: PAnsiChar;
nMaxFileTitle: DWORD;
lpstrInitialDir: PAnsiChar;
lpstrTitle: PAnsiChar;
Flags: DWORD;
nFileOffset: Word;
nFileExtension: Word;
lpstrDefExt: PAnsiChar;
lCustData: LPARAM;
lpfnHook: function(Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT stdcall;
lpTemplateName: PAnsiChar;
pvReserved: Pointer;
dwReserved: DWORD;
FlagsEx: DWORD;
end;
function IntToStr(i: Integer): String;
function StrToInt(S: String): Integer;
function FloatToStr(E: Extended): String;
function StrToFloat(S: String): Extended;
function IntToHex(dwNumber: DWORD): String; overload;
function IntToHex(dwNumber: DWORD; Len: Integer): String; overload;
function HexToInt(S: String): Integer;
function LowerString(S: String): String;
function UpperString(S: String): String;
function Trim(S: String): String;
function FirstDelimiter(S: String; Delimiter: Char): Integer;
function LastDelimiter(S: String; Delimiter: Char): Integer;
function ReplaceChar(S: String; Old, New: Char): String;
function ReplaceString(S, OldPattern, NewPattern: String): String;
function Format(sFormat: String; Args: Array of const): String;
function Split(Input, Deliminator: String; Index: Integer): String;
function ExtractFilePath(sFilename: String): String;
function ExtractFileName(sFilename: String): String;
function ExtractFileExt(sFilename: String): String;
function ExtractDriveName(sFilename: String): String;
function ExtractURLSite(S: String): String;
function ExtractURLPath(S: String): String;
function ExtractMyFilename: String;
function ExtractMyFilePath: String;
function FormatTime(MilliSec: Cardinal): String;
function GetFileDateTime(lpFilename: String): String;
function FormatBytes(sNumber: String): String; overload;
function FormatBytes(Number: Integer): String; overload;
function TranslateSize(Size: TLargeInteger): String;
function GetFileSize(FileName: String): DWORD;
function GetFileSizeFormated(FileName: String): String;
function FileExists(FileName: String): Boolean;
function DirectoryExists(DirectoryName: String): Boolean;
function DeleteFolder(Path: String): Boolean;
function GetFileVersionInfo(Filename, BlockKey: String): String;
function GetLastErrorMsg: String;
function GetWindowsVersion: String;
function IsWindows9x: Boolean;
function IsWindowsNt: Boolean;
function GetWindowsDirectory: String;
function GetSystemDirectory: String;
function GetTempDirectory: String;
function GetUsername: String;
function GetComputername: String;
function GetWindowsUpTime: String;
function DownloadFileFromNet(sURL, sDestination: String): Boolean;
function SetDebugPrivilege: Boolean;
function GetDefaultBrowser: String;
function GetEnvironmentValue(Value: String): String;
function ExtractResource(lpFilename: String; lpName, lpType: PChar): Boolean;
function GetResourceData(lpName, lpType: PChar; var dwResSize: DWORD): Pointer;
function GetFileData(lpFilename: String; var dwFileSize: DWORD): Pointer;
function SaveToFile(lpFilename: String; lpBuffer: Pointer; Size: DWORD = INVALID_HANDLE_VALUE): Boolean;
function GetEOFData(lpFilename: String; var lpBuffer: Pointer; var dwLength: Cardinal): Boolean;
function OpenFile(hParent: THandle; Filter, Title: String; var lpFilename: String): Boolean;
function SaveFile(hParent: THandle; Filter, Title: String; var lpFilename: String): Boolean;
procedure ProcessMessages;
procedure XorEncrypt(lpBuffer: Pointer; Count, Key: DWORD);
function XorEncryptStr(sBuffer: String; Key: DWORD): String;
function GetPointerSize(lpBuffer: Pointer): Cardinal;
function MyGetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC;
function MyLoadLibrary(lpLibFileName: PAnsiChar): HMODULE;
function ShowMessage(Text: String; Caption: String = 'Utils'; uType: Cardinal = MB_ICONINFORMATION): Integer;
function ShowMessageIcon(Text: String; Caption: String = 'Utils'; lpdwStyle: Cardinal = MB_OK or MB_USERICON): Integer;
function wsprintf(var Output; Format: PChar): Integer; cdecl; varargs; external user32 name 'wsprintfA';
function GetOpenFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll' name 'GetOpenFileNameA';
function GetSaveFileName(var OpenFile: TOpenFilename): Bool; stdcall; external 'comdlg32.dll' name 'GetSaveFileNameA';
const
lpEnter = #13#10;
implementation
const
OFN_HIDEREADONLY = $00000004;
OFN_PATHMUSTEXIST = $00000800;
OFN_FILEMUSTEXIST = $00001000;
function ShowMessage(Text: String; Caption: String = 'Utils'; uType: Cardinal = MB_ICONINFORMATION): Integer;
begin
Result := MessageBox(0, PChar(Text), PChar(Caption), uType);
end;
function ShowMessageIcon(Text: String; Caption: String = 'Utils'; lpdwStyle: Cardinal = MB_OK or MB_USERICON): Integer;
var
MsgBoxParams: TMsgBoxParams;
begin
ZeroMemory(@MsgBoxParams, sizeof(TMsgBoxParams));
with MsgBoxParams do
begin
cbSize := sizeof(TMsgBoxParams);
hwndOwner := 0;
hInstance := SysInit.hInstance;
lpszText := PChar(Text);
lpszCaption := PChar(Caption);
dwStyle := lpdwStyle;
PWChar(lpszIcon) := 'MAINICON';
dwContextHelpId := 0;
lpfnMsgBoxCallback := nil;
dwLanguageId := LANG_ENGLISH;
end;
Result := Integer(MessageBoxIndirect(MsgBoxParams));
end;
function IntToStr(i: Integer): String;
begin
Str(i, Result);
end;
function StrToInt(S: String): Integer;
begin
Val(S, Result, Result);
end;
function FloatToStr(E: Extended): String;
begin
Str(E:2:2, Result);
Result := ReplaceChar(Result, '.', ',');
end;
function StrToFloat(S: String): Extended;
var
I: Integer;
begin
Val(S, Result, I);
end;
function IntToHex(dwNumber: DWORD): String; overload;
const
HexNumbers:Array [0..15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F');
begin
Result := '';
while dwNumber <> 0 do
begin
Result := HexNumbers[Abs(dwNumber mod 16)] + Result;
dwNumber := dwNumber div 16;
end;
if Result = '' then
begin
Result := '00000000';
Exit;
end;
if Result[Length(Result)] = '-' then
begin
Delete(Result, Length(Result), 1);
Insert('-', Result, 1);
end;
while Length(Result) < sizeof(dwNumber) do
Result := '0' + Result;
end;
function IntToHex(dwNumber: DWORD; Len: Integer): String; overload;
const
HexNumbers:Array [0..15] of Char = ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F');
begin
Result := '';
while dwNumber <> 0 do
begin
Result := HexNumbers[Abs(dwNumber mod 16)] + Result;
dwNumber := dwNumber div 16;
end;
if Result = '' then
begin
while Length(Result) < Len do
Result := '0' + Result;
Exit;
end;
if Result[Length(Result)] = '-' then
begin
Delete(Result, Length(Result), 1);
Insert('-', Result, 1);
end;
while Length(Result) < Len do
Result := '0' + Result;
end;
function HexToInt(S: String): Integer;
begin
Result := StrToInt('$' + S);
end;
function LowerString(S: String): String;
var
i: Integer;
begin
for i := 1 to Length(S) do
S[i] := char(CharLower(PChar(S[i])));
Result := S;
end;
function UpperString(S: String): String;
var
i: Integer;
begin
for i := 1 to Length(S) do
S[i] := char(CharUpper(PChar(S[i])));
Result := S;
end;
function Trim(S: String): String;
var
i: Integer;
begin
for i := 0 to Length(S) do
if (S[i] in [#0..#32]) then
Delete(S, i, 1);
Result := S;
end;
function FirstDelimiter(S: String; Delimiter: Char): Integer;
var
i: Integer;
begin
Result := -1;
i := 1;
if S = '' then
Exit;
while S[i] <> Delimiter do
begin
if i > Length(S) then
break;
inc(i);
end;
Result := i;
end;
function LastDelimiter(S: String; Delimiter: Char): Integer;
var
i: Integer;
begin
Result := -1;
i := Length(S);
if (S = '') or (i = 0) then
Exit;
while S[i] <> Delimiter do
begin
if i < 0 then
break;
dec(i);
end;
Result := i;
end;
function ExtractFilePath(sFilename: String): String;
begin
if LastDelimiter(sFilename, '\') = -1 then
Exit;
Result := Copy(sFilename, 1, LastDelimiter(sFilename, '\'));
end;
function ExtractFileName(sFilename: String): String;
begin
if LastDelimiter(sFilename, '\') = -1 then
Exit;
Result := Copy(sFilename, LastDelimiter(sFilename, '\') +1, Length(sFilename));
end;
function ExtractFileExt(sFilename: String): String;
begin
if LastDelimiter(sFilename, '.') = -1 then
Exit;
Result := Copy(sFilename, LastDelimiter(sFilename, '.'), Length(sFilename));
end;
function ExtractDriveName(sFilename: String): String;
begin
if FirstDelimiter(sFilename, '\') = -1 then
Exit;
Result := Copy(sFilename, 1, FirstDelimiter(sFilename, '\'));
end;
function ExtractURLSite(S: String): String;
begin
Result := Copy(S, 1, Pos('/', S) - 1);
end;
function ExtractURLPath(S: String): String;
begin
Result := Copy(S, Pos('/', S), Length(S) - Pos('/', S) + 1);
end;
function ExtractMyFilename: String;
var
lpBuffer: Array[0..MAX_PATH] of Char;
begin
GetModuleFileName(GetModuleHandle(nil), lpBuffer, sizeof(lpBuffer));
Result := String(lpBuffer);
end;
function ExtractMyFilePath: String;
begin
Result := ExtractFilePath(ExtractMyFilename);
end;
function ReplaceChar(S: String; Old, New: Char): String;
var
i, j: Integer;
begin
for j := 0 to Length(S) do
begin
i := Pos(Old, S);
if i > 0 then
S[i] := New;
end;
Result := S;
end;
{
Ripped from SysUtils
}
function ReplaceString(S, OldPattern, NewPattern: String): String;
var
SearchStr, Patt, NewStr: string;
Offset: Integer;
begin
SearchStr := S;
Patt := OldPattern;
NewStr := S;
Result := '';
while SearchStr <> '' do
begin
Offset := Pos(Patt, SearchStr);
if Offset = 0 then
begin
Result := Result + NewStr;
Break;
end;
Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
end;
end;
function GetLastErrorMsg: String;
function MAKELANGID(usPrimaryLanguage, usSubLanguage: Byte): Word;
begin
Result := ((usSubLanguage shl 10) + usPrimaryLanguage);
end;
var
lpMsgBuffer: PChar;
begin
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM, nil,
GetLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), @lpMsgBuffer, 0, nil);
Result := Copy(lpMsgBuffer, 1, Length(lpMsgBuffer) -2);
end;
{
by Luckie
}
function Format(sFormat: String; Args: Array of const): String;
var
i: Integer;
pArgs1, pArgs2: PDWORD;
lpBuffer: PChar;
begin
pArgs1 := nil;
if Length(Args) > 0 then
GetMem(pArgs1, Length(Args) * sizeof(Pointer));
pArgs2 := pArgs1;
for i := 0 to High(Args) do
begin
pArgs2^ := DWORD(PDWORD(@Args[i])^);
inc(pArgs2);
end;
GetMem(lpBuffer, 1024);
try
SetString(Result, lpBuffer, wvsprintf(lpBuffer, PChar(sFormat), PChar(pArgs1)));
except
Result := '';
end;
if pArgs1 <> nil then
FreeMem(pArgs1);
if lpBuffer <> nil then
FreeMem(lpBuffer);
end;
{
by Aphex
}
function Split(Input: String; Deliminator: String; Index: integer): String;
var
StringLoop, StringCount: Integer;
Buffer: String;
begin
Buffer := '';
if Index < 1 then Exit;
StringCount := 0;
StringLoop := 1;
while (StringLoop <= Length(Input)) do
begin
if (Copy(Input, StringLoop, Length(Deliminator)) = Deliminator) then
begin
Inc(StringLoop, Length(Deliminator) - 1);
Inc(StringCount);
if StringCount = Index then
begin
Result := Buffer;
Exit;
end else
Buffer := '';
end else
Buffer := Buffer + Copy(Input, StringLoop, 1);
Inc(StringLoop, 1);
end;
Inc(StringCount);
if StringCount < Index then Buffer := '';
Result := Buffer;
end;
function DownloadFileFromNet(sURL, sDestination: String): Boolean;
var
hSocket, hFile: THandle;
WSData: TWSAData;
SockAddr: TSockAddr;
HostEnt: PHostEnt;
IPAddress, sGet, Location, Site, URL: String;
i, intReceived, intPosition: Integer;
lpNumberOfBytesWritten: DWORD;
lpBuffer: Array[0..1024] of Char;
const
szGet = 'GET %s HTTP/1.1' + lpEnter +
'Host: %s' + lpEnter +
'Connection: close' + lpEnter + lpEnter;
begin
Result := False;
Location := Split(sURL, '://', 2);
Site := ExtractURLSite(Location);
URL := ExtractURLPath(Location);
if FileExists(sDestination) then
DeleteFile(PChar(sDestination));
hFile := CreateFile(PChar(sDestination), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_NEW, 0, 0);
WSAStartup($0101, WSData);
hSocket := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
HostEnt := GetHostByName(PChar(Site));
if HostEnt <> nil then
begin
for i := 0 to HostEnt^.h_length -1 do
IPAddress := IPAddress + IntToStr(Ord(HostEnt.h_addr_list^[i])) + '.';
SetLength(IPAddress, Length(IPAddress) -1);
end;
SockAddr.sin_family := AF_INET;
SockAddr.sin_port := htons(80);
SockAddr.sin_addr.S_addr := inet_addr(PChar(IpAddress));
if connect(hSocket, SockAddr, sizeof(SockAddr)) = SOCKET_ERROR then
Exit;
sGet := Format(szGet, [URL, Site]);
ZeroMemory(@lpBuffer, sizeof(lpBuffer));
if send(hSocket, sGet[1], Length(sGet), 0) = SOCKET_ERROR then
Exit;
repeat
ZeroMemory(@lpBuffer, sizeof(lpBuffer));
intReceived := recv(hSocket, lpBuffer, sizeof(lpBuffer), 0);
if (Copy(lpBuffer, 0, 15) = 'HTTP/1.1 200 OK') or
(Copy(lpBuffer, 0, 15) = 'HTTP/1.0 200 OK') then
begin
intPosition := Pos(lpEnter + lpEnter, lpBuffer) +3;
WriteFile(hFile, lpBuffer[intPosition], intReceived - intPosition, lpNumberOfBytesWritten, nil);
continue;
end else
WriteFile(hFile, lpBuffer, intReceived, lpNumberOfBytesWritten, nil);
until (intReceived = SOCKET_ERROR) or (intReceived = 0);
CloseSocket(hSocket);
CloseHandle(hFile);
Result := True;
end;
function GetFileDateTime(lpFilename: String): String;
var
i, j: Integer;
hFile: THandle;
lpFindFileData: TWin32FindData;
lpSystemTime: TSystemTime;
lpDate: PChar;
lpTime: PChar;
const
sResult = '%s / %s';
begin
Result := '';
hFile := FindFirstFile(PChar(lpFilename), lpFindFileData);
if hFile <> INVALID_HANDLE_VALUE then
begin
lpDate := nil;
lpTime := nil;
FileTimeToSystemTime(lpFindFileData.ftLastAccessTime, lpSystemTime);
i := GetDateFormat(LOCALE_USER_DEFAULT, 0, @lpSystemTime, 'dd MMMM, yyyy', nil, 0);
if i > 0 then
begin
GetMem(lpDate, i);
GetDateFormat(LOCALE_USER_DEFAULT, 0, @lpSystemTime, 'dd MMMM, yyyy', lpDate, i);
end;
j := GetTimeFormat(LOCALE_USER_DEFAULT, 0, @lpSystemTime, 'HH:mm', nil, 0);
if j > 0 then
begin
GetMem(lpTime, j);
GetTimeFormat(LOCALE_USER_DEFAULT, 0, @lpSystemTime, 'HH:mm', lpTime, j);
end;
Result := Format(sResult, [lpDate, lpTime]);
FreeMem(lpDate, i);
FreeMem(lpTime, j);
end;
FindClose(hFile);
end;
function FormatBytes(Number: Integer): String; overload;
var
i: Integer;
Negative: Boolean;
begin
Negative := Number < 0;
Number := Abs(Number);
Result := IntToStr(Number);
i := Length(Result) -2;
while i > 1 do
begin
Insert('.', Result, i);
Dec(i, 3);
end;
if Negative then
Result := '-' + Result;
end;
function FormatBytes(sNumber: String): String; overload;
var
i, iComma: Integer;
begin
iComma := Pos(',', sNumber) -1;
iComma := Length(sNumber) - iComma;
i := Length(sNumber) -2 - iComma;
while i > 1 do
begin
Insert('.', sNumber, i);
Dec(i, 3);
end;
Result := sNumber;
end;
{
Based on Aphex's code. :)
}
function TranslateSize(Size: TLargeInteger): String;
const
Formats: Array[0..3] of String = (' Bytes', ' KB', ' MB', ' GB');
var
i: Integer;
Tmp: Real;
TmpResult: String;
begin
i := -1;
Tmp := Size;
while (i <= 3) do
begin
Tmp := Tmp / 1024;
Inc(i);
if trunc(Tmp) = 0 then
begin
Tmp := Tmp * 1024;
Break;
end;
end;
TmpResult := FloatToStr(Tmp);
TmpResult := FormatBytes(TmpResult);
if Copy(TmpResult, Length(TmpResult) -2, 3) = ',00' then
TmpResult := Copy(TmpResult, 1, Length(TmpResult) -3);
Result := TmpResult + Formats[i];
end;
function GetFileSize(FileName: String): DWORD;
var
hFile: THandle;
begin
Result := INVALID_HANDLE_VALUE; // DWORD(-1)
hFile := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if hFile <> INVALID_HANDLE_VALUE then
Result := Windows.GetFileSize(hFile, nil);
CloseHandle(hFile);
end;
function GetFileSizeFormated(FileName: String): String;
var
hFile: THandle;
dwSize: DWORD;
begin
Result := '';
dwSize := 0;
hFile := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if hFile <> INVALID_HANDLE_VALUE then
dwSize := Windows.GetFileSize(hFile, nil);
CloseHandle(hFile);
Result := TranslateSize(dwSize);
end;
function FileExists(FileName: String): Boolean;
var
hFile: THandle;
lpFindFileData: TWin32FindData;
begin
Result := False;
hFile := FindFirstFile(PChar(FileName), lpFindFileData);
if hFile <> INVALID_HANDLE_VALUE then
begin
FindClose(hFile);
Result := True;
end;
end;
function DirectoryExists(DirectoryName: String): Boolean;
var
Code: Integer;
begin
Code := GetFileAttributes(PChar(DirectoryName));
Result := (Code <> -1) and (FILE_ATTRIBUTE_DIRECTORY and Code <> 0);
end;
function DeleteFolder(Path: String): Boolean;
var
hFile: THandle;
lpFindFileData: TWin32FindData;
sFilename: String;
Directory: Boolean;
begin
Result := False;
if Path[Length(Path)] <> '\' then
Path := Path + '\';
hFile := FindFirstFile(PChar(Path + '*.*'), lpFindFileData);
if hFile = INVALID_HANDLE_VALUE then
Exit;
repeat
sFilename := lpFindFileData.cFileName;
if ((sFilename <> '.') and (sFilename <> '..')) then
begin
Directory := (lpFindFileData.dwFileAttributes <> INVALID_HANDLE_VALUE) and
(FILE_ATTRIBUTE_DIRECTORY and lpFindFileData.dwFileAttributes <> 0);
if Directory = False then
begin
sFilename := Path + sFilename;
DeleteFile(PChar(sFilename));
end else
begin
DeleteFolder(Path + sFilename + '\');
end;
end;
until FindNextFile(hFile, lpFindFileData) = False;
FindClose(hFile);
if RemoveDirectory(PChar(Path)) then
Result := True;
end;
function GetWindowsVersion: String;
var
lpVersionInformation: TOSVersionInfo;
begin
lpVersionInformation.dwOSVersionInfoSize := sizeof(TOsVersionInfo);
GetVersionEx(lpVersionInformation);
with lpVersionInformation do
begin
case dwPlatformId of
VER_PLATFORM_WIN32s: Result := 'Microsoft Win32s';
VER_PLATFORM_WIN32_WINDOWS:
begin
if (dwMajorVersion = 4) and (dwMinorVersion = 0) then
Result := 'Microsoft Windows 95'
else if (dwMajorVersion = 4) and (dwMinorVersion = 10) then
Result := 'Microsoft Windows 98'
else if (dwMajorVersion = 4) and (dwMinorVersion = 90) then
Result := 'Microsoft Windows Millennium Edition (ME)';
end;
VER_PLATFORM_WIN32_NT:
begin
if (dwMajorVersion = 5) and (dwMinorVersion = 2) then
Result := 'Microsoft Windows Server 2003'
else if (dwMajorVersion = 5) and (dwMinorVersion = 1) then
Result := 'Microsoft Windows XP'
else if (dwMajorVersion = 5) and (dwMinorVersion = 0) then
Result := 'Microsoft Windows 2000'
else
Result := 'Microsoft Windows NT'
end;
end;
end;
end;
function IsWindows9x: Boolean;
var
lpVersionInformation: TOSVersionInfo;
begin
lpVersionInformation.dwOSVersionInfoSize := sizeof(TOsVersionInfo);
GetVersionEx(lpVersionInformation);
Result := lpVersionInformation.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS;
end;
function IsWindowsNt: Boolean;
var
lpVersionInformation: TOSVersionInfo;
begin
lpVersionInformation.dwOSVersionInfoSize := sizeof(TOsVersionInfo);
GetVersionEx(lpVersionInformation);
Result := lpVersionInformation.dwPlatformId = VER_PLATFORM_WIN32_NT;
end;
function GetWindowsDirectory: String;
var
lpBuffer: Array[0..MAX_PATH] of Char;
begin
GetWindowsDirectoryA(lpBuffer, sizeof(lpBuffer));
Result := String(lpBuffer) + '\';
end;
function GetSystemDirectory: String;
var
lpBuffer: Array[0..MAX_PATH] of Char;
begin
GetSystemDirectoryA(lpBuffer, sizeof(lpBuffer));
Result := String(lpBuffer) + '\';
end;
function GetTempDirectory: String;
var
lpBuffer: Array[0..MAX_PATH] of Char;
begin
Windows.GetTempPath(sizeof(lpBuffer), lpBuffer);
Result := String(lpBuffer);
end;
function GetUsername: String;
var
lpBuffer: Array[0..MAX_COMPUTERNAME_LENGTH +1] of Char;
nSize: Cardinal;
begin
nSize := sizeof(lpBuffer);
GetUserNameA(lpBuffer, nSize);
Result := String(lpBuffer);
end;
function GetComputername: String;
var
lpBuffer: Array[0..MAX_COMPUTERNAME_LENGTH +1] of Char;
nSize: Cardinal;
begin
ZeroMemory(@lpBuffer, sizeof(lpBuffer));
nSize := sizeof(lpBuffer);
GetComputerNameA(lpBuffer, nSize);
Result := String(lpBuffer);
end;
function FormatTime(MilliSec: DWORD): String;
const
sResult1 = '%dd %dh %dm %dsec';
sResult2 = '%dh %dm %dsec';
sResult3 = '%dm %dsec';
sResult4 = '%dsec';
Day: DWORD = 1000 * 60 * 60 * 24;
Hour: Integer = 1000 * 60 * 60;
Minute: Integer = 1000 * 60;
Seconds: Integer = 1000;
var
intTmp, intDay, intHours, intMinutes, intSeconds: Integer;
begin
intDay := MilliSec div Day;
intTmp := MilliSec mod Day;
intHours := intTmp div Hour;
intTmp := intTmp mod Hour;
intMinutes := intTmp div Minute;
intTmp := intTmp mod Minute;
intSeconds := intTmp div Seconds;
if (intDay = 0) and (intHours = 0) and (intMinutes = 0) then
Result := Format(sResult4, [intSeconds])
else if (intDay = 0) and (intHours = 0) then
Result := Format(sResult3, [intMinutes, intSeconds])
else if (intDay = 0) then
Result := Format(sResult2, [intHours, intMinutes, intSeconds])
else
Result := Format(sResult1, [intDay, intHours, intMinutes, intSeconds]);
end;
function GetWindowsUpTime: String;
begin
Result := FormatTime(GetTickCount);
end;
{
BlockKeys:
CompanyName
FileDescription
FileVersion
InternalName
LegalCopyright
OriginalFilename
ProductName
ProductVersion
}
function GetFileVersionInfo(Filename, BlockKey: String): String;
var
vSize, Dummy: DWORD;
vData, Translation, Ip: Pointer;
begin
Result := '';
vSize := GetFileVersionInfoSize(PChar(Filename), Dummy);
if (vSize >0) then
begin
GetMem(vData, vSize);
try
GetFileVersionInfoA(PChar(Filename), 0, vSize, vData);
if vData = nil then Exit;
VerQueryValue(vData, '\\VarFileInfo\\Translation', Translation, vSize);
if Translation = nil then Exit;
VerQueryValue(vData, PChar(Format('\\StringFileInfo\\%.4x%.4x\\%s', [LOWORD(LongInt(Translation^)), HIWORD(LongInt(Translation^)), BlockKey])), Ip, vSize);
if Ip = nil then Exit;
SetString(Result, PChar(Ip), vSize -1);
finally
FreeMem(vData);
end;
end;
end;
function SetDebugPrivilege: Boolean;
var
hToken: THandle;
TP: TTokenPrivileges;
lpLuid: TLargeInteger;
dwReturnLength: DWORD;
begin
Result := False;
if OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
begin
if LookupPrivilegeValue(nil, 'SeDebugPrivilege', lpLuid) then
begin
TP.PrivilegeCount := 1;
TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
TP.Privileges[0].Luid := lpLuid;
Result := AdjustTokenPrivileges(hToken, False, TP, sizeof(TP), nil, dwReturnLength);
end;
CloseHandle(hToken);
end;
end;
function GetEnvironmentValue(Value: String): String;
var
Size: Integer;
begin
Size := GetEnvironmentVariable(PChar(Value), nil, 0);
if Size > 0 then
begin
SetLength(Result, Size -1);
GetEnvironmentVariable(PChar(Value), PChar(Result), Size);
end else
Result := '';
end;
function GetDefaultBrowser: String;
var
phkResult: HKEY;
lpData: Pointer;
lpcbData, lpType: DWORD;
begin
lpType := REG_SZ;
if RegOpenKeyEx(HKEY_CLASSES_ROOT, 'http\shell\open\command\', 0, KEY_READ, phkResult) = ERROR_SUCCESS then
begin
if RegQueryValueEx(phkResult, nil, nil, @lpType, nil, @lpcbData) = ERROR_SUCCESS then
begin
GetMem(lpData, lpcbData);
if RegQueryValueEx(phkResult, nil, nil, @lpType, lpData, @lpcbData) = ERROR_SUCCESS then
begin
Dec(lpcbData);
SetLength(Result, lpcbData);
CopyMemory(@Result[1], lpData, lpcbData);
Result := Result;
end;
FreeMem(lpData, lpcbData);
end;
end;
if Result = '' then
Exit;
Result := LowerString(Result);
if Result[1] = '"' then
Result := Copy(Result, 2, Pos('.exe', Result) +2)
else
Result := Copy(Result, 1, Pos('.exe', Result) +3);
end;
function ExtractResource(lpFilename: String; lpName, lpType: PChar): Boolean;
var
hResInfo, hResData: HRSRC;
dwResSize, lpNumberOfBytesWritten: DWORD;
hFile: THandle;
lpBuffer: Pointer;
begin
Result := False;
hResInfo := FindResource(hInstance, lpName, lpType);
if hResInfo <> 0 then
begin
dwResSize := SizeOfResource(hInstance, hResInfo);
if dwResSize <> 0 then
begin
hResData := LoadResource(hInstance, hResInfo);
if hResData <> 0 then
begin
lpBuffer := LockResource(hResData);
if lpBuffer <> nil then
begin
hFile := CreateFile(PChar(lpFilename), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if hFile <> INVALID_HANDLE_VALUE then
begin
WriteFile(hFile, lpBuffer^, dwResSize, lpNumberOfBytesWritten, nil);
CloseHandle(hFile);
Result := True;
end;
end;
end;
end;
end;
end;
function GetResourceData(lpName, lpType: PChar; var dwResSize: DWORD): Pointer;
var
hResInfo, hResData: HRSRC;
// OldProtect: Cardinal;
lpBuffer: Pointer;
begin
Result := nil;
hResInfo := FindResource(hInstance, lpName, lpType);
if hResInfo <> 0 then
begin
dwResSize := SizeOfResource(hInstance, hResInfo);
if dwResSize <> 0 then
begin
hResData := LoadResource(hInstance, hResInfo);
if hResData <> 0 then
begin
lpBuffer := LockResource(hResData);
if lpBuffer <> nil then
begin
// VirtualProtect(lpBuffer, dwResSize, PAGE_EXECUTE_READWRITE, OldProtect);
Result := lpBuffer;
UnlockResource(hResData);
end;
end;
end;
end;
end;
function GetFileData(lpFilename: String; var dwFileSize: DWORD): Pointer;
var
hFile: THandle;
lpNumberOfBytesRead: DWORD;
begin
Result := nil;
hFile := CreateFile(PChar(lpFilename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if hFile <> INVALID_HANDLE_VALUE then
begin
dwFileSize := Windows.GetFileSize(hFile, nil);
GetMem(Result, dwFileSize);
ReadFile(hFile, Result^, dwFileSize, lpNumberOfBytesRead, nil);
CloseHandle(hFile);
end;
end;
function SaveToFile(lpFilename: String; lpBuffer: Pointer; Size: DWORD = INVALID_HANDLE_VALUE): Boolean;
var
hFile: THandle;
lpNumberOfBytesWritten: DWORD;
begin
Result := False;
hFile := CreateFile(PChar(lpFilename), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
if hFile <> INVALID_HANDLE_VALUE then
begin
if Size = INVALID_HANDLE_VALUE then
Size := GetPointerSize(lpBuffer);
WriteFile(hFile, lpBuffer^, Size, lpNumberOfBytesWritten, nil);
CloseHandle(hFile);
Result := True;
end;
end;
function GetEOFData(lpFilename: String; var lpBuffer: Pointer; var dwLength: Cardinal): Boolean;
var
hFile, hFileMappingObject: THandle;
lpBaseAddress: Pointer;
NtHeaders: PImageNtHeaders;
SectionHeader: PImageSectionHeader;
dwFileSize, dwTemp, dwBestSize: DWORD;
i: Integer;
begin
Result := False;
dwLength := 0;
if lpBuffer <> nil then
begin
ShowMessage('Buffer must be nil!', 'Utils', MB_ICONERROR);
Exit;
end;
hFile := CreateFile(PChar(lpFilename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if hFile <> INVALID_HANDLE_VALUE then
begin
dwFileSize := Windows.GetFileSize(hFile, nil);
hFileMappingObject := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil);
if ((hFileMappingObject <> INVALID_HANDLE_VALUE) or (hFileMappingObject <> 0)) then
begin
lpBaseAddress := MapViewOfFile(hFileMappingObject, FILE_MAP_READ, 0, 0, 0);
if lpBaseAddress <> nil then
begin
NtHeaders := PImageNtHeaders(DWORD(lpBaseAddress) + DWORD(PImageDosHeader(lpBaseAddress)._lfanew));
if NtHeaders.Signature = IMAGE_NT_SIGNATURE then
begin
dwBestSize := 0;
for i := 0 to NtHeaders^.FileHeader.NumberOfSections -1 do
begin
SectionHeader := PImageSectionHeader(DWORD(NtHeaders) + sizeof(TImageNtHeaders) + DWORD(sizeof(TImageSectionHeader) * i));
dwTemp := SectionHeader^.PointerToRawData + SectionHeader^.SizeOfRawData;
if dwTemp > dwBestSize then
dwBestSize := dwTemp;
end;
if dwBestSize <> 0 then
begin
dwLength := dwFileSize - dwBestSize;
lpBuffer := VirtualAlloc(nil, dwLength, MEM_COMMIT, PAGE_READWRITE);
CopyMemory(lpBuffer, Pointer(DWORD(lpBaseAddress) + dwBestSize), dwLength);
UnmapViewOfFile(lpBaseAddress);
CloseHandle(hFileMappingObject);
CloseHandle(hFile);
Result := True;
end;
end;
end;
end;
end;
end;
{
Example: OpenFile(0, 'Exe-Files|*.exe' + #0 + 'All Files|*.*', 'Select your File', sFilename);
}
function OpenFile(hParent: THandle; Filter, Title: String; var lpFilename: String): Boolean;
var
Ofn: TOpenFileName;
szFilename: Array[0..MAX_PATH] of Char;
begin
Result := False;
ZeroMemory(@Ofn, sizeof(TOpenFileName));
ZeroMemory(@szFilename, sizeof(szFilename));
with Ofn do
begin
lStructSize := SizeOf(TOpenFileName);
hwndOwner := hParent;
hInstance := hInstance;
lpstrFile := szFilename;
nMaxFile := sizeof(szFilename);
lpstrTitle := PChar(Title);
Flags := OFN_HIDEREADONLY or OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;
lpstrFilter := PChar(ReplaceChar(Filter, '|', #0) + #0#0);
end;
if GetOpenFileName(Ofn) then
begin
Result := True;
lpFileName := String(szFileName);
end;
end;
function SaveFile(hParent: THandle; Filter, Title: String; var lpFilename: String): Boolean;
var
Ofn: TOpenFileName;
szFilename: Array[0..MAX_PATH] of Char;
begin
Result := False;
ZeroMemory(@Ofn, sizeof(TOpenFileName));
ZeroMemory(@szFilename, sizeof(szFilename));
with Ofn do
begin
lStructSize := SizeOf(TOpenFileName);
hwndOwner := hParent;
hInstance := hInstance;
lpstrFile := szFilename;
nMaxFile := sizeof(szFilename);
lpstrTitle := PChar(Title);
Flags := OFN_HIDEREADONLY or OFN_PATHMUSTEXIST;
lpstrFilter := PChar(ReplaceChar(Filter, '|', #0) + #0#0);
end;
if GetSaveFileName(Ofn) then
begin
Result := True;
lpFileName := String(szFileName);
end;
end;
procedure ProcessMessages;
var
Msg: TMsg;
begin
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
procedure XorEncrypt(lpBuffer: Pointer; Count, Key: DWORD);
var
i: DWORD;
begin
for i := 0 to Count -1 do
begin
PDWORD(DWORD(lpBuffer) +i)^ := DWORD(Ord(PDWORD(DWORD(lpBuffer) +i)^ xor Key));
end;
end;
function XorEncryptStr(sBuffer: String; Key: DWORD): String;
begin
XorEncrypt(@sBuffer[1], Length(sBuffer), Key);
Result := sBuffer;
end;
function GetPointerSize(lpBuffer: Pointer): Cardinal;
begin
if lpBuffer = nil then
Result := Cardinal(-1)
else
Result := Cardinal(Pointer(Cardinal(lpBuffer) -4)^) and $7FFFFFFC -4;
end;
function MyGetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC;
var
DataDirectory: TImageDataDirectory;
lpExports, lpExport: PImageExportDirectory;
i: Cardinal;
Ordinal: Word;
dwRVA: ^Cardinal;
begin
Result := nil;
DataDirectory := PImageNtHeaders(Cardinal(hModule) + Cardinal(PImageDosHeader(hModule)^._lfanew))^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT];
lpExports := Pointer(hModule + DataDirectory.VirtualAddress);
for i := 0 to lpExports.NumberOfNames -1 do
begin
lpExport := PImageExportDirectory(hModule + DWORD(lpExports.AddressOfNames) + i * sizeof(DWORD));
if lstrcmp(lpProcName, PChar(hModule + lpExport.Name)) = 0 then
begin
Ordinal := PWord(hModule + DWORD(lpExports.AddressOfNameOrdinals) + i * sizeof(Word))^;
Inc(Ordinal, 3);
dwRva := Pointer(hModule + DWORD(lpExports.AddressOfFunctions) + Ordinal * sizeof(DWORD));
Result := Pointer(hModule + dwRVA^);
Break;
end;
end;
end;
function MyLoadLibrary(lpLibFileName: PAnsiChar): HMODULE;
var
xLoadLibrary: function(lpLibFileName: PAnsiChar): HMODULE; stdcall;
begin
xLoadLibrary := MyGetProcAddress(GetModuleHandle(kernel32), 'LoadLibraryA');
Result := xLoadLibrary(lpLibFilename);
end;
end.