Betriebsystem Architektur herausfinden



  • Hallo,

    Ich wollte fragen wie man auf eine möglich einfache Art herausfinden kann,
    welche Architektur das OS (nicht Prozessor Architektur) auf dem das Programm
    ausgeführt wird hat.

    Ich habe mir gedacht, man prüft ob eine gewisse Datei oder Ordner welche nur bei
    x64 OS existiert existiert. Ich denke dafür gibts bestimmt noch eine sauberere
    Lösung.

    Freundliche Grüsse,
    banHammer



  • http://msdn.microsoft.com/en-us/library/windows/desktop/ms724958

    SYSTEM_INFO::wProcessorArchitecture

    The processor architecture of the installed operating system



  • Oder auch IsWow64Process.
    ps: Wenn über SYSTEM_INFO, dann sollte man vermutlich GetNativeSystemInfo verwenden und nicht GetSystemInfo.
    Andernfalls wird - schätze ich mal - ein 32 Bit Prozessor reported werden.
    (Bitte um Korrektur falls ich damit falsch liege, hab's nicht ausprobiert)



  • Lösungen wurden ja bereits genannt. Mich würde interessieren, was genau du mit dieser Information dann anstellen willst.



  • Bei IsWow64Process muss aber nochwas wie sizeof(void*)==4 dazukommen um zu prüfen ob der Prozess selber 32Bit oder 64 Bit ist.
    Weil IsWow64Process auf einem 32Bit OS gibt immer false zurück 😉

    was genau du mit dieser Information dann anstellen willst

    Mit dieser Information kann man einiges anstellen 😃

    Z.B. für Dll-Injektionen, die richtige Auswahl eines Treibers, die richtige Auswahl eines direkten Syscalls, ... - da gibts einiges 😃

    Wirklich nötiges für 'normale' Programme fällt mir grad aber auch nix ein.



  • Es ist ganz einfach: Wenn Deine EXE ein x64 Programm ist, dann ist die Architektur des OS auch x64.

    Wenn Deine EXE ein x86 Prozess ist, dann versuche "IsWow64Process" aufzurufen udn werte das Ergebnis aus.



  • DarkShadow44 schrieb:

    Bei IsWow64Process muss aber nochwas wie sizeof(void*)==4 dazukommen um zu prüfen ob der Prozess selber 32Bit oder 64 Bit ist.

    Du bist ja lustig... wenn Dein Prozess x64 ist und das OS x86.... dann darfst Du dreimal raten, ob Du bis zu dieser "if" Bedingung in Deinem x64 Prozess kommst... 😮



  • wenn Dein Prozess x64 ist und das OS x86.

    Jaaa, schon klar... aber wenn das Programm sowohl für 32Bit als auch für 64Bit kompiliert wird ohne den Code zu ändern musst du aufpassen. Weil IsWow64Process gibt für 32 Bit auf 32 Bit und 64Bit Programm auf 64Bit OS beide Male false zurück. Das meinte ich ^^



  • #ifndef _WIN64 😉



  • @DarkShadow44
    OMG ja, dass man weiss was man gerade compiliert sehe ich mal als gegeben an.



  • OMG ja, dass man weiss was man gerade compiliert sehe ich mal als gegeben an.

    Zwischen "ich weiß als was ich kompiliere" und "der Computer weiß was ich kompiliere ist aber durchaus ein unterschied.. 🙄
    Nur weil ich weiß dass der Code sich für 32 Bit anders verhalten soll als für 64 Bit wird er das nicht automatisch tun ohne dass ich ihn umschreibe 😉

    Und ob ich dann _WIN64 definiere (was bei mir standardmäßig nicht definiert ist) oder über sizeof(void*) test es 32 oder 64 Bit ist ist gleich - aber eins von beiden braucht es - außer ich mache mein Programm für NUR 32 Bit oder NUR 64 Bit 😉



  • DarkShadow44 schrieb:

    OMG ja, dass man weiss was man gerade compiliert sehe ich mal als gegeben an.

    Zwischen "ich weiß als was ich kompiliere" und "der Computer weiß was ich kompiliere ist aber durchaus ein unterschied.. 🙄

    Der Compiler weiß auf jeden Fall was du kompilierst.

    DarkShadow44 schrieb:

    Nur weil ich weiß dass der Code sich für 32 Bit anders verhalten soll als für 64 Bit wird er das nicht automatisch tun ohne dass ich ihn umschreibe 😉

    klar

    DarkShadow44 schrieb:

    Und ob ich dann _WIN64 definiere (was bei mir standardmäßig nicht definiert ist) oder über sizeof(void*) test es 32 oder 64 Bit ist ist gleich

    Nope, das ist ein riesen Unterschied, das eine wird beim Kompilieren ausgewertet, das andere potentiell zur Laufzeit. _WIN64 ist übrigens automatisch definiert, wenn du für x64 kompilierst, zumindest wenn du MSVC verwendest.

    DarkShadow44 schrieb:

    - aber eins von beiden braucht es - außer ich mache mein Programm für NUR 32 Bit oder NUR 64 Bit 😉

    Das kapier ich nicht.



  • - aber eins von beiden braucht es - außer ich mache mein Programm für NUR 32 Bit oder NUR 64 Bit

    Das kapier ich nicht.

    Ich meine wenn du dein Programm als nur 64 Bit Version schreibst fällt der OS check ja eh weg. Und wenn du es nur als 32 Bit version schreibst reicht IsWow64Process zum Prüfen der OS Architektur aus.

    Nur wenn du den selben Code sowohl für x86 als auch x64 kompilierst musst du prüfen ob der Prozess 32 oder 64 Bit ist. (Siehe mein 2ter Post)
    Und ob sizeof(void*) oder _WIN64 ist da egal - hauptsache es ist eine Unterscheidung im Code ^^



  • Aber wenn der Code eine Unterscheidung macht, dann ist der Code doch nicht mehr nur für 32 oder 64 Bit!?



  • Ja eben - diese Unterscheidung braucht man nur wenn der Code NICHT nur für entweder 32 oder 64 Bit ist.



  • hustbaer schrieb:

    Oder auch IsWow64Process.
    ps: Wenn über SYSTEM_INFO, dann sollte man vermutlich GetNativeSystemInfo verwenden und nicht GetSystemInfo.
    Andernfalls wird - schätze ich mal - ein 32 Bit Prozessor reported werden.
    (Bitte um Korrektur falls ich damit falsch liege, hab's nicht ausprobiert)

    Unterschied GetSystemInfo vs. GetNativeSystemInfo:
    Auf einem Win7 x64 mit einem 32 Bit Prozess kommt folgendes raus

    Hardware information by GetSystemInfo:
    OEM ID: 0
    Number of processors: 2
    Page size: 4096
    Processor Architecture: 0 [x86]
    Minimum application address: 10000
    Maximum application address: 7ffeffff
    Active processor mask: 3
    ------------------------------------------------------------
    Hardware information by GetNativeSystemInfo:
    OEM ID: 9
    Number of processors: 2
    Page size: 4096
    Processor Architecture: 9 [x64 (AMD or Intel)]
    Minimum application address: 10000
    Maximum application address: fffeffff
    Active processor mask: 3

    The process is running under WOW64.

    Unter XP (32 Bit) kommt mit der selben exe bei beiden Systemaufrufen das
    selbe Ergebnis wie bei GetSystemInfo raus, Sowie die Meldung "The process is not running under WOW64."

    Als 64 bit exe kompiliert kommt der Vollständigkeit halber das raus:

    Hardware information by GetSystemInfo:
    OEM ID: 9
    Number of processors: 2
    Page size: 4096
    Processor Architecture: 9 [x64 (AMD or Intel)]
    Minimum application address: 10000
    Maximum application address: fffeffff
    Active processor mask: 3
    ------------------------------------------------------------
    Hardware information by GetNativeSystemInfo:
    OEM ID: 9
    Number of processors: 2
    Page size: 4096
    Processor Architecture: 9 [x64 (AMD or Intel)]
    Minimum application address: 10000
    Maximum application address: fffeffff
    Active processor mask: 3

    The process is not running under WOW64.


Anmelden zum Antworten