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);
 }