Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Процессы Добавлено: 01.03.06 20:11  

Автор вопроса:  SL | ICQ: 277007669 
Мне нужно узнать hModule процесса по ProcessID или hProcess. Кто знает, помогите!

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #1 Добавлено: 01.03.06 21:03
Модулей у процессов несколько, какой именно hModule тебе нужен? И уточни, что подразумеваешь под hModule.

Ответить

Номер ответа: 2
Автор ответа:
 piv



ICQ: 333346191 

Вопросов: 6
Ответов: 21
 Профиль | | #2 Добавлено: 01.03.06 21:29
EnumProcessModules - если у тебя NT или выше

Ответить

Номер ответа: 3
Автор ответа:
 SL



ICQ: 277007669 

Вопросов: 10
Ответов: 86
 Профиль | | #3 Добавлено: 01.03.06 21:35
Хотел найти путь к файлу по процессу. В GetModuleFileName надо указать hModule. Мне нужен сам exe файл.

Ответить

Номер ответа: 4
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #4 Добавлено: 01.03.06 21:54
1. Вызываешь CreateToolhelp32Snapshot + TH32CS_SNAPPROCESS и получашь hSnapshot запущенных процессов
2. передаешь этот hSnapshot в Process32First вместе со структурой PROCESSENTRY32 для заполнения структуры. Process32First заполнит структуру данными первого процесса
3. Последовательно в цикле вызываешь Process32Next, которая будет заполнять и возвращать структуру для всех процессов. Вот в этом цикле после каждого вызова Process32Next проверяешь поле th32ProcessID у структуры PROCESSENTRY32. Когда это поле совпадёт с твоим ProcessID - значит в структуре хранятся данные твоего процесса. И конкретно имя файла - в поле szExeFile.
4. После цикла вызвать CloseHandle для hSnapshot

Ответить

Номер ответа: 5
Автор ответа:
 Sacred Phoenix



ICQ: 304238252 

Вопросов: 52
Ответов: 927
 Профиль | | #5 Добавлено: 01.03.06 21:58
И конкретно имя файла - в поле szExeFile.

По-моему Windows'ы на NT-платформе возвращают только имя файла (во всяком случае - XP)

Ответить

Номер ответа: 6
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #6 Добавлено: 01.03.06 22:30
Если нужен полный путь к файлу, то вызываешь
CreateToolhelp32Snapshot+TH32CS_SNAPMODULE+ProcessID и получашь hModuleSnapshot и затем
Module32First + hModuleSnap + структура MODULEENTRY32 для заполнения. Достаточно одного вызова Module32First, т.к. ехе-шник будет стоять первым в списке модулей, и в заполненной Module32First структуре поле szExePath будет содержать полный путь к ехе.

Ответить

Номер ответа: 7
Автор ответа:
 SL



ICQ: 277007669 

Вопросов: 10
Ответов: 86
 Профиль | | #7 Добавлено: 02.03.06 10:54
Тогда в чём ошибка:

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Const TH32CS_SNAPMODULE As Long = &H8
Private Declare Function Module32First Lib "kernel32.dll" (ByVal hSnapshot As Long, ByRef lppe As MODULEENTRY32) As Long
Private Type MODULEENTRY32
    dwSize As Long
    th32ModuleID As Long
    th32ProcessID As Long
    GlblcntUsage As Long
    ProccntUsage As Long
    modBaseAddr As Long
    modBaseSize As Long
    hModule As Long
    szModule As String * 9
    szExeFile As String * 260
End Type

Dim c As MODULEENTRY32

Private Sub Form_Load()
Dim a, b As Long
On Error Resume Next
a = InputBox("Введите ProcessID:", "Процесс";)
b = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, a)
Module32First b, c
MsgBox c.szExeFile
End Sub

В переменной c всё пусто!

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 02.03.06 11:27
Задрали вы уже снэпшотами. Тормозные они.
EnumProcessModules - руль. Кстати, экзешник всегда идет первым хендлом в массиве.
На ошибки обработаешь сам

Option Explicit
Option Base 1
Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function GetModuleFileNameEx Lib "PSAPI.DLL" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFilename As String, ByVal nSize As Long) As Long
Private Const PROCESS_QUERY_INFORMATION = 1024
Private Const PROCESS_VM_READ = 16

Private Function GetFileNameFromID(ByVal PID As Long) As String
On Error Resume Next
Dim hProcess As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, PID)
If hProcess = 0 Then
    GetFileNameFromID = "Error " & Err.LastDllError
    Exit Function
End If
Dim hModules() As Long, hModSize As Long, hModNeeded As Long
hModSize = 1024
ReDim hModules(hModSize)
Do
EnumProcessModules hProcess, hModules(1), hModSize * 4, hModNeeded
If hModNeeded <= hModSize * 4 Then Exit Do
Loop
Dim FileName As String
FileName = Space(1024)
GetModuleFileNameEx hProcess, hModules(1), FileName, 1024
GetFileNameFromID = Trim$(FileName)
CloseHandle hProcess
End Function

Private Sub Form_Load()
MsgBox GetFileNameFromID(1024) 'Any ProcessID
End Sub

Ответить

Номер ответа: 9
Автор ответа:
 SL



ICQ: 277007669 

Вопросов: 10
Ответов: 86
 Профиль | | #9 Добавлено: 02.03.06 11:32
Пасиба

Ответить

Номер ответа: 10
Автор ответа:
 SL



ICQ: 277007669 

Вопросов: 10
Ответов: 86
 Профиль | | #10 Добавлено: 02.03.06 11:32
Пасиба:)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам