2016-07-09 2 views
1

Я переводил скрипт powershell в python, в основном, чтобы узнать, как это сделать. Я застрял на этих линиях здесь:Как сделать IntPtr в Python?

$lpTargetHandle = [IntPtr]::Zero 
$CallResult = [Kernel32]::DuplicateHandle(
       $ProcessInfo.hProcess, 0x4, 
       [Kernel32]::GetCurrentProcess(), 
       [ref]$lpTargetHandle, 0, $false, 0x00000002) 

echo $lpTargetHandle 

Это то, что я имею в Python:

lpTargetHandle = HANDLE() 
CallResult = kernel32.DuplicateHandle(ProcessInfo.hProcess, 0x4, 
      kernel32.GetCurrentProcess(),byref(lpTargetHandle), 0, False, 0x00000002) 

print(lpTargetHandle) 

Вот выход я получаю:

>>> lpTargetHandle = HANDLE() 
>>> CallResult = kernel32.DuplicateHandle(ProcessInfo.hProcess, 0x4, kernel32.GetCurrentProcess(),byref(lpTargetHandle), 0, False, 0x00000002) 
>>> 
>>> print(lpTargetHandle) 
c_void_p(None) 
>>> lpTargetHandle.value 
>>> type(lpTargetHandle.value) 
<type 'NoneType'> 

Что должно чтобы произойти, указатель lpTargetHandle должен вернуть обратно номер идентификатора потока, но я просто получаю Nones. Я видел, что IntPtr обрабатывается в IronPython, но моя цель - изучить ванильный питон. Мои включает в себя следующие:
from ctypes import * from ctypes.wintypes import *

Как вы дублировать IntPtr в обычном Python (CPython)?

В частности, как вы пишете $var = [IntPtr]::Zero в python?

Я также попытался это, но он не работает:

tid = POINTER(c_int) 
num = c_int(0) 
addr = addressof(num) 
ptr = cast(addr,tid) 
CallResult = = kernel32.DuplicateHandle(ProcessInfo.hProcess, 0x4, 
     kernel32.GetCurrentProcess(),ptr, 0, False, 0x00000002) 

Вот Pastebin полного python code У меня есть
Вот Pastebin из powershell function я работаю на тиражирование.

Edit: Вот соответствующая функция, которую я пытаюсь дублировать в C

HANDLE hThread = nullptr; 
DuplicateHandle(procInfo.hProcess, (HANDLE)0x4, 
    GetCurrentProcess(), &hThread, 0, FALSE, DUPLICATE_SAME_ACCESS); 
return hThread; 
+0

Где/как вы определяете 'ProcessInfo.hProcess' в примерах Python? – Kev

+0

Полный код немного длинный, чтобы положить в сообщение: http://pastebin.com/GzftL7Rh – MikeTGW

+1

Можете ли вы объяснить немного больше о том, что вы пытаетесь сделать. Какое волшебное число '0x4'? – Kev

ответ

1

Согласно Windows documentation, это прототип функции:

BOOL WINAPI DuplicateHandle(
    _In_ HANDLE hSourceProcessHandle, 
    _In_ HANDLE hSourceHandle, 
    _In_ HANDLE hTargetProcessHandle, 
    _Out_ LPHANDLE lpTargetHandle, 
    _In_ DWORD dwDesiredAccess, 
    _In_ BOOL  bInheritHandle, 
    _In_ DWORD dwOptions 
); 

Эквивалент в питоне для LPHANDLE Тип будет wintypes.LPHANDLE

+0

Thats what HANDLE() заполняет (или любые 4 байта на самом деле, я даже попытался поставить указатель стиля cast ((c_byte * 4)(), pointer (c_int)). Проблема, с которой я сталкиваюсь, - это прочитать (ячейка памяти)? (значение)? lpTargetHandle после вызова DuplicateHandle. – MikeTGW

+0

@MikeTGW Вот готовый ответ для вашей функции DuplicateHandle: http://stackoverflow.com/a/29737399/2230844 – denfromufa

Смежные вопросы