const
MaxEquip = $24C0;
// 内存取装备信息 『目标进程』 『返回装备信息』 『成功否』
function GetEquipFromMem(ProcessID: HWND; var equip: string): Boolean;
// 处于9x操作系统
function IsWindows9x(): Boolean;
var
Osi: TOSVersionInfo;
begin
Osi.dwOSVersionInfoSize := SizeOf(Osi);
GetVersionEx(Osi);
Result := Osi.dwPlatformID <> Ver_Platform_Win32_NT;
end;
var
ProcessHndle: HWND;
SysInf _SYSTEM_INFO;
MBI: MEMORY_BASIC_INFORMATION;
PMemoAddr: Pointer;
MemoAddr, MaxMemoAddr: DWORD;
nSize, lpNumberOfBytesRead: DWORD;
i : DWORD;
sTmp: string;
begin
Result := false;
equip := '';
ProcessHndle := OpenProcess(PROCESS_VM_OPERATION or
PROCESS_VM_READ or
PROCESS_QUERY_INFORMATION,
False, ProcessID);
if ProcessHndle <= 0 then exit;
GetSystemInfo(SysInfo);
PMemoAddr := SysInfo.lpMinimumApplicationAddress;
MaxMemoAddr := DWORD(SysInfo.lpMaximumApplicationAddress);
try
while true do
begin
VirtualQueryEx(ProcessHndle, PMemoAddr, MBI, SizeOf(MBI));
nSize := MBI.RegionSize;
if MBI.State = MEM_COMMIT then
begin
setlength(sTmp, nSize);
ReadProcessMemory(ProcessHndle, PMemoAddr,
pchar(sTmp), nSize, lpNumberOfBytesRead);
if IsWindows9x() then
i := Pos('On Win95', sTmp)
else begin
i := Pos(#1#1#2#2'WinSock 2.0', sTmp);
if i > 0 then
Inc(i, $105);
end;
if i > 0 then
begin
equip := copy(sTmp, i, MaxEquip);
result := true;
Break;
end;
end;
MemoAddr := DWORD(PMemoAddr) + nSize;
if MemoAddr >= MaxMemoAddr then
Break;
PMemoAddr := Pointer(MemoAddr);
end;
except
end;
setlength(sTmp, 0);
CloseHandle(ProcessHndle);
end;
// 抽取装备信息
function ExtractInfo(const sMem: string): string;
const
_nOffset = 52;
var
sTemp, sTemp1: string;
cc: char;
nOffset, nSize, nLen: integer;
nCount, k, nn1, nn2: integer;
begin
nLen := Length(sMem);
nOffset := $238;
nCount := 1;
Result := '';
repeat
cc := sMem[nOffset];
nSize := Byte(cc);
if (cc = #0) or (nSize > 16) then begin
inc(nOffset, _nOffset);
continue;
end;
sTemp := Copy(sMem, nOffset + 1, nSize);
if pos('{骺躴骺皗骺', sTemp) > 0 then Break;
if nOffset >= MaxEquip then break;
nn1 := Length(sTemp);
nn2 := Length(widestring(sTemp));
if ((nn1 - nn2) < 2) or (2 * nn2 - nn1 > 2) then begin
inc(nOffset, _nOffset);
continue;
end;
k := Pos(sTemp, Result);
if k > 0 then begin
sTemp1 := Copy(Result, 1, k - 1);
Delete(Result, 1, k);
k := Pos(#13#10, Result);
Delete(Result, 1, k + 1);
inc(nCount);
sTemp := sTemp + Int2Str(nCount) + #13#10;
Result := sTemp1 + sTemp + Result;
end else begin
nCount := 1;
Result := Result + sTemp + #13#10;
end;
inc(nOffset, _nOffset);
until nOffset >= nLen;
end;
// 返回装备信息
function GetEquipment_Mir2: string;
begin
if GetEquipFromMem(GetCurrentProcessId(), Result) then
Result := ExtractInfo(Result)
else
Result := 'Liu_mazi';
end;
// 调整信息格式
function ChangeEolFormat(strEolIn: string):string;
var
iPos: Integer;
begin
Result:='';
repeat
iPos:=Pos(#13#10,strEolIn);
if iPos>0 then
begin
Result:=Result+Copy(strEolIn,1,Pred(iPos))+'/';
Delete(strEolIn,1,Succ(iPos));
end;
until iPos<=0;
if Result[Length(Result)]='/' then
Delete(Result,Length(Result),1);
end;
end.