Obtener la arquitectura de un proceso

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Obtener la arquitectura de un proceso

Mensaje por Jonny »

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!
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Obtener la arquitectura de un proceso

Mensaje por Dany »

hola. aquí tienes:

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
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Obtener la arquitectura de un proceso

Mensaje por Jonny »

¡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!
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Obtener la arquitectura de un proceso

Mensaje por Dany »

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
  • ............................................Imagen
    ......................................Imagen
Responder