protected function detect_os($version_info, $system_info) { if (strlen($version_info) <= 4) { return false; } if (strlen($system_info) == 36) { $system_info_stream = new stream($system_info, $this->log); $wProcessorArchitecture = $system_info_stream->read_word(); } else { $wProcessorArchitecture = 0; } $info_stream = new stream($version_info, $this->log); $dwOSVersionInfoSize = $info_stream->read_dword(); if ($dwOSVersionInfoSize != strlen($version_info)) { return false; } $dwMajorVersion = $info_stream->read_dword(); $dwMinorVersion = $info_stream->read_dword(); /*$dwBuildNumber = */ $info_stream->read_dword(); $dwPlatformId = $info_stream->read_dword(); $szCSDVersion = $info_stream->read_strlen(128); $wServicePackMajor = $info_stream->read_word(); /*$wServicePackMinor = */ $info_stream->read_word(); /*$wSuiteMask = */ $info_stream->read_word(); $wProductType = $info_stream->read_byte(); /*$wReserved = */ $info_stream->read_byte(); $os_name = 'Windows'; switch ($dwMajorVersion) { case 3: if ($dwMinorVersion == 51) { $os_name .= ' NT 3.51'; } break; case 4: switch ($dwMinorVersion) { case 0: if ($dwPlatformId == VER_PLATFORM_WIN32_NT) { $os_name .= ' NT 4.0'; } else { $os_name .= ' 95'; if ($szCSDVersion[1] == 'C' || $szCSDVersion[1] == 'B') { $os_name .= ' OSR2'; } } break; case 10: $os_name .= ' 98'; if ($szCSDVersion[1] == 'A') { $os_name .= ' SE'; } break; case 90: $os_name .= ' Me'; break; } break; case 5: switch ($dwMinorVersion) { case 0: $os_name .= ' 2000'; break; case 1: $os_name .= ' XP'; break; case 2: if ($wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 && $wProductType == VER_NT_WORKSTATION) { $os_name .= ' XP'; } else { $os_name .= ' Server 2003'; } break; } break; case 6: switch ($dwMinorVersion) { case 0: if ($wProductType == VER_NT_WORKSTATION) { $os_name .= ' Vista'; } else { $os_name .= ' Server 2008'; } break; case 1: if ($wProductType == VER_NT_WORKSTATION) { $os_name .= ' 7'; } else { $os_name .= ' Server 2008 R2'; } break; case 2: $os_name .= ' 8'; break; } break; } if ($dwPlatformId == VER_PLATFORM_WIN32_NT) { //$csd = ztrim($szCSDVersion); //if ($csd) //{ // $os_name .= ' '.$csd; //} if ($wServicePackMajor > 0) { $os_name .= ' SP ' . strval($wServicePackMajor); } } return trim($os_name); }