С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

Как получить TVM_GETITEM дерева 64-битного процесса

10.05.2023, 16:14. Показов 1770. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как получить TVM_GETITEM дерева 64-битного процесса? Из своего 32-битного процесса на VB6.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.05.2023, 16:14
Ответы с готовыми решениями:

Получить список модулей 64-битного процесса из 32-битной программы
Всех с наступившим Новым Годом! В своей программе мне нужно получить список модулей загруженных в любой другой процесс. Сама программа...

Как прочитать командную строку запуска 64-битного процесса, кодом на VB6
Помогите, пожалуйста, разобраться с очень непростой задачей. Мне необходимо из своего приложения на VB6 считывать командные строки запуска...

Определить разрядность windows из 32-битного процесса
нужно определить разрядность операционной системы из 32-битного процесса нашел такой кусок кода, но он показывает 32 бита в 64битной...

32
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
14.05.2023, 14:53  [ТС]
Студворк — интернет-сервис помощи студентам
testuser2, ну вот ты часто пишешь скрипты на VBA там процесс 64-битный?
0
1384 / 839 / 91
Регистрация: 08.02.2017
Сообщений: 3,526
Записей в блоге: 1
14.05.2023, 14:58
Вот пример декларации
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#If VBA7 Then        ' Office 2010-2016
     Public Declare PtrSafe Sub keybd_event Lib "USER32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
 
     Public Declare PtrSafe Function PostMessage Lib "USER32" Alias "PostMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
     Public Declare PtrSafe Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
     'поиск окна
     Public Declare PtrSafe Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
     'Функция определяет стиль окна
     #If Win64 Then
         Public Declare PtrSafe Function GetWindowLong Lib "USER32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
     #Else
         Public Declare PtrSafe Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
     #End If
     'Функция задаёт стиль окна
     Public Declare PtrSafe Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As Long
     ' изменяет режим отображения окна
     Public Declare PtrSafe Function ShowWindow Lib "user32.dll" (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As LongPtr
     Public Declare PtrSafe Function SetForegroundWindow Lib "USER32" (ByVal hwnd As LongPtr) As LongPtr
 
     Public Declare PtrSafe Function SetLayeredWindowAttributes Lib "USER32" (ByVal hwnd As LongPtr, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As LongPtr
     Public Declare PtrSafe Function FindWindowEx Lib "USER32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
 
     Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
 
     Declare PtrSafe Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" (ByVal hwnd As LongPtr, ByVal pszPath As String, ByVal psa As Any) As LongPtr
     Declare PtrSafe Function SHChangeNotify Lib "shell32.dll" (ByVal wEventID As Long, ByVal uFlags As Long, ByVal dwItem1 As Long, ByVal dwItem2 As Long) As LongPtr
     Declare PtrSafe Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer
 
#Else        ' Office 2003-2007
     Public Declare Sub keybd_event Lib "USER32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
 
     Public Declare Function PostMessage Lib "USER32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
     Public Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
     Public Declare Function FindWindow Lib "USER32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
     Public Declare Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
     Public Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
     Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
     Public Declare Function SetForegroundWindow Lib "USER32" (ByVal hwnd As Long) As Long
 
     Private Declare Function SetLayeredWindowAttributes Lib "USER32" (ByVal hwnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
     Private Declare Function FindWindowEx Lib "USER32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
 
     Declare Function GetTickCount Lib "kernel32" () As Long
 
     Declare Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" (ByVal hwnd As Long, ByVal pszPath As String, ByVal psa As Any) As Long
     Declare Function SHChangeNotify Lib "shell32.dll" (ByVal wEventID As Long, ByVal uFlags As Long, ByVal dwItem1 As Long, ByVal dwItem2 As Long) As Long
     Declare Function GetKeyState Lib "USER32" (ByVal vKey As Long) As Integer
 
#End If
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
14.05.2023, 15:04  [ТС]
testuser2, так ты можешь вызывать 64-битные функции спокойно!? Правда там всё равно надо писать Lib user32!!!

Добавлено через 45 секунд
Как я прочитал, что для обратной совместимости они не стали переименовывать файл в user64.dll и оставили как было user32

Добавлено через 3 минуты
Если бы PtrSafe было бы в VB6 было бы гораздо лучше конечно для вызова 64-битных DLL

Добавлено через 49 секунд
testuser2, получается ты можешь взять мою программу RegJumpHack и переписать на VBA и там будет поддержка 64-битного SendMessage?
0
1384 / 839 / 91
Регистрация: 08.02.2017
Сообщений: 3,526
Записей в блоге: 1
14.05.2023, 15:04
VBA это тот же VB, который компилится только в режиме p-code. На VBA удобно проверять что-нибудь мелкое, написал процедруку, поставил курсор на ней и можно выполнить именно ее, нет привязки к форме или процедуре main как в VB.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
14.05.2023, 15:06  [ТС]
testuser2, напиши тогда пожалуйста 64-битный SendMessage
0
1384 / 839 / 91
Регистрация: 08.02.2017
Сообщений: 3,526
Записей в блоге: 1
14.05.2023, 15:12
Цитата Сообщение от HackerVlad Посмотреть сообщение
testuser2, напиши тогда пожалуйста 64-битный SendMessage
вот она
Цитата Сообщение от testuser2 Посмотреть сообщение
#If VBA7 Then ' Office 2010-2016
Public Declare PtrSafe Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
'поиск окна
Добавлено через 5 минут
Есть Апи-вьювер под x64
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
14.05.2023, 15:16  [ТС]
Как интересно, получается если взять и переписать мою программу на VBA или на VB.Net то никаких проблем с 64-битными вызовами не будет, я только что это понял...
0
1384 / 839 / 91
Регистрация: 08.02.2017
Сообщений: 3,526
Записей в блоге: 1
14.05.2023, 15:36
Цитата Сообщение от HackerVlad Посмотреть сообщение
то никаких проблем с 64-битными вызовами не будет
Насчет VBA не знаю, в Net-е там вроде посложнее с win-api, не все позволено, упор на безопасность.. Есть еще конечно Pure Basic и Free Basic. AutoIt, тоже басик, кстати.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
14.05.2023, 16:41
Цитата Сообщение от HackerVlad Посмотреть сообщение
Тут самое непонятное для меня, почему, например, сообщение SB_GETTEXT спокойно работает и для 64-битных процессов тоже, а какое-то TVM_GETITEM не хочет работать... Если бы было такое сообщение для узнавания текста ветки дерева без TVM_GETITEM было бы очень хорошо, как например SB_GETTEXT, но такого я не нашёл почему-то в винде...
Думаю, разница в том, что SB_GETTEXT возвращает результат сразу в указатель на строку, при чём указатель на заранее выделенное пространство ты задаёшь сам, т.е. имеешь возможность указать 32-битный адрес.
А TVM_GETITEM возвращает результат в структуру LVITEM, в которой указатели создаёт уже сам 64-битный процесс, а он оперерирует 64-битными указателями, которые там сформируются корректно только если отправить правильное сообщение, т.е. 64-битным SendMessage.
Цитата Сообщение от HackerVlad Посмотреть сообщение
testuser2, ну вот ты часто пишешь скрипты на VBA там процесс 64-битный?
Приложение, какой битности поставишь, такое и будет. Можно поставить сразу и x32, и x64 Office.
Цитата Сообщение от testuser2 Посмотреть сообщение
в Net-е там вроде посложнее с win-api, не все позволено, упор на безопасность.
Нету там каких-то особенных ограничений в .NET, связанных с WinAPI.
Драйвер вы не напишите, но вот подмену колбека функции драйвера писал и всё прекрасно работает.
Можно даже оперировать голыми сишными указателями на неуправляемую память *var = ..., если в настройках проекта поставить галочку на Unsafe code, и пометить функцию, как unsafe.
2
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
14.05.2023, 20:48
Цитата Сообщение от HackerVlad Посмотреть сообщение
я вообще не понимаю, с чего вы взяли что нужен именно 64-битный SendMessage для этой задачи, если хватит и 32-битного SendMessage
Если не понимаешь, зачем тогда утверждаешь? Уже даже ссылку с MSDN дал.

Добавлено через 3 минуты
Цитата Сообщение от Dragokas Посмотреть сообщение
TVM_GETITEM возвращает результат в структуру LVITEM, в которой указатели создаёт уже сам 64-битный процесс, а он оперерирует 64-битными указателями, которые там сформируются корректно только если отправить правильное сообщение, т.е. 64-битным SendMessage.
Дело не в этом, а в TVITEM.hItem. Это значение 64 битное и передавать его нужно из 32 битного процесса. Получить его можно через SendMessage, но в 32 битном процессе она возвращает 32 битный результат.
2
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
15.05.2023, 00:16  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
TVITEM.hItem
То есть я должен сначала ещё определить TVITEM.hItem 64-битный? Ведь я получаю только 32-битный...
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
15.05.2023, 16:15
Лучший ответ Сообщение было отмечено HackerVlad как решение

Решение

Вот 64-битный SendMessageW.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
' //
' // Call 64-bit SendMessage from 32-bit process
' //
 
Option Explicit
 
Private Const MAX_PATH                As Long = 260
Private Const PROCESS_VM_READ         As Long = &H10
Private Const PROCESS_VM_OPERATION    As Long = &H8
Private Const PROCESS_VM_WRITE = &H20
Private Const TV_FIRST                As Long = &H1100
Private Const TVM_GETNEXTITEM         As Long = (TV_FIRST + 10)
Private Const TVM_GETITEM = (TV_FIRST + 62)
Private Const TVGN_ROOT               As Long = 0
Private Const TVGN_NEXT = 1
Private Const TVGN_CHILD = 4
Private Const TVIF_TEXT = 1
Private Const MEM_RESERVE             As Long = &H2000&
Private Const MEM_COMMIT              As Long = &H1000&
Private Const MEM_RELEASE             As Long = &H8000&
Private Const PAGE_READWRITE          As Long = 4&
 
Private Type STARTUPINFO
    cb              As Long
    lpReserved      As Long
    lpDesktop       As Long
    lpTitle         As Long
    dwX             As Long
    dwY             As Long
    dwXSize         As Long
    dwYSize         As Long
    dwXCountChars   As Long
    dwYCountChars   As Long
    dwFillAttribute As Long
    dwFlags         As Long
    wShowWindow     As Integer
    cbReserved2     As Integer
    lpReserved2     As Long
    hStdInput       As OLE_HANDLE
    hStdOutput      As OLE_HANDLE
    hStdError       As OLE_HANDLE
End Type
 
Private Type PROCESS_INFORMATION
    hProcess        As Long
    hThread         As OLE_HANDLE
    dwProcessId     As Long
    dwThreadId      As OLE_HANDLE
End Type
 
Private Type TVITEM64
    mask            As Long
    lPad            As Long
    hItem           As Currency
    State           As Long
    stateMask       As Long
    pszText         As Currency
    cchTextMax      As Long
    iImage          As Long
    iSelectedImage  As Long
    cChildren       As Long
    lParam          As Currency
End Type
 
Private Declare Function CreateProcess Lib "kernel32" _
                         Alias "CreateProcessW" ( _
                         ByVal lpApplicationName As Long, _
                         ByVal lpCommandLine As Long, _
                         ByRef lpProcessAttributes As Any, _
                         ByRef lpThreadAttributes As Any, _
                         ByVal bInheritHandles As Long, _
                         ByVal dwCreationFlags As Long, _
                         ByRef lpEnvironment As Any, _
                         ByVal lpCurrentDirectory As Long, _
                         ByRef lpStartupInfo As STARTUPINFO, _
                         ByRef lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function Wow64DisableWow64FsRedirection Lib "kernel32" ( _
                         ByRef lvalue As Long) As Long
Private Declare Function Wow64RevertWow64FsRedirection Lib "kernel32" ( _
                         ByVal lvalue As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
                         ByVal hObject As OLE_HANDLE) As Long
Private Declare Function WaitForInputIdle Lib "user32" ( _
                         ByVal hProcess As OLE_HANDLE, _
                         ByVal dwMilliseconds As Long) As Long
Private Declare Function GetWindowsDirectory Lib "kernel32" _
                         Alias "GetWindowsDirectoryW" ( _
                         ByVal lpBuffer As Long, _
                         ByVal nSize As Long) As Long
Private Declare Function FindWindowEx Lib "user32" _
                         Alias "FindWindowExW" ( _
                         ByVal hWndParent As Long, _
                         ByVal hWndChildAfter As Long, _
                         ByVal lpClassName As Long, _
                         ByVal lpWindowName As Long) As Long
Private Declare Function GetProcessId Lib "kernel32" ( _
                         ByVal hProcess As OLE_HANDLE) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
                         ByVal hwnd As OLE_HANDLE, _
                         ByRef lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" ( _
                         ByVal dwDesiredAccess As Long, _
                         ByVal bInheritHandle As Long, _
                         ByVal dwProcessId As Long) As OLE_HANDLE
Private Declare Function VirtualAllocEx Lib "kernel32.dll" ( _
                         ByVal hProcess As OLE_HANDLE, _
                         ByVal lpAddress As Long, _
                         ByVal dwSize As Long, _
                         ByVal flAllocationType As Long, _
                         ByVal flProtect As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" ( _
                         ByVal hProcess As OLE_HANDLE, _
                         ByVal lpBaseAddress As Long, _
                         ByRef lpBuffer As Any, _
                         ByVal nSize As Long, _
                         ByRef lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" ( _
                         ByVal hProcess As OLE_HANDLE, _
                         ByVal lpBaseAddress As Long, _
                         ByRef lpBuffer As Any, _
                         ByVal nSize As Long, _
                         ByRef lpNumberOfBytesWritten As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32.dll" ( _
                         ByVal hProcess As OLE_HANDLE, _
                         ByVal lpAddress As Long, _
                         ByVal dwSize As Long, _
                         ByVal dwFreeType As Long) As Long
Private Declare Function SendMessage Lib "user32" _
                         Alias "SendMessageW" ( _
                         ByVal hwnd As OLE_HANDLE, _
                         ByVal wMsg As Long, _
                         ByVal wParam As Long, _
                         ByRef lParam As Any) As Long
Private Declare Function Sleep Lib "kernel32" ( _
                         ByVal dwMilliseconds As Long) As Long
                         
Public Sub Main()
    Dim hProcess    As OLE_HANDLE
    Dim hTVWnd      As OLE_HANDLE
    Dim lPID        As Long
    Dim h64Current  As Currency
    Dim pMemory     As Long
    Dim lPass       As Long
    
    On Error GoTo CleanUp
    
    If Not modX64Call.Initialize Then
        MsgBox "Unable to initialize modX64Call", vbCritical
        Exit Sub
    End If
    
    hTVWnd = GetTVWindow(0)
    
    If hTVWnd = 0 Then
        
        hProcess = Run64BitRegEdit()
        
        If hProcess = 0 Then
            MsgBox "Unable to run regedit", vbCritical
            GoTo CleanUp
        End If
        
        For lPass = 0 To 2
        
            hTVWnd = GetTVWindow(0)
            
            If hTVWnd Then
                Exit For
            End If
            
            Sleep 200
            
        Next
        
        If lPass = 2 Then
            MsgBox "Unable to find treeview", vbCritical
            GoTo CleanUp
        End If
        
    Else
    
        If GetWindowThreadProcessId(hTVWnd, lPID) = 0 Then
            MsgBox "GetWindowThreadProcessId failed", vbCritical
            GoTo CleanUp
        End If
        
        hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, lPID)
        
        If hProcess = 0 Then
            MsgBox "OpenProcess failed", vbCritical
            GoTo CleanUp
        End If
        
    End If
    
    pMemory = VirtualAllocEx(hProcess, 0, 4096, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE)
    
    If pMemory = 0 Then
        MsgBox "VirtualAllocEx failed", vbCritical
        GoTo CleanUp
    End If
    
    h64Current = SendMessageW64(hTVWnd, TVM_GETNEXTITEM, 0, TVGN_ROOT / 10000)
    
    If h64Current = 0 Then
        MsgBox "SendMessageW64 failed", vbCritical
        GoTo CleanUp
    End If
    
    DumpTV64 0, hProcess, hTVWnd, h64Current, pMemory
    
CleanUp:
 
    If hProcess Then
        CloseHandle hProcess
    End If
    
    modX64Call.Uninitialize
 
End Sub
 
Private Sub DumpTV64( _
            ByVal lIdent As Long, _
            ByVal hProcess As OLE_HANDLE, _
            ByVal hwnd As OLE_HANDLE, _
            ByVal h64Item As Currency, _
            ByVal pMemory As Long)
    Dim tItem       As TVITEM64
    Dim h64Child    As Currency
    Dim sBuf        As String
    Dim lSize       As Long
    
    sBuf = Space$(260)
    
    tItem.pszText = (pMemory + 1024) / 10000
    tItem.mask = TVIF_TEXT
    tItem.cchTextMax = Len(sBuf)
    
    Do While h64Item <> 0@
        
        ' // Get text
        tItem.hItem = h64Item
 
        If WriteProcessMemory(hProcess, pMemory, tItem, LenB(tItem), 0) = 0 Then
            MsgBox "WriteProcessMemory failed", vbCritical
            Exit Sub
        End If
        
        If SendMessage(hwnd, TVM_GETITEM, 0, ByVal pMemory) = 0 Then
            MsgBox "SendMessageW64 failed", vbCritical
            Exit Sub
        End If
        
        If ReadProcessMemory(hProcess, pMemory + 1024, ByVal StrPtr(sBuf), LenB(sBuf), 0) = 0 Then
            MsgBox "ReadProcessMemory failed", vbCritical
            Exit Sub
        End If
    
        lSize = InStr(1, sBuf, vbNullChar)
        
        If lSize Then
            Debug.Print Space$(lIdent * 4) & Left$(sBuf, lSize - 1)
        End If
        
        h64Child = SendMessageW64(hwnd, TVM_GETNEXTITEM, TVGN_CHILD / 10000, h64Item)
        
        If h64Child <> 0 Then
            DumpTV64 lIdent + 1, hProcess, hwnd, h64Child, pMemory
        End If
        
        h64Item = SendMessageW64(hwnd, TVM_GETNEXTITEM, TVGN_NEXT / 10000, h64Item)
        
    Loop
    
End Sub
 
Private Function GetTVWindow( _
                 ByVal hProcess As OLE_HANDLE) As OLE_HANDLE
    Dim hwnd    As OLE_HANDLE
    Dim lPID    As Long
    Dim lPIDWnd As Long
    
    If hProcess Then
        lPID = GetProcessId(hProcess)
    End If
    
    Do
    
        hwnd = FindWindowEx(0, hwnd, StrPtr("RegEdit_RegEdit"), 0)
            
        If hwnd = 0 Then
            Exit Function
        End If
        
        If lPID Then
            If GetWindowThreadProcessId(hwnd, lPIDWnd) Then
                If lPIDWnd = lPID Then
                
                    GetTVWindow = FindWindowEx(hwnd, 0, StrPtr("SysTreeView32"), 0)
                    Exit Function
                
                End If
            End If
        Else
            GetTVWindow = FindWindowEx(hwnd, 0, StrPtr("SysTreeView32"), 0)
            Exit Function
        End If
        
    Loop While True
 
End Function
 
Private Function Run64BitRegEdit() As OLE_HANDLE
    Dim lFSRedirect As Long
    Dim tSI         As STARTUPINFO
    Dim tPI         As PROCESS_INFORMATION
    Dim hProcess    As OLE_HANDLE
    Dim lResult     As Long
    Dim sPath       As String
    Dim lSize       As Long
    
    sPath = Space$(MAX_PATH)
    lSize = GetWindowsDirectory(StrPtr(sPath), Len(sPath) + 1)
    sPath = Left$(sPath, lSize)
    
    If Wow64DisableWow64FsRedirection(lFSRedirect) = 0 Then
        Exit Function
    End If
    
    tSI.cb = Len(tSI)
    
    lResult = CreateProcess(StrPtr(sPath & "\regedit.exe"), 0, ByVal 0&, ByVal 0&, 0, 0, ByVal 0&, 0, tSI, tPI)
    
    Wow64RevertWow64FsRedirection lFSRedirect
    
    If lResult = 0 Then
        Exit Function
    End If
    
    CloseHandle tPI.hThread
    
    WaitForInputIdle tPI.hProcess, -1
    
    Run64BitRegEdit = tPI.hProcess
    
End Function
Вложения
Тип файла: zip SendMessage64.zip (10.3 Кб, 8 просмотров)
3
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
15.05.2023, 17:40  [ТС]
Это просто великолепно! Считывает даже имена реестра с китайскими иероглифами! Я в полном восторге!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2023, 17:40
Помогаю со студенческими работами здесь

Не срабаывает DuplicateHandle. Поиск 32х битного процесса. MVS 6.0. Система 64 битная
Добрый день. Необходимо сделать копию дескриптора процесса 32х битного. В 64 битной Windows. Дорабатываю не свою программу. В программе...

Как из 32х битного приложения получить доступ к ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\ на 64x
Привет, Столкнулся с проблемой, читаю из ветки реестра 'HKEY_LOCAL_MACHINE\SOFTWARE\' параметры, но вот беда, если ос 64х, то чтение...

специфика создание 32 - х битного и 64 - х битного приложение
Господа допустим есть программа 32-х битная как из неё сделать 64-х битную . Интересует вообще как это реализуется и на сколько сложна...

Получить id процесса родителя, если исходный id процесса дочерний
Добрый день. У меня есть вот такой код на C#, который должен позволить получить id процесса родителя, если исходный id процесса дочерний: ...

Как получить параметры процесса?
Хотелось бы спросить можно ли в отслеживаемом процессе получить параметры запуска онного. Например C:\\Windows\\system32\\rundll32.exe...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru