halt писал(а):
miver, в 78 строке нужно так:код
Что-то при замене 78 строки в inlineCode на вашу, у меня ошибку выдаёт. Может у вас нумерация строк другая или сам код другой.
Вот так выглядит мой:
#pas
0 / unit HiAsmUnit;
1 /
2 / interface
3 /
4 / uses Windows, Messages, Kol, Share, Debug;
5 /
6 / type
7 / THiAsmClass = class(TDebug)
8 / private
9 /
10 / public
11 / H:THI_Event;
12 / onGetLastActivePopup:THI_Event;
13 / procedure doGetLastActivePopup(var _Data:TData; Index:word);
14 / end;
15 /
16 / implementation
17 /
18 / type
19 / LV_ITEM = record
20 / mask: UINT;
21 / iItem: Integer;
22 / iSubItem: Integer;
23 / state: UINT;
24 / stateMask: UINT;
25 / pszText: PWideChar;
26 / cchTextMax: Integer;
27 / iImage: Integer;
28 / lParam: LPARAM;
29 / iIndent: Integer;
30 /
31 / iGroupId: Integer;
32 / cColumns: Integer;{ tile view columns }
33 / puColumns: PUINT;
34 /
35 / //piColFmt: PInteger;
36 / //iGroup: Integer;{ readonly. only valid for owner data. }
37 / end;
38 /
39 / procedure THiAsmUnit.doGetLastActivePopup;
40 / const
41 / cchTextMax=255;
42 / var
43 / Win: THandle;
44 / vItem, nTextLength: Integer;
45 / LVItem: LV_ITEM;
46 / pLVItem: ^LV_ITEM;
47 / pszText: PChar;
48 / svText: ShortString;
49 /
50 / vProcessId: UInt;
51 / vProcess: Integer;
52 / vPointer: ^Integer;
53 / dwWriten: DWORD;
54 / begin
55 / // Поиск рабочего стола
56 / //Win := FindWindow('Progman', 'Program Manager');
57 / //Win := FindWindowEx(Win, 0, 'SHELLDLL_DefView', 0);
58 / //Win := FindWindowEx(Win, 0, 'SysListView32', 'FolderView');
59 / Win := ReadInteger(_Data,H,0);
60 /
61 / // Получаем процесс рабочего стола
62 / GetWindowThreadProcessId(Win, @vProcessId);
63 / vProcess := OpenProcess(PROCESS_ALL_ACCESS, false, vProcessId);
64 /
65 / //vItemCount := SendMessage(Win, LVM_GETITEMCOUNT, 0, 0);
66 /
67 / // Выделяем в нем память под текстовый буффер
68 / pszText := VirtualAllocEx(vProcess, nil, cchTextMax, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
69 / // Выделяем в нем память под структуру LVITEM
70 / pLVItem := VirtualAllocEx(vProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
71 / // Заполняем структуру
72 / ZeroMemory(@LVItem, SizeOf(LV_ITEM));
73 / LVItem.mask := LVIF_TEXT;
74 / LVItem.pszText := @pszText;
75 / LVItem.cchTextMax := cchTextMax;
76 / LVItem.iSubItem := 0;
77 /
78 / LVItem.pszText := Int64(pszText);
79 /
80 / // Пишем ее в память удаленного процесса
81 / if not WriteProcessMemory(vProcess, pLVItem, @LVItem, SizeOf(LV_ITEM), dwWriten) then Exit;
82 / nTextLength := SendMessage(Win, LVM_GETITEMTEXT, vItem, Integer(pLVItem));
83 /
84 / // Читаем результат
85 / ZeroMemory(@svText, cchTextMax);
86 / ReadProcessMemory(vProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten);
87 /
88 / _hi_OnEvent(onGetLastActivePopup, vItem);
89 / //if not WriteProcessMemory(vProcess, pLVItem, @LVItem, SizeOf(LV_ITEM), dwWriten) then Exit;
90 /
91 / VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
92 / CloseHandle(vProcess);
93 / end;
94 /
95 / end.
CriDos писал(а):
Вы кое что забылиУ 32-битных процессов, нет доступа к пространству памяти 64-битных, коим и является explorer.exe.
------------ Дoбавленo в 01.17:
Можно попробовать воспользоваться недокументированными возможностями ntdll, на свой страх и риск :
NtWow64QueryInformationProcess64
NtWow64ReadVirtualMemory64
и других.
А может подскажите как это реализуемо в виде кода или схемы??!