Hola,
Ya que en Windows de 64 bits, pueden ejecutarse aplicaciones de 32 bits, me gustaría saber si existe una forma de saber la arquitectura de un proceso: 32 o 64 bits.
En el administrador de tareas sí sale "*32" cuando es un proceso de 32 bits, pero ¿cómo podría comprobarlo con alguna API de Windows, WMI, o algo así, en AutoIt?.
No he encontrado nada en Google.
Gracias,
Salu2!
Obtener la arquitectura de un proceso
Re: Obtener la arquitectura de un proceso
hola. aquí tienes:
saludos
Código: Seleccionar todo
Global Const $__WINVER = __WINVER()
Local $aArray = ProcessList()
For $i = 1 To $aArray[0][0]
ConsoleWrite('[' & $i & '] ' & $aArray[$i][0] & ' => ' & _Ternary(_IsProcess64Bit($aArray[$i][1]), 'Is a 64-bit application.', 'Is a 32-bit application.') & @CRLF)
Next
; Version: 1.00. AutoIt: V3.3.8.1
; Check if a process is a 64-bit executable. Returns 1 is natively 64-bit or 0 if 32-bit.
Func _IsProcess64Bit($iPID = 0)
If $iPID < 1 Then
$iPID = ProcessExists($iPID)
EndIf
Return Number(_WinAPI_IsWow64Process($iPID) = 0)
EndFunc ;==>_IsProcess64Bit
Func _Ternary($iValue, $vTrue, $vFalse) ; Like _Iif.
Local $aArray[2] = [$vFalse, $vTrue]
Return $aArray[Number(Number($iValue) > 0)]
EndFunc ;==>_Ternary
Func _WinAPI_IsWow64Process($PID = 0)
If Not $PID Then
$PID = @AutoItPID
EndIf
Local $hProcess = DllCall('kernel32.dll', 'ptr', 'OpenProcess', 'dword', __Iif($__WINVER < 0x0600, 0x00000400, 0x00001000), 'int', 0, 'dword', $PID)
If (@error) Or (Not $hProcess[0]) Then
Return SetError(1, 0, 0)
EndIf
Local $Ret = DllCall('kernel32.dll', 'int', 'IsWow64Process', 'ptr', $hProcess[0], 'int*', 0)
If (@error) Or (Not $Ret[0]) Then
$Ret = 0
EndIf
_WinAPI_CloseHandle($hProcess[0])
If Not IsArray($Ret) Then
Return SetError(1, 0, 0)
EndIf
Return $Ret[2]
EndFunc ;==>_WinAPI_IsWow64Process
Func __Iif($fTest, $iTrue, $iFalse)
If $fTest Then
Return $iTrue
Else
Return $iFalse
EndIf
EndFunc ;==>__Iif
Func __WINVER()
Local $tOSVI = DllStructCreate('dword;dword;dword;dword;dword;wchar[128]')
DllStructSetData($tOSVI, 1, DllStructGetSize($tOSVI))
Local $Ret = DllCall('kernel32.dll', 'int', 'GetVersionExW', 'ptr', DllStructGetPtr($tOSVI))
If (@error) Or (Not $Ret[0]) Then
Return SetError(1, 0, 0)
EndIf
Return BitOR(BitShift(DllStructGetData($tOSVI, 2), -8), DllStructGetData($tOSVI, 3))
EndFunc ;==>__WINVER
Func _WinAPI_CloseHandle($hObject)
Local $aResult = DllCall("kernel32.dll", "bool", "CloseHandle", "handle", $hObject)
If @error Then Return SetError(@error, @extended, False)
Return $aResult[0]
EndFunc ;==>_WinAPI_CloseHandle
saludos
- ............................................
......................................
Re: Obtener la arquitectura de un proceso
¡Woooooow!
¡Gracias!.
Tengo que ver partes del código, que así a simple vista no entiendo demasiado bien, pero ya veo más o menos cómo se hace, y lo más importante, qué API se usa.
¡Pedazo de código! :)
Esta sería una buena función para que incluyera AutoIt, y ahorrar así tanto código :)
Salu2!
¡Gracias!.
Tengo que ver partes del código, que así a simple vista no entiendo demasiado bien, pero ya veo más o menos cómo se hace, y lo más importante, qué API se usa.
¡Pedazo de código! :)
Esta sería una buena función para que incluyera AutoIt, y ahorrar así tanto código :)
Salu2!
Re: Obtener la arquitectura de un proceso
Es mejor así, si estuviese incluida dentro entonces no nos tocaría programar nada a nosotros jajajaja
si tienes duda con el código solo pregunta.
saludos
si tienes duda con el código solo pregunta.
saludos
- ............................................
......................................