Помню был такой метод определения, работаем ли мы с 9x или NT: Код (Text): mov ax, cs cmp ax, XXX jg win9x winNT: ... win9x: ... Вопрос - чему равно ХХХ?
Код (Text): osvi OSVERSIONINFO <?> mov osvi.dwOSVersionInfoSize,sizeof OSVERSIONINFO invoke GetVersionEx,offset osvi .if osvi.dwPlatformId == 1 ; 9x .endif .if osvi.dwPlatformId == 2 ; NT .endif .if osvi.dwPlatformId == 2 ; CE .endif
Код (Text): CheckOS PROTO .DATA? ALIGN DWORD osvi OSVERSIONINFO <> .CODE ALIGN DWORD CheckOS proc option PROLOGUE:NONE option EPILOGUE:NONE mov osvi.dwOSVersionInfoSize, SIZEOF OSVERSIONINFO invoke GetVersionEx, OFFSET osvi .IF eax != 0 xor eax, eax cmp osvi.dwPlatformId, VER_PLATFORM_WIN32_NT sete al .ENDIF ret option PROLOGUE:PROLOGUEDEF option EPILOGUE:EPILOGUEDEF CheckOS endp
Если без API, то проще и надежнее через PEB Код (Text): mov ecx,fs:[30h] mov eax,[ecx+0Ch] ;в NT 08h - ImageBase, 0Ch - LdrData, а в 9х оба = 0 test eax,eax je win9x ;для NT можно доп-но версию извлечь mov eax,[ecx+0A4h] ;OSMajorVersion mov edx,[ecx+0A8h] ;OSMinorVersion movzx ecx,word ptr [ecx+0ACh] ;OSBuildNumber