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

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

10.05.2023, 16:14. Показов 2155. Ответов 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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
14.05.2023, 14:53  [ТС]
Студворк — интернет-сервис помощи студентам
testuser2, ну вот ты часто пишешь скрипты на VBA там процесс 64-битный?
0
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2
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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
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
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2
14.05.2023, 15:04
VBA это тот же VB, который компилится только в режиме p-code. На VBA удобно проверять что-нибудь мелкое, написал процедруку, поставил курсор на ней и можно выполнить именно ее, нет привязки к форме или процедуре main как в VB.
0
Вернулся
 Аватар для HackerVlad
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
14.05.2023, 15:06  [ТС]
testuser2, напиши тогда пожалуйста 64-битный SendMessage
0
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2
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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
14.05.2023, 15:16  [ТС]
Как интересно, получается если взять и переписать мою программу на VBA или на VB.Net то никаких проблем с 64-битными вызовами не будет, я только что это понял...
0
1409 / 868 / 93
Регистрация: 08.02.2017
Сообщений: 3,702
Записей в блоге: 2
14.05.2023, 15:36
Цитата Сообщение от HackerVlad Посмотреть сообщение
то никаких проблем с 64-битными вызовами не будет
Насчет VBA не знаю, в Net-е там вроде посложнее с win-api, не все позволено, упор на безопасность.. Есть еще конечно Pure Basic и Free Basic. AutoIt, тоже басик, кстати.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18035 / 7738 / 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
Модератор
10065 / 3910 / 885
Регистрация: 22.02.2013
Сообщений: 5,860
Записей в блоге: 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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
15.05.2023, 00:16  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
TVITEM.hItem
То есть я должен сначала ещё определить TVITEM.hItem 64-битный? Ведь я получаю только 32-битный...
0
Модератор
10065 / 3910 / 885
Регистрация: 22.02.2013
Сообщений: 5,860
Записей в блоге: 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
1753 / 649 / 45
Регистрация: 10.09.2021
Сообщений: 2,805
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
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru