#1 27. Juli 2009 Zuletzt von einem Moderator bearbeitet: 14. April 2017 Schnell ohne Windows API das OS ermitteln Kleiner Sourcecode von mir wie man schnell, ohne eine Windows API zu benutzen, das verwendete Betriebssystem ermittelt. Windows 7 wird unterstützt. Das Zauberwort heisst Process Environment Block, da steht es drin MASM Source: Code: .386 .model flat, stdcall option casemap :none include c:\masm32\include\user32.inc include c:\masm32\include\kernel32.inc includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib MessageBox PROTO :DWORD, :DWORD, :DWORD, :DWORD ExitProcess PROTO :DWORD Win PROTO :DWORD assume fs:nothing .data XP db "Windows XP",0h Vista db "Windows Vista",0h Win7 db "Windows 7",0h Serv db "Windows Server 2003",0h W2000 db "Windows 2000",0h MSGC db "Du benutzt...",0h .code start: ;Process Environment Block (PEB) mov eax, DWORD PTR fs:[30h] ;PEB+A4h mov ecx, dword ptr ds:[eax+0A4h] cmp cl, 6h ;PEB+A8h mov ecx, dword ptr ds:[eax+0A8h] jne @2 ;springe wenn nicht gleich cl = 6 cmp cl, 1h jne @1 invoke Win, addr Win7 ;Windows 7 @1: invoke Win, addr Vista ;Windows Vista @2: cmp cl, 2h jne @3 invoke Win, addr Serv ;Windows Server 2003 @3: cmp cl, 1h jne @4 invoke Win, addr XP ;Windows XP @4: invoke Win, addr W2000 ;Windows 2000 int 3 Win PROC WinV :DWORD invoke MessageBox, 0, WinV, addr MSGC, 40h invoke ExitProcess, 0 Win ENDP int 3 end start No File | xup.in + Multi-Zitat Zitieren
#2 31. August 2009 AW: Schnell ohne Windows API das OS ermitteln Ich habs mal C++-freundlich gemacht :] Code: typedef enum { WIN_UNKNOWN = -1, WIN_2000 = 0, WIN_XP = 1, WIN_2003 = 2, WIN_VISTA = 3, WIN_7 = 4 } WINVER_E; WINVER_E getWinVersion() { DWORD v_major, v_minor; _asm { //Register fs zeigt zum TIB (Thread Information Block) //fs:[30h] = Adresse zum PEB (Process Environment Block) mov eax, dword ptr fs:[30h] //PEB + 0xa4 = major version mov ecx, dword ptr [eax+0A4h] //PEB + 0xa8 = minor version mov edx, dword ptr [eax+0A8h] mov v_major, ecx; mov v_minor, edx; } switch (v_major) { case 0x6: switch (v_minor) { case 0x1: return WIN_7; break; case 0x0: return WIN_VISTA; break; } break; case 0x5: switch (v_minor) { case 0x2: return WIN_2003; break; case 0x1: return WIN_XP; break; case 0x0: return WIN_2000; break; } } return WIN_UNKNOWN; } Coole Sache... wusste nicht, dass es sowas überhaupt gibt^^ + Multi-Zitat Zitieren