Максим Павлов
Работа с описателями: практикум
http://vbstreets.ru/VB/Articles/66404.aspx
дело в том, что для написания многопоточной программы на VB не достаточно вызвать CreateThread(AddressOf ThreadProc), нормально такая программа работать не будет. Можно, конечно, мудрить с TLS, но мы пойдем другим, более легким путем – мы напишем нужный нам код на ассемблере.
Поэтому я рекомендую новичкам, спрашивающим: «А как узнать полный путь к EXE?», пользоваться этим методом.
Естественно, что внедрять чистый VB код мы не будем (думаю причины объяснять не нужно?), поэтому опять обратимся за помощью к ассемблеру.
Function RemoteCall(pid As Long, FunctionName As String, Library As String, ByVal param As Long, Optional ByRef Result As Boolean = 0) As Long
Dim hProcess As Long, threadid As Long, ret As Long, hThread As Long, h As Long
hProcess = OpenProcess(PROCESS_CREATE_THREAD Or &H8 Or PROCESS_VM_READ Or &H200 Or PROCESS_VM_WRITE Or PROCESS_QUERY_INFORMATION, False, pid)
ret = GetProcAddress(GetModuleHandle(Library), FunctionName)
If ret <> 0 Then
Dim lpAddress As Long, hModule As Long
hModule = GetModuleHandle(Library)
If hModule = 0 Then hModule = LoadLibrary(Library)
lpAddress = GetProcAddress(hModule, FunctionName)
If lpAddress = 0 Then
Result = False
Else
hThread = CreateRemoteThread(hProcess, 0, 0, ByVal lpAddress, param, 0&, threadid)
If hThread <> 0 Then
ret = WaitForSingleObject(hThread, 5000)
If ret = 0 Then
ret = GetExitCodeThread(hThread, h)
RemoteCall = h
Else
Result = False
End If
CloseHandle hThread
End If
Else
Result = False
End If
End If
CloseHandle hProcess
End Function
Free = RemoteCall(s.ProcessId, "NtClose", "ntdll", s.handle)
Единственная функция, после вызова которой поток еще можно будет хоть как ни будь прибить – это GetFileType.
Нет. Я пробовал - умирает.А NtQueryFileInformation разве не подходит?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11