Wykrycie "bitowości" Windowsa kodem

0

Kompiluję na windowsie 32 bit, otrzymane exe uruchamiam na 64 bit windowsie, kod pokazuje mi ciągle 32 bity, jak to "obejść" aby zawsze pokazywał prawidłowo? (Tak, wiem, że mam tu mem leak)


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>

char *bitowosc()
{
	BOOL jest64BitProcesem = 0;
	char *bitowoscSystemu = malloc(sizeof(char) * 255);
	typedef BOOL (APIENTRY *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
	LPFN_ISWOW64PROCESS fnIsWow64Process;
	HMODULE module = GetModuleHandle("kernel32");
	const char nazwaFunkcji[] = "IsWow64Process";
	memset(bitowoscSystemu, '\0', 255);
	fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(module, nazwaFunkcji);
	if(NULL != fnIsWow64Process)
	{
		if (!fnIsWow64Process(GetCurrentProcess(), &jest64BitProcesem))
		{
			strcpy(bitowoscSystemu, "32-bit");
			return bitowoscSystemu;
		}
	}
	if(jest64BitProcesem != 0)
	{
		strcpy(bitowoscSystemu, "64-bit");
		return bitowoscSystemu;
	}
	else
	{
		strcpy(bitowoscSystemu, "32-bit");
		return bitowoscSystemu;
	}
}

int main()
{
    printf("%s\n", bitowosc());
    return 0;
}

2

Strasznie przekombinowałeś, czemu nie skopiowałeś kodu z dokumentacji?

BOOL IsWow64()
{
    BOOL bIsWow64 = FALSE;
    //IsWow64Process is not available on all supported versions of Windows.
    //Use GetModuleHandle to get a handle to the DLL that contains the function
    //and GetProcAddress to get a pointer to the function if available.

    fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
        GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

    if(NULL != fnIsWow64Process)
    {
        if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
        {
            //handle error
        }
    }
    return bIsWow64;
}
0

Chciałem jeszcze dodać że masz memleak związany z "bitowoscSystemu" :)

0

Funkcja IsWow64Process zwraca FALSE jeśli proces jest 64-bitowy. Warto o tym pamiętać, jeśli miałaby w przyszłości powstać 64-bitowa wersja programu.

bool is_64bit_windows()
{
#ifdef _WIN64
    return true;
#else
    typedef BOOL (APIENTRY *LPFN_ISWOW64PROCESS)(HANDLE,PBOOL);
    HMODULE kernel32 = GetModuleHandle("kernel32");
    LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(kernel32, "IsWow64Process");
    if (fnIsWow64Process == 0)
        return false;
    BOOL iswow64;
    fnIsWow64Process(GetCurrentProcess(), &iswow64);
    return (bool)iswow64;
#endif
}

PS1. nie ma też specjalnie co sprawdzać wartości zwracanej przez IsWow64Process – nie ma powodu, by funkcja się nie powiodła, o ile podany proces jest prawidłowy (a GetCurrentProcess nas przecież nie okłamie) i wskaźnik na BOOLa nie jest nullem (a nie jest).

PS2. funkcja IsWow64Process wymaga minimum XP SP2. wystarczy minimalne wymagania systemowe programu uznać za XP SP3, i nie trzeba tej funkcji wcale ładować dynamicznie.

bool is_64bit_windows()
{
#ifdef _WIN64
    return true;
#else
    BOOL iswow64;
    IsWow64Process(GetCurrentProcess(), &iswow64);
    return (bool)iswow64;
#endif
}

na XP SP2 i starszych ten program się po prostu nie uruchomi (w ogóle).

1 użytkowników online, w tym zalogowanych: 0, gości: 1