//Copyright 2003 e-Software.cn. All Rights Reserved.
//Written by Gengjian. Email:gengs@163.com
//**Start Encode**

///////////////////////////////////////////////////////////////////////////////////
//全局变量

// 2006-10-3
var g_CreateMessageObjFlag    = false       // 动态提示窗口对象是否已经创建标志

var g_NewDeviceInfo	= new Array;			// 检测到的新设备信息。
var g_CurNewDevice	= 0;

var g_oTable ;								// 枚举到的设备表句柄
var g_oTBody0 ;								// 枚举到的设备表表体内容部分句柄
var g_maxcols=8;							// 设备当前可用的最大属性编号+1
var g_mincols=2;							// 设备当前可用的最小属性编号
//var g_TableItems = 0;						// 当前设备表中存在的设备项目数

var g_ifDisplayInternalErrorInfo = false;	// 是否现实内部出错信息

var g_OSEnumDevFlag = 0;					// 操作系统枚举事件正在运行标志
var g_EnumOverTimerHandle;					// 监测枚举结束事件的计时器循环事件句柄

//////////////////////////////////////////////////////////////
// 2005-8-2
var g_DeviceInfo                        = new Array         // 当前用户机器中所有设备信息
var g_DeviceRows                        = 0                 // 当前用户机器中所有设备数
//////////////////////////////////////////////////////////////
//  下面两个变量只保存内容，不涉及实质性处理代码
var g_NormalSystemDeviceInfoArray	    = new Array;		// 当前系统中状态为正常的系统设备信息
var g_NormalSystemDeviceRows	        = 0;				// 当前系统中状态为正常的系统设备数

var g_DeviceRowsNeedUpdateDriver        = 0                 // 当前用户类设备和系统类设备中需要升级的驱动数
// 2006-9-29
var g_ExistCanRepairDevFlag             = 0                 // 可以修复的设备数
var g_ExistCannotRepairDevFlag          = 0                 // 不可以修复的设备数
// 2006-9-29

var g_UpdatedDeviceRows                 = 0
var g_UpdatedDeviceArray                = new Array
var g_UpdatedSuccessDeviceRows          = 0

var g_NoUpdateDeviceArray               = new Array
var g_NoUpdateDeviceRows                = 0

var g_UserSelectUpdateDrvNumber         = 0

//////////////////////////////////////////////////////////////
var g_UserDrvDeviceInfoArray            = new Array         // 当前系统中由用户安装驱动的设备信息
var g_UserDrvDeviceRows	                = 0                 // 当前系统中由用户安装驱动的设备数(包括已经保护到服务器的和没有保护到服务器的)

var g_DeviceRowsNeedExportDriver		= 0                 // 当前系统中由用户安装驱动的设备中需要保护到服务器(即还没有保护到服务器的)的

var g_ExportedDeviceArray               = new Array
var g_ExportedDeviceRows                = 0
var g_ExportedSuccessDeviceRows         = 0

var g_NoExportDeviceArray                   = new Array
var g_NoExportDeviceRows                = 0

var g_UserSelectExpDrvNumber            = 0


//////////////////////////////////////////////////////////////
var g_DevErrDeviceInfoArray             = new Array();
var g_DevErrDeviceRows	                = 0                 // 当前系统中不能导出的驱动数，包括：由于设备故障而无法导出的驱动和设备驱动没有备份而无法导出的驱动

var g_DeviceRowsCanImportDriver		    = 0

var g_ImportedDeviceArray               = new Array
var g_ImportedDeviceRows                = 0
var g_ImportedSuccessDeviceRows         = 0

var g_NoImportDeviceArray               = new Array
var g_NoImportDeviceRows                = 0

var g_UserSelectImpDrvNumber            = 0
// 2006-9-28
var g_CanImportDrvNumber                = 0
/////////////////////////////////////////////////////////////
//
// 2007-2-14
//
var g_NoMatchDeviceDriverInfoArray       = new Array();
var g_NoMatchDeviceDriverRows	         = 0           
//
//////////////////////////////////////////////////////////////
var UPLOAD_CAB_FILE_BUFFER_SIZE     = 10240       // 一次读10K 10240
var DOWNLOAD_CAB_FILE_BUFFER_SIZE   = 10240       // 一次读10K 10240

// 2006-5-3 <...................................................................
var CGI_UPLOAD_CAB_FILE_BUFFER_SIZE   = 33*1024       // CGI上传驱动一次读31K
var CGI_DOWNLOAD_CAB_FILE_BUFFER_SIZE = 33*1024       // CGI下载驱动一次读31K
// 2006-5-3 ...................................................................>

var g_UserID                  = 0
var g_UserExportedDriverRows  = 0
//////////////////////////////////////////////////////////////
var g_CanUserConnectToServer            = false

var g_NeedReenum 		= 0;				// 有设备加载了错误驱动，错误驱动和设备都已经被删除，需要重新枚举设备
var g_MaxDeviceIndex 	= 0;				// 系统中当前设备总数

var g_DrvInstLogFilePath	= ""    //  DrvInst.log操作日志文件的文件路径名
var g_AppLaunchPath			= ""	// 当前页面程序如果是从用户机器启动的，该值保存程序的启动目录
var g_ClientStartPath		= ""	//  客户端加载时的目录路径,如果是从网络加载就为空
var g_DrvInstLogFileName	= "drvinst.log"
//2005-8-1
// 已经移到setting.js中
//
//var EDRIVERS_ROOT_CA_CERT_CONTEXT_IN_X509_BASE64 = "MIIGAjCCA+qgAwIBAgIQNXlB1vepAqhPg25P7TKhPTANBgkqhkiG9w0BAQUFADBUMRswGQYDVQQLExJlLWRyaXZlcnMuY24gR3JvdXAxFjAUBgNVBAoTDWUtc29mdHdhcmUuY24xHTAbBgNVBAMTFGUtZHJpdmVycy5jbiBSb290IENBMB4XDTA0MDExNjAzMDUxOFoXDTE0MDExNjAzMTM0MlowVDEbMBkGA1UECxMSZS1kcml2ZXJzLmNuIEdyb3VwMRYwFAYDVQQKEw1lLXNvZnR3YXJlLmNuMR0wGwYDVQQDExRlLWRyaXZlcnMuY24gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMiAXqr8P/cnmpwdH9G2NI/aIofLTrU/BxGHcwSgl5MHAVtbdG7+dH16IUgJ//Mq5biPbtu7QQC5lzMQIPDM/4gDGM6reZzXZYbyY76lW6otSKdL6g3Xc0WBCS1ZWhYYX+O+FvIW/Q5LksQb4KiOfM0Szi17z3MKG3U5behHzUB7IYba6I2WIVzp+p1vSWGHt2DWBMMZjNUdfX7vSw4vtjz7pgi3PasDYnPgNOaLatpMkMYDqZuQEWT9o4ASVjQ6C03X1gqx/peZ3xonAT28XXUCf0wehPqOeCnrE+pjB/ZzmK4o5Cr8ZPR5UdiRLMWKMr1URumZUHJYJvRqBquJHbA9XOZ58wuUZWhjYkqHJDP/5o+GMe9v9asYr5qk7PKTAMR8TIme8yU+0zrZ+l2EzjK4SsMmykq2y9f0PAFRZknwVuWNP6OEyMycIhHXPIk1EXb3Q2j4LAV35sy4Vozoxpw5zliZSBRbuePyHiKsqrL5FxDdKnmWeqOg29gDSq2HDgvGjo8K8lQs54PkwfhztwsCa3F6eALjhKmm7CNUZfV8SXPMnEVATzpKi6nmyzZmB4kYHmlX038rxleEZ66/kr3ITYymRIZKpy+uPOi/xPAm8djkrpzw2Ro2IPn4gT7PMfu0QTx6RMAct4D+fM5hxpxKxxdD+zOVzgifhgM4FVBRAgMBAAGjgc8wgcwwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNdHvRDqKoGYk1B7V4HF1BV6KM2BMHsGA1UdHwR0MHIwcKBuoGyGNWh0dHA6Ly9zZXJ2ZXIvQ2VydEVucm9sbC9lLWRyaXZlcnMuY24lMjBSb290JTIwQ0EuY3JshjNmaWxlOi8vXFxzZXJ2ZXJcQ2VydEVucm9sbFxlLWRyaXZlcnMuY24gUm9vdCBDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggIBAJcCScIatlXpqSmRbl0Zcj2mjXPPlS7Vl3fPMOVFNqG4Vcc1DGpaUivL2SZWNOeZjvxaTiqmEnHbgkko1ANCpxmenoa0reFkeHV2htruqfoZ8LSh9zZAs6F48Bm+wialAWc4tLH06Bo0IHN6CitLJjBqnwsxdirih6SQuHWziAvGQBs0ccTMAWB7ERRf88g4JUzaF4cZomtFrrx/i7MY/6pc3hHlrRNaBTddnQIkEJsbPGie1BoGNnUyOOIR57RVDQDnkQ9yhBOe9I/NAXXFJmmNt1hCy/5ZP9VgtHO2TrQob3r+UsdsBZJR1gWpEZBgvUIO6IXY7FyrheYqRqU7Xjnz0S963A4fdgLEn0t00kcJxNr/ICIwsGDS+h7JpVi9nK7lmXuTBeCSD75yIqs2q28z3iGrTOSQ0qmPUuKMRMIRgAa9FWqIHxCCe2IVozoJa7WBNUmgs1dbWzSwaLM8hy/0QeydRL2o+asM1BrC+3LreN2a/iGQ8AdiI3ZlcSUocc2AmdrwLUgBL4Uxyu1JCynMqS37UKP5an4z8XAZxVk6nZjbeWJMrzpUah6Yp1T7BXDttkPqWfUlsmfdvIlsdgAZdBa3s2vxVpKibM1lhHd7xF+g24MHSkBuabdtRplpe9EzmwYP6SsVf/hkOX40Sbq/2oI5jXyMOm2Ji2nGD4M1"

// 用来生成用户INF文件的加密/解密密钥，该值必须与服务器端的定义一致
var INF_ENCRYPT_CONST_STRING = "e-Software.cn"   
//2005-7-30
// 客户端程序访问服务器的类型：是通过服务器客户端页面程序访问驱动服务的还是用户端客户端程序访问服务的
// 该定义必须和后台程序personal.e-drivers.cn/soap/ParamDefine.inc中的定义一致
var CLIENT_ACCESS_MODE_SERVER_CLIENT = "ServerClient"
var CLIENT_ACCESS_MODE_USER_CLIENT   = "UserClient"

// 2005-8-3
// 退出当前用户上传保护驱动操作过程的标志
// 该标志的值只在用户点击“取消”时被改变，在这里设置的任何值都会被程序初始化为0
var g_SkipExpCurDrvFlag
// 退出当前用户下载修复驱动操作过程的标志
// 该标志的值只在用户点击“取消”时被改变，在这里设置的任何值都会被程序初始化为0
var g_SkipImpCurDrvFlag

// 2006-10-24
g_NextStepClickedFlag       = false
// 2006-9-27
//
// 该标志表示设备没有DeviceID
var UNKNOWN_DEVICE_ID  =  "UNKNOWN\\NULL_DEVICE_NULL_DEVICE_NULL_DEVICE"

// 2007-2-12
var DOWNLOAD_PATH           = "Lenovo_Driver"
var DOWNLOAD_DRIVER_SUBDIR  = "Download" 

// 2007-2-13
// 用户的主机序列号
var g_UserHostSerialNumber = ""

// 2007-2-13
var g_DownloadPath      = ""

// 2007-2-15
var g_MatchingDeviceInfo =  new Array() // 服务器端返回的匹配驱动信息

// 2007-2-15
var g_OtherDriverNeedImpNumber          = 0 
var g_ImportedOtherDriverRows           = 0 
var g_ImportedOtherDriverDeviceArray    = new Array
var g_NoImportOtherDriverDeviceArray    = new Array
var g_NoImportOtherDriverDeviceRows     = 0
// 2007-2-16
var g_OtherDriverListNumber             = 0 

// 2007-2-25
var g_DefaultLoader  = "DrvImp"         // 缺省主调用程序名
var g_LoaderString   = g_DefaultLoader  // 主调用程序的名称和加载参数
// 2007-2-27
var g_CaseID         = ""               // 本次服务的CaseID(无论用户是DrvImp加载方式还是其他加载方式,都会有一个CaseID)

// 2007-2-26
var g_LogConfigInfo = new Array         // 当前加载者的日志文件配置信息表内容

var USER_DEVICE_OS_BROWSE_LOG_NAME      = "ItemA"   // 该值必须与服务器表USER_LOG_CFG中的一致,向服务器提交用户设备、OS、浏览器信息

// 2007-2-28
var USER_DEVICE_DETECT_LOG_NAME         = "ItemB"   // 该值必须与服务器表USER_LOG_CFG中的一致,向服务器提交用户设备检测信息
var USER_DEVICE_ANALYSE_LOG_NAME        = "ItemC"   // 设备故障分析结果页有效日志标记
// 2007-3-5
var USER_DEVICE_FIX_LOG_NAME            = "ItemD"   // 设备故障修复结果页有效日志标记

var g_DeviceForUpdateListArray          = new Array;g_DeviceForUpdateListArray["Rows"]      = 0;
var g_DeviceForRepairListArray          = new Array;g_DeviceForRepairListArray["Rows"]      = 0;
var g_DeviceCannotRepairListArray       = new Array;g_DeviceCannotRepairListArray["Rows"]   = 0;
var g_DeviceForOtherListArray           = new Array;g_DeviceForOtherListArray["Rows"]       = 0;

// 2007-3-2
var g_RunningStatus                     = ""
//2007-3-10
var g_DownloadPath                      = ""        // 驱动下载目录
///////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////
function DisplayMessage( Msg )
{
	InputDataBox4.value		= InputDataBox4.value + "\n" + Msg;
	InputDataBox4.scrollTop = InputDataBox4.scrollHeight ; 
	// 如果客户端已经被正确安装到用户机器或客户端是从用户本机启动的,才写日志
	if (g_DrvInstLogFilePath)
	{
		//if (!DrvInst.AppendStringToFileEnd( g_DrvInstLogFilePath , "\r\n" + GetLocalTime() + Msg))
		//{
		//	alert( "Filename is : " + g_DrvInstLogFilePath + "\n" + 
		//	       "String to write is : " + "\r\n" + GetLocalTime() + Msg + 
		//		   "Error info is : " + DrvInst.StatusString )
		//}
		DrvInst.AppendStringToFileEnd( g_DrvInstLogFilePath , "\r\n" + GetLocalTime() + Msg)
	}
	// 程序执行到这里,一般是用户手工拷贝客户端到自己机器后又上网流览服务器客户端的情况
	else
	{
		// 这种情况下程序不写日志
	}
}
///////////////////////////////////////////////////////////////////////////////////
function GetLocalTime()
{
		var d  = new Date();
        var year  = d.getYear()
        var month = (d.getMonth() + 1)
        var date  = d.getDate()
        var hours = d.getHours()
        var min   = d.getMinutes()
        var sec   = d.getSeconds()
        var mil   = d.getMilliseconds().toString(10)
            year  = year + "-"
            month = ( month <10 ) ? "0" + month + "-" : month + "-"
            date  = ( date  <10 ) ? "0" + date  + " " : date  + " "
            hours = ( hours <10 ) ? "0" + hours + ":" : hours + ":"
            min   = ( min   <10 ) ? "0" + min   + ":" : min   + ":"
            sec   = ( sec   <10 ) ? "0" + sec   + ":" : sec   + ":"
            mil   = "0000".substring(0,4-mil.length-1) + mil
		var	str   = "[ " + year + month + date + hours + min + sec + mil  + " ] "
   return( str )
}

///////////////////////////////////////////////////////////////////////////////////
// 2006-10-29
// function StartDriverImportUpdate()
function StartDriverImportUpdate( Mode )
{
    // 如果用户设置要打开运行信息窗口（却省是打开）
    var CookieFlag = GetCookie( "OpenRunLogWinFlag" )
	if ( ( CookieFlag == "true") || !CookieFlag ) restoreTransientMessage()
    // 2006-8-21
    DrvCert.UIRefresh()



	//如果当前用户没有管理员权限，就提示用户并退出
	//var right = DrvInst.GetAccountRightA();
	//if (right == 0xFFFFFFFF)
	//{
	//		alert("你登录的账户没有权限安装设备的驱动,程序将退出！\n请登录管理员账户重新再试");
	//		return -1;
	//}

    // 2006-7-8
    CreateMessageObject()

	// 2006-10-29
    // ResetInitVal();
    ResetInitVal( Mode )


	//// 放在这里的原因是只有执行过ResetInitVal()输出信息框才被初始化过
	//DisplayMessage("当前登录的账户为" + ComputerName + "\\" +UserName );

	//		1 : HKEY_CURRENT_USER
	//		2 : HKEY_LOCAL_MACHINE
	//		3 : HKEY_CLASSES_ROOT
	//		4 : HKEY_CURRENT_CONFIG
	//		5 : HKEY_USERS
	var hKey4 = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\DrvInst\\Setup")
	g_DrvInstLogFilePath = DrvCert.RegQueryValue( hKey4 , "DrvInstLogFilePath" )
	// 如果客户端注册表项没有设置DrvInst.log的路径(一般是客户端没有安装而使用的情况)且又是从本地启动的(不是通过网络),
	// 就设置DrvInst.log的路径到客户端所在的路径
	if (!g_DrvInstLogFilePath && g_ClientStartPath) g_DrvInstLogFilePath = g_ClientStartPath + "\\" + g_DrvInstLogFileName


	DisplayMessage( "===============================================================" )
	DisplayMessage( "驱动修复开始..." )
    // 2006-8-21
    DrvCert.UIRefresh()

    // 2006-10-29
    if ( !Mode )    // if mode = 0
    {
        // 如果初始化drvinst.dll失败就退出
        if (DrvInst.DrvInstInit() == 0)
        {
            return -2;
        }
    }
	g_ifDisplayInternalErrorInfo = false;

	var hostname;
	hostname = ServerName.value;
	DrvInst.DownloadHostname = hostname;
	g_CanUserConnectToServer = DrvInst.ConnectAddressLocal(hostname);
	if (g_CanUserConnectToServer)
	{
		DisplayMessage(	"连接驱动程序下载站点http:\/\/" + hostname + "成功");

	}
	else
	{
		DisplayMessage("连接驱动程序下载站点http:\/\/" + hostname + "失败");
        // 2006-5-16 <<<..................................................................
        // 
        // 有时这个错误是伪故障，其实用户可以访问网络，因此取消了错误返回
        //
		//Title.innerHTML = '<br><center>无法连接驱动服务站点http:\/\/' + hostname + '<br>请检查您的机器是否已经连接到网络</center>'
		//return 1
        // 2006-5-16 ...................................................................>>>
	}
    // 2006-8-21
    DrvCert.UIRefresh()


    
    // 2006-8-21
    // 下列代码已经移至登记用户后面，以满足某些厂商程序加载时间小于2s、响应时间小于5s的要求
    // 经测试，下面的程序将花大概4s时间，算上这个时间加载和响应时间将有7s，移走这个代码
    // 将可以使加载和响应时间缩短为3s
    //
    //// 2006-8-21
    //DisplayMessage("正在进行安全性检查...");
    //Title.innerHTML = '<br><center>正在进行安全性检查...</center>'
    //DrvCert.UIRefresh()
    //
    //// [卖给网站的版本的特有代码-4]  ！！！！！！！！！！  如果要卖给网站，需要恢复下行代码   ！！！！！！！！！！！！！
    ////
    //// 如果服务器证书无效
    //if ( !CheckDSPCertValid() ) return 2
    //
    //// 2006-8-21
    //DisplayMessage("安全性检查通过");
    //DrvCert.UIRefresh()

    
    // 不处理隐含设备
	DrvInst.ShowHiddenDevice = 0;
	
    // 2006-8-21 <<<..........................................................................
    //
    if ( GetCookie( "ReenumMode" ) == "true" )
    {
        // 操作系统枚举事件正在运行标志设置，以等待操作系统为新设备安装完驱动
        g_OSEnumDevFlag = 1;
        // 刷新设备
        DisplayMessage("正在重新枚举设备...");
        DrvInst.ReenumDevice();
        DisplayMessage("重新枚举设备结束");
    }
    //
    // 2006-8-21 ..........................................................................>>>

	// 操作系统枚举事件正在运行标志取消设置
	g_OSEnumDevFlag = 0
    // 重新检测设备并枚举
    EnumDevice(1)

	return 0;
}
///////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////
// 2006-10-29
// function ResetInitVal()
function ResetInitVal( Mode )
{
	oTableContainer.innerText = ""

	// 预留进度条的现实位置为空
	//cleanHTML();

    // 2006-10-29
    if ( !Mode )    // if mode = 0
    {
        DrvInst.DrvInstFinish();
    }

	// 需要显示drvinst.dll在初始化时的错误信息
	g_ifDisplayInternalErrorInfo = true;

	DrvInst.FinishedPercent	= 0 ;

	//DisplayMessage("\n");

	//// 设置该值可以让drvinst.dll可以判断agent是否需要下载以更新
	//DrvInst.AgentVersionHi = eval(AgentVerHi.value);
	//DrvInst.AgentVersionLo = eval(AgentVerLo.value);

	// 2006-10-27
    //var UrlPathname = location.pathname;	// get path of HTML file
	//var UrlHostname = location.hostname;	// get hostname & port
    var UrlPathname = ""
	var UrlHostname = ""
    try
    {
        UrlPathname = document.location.pathname;	// get path of HTML file
	    UrlHostname = document.location.hostname;	// get hostname & port
    }
    catch (e)
    {
    }
    
	// 如果当前IE正在浏览一个本地的HTML副本
	// if URl not link to a Hostname ,mains IE browse a location HTML file.
	if (UrlHostname == "")
	{
		// if pathname include chinese word ,will error
		UrlPathname = UrlPathname.replace( /%20/gi , " ");
		if (UrlPathname.charAt(0) == "/")
		{
			// get substring from first char to last char \ .
			UrlPathname = UrlPathname.substring(1 , UrlPathname.lastIndexOf("\\")); 
		}
		else
		{
			UrlPathname = UrlPathname.substring(0 , UrlPathname.lastIndexOf("\\")); 
		}
	}
	// go to here,mains IE browse a Internet HTML file
	else
	{
		// 让drvinst.dll从%ProgramFiles%中查找agent
		UrlPathname = "";
	}

	g_ClientStartPath = UrlPathname

	// 设置hostname保证DrvInst.dll可以从正确的地址下载agent.
	DrvInst.DownloadHostname = UrlHostname;
	DrvInst.CurrentWorkDirectory = UrlPathname;

	(DrvInst.CurrentWorkDirectory == "")
		?DisplayMessage("当前页面的工作目录是：NULL")
		:DisplayMessage("当前页面的工作目录是：" + DrvInst.CurrentWorkDirectory);

	DeleteDeviceTable();

	return 0;
}
///////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////
var g_Finish = 0;
var g_timerID="";


///////////////////////////////////////////////////////////////////////////////////
function ApplyInitProcessEvent()
{
	//if (g_timerID =="") ProcessBarInit();
}
///////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////
function EnumDevice( EnumMode )
{
	// 如果枚举模式不为0，且devmgr32.dll在运行，就提示用户并挂接枚举任务然后退出
    // 以等待操作系统为新设备安装完驱动
	if ( ( EnumMode != 0) && DrvInst.GetSysInstallDrvStatus() )
	{
		DisplayMessage("Windows正在自动为新设备安装驱动程序")
        // 2006-10-3
        //
        // 由于为了解决IE死机以及enable.exe失败错误、取消了DrvImp.htm的ReEnumDevicesEvent()事件相应函数ApplyReEnumDevicesEvent()，
        // 因此，程序原来功能中的系统驱动安装期间推迟枚举功能将被取消，由于没有推迟功能，这里的提示将被修改
        //
		// DisplayMessage("设备枚举将被推迟，请稍候...");
        DisplayMessage("本次设备枚举将被取消，请稍候重试...")
        // 2006-10-8
        Title.innerHTML = '<br><center>Windows正在自动为新设备安装驱动程序<br>请稍候重试...</center>'

		DrvInst.EnumDevice(1);
		return 1
	}
    // 如果操作系统枚举事件正在运行，就提示用户然后退出，以等待操作系统枚举结束而重新产生设备枚举事件
    if ( g_OSEnumDevFlag )
    {
		DisplayMessage("Windows正在刷新设备")
        // 2006-10-3
		// DisplayMessage("设备枚举将被推迟，请稍候...");
        DisplayMessage("本次设备枚举将被取消，请稍候重试...")
		return 2
    }
    //2005-8-2
	DisplayMessage("正在枚举设备...");
    Title.innerHTML = '<br><center>正在枚举设备...</center>'
	DrvCert.UIRefresh()
	 
	g_NormalSystemDeviceRows    = 0;
    g_DeviceRows                = 0

	g_UserDrvDeviceRows         = 0
	g_DevErrDeviceRows          = 0
    g_UserSelectUpdateDrvNumber = 0
	g_UserSelectExpDrvNumber    = 0
	g_UserSelectImpDrvNumber    = 0
    // 2006-9-28
    g_CanImportDrvNumber        = 0

	g_DeviceRowsCanImportDriver = 0
    g_DeviceRowsNeedUpdateDriver= 0
    // 2006-9-29
    g_ExistCanRepairDevFlag             = 0                 // 可以修复的设备数
    g_ExistCannotRepairDevFlag          = 0                 // 不可以修复的设备数

    g_DeviceRowsNeedExportDriver= 0

    g_UpdatedDeviceRows         = 0
    g_ExportedDeviceRows        = 0
    g_ImportedDeviceRows        = 0
    g_UpdatedSuccessDeviceRows  = 0
    g_ExportedSuccessDeviceRows = 0
    g_ImportedSuccessDeviceRows = 0
    g_NoUpdateDeviceRows        = 0
    g_NoImportDeviceRows        = 0
    g_NoExportDeviceRows        = 0
    // 2007-2-15
    g_OtherDriverNeedImpNumber  = 0
    g_ImportedOtherDriverRows   = 0
    // 2007-2-16
    g_NoImportOtherDriverDeviceRows = 0


	DrvInst.EnumDevice(0);
	g_OSEnumDevFlag = 0;
	g_MaxDeviceIndex = DrvInst.DeviceIndex + 1;

    // 2007-3-15
    //
    // 放到后面了
    //
    //// 2007-2-13 <<<.........................................................................
    //// 如果用户没有输入过机器序列号，就检测是否在cookie中保存过以前输入的
    //if ( !g_UserHostSerialNumber )
    //{
    //    var UserHostSerialNumber = GetCookie( "UserHostSerialNumber" )
    //    //if ( UserHostSerialNumber ) g_UserHostSerialNumber = UserHostSerialNumber
    //    // 2007-2-25
   	//	DisplayMessage("从Cookie读出主机序列号：" + UserHostSerialNumber )
    //}

    // 2007-2-25 <<<.............................................................................................
    //
    var UrlFullString   = ""
    var UrlPathname     = ""
    var UrlParamString  = ""
    try
    {
        UrlFullString   = document.location.href
        UrlPathname     = document.location.pathname;	// get path of HTML file
        UrlParamString  = UrlFullString.substr( UrlFullString.indexOf( UrlPathname ) + UrlPathname.length ) 
        // 如果URL包含"?name=wss&caseid=1234&SN=EB03355993"这样的参数，就去掉“？”
        if ( UrlParamString && UrlParamString.substring( 0 , 1 ) == "?" )
        {
            UrlParamString = UrlParamString.substr( 1 ) // 1 : skip "?"
            // 2007-2-28
            //
            // 如果URL输入了主机序列号，就保存到g_UserHostSerialNumber
            if ( UrlParamString.toUpperCase().indexOf("SN") != -1 )
            {
                // 2007-3-3
                // g_UserHostSerialNumber = UrlParamString.replace( /(.*)SN=([a-zA-Z0-9]*)/gi , "$2" )     //[0-9a-zA-Z-_\.]+
                var UrlParamArray = UrlParamString.split( "\&" )
                for ( var i=0; UrlParamArray[i]; i++)
                {
                    if ( UrlParamArray[i].toUpperCase().indexOf("SN") != -1 )
                    {
                        g_UserHostSerialNumber = UrlParamArray[i].replace( /(.*)SN=(.*)$/gi , "$2" )
                        break
                    }
                }
                DisplayMessage("从页面加载参数获得主机序列号:" + g_UserHostSerialNumber );
            }
        }
        // 如果URL没有包含"?name=wss&caseid=1234"参数，就设置参数串为“name=DrvImp&caseid=xxxx”
        else
        {
            UrlParamString = g_DefaultLoader
        }
    }
    catch (e)
    {
    }
    g_LoaderString = UrlParamString
    // 2007-2-26
    DisplayMessage("页面加载参数是:" + g_LoaderString );
    //
    // 2007-2-25 .............................................................................................>>>



    //
    // 只有在用户第一次执行本程序而没有登录时，才进行登记用户和检测设备工作
    // 当用户点击“上一步”时，就不再执行上述操作
    //
    // 2006-10-15
    //
    if ( !g_UserID )
    {
        DisplayMessage("正在登记用户...");
        Title.innerHTML = '<br><center>正在登记用户...</center>'
        DrvCert.UIRefresh()

        var RetRegUserInfo = RegUserHardwareInfo()
        // 2007-2-12
        //RetRegUserInfo["Success"] = true
        //RetRegUserInfo["Info"]    = "登记用户请求成功,UserID=" + UserID 
        //RetRegUserInfo["UserID"]  = UserID
        //RetRegUserInfo["UserType"]  = UserType ( New / Old )
        // 2007-2-12
        //RetRegUserInfo["DownloadPath"]
        // 2007-2-13
        //RetRegUserInfo["HostSerialNumber"]
        // 2007-2-27
        //RetRegUserInfo["CaseID"          ]

        if ( !RetRegUserInfo["Success"] )
        {
            Title.innerHTML = '<br><center>登记用户请求失败<br>' + RetRegUserInfo["Info"] + '</center>'
            DrvCert.UIRefresh()
            return false
        }
        // 2007-2-12
        //
        // 如果登记用户成功，就将用户ID保存到全局cookie中
        g_UserID = RetRegUserInfo["UserID"]
        SetCookie( "UserID" , g_UserID , 1 )
        // 2007-2-13
        //g_UserHostSerialNumber = RetRegUserInfo["HostSerialNumber"]
        // 2007-2-25
   		//DisplayMessage("从服务器读出主机序列号：" + RetRegUserInfo["HostSerialNumber"] )

        // 2007-2-12
        //
        // 如果是新用户或者老用户但用户没有设置下载路径，要自动为用户选择硬盘剩余空间最大的硬盘建立驱动下载缓冲区，并保存到服务器中
        var DownloadPath = ""
        // 2007-3-10
        // if ( ( RetRegUserInfo["UserType"].toUpperCase() == "NEW" )  || !RetRegUserInfo["DownloadPath"] )
        if ( ( RetRegUserInfo["UserType"].toUpperCase() == "NEW" )  || !RetRegUserInfo["DownloadPath"] || RetRegUserInfo["DownloadPath"] == "null" )
        {
            DownloadPath = GetDownloadDrive() + "\\" + DOWNLOAD_PATH
            SubmitUserDownloadDriverPath( g_UserID , DownloadPath )
        }
        // 如果是老用户，就从服务器中取回驱动下载缓冲区路径
        else
        {
            DownloadPath = RetRegUserInfo["DownloadPath"]
        }
        // 2007-3-10
        g_DownloadPath = DownloadPath

        // 2007-2-7
        //
        // 设置驱动下载/备份目录
        DrvInst.SetMyDriversRootDir( DownloadPath )
        // 2007-2-13
        g_DownloadPath = DownloadPath

        // 2007-2-25 <<<.............................................................................................
        //
        var UrlFullString   = ""
        var UrlPathname     = ""
        var UrlParamString  = ""
        try
        {
            UrlFullString   = document.location.href
            UrlPathname     = document.location.pathname;	// get path of HTML file
            UrlParamString  = UrlFullString.substr( UrlFullString.indexOf( UrlPathname ) + UrlPathname.length ) 
            // 如果URL包含"?name=wss&caseid=1234"这样的参数，就去掉“？”
            if ( UrlParamString && UrlParamString.substring( 0 , 1 ) == "?" )
            {
                UrlParamString = UrlParamString.substr( 1 ) // 1 : skip "?"
            }
            // 如果URL没有包含"?name=wss&caseid=1234"参数，就设置参数串为“name=DrvImp&caseid=xxxx”
            else
            {
                UrlParamString = "Name=" + g_DefaultLoader + "&CaseID=" + RetRegUserInfo["CaseID"]
            }

        }
        catch (e)
        {
        }
        g_LoaderString = UrlParamString
        // 2007-2-26
        DisplayMessage("页面加载参数是:" + g_LoaderString );
        //
        // 2007-2-25 .............................................................................................>>>

        // 2007-2-26 <<<.............................................................................................
        //
        // 获得日志配置信息表的内容
        //
        // 2007-3-3
        // var CurLoader = UrlParamString.replace( /Name=(.*)\&CaseID=(.*)/gi , "$1" )     //[0-9a-zA-Z-_\.]+
        // 如果Url参数象以下形式"?SN=xxxxxxx",就定义"Name=DrvImp"
        var CurLoader =     ( UrlParamString.toUpperCase().indexOf("NAME=") != -1 ) 
                        ?   UrlParamString.replace( /Name=(.*)\&CaseID=(.*)/gi , "$1" )     //[0-9a-zA-Z-_\.]+
                        :   g_DefaultLoader
        // 2007-2-26
        DisplayMessage("当前程序加载者为:" + CurLoader );
        // 2007-2-27
        g_CaseID = RetRegUserInfo["CaseID"]
        DisplayMessage("当前服务编号为:" + g_CaseID );

        // 取当前加载程序的日志配置信息表
        g_LogConfigInfo = GetLogConfigInfoFromServer( CurLoader , g_UserID )
        //g_LogConfigInfo["Success"       ] = ( Result == "Success" ) ? true : false
        //g_LogConfigInfo["Info"          ] = ""
        //g_LogConfigInfo["Rows"          ] = n ( 0 , i , n )
        //g_LogConfigInfo[ i + ",LogItemName"     ] = "ItemA"
        //g_LogConfigInfo[ i + ",LogValidFlag"    ] = true
        //g_LogConfigInfo[ i + ",LogItemDesc"     ] = "保存用户设备信息以及OS名称、版本和浏览器信息到服务器"
        //g_LogConfigInfo[ "ItemA" ] = true
        //
        //g_LogConfigInfo["RetUrlRows"                ]
        //g_LogConfigInfo[ i + ",RetUrlItemName"      ]
        //g_LogConfigInfo[ i + ",RetUrlItemCaller"    ]
        //g_LogConfigInfo[ i + ",RetUrlSetting"       ]
        //g_LogConfigInfo[ i + ",RetUrlDesc"          ]
        //g_LogConfigInfo[ "RetUrlItemA" ] = 3
        //
        // 2007-2-26 .............................................................................................>>>
        
        // 2007-2-13
        //
        // 如果用户序列号为空，就需要让用户输入主机S/N号，并且保存到cookie中
        if ( !g_UserHostSerialNumber || g_UserHostSerialNumber == "null" )
        {
            Title.innerHTML = '<br><center>请输入主机序列号</center>'
                            + '<br>'
                            + '<table align=center id=PercentTbl width=400 border=0 cellSpacing=0 cellPadding=0 >'
                            + '<tr><td>'
                            // 2007-3-9
                            // + '<center><input id=UserHostSerialNumber type=text></center>'
                            + '<center><input name=UserHostSerialNumber type=text></center>'
                            + '</td></tr>'
                            + '<tr><td>'
                            + '<br><br>'
                            + '</td></tr>'
                            + '<tr><td>'
                            // 2007-3-9
                            // + '<center><input type=button value="下一步" onclick="CheckUserHostSerialNumber( ' + UserHostSerialNumber.value + ')"></center>'
                            + '<center><input type=button value="下一步" onclick="CheckUserHostSerialNumber( UserHostSerialNumber.value )"></center>'
                            + '</td></tr>'
                            + '</td></tr></table>'
                            + '<div id=PercentString>&nbsp;</div>'
            DrvCert.UIRefresh()

            // 2007-3-15 <<<........................................................................
            // 如果Cookie中已经读出UserHostSerialNumber,就填写到input中
            //
            var CookieUserHostSerialNumber = GetCookie( "UserHostSerialNumber" )
            DisplayMessage("从Cookie读出主机序列号：" + CookieUserHostSerialNumber )
            if ( CookieUserHostSerialNumber )
                UserHostSerialNumber.value = CookieUserHostSerialNumber            
            DisplayMessage("正在校验主机序列号...");
            //
            // 2007-3-15 ........................................................................>>>

            // 等待用户输入的机器序列号检察通过后再继续执行EnumDeviceAfter()
            return
        }
        // 2007-3-7
        //
        // 如果用户序列号不为空,就校验
        DisplayMessage("正在校验主机序列号...");
        CheckUserHostSerialNumber( g_UserHostSerialNumber )
        return
    }
    // 继续下面的操作: 枚举、列出设备信息等
    EnumDeviceAfter()
    // 2007-2-13 .........................................................................>>>

// 2007-2-13 <<<...............
}
function EnumDeviceAfter()
{
// 2007-2-13...............>>>

    // 如果用户安装的驱动中还有没有备份到本机的，就先备份，因为驱动要导出就必须先备份
	BackupUserDriver()

    // 2007-3-19
    //// 2007-3-2
    ////// 2007-2-9
    //////
    ////// 这种方式
    //////// 如果系统安装的驱动中还有没有备份到本机的，就先备份，因为驱动要升级就必须先备份
    ////BackupSystemDrivers()
    BackupSystemDrivers()

	// 对不能导出的驱动实行备份以后需要再枚举一次，以更新驱动的状态为“已备份”
	g_NormalSystemDeviceRows    = 0;
    g_DeviceRows                = 0

	g_UserDrvDeviceRows         = 0
	g_DevErrDeviceRows          = 0
    g_UserSelectUpdateDrvNumber = 0
	g_UserSelectExpDrvNumber    = 0
	g_UserSelectImpDrvNumber    = 0
    // 2006-9-28
    g_CanImportDrvNumber        = 0

	g_DeviceRowsCanImportDriver = 0
    g_DeviceRowsNeedUpdateDriver= 0
    // 2006-9-29
    g_ExistCanRepairDevFlag             = 0                 // 可以修复的设备数
    g_ExistCannotRepairDevFlag          = 0                 // 不可以修复的设备数

    g_DeviceRowsNeedExportDriver= 0

    g_UpdatedDeviceRows         = 0
    g_ExportedDeviceRows        = 0
    g_ImportedDeviceRows        = 0
    g_UpdatedSuccessDeviceRows  = 0
    g_ExportedSuccessDeviceRows = 0
    g_ImportedSuccessDeviceRows = 0
    g_NoUpdateDeviceRows        = 0
    g_NoImportDeviceRows        = 0
    g_NoExportDeviceRows        = 0
    // 2007-2-15
    g_OtherDriverNeedImpNumber  = 0
    g_ImportedOtherDriverRows   = 0
    // 2007-2-16
    g_NoImportOtherDriverDeviceRows = 0

    // 2007-3-2
    // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
    g_RunningStatus = "Step=0 , Status=0 , Finish=0 ; "
    SetCookie( "eDrv_Param" , g_RunningStatus , 1 )


	DrvInst.EnumDevice(0);
	g_OSEnumDevFlag = 0;
	g_MaxDeviceIndex = DrvInst.DeviceIndex + 1;

    // 2007-2-13
    //
    // 下面的内容提到上面了
/*
    //2005-8-2
	//DisplayMessage("枚举设备驱动结束")
    //
    // 只有在用户第一次执行本程序而没有登录时，才进行登记用户和检测设备工作
    // 当用户点击“上一步”时，就不再执行上述操作
    //
    // 2006-10-15
    //
    if ( !g_UserID)
    {
        DisplayMessage("正在登记用户...");
        Title.innerHTML = '<br><center>正在登记用户...</center>'
        DrvCert.UIRefresh()

        var RetRegUserInfo = RegUserHardwareInfo()
        // 2007-2-12
        //RetRegUserInfo["Success"] = true
        //RetRegUserInfo["Info"]    = "登记用户请求成功,UserID=" + UserID 
        //RetRegUserInfo["UserID"]  = UserID
        //RetRegUserInfo["UserType"]  = UserType ( New / Old )
        // 2007-2-12
        //RetRegUserInfo["DownloadPath"]

        if ( !RetRegUserInfo["Success"] )
        {
            Title.innerHTML = '<br><center>登记用户请求失败<br>' + RetRegUserInfo["Info"] + '</center>'
            DrvCert.UIRefresh()
            return false
        }
        // 2007-2-12
        //
        // 如果登记用户成功，就将用户ID保存到全局cookie中
        g_UserID = RetRegUserInfo["UserID"]
        SetCookie( "UserID" , g_UserID , 1 )

        // 2007-2-12
        //
        // 如果是新用户，要自动为用户选择硬盘剩余空间最大的硬盘建立驱动下载缓冲区，并保存到服务器中
        // 如果是老用户，就从服务器中取回驱动下载缓冲区路径
        var DownloadPath = ""
        if ( ( RetRegUserInfo["UserType"].toUpperCase() == "NEW" )  || !RetRegUserInfo["DownloadPath"] )
        {
            DownloadPath = GetDownloadDrive() + "\\" + DOWNLOAD_PATH
            SubmitUserDownloadDriverPath( g_UserID , DownloadPath )
        }
        else
        {
            DownloadPath = RetRegUserInfo["DownloadPath"]
        }
        // 2007-2-7
        DrvInst.SetMyDriversRootDir( DownloadPath )
        
        // 如果是新用户，就需要让用户输入主机S/N号，并且保存到cookie中

        // 2006-9-20
        var DetectAllDeviceFlag = GetCookie( "DetectAllDevice" )
        if ( DetectAllDeviceFlag == "true" )
        {
            if ( RetRegUserInfo["UserType"] == "New" )
            {
                // 2005-8-2
                DisplayMessage("正在检测设备...");
                Title.innerHTML = '<br><center>正在检测设备...</center>'
                                + '<br>'
                                + '<table align=center id=PercentTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
                                + '<tr><td>'
                                + '  <IMG id="PercentImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
                                + '</td></tr></table>'
                                + '<div id=PercentString>&nbsp;</div>'
                DrvCert.UIRefresh()
                RegUserDeviceInfoList( g_UserID )
            }
        }

    }
*/
    // 2006-9-20
    //
    // 在枚举设备后，根据服务器端日志表的参数设置决定是否上传设备信息
    //
    var DetectAllDeviceFlag = GetCookie( "DetectAllDevice" )
    if ( DetectAllDeviceFlag == "true" )
    {
        // 2007-2-13
        //if ( RetRegUserInfo["UserType"] == "New" )
        {
            // 2005-8-2
            DisplayMessage("正在检测设备...");
            Title.innerHTML = '<br><center>正在检测设备...</center>'
                            + '<br>'
                            + '<table align=center id=PercentTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
                            + '<tr><td>'
                            + '  <IMG id="PercentImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
                            + '</td></tr></table>'
                            + '<div id=PercentString>&nbsp;</div>'
            DrvCert.UIRefresh()
            RegUserDeviceInfoList( g_UserID )
        }
    }
    // 2007-2-26 <<<.............................................................................................
    //
    // 保存用户的设备列表以及操作系统名称、版本
    //
    //
    if ( g_LogConfigInfo[ USER_DEVICE_OS_BROWSE_LOG_NAME ] == "true" )
    {
        DisplayMessage("正在保存用户设备/操作系统/浏览器信息到日志数据库..." )
        Title.innerHTML = '<br><center>正在保存用户信息到日志数据库...<br></center>'
                        + '<br>'
                        + '<table align=center id=PercentTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
                        + '<tr><td>'
                        + '  <IMG id="PercentImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
                        + '</td></tr></table>'
                        + '<div id=PercentString>&nbsp;</div>'
        DrvCert.UIRefresh()

        // 2007-11-12
        //
        // 由于反馈在登记完用户后界面长时间没有反应导致用户关闭窗口，因此决定在此添加更新进度条到30%的操作，同时
        // SubmitUserDeviceOSBrowseInfoLog()不再提交设备信息以减少CPU占用率
        PercentImg.width=PercentTbl.width*3/10
        PercentString.innerHTML = '<center>30%</center>'
        DrvCert.UIRefresh()

        //g_DeviceInfo,g_DeviceRows
        //var OsInfo = GetOSInfo()
        //var BrowseInfo = 
        // BrowseAppName  = navigator.appName           = "Microsoft Internet Explorer"
        // BrowseLanguage = navigator.browserLanguage   = "zh-cn"
        // BrowseUserAgent= navigator.userAgent         = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
        //                                                "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)"
        SubmitUserDeviceOSBrowseInfoLog( g_UserID , g_CaseID , g_DeviceInfo , g_DeviceRows , GetOSInfo() , navigator.userAgent )

        // 2007-3-2
        // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
        g_RunningStatus = "Step=0 , Status=1 , Finish=0 ; "
        SetCookie( "eDrv_Param" , g_RunningStatus , 1 )
    }
    //
    // 2007-2-26 .............................................................................................>>>


	DisplayMessage("正在获取驱动保护状态...");
    Title.innerHTML = '<br><center>正在获取驱动保护状态...<br></center>'
	                + '<br>'
					+ '<table align=center id=PercentTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
					+ '<tr><td>'
					+ '  <IMG id="PercentImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
					+ '</td></tr></table>'
					+ '<div id=PercentString>&nbsp;</div>'
	DrvCert.UIRefresh()

    // 2007-11-12
    PercentImg.width=PercentTbl.width*35/100
    PercentString.innerHTML = '<center>35%</center>'
    DrvCert.UIRefresh()

    // 2007-3-2
    // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
    g_RunningStatus += "Step=1 , Status=0 , Finish=0 ; "
    SetCookie( "eDrv_Param" , g_RunningStatus , 1 )
    
    // 2006-9-22
    //
    // 准备添加驱动一次查询功能，就是如果用户有21个用户类驱动设备（包括故障设备），以前的查询是一个设备进行一次驱动的服务器数据库查询，
    // 这种方式造成了像某些厂商这样大客户的易驱动服务器的可负载并发用户数的急剧减少，用runLoader工具的测试数据，100个用户并发访问使用了210s，
    // 而事实上这就相当于100*21（测试机器上的设备数）=2100个用户查询一次数据库的请求效果
    //
    // 为了解决这个问题，需要摒弃21个设备分别查询的方式，改为21个设备一起提出请求
    var CookieFlag = GetCookie( "SubmitAllDeviceInfoOneTime" )
	if ( ( CookieFlag == "true") || !CookieFlag )
    {

         GetDriverExportStatusFromDBEx( g_UserID ) 
    }
    else
    {
        // 通过有故障的设备信息数组获取设备的驱动导出状态

        GetDriverExportStatusFromDB( g_UserID )

    }

    g_UserExportedDriverRows = GetUserExportedDriverRows()
	UserIDTag.innerHTML =   '<table>'
                          + '<tr>'
                          + '<td>机器代码:</td><td>' + g_UserID + '&nbsp;&nbsp;&nbsp;<br></td>'
                          + '</tr>'
                          // 2006-11-9
                          //+ '<tr>'
                          //+ '<td>保护驱动:</td><td>' + ( g_UserExportedDriverRows ) + '&nbsp;&nbsp;&nbsp;<br></td>'
                          //+ '</tr>'
                          + '</table>'

    // 2006-8-21 <<<.....................................................
    //
    //DisplayMessage("正在进行安全性检查...");
    //Title.innerHTML = '<br><center>正在进行安全性检查...</center>'
    //DrvCert.UIRefresh()
    // 如果服务器证书无效
    //if ( !CheckDSPCertValid() ) return 2
    //DisplayMessage("安全性检查通过");
    //DrvCert.UIRefresh()
    //
    // 2006-8-21 .....................................................>>>

    Title.innerHTML = ''

    ListAllDevicesForImportUpdateDriver()
}
///////////////////////////////////////////////////////////////////////////////////
function ListAllDevicesForImportUpdateDriver()
{
	DeleteDeviceTable()
	CreateDeviceTable();

    // 2007-3-2
    // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
    g_RunningStatus += "Step=2 , Status=0 , Finish=0 ; "
    SetCookie( "eDrv_Param" , g_RunningStatus , 1 )

    // 2007-3-14
    oRow  = document.createElement("TR");
    oCell = document.createElement("TD");
    oCell.colSpan= g_maxcols
    oCell.innerHTML = "<span id=ListUpdateImportResultTag></span>"
    oRow.appendChild(oCell);
    g_oTBody0.appendChild(oRow);

	// 枚举完设备驱动后显示需要升级的驱动列表页，以供用户选择
	ListDriverForUpdate()

    // 枚举完设备驱动后显示需导入(包括不可导入)驱动列表页，以供用户选择
	ListDriverForImport()

    // 2007-2-14
    //
    ListOtherDriverForImport()

    // 2007-3-2
    if ( g_LogConfigInfo[ USER_DEVICE_ANALYSE_LOG_NAME ] == "true" )
    // 2007-3-12
    //if ( g_LogConfigInfo[ USER_DEVICE_ANALYSE_LOG_NAME ] )
    {
        SubmitDeviceAnalyseInfoLog( g_UserID , 
                                    g_CaseID , 
                                    g_DeviceForUpdateListArray    , g_DeviceForUpdateListArray["Rows"] ,
                                    g_DeviceForRepairListArray    , g_DeviceForRepairListArray["Rows"] ,
                                    g_DeviceCannotRepairListArray , g_DeviceCannotRepairListArray["Rows"] ,
                                    g_DeviceForOtherListArray     , g_DeviceForOtherListArray["Rows"] ,
                                    USER_DEVICE_ANALYSE_LOG_NAME )   // ItemC
    }


	// 枚举完设备驱动后显示需导出(包括不可导出)驱动列表页，以供用户选择要导出的驱动
	//ListDriverForExport()

    // 如果有需要导入/导出的驱动
    //if ( g_DevErrDeviceRows || g_DeviceRowsNeedExportDriver )
    // 2006-9-29
    // 如果有故障设备且有可修复的驱动或有需要升级的驱动
    //if ( g_DevErrDeviceRows || g_DeviceRowsNeedUpdateDriver )
    // 2007-2-16
    //if ( (g_DevErrDeviceRows && g_ExistCanRepairDevFlag ) || g_DeviceRowsNeedUpdateDriver )
    if ( (g_DevErrDeviceRows && g_ExistCanRepairDevFlag ) || g_DeviceRowsNeedUpdateDriver || g_OtherDriverListNumber )
    {
        oRow = document.createElement("TR");
        oCell = document.createElement("TD");
        oCell.colSpan= g_maxcols+1
        oCell.align = "center"
        oCell.innerHTML = "<br>"
                        //+ "<input type='button' value='上一步' onclick='javascript:DeleteDeviceTable();CreateDeviceTable();oTableContainer.align=\"center\";EnumDevice(1)'>"     //location.reload()
                        + "<input type='button' value='下一步' onclick='DriverImportUpdateProcedure()'>"

        oRow.appendChild(oCell);
        g_oTBody0.appendChild(oRow);

        // 2007-3-2
        // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
        g_RunningStatus += "Step=2 , Status=1 , Finish=0 ; "
        SetCookie( "eDrv_Param" , g_RunningStatus , 1 )
    }
    // 2006-9-29
    // 如果只有不能修复的驱动,就不显示下一步了
    else if ( !g_ExistCanRepairDevFlag && g_ExistCannotRepairDevFlag )
    {
        oRow = document.createElement("TR");
        oCell = document.createElement("TD");
        oCell.colSpan= g_maxcols+1
        oCell.align = "center"
        // 2007-3-2
        //g_LogConfigInfo["RetUrlRows"                ] = n
        //g_LogConfigInfo[ i + ",RetUrlItemName"      ] = "ItemA"
        //g_LogConfigInfo[ i + ",RetUrlItemCaller"    ] = "WSS"
        //g_LogConfigInfo[ i + ",RetUrlSetting"       ] = "http://..."
        //g_LogConfigInfo[ i + ",RetUrlDesc"          ]
        //g_LogConfigInfo[ "RetUrlItemA" ] = 0 //[0...n]
        // 2007-3-3
        //if ( g_LogConfigInfo[ "RetUrlItemC" ] )
        if ( g_LogConfigInfo[ "RetUrlItemC" ] != undefined )
        {
            oCell.innerHTML = "<br>"
                            // 2007-3-3
                            + "<input type='button' value='下一步' onclick='window.opener.location=\"" + g_LogConfigInfo[ g_LogConfigInfo[ "RetUrlItemC" ] + ",RetUrlSetting" ] + "?wssret=211\";window.close()'>"
        }
        else
        {
            oCell.innerHTML = "<br>"
                        //+ "<input type='button' value='上一步' onclick='javascript:DeleteDeviceTable();CreateDeviceTable();oTableContainer.align=\"center\";EnumDevice(1)'>"     //location.reload()
                        //+ "<input type='button' value='下一步' onclick='DriverImportUpdateProcedure()'>"
                        //+ "已经检查了" + g_MaxDeviceIndex + "个设备驱动。<br>发现" + g_ExistCannotRepairDevFlag + "设备驱动故障无法修复。"
                        // 2006-10-15
                        // + "<br><br><br><center><input type='button' value='完  成' onclick='window.close()'></center>"
                        // 2006-11-8
       					// + "<input type='button' value='下一步' onclick='if ( this.value == \"完  成\" ) { window.close() ; return false; }; window.open( \"Comment.htm\" );this.value=\"完  成\"'>"
                        //+ "<br><br><br><center><input type='button' value='完  成' onclick='window.close();return false;'></center>"
                        //Robin 2006-12-1
                        + "<br><br><br><center><input type='button' value='意见建议' onclick='window.open(\"Comment.htm\"); return false;'></center>"
        }

        oRow.appendChild(oCell);
        g_oTBody0.appendChild(oRow);

        // 2007-3-2
        // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
        g_RunningStatus += "Step=2 , Status=1 , Finish=1 ; "
        SetCookie( "eDrv_Param" , g_RunningStatus , 1 )
        // 2007-3-3
    	//DisplayMessage("运行状态参数：" + g_RunningStatus );

    }
    else
    {
        oRow = document.createElement("TR");
        oCell = document.createElement("TD");
        oCell.colSpan= g_maxcols+1
        oCell.align = "center"
        // 2007-3-2
        //g_LogConfigInfo["RetUrlRows"                ]
        //g_LogConfigInfo[ i + ",RetUrlItemName"      ] = "ItemA"
        //g_LogConfigInfo[ i + ",RetUrlItemCaller"    ] = "WSS"
        //g_LogConfigInfo[ i + ",RetUrlSetting"       ] = "http://..."
        //g_LogConfigInfo[ i + ",RetUrlDesc"          ]
        //g_LogConfigInfo[ "RetUrlItemA" ] = 3
        // 2007-3-3
        // if ( g_LogConfigInfo[ "RetUrlItemC" ] )
        if ( g_LogConfigInfo[ "RetUrlItemC" ] != undefined )
        {
            oCell.innerHTML = "<br>"
                            // 2007-3-3
                            + "已经检查了" + g_MaxDeviceIndex + "个设备驱动。<br>您的机器目前工作状态正常，没有发现任何设备驱动故障。"
                            // 2007-3-3
                            + "<br><br><br><center><input type='button' value='下一步' onclick='window.opener.location=\"" + g_LogConfigInfo[ g_LogConfigInfo[ "RetUrlItemC" ] + ",RetUrlSetting" ] + "?wssret=211\";window.close()'></center>"
        }
        else
        {
            oCell.innerHTML = "<br>"
                        // 2006-8-29
                        // + "已经检查了" + g_MaxDeviceIndex + "个设备驱动，" + g_UserExportedDriverRows + "个驱动已经保护。<br>您的机器目前工作状态正常，没有发现任何设备驱动故障。"
                        + "已经检查了" + g_MaxDeviceIndex + "个设备驱动。<br>您的机器目前工作状态正常，没有发现任何设备驱动故障。"
                        // 2006-11-8
                        // + "<br><br><br><center><input type='button' value='评  价' onclick='if ( this.value == \"完  成\" ) { window.close();return false;}; window.open( \"Comment.htm\" );this.value=\"完  成\"'></center>"
                        //+ "<br><br><br><center><input type='button' value='完  成' onclick='window.close();return false;'></center>"
                        // Robin 2006-12-1
                        + "<br><br><br><center><input type='button' value='意见建议' onclick='window.open(\"Comment.htm\"); return false;'></center>"
        }
        oRow.appendChild(oCell);
        g_oTBody0.appendChild(oRow);

        // 2007-3-2
        // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
        g_RunningStatus += "Step=2 , Status=1 , Finish=1 ; "
        SetCookie( "eDrv_Param" , g_RunningStatus , 1 )
        // 2007-3-3
    	//DisplayMessage("运行状态参数：" + g_RunningStatus );
    }
   oTableContainer.align="center"

}
///////////////////////////////////////////////////////////////////////////////////
function ApplyMsgEvent()
{
	if (!g_ifDisplayInternalErrorInfo) return 0;

	if (DrvInst.InitExitCode == 0) 
	{ 
		//InputDataBox3.value =	" scrollTop"	+ InputDataBox4.scrollTop + 
		//						" scrollHeight"	+ InputDataBox4.scrollHeight; 
		DisplayMessage(DrvInst.StatusString);
	} 
	else 
	{ 
		DisplayMessage(DrvInst.StatusString + "(code: 0x000" + DrvInst.InitExitCode.toString(16)  + ")");
	} 
}
///////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////
function CreateDeviceTable()
{
	var oRow, oCell;
	var i, j;
	
	// Declare stock data that would normally be imported from a stock Web site.
	var heading = new Array;
	//heading[0] = "<a style='font-size: 12px;font-family: 宋体;'>编号</a>";
	//heading[1] = "<a style='font-size: 12px;font-family: 宋体;'>内部代号</a>";
	//heading[2] = "<a style='font-size: 12px;font-family: 宋体;'>备份</a>";
	//heading[3] = "<a style='font-size: 12px;font-family: 宋体;'>隐含</a>";
	//heading[4] = "<a style='font-size: 12px;font-family: 宋体;'>状态</a>";
	//heading[5] = "<a style='font-size: 12px;font-family: 宋体;'>故障</a>";
	//heading[6] = "<a style='font-size: 12px;font-family: 宋体;'>类别</a>";
	//heading[7] = "<a style='font-size: 12px;font-family: 宋体;'>&nbsp;&nbsp;设备名</a>";
	heading[0] = heading[1] = heading[2] = heading[3] = heading[4] = heading[5] = heading[6] = heading[7] = "";

	// Declare variables and create the header, footer, and caption.
	g_oTable		= document.createElement("TABLE");
	var oTHead	    = document.createElement("THEAD");
	g_oTBody0		= document.createElement("TBODY");
	var oTFoot	    = document.createElement("TFOOT");
	var oCaption    = document.createElement("CAPTION");


	// Insert the created elements into g_oTable.
	g_oTable.appendChild(oTHead);
	g_oTable.appendChild(g_oTBody0);
	g_oTable.appendChild(oTFoot);
	g_oTable.appendChild(oCaption);

	// Set the table's border width and colors.
	// border="1"  bordercolorlight="#FFFFFF" bordercolordark="#C0C0C0"
	// bordercolor="#FF0000" bgcolor="#D6D63A" cellspacing="0" cellpadding="0"
	g_oTable.border     ="0";
	g_oTable.cellspacing="0";
	g_oTable.cellpadding="0";
	//g_oTable.bordercolordark="lemonchiffon";
	//g_oTable.bordercolorlight="lemonchiffon";
	//g_oTable.bgColor="lemonchiffon";
	//g_oTable.bgColor="#D6D63A";
	g_oTable.ID="DeviceTable";

	// Insert a row into the header and set its background color.
	oRow = document.createElement("TR");
	oTHead.appendChild(oRow);
	//oTHead.bgColor = "lightskyblue";
	//oTHead.bgColor = "lemonchiffon";

	// Create and insert cells into the header row.
	for (i=g_mincols; i<g_maxcols; i++)
	{
	  oCell = document.createElement("TD");
	  //oCell.innerHTML = heading[i];
	  oCell.innerHTML = "";
	  //if (i%7 == 0) oCell.align		= "left";
	  oRow.appendChild(oCell);
	}

	// Create and insert rows and cells into the footer row.
	oRow = document.createElement("TR");
	oTFoot.appendChild(oRow);

	oCell = document.createElement("TD");
	oRow.appendChild(oCell);

	oCell.innerText = "";// 这里是表格的底部.
	oCell.align		= "center";
	oCell.colSpan = g_maxcols;
	//oCell.bgColor = "lightskyblue";
	//oCell.bgColor = "lemonchiffon";

	// Set the innerText of the caption and position it at the bottom of the table.
	oCaption.innerText = "";// 使用Document Object Model建立的TABLE.
	oCaption.style.fontSize = "10";
	oCaption.align = "bottom";

	// Insert the table into the document tree.
	oTableContainer.appendChild(g_oTable);
}
///////////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////////
function DeleteDeviceTable()
{
	if (g_oTable)	g_oTable.removeNode(true);
    oTableContainer.innerHTML= ""
}
///////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////
//
// 注意：在该函数中不能进行任何DrvInst类的调用！
//	     否则，会出现超时。
//
///////////////////////////////////////////////////////////////////////////////////
function ImpExpApplyEnumDeviceEvent()
{
	var oRow, oCell;
	var j;
	var stock = new Array;

    // 2006-10-3
    //
    // 不允许操作系统枚举标志，以避免由于安装驱动造成的设备枚举对下一步取装备状态造成的干扰
    if ( g_OSEnumDevFlag )
    {
		DisplayMessage("Windows正在安装设备驱动")
		DisplayMessage("设备枚举将被推迟，请稍候...");
		return 2
    }

	// 设备表的项目数+1
	//g_TableItems++;

    // 从DrvInst.dll读取枚举到的设备信息到stock[i]
	GetDeviceInfoToArray(stock);

    
    SaveDeviceInfoToArray(stock,g_DeviceInfo,g_DeviceRows);
    g_DeviceRows ++;

    // 如果设备当前状态为正常（没有故障）且是系统安装的驱动（不用户安装的驱动）
	if ( !stock[5] && !(stock[7] & 0x00080000) )
	{
		// 将设备信息保存到全局变量数组g_NormalSystemDeviceInfoArray的第g_NormalSystemDeviceRows行数组中
		SaveDeviceInfoToArray(stock,g_NormalSystemDeviceInfoArray,g_NormalSystemDeviceRows);
	
		g_NormalSystemDeviceRows ++;

		return 0;
	}
	

	// 执行到这里，设备一定有故障或驱动是用户安装的

	// 如果驱动有备份（驱动一定是用户安装的）且设备没有故障
	//if ( (!(stock[7] & 0x00000010)) && !stock[5] )
	// 如果驱动没有故障(一般是设备驱动需要升级的情况)
	if ( !stock[5] )
	{
        //// 设备信息保存到g_UserDrvDeviceInfoArray数组的第g_UserDrvDeviceRows行
        //SaveDeviceInfoToArray(stock , g_UserDrvDeviceInfoArray , g_UserDrvDeviceRows);
        //// 置用户却省选择驱动导出
        //g_UserDrvDeviceInfoArray[ g_UserDrvDeviceRows + ',21']= true
        //// 当前设备数+1
        //g_UserDrvDeviceRows ++

        // 2006-9-30
        if (      // 如果需要升级的驱动设备类别是网卡（这类设备正在使用，安装驱动会导致不可用）
                 ( !stock[5]  && stock[2] == 23 ) 
                  // 如果需要升级的驱动设备匹配ID是*pnp????的形式
                  || (  stock[10] && stock[10].match( /\*PNP.+/gi ) )
            )
        {
            // 将设备信息保存到全局变量数组g_NormalSystemDeviceInfoArray的第g_NormalSystemDeviceRows行数组中
            SaveDeviceInfoToArray(stock,g_NormalSystemDeviceInfoArray,g_NormalSystemDeviceRows);
            g_NormalSystemDeviceRows ++;
        }
        else
        {
            // 设备信息保存到g_UserDrvDeviceInfoArray数组的第g_UserDrvDeviceRows行
            SaveDeviceInfoToArray(stock , g_UserDrvDeviceInfoArray , g_UserDrvDeviceRows);
            // 2007-3-10
            //
            // 如果这里设置参数缺省值，会导致没有选中的其他用户类驱动也会被安装
            //
            //// 置用户却省选择驱动导出
            //g_UserDrvDeviceInfoArray[ g_UserDrvDeviceRows + ',21']= true
            // 当前设备数+1
            g_UserDrvDeviceRows ++
        }
	}
	// 如果设备有问题或驱动没有备份（该可能不存在，这里只是逻辑上的可能性，因为在程序一开始的枚举操作中却省要对用户安装
    // 的驱动进行备份，无论备份是否成功，备份状态字都被设置为“驱动程序已备份”）
	else
	{
        // 2006-5-16 <<<.................................................................................................
        //
        // // 设备信息保存到g_UserDrvDeviceInfoArray数组的第g_UserDrvDeviceRows行
        // SaveDeviceInfoToArray(stock , g_DevErrDeviceInfoArray , g_DevErrDeviceRows);
        // g_DevErrDeviceInfoArray[ g_DevErrDeviceRows + ',21']= true
        // g_DevErrDeviceRows ++
        //
        // 如果有问题设备是隐含设备，就不处理，因为发现这些故障其实是核心态程序类软件的故障，不属于与硬件有关的驱动故障
        // 范畴,另外，据某些厂商的反馈，这些故障既无法修复、又会引起用户不必要的疑问,因此，程序将不再处理这类故障。
        if ( stock[3] )
        {
            // 将设备信息保存到全局变量数组g_NormalSystemDeviceInfoArray的第g_NormalSystemDeviceRows行数组中
            // 2007-3-1
            //SaveDeviceInfoToArray(stock,g_NormalSystemDeviceInfoArray,g_NormalSystemDeviceRows);
            //g_NormalSystemDeviceRows ++;
        }
        // 2006-9-27 <<<.................................................................................................
        //
        // 如果设备故障是: 设备被禁用或者设备被拔出,
        //else if ( stock[5] == 22 || stock[5] == 39 
        //            // 2006-9-29 <<<.........................................................
        //            || ( stock[5] == 24 || stock[5] == 25 || stock[5] == 29 )
        //            || ( !stock[5] && stock[2] == 23 )
        //            || ( stock[10] && stock[10].match(/\*pnp????/i) )
        //            || ( stock[8]  && stock[8].match(/\*pnp????;/i) )
        //        )
        // 2006-9-29 .........................................................>>>
        // 如果设备故障是: 设备被禁用或者设备被拔出,
        // 就不需要处理。因为这类设备故障一般是由于CMOS设置或用户设备造成的，跟驱动无关。
        else if ( stock[5] == 22 || stock[5] == 39 
                  // 24 设备不存在 / 25 设备已经不存在 / 29 硬件被禁止 
                  || stock[5] == 24 || stock[5] == 25 || stock[5] == 29 
                  // 如果需要升级的驱动设备类别是网卡（这类设备正在使用，安装驱动会导致不可用）
                  || ( !stock[5]  && stock[2] == 23 ) 
                  // 2007-3-1
                  //// 如果需要升级的驱动设备匹配ID是*pnp????的形式
                  //|| (  stock[10] && stock[10].match( /\*PNP.+/gi ) )   
                  //// 如果需修复/升级的驱动设备HardwareID包括*pnp????;
                  //|| (  stock[8]  && stock[8].match(  /\*PNP.+/gi) ) 
                )
        {
            // 将设备信息保存到全局变量数组g_NormalSystemDeviceInfoArray的第g_NormalSystemDeviceRows行数组中
            // 2007-3-1
            //
            // 这些故障信息将被忽略
            //
            //SaveDeviceInfoToArray(stock,g_NormalSystemDeviceInfoArray,g_NormalSystemDeviceRows);
            //g_NormalSystemDeviceRows ++;
        }
        //
        // 2006-9-27 .................................................................................................>>>
        else
        {

            // 设备信息保存到g_UserDrvDeviceInfoArray数组的第g_UserDrvDeviceRows行
            SaveDeviceInfoToArray(stock , g_DevErrDeviceInfoArray , g_DevErrDeviceRows);
            // 2007-3-10
            //g_DevErrDeviceInfoArray[ g_DevErrDeviceRows + ',21']= true

            g_DevErrDeviceRows ++
        }
        // 2006-5-16 .................................................................................................>>>
	}

	// 执行到这里，设备一定有故障或驱动是用户安装的

	// 如果设备当前状态是有故障（无论驱动是否是用户安装的）
	//if ( stock[5] )
	//{
	//	    设备信息保存到g_DevErrDeviceInfoArray数组的第g_NormalSystemDeviceRowsNeedImportDriver行
	//	    SaveDeviceInfoToArray(stock , g_DevErrDeviceInfoArray , g_DevErrDeviceRows);
    //      置用户却省选择驱动导入标志
	//	    g_DevErrDeviceInfoArray[ g_DevErrDeviceRows + ',21']= true
    //      g_DevErrDeviceRows ++
	//}
	// 执行到这里，驱动是用户安装的（且设备当前状态一定是没有故障）
	//else
	//{
	//	    设备信息保存到g_UserDrvDeviceInfoArray数组的第g_UserDrvDeviceRows行
	//	    SaveDeviceInfoToArray(stock , g_UserDrvDeviceInfoArray , g_UserDrvDeviceRows);
	//	    g_UserDrvDeviceRows ++
	//}


}
////////////////////////////////////////////////////////////////////
function SaveDeviceInfoToArray(DeviceInfo,SavetoArray,row)
{
	SavetoArray[row + ",0"  ] = g_DeviceRows;
	SavetoArray[row + ",1"  ] = DeviceInfo[1];
	SavetoArray[row + ",2"  ] = DeviceInfo[2];
	SavetoArray[row + ",3"  ] = DeviceInfo[3];
	SavetoArray[row + ",4"  ] = DeviceInfo[4];
	SavetoArray[row + ",5"  ] = DeviceInfo[5];
	SavetoArray[row + ",6"  ] = DeviceInfo[6];
	SavetoArray[row + ",7"  ] = DeviceInfo[7];
	SavetoArray[row + ",8"  ] = DeviceInfo[8];
	SavetoArray[row + ",9"  ] = DeviceInfo[9];
	SavetoArray[row + ",10" ] = DeviceInfo[10];
	SavetoArray[row + ",11" ] = DeviceInfo[11];
	SavetoArray[row + ",12" ] = DeviceInfo[12];
	SavetoArray[row + ",13" ] = DeviceInfo[13];
    // 2006-8-26
	if (DeviceInfo["LockHandle"])  
        SavetoArray[row + ",LockHandle" ] = DeviceInfo["LockHandle"];
    // 2007-2-9
	SavetoArray[row + ",14" ] = DeviceInfo[14];
}
function ReadArrayToDeviceInfo(DeviceInfo,ReadToArray,row)
{
	DeviceInfo[0]  = ReadToArray[row + ",0"  ] ;
	DeviceInfo[1]  = ReadToArray[row + ",1"  ] ;
	DeviceInfo[2]  = ReadToArray[row + ",2"  ] ;
	DeviceInfo[3]  = ReadToArray[row + ",3"  ] ;
	DeviceInfo[4]  = ReadToArray[row + ",4"  ] ;
	DeviceInfo[5]  = ReadToArray[row + ",5"  ] ;
	DeviceInfo[6]  = ReadToArray[row + ",6"  ] ;
	DeviceInfo[7]  = ReadToArray[row + ",7"  ] ;
	DeviceInfo[8]  = ReadToArray[row + ",8"  ] ;
	DeviceInfo[9]  = ReadToArray[row + ",9"  ] ;
	DeviceInfo[10] = ReadToArray[row + ",10" ] ;
	DeviceInfo[11] = ReadToArray[row + ",11" ] ;
	DeviceInfo[12] = ReadToArray[row + ",12" ] ;
	DeviceInfo[13] = ReadToArray[row + ",13" ] ;
    // 2006-8-26
	if (ReadToArray[ row + ",LockHandle" ])  
        DeviceInfo["LockHandle"] = ReadToArray[ row + ",LockHandle" ]
    // 2007-2-4
	DeviceInfo[14] = ReadToArray[row + ",14" ];
}
function GetDeviceInfoToArray(DeviceInfo)
{
	DeviceInfo[0]  = 0;
	DeviceInfo[1]  = DrvInst.DeviceIndex;
	DeviceInfo[2]  = DrvInst.DeviceClassID;
	DeviceInfo[3]  = DrvInst.DeviceClassType;
	DeviceInfo[4]  = DrvInst.DeviceStatus;
	DeviceInfo[5]  = DrvInst.DeviceProblem;
	DeviceInfo[6]  = DrvInst.DeviceName;
	DeviceInfo[7]  = DrvInst.BackupDriverStatus;
	DeviceInfo[8]  = DrvInst.HardwareID;
	DeviceInfo[9]  = DrvInst.CompatibleID;
	DeviceInfo[10] = DrvInst.MatchingDeviceID;
	DeviceInfo[11] = DrvInst.DriverDate;
	DeviceInfo[12] = DrvInst.DriverVer;
	DeviceInfo[13] = DrvInst.DriverProvider;
    // 2007-2-4
	DeviceInfo[14] = DrvInst.DriverInfFilename;
}

////////////////////////////////////////////////////////////////////
function TranslateDeviceInfoToArray(DeviceInfo,OrgDeviceInfo,CurrentRow,ItemNumber)
{ 
	var devStatNumbers = 32 ; //设备状态数
	var j;
	
	var deviceClass = new Array;
	var deviceClassImg = new Array;
				 
				 
	deviceClass[ 1] = "电池";		            deviceClassImg[ 1] = "power.gif";			//"电源";		                         
	deviceClass[ 2] = "DVD/CD_ROM驱动器";       deviceClassImg[ 2] = "CDROM.gif";			//"DVD/CD_ROM驱动器";                     
	deviceClass[ 3] = "磁盘驱动器";	            deviceClassImg[ 3] = "minidisk.gif";		//"磁盘驱动器";	                         
	deviceClass[ 4] = "显示卡";                 deviceClassImg[ 4] = "card.gif";			//"显示卡"                                
	deviceClass[ 5] = "软盘控制器";             deviceClassImg[ 5] = "floppy.gif"; 			//"软盘控制器";                            
	deviceClass[ 6] = "软盘驱动器";             deviceClassImg[ 6] = "floppy.gif";			//"软盘驱动器";                            
	deviceClass[ 7] = "IDE/ATA/ATAPI控制器";    deviceClassImg[ 7] = "minidisk.gif"; 		//"IDE/ATA/ATAPI控制器";                  
	deviceClass[ 8] = "人体学输入设备";         deviceClassImg[ 8] = "hardware.gif";		//"HID设备"                               
	deviceClass[ 9] = ".4设备";                 deviceClassImg[ 9] = "hardware.gif";		//".4设备";                               
	deviceClass[10] = ".4打印设备";             deviceClassImg[10] = "hardware.gif";		//".4打印设备";                            
	deviceClass[11] = "IEEE-1394总线主控制器";; deviceClassImg[11] = "hardware.gif";		//"1394设备";;                            
	deviceClass[12] = "图像处理设备";           deviceClassImg[12] = "scanner.gif";			//"图像设备";                              
	deviceClass[13] = "红外设备";               deviceClassImg[13] = "Ir.gif";				//"红外线设备";                            
	deviceClass[14] = "键盘";                   deviceClassImg[14] = "keyboard.gif";		//"键盘";                                 
	deviceClass[15] = "介质变换器";             deviceClassImg[15] = "media.gif";			//"媒体转换设备";                          
	deviceClass[16] = "内存技术驱动程序-MTD";   deviceClassImg[16] = "chip.GIF";			//"内存技术驱动程序-MTD";                   
	deviceClass[17] = "调制解调器";             deviceClassImg[17] = "modem.gif";			//"调制解调器";                            
	deviceClass[18] = "监视器";                 deviceClassImg[18] = "monitor.gif";			//"显示器";                               
	deviceClass[19] = "鼠标和其它指针设备";     deviceClassImg[19] = "mouse.gif";			//"鼠标和其它指针设备";                     
	deviceClass[20] = "多功能卡";               deviceClassImg[20] = "hardware.gif";		//"多功能设备";                            
	deviceClass[21] = "声音,视频和游戏控制器";  deviceClassImg[21] = "sound.gif";			//"声音,视频和游戏控制器";                  
	deviceClass[22] = "多串口卡";               deviceClassImg[22] = "multiport.gif";		//"多端口串行设备";                        
	deviceClass[23] = "网络设备";               deviceClassImg[23] = "network.gif";			//"网络设备";                              
	deviceClass[24] = "网络客户";               deviceClassImg[24] = "network.gif";			//"网络客户";                              
	deviceClass[25] = "网络服务";               deviceClassImg[25] = "network.gif";			//"网络服务";                              
	deviceClass[26] = "网络协议";               deviceClassImg[26] = "network.gif";			//"网络协议";                              
	deviceClass[27] = "PCMCIA卡";               deviceClassImg[27] = "hardware.gif";		//"PCMCIA";                              
	deviceClass[28] = "端口(COM和LPT)";         deviceClassImg[28] = "port.gif";			//"端口";                                 
	deviceClass[29] = "打印机";                 deviceClassImg[29] = "printer.gif";			//"打印机";                               
	deviceClass[30] = "即插即用打印机";         deviceClassImg[30] = "printer.gif";			//"即插即用打印机";                        
	deviceClass[31] = "处理器";                 deviceClassImg[31] = "cpu.gif";				//"处理器";                               
	deviceClass[32] = "SCSI和RAID控制器";       deviceClassImg[32] = "scsi.gif";			//"SCSI适配器";                           
	deviceClass[33] = "智能卡阅读器";           deviceClassImg[33] = "hardware.gif";		//"智能卡阅读器";                          
	deviceClass[34] = "存储卷";                 deviceClassImg[34] = "minidisk.gif";		//"存储卷";                               
	deviceClass[35] = "系统设备";               deviceClassImg[35] = "system.gif";			//"系统设备";                              
	deviceClass[36] = "磁带驱动器";             deviceClassImg[36] = "tape.gif";			//"磁带设备";                              
	deviceClass[37] = "通用串行总线设备";       deviceClassImg[37] = "usb.gif";				//"通用串行总线设备";                       
	deviceClass[38] = "适配器";                 deviceClassImg[38] = "card.gif";			//"适配器";                               
	deviceClass[39] = "高级电源管理支持";       deviceClassImg[39] = "hardware.gif";		//"高级电源管理支持";                       
	deviceClass[40] = "蓝牙设备";               deviceClassImg[40] = "hardware.gif";		//"蓝牙设备";                              
	deviceClass[41] = "计算机";                 deviceClassImg[41] = "computer.gif";		//"计算机";                               
	deviceClass[42] = "解码器";                 deviceClassImg[42] = "system.gif";			//"解码器";                               
	deviceClass[43] = "全球定位系统";           deviceClassImg[43] = "hardware.gif";		//"全球定位系统";                          
	deviceClass[44] = "无驱动设备";             deviceClassImg[44] = "nonpnp.gif";			//"无驱动设备";                            
	deviceClass[45] = "非即插即用驱动程序";     deviceClassImg[45] = "nonpnp.gif";			//"传统驱动程序";                          
	deviceClass[46] = "未知设备";               deviceClassImg[46] = "unknown.gif";			//"未知设备";                              
	deviceClass[47] = "打印机升级";             deviceClassImg[47] = "printer.gif";			//"打印机升级";                            
	deviceClass[48] = "声音、视频和游戏控制器"; deviceClassImg[48] = "game.gif";			//"声音、视频和游戏控制器";                  

	var DevStatusFlags  = new Array;

	
	var DevStatusString = new Array;

	DevStatusFlags[ 1] = 0x00000001 ;DevStatusString[ 1] = "由根设备枚举到";						// Was enumerated by ROOT           
	DevStatusFlags[ 2] = 0x00000002 ;DevStatusString[ 2] = "设备驱动程序已经注册";					// Has Register_Device_Driver      
	DevStatusFlags[ 3] = 0x00000004 ;DevStatusString[ 3] = "设备枚举器已经注册";					// Has Register_Enumerator          
	DevStatusFlags[ 4] = 0x00000008 ;DevStatusString[ 4] = "已经正确配置并启动";					// Is currently configured          
	DevStatusFlags[ 5] = 0x00000010 ;DevStatusString[ 5] = "由菜单方式安装";						// Manually installed               
	DevStatusFlags[ 6] = 0x00000020 ;DevStatusString[ 6] = "需要重新枚举";							// May need reenumeration          
	DevStatusFlags[ 7] = 0x00000040 ;DevStatusString[ 7] = "已经接受过配置(非第一次安装)";			// Has received a config           
	DevStatusFlags[ 8] = 0x00000080 ;DevStatusString[ 8] = "枚举产生硬件标识";						// Enum generates hardware ID       
	DevStatusFlags[ 9] = 0x00000100 ;DevStatusString[ 9] = "需要重新启动机器以使设置生效";			// Lied about can reconfig once     
	DevStatusFlags[10] = 0x00000200 ;DevStatusString[10] = "非最近的CM_Create_DevInst";			    // Not CM_Create_DevInst lately     
	DevStatusFlags[11] = 0x00000400 ;DevStatusString[11] = "设备有问题";					        // Need device installer            
	DevStatusFlags[12] = 0x00000800 ;DevStatusString[12] = "已经过滤过";							// Is filtered                      
	DevStatusFlags[13] = 0x00001000 ;DevStatusString[13] = "已经被移走";							// Has been moved                   
	DevStatusFlags[14] = 0x00002000 ;DevStatusString[14] = "该设备支持设备禁用/启用功能";			// Can be rebalanced                  
	DevStatusFlags[15] = 0x00004000 ;DevStatusString[15] = "可以被删除";							// Can be removed                   
	DevStatusFlags[16] = 0x00008000 ;DevStatusString[16] = "有一个私有问题";						// Has a private problem            
	DevStatusFlags[17] = 0x00010000 ;DevStatusString[17] = "多功能父设备";							// Multi function parent           
	DevStatusFlags[18] = 0x00020000 ;DevStatusString[18] = "多功能子设备";							// Multi function child            
	DevStatusFlags[19] = 0x00040000 ;DevStatusString[19] = "设备实例正在被删除";					// DevInst is being removed         
	DevStatusFlags[20] = 0x00080000 ;DevStatusString[20] = "已经接受过配置(非第一次安装)";			// S: Has received a config enumerate                        
	DevStatusFlags[21] = 0x00100000 ;DevStatusString[21] = "当子设备停止时释放资源";				// S: When child is stopped, free resources                   
	DevStatusFlags[22] = 0x00200000 ;DevStatusString[22] = "不能跳过恢复被停用设备的过程";			// S: Don't skip during rebalance                           
	DevStatusFlags[23] = 0x00400000 ;DevStatusString[23] = "该设备的log_confs不能有同样的资源";		// S: This devnode's log_confs do not have same resources    
	DevStatusFlags[24] = 0x00800000 ;DevStatusString[24] = "";//"该设备结点是一个NT枚举器";			// S: This devnode's is an NT enumerator                           
	DevStatusFlags[25] = 0x01000000 ;DevStatusString[25] = "";//"该设备结点是一个NT驱动程序";		// S: This devnode's is an NT driver                              
	DevStatusFlags[26] = 0x02000000 ;DevStatusString[26] = "设备结点需要锁定处理";					// S: Devnode need lock resume processing                  
	DevStatusFlags[27] = 0x04000000 ;DevStatusString[27] = "设备结点是一个可唤醒设备";				// S: Devnode can be the wakeup device                      
	DevStatusFlags[28] = 0x08000000 ;DevStatusString[28] = "高级电源管理已知的枚举器";				// S: APM aware enumerator                                  
	DevStatusFlags[29] = 0x10000000 ;DevStatusString[29] = "高级电源管理已知的驱动程序";			// S: APM aware driver                                     
	DevStatusFlags[30] = 0x20000000 ;DevStatusString[30] = "无界面方式安装的";                      // S: Silent install                                        
	DevStatusFlags[31] = 0x40000000 ;DevStatusString[31] = "不在设备管理程序中显示的设备";			// S: No show in device manager                             
	DevStatusFlags[32] = 0x80000000 ;DevStatusString[32] = "在启动时出现预设定问题";				// S: Had a problem during preassignment of boot log conf  

    // 2006-8-27
    // call by CM_Get_DevNode_Status
    // include by cfg.h
    //
    var DevProblem = new Array;
	DevProblem[" 1,1"]	= 0x00000001;  DevProblem[" 2,1"]  = "设备没有安装驱动程序";
	DevProblem[" 1,2"]	= 0x00000002;  DevProblem[" 2,2"]  = "该设备加载失败";
	DevProblem[" 1,3"]	= 0x00000003;  DevProblem[" 2,3"]  = "内存溢出";
	DevProblem[" 1,4"]	= 0x00000004;  DevProblem[" 2,4"]  = "入口是错误的类型";
	DevProblem[" 1,5"]	= 0x00000005;  DevProblem[" 2,5"]  = "缺乏仲裁";
	DevProblem[" 1,6"]	= 0x00000006;  DevProblem[" 2,6"]  = "引导时配置冲突";
	DevProblem[" 1,7"]	= 0x00000007;  DevProblem[" 2,7"]  = "过滤程序失败";
	DevProblem[" 1,8"]	= 0x00000008;  DevProblem[" 2,8"]  = "没有找到设备加载程序";
	DevProblem[" 1,9"]	= 0x00000009;  DevProblem[" 2,9"]  = "无效数据";
	DevProblem[" 1,10"] = 0x0000000A;  DevProblem[" 2,10"] = "安装了错误的驱动，设备无法启动";
	DevProblem[" 1,11"] = 0x0000000B;  DevProblem[" 2,11"] = "说谎者";
	DevProblem[" 1,12"] = 0x0000000C;  DevProblem[" 2,12"] = "一般冲突";
	DevProblem[" 1,13"] = 0x0000000D;  DevProblem[" 2,13"] = "未校验错";
	DevProblem[" 1,14"] = 0x0000000E;  DevProblem[" 2,14"] = "需要重新启动";
	DevProblem[" 1,15"] = 0x0000000F;  DevProblem[" 2,15"] = "重新枚举问题";
	DevProblem[" 1,16"] = 0x00000010;  DevProblem[" 2,16"] = "部分的LOG配置";
	DevProblem[" 1,17"] = 0x00000011;  DevProblem[" 2,17"] = "未知资源";
	DevProblem[" 1,18"] = 0x00000012;  DevProblem[" 2,18"] = "重新安装时的故障";
	DevProblem[" 1,19"] = 0x00000013;  DevProblem[" 2,19"] = "注册表问题";           
	DevProblem[" 1,20"] = 0x00000014;  DevProblem[" 2,20"] = "VxD加载程序问题";      
	DevProblem[" 1,21"] = 0x00000015;  DevProblem[" 2,21"] = "设备将要被删除";        
	DevProblem[" 1,22"] = 0x00000016;  DevProblem[" 2,22"] = "设备被禁用";        
	DevProblem[" 1,23"] = 0x00000017;  DevProblem[" 2,23"] = "设备加载程序没有准备好"; 
	DevProblem[" 1,24"] = 0x00000018;  DevProblem[" 2,24"] = "设备不存在";           
	DevProblem[" 1,25"] = 0x00000019;  DevProblem[" 2,25"] = "设备已经不存在";        
	DevProblem[" 1,26"] = 0x0000001A;  DevProblem[" 2,26"] = "过早处理故障";                
	DevProblem[" 1,27"] = 0x0000001B;  DevProblem[" 2,27"] = "无有效的LOG配置";             
	DevProblem[" 1,28"] = 0x0000001C;  DevProblem[" 2,28"] = "设备安装失败";                
	DevProblem[" 1,29"] = 0x0000001D;  DevProblem[" 2,29"] = "硬件被禁止";                  
	DevProblem[" 1,30"] = 0x0000001E;  DevProblem[" 2,30"] = "不能共享IRQ故障";             
	DevProblem[" 1,31"] = 0x0000001F;  DevProblem[" 2,31"] = "无法加载这个设备所需的驱动程序"; 
	DevProblem[" 1,32"] = 0x00000020;  DevProblem[" 2,32"] = "被禁止的服务";                
	DevProblem[" 1,33"] = 0x00000021;  DevProblem[" 2,33"] = "资源转换失败";                
	DevProblem[" 1,34"] = 0x00000022;  DevProblem[" 2,34"] = "没有软配置";                  
	DevProblem[" 1,35"] = 0x00000023;  DevProblem[" 2,35"] = "BIOS表中的设备丢失";           
	DevProblem[" 1,36"] = 0x00000024;  DevProblem[" 2,36"] = "IRQ转换失败";                 
	DevProblem[" 1,37"] = 0x00000025;  DevProblem[" 2,37"] = "其他错误";
	DevProblem[" 1,38"] = 0x00000026;  DevProblem[" 2,38"] = "需要重新启动";


	var DrvBackupStatusFlags  = new Array;
	var DrvBackupStatusString = new Array;

	DrvBackupStatusFlags[ 1] = 0x00000001 ; DrvBackupStatusString[ 1] = "数字签名文件备份失败";
	DrvBackupStatusFlags[ 2] = 0x00000002 ; DrvBackupStatusString[ 2] = "其他INF文件备份失败";
	DrvBackupStatusFlags[ 3] = 0x00000004 ; DrvBackupStatusString[ 3] = "驱动程序主要文件备份失败";
	DrvBackupStatusFlags[ 4] = 0x00000008 ; DrvBackupStatusString[ 4] = "辅助安装程序安装的文件备份失败";
	DrvBackupStatusFlags[ 5] = 0x00000010 ; DrvBackupStatusString[ 5] = "该驱动没有备份";
	DrvBackupStatusFlags[ 6] = 0x00000020 ; DrvBackupStatusString[ 6] = "设备管理器没有发现该设备";			//一般是指没有建立Devnode的设备，比如：新打开电源的Modem
	DrvBackupStatusFlags[ 7] = 0x00000040 ; DrvBackupStatusString[ 7] = "驱动程序已安装但对应的服务未加载";	//该设备的驱动已经存在在OS中（可以安装过也可以没有安装过），比如COM1上的Modem被移到COM2的情况。
	DrvBackupStatusFlags[ 8] = 0x00000080 ; DrvBackupStatusString[ 8] = "驱动程序是通过网络下载的";
	DrvBackupStatusFlags[ 9] = 0x00000100 ; DrvBackupStatusString[ 9] = "驱动程序备份是通过光盘部署的";
	DrvBackupStatusFlags[10] = 0x00000200 ; DrvBackupStatusString[10] = "";
	DrvBackupStatusFlags[11] = 0x00000400 ; DrvBackupStatusString[11] = "";
	DrvBackupStatusFlags[12] = 0x00000800 ; DrvBackupStatusString[12] = "";
	DrvBackupStatusFlags[13] = 0x00001000 ; DrvBackupStatusString[13] = "";
	DrvBackupStatusFlags[14] = 0x00002000 ; DrvBackupStatusString[14] = "";
	DrvBackupStatusFlags[15] = 0x00004000 ; DrvBackupStatusString[15] = "";
	DrvBackupStatusFlags[16] = 0x00080000 ; DrvBackupStatusString[16] = "当前驱动是由应用程序或用户安装的";	// 非操作系统安装的驱动
	DrvBackupStatusFlags[17] = 0x00010000 ; DrvBackupStatusString[17] = "备份驱动使用了辅助安装程序";
	DrvBackupStatusFlags[18] = 0x00020000 ; DrvBackupStatusString[18] = "备份驱动只包含一个INF文件";//没有指明[SourceDisksNames]和[SourceDisksFiles] // 备份驱动的执行程序部分由操作系统提供
	DrvBackupStatusFlags[19] = 0x00040000 ; DrvBackupStatusString[19] = "备份驱动经过了数字签名";
	DrvBackupStatusFlags[20] = 0x00008000 ; DrvBackupStatusString[20] = "";
	DrvBackupStatusFlags[21] = 0x00100000 ; DrvBackupStatusString[21] = "备份的驱动比当前驱动版本新";
	DrvBackupStatusFlags[22] = 0x00200000 ; DrvBackupStatusString[22] = "当前驱动比备份版本新";
	DrvBackupStatusFlags[23] = 0x00400000 ; DrvBackupStatusString[23] = "当前驱动需要进行网络升级";
	DrvBackupStatusFlags[24] = 0x00800000 ; DrvBackupStatusString[24] = "";
	DrvBackupStatusFlags[25] = 0x01000000 ; DrvBackupStatusString[25] = "";
	DrvBackupStatusFlags[26] = 0x02000000 ; DrvBackupStatusString[26] = "";
	DrvBackupStatusFlags[27] = 0x04000000 ; DrvBackupStatusString[27] = "";
	DrvBackupStatusFlags[28] = 0x08000000 ; DrvBackupStatusString[28] = "";
	DrvBackupStatusFlags[29] = 0x10000000 ; DrvBackupStatusString[29] = "";
	DrvBackupStatusFlags[30] = 0x20000000 ; DrvBackupStatusString[30] = "";
	DrvBackupStatusFlags[31] = 0x40000000 ; DrvBackupStatusString[31] = "";
	DrvBackupStatusFlags[32] = 0x80000000 ; DrvBackupStatusString[32] = "";

	
	// 当前行号
	DeviceInfo["0"]			= ItemNumber;
	// 设备代码 - DrvInst.DeviceIndex;
	DeviceInfo["1"]			= OrgDeviceInfo[CurrentRow + ",1"] ; 

	// 设备类别号 - DrvInst.DeviceClassID
	(deviceClass[OrgDeviceInfo[CurrentRow + ",2"]]) 
		? DeviceInfo["2"]	= 
							//"<img border='0' src='img/"
							//+ deviceClassImg[OrgDeviceInfo[CurrentRow + ",2"]] + "' "
							//+ "alt=" + deviceClass[OrgDeviceInfo[CurrentRow + ",2"]] 
							////+ " onMouseMove=DeviceMouseMoveInEvent('" + ItemNumber + "')"
							//+ " onMouseMove='this.style.cursor=\"help\"' "
							//+ " onMoveOut=DeviceMouseMoveOutEvent('" + ItemNumber + "')" 
							//+ " width=18 height=18>"
							"<img border='0' src='img/"
							+ deviceClassImg[OrgDeviceInfo[CurrentRow + ",2"]] + "' "
							+ " alt='" + deviceClass[OrgDeviceInfo[CurrentRow + ",2"]] 
							+ "' width='18' height='18' "
							+ " id='img" + ItemNumber + "'" 
							+ " onMouseMove='this.style.cursor=\"help\"' "
							//+ " onClick=RunDriverExportToServerOpenProcess(" + ItemNumber + "," + DeviceInfo["1"] + ")"
							//+ " onMouseMove=DeviceMouseMoveInEvent('" + ItemNumber + "')"
							+ " onMoveOut=DeviceMouseMoveOutEvent('" + ItemNumber + "')" 
							+ " >" 
		: DeviceInfo["2"]	= 
							//"<img border='0' src='img/unknown.gif'"
							//+ "alt=错误的代码类" + OrgDeviceInfo[CurrentRow + ",2"] 
							////+ " onMouseMove=DeviceMouseMoveInEvent('" + ItemNumber + "')"
							//+ " onMouseMove='this.style.cursor=\"help\"' "
							//+ " onMoveOut=DeviceMouseMoveOutEvent('" + ItemNumber + "')" 
							//+ " width=18 height=18>";
							"<img border='0' src='img/unknown.gif'"
                            // 2006-1-6
							+ "alt='错误的代码类代码：" + OrgDeviceInfo[CurrentRow + ",2"] + ""
							+ "' width='18' height='18' "
							+ " id='img" + ItemNumber + "'" 
							+ " onMouseMove='this.style.cursor=\"help\"' "
							//+ " onClick=RunDriverExportToServerOpenProcess(" + ItemNumber + "," + DeviceInfo["1"] + ")"
							//+ " onMouseMove=DeviceMouseMoveInEvent('" + ItemNumber + "')"
							+ " onMoveOut=DeviceMouseMoveOutEvent('" + ItemNumber + "')" 
							+ " >";
	
	// 设备状态码 - DrvInst.DeviceStatus ;
	var Stat2			= OrgDeviceInfo[CurrentRow + ",4"] ; 
	var resu2			= Stat2 &  DevStatusFlags[31];
	
	//if (DrvInst.DeviceClassType) then 该设备是一个隐蔽类型设备
	if (OrgDeviceInfo[CurrentRow + ",3"])
	{
		DeviceInfo["3"]			= "<img border='0' src='img/3.gif'" 
							+ " onMouseMove='this.style.cursor=\"help\"' "
							+ "alt='该设备是一个隐蔽类型设备'>";
	}
	else if (resu2)
	{
		DeviceInfo["3"]			= "<img border='0' src='img/4.GIF'" 
							+ " onMouseMove='this.style.cursor=\"help\"' "
							+ "alt='该设备不显示在设备管理器中'>";
	}
	else
	{
		DeviceInfo["3"]			= " ";
	}
	
	// 翻译设备状态字为文字注释
	var str = "";
	for (j=1;j<=32;j++)
	{
		var Stat = OrgDeviceInfo[CurrentRow + ",4"] ; // DrvInst.DeviceStatus
		var resu = Stat & DevStatusFlags[j] ;
		if( resu > 0 )
		{
			if (DevStatusString[j]) 
				str = str +  DevStatusString[j] + "," ;
		}
	}
	if (OrgDeviceInfo[CurrentRow + ",4"])
	{
		str += "Code:0x" + OrgDeviceInfo[CurrentRow + ",4"].toString(16);
	}

	var Stat2			= OrgDeviceInfo[CurrentRow + ",4"] ; //DrvInst.DeviceStatus ;
	var resu2			= Stat2 &  DevStatusFlags[11];		 // 有问题需要重新安装
	var resu1			= Stat2 &  DevStatusFlags[9];		 // 有问题需要重新启动
	if (resu2 || resu1)	// 如果有问题
	{
		DeviceInfo["4"]			= "<img border='0' src='img/checkbug.gif'" 
							+ " onMouseMove='this.style.cursor=\"help\"' "
							+ "width='18' height='18' alt='" 
							+ str 
							+ "'>";
	}
	else
	{
		DeviceInfo["4"]			= "<img border='0' src='img/4.GIF'" 
							+ " onMouseMove='this.style.cursor=\"help\"' "
							//+ "width='10' height='10' "
							+ "alt='" 
							+ str 
							+ "'>";
	}
    // 2006-9-29
    //
    // 取消状态显示图片和内容，这些内容会造成用户歧义
    //
    DeviceInfo["4"] = " "

	
	// 设备故障码 - DrvInst.DeviceProblem
	if (OrgDeviceInfo[CurrentRow + ",5"] > 38 ) 
	{
		//DeviceInfo["5"]	= "无效的设备故障号";
		var prob = "(code:" + OrgDeviceInfo[CurrentRow + ",5"] + ")";
		DeviceInfo["5"]	= "<img border='0' "
							+"src='img/error1.GIF'"
							+ " onMouseMove='this.style.cursor=\"help\"' "
							+ " width=18 height=18 "
							+ " alt='" + prob + "'>";

	}
	else
	{
		var prob = DevProblem[" 2," + OrgDeviceInfo[CurrentRow + ",5"] ] 
					+ "(code:" + OrgDeviceInfo[CurrentRow + ",5"] + ")";
		
		if (OrgDeviceInfo[CurrentRow + ",5"] != 0)
		{
			DeviceInfo["5"]	= "<img border='0' "
								+"src='img/error1.GIF'"
								+ " onMouseMove='this.style.cursor=\"help\"' "
								+ " width=18 height=18 "
								+ " alt='" + prob + "'>";
		}
		else
		{	
			DeviceInfo["5"]			= " ";
		}
	}
    // 2006-9-29
    //
    // 取消故障状态显示图片和内容，这些内容会造成用户歧义
    //
    DeviceInfo["5"] = " ";  // 这里必须以；结尾，否则，会与下面的语句连在一起

    // 设备名称 - DrvInst.DeviceName
	// 如果设备的类编号正确且设备没有故障
	(deviceClass[OrgDeviceInfo[CurrentRow + ",2"]]) 
		? DeviceInfo["6"] = ""
					+ "<SPAN style='color: green;font-style: normal;font-family: 宋体;'"
					+ " VALIGN='top'"
					+ " onMouseMove='this.style.color=\"red\";this.style.cursor=\"hand\"'"
					+ " onMouseOut='this.style.color=\"green\";this.style.fontStyle=\"normal\";'"
					//+ " onClick=RunDriverExportToServerOpenProcess(" + ItemNumber + "," + DeviceInfo["1"] + ")"
					+ " >"
					+ OrgDeviceInfo[CurrentRow + ",6"] 
                    // 2007-2-1
					// + "</a>&nbsp;&nbsp;"
                    + "</SPAN>"
		: DeviceInfo["6"] =""
					+ "<SPAN style='color: green;font-style: normal;font-family: 宋体;'"
					+ " VALIGN='top'"
					+ " onMouseMove='this.style.color=\"red\";this.style.cursor=\"hand\"'"
					+ " onMouseOut='this.style.color=\"green\";this.style.fontStyle=\"normal\";'"
					//+ " onClick=RunDriverExportToServerOpenProcess(" + ItemNumber + "," + DeviceInfo["1"] + ")"
					+ " >" 
					+ OrgDeviceInfo[CurrentRow + ",6"] 
                    // 2007-2-1
					// + "</SPAN>&nbsp;&nbsp;"
                    + "</SPAN>"

////////////////////////////////////////////////////////////////////////////////////
	// 备份驱动状态码 - DrvInst.BackupDriverStatus ;
	
	// 翻译为文字注释
	var str = "";
	var Stat = OrgDeviceInfo[CurrentRow + ",7"];

	//如果该设备驱动备份过
	if 	(!(Stat & 0x00000010))   str += "驱动程序已备份,";
	//如果该设备驱动备份过且没有备份过除INF文件以外的其他文件，
	// 提示系统安装的驱动 （原来是：没有[SourceDisksNames]或[SourceDisksFiles]节- 即不是操作系统自带的驱动）
	if 	(!(Stat & 0x00080000))   
	{
		str += "当前驱动是操作系统安装的,";
	}
	//如果该设备驱动备份过且备份过除INF文件以外的其他文件，
	// 提示应用程序安装的驱动(该提示在标志位翻译时产生)
	else
	{
		str += "";
	}

	// 备份驱动状态码翻译为文字注释 - DrvInst.BackupDriverStatus // DrvInst.BackupDriverStatus
	for (j=1;j<=32;j++)
	{
		var Stat = OrgDeviceInfo[CurrentRow + ",7"] ; // DrvInst.BackupDriverStatus
		var resu = Stat & DrvBackupStatusFlags[j] ;
		if( resu > 0 )
		{
			if (DrvBackupStatusString[j]) 
				str = str +  DrvBackupStatusString[j] + "," ;
		}
	}
	if (OrgDeviceInfo[CurrentRow + ",7"])
	{
		str += "Code:0x" + OrgDeviceInfo[CurrentRow + ",7"].toString(16);
	}

	var Stat2 = OrgDeviceInfo[CurrentRow + ",7"] ; //DrvInst.BackupDriverStatus ;
	
	// 如果是应用程序或用户安装的驱动且该驱动没有备份
	if ( (Stat2 & 0x00080000) && (Stat2 & 0x00000010) )
	{
		DeviceInfo["7"]		= "<img border='0' src='img/6.gif'" 
							//+ "width='10' height='10' " 
							+ " onMouseMove='this.style.cursor=\"help\"' "
							+ "alt='" 
							+ str 
							+ "'>";
	}
	//如果该设备驱动没有备份
	else if (Stat2 & 0x00000010)
	{
		DeviceInfo["7"]		= "<img border='0' src='img/3.gif'" 
							//+ "width='10' height='10' " 
							+ " onMouseMove='this.style.cursor=\"help\"' "
							+ "alt='" 
							+ str 
							+ "'>";
	}
	//如果是应用程序或用户安装的驱动
	else if(Stat2 & 0x00080000)
	{
		DeviceInfo["7"]		= "<img border='0' src='img/1.GIF'" 
							//+ "width='10' height='10' " 
							+ " onMouseMove='this.style.cursor=\"help\"' "
							+ "alt='"
							+ str
							+ "'>";
	}
	// 如果设备的驱动是由用户安装的，就检查设备的备份驱动是否需要进行网络升级
	// （如果设备驱动没有备份就检查设备的当前驱动是否需要进行网络升级）
	//else if ()
	//{

	//}
	//其他状态
	else
	{
		DeviceInfo["7"]		= "<img border='0' src='img/4.GIF'" 
							//+ "width='10' height='10' " 
							+ " onMouseMove='this.style.cursor=\"help\"' "
							+ "alt='" 
							+ str 
							+ "'>";
	}
    // 2006-9-29
    //
    // 取消备份状态显示图片和内容，这些内容会造成用户歧义
    //
    DeviceInfo["7"]  = " "
}
//点击设备名弹出设备操作按钮
function RunDriverExportToServerOpenProcess( DeviceInfo )
{
    DisplayMessage("打开设备[" + DeviceInfo[6] + "](#" + DeviceInfo[1] + ")");
    DriverExportToServerOpenProcess( DeviceInfo );
}
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
function DriverExportToServerOpenProcess( OrgDeviceInfo )
{
	
	var DeviceInfo   = new Array;
    var DeviceInfoArray = new Array()

	var DeviceNumber,TableItem;
	var DeviceName;
        SaveDeviceInfoToArray( OrgDeviceInfo ,DeviceInfoArray , 0);
		TranslateDeviceInfoToArray( DeviceInfo , DeviceInfoArray , 0 , 0 );

	// 删除当前表格
	DeleteDeviceTable();
	CreateDeviceTable();

	// 创建一个新行
	oRow = document.createElement("TR");

	oCell = document.createElement("TD");
//	oCell.innerHTML	= DeviceInfo[7];
	oCell.vAlign	="top"; 
	oCell.width     ="60"
//	oCell.align		="center";
	oRow.appendChild(oCell);

	oCell = document.createElement("TD");
	oCell.innerHTML	= DeviceInfo[7];
	oCell.vAlign	="top"; 
//	oCell.align		="center";
	oRow.appendChild(oCell);

	oCell = document.createElement("TD");
	oCell.innerHTML	= DeviceInfo[3];
	oCell.vAlign	="top"; 
//	oCell.align		="center";
	oRow.appendChild(oCell);

	oCell = document.createElement("TD");
	oCell.innerHTML	= DeviceInfo[4];
	oCell.vAlign	="top"; 
//	oCell.align		="center";
	oRow.appendChild(oCell);

	oCell = document.createElement("TD");
	oCell.innerHTML	= DeviceInfo[5];
	oCell.vAlign	="top"; 
//	oCell.align		="center";
	oRow.appendChild(oCell);
	
	oCell = document.createElement("TD");
	oCell.innerHTML	= DeviceInfo[2];
	oCell.vAlign	="top"; 
//	oCell.align		="center";
	oRow.appendChild(oCell);

	oCell = document.createElement("TD");
	var innerHTML = ""
					+ "<SPAN style='font-style: normal;font-family: 宋体;' "
					//+ " VALIGN='top'"
					//+ " onMouseMove='this.style.color=\"red\";this.style.cursor=\"hand\"'"
					//+ " onMouseOut='this.style.color=\"green\";this.style.fontStyle=\"normal\";'"
					// 自动模式下不允许用户点击此处
					//+ " onClick=RunDriverExportToServerCloseProcess(" + TableItem + "," + DeviceInfo["1"] + ")" 
					+ ">" + DeviceInfo[6]
					+ "</SPAN>&nbsp;&nbsp;"
					+ "<br><br><span id='ProcessingInfo'>正在处理，请稍候...</span>";

	oCell.innerHTML	= innerHTML ;			
	oCell.vAlign	="top"; 
	oRow.appendChild(oCell);

	g_oTBody0.appendChild(oRow);

	oTableContainer.align="left"
}
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//点击设备名关闭设备操作按钮
function RunDriverExportToServerCloseProcess( DeviceInfo )
{
    DisplayMessage("关闭设备[" + DeviceInfo[6] + "](#" + DeviceInfo[1] + ")");
    DriverExportToServerCloseProcess();
}
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
function DriverExportToServerCloseProcess()
{
	

//	var DeviceInfo = new Array;
//	var DeviceNumber;
//	// 如果是新设备
//	if (row>=g_UserDrvDeviceRows)
//	{
//		DeviceNumber = row - g_UserDrvDeviceRows;
//		TranslateDeviceInfoToArray(DeviceInfo,g_NewDeviceInfo,DeviceNumber,row);
//	}
//	else
//	{
//		TranslateDeviceInfoToArray(DeviceInfo,g_ExportedDeviceArray,row,row);
//	}

	
	// 删除当前表格
	DeleteDeviceTable();

	
}
////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////
function ApplyReEnumDevicesEvent()
{
    //取消操作系统枚举事件正在运行标志，这样就可以接受设备枚举操作了
    g_OSEnumDevFlag = 0

	EnumDevice(1);
	return 0;
}
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
function DeviceMouseMoveInEvent(row)
{

}
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
function DeviceMouseMoveOutEvent(row)
{

}
////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////
function GetXmlSingleNodeText( Xml , NodeTag )
{
	var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
	xmlDoc.async = false;
	xmlDoc.loadXML( Xml );
	if (!xmlDoc) return(null)
	var objNode = xmlDoc.selectSingleNode("\/\/" + NodeTag )
	if (!objNode) return (null)
	var text = objNode.text
	xmlDoc = null

return (text)
}
function GetHtmlLaunchPath()
{
	// 2006-10-27
    //var UrlPathname = location.pathname;	// get path of HTML file
	//var UrlHostname = location.hostname;	// get hostname & port
	// 2006-10-27
    //var UrlPathname = location.pathname;	// get path of HTML file
	//var UrlHostname = location.hostname;	// get hostname & port
    var UrlPathname = ""
	var UrlHostname = ""
    try
    {
        UrlPathname = document.location.pathname;	// get path of HTML file
	    UrlHostname = document.location.hostname;	// get hostname & port
    }
    catch (e)
    {
    }

    // 如果当前IE正在浏览一个本地的HTML副本
	// if URl not link to a Hostname ,mains IE browse a location HTML file.
	if (UrlHostname == "")
	{
		UrlPathname = UrlPathname.replace( /%20/gi , " ");
		if (UrlPathname.charAt(0) == "/")
		{
			// get substring from first char to last char \ .
			UrlPathname = UrlPathname.substring(1 , UrlPathname.lastIndexOf("\\")); 
		}
		else
		{
			UrlPathname = UrlPathname.substring(0 , UrlPathname.lastIndexOf("\\")); 
		}
	}
	// 如果本程序是从网络启动的
	else
	{
        //DisplayMessage( "不支持如下地址：" + UrlHostname )
		return ""
	}
	return (UrlPathname)
}

function DynaLoadClientLogoAndADHTML()
{
	// 如果当前页面是从网络加载而不是浏览用户的易驱动客户端程序，就加载用户本地机器中的公司logo和页首旗帜广告
	if (!g_AppLaunchPath)
	{
		var hKey4 = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\DrvInst\\Setup")
		if ( hKey4 )
		{
			g_DrvInstLogFilePath = DrvCert.RegQueryValue( hKey4 , "DrvInstLogFilePath" )
			if ( g_DrvInstLogFilePath )
			{
				g_AppLaunchPath = g_DrvInstLogFilePath.substring( 0 , g_DrvInstLogFilePath.lastIndexOf("\\") )
			}
		}
	}
	// 动态加载公司logo和页首旗帜广告
	//
	// 下面的两段代码动态检测img目录中是否存在OEM厂商logo图片文件和旗帜广告图片文件，若有就动态加载之
	var FileNameXml = DrvCert.FindFileInPath( g_AppLaunchPath + "\\" + LOGO_FILE_SUB_DIR_FILENAME ) ;// "img\\ClientLogo.gif"
    var CabFileName = GetXmlSingleNodeText( FileNameXml , "FileItem0" )
    if ( CabFileName ) 
	{
		if ( LOGO_FILE_LINK_TO_URL )																// "http:\/\/www.e-software.cn"
		{
			LogoDiv.innerHTML = '<A href="' + LOGO_FILE_LINK_TO_URL + '">'								
							  + '<IMG src="' + LOGO_FILE_SUB_DIR_FILENAME + '" border=0 ALT=""></A>'
		}
		else
		{
			LogoDiv.innerHTML = '<IMG src="' + LOGO_FILE_SUB_DIR_FILENAME + '" border=0 ALT="" >'
		}
	}
	var FileNameXml = DrvCert.FindFileInPath( g_AppLaunchPath + "\\" + AD_FILE_SUB_DIR_FILENAME ) ; // "img\\ClientAD.jpg"
	var CabFileName = GetXmlSingleNodeText( FileNameXml , "FileItem0" )
    if ( CabFileName ) 
	{
		// 如果文件类型是.swf
		if ( CabFileName.search(/\.swf$/i) != -1 )
		{
			var objHtml = ""
			objHtml += '<OBJECT classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 '
			objHtml += '      codeBase=http:\/\/download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0 '
			objHtml += '      height=60 width=468>'
			objHtml += '	  <PARAM NAME="movie" VALUE=' + AD_FILE_SUB_DIR_FILENAME + '>'
			objHtml += '	  <PARAM NAME="quality" VALUE="high">'
			objHtml += '      <embed src=' + AD_FILE_SUB_DIR_FILENAME + 'quality=high pluginspage="http:\/\/www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="468" height="60"></embed>'
			objHtml += '</OBJECT>'
			if ( AD_FILE_LINK_TO_URL )																	// "http:\/\/www.e-software.cn"
			{
				ADDiv.innerHTML =	'<A href="' + AD_FILE_LINK_TO_URL + '">' + objHtml + '</A>'
			}
			else
			{
				ADDiv.innerHTML =	objHtml
			}
		}
		// 如果文件类型是.gif
		else if ( CabFileName.search(/\.gif$/i) != -1 )
		{
			if ( AD_FILE_LINK_TO_URL )																	// "http:\/\/www.e-software.cn"
			{
				ADDiv.innerHTML =	'<A href="' + AD_FILE_LINK_TO_URL + '">'								
								  + '<IMG src="' + AD_FILE_SUB_DIR_FILENAME + '" border=0 ALT=""></A>'
			}
			else
			{
				ADDiv.innerHTML =	'<IMG src="' + AD_FILE_SUB_DIR_FILENAME + '" border=0 ALT="">'
			}
		}
	}

}
function BackupSystemDrivers()
{
	var stock = new Array()

	Title.innerHTML = '<br><center>正在备份系统驱动...<br></center>'
	                + '<br>'
					+ '<table align=center id=PercentTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
					+ '<tr><td>'
					+ '  <IMG id="PercentImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
					+ '</td></tr></table>'
					+ '<div id=PercentString>&nbsp;</div>'
    // 不马上刷新显示的好处是如果没有要保护的驱动就不显示进度条
	//DrvCert.UIRefresh()

	var TotalBackupDrivers = 0
	for (var i=0; i<g_NormalSystemDeviceRows ; i++)
	{
		ReadArrayToDeviceInfo(stock , g_NormalSystemDeviceInfoArray , i);
		// 备份的条件是“必须不是隐蔽类型设备（即不是非即插即用驱动程序类型），且设备没有故障、设备没有备份过驱动”
		if ( !(stock[3]) && !stock[5] && (stock[7] & 0x00000010) ) TotalBackupDrivers ++
	}
	var CurBackupDrvRow = 0
	for (var i=0; (i<g_NormalSystemDeviceRows) && TotalBackupDrivers; i++)
	{

		ReadArrayToDeviceInfo(stock , g_NormalSystemDeviceInfoArray , i);

		// 备份的条件是“必须不是隐蔽类型设备（即不是非即插即用驱动程序类型），且设备没有故障、设备没有备份过驱动”
		if ( !(stock[3]) && !stock[5] && (stock[7] & 0x00000010) )
		{
			DisplayMessage("正在备份设备[" + stock[6] + "]的驱动...");

			CurBackupDrvRow ++

            PercentImg.width=PercentTbl.width*(CurBackupDrvRow)/TotalBackupDrivers
            PercentString.innerHTML = '<center>' + Math.floor((CurBackupDrvRow)/TotalBackupDrivers*100) + '%</center>'

			RunDriverExportToServerOpenProcess( stock );	
			ProcessingInfo.innerHTML = '正在备份驱动...'
			DrvCert.UIRefresh()

			var err = DrvInst.BackupDriver(stock[1]);
			(!err)	? DisplayMessage("备份设备的驱动成功 - 设备[" + stock[6] + "]")
					: DisplayMessage("备份设备的驱动失败 - 设备[" + stock[6] + "]");

			// 设备处理完毕，关闭故障设备
			RunDriverExportToServerCloseProcess( stock )
		}
	}
	Title.innerHTML = ''
}
function BackupUserDriver()
{
	var stock = new Array()

	Title.innerHTML = '<br><center>正在备份用户驱动...<br></center>'
	                + '<br>'
					+ '<table align=center id=PercentTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
					+ '<tr><td>'
					+ '  <IMG id="PercentImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
					+ '</td></tr></table>'
					+ '<div id=PercentString>&nbsp;</div>'
    // 不马上刷新显示的好处是如果没有要保护的驱动就不显示进度条
	//DrvCert.UIRefresh()

	var TotalBackupDrivers = 0
	for (var i=0; i<g_UserDrvDeviceRows ; i++)
	{
		ReadArrayToDeviceInfo(stock , g_UserDrvDeviceInfoArray , i);
		// 备份的条件是“必须不是隐蔽类型设备（即不是非即插即用驱动程序类型），且设备没有故障、设备没有备份过驱动”
		if ( !(stock[3]) && !stock[5] && (stock[7] & 0x00000010) ) TotalBackupDrivers ++
	}
	var CurBackupDrvRow = 0
	for (var i=0; (i<g_UserDrvDeviceRows) && TotalBackupDrivers; i++)
	{

		ReadArrayToDeviceInfo(stock , g_UserDrvDeviceInfoArray , i);

		// 备份的条件是“必须不是隐蔽类型设备（即不是非即插即用驱动程序类型），且设备没有故障、设备没有备份过驱动”
		if ( !(stock[3]) && !stock[5] && (stock[7] & 0x00000010) )
		{
			DisplayMessage("正在备份设备[" + stock[6] + "]的驱动...");

			CurBackupDrvRow ++

            PercentImg.width=PercentTbl.width*(CurBackupDrvRow)/TotalBackupDrivers
            PercentString.innerHTML = '<center>' + Math.floor((CurBackupDrvRow)/TotalBackupDrivers*100) + '%</center>'

			RunDriverExportToServerOpenProcess( stock );	
			ProcessingInfo.innerHTML = '正在备份驱动...'
			DrvCert.UIRefresh()

			var err = DrvInst.BackupDriver(stock[1]);
			(!err)	? DisplayMessage("备份设备的驱动成功 - 设备[" + stock[6] + "]")
					: DisplayMessage("备份设备的驱动失败 - 设备[" + stock[6] + "]");

			// 设备处理完毕，关闭故障设备
			RunDriverExportToServerCloseProcess( stock )
		}
	}
	Title.innerHTML = ''
}
function GetDriverExportStatusFromDB( UserID )
{
	var stock = new Array()

    var UpdateSystemDrvFlag = ( GetCookie( "UpdateSystemDrvFlag" ) == "true" )
    var CurSystemDeviceRows = ( UpdateSystemDrvFlag ) ? g_NormalSystemDeviceRows : 0 

    // 检查故障设备驱动是否可以恢复
	for (var i=0; i<g_DevErrDeviceRows ; i++)
	{

		ReadArrayToDeviceInfo( stock , g_DevErrDeviceInfoArray , i);

        DisplayMessage("正在读取设备[" + stock[6] + "]的驱动保护状态...");


        PercentImg.width=PercentTbl.width*(i+1)/( g_DevErrDeviceRows + g_UserDrvDeviceRows + CurSystemDeviceRows )
        PercentString.innerHTML = '<center>' + Math.floor((i+1)/( g_DevErrDeviceRows + g_UserDrvDeviceRows  + CurSystemDeviceRows )*100) + '%</center>'

        RunDriverExportToServerOpenProcess( stock );	

        ProcessingInfo.innerHTML = '正在读取驱动保护状态...'
        DrvCert.UIRefresh()

        // 2006-7-9 ............................................................................
        //
        //var RetInfo = GetDeviceExportDriverStatus( UserID , stock );
        var RetInfo = FindDriver( UserID , GetMainBoardInfo() , stock , GetOSInfo() )
        //
        // 2006-7-9 ............................................................................
        //
        //RetInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
        //RetInfo["ErrorInfo"     ] = ""
        //RetInfo["UserID"        ]  
        //RetInfo["DriverID"      ]  
        //RetInfo["DriverDate"    ]  
        //RetInfo["DriverMfg"     ]  
        //RetInfo["NewUserID"     ]  
        //RetInfo["NewDriverID"   ]  
        //RetInfo["NewDriverDate" ]  
        //RetInfo["NewDriverMfg"  ]  
        // 
        // 2006-7-8 
        //
        // RetInfo["DriverDesc"   ] : always is ""
        // RetInfo["NewDriverDesc"]
        //
        if (RetInfo["Success"])
        {
            DisplayMessage("设备[" + stock[6] + "]驱动已保护")
            // 设备驱动已保护标志
            g_DevErrDeviceInfoArray[i+",20"] = true
            g_DevErrDeviceInfoArray[i+",UserID"         ] = RetInfo["UserID"]
            g_DevErrDeviceInfoArray[i+",DriverID"       ] = RetInfo["DriverID"]
            g_DevErrDeviceInfoArray[i+",DriverDate"     ] = RetInfo["DriverDate"]
            g_DevErrDeviceInfoArray[i+",DriverMfg"      ] = RetInfo["DriverMfg"]
            // 2006-7-8
            g_DevErrDeviceInfoArray[i+",DriverDesc"     ] = RetInfo["DriverDesc"]

            g_DevErrDeviceInfoArray[i+",NewUserID"      ] = RetInfo["NewUserID"]
            g_DevErrDeviceInfoArray[i+",NewDriverID"    ] = RetInfo["NewDriverID"]
            g_DevErrDeviceInfoArray[i+",NewDriverDate"  ] = RetInfo["NewDriverDate"]
            g_DevErrDeviceInfoArray[i+",NewDriverMfg"   ] = RetInfo["NewDriverMfg"]
            // 2006-7-8
            g_DevErrDeviceInfoArray[i+",NewDriverDesc"  ] = RetInfo["NewDriverDesc"]

            g_DeviceRowsCanImportDriver ++
        }
        else
        {
            // 设备驱动未保护标志
            g_DevErrDeviceInfoArray[i+",20"] = false
            // 2006-7-10
       		DisplayMessage("设备[" + stock[6] + "]驱动未保护:" + RetInfo["ErrorInfo"] )

            g_DevErrDeviceInfoArray[i+",NewUserID"      ] = RetInfo["NewUserID"]
            g_DevErrDeviceInfoArray[i+",NewDriverID"    ] = RetInfo["NewDriverID"]
            g_DevErrDeviceInfoArray[i+",NewDriverDate"  ] = RetInfo["NewDriverDate"]
            g_DevErrDeviceInfoArray[i+",NewDriverMfg"   ] = RetInfo["NewDriverMfg"]
            // 2006-7-8
            g_DevErrDeviceInfoArray[i+",NewDriverDesc"  ] = RetInfo["NewDriverDesc"]

        }

        // 设备处理完毕，关闭故障设备
        RunDriverExportToServerCloseProcess( stock )
	}
    // 检查状态正常的用户类设备的驱动是否需要保护或升级
	for (var i=0; i<g_UserDrvDeviceRows ; i++)
	{

		ReadArrayToDeviceInfo( stock , g_UserDrvDeviceInfoArray , i);

        DisplayMessage("正在读取设备[" + stock[6] + "]的驱动保护状态...");


        PercentImg.width=PercentTbl.width*(g_DevErrDeviceRows+i+1)/( g_DevErrDeviceRows + g_UserDrvDeviceRows  + CurSystemDeviceRows )
        PercentString.innerHTML = '<center>' + Math.floor((g_DevErrDeviceRows+i+1)/( g_DevErrDeviceRows + g_UserDrvDeviceRows  + CurSystemDeviceRows )*100) + '%</center>'

        RunDriverExportToServerOpenProcess( stock );	

        ProcessingInfo.innerHTML = '正在读取驱动保护状态...'
        DrvCert.UIRefresh()

        // 2006-7-9 ............................................................................
        //
        //var RetInfo = GetDeviceExportDriverStatus( UserID , stock );
        var RetInfo = FindDriver( UserID , GetMainBoardInfo() , stock , GetOSInfo() )
        //
        // 2006-7-9 ............................................................................
        //
        //RetInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
        //RetInfo["ErrorInfo"     ] = ""
        //RetInfo["UserID"        ]  
        //RetInfo["DriverID"      ]  
        //RetInfo["DriverDate"    ]  
        //RetInfo["DriverMfg"     ]  
        //RetInfo["NewUserID"     ]  
        //RetInfo["NewDriverID"   ]  
        //RetInfo["NewDriverDate" ]  
        //RetInfo["NewDriverMfg"  ]  
        // 
        // 2006-7-8 
        //
        // RetInfo["DriverDesc"   ] : always is ""
        // RetInfo["NewDriverDesc"]
        //
        if ( RetInfo["Success"] )
        {
            DisplayMessage("设备[" + stock[6] + "]驱动已保护")
            // 设备驱动已保护标志
            g_UserDrvDeviceInfoArray[i+",20"          ] = true
            g_UserDrvDeviceInfoArray[i+",UserID"      ] = RetInfo["UserID"]
            g_UserDrvDeviceInfoArray[i+",DriverID"    ] = RetInfo["DriverID"]
            g_UserDrvDeviceInfoArray[i+",DriverDate"  ] = RetInfo["DriverDate"]
            g_UserDrvDeviceInfoArray[i+",DriverMfg"   ] = RetInfo["DriverMfg"]
            // 2006-7-8
            g_UserDrvDeviceInfoArray[i+",DriverDesc"  ] = RetInfo["DriverDesc"]

            g_UserDrvDeviceInfoArray[i+",NewUserID"      ] = RetInfo["NewUserID"]
            g_UserDrvDeviceInfoArray[i+",NewDriverID"    ] = RetInfo["NewDriverID"]
            g_UserDrvDeviceInfoArray[i+",NewDriverDate"  ] = RetInfo["NewDriverDate"]
            g_UserDrvDeviceInfoArray[i+",NewDriverMfg"   ] = RetInfo["NewDriverMfg"]
            // 2006-7-8
            g_UserDrvDeviceInfoArray[i+",NewDriverDesc"  ] = RetInfo["NewDriverDesc"]

        }
        else
        {
       		DisplayMessage("设备[" + stock[6] + "]驱动未保护:" + RetInfo["ErrorInfo"] )
            // 设备驱动未保护标志
            g_UserDrvDeviceInfoArray[i+",20"] = false

            g_UserDrvDeviceInfoArray[i+",NewUserID"      ] = RetInfo["NewUserID"]
            g_UserDrvDeviceInfoArray[i+",NewDriverID"    ] = RetInfo["NewDriverID"]
            g_UserDrvDeviceInfoArray[i+",NewDriverDate"  ] = RetInfo["NewDriverDate"]
            g_UserDrvDeviceInfoArray[i+",NewDriverMfg"   ] = RetInfo["NewDriverMfg"]
            // 2006-7-8
            g_UserDrvDeviceInfoArray[i+",NewDriverDesc"  ] = RetInfo["NewDriverDesc"]
            
        }
        // 如果该状态正常的用户类设备的驱动有更新版本的驱动
        if ( Date.parse( g_UserDrvDeviceInfoArray[i+",NewDriverDate"] ) > Date.parse( stock[11] ) )
        {
            g_DeviceRowsNeedUpdateDriver ++
        }

        // 设备处理完毕，关闭故障设备
        RunDriverExportToServerCloseProcess( stock )
	}
    // 检查状态正常的系统类设备驱动是否需要升级
    // 检查操作执行的条件是用户设置了“升级系统类驱动”标志
	for (var i=0; i<g_NormalSystemDeviceRows && UpdateSystemDrvFlag ; i++)
	{

		ReadArrayToDeviceInfo( stock , g_NormalSystemDeviceInfoArray , i);

        DisplayMessage("正在读取设备[" + stock[6] + "]的驱动保护状态...");


        PercentImg.width=PercentTbl.width*(g_DevErrDeviceRows+g_UserDrvDeviceRows+i+1)/( g_DevErrDeviceRows + g_UserDrvDeviceRows + CurSystemDeviceRows )
        PercentString.innerHTML = '<center>' + Math.floor((g_DevErrDeviceRows+g_UserDrvDeviceRows+i+1)/( g_DevErrDeviceRows + g_UserDrvDeviceRows  + CurSystemDeviceRows )*100) + '%</center>'

        RunDriverExportToServerOpenProcess( stock );	

        ProcessingInfo.innerHTML = '正在读取驱动保护状态...'
        DrvCert.UIRefresh()

        // 2006-7-9 ............................................................................
        //
        //var RetInfo = GetDeviceExportDriverStatus( UserID , stock );
        var RetInfo = FindDriver( UserID , GetMainBoardInfo() , stock , GetOSInfo() )
        //
        // 2006-7-9 ............................................................................
        //
        //RetInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
        //RetInfo["ErrorInfo"     ] = ""
        //RetInfo["UserID"        ]  
        //RetInfo["DriverID"      ]  
        //RetInfo["DriverDate"    ]  
        //RetInfo["DriverMfg"     ]  
        //RetInfo["NewUserID"     ]  
        //RetInfo["NewDriverID"   ]  
        //RetInfo["NewDriverDate" ]  
        //RetInfo["NewDriverMfg"  ]  
        // 
        // 2006-7-8 
        //
        // RetInfo["DriverDesc"   ] : always is ""
        // RetInfo["NewDriverDesc"]
        //
        if (RetInfo["Success"])
        {
            DisplayMessage("设备[" + stock[6] + "]驱动已保护")
            // 设备驱动已保护标志
            g_NormalSystemDeviceInfoArray[i+",20"           ] = true
            g_NormalSystemDeviceInfoArray[i+",UserID"       ] = RetInfo["UserID"]
            g_NormalSystemDeviceInfoArray[i+",DriverID"     ] = RetInfo["DriverID"]
            g_NormalSystemDeviceInfoArray[i+",DriverDate"   ] = RetInfo["DriverDate"]
            g_NormalSystemDeviceInfoArray[i+",DriverMfg"    ] = RetInfo["DriverMfg"]
            // 2006-7-8
            g_NormalSystemDeviceInfoArray[i+",DriverDesc"   ] = RetInfo["DriverDesc"]
            
            g_NormalSystemDeviceInfoArray[i+",NewUserID"      ] = RetInfo["NewUserID"]
            g_NormalSystemDeviceInfoArray[i+",NewDriverID"    ] = RetInfo["NewDriverID"]
            g_NormalSystemDeviceInfoArray[i+",NewDriverDate"  ] = RetInfo["NewDriverDate"]
            g_NormalSystemDeviceInfoArray[i+",NewDriverMfg"   ] = RetInfo["NewDriverMfg"]
            // 2006-7-8
            g_NormalSystemDeviceInfoArray[i+",NewDriverDesc"  ] = RetInfo["NewDriverDesc"]

        }
        else
        {
            // 设备驱动未保护标志
            g_NormalSystemDeviceInfoArray[i+",20"] = false
       		DisplayMessage("设备[" + stock[6] + "]驱动未保护:" + RetInfo["ErrorInfo"] )

            g_NormalSystemDeviceInfoArray[i+",NewUserID"      ] = RetInfo["NewUserID"]
            g_NormalSystemDeviceInfoArray[i+",NewDriverID"    ] = RetInfo["NewDriverID"]
            g_NormalSystemDeviceInfoArray[i+",NewDriverDate"  ] = RetInfo["NewDriverDate"]
            g_NormalSystemDeviceInfoArray[i+",NewDriverMfg"   ] = RetInfo["NewDriverMfg"]
            // 2006-7-8
            g_NormalSystemDeviceInfoArray[i+",NewDriverDesc"  ] = RetInfo["NewDriverDesc"]

        }
        
        // 如果该状态正常的系统类设备的驱动有更新版本的驱动
        if ( Date.parse( g_NormalSystemDeviceInfoArray[i+",NewDriverDate"] ) > Date.parse( stock[11] ) )
        {
            g_DeviceRowsNeedUpdateDriver ++
        }

        // 设备处理完毕，关闭故障设备
        RunDriverExportToServerCloseProcess( stock )
	}

}
function GetDeviceExportDriverStatus( UserID , DeviceInfo )
{
	//DeviceInfo[1]  DeviceIndex        
	//DeviceInfo[2]  DeviceClassID          "Net"
	//DeviceInfo[3]  DeviceClassType
	//DeviceInfo[4]  DeviceStatus
	//DeviceInfo[5]  DeviceProblem
	//DeviceInfo[6]  DeviceName
	//DeviceInfo[7]  BackupDriverStatus     0xc0000
	//DeviceInfo[8]  HardwareID
	//DeviceInfo[9]  CompatibleID           "pci\ven_1106&dev_3065&subsys_14011186..."
	//DeviceInfo[10] MatchingDeviceID
	//DeviceInfo[11] DriverDate
	//DeviceInfo[12] DriverVer
	//DeviceInfo[13] DriverProvider         "D-Link"

	// 获得用户要导出的驱动备份的描述信息，包括：
	// “设备标识、设备名、设备类别、驱动提供商、驱动版本、驱动日期、INF文件名、INF文件大小、CAT文件名、CAT文件内容、
	//   INF安装节名、驱动备份状态字、OS信息”
    //
    // 使用本函数通过设备信息获得该设备驱动备份信息的前提条件是：
    // 设备没有任何故障
    var DriverHashValueInBASE64 = ""
    // 只有状态为正常的设备，才取驱动程序的Hash值
    if ( !DeviceInfo[5] )
    {
        var BackupDriverInfo = GetGivenDeviceBackupDriverInfo( DeviceInfo )
        // 取驱动包的哈希值
        // 若驱动包内有cat文件
        if ( BackupDriverInfo["CATName"] )
        {
            var CatFileNameXml = DrvCert.FindFileInPath( BackupDriverInfo["DriverBackupPath"] + "\\" + BackupDriverInfo["CATName"] )
            var CatFileName = GetXmlSingleNodeText( CatFileNameXml , "FileItem0" )
            if ( CatFileName )
            {
                // 驱动包的哈希值等于cat文件BASE64值的哈希值
                var CatBASE64 = DrvCert.GetBASE64StringFromBinFile( 
                                                    BackupDriverInfo["DriverBackupPath"] + "\\" + 
                                                    BackupDriverInfo["CATName"] )
                DriverHashValueInBASE64 = DrvCert.GetDataHash( CatBASE64 )
            }

        }
        // 若驱动包内只有inf文件没有cat文件
        // 或者inf声称有cat文件但却无法通过此cat文件获得驱动包的唯一标识
        // 就通过inf文件来获得驱动包的唯一标识
        if ( !BackupDriverInfo["CATName"] || (BackupDriverInfo["CATName"] && !DriverHashValueInBASE64) )
        {
            var InfFileNameXml = DrvCert.FindFileInPath( BackupDriverInfo["DriverBackupPath"] + "\\" + BackupDriverInfo["INFName"] )
            var InfFileName = GetXmlSingleNodeText( InfFileNameXml , "FileItem0" )
            if ( InfFileName )
            {
                // 驱动包的哈希值等于inf文件BASE64值的哈希值
                var InfBASE64 = DrvCert.GetBASE64StringFromBinFile( BackupDriverInfo["DriverBackupPath"] + "\\" + 
                                                                         BackupDriverInfo["INFName"] )
                DriverHashValueInBASE64 = DrvCert.GetDataHash( InfBASE64 )
            }
        }
    }

	var SoapApplyURL = ServerName.value + SoapAspURL.value		//   personal.e-drivers.cn/soap/SoapApply.asp

	var SoapRequestXML = ""
    // 2006-10-26
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:IfDriverExported xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    SoapRequestXML += "         <UserID>"               + UserID                                                + "</UserID>\n"
    SoapRequestXML += "         <MatchingDeviceID>"     + XmlEncoding( DeviceInfo[10] )                         + "</MatchingDeviceID>\n"
    SoapRequestXML += "         <HardwareIDCompaIDs>"   + XmlEncoding( DeviceInfo[8] + DeviceInfo[9] )          + "</HardwareIDCompaIDs>\n"
    SoapRequestXML += "         <BackupDriverDate>"     + XmlEncoding( DeviceInfo[11] )                         + "</BackupDriverDate>\n"
    SoapRequestXML += "         <DriverHash>"           + DriverHashValueInBASE64                               + "</DriverHash>\n"
	SoapRequestXML += GetOSInfo() + "\n"
	SoapRequestXML += "     </n:IfDriverExported>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"
    // 2006-10-25
	// var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )
    
    // 2006-10-25

	if (ReturnXML == null || ReturnXML == "")
	{
        DisplayMessage( "查询设备[" + DeviceInfo[6] + "]驱动是否登记请求没有反应\n请求内容是:\n" + SoapRequestXML )
        RetInfo["Success"       ] = false
        RetInfo["ErrorInfo"     ] = "查询设备[" + DeviceInfo[6] + "]驱动是否登记请求没有反应"
		return ( RetInfo )
	}

    var RetInfo = new Array()

    var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if ( ErrorInfo ) 
	{
        DisplayMessage( "查询设备[" + DeviceInfo[6] + "]驱动是否登记请求返回错误:\n" + ErrorInfo )
        RetInfo["Success"       ] = false
        RetInfo["ErrorInfo"     ] = ErrorInfo
        RetInfo["UserID"        ] = 0
        RetInfo["DriverID"      ] = 0
        RetInfo["DriverDate"    ] = ""
        RetInfo["DriverMfg"     ] = ""
        RetInfo["NewUserID"     ] = 0
        RetInfo["NewDriverID"   ] = 0
        RetInfo["NewDriverDate" ] = ""
        RetInfo["NewDriverMfg"  ] = ""
		return ( RetInfo )
	}
	else
	{
        DisplayMessage( "查询设备[" + DeviceInfo[6] + "]驱动是否登记请求成功" )
        var ResultString         = GetInfoByTagFromXml( ReturnXML, "Result" )
        var ResultUserID         = GetInfoByTagFromXml( ReturnXML, "UserID" )
        var ResultDriverID       = GetInfoByTagFromXml( ReturnXML, "DriverID" )
        var ResultDriverDate     = GetInfoByTagFromXml( ReturnXML, "DriverDate" )
        var ResultDriverMfg      = GetInfoByTagFromXml( ReturnXML, "DriverMfg" )
        var ResultNewUserID      = GetInfoByTagFromXml( ReturnXML, "NewUserID" )
        var ResultNewDriverID    = GetInfoByTagFromXml( ReturnXML, "NewDriverID" )
        var ResultNewDriverDate  = GetInfoByTagFromXml( ReturnXML, "NewDriverDate" )
        var ResultNewDriverMfg   = GetInfoByTagFromXml( ReturnXML, "NewDriverMfg" )
        // 2006-7-8 .............................................................................
        var ResultDriverDesc     = GetInfoByTagFromXml( ReturnXML, "DriverDesc" )
        var ResultNewDriverDesc  = GetInfoByTagFromXml( ReturnXML, "NewDriverDesc" )

        var CurPath = DrvCert.GetFolderPath( 32 )
        // 从"F:\Documents and Settings\Administrator.SERVER.004\Local Settings\Temporary Internet Files"转到
        // "F:\Documents and Settings\Administrator.SERVER.004\Local Settings\Temp"
        CurPath     = CurPath.substring( 0 , CurPath.lastIndexOf( "\\" ) )    // not include last "\\"
        CurPath     = CurPath + "\\Temp"
        var TmpFileName = CurPath + "\\DrvImp.TMP"
        DrvCert.DeleteFile( TmpFileName )
        // 将驱动简介字符串内容从BASE64编码还原
        if ( ResultDriverDesc )
        {
            DrvCert.SaveBASE64ToBinFile( ResultDriverDesc , TmpFileName )
            ResultDriverDesc = DrvCert.GetStringFromFile( TmpFileName )
            DrvCert.DeleteFile( TmpFileName )
        }
        if ( ResultNewDriverDesc )
        {
            DrvCert.SaveBASE64ToBinFile( ResultNewDriverDesc , TmpFileName )
            ResultNewDriverDesc = DrvCert.GetStringFromFile( TmpFileName )
            DrvCert.DeleteFile( TmpFileName )
        }
        // 2006-7-8 .............................................................................

        RetInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
        RetInfo["ErrorInfo"     ] = ""
        RetInfo["UserID"        ] = ResultUserID
        RetInfo["DriverID"      ] = ResultDriverID
        RetInfo["DriverDate"    ] = ResultDriverDate
        RetInfo["DriverMfg"     ] = ResultDriverMfg
        // 2006-7-8
        RetInfo["DriverDesc"    ] = ResultDriverDesc

        RetInfo["NewUserID"     ] = ResultNewUserID
        RetInfo["NewDriverID"   ] = ResultNewDriverID
        RetInfo["NewDriverDate" ] = ResultNewDriverDate
        RetInfo["NewDriverMfg"  ] = ResultNewDriverMfg
        // 2006-7-8
        RetInfo["NewDriverDesc" ] = ResultNewDriverDesc

		return ( RetInfo )
	}

}
function ListDriverForUpdate()
{
    var UserChoiceUseOthersDrvFlag = ( GetCookie( "DriverType" ) != "Private" ) 
    var UpdateSystemDrvFlag = ( GetCookie( "UpdateSystemDrvFlag" ) == "true" )

	// 下面显示需要升级的系统类正常设备和用户类正常设备的清单
	//
    // 2007-3-12
    //if ( g_DeviceRowsNeedUpdateDriver )
	{
		var stock = new Array()

		// 2007-3-8
        //oRow  = document.createElement("TR");
		//oCell = document.createElement("TD");
		//oCell.colSpan= g_maxcols
		//oCell.align = "center"
		//oCell.innerHTML = "<br>下列设备驱动需要升级<br><br>"
		//oRow.appendChild(oCell);
		//g_oTBody0.appendChild(oRow);
        var ListUpdateTitleFlag = false
        // 2007-3-12
        oRow  = document.createElement("TR");
		oCell = document.createElement("TD");
		oCell.colSpan= g_maxcols
        //2007-3-12
        //
        // 不要显示到中间
        //
		//oCell.align = "center"
		oCell.innerHTML = "<span id=ListUpdateTag></span>"
		oRow.appendChild(oCell);
		g_oTBody0.appendChild(oRow);

        // 2007-2-15
        //
        //
        //////////////////////////////////////////// 先在操作系统安装驱动的设备队列中检测是否有可以升级的驱动 ////////////////////////////////////////////
        //
        //
		// 2007-3-8
        //for (var i=0; i<g_NormalSystemDeviceRows && UpdateSystemDrvFlag; i++)
		//{
        //    ReadArrayToDeviceInfo(stock , g_NormalSystemDeviceInfoArray , i)
        //
        //    oCell = document.createElement("TD");
        //    oCell.align="right"
        //
        //    var ListCurDeviceFlag = true
        //    // 如果用户同意使用服务器中任意的驱动来升级自己驱动
        //    // 且服务器中确实有更新版本的驱动
        //    if (
        //         UserChoiceUseOthersDrvFlag 
        //         && 
        //         // 若设备的驱动有更新的版本
        //          Date.parse( g_NormalSystemDeviceInfoArray[i+",NewDriverDate"] ) > Date.parse( stock[11] )
        //       )
        //    {
        /////////////////////////////////////////////////////////////////////////////////////
        // 2007-3-8
        var ListCurDeviceFlag  = true
        var HashValueExistFlag = false
        var hKey               = 0
        var oCell   , oCell2
        var oRow    , oRow2

		for (var i=0; i<g_NormalSystemDeviceRows && UpdateSystemDrvFlag; i++)
		{
            ReadArrayToDeviceInfo(stock , g_NormalSystemDeviceInfoArray , i)

            oCell = document.createElement("TD");
            oCell.align="right"

            // 2007-3-8
            // var ListCurDeviceFlag = true
            ListCurDeviceFlag = true
            // 2007-3-8
            // var HashValueExistFlag = false
            HashValueExistFlag = false
            // 若设备匹配的驱动Hash值存在
            if ( g_NormalSystemDeviceInfoArray[i+",DriverHash"] )
            {
                hKey = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\MyDrivers")
                if (hKey)
                {
                    HashValueExistFlag = DrvCert.RegQueryValue( hKey , g_NormalSystemDeviceInfoArray[i+",DriverHash"] )
                    DrvCert.RegCloseKey( hKey )
                    hKey = null
                }
                
            }
            // 如果用户同意使用服务器中任意的驱动来升级自己驱动
            // 且服务器中确实有更新版本的驱动
            if (
                  UserChoiceUseOthersDrvFlag 
                 && 
                  // 若设备的驱动有更新的版本
                  Date.parse( g_NormalSystemDeviceInfoArray[i+",NewDriverDate"] ) > Date.parse( stock[11] )
               )
            {
            // 2007-3-8
            //
            /////////////////////////////////////////////////////////////////////////////////////
                // 2007-3-8
                // 若设备匹配的驱动没有在本机器上安装过(Hash值没有保存在本机器中)
                // 
                if (  !HashValueExistFlag )
                {
                    // 显示在用户可选的升级驱动设备清单中
                    ListCurDeviceFlag = true
                    // 2007-2-15
                    // g_NormalSystemDeviceInfoArray[i..]对应使用的g_MatchingDeviceInfo信息行被列出标记
                    // （有时候只对应但没有被列出到升级设备队列中，此时g_MatchingDeviceInfo信息行要被列入其他设备中）
                    g_MatchingDeviceInfo[ g_NormalSystemDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true
                    // 设置该驱动可以升级标志，并让用户选择是否升级驱动
                    g_NormalSystemDeviceInfoArray[i+",CanUpdate"] = true
                    // 2007-3-12
                    //
                    // 缺省不安装要升级的驱动
                    // g_NormalSystemDeviceInfoArray[i+",21"] = true
                    g_NormalSystemDeviceInfoArray[i+",21"] = false

                    // 2007-3-12
                    // oCell.innerHTML = '<INPUT TYPE="checkbox" checked onclick="g_NormalSystemDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
                    oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="g_NormalSystemDeviceInfoArray[' + i + '+ \',21\']=this.checked">'

                    // 2007-2-28
                    PushCurDeviceInfo( g_NormalSystemDeviceInfoArray , i , g_DeviceForUpdateListArray )
                }
                // 2007-3-8 <<<....................................................................................................................
                else
                {
                    // 不显示在用户可选的升级驱动设备清单中
                    ListCurDeviceFlag = false
                    g_MatchingDeviceInfo[ g_NormalSystemDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true
                    // 设置该驱动不可以升级标志，并不让用户选择是否升级驱动
                    g_NormalSystemDeviceInfoArray[i+",CanUpdate"] = false
                    g_NormalSystemDeviceInfoArray[i+",21"] = false
                    // 2007-3-10
                    // oCell.innerHTML = '<INPUT TYPE="checkbox" checked onclick="g_NormalSystemDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
                    oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="g_NormalSystemDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
                    // 2007-2-28
                    PushCurDeviceInfo( g_NormalSystemDeviceInfoArray , i , g_DeviceForUpdateListArray )
                }
                // 2007-3-8 ....................................................................................................................>>>
            }
            // 如果用户不同意使用别人的驱动升级自己的驱动而正好有自己的驱动可用
            else if (    !UserChoiceUseOthersDrvFlag
                      && 
                         // 且服务器中正好有自己的驱动
                         ( g_NormalSystemDeviceInfoArray[i+",UserID"] == g_UserID ) 
                      &&
                         // 且服务器中自己的驱动有更新的版本
                         Date.parse( g_NormalSystemDeviceInfoArray[i+",DriverDate"] ) > Date.parse( stock[11] )
                    )
            {
                // 显示在用户可选的升级驱动设备清单中
                ListCurDeviceFlag = true
                // 2007-2-15
                // g_NormalSystemDeviceInfoArray[i..]对应使用的g_MatchingDeviceInfo信息行被列出标记
                // （有时候只对应但没有被列出到升级设备队列中，此时g_MatchingDeviceInfo信息行要被列入其他设备中）
                g_MatchingDeviceInfo[ g_NormalSystemDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true
                // 设置该驱动可以升级标志，并让用户选择是否升级驱动
                g_NormalSystemDeviceInfoArray[i+",CanUpdate"] = true
                // 2007-3-12
                // 缺省不安装要升级的驱动
                // g_NormalSystemDeviceInfoArray[i+",21"] = true
                g_NormalSystemDeviceInfoArray[i+",21"] = false

                // 2007-3-12
                // oCell.innerHTML = '<INPUT TYPE="checkbox" checked onclick="g_NormalSystemDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
                oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="g_NormalSystemDeviceInfoArray[' + i + '+ \',21\']=this.checked">'

                // 2007-2-28
                PushCurDeviceInfo( g_NormalSystemDeviceInfoArray , i , g_DeviceForUpdateListArray )
            }
            // 如果用户不同意使用别人的驱动升级自己的驱动而正好有别人的驱动可用
            else if (    !UserChoiceUseOthersDrvFlag
                      && 
                         // 且服务器中正好有别人的驱动
                         ( g_NormalSystemDeviceInfoArray[i+",NewUserID"] ) 
                      &&
                         // 且服务器中别人的的驱动有更新的版本
                         Date.parse( g_NormalSystemDeviceInfoArray[i+",NewDriverDate"] ) > Date.parse( stock[11] )
                    )
            {
                // 显示在用户可选的升级驱动设备清单中
                ListCurDeviceFlag = true
                // 2007-2-15
                // g_NormalSystemDeviceInfoArray[i..]对应使用的g_MatchingDeviceInfo信息行被列出标记
                // （有时候只对应但没有被列出到升级设备队列中，此时g_MatchingDeviceInfo信息行要被列入其他设备中）
                g_MatchingDeviceInfo[ g_NormalSystemDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true
                // 该驱动可以用别人的驱动升级但用户的设置屏蔽了该操作
                g_NormalSystemDeviceInfoArray[i+",UpdateDisable"] = true
                // 设置该驱动不可以升级标志，并提示用户有别人的驱动可以用来升级驱动
                g_NormalSystemDeviceInfoArray[i+",21"] = false

                oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="alert(\'您的驱动需要升级，由于您的设置，'
                                + '操作无法进行。如果想升级驱动，请改变“设备驱动程序类型”'
                                + '可选开关的状态为“通用”或“专用”，然后刷新页面。\');return false">'

                // 2007-2-28
                PushCurDeviceInfo( g_NormalSystemDeviceInfoArray , i , g_DeviceForUpdateListArray )
            }
            // 如果当前驱动没有可升级的版本,就不显示出来
            else
            {
                // 不显示在用户可选的升级驱动设备清单中
                ListCurDeviceFlag = false
                // 设置该驱动不可以升级标志，等同于用户选择不升级驱动
                g_NormalSystemDeviceInfoArray[i+",CanUpdate"] = false
                g_NormalSystemDeviceInfoArray[i+",21"] = false
                oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="alert(\'数据库中没有发现该设备的驱动，无法完成驱动修复或驱动升级操作。\');return false">'
            }

            if ( ListCurDeviceFlag )
            {
                // 2007-3-12
                //
                //// 2007-3-8 <<<............................................................
                ////
                //// 只显示一次
                //if ( !ListUpdateTitleFlag )
                //{
                //    oRow2  = document.createElement("TR");
                //    oCell2 = document.createElement("TD");
                //    oCell2.colSpan= g_maxcols
                //    oCell2.align = "center"
                //    oCell2.innerHTML = "<br>下列设备驱动需要升级<br><br>"
                //    oRow2.appendChild(oCell2);
                //    g_oTBody0.appendChild(oRow2);
                //    ListUpdateTitleFlag = true
                ListUpdateTitleFlag = true
                //}
                // 2007-3-8 ............................................................>>>

                oRow = document.createElement("TR");
                g_oTBody0.appendChild(oRow);
                oRow.appendChild(oCell)

                // 2006-7-25 ..................................................................................................
                //
                //oCell = document.createElement("TD");
                //// 新的驱动包含驱动简介内容
                //if ( g_NormalSystemDeviceInfoArray[i+",NewDriverDesc"] )
                //{
                //    // 如果用户可升级的驱动有驱动简介内容
                //    // 就显示驱动简介按钮
                //    oCell.innerHTML = "<img src='img/err.gif' "
                //                    + "onclick='DispMessageInfo( g_NormalSystemDeviceInfoArray[\"" + i + ",NewDriverDesc\"] )' " 
                //                    + "onMouseMove='this.style.cursor=\"help\"' width='16' height='16' "
                //                    + "alt='驱动简介，单击可查看详细内容'>"
                //}
                //// 如果用户不用别人的驱动升级自己的驱动或没有可升级的驱动或可升级的驱动没有驱动简介内容
                //// 驱动简介按钮就不显示
                //else
                //{
                //    oCell.innerHTML = ""
                //}
                //oRow.appendChild(oCell)
                //

                // 2007-3-1
                oCell = document.createElement("TD");

                if ( 
                        // 如果驱动数据库中只有用户自己备份的驱动
                        ( g_NormalSystemDeviceInfoArray[i+",20"] && ( g_NormalSystemDeviceInfoArray[i+",UserID"] == g_NormalSystemDeviceInfoArray[i+",NewUserID"] ) )
                      ||
                        // 如果驱动数据库中既有用户备份的驱动又有其他用户的驱动，且用户选择“私用”驱动类型,就显示该用户自己的驱动信息
                        ( g_NormalSystemDeviceInfoArray[i+",20"] && g_NormalSystemDeviceInfoArray[i+",UserID"] && !UserChoiceUseOthersDrvFlag )
                   )
                {
                    // 如果用户可升级的驱动有驱动简介内容
                    // 就显示驱动简介按钮
                    // 2007-3-19
                    // oCell.innerHTML = "<img src='img/what.gif' " //2006-8-28 od is : err.gif
                    //                 + "onclick='DispMessageInfo( g_NormalSystemDeviceInfoArray[\"" + i + ",DriverDesc\"] )' " 
                    //                 + "onMouseMove='this.style.cursor=\"help\"' width='16' height='16' "
                    //                 + "alt='驱动简介，单击可查看详细内容'>"
                     oCell.innerHTML = "&nbsp;"
                }
                // 如果驱动数据库中既有用户备份的驱动又有其他用户的驱动，且用户选择“通用”或“专用”驱动类型,就显示其他用户驱动信息
                else if ( g_NormalSystemDeviceInfoArray[i+",20"] && g_NormalSystemDeviceInfoArray[i+",UserID"] && UserChoiceUseOthersDrvFlag )
                {
                    // 如果用户可升级的驱动有驱动简介内容
                    // 就显示驱动简介按钮
                    // 2007-3-19
                    // oCell.innerHTML = "<img src='img/what.gif' " //2006-8-28 od is : err.gif
                    //                 + "onclick='DispMessageInfo( g_NormalSystemDeviceInfoArray[\"" + i + ",NewDriverDesc\"] )' " 
                    //                 + "onMouseMove='this.style.cursor=\"help\"' width='16' height='16' "
                    //                 + "alt='驱动简介，单击可查看详细内容'>"
                    oCell.innerHTML = "&nbsp;"
                }
                // 如果用户不用别人的驱动修复自己的驱动故障或没有找到任何驱动
                // 驱动简介按钮就不显示
                else
                {
                    // 2006-8-25
                    // 
                    // 当存在无法修复的驱动故障以及有驱动需要升级时，如果没有下面这行代码，显示界面会出现表格对齐错乱
                    // 需要升级的驱动没有可选择按钮
                    oCell.innerHTML = ""
                }
                oRow.appendChild(oCell)
                // 2006-7-25 ..................................................................................................

                // 2007-3-1
                var hostname        = ServerName.value + SoapAspURL.value
                // 2007-3-12
                // var DeviceDescHtml  = "<a href='http://" + hostname + "?mode=downloaddrv&driverid=" + g_NormalSystemDeviceInfoArray[i+",DriverID"] + "' alt='点击可以手工下载驱动'>" + stock[6] + "</a>"
                var DeviceDescHtml  = "<a href='http://support.lenovo.com.cn/service/Download/Downloads/Channel/Download_Driver.asp?Content_ID=" + g_NormalSystemDeviceInfoArray[i+",OldDrvID"] + "' alt='点击可以手工下载驱动'>" + stock[6] + "</a>"


                TranslateDeviceInfoToArray(stock,g_NormalSystemDeviceInfoArray, i ,i );

                for (j=g_mincols; j<g_maxcols; j++)
                {
                    oCell = document.createElement("TD");
                    //oCell.innerHTML	= stock[j];
                    (j==2)	? oCell.innerHTML = stock[7]
                            : (j==6) ? oCell.innerHTML = stock[2]
                                    // 2007-3-1
                                    // : (j==7) ? oCell.innerHTML = stock[6]
                                     : (j==7) ? oCell.innerHTML = DeviceDescHtml
                                              : oCell.innerHTML = stock[j];
                    
                    oCell.vAlign	="top"; 
                    (j==7) ? oCell.align = "left": oCell.align = "center";
                    oRow.appendChild(oCell);
                }
            }
		}
        // 2007-2-15
        //
        //
        //////////////////////////////////////////// 再先在用户安装驱动的设备队列中检测是否有可以升级的驱动 ////////////////////////////////////////////
        //
        //
        // 2007-3-8
		//for (var i=0; i<g_UserDrvDeviceRows ; i++)
		//{
        //    ReadArrayToDeviceInfo(stock , g_UserDrvDeviceInfoArray , i)
        //
        //    oCell = document.createElement("TD");
        //    oCell.align="right"
        //
        //    var ListCurDeviceFlag = true
        //    // 如果用户同意使用服务器中任意的驱动来升级自己驱动
        //    // 且服务器中确实有更新版本的驱动
        //    if ( 
        //         UserChoiceUseOthersDrvFlag 
        //         && 
        //         // 若设备的驱动有更新的版本
        //         Date.parse( g_UserDrvDeviceInfoArray[i+",NewDriverDate"] ) > Date.parse( stock[11] )
        //       )
        //    {
        //
        ///////////////////////////////////////////////////////////
        // 2007-3-8
        var ListCurDeviceFlag  = true
        var HashValueExistFlag = false
        var hKey               = 0

		for (var i=0; i<g_UserDrvDeviceRows ; i++)
		{
            ReadArrayToDeviceInfo(stock , g_UserDrvDeviceInfoArray , i)

            oCell = document.createElement("TD");
            oCell.align="right"

            // 2007-3-8
            // var ListCurDeviceFlag = true
            ListCurDeviceFlag = true
            // 2007-3-8
            // var HashValueExistFlag = false
            HashValueExistFlag = false
            // 若设备匹配的驱动Hash值存在
            if ( g_UserDrvDeviceInfoArray[i+",DriverHash"] )
            {
                hKey = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\MyDrivers")
                if (hKey)
                {
                    HashValueExistFlag = DrvCert.RegQueryValue( hKey , g_UserDrvDeviceInfoArray[i+",DriverHash"] )
                    DrvCert.RegCloseKey( hKey )
                    hKey = null
                }
                
            }
            // 如果用户同意使用服务器中任意的驱动来升级自己驱动
            // 且服务器中确实有更新版本的驱动
            // 2007-3-8
            // 且设备匹配的驱动没有在本机器上安装过
            if ( 
                 UserChoiceUseOthersDrvFlag 
                 && 
                 // 若设备的驱动有更新的版本
                 Date.parse( g_UserDrvDeviceInfoArray[i+",NewDriverDate"] ) > Date.parse( stock[11] )
               )
            {
            //
            ///////////////////////////////////////////////////////////
                // 2007-3-8
                // Hash值没有保存在本机器中
                if ( !HashValueExistFlag )
                {
                    // 显示在用户可选的升级驱动设备清单中
                    ListCurDeviceFlag = true
                    // 2007-2-15
                    // g_UserDrvDeviceInfoArray[i..]对应使用的g_MatchingDeviceInfo信息行被列出标记
                    // （有时候只对应但没有被列出到升级设备队列中，此时g_MatchingDeviceInfo信息行要被列入其他设备中）
                    g_MatchingDeviceInfo[ g_UserDrvDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true
                    // 设置该驱动可以升级标志，并让用户选择是否升级驱动
                    g_UserDrvDeviceInfoArray[i+",CanUpdate"]    = true
                    // 2007-3-12
                    // 缺省不安装要升级的驱动
                    // g_UserDrvDeviceInfoArray[i+",21"]           = true
                    g_UserDrvDeviceInfoArray[i+",21"]           = false

                    // 2007-3-12
                    // oCell.innerHTML = '<INPUT TYPE="checkbox" checked onclick="g_UserDrvDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
                    oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="g_UserDrvDeviceInfoArray[' + i + '+ \',21\']=this.checked">'

                    // 2007-2-28
                    PushCurDeviceInfo( g_UserDrvDeviceInfoArray , i , g_DeviceForUpdateListArray )
                }
                // 2007-3-8 <<<................................................................................................................
                // 
                else
                {
                    // 不显示在用户可选的升级驱动设备清单中
                    ListCurDeviceFlag = false
                    // 2007-2-15
                    // g_UserDrvDeviceInfoArray[i..]对应使用的g_MatchingDeviceInfo信息行被列出标记
                    // （有时候只对应但没有被列出到升级设备队列中，此时g_MatchingDeviceInfo信息行要被列入其他设备中）
                    g_MatchingDeviceInfo[ g_UserDrvDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true
                    // 设置该驱动不可以升级标志，并不让用户选择是否升级驱动
                    g_UserDrvDeviceInfoArray[i+",CanUpdate"]    = false
                    g_UserDrvDeviceInfoArray[i+",21"]           = false

                    // 2007-3-10
                    //oCell.innerHTML = '<INPUT TYPE="checkbox" checked onclick="g_UserDrvDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
                    oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="g_UserDrvDeviceInfoArray[' + i + '+ \',21\']=this.checked">'

                    // 2007-2-28
                    PushCurDeviceInfo( g_UserDrvDeviceInfoArray , i , g_DeviceForUpdateListArray )
                }
                // 2007-3-8 ................................................................................................................>>>
            }
            // 如果用户不同意使用别人的驱动升级自己的驱动而正好有自己的驱动可用
            else if ( 
                        // 如果用户不同意使用别人的驱动升级自己的驱动
                        !UserChoiceUseOthersDrvFlag 
                      &&
                        // 且服务器正好有自己的驱动
                        ( g_UserDrvDeviceInfoArray[i+",UserID"] == g_UserID )
                      &&
                        // 且服务器中自己的驱动有更新的版本
                        Date.parse( g_UserDrvDeviceInfoArray[i+",DriverDate"] ) > Date.parse( stock[11] )
                    )
            {
                // 显示在用户可选的升级驱动设备清单中
                ListCurDeviceFlag = true
                // 2007-2-15
                // g_UserDrvDeviceInfoArray[i..]对应使用的g_MatchingDeviceInfo信息行被列出标记
                // （有时候只对应但没有被列出到升级设备队列中，此时g_MatchingDeviceInfo信息行要被列入其他设备中）
                g_MatchingDeviceInfo[ g_UserDrvDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true
                // 设置该驱动可以升级标志，并让用户选择是否升级驱动
                g_UserDrvDeviceInfoArray[i+",CanUpdate"]    = true
                // 2007-3-12
                // 缺省不安装要升级的驱动
                // g_UserDrvDeviceInfoArray[i+",21"]           = true
                g_UserDrvDeviceInfoArray[i+",21"]           = false

                // 2007-3-12
                // oCell.innerHTML = '<INPUT TYPE="checkbox" checked onclick="g_UserDrvDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
                oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="g_UserDrvDeviceInfoArray[' + i + '+ \',21\']=this.checked">'

                // 2007-2-28
                PushCurDeviceInfo( g_UserDrvDeviceInfoArray , i , g_DeviceForUpdateListArray )
            }
            // 如果用户不同意使用别人的驱动升级自己的驱动而正好有别人的驱动可用
            else if ( 
                        // 如果用户不同意使用别人的驱动升级自己的驱动
                        !UserChoiceUseOthersDrvFlag 
                      &&
                        // 且服务器正好有别人的驱动
                        ( g_UserDrvDeviceInfoArray[i+",NewUserID"] )
                      &&
                        // 且服务器中别人的的驱动有更新的版本
                        Date.parse( g_UserDrvDeviceInfoArray[i+",NewDriverDate"] ) > Date.parse( stock[11] )
                    )
            {
                // 显示在用户可选的升级驱动设备清单中
                ListCurDeviceFlag = true
                // 2007-2-15
                // g_UserDrvDeviceInfoArray[i..]对应使用的g_MatchingDeviceInfo信息行被列出标记
                // （有时候只对应但没有被列出到升级设备队列中，此时g_MatchingDeviceInfo信息行要被列入其他设备中）
                g_MatchingDeviceInfo[ g_UserDrvDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true
                // 该驱动可以用别人的驱动升级但用户的设置屏蔽了该操作
                g_UserDrvDeviceInfoArray[i+",UpdateDisable"] = true
                // 设置为不升级该设备的驱动，提示用户有别人的驱动可以用来升级驱动
                g_UserDrvDeviceInfoArray[i+",21"] = false

                oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="alert(\'您的驱动需要升级，由于您的设置，'
                                + '操作无法继续。如果想升级驱动，请改变“设备驱动程序类型”'
                                + '可选开关的状态为“通用”或“专用”，然后刷新页面。\');return false">'
                // 2007-2-28
                PushCurDeviceInfo( g_UserDrvDeviceInfoArray , i , g_DeviceForUpdateListArray )
            }
            // 如果当前驱动没有可升级的版本,就不显示出来
            else
            {
                // 不显示在用户可选的升级驱动设备清单中
                ListCurDeviceFlag = false
                // 设置为不升级该设备的驱动，等同于用户选择不升级驱动
                g_UserDrvDeviceInfoArray[i+",CanUpdate"] = false
                g_UserDrvDeviceInfoArray[i+",21"]        = false
                oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="alert(\'数据库中没有发现该设备的驱动，无法完成驱动修复或驱动升级操作。\');return false">'
            }

            if ( ListCurDeviceFlag )
            {
                // 2007-3-12
                //
                //// 2007-3-8 <<<............................................................
                ////
                //// 只显示一次
                //if ( !ListUpdateTitleFlag )
                //{
                //    oRow2  = document.createElement("TR");
                //    oCell2 = document.createElement("TD");
                //    oCell2.colSpan= g_maxcols
                //    oCell2.align = "center"
                //    oCell2.innerHTML = "<br>下列设备驱动需要升级<br><br>"
                //    oRow.appendChild(oCell2);
                //    g_oTBody0.appendChild(oRow2);
                //    ListUpdateTitleFlag = true
                ListUpdateTitleFlag = true
                //}
                // 2007-3-8 ............................................................>>>

                oRow = document.createElement("TR");
                g_oTBody0.appendChild(oRow);

                oRow.appendChild(oCell)

                // 2006-7-8 ..................................................................................................
                oCell = document.createElement("TD");
                // 新的驱动包含驱动简介内容
                if ( g_UserDrvDeviceInfoArray[i+",NewDriverDesc"] )
                {
                    // 如果用户可升级的驱动有驱动简介内容
                    // 就显示驱动简介按钮
                    // 2007-3-19
                    //oCell.innerHTML = "<img src='img/what.gif' " //2006-8-28 od is : err.gif
                    //                + "onclick='DispMessageInfo( g_UserDrvDeviceInfoArray[\"" + i + ",NewDriverDesc\"] )' " 
                    //                + "onMouseMove='this.style.cursor=\"help\"' width='16' height='16' "
                    //                + "alt='驱动简介，单击可查看详细内容'>"
                    oCell.innerHTML = "&nbsp;"
                }
                // 如果用户不用别人的驱动升级自己的驱动或没有可升级的驱动或可升级的驱动没有驱动简介内容
                // 驱动简介按钮就不显示
                else
                {
                    oCell.innerHTML = ""
                }
                oRow.appendChild(oCell)
                // 2006-7-8 ..................................................................................................

                
                TranslateDeviceInfoToArray(stock,g_UserDrvDeviceInfoArray, i ,i );

                // 2007-2-15
                //for (j=g_mincols; j<g_maxcols; j++)
                //{
                //    oCell = document.createElement("TD");
                //    //oCell.innerHTML	= stock[j];
                //    (j==2)	? oCell.innerHTML = stock[7]
                //            : (j==6) ? oCell.innerHTML = stock[2]
                //                     : (j==7) ? oCell.innerHTML = stock[6]
                //                              : oCell.innerHTML = stock[j];
                //    
                //    oCell.vAlign	="top"; 
                //    (j==7) ? oCell.align = "left": oCell.align = "center";
                //    oRow.appendChild(oCell);
                //}

                var hostname        = ServerName.value + SoapAspURL.value
                // 2007-3-12
                // var DeviceDescHtml  = "<a href='http://" + hostname + "?mode=downloaddrv&driverid=" + g_UserDrvDeviceInfoArray[i+",DriverID"] + "' alt='点击可以手工下载驱动'>" + stock[6] + "</a>"
                var DeviceDescHtml  = "<a href='http://support.lenovo.com.cn/service/Download/Downloads/Channel/Download_Driver.asp?Content_ID=" + g_UserDrvDeviceInfoArray[i+",OldDrvID"] + "' alt='点击可以手工下载驱动'>" + stock[6] + "</a>"


                for (j=g_mincols; j<g_maxcols; j++)
                {
                    oCell = document.createElement("TD");
                    //oCell.innerHTML	= stock[j];
                    (j==2)	? oCell.innerHTML = stock[7]
                            : (j==6) ? oCell.innerHTML = stock[2]
                                    // 2007-2-1
                                    // : (j==7) ? oCell.innerHTML = stock[6]
                                    : (j==7) ? oCell.innerHTML = DeviceDescHtml
                                              : oCell.innerHTML = stock[j];
                    
                    oCell.vAlign	="top"; 
                    (j==7) ? oCell.align = "left": oCell.align = "center";
                    oRow.appendChild(oCell);
                }
            }
		}
    }
    // 2007-3-12
    if ( ListUpdateTitleFlag )
    {
        // 2007-3-19
        // ListUpdateTag.innerHTML = "<br><center>下列设备驱动需要升级</center><br><br>"
        ListUpdateTag.innerHTML = "<br><center>下列设备驱动有更新的版本，您可以选择进行升级</center><br><br>"
        
    }
    else
    {
        // 2007-3-14
        // ListUpdateTag.innerHTML = "<li>没有驱动需要升级"
        // 2007-3-19
        // ListUpdateImportResultTag.innerHTML += "<li>没有驱动需要升级"
        ListUpdateImportResultTag.innerHTML += "<li>经检测您的随机硬件驱动正常，没有可升级版本"
    }
    
}
function ListDriverForImport()
{

	var UserChoiceUseOthersDrvFlag = ( GetCookie( "DriverType" ) != "Private" ) 

	// 下面显示可以有问题设备清单
    // 注意：不是仅显示可以导入的故障驱动列表
	//
    if ( g_DevErrDeviceRows )
	{
		var stock = new Array()

        // 2006-9-28 <<<.................................................................
        var ExistCanRepairDevFlag = false
        for ( var i=0;i<g_DevErrDeviceRows ; i++ )
        {
            if ( g_DevErrDeviceInfoArray[i+",NewUserID"] ) 
            {
                ExistCanRepairDevFlag = true
                g_ExistCanRepairDevFlag ++
            }
        }
        // 如果有可以修复的驱动，才显示“。。。需要修复”内容
        if ( ExistCanRepairDevFlag )
        {
        //
        // 2006-9-28 .................................................................>>>
            oRow  = document.createElement("TR");
            oCell = document.createElement("TD");
            oCell.colSpan= g_maxcols
            // 2007-3-12
            //oCell.align = "center"
            // oCell.innerHTML = "<br>下列设备的驱动需要修复<br><br>"
            // 2007-3-19
            //oCell.innerHTML = "<br><center>下列设备的驱动需要修复</center><br>"
            oCell.innerHTML = "<br><center>经检测以下设备驱动存在问题请选择后进行修复</center><br>"
            // 2007-3-12
            //oCell.innerHTML = "<span id=ListImportTag></span>"
            //
            oRow.appendChild(oCell);
            g_oTBody0.appendChild(oRow);

            for (var i=0; i<g_DevErrDeviceRows ; i++)
            {
                ReadArrayToDeviceInfo(stock , g_DevErrDeviceInfoArray , i)
                oRow = document.createElement("TR");
                g_oTBody0.appendChild(oRow);

                oCell = document.createElement("TD");
                oCell.align="right"
    // 2006-7-25 .........................................................................................................................
    //            // 如果故障设备的驱动先前已经导出过或有别人的驱动可解决当前用户的驱动故障
    //            // 还要看用户是否同意使用别人的驱动解决自己的故障
    //            if (
    //                 // 若故障设备的驱动先前用户已经导出过
    //                 // 2006-7-19 <<<.................................................................................................................
    //                 // ( g_DevErrDeviceInfoArray[i+",20"] && ( g_DevErrDeviceInfoArray[i+",UserID"] == g_UserID) )
    //                 ( g_DevErrDeviceInfoArray[i+",20"] && ( g_DevErrDeviceInfoArray[i+",UserID"] ) )
    //                 // 2006-7-19 .................................................................................................................>>>
    //                 ||
    //                 // 或者用户同意使用别人的驱动解决自己的故障而正好有别人的驱动可用
    //                 // 2006-7-19 <<<.................................................................................................................
    //                 // ( UserChoiceUseOthersDrvFlag && g_DevErrDeviceInfoArray[i+",20"] && ( g_DevErrDeviceInfoArray[i+",UserID"] != g_UserID ) )
    //                 ( UserChoiceUseOthersDrvFlag && g_DevErrDeviceInfoArray[i+",20"] && ( g_DevErrDeviceInfoArray[i+",NewUserID"] ) )
    //                 // 2006-7-19 .................................................................................................................>>>
    //               )
    //            {
    //                // 就让用户选择是否修复驱动故障
    //                oCell.innerHTML = '<INPUT TYPE="checkbox" checked onclick="g_DevErrDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
    //            }
    //            // 如果用户不同意使用别人的驱动解决自己的故障而正好有别人的驱动可用
    //            // 2006-7-19 <<<.......................................................................................................................
    //            // else if ( !UserChoiceUseOthersDrvFlag && g_DevErrDeviceInfoArray[i+",20"] && ( g_DevErrDeviceInfoArray[i+",UserID"] != g_UserID ) )
    //            else if ( !UserChoiceUseOthersDrvFlag && g_DevErrDeviceInfoArray[i+",20"] && ( g_DevErrDeviceInfoArray[i+",NewUserID"] ) )
    //            // 2006-7-19 .......................................................................................................................>>>
    //            {
    //                // 提示用户有别人的驱动可以用来修复驱动故障
    //                g_DevErrDeviceInfoArray[i+",21"] = false
    //                oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="alert(\'由于您没有保护过该驱动，因此故障无法修复。'
    //                                + '但是系统发现驱动数据库中有驱动可以用来解决您的驱动故障，由于您的设置，'
    //                                + '驱动数据库中的驱动变得不可用。如果想使用该驱动，请改变“参数设置”的“设备驱动程序类型”'
    //                                + '可选开关的状态为“通用”或“专用”，然后刷新页面。\');return false">'
    //            }
    //            // 如果故障设备的驱动先前没有导出过
    //            else
    //            {
    //                // 就设置为不修复该设备的驱动故障，等同于用户选择不修复驱动故障
    //                g_DevErrDeviceInfoArray[i+",21"] = false
    //                oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="alert(\'驱动数据库中没有发现该设备的驱动，故障无法修复。\');return false">'
    //            }
    //            oRow.appendChild(oCell)
    //
    //            // 2006-7-8 ..................................................................................................
    //            oCell = document.createElement("TD");
    //            // 新的驱动包含驱动简介内容
    //            if ( g_DevErrDeviceInfoArray[i+",NewDriverDesc"] )
    //            {
    //                // 如果用户可升级的驱动有驱动简介内容
    //                // 就显示驱动简介按钮
    //                oCell.innerHTML = "<img src='img/err.gif' "
    //                                + "onclick='DispMessageInfo( g_DevErrDeviceInfoArray[\"" + i + ",NewDriverDesc\"] )' " 
    //                                + "onMouseMove='this.style.cursor=\"help\"' width='16' height='16' "
    //                                + "alt='驱动简介，单击可查看详细内容'>"
    //            }
    //            // 如果用户不用别人的驱动升级自己的驱动或没有可升级的驱动或可升级的驱动没有驱动简介内容
    //            // 驱动简介按钮就不显示
    //            else
    //            {
    //            }
    //            oRow.appendChild(oCell)
    //            // 2006-7-8 ..................................................................................................

                // 2006-7-25 <<<..........................................................................................................
                //
                // when g_DevErrDeviceInfoArray[i+",20"] exist 3 case:
                //
                //    1. g_DevErrDeviceInfoArray[i+",UserID"]  = g_DevErrDeviceInfoArray[i+",NewUserID"] , all > 0 
                //    2. g_DevErrDeviceInfoArray[i+",UserID"] != g_DevErrDeviceInfoArray[i+",NewUserID"] , all > 0
                //    3. g_DevErrDeviceInfoArray[i+",UserID"] = 0 , g_DevErrDeviceInfoArray[i+",NewUserID"] > 0
                //
                //  not exist this case : 
                //
                //    1. g_DevErrDeviceInfoArray[i+",UserID"] > 0 , g_DevErrDeviceInfoArray[i+",NewUserID"] = 0
                //
                //  it must be : 
                //
                //       g_DevErrDeviceInfoArray[i+",UserID"] = g_DevErrDeviceInfoArray[i+",NewUserID"] , all > 0
                //
                // 如果故障设备的驱动先前已经导出过或有别人的驱动可解决当前用户的驱动故障
                // 还要看用户是否同意使用别人的驱动解决自己的故障

                // 2006-9-28 <<<....................................................
                //
                // 如果用户的故障设备找不到数据库驱动修复，就挑出来用下面的for()代码单独显示
                //
                if ( !g_DevErrDeviceInfoArray[i+",NewUserID"] )
                {
                    //alert( stock[6] + " found and select to no repair queue" )
                    continue
                }
                //
                // 2006-9-28 ....................................................>>>

                if (
                     // 若故障设备的驱动先前用户已经导出过
                     //    1. g_DevErrDeviceInfoArray[i+",UserID"]  = g_DevErrDeviceInfoArray[i+",NewUserID"] , all > 0 
                     //    2. g_DevErrDeviceInfoArray[i+",UserID"] != g_DevErrDeviceInfoArray[i+",NewUserID"] , all > 0
                     //
                     ( g_DevErrDeviceInfoArray[i+",20"] && g_DevErrDeviceInfoArray[i+",UserID"] )
                     ||
                     // 或者用户自己没有备份驱动,但有别人的驱动可用，同时用户同意使用别人的驱动解决自己的故障
                     // 1. UserChoiceUseOthersDrvFlag , g_DevErrDeviceInfoArray[i+",UserID"]=0 , g_DevErrDeviceInfoArray[i+",NewUserID"]>0
                     //
                     //
                     ( g_DevErrDeviceInfoArray[i+",20"] && g_DevErrDeviceInfoArray[i+",NewUserID"] && UserChoiceUseOthersDrvFlag )
                   )
                {
                    // 2006-8-27 <<<...........................................................................................................
                    //
                    // // 就让用户选择是否修复驱动故障
                    // oCell.innerHTML = '<INPUT TYPE="checkbox" checked onclick="g_DevErrDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
                    //
                    // 如果设备的故障代码是22（设备被禁用）或者24（设备不存在），就设置可修复复选框为“无法修复”
                    if ( (g_DevErrDeviceInfoArray[i+",5"] == 22) || (g_DevErrDeviceInfoArray[i+",5"] == 24) )
                    {
                        // 设置用户选择修复该驱动故障
                        g_DevErrDeviceInfoArray[i+",21"] = false
                        var ConfirmString = "当前设备的故障原因是:"
                        ConfirmString += ( g_DevErrDeviceInfoArray[i+",5"] == 22 ) ? "设备被禁用，这可能是由于您在CMOS或设备管理器中禁用了该设备造成的。" 
                                       : ( g_DevErrDeviceInfoArray[i+",5"] == 24 ) ? "设备不存在，这可能是由于您从电脑中拔出了该设备造成的。"
                                       : ""
                        ConfirmString += "您仍然可以选择安装该设备的驱动，但安装驱动并不能解决设备存在的故障。您确定要安装该设备的驱动吗？"
                        // 就让用户选择是否修复驱动故障
                        oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="var tmp = \'' + ConfirmString + '\';'
                                        + 'if ( this.checked && !confirm( tmp )) return false;'
                                        + 'g_DevErrDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
                        // 2007-2-28
                        PushCurDeviceInfo( g_DevErrDeviceInfoArray , i , g_DeviceForRepairListArray )
                    }
                    // 如果设备的故障代码是22（设备被禁用）或者24（设备不存在）以外的代码，就设置可修复复选框为“可以修复”
                    else
                    {
                        // 设置用户选择修复该驱动故障
                        g_DevErrDeviceInfoArray[i+",21"] = true
                        // 就让用户选择是否修复驱动故障
                        oCell.innerHTML = '<INPUT TYPE="checkbox" checked onclick="g_DevErrDeviceInfoArray[' + i + '+ \',21\']=this.checked">'
                        // 2007-2-15
                        // g_DevErrDeviceInfoArray[i..]对应使用的g_MatchingDeviceInfo信息行被列出标记
                        // （有时候只对应但没有被列出到升级设备队列中，此时g_MatchingDeviceInfo信息行要被列入其他设备中）
                        g_MatchingDeviceInfo[ g_DevErrDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true

                        // 2007-2-28
                        PushCurDeviceInfo( g_DevErrDeviceInfoArray , i , g_DeviceForRepairListArray )
                    }
                    //
                    // 2006-8-27 ...........................................................................................................>>>
                }
                // 程序执行到这里，只存在以下情况：
                //     1. !UserChoiceUseOthersDrvFlag , g_DevErrDeviceInfoArray[i+",UserID"]=0 , g_DevErrDeviceInfoArray[i+",NewUserID"]>0
                //     2. !g_DevErrDeviceInfoArray[i+",20"]
                //
                //
                // 如果用户不同意使用别人的驱动解决自己的故障而正好有别人的驱动可用
                //
                //
                else if ( !UserChoiceUseOthersDrvFlag && g_DevErrDeviceInfoArray[i+",20"] && g_DevErrDeviceInfoArray[i+",NewUserID"] )
                {
                    // 提示用户有别人的驱动可以用来修复驱动故障
                    g_DevErrDeviceInfoArray[i+",21"] = false
                    oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="alert(\'由于您没有保护过该驱动，因此故障无法修复。'
                                    + '但是程序发现驱动数据库中有驱动可以用来解决您的驱动故障，由于您的设置，'
                                    // 2006-7-17
                                    + '驱动数据库中的驱动变得不可用。如果想使用该驱动，请改变左侧“设备驱动程序类型”'
                                    + '为“通用”或“专用”，然后刷新页面。\');return false">'
                    // 2007-2-15
                    // g_DevErrDeviceInfoArray[i..]对应使用的g_MatchingDeviceInfo信息行被列出标记
                    // （有时候只对应但没有被列出到升级设备队列中，此时g_MatchingDeviceInfo信息行要被列入其他设备中）
                    g_MatchingDeviceInfo[ g_DevErrDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true
                }
                // 程序执行到这里，只存在以下情况：
                //     1. !g_DevErrDeviceInfoArray[i+",20"]
                //
                // 如果故障设备的驱动先前没有导出过
                //
                // 2006-9-28 <<<..........................................................................................................................
                // 
                // UI调整：对没有找到驱动的设备单独现实出来，并不让用户选择修复按钮
                else
                {
                    // 就设置为不修复该设备的驱动故障，等同于用户选择不修复驱动故障
                    g_DevErrDeviceInfoArray[i+",21"] = false
                    oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="alert(\'驱动数据库中没有发现该设备的驱动，故障无法修复。\');return false">'
                    // 2007-2-15
                    // g_DevErrDeviceInfoArray[i..]对应使用的g_MatchingDeviceInfo信息行被列出标记
                    // （有时候只对应但没有被列出到升级设备队列中，此时g_MatchingDeviceInfo信息行要被列入其他设备中）
                    g_MatchingDeviceInfo[ g_DevErrDeviceInfoArray[i+",FindDriverRetRow"] + ",ListedFlag" ] = true
                }
                //
                // 2006-9-28 .........................................................................................................................>>>

                oRow.appendChild(oCell)

                oCell = document.createElement("TD");
                // 新的驱动包含驱动简介内容
                //
                //if ( g_DevErrDeviceInfoArray[i+",DriverDesc"] )
                //{
                //    // 如果用户可升级的驱动有驱动简介内容
                //    // 就显示驱动简介按钮
                //    oCell.innerHTML = "<img src='img/err.gif' "
                //                    + "onclick='DispMessageInfo( g_DevErrDeviceInfoArray[\"" + i + ",DriverDesc\"] )' " 
                //                    + "onMouseMove='this.style.cursor=\"help\"' width='16' height='16' "
                //                    + "alt='驱动简介，单击可查看详细内容'>"
                //}
                //// 如果用户不用别人的驱动升级自己的驱动或没有可升级的驱动或可升级的驱动没有驱动简介内容
                //// 驱动简介按钮就不显示
                //else
                //{
                //}

                if ( 
                        // 如果驱动数据库中只有用户备份的驱动
                        ( g_DevErrDeviceInfoArray[i+",20"] && ( g_DevErrDeviceInfoArray[i+",UserID"] == g_DevErrDeviceInfoArray[i+",NewUserID"] ) )
                      ||
                        // 如果驱动数据库中既有用户备份的驱动又有其他用户的驱动，且用户选择“私用”驱动类型,就显示该用户驱动信息
                        ( g_DevErrDeviceInfoArray[i+",20"] && g_DevErrDeviceInfoArray[i+",UserID"] && !UserChoiceUseOthersDrvFlag )
                   )
                {
                    // 如果用户可升级的驱动有驱动简介内容
                    // 就显示驱动简介按钮
                    // 2007-3-19
                    //oCell.innerHTML = "<img src='img/what.gif' " //2006-8-28 od is : err.gif
                    //                + "onclick='DispMessageInfo( g_DevErrDeviceInfoArray[\"" + i + ",DriverDesc\"] )' " 
                    //                + "onMouseMove='this.style.cursor=\"help\"' width='16' height='16' "
                    //                + "alt='驱动简介，单击可查看详细内容'>"
                    oCell.innerHTML = "&nbsp;"
                }
                // 如果驱动数据库中既有用户备份的驱动又有其他用户的驱动，且用户选择“通用”或“专用”驱动类型,就显示其他用户驱动信息
                else if ( g_DevErrDeviceInfoArray[i+",20"] && g_DevErrDeviceInfoArray[i+",UserID"] && UserChoiceUseOthersDrvFlag )
                {
                    // 如果用户可升级的驱动有驱动简介内容
                    // 就显示驱动简介按钮
                    // 2007-3-19
                    //oCell.innerHTML = "<img src='img/what.gif' " //2006-8-28 od is : err.gif
                    //                + "onclick='DispMessageInfo( g_DevErrDeviceInfoArray[\"" + i + ",NewDriverDesc\"] )' " 
                    //                + "onMouseMove='this.style.cursor=\"help\"' width='16' height='16' "
                    //                + "alt='驱动简介，单击可查看详细内容'>"
                    oCell.innerHTML = "&nbsp;"
                    // 2006-7-25
                    // 修复程序使用UserID / DriverID作为找到的驱动信息，因此，要用NewUserID / New DriverID代替之。
                    //
                    // 调用处代码如下：
                    //
                    // var ImportResult = ImportDriverToGivenDeviceFromServer( g_DevErrDeviceInfoArray[i+",UserID"] , 
                    //                                                         g_DevErrDeviceInfoArray[i+",DriverID"] ,
                    //                                                         DeviceInfo )
                    g_DevErrDeviceInfoArray[i+",UserID"  ] = g_DevErrDeviceInfoArray[i+",NewUserID"  ]
                    g_DevErrDeviceInfoArray[i+",DriverID"] = g_DevErrDeviceInfoArray[i+",NewDriverID"]
                }
                // 如果用户不用别人的驱动修复自己的驱动故障或没有找到任何驱动
                // 驱动简介按钮就不显示
                else
                {
                    // 2006-8-25
                    // 
                    // 当存在无法修复的驱动故障以及有驱动需要升级时，如果没有下面这行代码，显示界面会出现表格对齐错乱
                    // 需要升级的驱动没有可选择按钮
                    oCell.innerHTML = ""
                }
                oRow.appendChild(oCell)
                // 2006-7-25 ..............................................................................................>>>

                TranslateDeviceInfoToArray(stock,g_DevErrDeviceInfoArray, i ,i );

                // 2007-2-1 <<<...
                var hostname        = ServerName.value + SoapAspURL.value
                // 2007-3-12
                //var DeviceDescHtml  = "<a href='http://" + hostname + "?mode=downloaddrv&driverid=" + g_DevErrDeviceInfoArray[i+",DriverID"] + "' alt='点击可以手工下载驱动'>" + stock[6] + "</a>"
                var DeviceDescHtml  = "<a href='http://support.lenovo.com.cn/service/Download/Downloads/Channel/Download_Driver.asp?Content_ID=" + g_DevErrDeviceInfoArray[i+",OldDrvID"] + "' alt='点击可以手工下载驱动'>" + stock[6] + "</a>"
                
                // 2007-2-1 ...>>>

                for (j=g_mincols; j<g_maxcols; j++)
                {
                    oCell = document.createElement("TD");
                    //oCell.innerHTML	= stock[j];
                    (j==2)	? oCell.innerHTML = stock[7]
                            : (j==6) ? oCell.innerHTML = stock[2]
                                    // 2007-2-1
                                    // : (j==7) ? oCell.innerHTML = stock[6]
                                    : (j==7) ? oCell.innerHTML = DeviceDescHtml
                                              : oCell.innerHTML = stock[j];
                    
                    oCell.vAlign	="top"; 
                    (j==7) ? oCell.align = "left": oCell.align = "center";
                    oRow.appendChild(oCell);
                }
            }
        // 2006-9-28
        }


        // 2006-9-28 <<<...........................................................................................................
        // 
        var ExistCannotRepairDevFlag = false
        for ( var i=0;i<g_DevErrDeviceRows ; i++ )
        {
            if ( !g_DevErrDeviceInfoArray[i+",NewUserID"] ) 
            {
                ExistCannotRepairDevFlag = true
                // 2006-9-29
                g_ExistCannotRepairDevFlag   ++
            }
            // 2006-9-29
        }
        // 如果有无法修复的驱动，才显示“。。。没有找到可用驱动”内容
        if ( ExistCannotRepairDevFlag )
        {
            //
            // 2006-9-28 .................................................................>>>
            // 下面显示因为不能找到驱动而无法修复的设备
            // 原来的逻辑是将可以修复与无法修复的放在一起,现在将他们分开,并不让用户选择那些无法修复的设备按钮
            var stock = new Array()

            oRow  = document.createElement("TR");
            oCell = document.createElement("TD");
            oCell.colSpan= g_maxcols
            oCell.align = "center"
            // 2006-11-13
            // oCell.innerHTML = "<br>下列设备因没有找到可用驱动而无法修复<br><br>"
            // 2007-3-19
            //oCell.innerHTML = "<br>下列设备没有找到驱动无法修复<br>"
            //                + "请您<a href='http://support.lenovo.com.cn/service/Download/Downloads/Channel/' target=_blank>点击这里</a>手工下载驱动<br><br>"
            oCell.innerHTML = "<br>经检测以下设备驱动存在问题但是目前无可修复版本您可以在意见调查中反馈<br><br>"
                            
            
            oRow.appendChild(oCell);
            g_oTBody0.appendChild(oRow);

            for (var i=0; i<g_DevErrDeviceRows ; i++)
            {
                ReadArrayToDeviceInfo(stock , g_DevErrDeviceInfoArray , i)
                oRow = document.createElement("TR");
                g_oTBody0.appendChild(oRow);

                oCell = document.createElement("TD");
                oCell.align="right"


                if ( !g_DevErrDeviceInfoArray[i+",NewUserID"] )
                {
                    // 就设置为不修复该设备的驱动故障，等同于用户选择不修复驱动故障
                    g_DevErrDeviceInfoArray[i+",21"] = false
                    oCell.innerHTML = '' //'<INPUT TYPE="checkbox" onclick="alert(\'驱动数据库中没有发现该设备的驱动，故障无法修复。\');return false">'

                    oRow.appendChild(oCell)

                    oCell = document.createElement("TD");

                    // 如果用户不用别人的驱动修复自己的驱动故障或没有找到任何驱动
                    // 驱动简介按钮就不显示
                    oCell.innerHTML = ""
                    oRow.appendChild(oCell)

                    TranslateDeviceInfoToArray(stock,g_DevErrDeviceInfoArray, i ,i );

                    for (j=g_mincols; j<g_maxcols; j++)
                    {
                        oCell = document.createElement("TD");
                        //oCell.innerHTML	= stock[j];
                        (j==2)	? oCell.innerHTML = stock[7]
                                : (j==6) ? oCell.innerHTML = stock[2]
                                         : (j==7) ? oCell.innerHTML = stock[6]
                                                  : oCell.innerHTML = stock[j];
                        
                        oCell.vAlign	="top"; 
                        (j==7) ? oCell.align = "left": oCell.align = "center";
                        oRow.appendChild(oCell);
                    }
                    // 2007-2-28
                    PushCurDeviceInfo( g_DevErrDeviceInfoArray , i , g_DeviceCannotRepairListArray )
                }
            }
        }
        // 
        // 2006-9-28 ...........................................................................................................>>>
	}
    // 2007-3-12
    else
    {
        // 2007-3-14
        //oRow  = document.createElement("TR");
        //oCell = document.createElement("TD");
        //oCell.colSpan= g_maxcols
        ////oCell.align = "center"
        //oCell.innerHTML = "<li>没有驱动需要修复"
        //oRow.appendChild(oCell);
        //g_oTBody0.appendChild(oRow);
        // 2007-3-19
        // ListUpdateImportResultTag.innerHTML += "<li>没有驱动需要修复"
        ListUpdateImportResultTag.innerHTML += "<li>经检测您的随机硬件驱动正常，没有驱动需要修复"
    }
}


function RegUserHardwareInfo()
{
	// 注册用户硬件信息（包括：主板标识、CPU类型、硬盘序列号、网卡MacID、OS版本），返回用户服务标识号
	// 该号在本次驱动备份过程中一直有效，且下次用户登陆还会自动获得该号

	var SoapApplyURL = ServerName.value + SoapAspURL.value		//   drvdb.e-drivers.cn/soap/SoapAnswer.asp

	// 2005-8-2
    //var DeviceListInfo		= GetDeviceListInfoToXml()
    // 2007-2-28
    var DeviceListInfo		= GetAllDeviceInfoToXml()
	// 2006-1-26
    //var MACIDs				= GetNetCardInfo()
	//var CPUInfo				= GetCPUInfo()
	// 2005-8-2
    //var OSInfo				= GetOSInfo()

    // 2006-9-20
    DisplayMessage( "正在取主板信息..." )
	var MainBoardInfo		= GetMainBoardInfo()
    // 2006-9-20
    DisplayMessage( "正在取硬盘信息..." )
	var DiskInfo			= GetDiskInfo()
    
    // 2006-9-27
    // 如果硬盘参数中有非法或无效数据,将导致Soap.inc - RegUserHardwareInfoMethod()错误而无法返回成功标志
    // 从而出现"错误：网站...xxx...没有反应"提示
    DiskInfo = CheckAndModifyDiskInfo( DiskInfo )
    //
    // 2006-9-27

	var SoapRequestXML = ""
    // 2006-10-25
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
    SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
    //
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:RegUserHardwareInfo xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    // 2005-8-2
    //SoapRequestXML += DeviceListInfo    + "\n"
	// 2006-1-26
    //SoapRequestXML += CPUInfo			+ "\n"
	//SoapRequestXML += MACIDs			+ "\n"
    // 2005-8-2
	//SoapRequestXML += OSInfo			+ "\n"
	SoapRequestXML += MainBoardInfo		+ "\n"
	SoapRequestXML += DiskInfo			+ "\n"
	SoapRequestXML += "     </n:RegUserHardwareInfo>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"


    var RetRegUserInfo = new Array()
    var ErrorInfo = ""

    // 2006-9-20
    DisplayMessage( "正在提交用户登记信息..." )
    // 2006-10-25
	//var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )
    

	// 2006-10-25
    // if (ReturnXML == null || ReturnXML == "")
    if ( !ReturnXML )
	{
        if (!g_CanUserConnectToServer)
        {
            ErrorInfo = "错误：网络无法连通"
            DisplayMessage( "登记用户请求失败,错误原因：网络无法连通" )
            
        }
        else
        {
            ErrorInfo = "错误：网站" + ServerName.value + "没有反应"
            DisplayMessage( "登记用户请求失败\n错误原因：网站" + ServerName.value + "没有反应,请求内容：\n" + SoapRequestXML)
        }
        RetRegUserInfo["Success"] = false
        RetRegUserInfo["Info"]    = ErrorInfo
        RetRegUserInfo["UserID"]  = ""
		return ( RetRegUserInfo )
	}

	ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )

	if (ErrorInfo != null) 
	{
        RetRegUserInfo["Success"] = false
        RetRegUserInfo["Info"]    = ErrorInfo
        RetRegUserInfo["UserID"]  = ""
        DisplayMessage( "登记用户请求返回错误:\n" + ErrorInfo )
		return ( RetRegUserInfo )
	}
	else
	{
        var UserID           = GetInfoByTagFromXml( ReturnXML, "UserID" )
        // 2005-8-21
        var UserType         = GetInfoByTagFromXml( ReturnXML, "RegType" )
        // 2007-2-12
        var DownloadPath     = GetInfoByTagFromXml( ReturnXML, "DownloadPath" )
        // 2007-2-13
        var HostSerialNumber = GetInfoByTagFromXml( ReturnXML, "HostSerialNumber" )
        // 2007-2-25
        var CaseID           = GetInfoByTagFromXml( ReturnXML, "CaseID" )

        RetRegUserInfo["Success"         ] = true
        RetRegUserInfo["Info"            ]    = "登记用户请求成功,UserID=" + UserID 
        RetRegUserInfo["UserID"          ]  = UserID
        // 2005-8-21
        RetRegUserInfo["UserType"        ]  = UserType
        // 2007-2-12
        RetRegUserInfo["DownloadPath"    ]  = DownloadPath
        // 2007-2-13
        RetRegUserInfo["HostSerialNumber"] = HostSerialNumber
        // 2007-2-25
        RetRegUserInfo["CaseID"          ] = CaseID
        // 2007-2-25
        // DisplayMessage( "登记用户请求成功,UserID=" + UserID )
        DisplayMessage( "登记用户请求成功,UserID=" + UserID + ",CaseID=" + CaseID + ",Path=" + DownloadPath + ",S/N:" + HostSerialNumber )
		return ( RetRegUserInfo )
	}

}
///////////////////////////////////////////////////////////////////////////////////
function GetGivenDeviceBackupDriverInfo( DeviceInfo )
{
    // 使用本函数通过设备信息获得该设备驱动备份信息的前提条件是：
    // 设备没有任何故障

    //DeviceInfo[1]  DeviceIndex
	//DeviceInfo[2]  DeviceClassID
	//DeviceInfo[3]  DeviceClassType
	//DeviceInfo[4]  DeviceStatus
	//DeviceInfo[5]  DeviceProblem
	//DeviceInfo[6]  DeviceName
	//DeviceInfo[7]  BackupDriverStatus
	//DeviceInfo[8]  HardwareID
	//DeviceInfo[9]  CompatibleID
	//DeviceInfo[10] MatchingDeviceID
	//DeviceInfo[11] DriverDate
	//DeviceInfo[12] DriverVer
	//DeviceInfo[13] DriverProvider
	//DeviceInfo[21] = true / false


	// HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\D-LINK\NET\InstanceNumbers = 2
	// HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\D-LINK\NET\0000
	//                                  \BackupBaseDir      REG_SZ      "F:\WINNT\MyDrivers\D-Link\Net\0000"
	//                                  \BackupDriverStatus	REG_DWORD   0xc0000
	//                                  \CatalogFileName    REG_SZ      "netdlfet.cat"
	//                                  \DeviceDesc         REG_SZ      "D-Link DFE-530TX PCI Fast Ethernet Adapter (Rev B)"
	//                                  \DrvDate            REG_SZ      "4-26-2000"
	//                                  \DrvVersion         REG_SZ      "2.52.0.0"
	//                                  \HardwareID	        REG_SZ      "pci\ven_1106&dev_3065&subsys_14011186"
	//                                  \HardwareIDsCompatibleIDs REG_MULTI_SZ	"pci\ven_1106&dev_3065&subsys_14011186 ..."
	//                                  \InfSection	        REG_SZ      "VT3065.ndi.NT"
	//                                  \SystemInfName      REG_SZ      "OEM0.INF"
	// HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\D-LINK\NET\0001
	//                                  \BackupBaseDir      REG_SZ      "F:\WINNT\MyDrivers\D-Link\Net\0001"
	//                                  \BackupDriverStatus	REG_DWORD   0xc0000
	//                                  \CatalogFileName    REG_SZ      "netdlfet.cat"
	//                                  \DeviceDesc         REG_SZ      "D-Link DFE-530TX PCI Fast Ethernet Adapter (Rev B)"
	//                                  \DrvDate            REG_SZ      "5-28-2003"
	//                                  \DrvVersion	        REG_SZ      "3.0.1.0"
	//                                  \HardwareID	        REG_SZ      "pci\ven_1106&dev_3065&subsys_14011186"
	//                                  \HardwareIDsCompatibleIDs REG_MULTI_SZ	"pci\ven_1106&dev_3065&subsys_14011186 ..."
	//                                  \InfSection	        REG_SZ      "VT3065.ndi.NT"
	//                                  \SystemInfName      REG_SZ      "OEM2.INF"
	// HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\CDDrv\D-LINK&NET\InstanceNumbers = 1
	// HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\CDDrv\D-LINK&NET\0
	//                                  \BackupBaseDir      REG_SZ      "F:\WINNT\MyDrivers\D-Link\Net\0001"
	//                                  \BackupDriverStatus	REG_DWORD   0xc0000
	//                                  \CatalogFileName    REG_SZ      "netdlfet.cat"
	//                                  \DeviceDesc         REG_SZ      "D-Link DFE-530TX PCI Fast Ethernet Adapter (Rev B)"
	//                                  \DrvDate            REG_SZ      "5-28-2003"
	//                                  \DrvVersion	        REG_SZ      "3.0.1.0"
	//                                  \HardwareID	        REG_SZ      "pci\ven_1106&dev_3065&subsys_14011186"
	//                                  \HardwareIDsCompatibleIDs REG_MULTI_SZ	"pci\ven_1106&dev_3065&subsys_14011186 ..."
	//                                  \InfSection	        REG_SZ      "VT3065.ndi.NT"
	//                                  \SystemInfName      REG_SZ      "OEM2.INF"
	// HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\DownloadDrv\D-LINK&NET\InstanceNumbers = 1
	// HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\DownloadDrv\D-LINK&NET\0
	//                                  \BackupBaseDir      REG_SZ      "F:\WINNT\MyDrivers\D-Link\Net\0001"
	//                                  \BackupDriverStatus	REG_DWORD   0xc0000
	//                                  \CatalogFileName    REG_SZ      "netdlfet.cat"
	//                                  \DeviceDesc         REG_SZ      "D-Link DFE-530TX PCI Fast Ethernet Adapter (Rev B)"
	//                                  \DrvDate            REG_SZ      "5-28-2003"
	//                                  \DrvVersion	        REG_SZ      "3.0.1.0"
	//                                  \HardwareID	        REG_SZ      "pci\ven_1106&dev_3065&subsys_14011186"
	//                                  \HardwareIDsCompatibleIDs REG_MULTI_SZ	"pci\ven_1106&dev_3065&subsys_14011186 ..."
	//                                  \InfSection	        REG_SZ      "VT3065.ndi.NT"
	//                                  \SystemInfName      REG_SZ      "OEM2.INF"

	
    var BackupDriverInfo = new Array()
    BackupDriverInfo["Success"] = false

	var DriverProvider = ""
    var BackupDriverStatus = DeviceInfo[7] 
	// 驱动程序备份是通过网络下载的
	if ( BackupDriverStatus & 0x00000080 )
	{
		DriverProvider = "DownloadDrv"
	}
	// 驱动程序备份是通过光盘部署的
	else if ( BackupDriverStatus & 0x00000100 )
	{
		DriverProvider = "CDDrv"
	}
	// 驱动程序备份是通过本机备份的
	else
	{
		DriverProvider = DeviceInfo[13]
	}

    //HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\D-LINK
    //HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\CDDrv
    //HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\DownloadDrv
	var hKey = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\MyDrivers\\" + DriverProvider )
    
    //HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\D-LINK\NET
	//HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\CDDrv\D-LINK&NET
	//HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\DownloadDrv\D-LINK&NET
    var ClassNameIndex     = 0
    var ClassName		= DrvCert.RegEnumKey( hKey , ClassNameIndex )
    while ( ClassName )
    {
        var hClassKey	= DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\MyDrivers\\" + DriverProvider + "\\" + ClassName )
        //HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\D-LINK\NET\0001
        //HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\CDDrv\D-LINK&NET\1
        //HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\DownloadDrv\D-LINK&NET\1
        var InstanceKeyIndex = 0
        var InstanceKeyName = DrvCert.RegEnumKey( hClassKey , InstanceKeyIndex )
        while ( InstanceKeyName )
        {
            var CurRegKeyName = "SOFTWARE\\Walker\\MyDrivers\\" + DriverProvider + "\\" + ClassName + "\\" + InstanceKeyName
            var hInstanceKey  = DrvCert.RegOpenKey( 2 , CurRegKeyName )
            var MatchingDeviceID  = DrvCert.RegQueryValue( hInstanceKey , "HardwareID" )
            if ( MatchingDeviceID.toUpperCase() == DeviceInfo[10].toUpperCase())
            {
                var DrvDate = DrvCert.RegQueryValue( hInstanceKey , "DrvDate" )

                if ( !BackupDriverInfo["BackupDriverDate"] || 
                      ( Date.parse(BackupDriverInfo["BackupDriverDate"]) < Date.parse( DrvDate ) ) )
                {
                    BackupDriverInfo["MatchingDeviceID"]    = DrvCert.RegQueryValue( hInstanceKey , "HardwareID" )
                    BackupDriverInfo["DriverBackupPath"]    = DrvCert.RegQueryValue( hInstanceKey , "BackupBaseDir" )
                    BackupDriverInfo["BackupDriverStatus"]  = DrvCert.RegQueryValue( hInstanceKey , "BackupDriverStatus" )
                    BackupDriverInfo["DeviceDesc"]          = DrvCert.RegQueryValue( hInstanceKey , "DeviceDesc" )
                    BackupDriverInfo["BackupDriverDate"]    = DrvDate
                    BackupDriverInfo["BackupDriverVer"]     = DrvCert.RegQueryValue( hInstanceKey , "DrvVersion" )
                    BackupDriverInfo["MatchingDeviceID"]    = DrvCert.RegQueryValue( hInstanceKey , "HardwareID" )
                    BackupDriverInfo["HardwareIDCompaIDs"]  = DrvCert.RegQueryValue( hInstanceKey , "HardwareIDsCompatibleIDs" )
                    BackupDriverInfo["INFSectionName"]      = DrvCert.RegQueryValue( hInstanceKey , "InfSection" )
                    BackupDriverInfo["CATName"]             = DrvCert.RegQueryValue( hInstanceKey , "CatalogFileName" )
                    BackupDriverInfo["INFName"]             = ( BackupDriverInfo["CATName"] ) 
                                                                     ? BackupDriverInfo["CATName"].replace( /.cat$/ig , ".INF" )
                                                                     : DrvCert.RegQueryValue( hInstanceKey , "SystemInfName" )
                    BackupDriverInfo["RegPath"]             = CurRegKeyName
                    BackupDriverInfo["ClassName"]           = ClassName
                    BackupDriverInfo["Provider"]            = DriverProvider
                    BackupDriverInfo["Success"]             = true
                }
            }
            
            InstanceKeyIndex ++
            InstanceKeyName = DrvCert.RegEnumKey( hClassKey , InstanceKeyIndex )
            DrvCert.RegCloseKey( hInstanceKey )
        }

        ClassNameIndex ++
        ClassName   = DrvCert.RegEnumKey( hKey , ClassNameIndex )
        DrvCert.RegCloseKey( hClassKey )
    }
    DrvCert.RegCloseKey( hKey )
    //BackupDriverInfo["Success"]             true/false
	//BackupDriverInfo["RegPath"]             "HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\D-LINK\NET\0000"
	//BackupDriverInfo["DeviceDesc"]          "D-Link DFE-530TX PCI Fast Ethernet Adapter (Rev B)"
	//BackupDriverInfo["BackupDriverStatus"]  0xc0000
	//BackupDriverInfo["MatchingDeviceID"]    "pci\ven_1106&dev_3065&subsys_14011186"
	//BackupDriverInfo["HardwareIDCompaIDs"]  "pci\ven_1106&dev_3065&subsys_14011186..."
	//BackupDriverInfo["BackupDriverDate"]    "5-28-2003"
	//BackupDriverInfo["BackupDriverVer"]     "3.0.1.0"
    //BackupDriverInfo["DriverBackupPath"]    "F:\WINNT\MyDrivers\D-Link\Net\0001"
    //BackupDriverInfo["INFName"]             "OEM2.INF"
    //BackupDriverInfo["CATName"]             "netdlfet.cat"
    //BackupDriverInfo["INFSectionName"]      "VT3065.ndi.NT"
    //BackupDriverInfo["ClassName"]           "Net" / "D-LINK&Net"
    //BackupDriverInfo["Provider"]            "D-Link" / "CDDrv" / "DownloadDrv"
    return ( BackupDriverInfo )
}
// 检查要导出的驱动完整性和合法性
function CheckGivenBackupDriverValidity( BackupDriverInfo )
{
    //BackupDriverInfo["Success"]             true/false
	//BackupDriverInfo["RegPath"]             "HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\D-LINK\NET\0000"
	//BackupDriverInfo["DeviceDesc"]          "D-Link DFE-530TX PCI Fast Ethernet Adapter (Rev B)"
	//BackupDriverInfo["BackupDriverStatus"]  0xc0000
	//BackupDriverInfo["MatchingDeviceID"]    "pci\ven_1106&dev_3065&subsys_14011186"
	//BackupDriverInfo["HardwareIDCompaIDs"]  "pci\ven_1106&dev_3065&subsys_14011186..."
	//BackupDriverInfo["BackupDriverDate"]    "5-28-2003"
	//BackupDriverInfo["BackupDriverVer"]     "3.0.1.0"
    //BackupDriverInfo["DriverBackupPath"]    "F:\WINNT\MyDrivers\D-Link\Net\0001"
    //BackupDriverInfo["INFName"]             "OEM2.INF"
    //BackupDriverInfo["CATName"]             "netdlfet.cat"
    //BackupDriverInfo["INFSectionName"]      "VT3065.ndi.NT"
    //BackupDriverInfo["ClassName"]           "Net" / "D-LINK&Net"
    //BackupDriverInfo["Provider"]            "D-Link" / "CDDrv" / "DownloadDrv"
    return CheckExportDriverValidity( BackupDriverInfo )
}
function UploadUserErrorBackupDriverInfoToServer( UserID , BackupDriverInfo  , errorString )
{
    //BackupDriverInfo["Success"]             true/false
	//BackupDriverInfo["RegPath"]             "HKEY_LOCAL_MACHINE\SOFTWARE\Walker\MyDrivers\D-LINK\NET\0000"
	//BackupDriverInfo["DeviceDesc"]          "D-Link DFE-530TX PCI Fast Ethernet Adapter (Rev B)"
	//BackupDriverInfo["BackupDriverStatus"]  0xc0000
	//BackupDriverInfo["MatchingDeviceID"]    "pci\ven_1106&dev_3065&subsys_14011186"
	//BackupDriverInfo["HardwareIDCompaIDs"]  "pci\ven_1106&dev_3065&subsys_14011186..."
	//BackupDriverInfo["BackupDriverDate"]    "5-28-2003"
	//BackupDriverInfo["BackupDriverVer"]     "3.0.1.0"
    //BackupDriverInfo["DriverBackupPath"]    "F:\WINNT\MyDrivers\D-Link\Net\0001"
    //BackupDriverInfo["INFName"]             "NETDLFET.INF"
    //BackupDriverInfo["CATName"]             "netdlfet.cat"
    //BackupDriverInfo["INFSectionName"]      "VT3065.ndi.NT"
    //BackupDriverInfo["ClassName"]           "Net" / "D-LINK&Net"
    //BackupDriverInfo["Provider"]            "D-Link" / "CDDrv" / "DownloadDrv"
	var SoapApplyURL = ServerName.value + SoapAspURL.value		//   personal.e-drivers.cn/soap/SoapApply.asp

	var SoapRequestXML = ""
    // 2006-10-26
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:UploadUserErrorBackupDriverInfo xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
	SoapRequestXML += GetOSInfo() + "\n"
    SoapRequestXML += "         <UserID>"               + UserID                                                + "</UserID>\n"
    SoapRequestXML += "         <RegPath>"              + XmlEncoding( BackupDriverInfo["RegPath"] )            + "</RegPath>\n"
    SoapRequestXML += "         <DeviceDesc>"           + XmlEncoding( BackupDriverInfo["DeviceDesc"] )         + "</DeviceDesc>\n"
    SoapRequestXML += "         <BackupDriverStatus>"   + XmlEncoding( BackupDriverInfo["BackupDriverStatus"] ) + "</BackupDriverStatus>\n"
    SoapRequestXML += "         <MatchingDeviceID>"     + XmlEncoding( BackupDriverInfo["MatchingDeviceID"] )   + "</MatchingDeviceID>\n"
    SoapRequestXML += "         <HardwareIDCompaIDs>"   + XmlEncoding( BackupDriverInfo["HardwareIDCompaIDs"] ) + "</HardwareIDCompaIDs>\n"
    SoapRequestXML += "         <BackupDriverDate>"     + XmlEncoding( BackupDriverInfo["BackupDriverDate"] )   + "</BackupDriverDate>\n"
    SoapRequestXML += "         <BackupDriverVer>"      + XmlEncoding( BackupDriverInfo["BackupDriverVer"] )    + "</BackupDriverVer>\n"
    SoapRequestXML += "         <DriverBackupPath>"     + XmlEncoding( BackupDriverInfo["DriverBackupPath"] )   + "</DriverBackupPath>\n"
    SoapRequestXML += "         <INFName>"              + XmlEncoding( BackupDriverInfo["INFName"] )            + "</INFName>\n"
    SoapRequestXML += "         <CATName>"              + XmlEncoding( BackupDriverInfo["CATName"] )            + "</CATName>\n"
    SoapRequestXML += "         <INFSectionName>"       + XmlEncoding( BackupDriverInfo["INFSectionName"] )     + "</INFSectionName>\n"
    SoapRequestXML += "         <ClassName>"            + XmlEncoding( BackupDriverInfo["ClassName"] )          + "</ClassName>\n"
    SoapRequestXML += "         <Provider>"             + XmlEncoding( BackupDriverInfo["Provider"] )           + "</Provider>\n"
    SoapRequestXML += "         <DriverBackupPath>"     + XmlEncoding( BackupDriverInfo["DriverBackupPath"] )   + "</DriverBackupPath>\n"
    SoapRequestXML += "         <ErrorString>"          + XmlEncoding( errorString )                            + "</ErrorString>\n"
    // 2005-8-9
    //SoapRequestXML += "         <INFContent>\n"         + XmlEncoding( DrvCert.GetStringFromFile( BackupDriverInfo["DriverBackupPath"] + "\\" + BackupDriverInfo["INFName"] ) ) + "</INFContent>\n"
    SoapRequestXML += "         <INFContent>\n"         + XmlEncoding( DrvCert.GetBASE64StringFromBinFile( BackupDriverInfo["DriverBackupPath"] + "\\" + BackupDriverInfo["INFName"] ) ) + "</INFContent>\n"
    SoapRequestXML += "     </n:UploadUserErrorBackupDriverInfo>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

	// 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )

	if (ReturnXML == null || ReturnXML == "")
	{
		alert( "登记故障驱动请求没有回应" )
        DisplayMessage( "登记故障驱动请求没有回应,请求内容:\n" + SoapRequestXML )
		return ""
	}

	var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if (ErrorInfo != null) 
	{
		//alert( ErrorInfo )
		return ""
	}
	else
	{
		return GetInfoByTagFromXml( ReturnXML, "DriverID" )
	}

}
function DriverImportUpdateProcedure()
{
    // 2007-3-2
    // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
    g_RunningStatus += "Step=3 , Status=0 , Finish=0 ; "
    SetCookie( "eDrv_Param" , g_RunningStatus , 1 )

	DisplayMessage("驱动升级处理开始...");
    // 下列函数执行时会动态显示当前处理中的设备信息，显示设备信息前会先删除oTableContainer的内容以刷新，
    // 因此，如果要在此函数执行后利用oTableContainer显示设备驱动信息，需要重新执行以下代码：
    // DeleteDeviceTable();CreateDeviceTable();
    UpdateDriverFromServer()
	DisplayMessage("驱动升级处理结束");
    
    DisplayMessage("驱动修复处理开始...");
    // 下列函数执行时会动态显示当前处理中的设备信息，显示设备信息前会先删除oTableContainer的内容以刷新，
    // 因此，如果要在此函数执行后利用oTableContainer显示设备驱动信息，需要重新执行以下代码：
    // DeleteDeviceTable();CreateDeviceTable();
    ImportDriverFromServer()
	DisplayMessage("驱动修复处理结束");

    // 2007-2-15
    DisplayMessage("其他驱动处理开始...");
    OtherDriverImportFromServer()
	DisplayMessage("其他驱动处理结束");

    //DisplayMessage("驱动保护处理开始...");
    // 下列函数执行时会动态显示当前处理中的设备信息，显示设备信息前会先删除oTableContainer的内容以刷新，
    // 因此，如果要在此函数执行后利用oTableContainer显示设备驱动信息，需要重新执行以下代码：
    // DeleteDeviceTable();CreateDeviceTable();
    //ExportDriverToServer()
	//DisplayMessage("驱动保护处理结束");

    // 2007-3-5
    // 2007-3-15
    // if ( g_LogConfigInfo[ USER_DEVICE_FIX_LOG_NAME ] )
    if ( g_LogConfigInfo[ USER_DEVICE_FIX_LOG_NAME ] == "true" )
    {
        SubmitDeviceFixInfoLog(     g_UserID , 
                                    g_CaseID , 
                                    g_UpdatedDeviceArray , g_UpdatedDeviceRows ,
                                    g_ImportedDeviceArray , g_ImportedDeviceRows ,
                                    g_ImportedOtherDriverDeviceArray , g_ImportedOtherDriverRows ,
                                    USER_DEVICE_FIX_LOG_NAME )   // ItemD
    }




    // 显示有故障设备的处理结果
    var BackupDeviceErrorRow  = g_UserSelectExpDrvNumber - g_ExportedSuccessDeviceRows 
	var ProcessResult = ''
                     // 2006-8-29
                     // + '<center>处理结果<br><br>'
                     + '<center>处理结果</center><br>'
                     //
                     + '<ul>'
                     + '<li>已经检测了 ' + (g_MaxDeviceIndex) + ' 个设备。</li>'
	// 2006-9-28
    //if ( g_UserSelectExpDrvNumber ) 
    //    ProcessResult += '，您选择保护'+ g_UserSelectExpDrvNumber + '个驱动'
    //if ( g_ExportedSuccessDeviceRows )
    //    ProcessResult += '，成功保护了' + g_ExportedSuccessDeviceRows + '个驱动'
    //if ( BackupDeviceErrorRow )
    //    ProcessResult += '，有' + BackupDeviceErrorRow + '个驱动保护失败'

    var TotalExp = g_UserExportedDriverRows + g_ExportedSuccessDeviceRows
    //if ( TotalExp )
    //      ProcessResult += '，您现在共保护了' + TotalExp + '个驱动'

    // 2006-8-29 <<<.............................................................................................................

    ///////////////////////////////////////////////// 修复驱动 ///////////////////////////////////////////////////////
    // 2006-8-29
    //
    // 如果用户选择过修复驱动故障
    if ( g_UserSelectImpDrvNumber || g_CanImportDrvNumber )
    {
        // 2006-9-28
        //if ( g_DevErrDeviceRows )
        if ( g_CanImportDrvNumber )
        {        
            // 2006-9-28
            // ProcessResult += '。有' + g_UserSelectImpDrvNumber + '个驱动需要修复'
            //if ( g_UserSelectImpDrvNumber )
                ProcessResult += "<li>有" + g_CanImportDrvNumber + "个驱动可以修复"
        }
        if ( g_UserSelectImpDrvNumber )
        {
            ProcessResult += "，您选择修复" + g_UserSelectImpDrvNumber + "个"
        }
        else
        {
            ProcessResult += "，您取消了" + (g_CanImportDrvNumber-g_UserSelectImpDrvNumber) + "个修复操作"
        }

        // 2006-11-9
        //// 2005-8-6
        //// 如果驱动故障全部被修复
        //if ( g_ImportedSuccessDeviceRows == g_UserSelectImpDrvNumber )
        //{
        //    if ( g_ImportedSuccessDeviceRows )
        //        ProcessResult += "，修复成功" + g_ImportedSuccessDeviceRows + "个"
        //}
        //// 如果驱动故障部分被修复
        //else if ( g_ImportedSuccessDeviceRows )
        //{
        //    ProcessResult += "，修复成功" + g_ImportedSuccessDeviceRows + "个，修复失败"
        //                  // 2006-8-29
        //                  // + ( g_DevErrDeviceRows - g_ImportedSuccessDeviceRows ) + '个驱动修复失败'
        //                  + ( g_UserSelectImpDrvNumber - g_ImportedSuccessDeviceRows ) + "个"
        //}
        //// 如果驱动故障全部没有被修复
        //else
        //{
        //    ProcessResult += "，修复失败"
        //                 // 2006-8-29
        //                 // + ( g_DevErrDeviceRows - g_ImportedSuccessDeviceRows ) + '个驱动修复失败'
        //                 + ( g_UserSelectImpDrvNumber ) + "个"
        //}

        ProcessResult   += "。"
    }
    // 2006-9-28
    //if ( g_DevErrDeviceRows )
    //{
    //    if ( g_DevErrDeviceRows - g_UserSelectImpDrvNumber )
    //    {
    //        ProcessResult += '，'+ (g_DevErrDeviceRows - g_UserSelectImpDrvNumber) + '个驱动修复被取消'
    //    }
    //}

    ///////////////////////////////////////////////// 升级驱动 ///////////////////////////////////////////////////////


    // 如果用户选择过升级驱动
    if ( g_UserSelectUpdateDrvNumber || g_DeviceRowsNeedUpdateDriver )
    {
        if ( g_DeviceRowsNeedUpdateDriver )
        {
            // 2006-9-28
            ProcessResult += "<li>有" + g_DeviceRowsNeedUpdateDriver + "个驱动可以升级"
        }

        // 2006-9-28
        //ProcessResult += "，您选择升级" + g_DeviceRowsNeedUpdateDriver + "个"
        if ( g_DeviceRowsNeedUpdateDriver )
        {
            // 2006-11-11
            // ProcessResult += "，您选择升级" + g_DeviceRowsNeedUpdateDriver + "个"
            ProcessResult += "，您选择升级" + g_UserSelectUpdateDrvNumber + "个"
        }
        else
        {
            // 2006-11-11
            // ProcessResult += "，您取消了" + (g_DeviceRowsNeedUpdateDriver-g_DeviceRowsNeedUpdateDriver) + "个升级操作"
            ProcessResult += "，您取消了" + (g_DeviceRowsNeedUpdateDriver-g_UserSelectUpdateDrvNumber) + "个升级操作"
        }

        // 2006-11-9
        //
        //// 如果驱动全部被升级成功
        //if ( g_UpdatedSuccessDeviceRows == g_UserSelectUpdateDrvNumber )
        //{
        //    if ( g_UpdatedSuccessDeviceRows )
        //        ProcessResult += "，升级成功" + g_UpdatedSuccessDeviceRows + "个"
        //}
        //// 如果驱动部分被升级
        //else if ( g_UpdatedSuccessDeviceRows )
        //{
        //    ProcessResult += "，升级成功" + g_UpdatedSuccessDeviceRows + "个，升级失败"
        //                 + ( g_UserSelectUpdateDrvNumber - g_UpdatedSuccessDeviceRows ) + "个"
        //}
        //// 如果驱动全部没有被升级
        //else
        //{
        //    ProcessResult += "，升级失败"
        //                 + ( g_UserSelectUpdateDrvNumber ) + "个"
        //}
        ProcessResult   += "。"
    }
    // 2006-9-28
    //if ( g_DeviceRowsNeedUpdateDriver )
    //{
    //    if ( g_DeviceRowsNeedUpdateDriver - g_UserSelectUpdateDrvNumber )
    //    {
    //        ProcessResult += '，'+ (g_DeviceRowsNeedUpdateDriver - g_UserSelectUpdateDrvNumber) + '个驱动升级被取消'
    //    }
    //}

    // 2007-2-16
    ///////////////////////////////////////////////// 其他驱动 ///////////////////////////////////////////////////////

    //var g_OtherDriverListNumber         
    //var g_OtherDriverNeedImpNumber      
    //var g_ImportedOtherDriverRows       
    //var g_NoImportOtherDriverDeviceRows 

    // 如果用户选择过升级驱动
    if ( g_OtherDriverListNumber )
    {
        ProcessResult += "<li>有" + g_OtherDriverListNumber + "个其他驱动"

        if ( g_OtherDriverNeedImpNumber )
        {
           ProcessResult += "，您选择安装" + g_OtherDriverNeedImpNumber + "个"
        }
        else
        {
            ProcessResult += "，您取消了" + (g_OtherDriverListNumber-g_OtherDriverNeedImpNumber) + "个驱动安装操作"
        }

        // 2006-11-9
        //
        //// 如果驱动全部被升级成功
        //if ( g_UpdatedSuccessDeviceRows == g_UserSelectUpdateDrvNumber )
        //{
        //    if ( g_UpdatedSuccessDeviceRows )
        //        ProcessResult += "，升级成功" + g_UpdatedSuccessDeviceRows + "个"
        //}
        //// 如果驱动部分被升级
        //else if ( g_UpdatedSuccessDeviceRows )
        //{
        //    ProcessResult += "，升级成功" + g_UpdatedSuccessDeviceRows + "个，升级失败"
        //                 + ( g_UserSelectUpdateDrvNumber - g_UpdatedSuccessDeviceRows ) + "个"
        //}
        //// 如果驱动全部没有被升级
        //else
        //{
        //    ProcessResult += "，升级失败"
        //                 + ( g_UserSelectUpdateDrvNumber ) + "个"
        //}
        ProcessResult   += "。"
    }

    var RebootFlag          = false

    // 2006-8-29
    //
    var ImportPrompt = ""
    // 查找所有修复后的设备信息
    for (var i=0; i<g_ImportedDeviceRows ; i++)
    {
        // 若驱动修复成功
        if ( g_ImportedDeviceArray[ i + ",22"] )
        {
            //     1、设备状态字提示需要重新启动，则置重新启动标志
            if ( g_ImportedDeviceArray[ i + ",4"] & 0x00000100 ) RebootFlag = true
            //     2、设备故障代码还是28(设备安装失败)，则置重新启动标志
            if ( g_ImportedDeviceArray[ i + ",5"] == 28 ) RebootFlag = true

            //     3、如果有USB/PCMCIA设备已经安装成功过驱动但设备仍然有问题，提示用户重新插拔设备
            if (    
                    ( 
                       ( g_ImportedDeviceArray[ i + ",8"].search(/^USB/i) != -1 ) 
                     || 
                       ( g_ImportedDeviceArray[ i + ",8"].search(/^PCMCIA/i) != -1 ) 
                    ) 
                 && 
                    ( g_ImportedDeviceArray[ i + ",5"] ) 
               )
            {
               ImportPrompt += "<li>设备[" + g_ImportedDeviceArray[ i + ",6"] + "]需要重新插拔硬件或重新启动系统后才能生效；</li>"
               RebootFlag = true
            }
        }

        // 如果有设备被禁用，提示用户可能跟CMOS硬件设置/设备管理器软件设置有关系；
        if ( g_ImportedDeviceArray[ i + ",5"] == 22 ) 
        {
           ImportPrompt += "<li>设备[" + g_ImportedDeviceArray[ i + ",6"] + "]被禁用，请检查您的CMOS硬件设置和设备管理器的软件设置；</li>"
        }
        // 如果有设备不存在，提示用户设备不存在无法修复；
        if ( g_ImportedDeviceArray[ i + ",5"] == 24 ) 
        {
           ImportPrompt += "<li>设备[" + g_ImportedDeviceArray[ i + ",6"] + "]不存在，请检查该设备是否已经被拔出；</li>"
        }
    }
    // 2006-9-28
    //
    // 对用户取消修复或没有驱动而无法修复的设备，现在的逻辑是不显示有关内容，即：
    // 只显示用户选择设备的处理结果
    //
    //// 对用户取消修复的设备或无法修复的设备
    //for (var i=0; i<g_NoImportDeviceRows ; i++)
    //{
    //    // 如果有设备被禁用，提示用户可能跟CMOS硬件设置/设备管理器软件设置有关系；
    //    if ( g_NoImportDeviceArray[ i + ",5"] == 22 ) 
    //    {
    //       ImportPrompt += "<li>设备[" + g_NoImportDeviceArray[ i + ",6"] + "]被禁用，请检查您的CMOS硬件设置和设备管理器的软件设置；</li>"
    //    }
    //    // 如果有设备不存在，提示用户设备不存在无法修复；
    //    if ( g_NoImportDeviceArray[ i + ",5"] == 24 ) 
    //    {
    //       ImportPrompt += "<li>设备[" + g_NoImportDeviceArray[ i + ",6"] + "]不存在，请检查该设备是否已经被拔出；</li>"
    //    }
    //    // 如果设备没有安装驱动
    //    if ( g_NoImportDeviceArray[ i + ",5"] == 1 || g_NoImportDeviceArray[ i + ",5"] == 28 ) 
    //    {
    //       ImportPrompt += "<li>设备[" + g_NoImportDeviceArray[ i + ",6"] + "]没有安装驱动；</li>"
    //    }
    //}
    
    ImportPrompt = ( ImportPrompt ) ? "<li>故障分析和处理：<ul>" + ImportPrompt + "</ul></li>" : ""


    // 查找所有升级驱动后的设备信息
    // 只有RebootFlag == false时才需要检测，如果RebootFlag== true就不用再检测了
    for (var i=0; ( !RebootFlag && (i<g_DeviceRowsNeedUpdateDriver) ); i++ )
    {
        //
        // 若驱动升级成功
        if ( g_UpdatedDeviceArray[ i + ",22"] )
        {
            //     1、设备状态字提示需要重新启动，则置重新启动标志
            if ( g_UpdatedDeviceArray[ i + ",4"] & 0x00000100 ) RebootFlag = true
        }
    }


    // 提示用户设备故障原因以及是否需要重新启动；
    // use next line will error in ie5 with "memory written"
    //ProcessResult += ( RebootFlag ) ? "，您需要重新启动系统以使设置生效" : ""
    if ( RebootFlag )
        ProcessResult += "您需要重新启动系统以使设置生效。"

    ProcessResult   += ''
                     + '</li>'
                     // 2006-8-29
                     + ImportPrompt
					 + '</ul>'
                     // 2006-8-29
                     //+ '</center>'
    //
    // 2006-8-29 .............................................................................................................>>>


	Title.innerHTML = ProcessResult ;
	UserIDTag.innerHTML =   '<table>'
                          + '<tr>'
                          + '<td>机器代码:</td><td>' + g_UserID + '&nbsp;&nbsp;&nbsp;<br></td>'
                          + '</tr>'
                          // 2006-11-9
                          //+ '<tr>'
                          //+ '<td>保护驱动:</td><td>' + ( g_UserExportedDriverRows + g_ExportedSuccessDeviceRows ) + '&nbsp;&nbsp;&nbsp;<br></td>'
                          //+ '</tr>'
                          + '</table>'



    DeleteDeviceTable();
	CreateDeviceTable();
	oTableContainer.align="center"

    ListDriverImportedResult()

    ListDriverUpdatedResult()

    // 2007-2-16
    ListOtherDriverImportedResult()

    // 2006-9-28
    //
    // 最后加一个步骤，将上面修复和升级驱动的设备扫描一遍，尤其对EXE驱动安装完成后需要重新启动的情况，把设备列出来并给用户一个提示
    //ListDriverNeedRebootResult()
    //
    // 2006-9-28

    oRow  = document.createElement("TR");
	oCell = document.createElement("TD");
	oCell.colSpan= g_maxcols+1
	oCell.align = "center"
    // 2006-10-23
    // 
    // 如果是第一次执行到这个地方，就再检测一次是否还有修复过程中产生的新设备
    //
    if ( !g_NextStepClickedFlag )
    {
        // 2006-11-8
        DisplayMessage("正在检测是否有由于为设备安装驱动而产生的新设备...");
        // 2006-11-8
        //
        // 这里对重新枚举有一个优化：如果程序检测到有设备重新枚举动作（一般都伴随新设备产生）才进行重新枚举设备、安装驱动操作；
        // 否则，就直接完成
        DisplayMessage("当前设备数是：" + g_DeviceRows );
        var CurrentDeviceNumber = g_DeviceRows
        DisplayMessage( "正在重新枚举设备..." );
        // 2006-11-8
        // 必须要对g_DeviceRows清零
        g_DeviceRows = 0
        DrvInst.EnumDevice(0)
        DisplayMessage( "重新枚举设备完成" );
        DisplayMessage( "重新枚举设备的设备数是：" + g_DeviceRows );
        // 如果枚举设备后的设备数与之前没有变化，就显示结束按钮
        if ( g_DeviceRows <= CurrentDeviceNumber )
        {
            // 2007-3-2
            //g_LogConfigInfo["RetUrlRows"                ]
            //g_LogConfigInfo[ i + ",RetUrlItemName"      ] = "ItemA"
            //g_LogConfigInfo[ i + ",RetUrlItemCaller"    ] = "WSS"
            //g_LogConfigInfo[ i + ",RetUrlSetting"       ] = "http://..."
            //g_LogConfigInfo[ i + ",RetUrlDesc"          ]
            //g_LogConfigInfo[ "RetUrlItemA" ] = 3
            // 2007-3-3
            // if ( g_LogConfigInfo[ "RetUrlItemD" ] )
            if ( g_LogConfigInfo[ "RetUrlItemD" ] != undefined )
            {
                oCell.innerHTML = "<br>"
                                // 2007-3-3
                                + "<input type='button' value='下一步' onclick='window.opener.location=\"" + g_LogConfigInfo[ g_LogConfigInfo[ "RetUrlItemD" ] + ",RetUrlSetting" ] + "?wssret=311\";window.close()'>"
            }
            else
            {
	            oCell.innerHTML = "<br>"
					//+ "<input type='button' value='完  成' onclick='window.close() ; return false;'>"
					// Robin 2006-12-1
					+ "<input type='button' value='意见建议' onclick='window.open(\"Comment.htm\"); return false;'>"
            }
            // 2007-3-2
            // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
            g_RunningStatus += "Step=3 , Status=1 , Finish=1 ; "
            SetCookie( "eDrv_Param" , g_RunningStatus , 1 )
            // 2007-3-3
        	//DisplayMessage("运行状态参数：" + g_RunningStatus );
        }
        else
        {
            // 2007-3-2
            //g_LogConfigInfo["RetUrlRows"                ]
            //g_LogConfigInfo[ i + ",RetUrlItemName"      ] = "ItemA"
            //g_LogConfigInfo[ i + ",RetUrlItemCaller"    ] = "WSS"
            //g_LogConfigInfo[ i + ",RetUrlSetting"       ] = "http://..."
            //g_LogConfigInfo[ i + ",RetUrlDesc"          ]
            //g_LogConfigInfo[ "RetUrlItemA" ] = 3
            // 2007-3-3
            // if ( g_LogConfigInfo[ "RetUrlItemD" ] )
            if ( g_LogConfigInfo[ "RetUrlItemD" ] != undefined )
            {
                oCell.innerHTML = "<br>"
                                // 2007-3-3
                                + "<input type='button' value='下一步' onclick='window.opener.location=\"" + g_LogConfigInfo[ g_LogConfigInfo[ "RetUrlItemD" ] + ",RetUrlSetting" ] + "?wssret=311\";window.close()'>"
            }
            else
            {
	            oCell.innerHTML = "<br>"
                    // 2006-10-15
	                //+ "<input type='button' value='上一步' onclick='StartDriverImportUpdate();'>"   //javascript:DeleteDeviceTable();CreateDeviceTable();oTableContainer.align=\"center\";EnumDevice(1)
                    // 2006-10-15
                    ////2005-7-30
					//+ "<input type='button' value='下一步' onclick='if ( this.value == \"完  成\" ) { window.close() ; return false; }; window.open( \"Comment.htm\" );this.value=\"完  成\"'>"
                    // 2006-10-23
                    // + "<input type='button' value='下一步' onclick='StartDriverImportUpdate();'>"
                    // 2006-10-29
                    // + "<input type='button' value='下一步' onclick='StartDriverImportUpdate();g_NextStepClickedFlag=true'>"
                    // 2006-11-4
                    // + "<input type='button' value='下一步' onclick='StartDriverImportUpdate( 1 );g_NextStepClickedFlag=true'>"
                    // 2006-11-6
					// + "<input type='button' value='下一步' onclick='if ( this.value == \"完  成\" ) { window.close() ; return false; }; window.open( \"Comment.htm\" );this.value=\"完  成\"'>"
                     + "<input type='button' value='下一步' onclick='StartDriverImportUpdate( 1 );g_NextStepClickedFlag=true'>"
             }
            // 2007-3-2
            // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
            g_RunningStatus += "Step=3 , Status=1 , Finish=1 ; "
            SetCookie( "eDrv_Param" , g_RunningStatus , 1 )
            // 2007-3-3
        	//DisplayMessage("运行状态参数：" + g_RunningStatus );
        }
    }
    // 如果是第二次执行到这个地方，就不再检测是否还有修复过程中产生的新设备而直接显示用户评价页
    else
    {
        // 2007-3-2
        //g_LogConfigInfo["RetUrlRows"                ]
        //g_LogConfigInfo[ i + ",RetUrlItemName"      ] = "ItemA"
        //g_LogConfigInfo[ i + ",RetUrlItemCaller"    ] = "WSS"
        //g_LogConfigInfo[ i + ",RetUrlSetting"       ] = "http://..."
        //g_LogConfigInfo[ i + ",RetUrlDesc"          ]
        //g_LogConfigInfo[ "RetUrlItemA" ] = 3
        // 2007-3-3
        // if ( g_LogConfigInfo[ "RetUrlItemD" ] )
        if ( g_LogConfigInfo[ "RetUrlItemD" ] != undefined )
        {
            oCell.innerHTML = "<br>"
                            // 2007-3-3
                            + "<input type='button' value='下一步' onclick='window.opener.location=\"" + g_LogConfigInfo[ g_LogConfigInfo[ "RetUrlItemD" ] + ",RetUrlSetting" ] + "?wssret=311\";window.close()'>"
        }
        else
        {
	        oCell.innerHTML = "<br>"
                    // 2006-10-15
	                // + "<input type='button' value='上一步' onclick='StartDriverImportUpdate();'>"   //javascript:DeleteDeviceTable();CreateDeviceTable();oTableContainer.align=\"center\";EnumDevice(1)
                    // 2006-10-23
                    // + "<input type='button' value='下一步' onclick='StartDriverImportUpdate();'>"
                    // + "<input type='button' value='下一步' onclick='StartDriverImportUpdate();g_NextStepClickedFlag=true'>"
                    // 2006-10-23
					// + "<input type='button' value='下一步' onclick='if ( this.value == \"完  成\" ) { window.close() ; return false; }; window.open( \"Comment.htm\" );this.value=\"完  成\"'>"
                    // 2006-11-7
					//+ "<input type='button' value='完  成' onclick='window.close() ; return false;'>"
					// Robin 2006-12-1
					+ "<input type='button' value='意见建议' onclick='window.open(\"Comment.htm\"); return false;'>"
         }
        // 2007-3-2
        // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
        g_RunningStatus += "Step=3 , Status=1 , Finish=1 ; "
        SetCookie( "eDrv_Param" , g_RunningStatus , 1 )
        // 2007-3-3
    	//DisplayMessage("运行状态参数：" + g_RunningStatus );
    }

    oRow.appendChild(oCell);
	g_oTBody0.appendChild(oRow);

    DisplayMessage(Title.innerText)
}
function ImportDriverFromServer()
{
    var DeviceInfo	= new Array;

    // 如果发现有需要导入的驱动
    //if ( g_DeviceRowsCanImportDriver )
	{

        Title.innerHTML = '<center>正在修复驱动...</center>'
                        + '<br>'
                        + '<table align=center id=PercentTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
                        + '<tr><td>'
                        + '  <IMG id="PercentImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
                        + '</td></tr></table>'
                        + '<div id=PercentString>&nbsp;</div>'
                        + '<table align=center id=PercentSubTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
                        + '<tr><td>'
                        + '  <IMG id="PercentSubImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
                        + '</td></tr></table>'
                        + '<div id=PercentSubString>&nbsp;</div>'
        DrvCert.UIRefresh()

        for (var i=0; i<g_DevErrDeviceRows ; i++)
        {
            ReadArrayToDeviceInfo(DeviceInfo , g_DevErrDeviceInfoArray , i);
            // 如果设备驱动故障可以修复、用户选择修复该驱动
            if ( g_DevErrDeviceInfoArray[i+",20"] && ( g_DevErrDeviceInfoArray[i+",21"] != false ) )
            {
                g_UserSelectImpDrvNumber ++

                // 2006-8-30
                //g_DevErrDeviceInfoArray[ i + ",LockHandle"] = DrvInst.LockDevice( DeviceInfo[1] )
            }	
            // 2006-9-28
            if ( g_DevErrDeviceInfoArray[i+",20"] )
            {
                g_CanImportDrvNumber ++
            }
        }

        // 2006-8-26
        //
        // 将全部要修复的设备的设备实例标识锁定，以解决在安装设备驱动产生自动设备重新枚举操作时设备编号改变的问题
        // 该调用必须抢在第一次设备枚举结束后第二次枚举开始前执行，否则锁定的设备就是错误的！
        // 2006-8-30
        // LockErrorDevices(g_DevErrDeviceInfoArray , g_DevErrDeviceRows);

        // 如果存在有问题需要修复的设备驱动且用户选择了修复的驱动
        //for (var i=0; (i<g_DevErrDeviceRows) && g_UserSelectImpDrvNumber; i++)
        //
        // 如果存在有问题需要修复的设备
        for (var i=0; i<g_DevErrDeviceRows; i++)
        {
            // 2006-9-27
            var FinishedValue = (g_ImportedDeviceRows+1)/g_UserSelectImpDrvNumber
            FinishedValue = ( FinishedValue > 1 ) ? 1 : FinishedValue
            //PercentImg.width=PercentTbl.width*(g_ImportedDeviceRows+1)/g_UserSelectImpDrvNumber
            //PercentString.innerHTML = '<center>' + Math.floor((g_ImportedDeviceRows+1)/g_UserSelectImpDrvNumber*100) + '%</center>'
            PercentImg.width=PercentTbl.width*FinishedValue
            PercentString.innerHTML = '<center>' + Math.floor(FinishedValue*100) + '%</center>'
            // 2006-9-27

            ReadArrayToDeviceInfo( DeviceInfo , g_DevErrDeviceInfoArray , i);

            RunDriverExportToServerOpenProcess( DeviceInfo );	
            
            // 将需要修复的驱动从g_DevErrDeviceInfoArray中筛选出来
            //
            // 筛选条件是：
            //
            // 如果当前设备驱动故障可以修复、用户也选择了要修复该驱动
            //
            if ( g_DevErrDeviceInfoArray[i+",20"] && ( g_DevErrDeviceInfoArray[i+",21"] != false ) )
            {
              //try
              //{

                DisplayMessage("正在删除设备[" + DeviceInfo[6] + "]的问题驱动...");
                // 2006-1-6
                //
                // 修复驱动前先删除故障设备的问题驱动
                // （主要是%windows\inf%下的oem*.inf和oem*.pnf文件，尤其是oem*.pnf文件会影响正常驱动程序的安装）
                //   
                
                var EraseDriverResult = EraseDeviceDriver( DeviceInfo )
                if ( EraseDriverResult["Success"] )
                {
                    DisplayMessage( "设备[" + DeviceInfo[6] + "]的问题驱动删除成功(" + EraseDriverResult["Info"] + ")" )
                }
                else
                {
                    // 2006-8-27
                    // DisplayMessage( "设备[" + DeviceInfo[6] + "]的驱动没有问题" )
                    DisplayMessage( "没有发现设备[" + DeviceInfo[6] + "]对应的驱动" )
                }

                // 2006-1-6
                DisplayMessage("正在导入设备[" + DeviceInfo[6] + "]的新驱动...");
                var ImportResult = ImportDriverToGivenDeviceFromServer( g_DevErrDeviceInfoArray[i+",UserID"] , 
                                                                        g_DevErrDeviceInfoArray[i+",DriverID"] ,
                                                                        DeviceInfo )
                // 修复后的设备信息返回到DeviceInfo

                // 导出后的设备驱动信息保存到g_ImportedDeviceArray数组的第g_ImportedDeviceRows行
                SaveDeviceInfoToArray( DeviceInfo , g_ImportedDeviceArray , g_ImportedDeviceRows )

                if ( ImportResult["Success"] )
                {

                    var FinishedPercent = 100
                    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
                    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
                    ProcessingInfo.innerHTML = '修复驱动成功'
                    DrvCert.UIRefresh()

                    DisplayMessage( "设备[" + DeviceInfo[6] + "]的驱动修复成功" )
                    g_ImportedDeviceArray[ g_ImportedDeviceRows + ",22"] = true
                    // 2006-1-6
                    g_ImportedDeviceArray[ g_ImportedDeviceRows + ",23"] = ImportResult["Info"] + ";" + EraseDriverResult["Info"]
                    // 2007-3-5
                    g_ImportedDeviceArray[ g_ImportedDeviceRows + ",NewDriverID"] = g_DevErrDeviceInfoArray[i+",NewDriverID"]
                    g_ImportedSuccessDeviceRows ++
                }
                else
                {
                    var FinishedPercent = 100
                    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
                    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
                    ProcessingInfo.innerHTML = '修复驱动失败'
                    DrvCert.UIRefresh()

                    DisplayMessage( "设备[" + DeviceInfo[6] + "]的驱动修复失败(原因:" + ImportResult["Info"] + ")" )
                    // 设备信息保存到g_ImportedDeviceArray数组的第g_ImportedDeviceRows行
                    g_ImportedDeviceArray[ g_ImportedDeviceRows + ",22"] = false
                    // 2006-1-6
                    g_ImportedDeviceArray[ g_ImportedDeviceRows + ",23"] = "驱动修复失败:" + ImportResult["Info"] + "" + ";" + EraseDriverResult["Info"]
                    // 2007-3-5
                    g_ImportedDeviceArray[ g_ImportedDeviceRows + ",NewDriverID"] = g_DevErrDeviceInfoArray[i+",NewDriverID"]
                }
                g_ImportedDeviceRows ++
            }
            // 如果驱动故障无法修复或用户选择不导出驱动
            else
            {
                // 设备信息保存到g_NoImportDeviceArray数组的第g_NoImportDeviceRows行
                SaveDeviceInfoToArray( DeviceInfo , g_NoImportDeviceArray , g_NoImportDeviceRows )
                g_NoImportDeviceRows ++
            }
            // 设备处理完毕，关闭故障设备
            RunDriverExportToServerCloseProcess( DeviceInfo )
        }
    }
    return true
}
function UpdateDriverFromServer()
{
    var DeviceInfo	= new Array;
    var UpdateSystemDrvFlag = ( GetCookie( "UpdateSystemDrvFlag" ) == "true" )

    var SystemDriverCanUpdate = 0
    var UserDriverCanUpdate   = 0

    // 如果发现有需要升级的驱动
    if ( g_DeviceRowsNeedUpdateDriver )
	{

        Title.innerHTML = '<center>正在升级驱动...</center>'
                        + '<br>'
                        + '<table align=center id=PercentTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
                        + '<tr><td>'
                        + '  <IMG id="PercentImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
                        + '</td></tr></table>'
                        + '<div id=PercentString>&nbsp;</div>'
                        + '<table align=center id=PercentSubTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
                        + '<tr><td>'
                        + '  <IMG id="PercentSubImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
                        + '</td></tr></table>'
                        + '<div id=PercentSubString>&nbsp;</div>'
        DrvCert.UIRefresh()


        for (var i=0; i<g_NormalSystemDeviceRows && UpdateSystemDrvFlag; i++)
        {
            ReadArrayToDeviceInfo( DeviceInfo , g_NormalSystemDeviceInfoArray , i );
            // 如果用户选择升级该驱动
            if ( g_NormalSystemDeviceInfoArray[i+",21"] != false )
            {
                g_UserSelectUpdateDrvNumber ++
                SystemDriverCanUpdate ++
                // 2006-8-30
                //g_NormalSystemDeviceInfoArray[ i + ",LockHandle"] = DrvInst.LockDevice( DeviceInfo[1] )
            }		
        }
        for (var i=0; i<g_UserDrvDeviceRows ; i++)
        {
            ReadArrayToDeviceInfo( DeviceInfo , g_UserDrvDeviceInfoArray , i );
            // 如果用户选择升级该驱动
            if ( g_UserDrvDeviceInfoArray[i+",21"] != false )
            {
                g_UserSelectUpdateDrvNumber ++
                UserDriverCanUpdate ++
                // 2006-8-30
                //g_UserDrvDeviceInfoArray[ i + ",LockHandle"] = DrvInst.LockDevice( DeviceInfo[1] )
            }		
        }

        /////////////////////////////////////////////////////////////////////////////////////////////////


       // 如果用户要升级系统类设备，且有系统设备驱动可以升级的
       if ( UpdateSystemDrvFlag && SystemDriverCanUpdate )
       {
        for (var i=0; i<g_NormalSystemDeviceRows; i++)
        {
            // 2007-3-2 
            // 显示进度达到200%的BUG
            //
            //PercentImg.width=PercentTbl.width*(g_UpdatedDeviceRows+1)/g_UserSelectUpdateDrvNumber
            //PercentString.innerHTML = '<center>' + Math.floor((g_UpdatedDeviceRows+1)/g_UserSelectUpdateDrvNumber*100) + '%</center>'
            var FinishedValue = (g_UpdatedDeviceRows+1)/g_UserSelectUpdateDrvNumber
            FinishedValue = ( FinishedValue > 1 ) ? 1 : FinishedValue
            PercentImg.width=PercentTbl.width*FinishedValue//  (g_UpdatedDeviceRows+1)/g_UserSelectUpdateDrvNumber 
            PercentString.innerHTML = '<center>' + Math.floor( FinishedValue*100 ) + '%</center>'

            ReadArrayToDeviceInfo( DeviceInfo , g_NormalSystemDeviceInfoArray , i);

            RunDriverExportToServerOpenProcess( DeviceInfo );	
            
            // 将需要修复的驱动从g_NormalSystemDeviceRows中筛选出来
            //
            // 筛选条件是：
            //
            // 如果用户选择了要升级该驱动
            //
            if ( g_NormalSystemDeviceInfoArray[i+",21"] != false )
            {
              //try
              //{
                DisplayMessage("正在升级系统设备[" + DeviceInfo[6] + "]的驱动...");

            	var UserChoiceUseOthersDrvFlag = ( GetCookie( "DriverType" ) != "Private" ) 
                // 如果用户选择了可以使用别人的驱动来更新自己的当前驱动版本
                if ( UserChoiceUseOthersDrvFlag )
                {
                    var Result = ImportDriverToGivenDeviceFromServer( g_NormalSystemDeviceInfoArray[i+",NewUserID"] , 
                                                                      g_NormalSystemDeviceInfoArray[i+",NewDriverID"] ,
                                                                      DeviceInfo )
                }
                // 如果用户选择了不可以使用别人的驱动来更新自己的当前驱动版本
                else
                {
                    var Result = ImportDriverToGivenDeviceFromServer( g_NormalSystemDeviceInfoArray[i+",UserID"] , 
                                                                      g_NormalSystemDeviceInfoArray[i+",DriverID"] ,
                                                                      DeviceInfo )
                }

                // 修复后的设备信息返回到DeviceInfo

                // 导出后的设备驱动信息保存到g_ImportedDeviceArray数组的第g_UpdatedDeviceRows行
                SaveDeviceInfoToArray( DeviceInfo , g_UpdatedDeviceArray , g_UpdatedDeviceRows )

                if ( Result["Success"] )
                {

                    var FinishedPercent = 100
                    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
                    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
                    ProcessingInfo.innerHTML = '升级驱动成功'
                    DrvCert.UIRefresh()

                    DisplayMessage( "系统设备[" + DeviceInfo[6] + "]的驱动升级成功" )
                    g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",22"] = true
                    g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",23"] = Result["Info"]
                    // 2007-3-5
                    g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",NewDriverID"] = g_NormalSystemDeviceInfoArray[i+",NewDriverID"]

                    g_UpdatedSuccessDeviceRows ++
                }
                else
                {
                    var FinishedPercent = 100
                    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
                    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
                    ProcessingInfo.innerHTML = '升级驱动失败'
                    DrvCert.UIRefresh()

                    DisplayMessage( "系统设备[" + DeviceInfo[6] + "]的驱动升级失败(原因:" + Result["Info"] + ")" )
                    // 设备信息保存到g_UpdatedDeviceArray数组的第g_UpdatedDeviceRows行
                    g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",22"] = false
                    // 2006-11-11
                    // g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",23"] = "驱动升级失败:" + Result["Info"] + ""
                    g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",23"] = "" + Result["Info"] + ""
                    // 2007-3-5
                    g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",NewDriverID"] = g_NormalSystemDeviceInfoArray[i+",NewDriverID"]
                }
                g_UpdatedDeviceRows ++
            }
            else if ( 
                        // 如果用户的系统驱动可以升级而用户选择不升级驱动
                        ( g_NormalSystemDeviceInfoArray[i+",CanUpdate"] && ( g_NormalSystemDeviceInfoArray[i+",21"] == false ) )
                      || 
                        // 如果用户的系统驱动可以用别人的驱动升级而用户屏蔽了使用别人的驱动而导致的不能升级驱动
                        ( g_NormalSystemDeviceInfoArray[i+",UpdateDisable"] )
                    )
            {
                // 设备信息保存到g_NoImportDeviceArray数组的第g_NoImportDeviceRows行
                SaveDeviceInfoToArray( DeviceInfo , g_NoUpdateDeviceArray , g_NoUpdateDeviceRows )
                g_NoUpdateDeviceRows ++
            }
            // 设备处理完毕，关闭故障设备
            RunDriverExportToServerCloseProcess( DeviceInfo )
        }
      }
    
        {
            // 如果用户类设备存在需要升级的
            for (var i=0; i<g_UserDrvDeviceRows; i++)
            {
                // 2006-9-27
                var FinishedValue = (g_UpdatedDeviceRows+1)/g_UserSelectUpdateDrvNumber
                FinishedValue = ( FinishedValue > 1 ) ? 1 : FinishedValue
                // 2006-9-27

                PercentImg.width=PercentTbl.width*FinishedValue//  (g_UpdatedDeviceRows+1)/g_UserSelectUpdateDrvNumber 
                // 2006-9-27
                //PercentString.innerHTML = '<center>' + Math.floor((g_UpdatedDeviceRows+1)/g_UserSelectUpdateDrvNumber*100) + '%</center>'
                PercentString.innerHTML = '<center>' + Math.floor( FinishedValue*100 ) + '%</center>'

                ReadArrayToDeviceInfo( DeviceInfo , g_UserDrvDeviceInfoArray , i);

                RunDriverExportToServerOpenProcess( DeviceInfo );	
                
                // 将需要升级的驱动从g_NormalSystemDeviceRows中筛选出来
                //
                // 筛选条件是：
                //
                // 如果用户选择了要升级该驱动
                //
                if ( g_UserDrvDeviceInfoArray[i+",21"] != false )
                {
                  //try
                  //{
                    DisplayMessage("正在升级用户设备[" + DeviceInfo[6] + "]的驱动...");

                    var UserChoiceUseOthersDrvFlag = ( GetCookie( "DriverType" ) != "Private" ) 
                    // 如果用户选择了可以使用别人的驱动来更新自己的当前驱动版本
                    if ( UserChoiceUseOthersDrvFlag )
                    {
                        var Result = ImportDriverToGivenDeviceFromServer( g_UserDrvDeviceInfoArray[i+",NewUserID"] , 
                                                                          g_UserDrvDeviceInfoArray[i+",NewDriverID"] ,
                                                                          DeviceInfo )
                    }
                    // 如果用户选择了不可以使用别人的驱动来更新自己的当前驱动版本
                    else
                    {
                        var Result = ImportDriverToGivenDeviceFromServer( g_UserDrvDeviceInfoArray[i+",UserID"] , 
                                                                          g_UserDrvDeviceInfoArray[i+",DriverID"] ,
                                                                          DeviceInfo )
                    }
                    // 升级后的设备信息返回到DeviceInfo

                    // 升级后的设备驱动信息保存到g_ImportedDeviceArray数组的第g_UpdatedDeviceRows行
                    SaveDeviceInfoToArray( DeviceInfo , g_UpdatedDeviceArray , g_UpdatedDeviceRows )

                    if ( Result["Success"] )
                    {

                        var FinishedPercent = 100
                        PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
                        PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
                        ProcessingInfo.innerHTML = '升级驱动成功'
                        DrvCert.UIRefresh()

                        DisplayMessage( "用户设备[" + DeviceInfo[6] + "]的驱动升级成功" )
                        g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",22"] = true
                        g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",23"] = Result["Info"]
                        // 2007-3-5
                        g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",NewDriverID"] = g_UserDrvDeviceInfoArray[i+",NewDriverID"]
                        g_UpdatedSuccessDeviceRows ++
                    }
                    else
                    {
                        var FinishedPercent = 100
                        PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
                        PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
                        ProcessingInfo.innerHTML = '升级驱动失败'
                        DrvCert.UIRefresh()

                        DisplayMessage( "用户设备[" + DeviceInfo[6] + "]的驱动升级失败(原因:" + Result["Info"] + ")" )
                        // 设备信息保存到g_UpdatedDeviceArray数组的第g_UpdatedDeviceRows行
                        g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",22"] = false
                        // 2006-11-11
                        // g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",23"] = "驱动升级失败:" + Result["Info"] + ""
                        g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",23"] = "" + Result["Info"] + ""
                        // 2007-3-5
                        g_UpdatedDeviceArray[ g_UpdatedDeviceRows + ",NewDriverID"] = g_UserDrvDeviceInfoArray[i+",NewDriverID"]
                    }
                    g_UpdatedDeviceRows ++
                }
                else if 
                ( 
                            // 如果用户驱动可以升级而用户选择不升级驱动
                            ( g_UserDrvDeviceInfoArray[i+",CanUpdate"] && ( g_UserDrvDeviceInfoArray[i+",21"] == false ) )
                          || 
                            // 如果用户驱动可以用别人的驱动升级而用户屏蔽了使用别人的驱动而导致的不能升级驱动
                            ( g_UserDrvDeviceInfoArray[i+",UpdateDisable"] )
                        )
                {
                    // 设备信息保存到g_NoImportDeviceArray数组的第g_NoImportDeviceRows行
                    SaveDeviceInfoToArray( DeviceInfo , g_NoUpdateDeviceArray , g_NoUpdateDeviceRows )
                    g_NoUpdateDeviceRows ++
                }
                // 设备处理完毕，关闭故障设备
                RunDriverExportToServerCloseProcess( DeviceInfo )
            }
        }

    }
    return true
}
function ListDriverImportedResult()
{
    // 2006-11-9
    var stock = new Array()

    if ( g_ImportedDeviceRows )
	{
        // 2006-9-28 <<<..............................................................................
        var DevNeedRebootFlag   = false
        var DevNoNeedRebootFlag = false
        // 算算有几个修复驱动后需要重启启动的
        for (var i=0; i<g_ImportedDeviceRows ; i++)
		{
            if ( g_ImportedDeviceArray[ i + ",4"] & 0x00000100 ) 
            {
                DevNeedRebootFlag = true
            }
            else
            {
                DevNoNeedRebootFlag = true
            }
        }
        // 按成功/失败/重启来显示结果
        //
        // 如果存在不需要重新启动的设备
        if ( DevNoNeedRebootFlag )
        {
        // 2006-9-28 ..............................................................................>>>

            // 2006-9-28
            var SuccessFlag = false
            var FalseFlag   = false
            for (var i=0; i<g_ImportedDeviceRows ; i++)
            {
                // 2006-11-9
                //
                // 下面筛选修复成功和失败的逻辑与后面显示时的逻辑不一致，会导致某些修复结果无法显示，因此应屏蔽此代码
                //
                // if ( g_ImportedDeviceArray[i+",22"] ) 
                //
                // 如果驱动安装后不需要重启 且 驱动安装成功 + 驱动安装后设备没有故障
                ReadArrayToDeviceInfo(stock , g_ImportedDeviceArray , i)
                if ( !( stock[4] & 0x00000100 ) && ( g_ImportedDeviceArray[i+",22"] && !stock[5] ) )
                {
                    SuccessFlag = true
                }
                // 2006-11-9
                // else
                // 如果设备修复安装驱动后不需要重启, 且驱动修复失败 , 或修复成功后设备状态仍然为有故障
                if ( !( stock[4] & 0x00000100 ) && ( !g_ImportedDeviceArray[i+",22"] || ( g_ImportedDeviceArray[i+",22"] && stock[5]) ) )
                {
                    FalseFlag = true
                }
            }

            if ( SuccessFlag )
            {
                // 2006-11-9
                //
                // to see the function beginning defined ...
                //
                // var stock = new Array()

                oRow = document.createElement("TR");
                oCell = document.createElement("TD");
                oCell.colSpan= g_maxcols+1
                oCell.align = "center"
                // 2006-8-29
                // oCell.innerHTML = "修复驱动结果<br><br>"
                oCell.innerHTML = "修复成功<br><br>"

                oRow.appendChild(oCell);
                g_oTBody0.appendChild(oRow);


                for (var i=0; i<g_ImportedDeviceRows ; i++)
                {

                    ReadArrayToDeviceInfo(stock , g_ImportedDeviceArray , i)

                    // 如果设备有驱动备份、设备没有故障且用户选择导出该驱动
                    //if (!(stock[7] & 0x00000010) && !stock[5] && ( g_UserDrvDeviceInfoArray[i+",21"] != false) )
                    //
                    //
                    // 2006-9-29
                    // 如果驱动安装后不需要重启且驱动安装成功+驱动安装后设备没有故障
                    if ( !( stock[4] & 0x00000100 ) && ( g_ImportedDeviceArray[i+",22"] && !stock[5] ) )
                    {
                        var oRow,oCell;
                        oRow = document.createElement("TR");
                        g_oTBody0.appendChild(oRow);

                        // 将枚举到的设备信息 - 全局变量数组g_ImportedDeviceArray的第i行数组 
                        // 翻译成表格中第i行中的字符串数组形式存放到stock
                        TranslateDeviceInfoToArray( stock , g_ImportedDeviceArray , i ,i );

                        if (!stock[6] || stock[1]==0 ||  !stock[4] )
                        {
                            stock[0] = stock[1] = stock[2] = stock[3] = stock[4] = stock[5] = stock[6] = stock[7] = "";
                        }
                        //if ( g_ImportedDeviceArray[i+",22"] )
                        //{
                            var ImpDrvHtml = ""//"<img src='img/yes.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_ImportedDeviceArray[i+",23"] + "'>"
                        //}
                        //else
                        //{
                        //    var ImpDrvHtml = "<img src='img/err.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_ImportedDeviceArray[i+",23"] + "'>"
                        //     stock[6] =  stock[6].replace( /green/ig , "red" )
                        //}
                        for (j=0; j<g_maxcols; j++)
                        {

                            oCell = document.createElement("TD");
                            //oCell.innerHTML	= stock[j];
                            (j==0)? oCell.innerHTML =""
                               :(j==1)? oCell.innerHTML = ImpDrvHtml
                                    :(j==2)	? oCell.innerHTML = stock[7]
                                        : (j==6) ? oCell.innerHTML = stock[2]
                                             : (j==7) ? oCell.innerHTML = stock[6]
                                                      : oCell.innerHTML = stock[j];
                            
                            oCell.vAlign	="top"; 
                            if (j==7)
                            {
                                oCell.align = "left";
                            }
                            else
                            {
                                oCell.align = "center";
                            }
                            oRow.appendChild(oCell);
                        }
                    }
                }
            }

            if ( FalseFlag )
            {
                // 2006-11-9
                //
                // to see the function beginning defined ...
                //
                // var stock = new Array()

                oRow = document.createElement("TR");
                oCell = document.createElement("TD");
                oCell.colSpan= g_maxcols+1
                oCell.align = "center"
                // 2006-8-29
                // oCell.innerHTML = "修复驱动结果<br><br>"
                oCell.innerHTML = "<br>修复失败<br><br>"

                oRow.appendChild(oCell);
                g_oTBody0.appendChild(oRow);


                for (var i=0; i<g_ImportedDeviceRows ; i++)
                {

                    ReadArrayToDeviceInfo(stock , g_ImportedDeviceArray , i)

                    // 如果设备有驱动备份、设备没有故障且用户选择导出该驱动
                    //if (!(stock[7] & 0x00000010) && !stock[5] && ( g_UserDrvDeviceInfoArray[i+",21"] != false) )
                    //
                    // 2006-9-29
                    // 如果设备修复安装驱动后不需要重启, 且驱动修复失败 , 或修复成功后设备状态仍然为有故障
                    // 2006-10-22
                    //if ( !( stock[4] & 0x00000100 ) && ( !g_ImportedDeviceArray[i+",22"] || ( g_ImportedDeviceArray[i+",22"] && !stock[5]) ) )
                    if ( !( stock[4] & 0x00000100 ) && ( !g_ImportedDeviceArray[i+",22"] || ( g_ImportedDeviceArray[i+",22"] && stock[5]) ) )
                    //
                    {
                        var oRow,oCell;
                        oRow = document.createElement("TR");
                        g_oTBody0.appendChild(oRow);

                        // 将枚举到的设备信息 - 全局变量数组g_ImportedDeviceArray的第i行数组 
                        // 翻译成表格中第i行中的字符串数组形式存放到stock
                        TranslateDeviceInfoToArray( stock , g_ImportedDeviceArray , i ,i );

                        if (!stock[6] || stock[1]==0 ||  !stock[4] )
                        {
                            stock[0] = stock[1] = stock[2] = stock[3] = stock[4] = stock[5] = stock[6] = stock[7] = "";
                        }
                        // 2006-9-28
                        //if ( g_ImportedDeviceArray[i+",22"] )
                        //{
                        //    var ImpDrvHtml = "<img src='img/yes.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_ImportedDeviceArray[i+",23"] + "'>"
                        //}
                        //if ( !g_ImportedDeviceArray[i+",22"] )
                        //{
                            var ImpDrvHtml = ""//"<img src='img/err.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_ImportedDeviceArray[i+",23"] + "'>"
                        //     stock[6] =  stock[6].replace( /green/ig , "red" )
                        //}
                        // 2006-9-29
                        //
                        // 如果驱动修复成功但设备状态仍然有问题
                        // 2006-11-11
                        // 一般是安装exe类驱动的情况
                        // 2006-11-11
                        // if ( g_ImportedDeviceArray[i+",22"] && !stock[5] ) 
                        if ( g_ImportedDeviceArray[i+",22"] && !g_ImportedDeviceArray[i+",5"] ) 
                        {
                            // 2006-10-22
                            // stock[6] += "&nbsp;&nbsp;&nbsp;修复操作成功,设备仍不可用,请尝试重启机器"
                            stock[6] += "<span style='color: green;font-style: normal;font-family: 宋体;' VALIGN='top'>"
                                      + "(修复操作成功,设备仍不可用,请尝试重启机器)"
                                      + "</span>"
                        }
                        else if ( !g_ImportedDeviceArray[i+",22"] )
                        {
                            // 2006-10-22
                            stock[6] += "<span style='color: green;font-style: normal;font-family: 宋体;' VALIGN='top'>"
                                     // 2006-11-1
                                     // +  "(修复操作失败)"
                                     + "(" + g_ImportedDeviceArray[i+",23"] + ")"
                                     //
                                     +  "</span>"
                        }
                        for (j=0; j<g_maxcols; j++)
                        {

                            oCell = document.createElement("TD");
                            //oCell.innerHTML	= stock[j];
                            (j==0)? oCell.innerHTML =""
                               :(j==1)? oCell.innerHTML = ImpDrvHtml
                                    :(j==2)	? oCell.innerHTML = stock[7]
                                        : (j==6) ? oCell.innerHTML = stock[2]
                                             : (j==7) ? oCell.innerHTML = stock[6]
                                                      : oCell.innerHTML = stock[j];
                            
                            oCell.vAlign	="top"; 
                            if (j==7)
                            {
                                oCell.align = "left";
                            }
                            else
                            {
                                oCell.align = "center";
                            }
                            oRow.appendChild(oCell);
                        }
                    }
                }
            }
        }

        if ( DevNeedRebootFlag )
        {
            // 2006-11-9
            //
            // to see the function beginning defined ...
            //
            // var stock = new Array()

            oRow = document.createElement("TR");
            oCell = document.createElement("TD");
            oCell.colSpan= g_maxcols+1
            oCell.align = "center"
            oCell.innerHTML = "<br>修复后需要重新启动<br><br>"

            oRow.appendChild(oCell);
            g_oTBody0.appendChild(oRow);


            for (var i=0; i<g_ImportedDeviceRows ; i++)
            {
                ReadArrayToDeviceInfo(stock , g_ImportedDeviceArray , i)

                // 如果设备有驱动备份、设备没有故障且用户选择导出该驱动
                // if (!(stock[7] & 0x00000010) && !stock[5] && ( g_UserDrvDeviceInfoArray[i+",21"] != false) )
                // 2006-11-9
                // 如果需要重新启动
                if ( stock[4] & 0x00000100 )
                {
                    var oRow,oCell;
                    oRow = document.createElement("TR");
                    g_oTBody0.appendChild(oRow);

                    // 将枚举到的设备信息 - 全局变量数组g_ImportedDeviceArray的第i行数组 
                    // 翻译成表格中第i行中的字符串数组形式存放到stock
                    TranslateDeviceInfoToArray( stock , g_ImportedDeviceArray , i ,i );

                    if (!stock[6] || stock[1]==0 ||  !stock[4] )
                    {
                        stock[0] = stock[1] = stock[2] = stock[3] = stock[4] = stock[5] = stock[6] = stock[7] = "";
                    }
                    //if ( g_ImportedDeviceArray[i+",22"] )
                    //{
                        var ImpDrvHtml = ""//"<img src='img/yes.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_ImportedDeviceArray[i+",23"] + "'>"
                    //}
                    //else
                    //{
                    //    var ImpDrvHtml = ""//"<img src='img/err.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_ImportedDeviceArray[i+",23"] + "'>"
                    //     stock[6] =  stock[6].replace( /green/ig , "red" )
                    //}
                    for (j=0; j<g_maxcols; j++)
                    {

                        oCell = document.createElement("TD");
                        //oCell.innerHTML	= stock[j];
                        (j==0)? oCell.innerHTML =""
                           :(j==1)? oCell.innerHTML = ImpDrvHtml
                                :(j==2)	? oCell.innerHTML = stock[7]
                                    : (j==6) ? oCell.innerHTML = stock[2]
                                         : (j==7) ? oCell.innerHTML = stock[6]
                                                  : oCell.innerHTML = stock[j];
                        
                        oCell.vAlign	="top"; 
                        if (j==7)
                        {
                            oCell.align = "left";
                        }
                        else
                        {
                            oCell.align = "center";
                        }
                        oRow.appendChild(oCell);
                    }
                }
            }
        }
	}

    // 2006-9-28
    //
    // 下面的情况不显示：
    //     如果有用户选择不修复的驱动或有不能修复的驱动
    // 
    //// 显示不能修复的驱动清单
	////
	//// 如果有用户选择不修复的驱动或有不能修复的驱动
	//if ( g_NoImportDeviceRows )
	//{
	//	var stock = new Array()
    //
	//	oRow  = document.createElement("TR");
	//	oCell = document.createElement("TD");
    //
	//	oCell.colSpan= g_maxcols+1
    //    // 2006-8-29
    //    // oCell.innerHTML = "<center><br>没有修复的驱动<br></center><br>"
	//	oCell.innerHTML = "<center><br>未修复驱动<br></center><br>"
	//	                  //+"<img border='0' src='img/6.GIF'>：不能导出&nbsp<img border='0' src='img/1.GIF'>：用户不要导出<br>"
	//	oCell.align = "right"
	//	oRow.appendChild(oCell);
	//	g_oTBody0.appendChild(oRow);
    //
    //
	//	for (var i=0; i<g_NoImportDeviceRows ; i++)
	//	{
	//		ReadArrayToDeviceInfo(stock , g_NoImportDeviceArray , i)
    //
	//		{
	//			var oRow,oCell;
	//			oRow = document.createElement("TR");
	//			g_oTBody0.appendChild(oRow);
    //
    //
	//			// 将枚举到的设备信息 - 全局变量数组g_NoImportDeviceArray的第i行数组 
	//			// 翻译成表格中第i行中的字符串数组形式存放到stock
	//			TranslateDeviceInfoToArray(stock,g_NoImportDeviceArray, i ,i );
    //
	//			if (!stock[6] || stock[1]==0 ||  !stock[4] )
	//			{
	//				stock[0] = stock[1] = stock[2] = stock[3] = stock[4] = stock[5] = stock[6] = stock[7] = "";
	//			}
    //            var ImpDrvHtml = "<img src='img/err2.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='驱动无法修复或您选择不修复该故障设备'>"
    //            //stock[6] =  stock[6].replace( /green/ig , "red" )
	//			for (j=0; j<g_maxcols; j++)
	//			{
    //
	//				oCell = document.createElement("TD");
	//				//oCell.innerHTML	= stock[j];
	//				(j==0)? oCell.innerHTML =""
	//				   :(j==1)? oCell.innerHTML = ImpDrvHtml
	//					:(j==2)	? oCell.innerHTML = stock[7]
	//						: (j==6) ? oCell.innerHTML = stock[2]
	//								 : (j==7) ? oCell.innerHTML = stock[6]
	//										  : oCell.innerHTML = stock[j];
	//				
	//				oCell.vAlign	="top"; 
	//				if (j==7)
	//				{
	//					oCell.align = "left";
	//					//oCell.width = "90%";
	//				}
	//				else
	//				{
	//					oCell.align = "center";
	//				}
	//				oRow.appendChild(oCell);
	//			}
	//		}
	//	}
	//}
	// 
}   
function ListDriverUpdatedResult()
{   
    // 2006-11-9
    var stock = new Array()

    if ( g_UpdatedDeviceRows )
	{
        var DevNeedRebootFlag   = false
        var DevNoNeedRebootFlag = false
        for (var i=0; i<g_UpdatedDeviceRows ; i++)
		{
            // 如果设备需要重新启动
            if ( g_UpdatedDeviceArray[ i + ",4"] & 0x00000100 ) 
            {
                DevNeedRebootFlag = true
            }
            else
            {
                DevNoNeedRebootFlag = true
            }
        }

        if ( DevNoNeedRebootFlag )
        {
            // 2006-9-28
            var SuccessFlag = false
            var FalseFlag   = false
            for (var i=0; i<g_UpdatedDeviceRows ; i++)
            {
                // 2006-11-9
                //
                // 下面筛选升级成功和失败的逻辑与后面显示时的逻辑不一致，会导致某些结果无法显示，因此应屏蔽此代码
                //
                // // 如果修复成功
                // if ( g_UpdatedDeviceArray[i+",22"] ) 
                // 
                // 如果设备安装驱动后不需要重启且升级驱动成功且升级后设备状态正常，就认为是升级成功
                //
                // 2006-11-11
                ReadArrayToDeviceInfo(stock , g_UpdatedDeviceArray , i)

                if ( !(stock[4] & 0x00000100) && ( g_UpdatedDeviceArray[i+",22"] && !stock[5] ) )
                //
                {
                    SuccessFlag = true
                }
                // 2006-11-9
                // else
                //
                // 如果设备安装驱动后不需要重启且驱动升级操作失败或者升级操作成功但设备状态有问题，都认为是升级失败
                if ( !(stock[4] & 0x00000100) && ( !g_UpdatedDeviceArray[i+",22"] || ( g_UpdatedDeviceArray[i+",22"] && stock[5] ) ) )
                {
                    FalseFlag = true
                }
            }
            if ( SuccessFlag )
            {
                // 2006-11-9
                //
                // to see the function beginning defined ...
                //
                // var stock = new Array()
            
                oRow = document.createElement("TR");
                oCell = document.createElement("TD");
                oCell.colSpan= g_maxcols+1
                oCell.align = "center"
                oCell.innerHTML = "<center><br>升级成功<br></center><br>"
                oRow.appendChild(oCell);
                g_oTBody0.appendChild(oRow);


                for (var i=0; i<g_UpdatedDeviceRows ; i++)
                {
                    ReadArrayToDeviceInfo(stock , g_UpdatedDeviceArray , i)

                    // 如果设备有驱动备份、设备没有故障且用户选择导出该驱动
                    //if (!(stock[7] & 0x00000010) && !stock[5] && ( g_UserDrvDeviceInfoArray[i+",21"] != false) )
                    //if ( !( stock[4] & 0x00000100 ) )
                    // 2006-9-29
                    // 如果设备安装驱动后不需要重启且升级驱动成功且升级后设备状态正常，就认为是升级成功
                    if ( !(stock[4] & 0x00000100) && ( g_UpdatedDeviceArray[i+",22"] && !stock[5] ) )
                    {
                        var oRow,oCell;
                        oRow = document.createElement("TR");
                        g_oTBody0.appendChild(oRow);

                        // 将枚举到的设备信息 - 全局变量数组g_ImportedDeviceArray的第i行数组 
                        // 翻译成表格中第i行中的字符串数组形式存放到stock
                        TranslateDeviceInfoToArray( stock , g_UpdatedDeviceArray , i ,i );

                        if (!stock[6] || stock[1]==0 ||  !stock[4] )
                        {
                            stock[0] = stock[1] = stock[2] = stock[3] = stock[4] = stock[5] = stock[6] = stock[7] = "";
                        }
                        //if ( g_UpdatedDeviceArray[i+",22"] )
                        //{
                            var ImpDrvHtml = ""//"<img src='img/yes.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_UpdatedDeviceArray[i+",23"] + "'>"
                        //}
                        //else
                        //{
                        //    var ImpDrvHtml = "<img src='img/err.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_UpdatedDeviceArray[i+",23"] + "'>"
                        //     stock[6] =  stock[6].replace( /green/ig , "red" )
                        //}
                        for (j=0; j<g_maxcols; j++)
                        {

                            oCell = document.createElement("TD");
                            //oCell.innerHTML	= stock[j];
                            (j==0)? oCell.innerHTML =""
                               :(j==1)? oCell.innerHTML = ImpDrvHtml
                                    :(j==2)	? oCell.innerHTML = stock[7]
                                        : (j==6) ? oCell.innerHTML = stock[2]
                                             : (j==7) ? oCell.innerHTML = stock[6]
                                                      : oCell.innerHTML = stock[j];
                            
                            oCell.vAlign	="top"; 
                            if (j==7)
                            {
                                oCell.align = "left";
                            }
                            else
                            {
                                oCell.align = "center";
                            }
                            oRow.appendChild(oCell);
                        }
                    }
                }
            }

            if ( FalseFlag )
            {
                // 2006-11-9
                //
                // to see the function beginning defined ...
                //
                // var stock = new Array()
            
                oRow = document.createElement("TR");
                oCell = document.createElement("TD");
                oCell.colSpan= g_maxcols+1
                oCell.align = "center"
                oCell.innerHTML = "<center><br>升级失败<br></center><br>"
                oRow.appendChild(oCell);
                g_oTBody0.appendChild(oRow);


                for (var i=0; i<g_UpdatedDeviceRows ; i++)
                {
                    ReadArrayToDeviceInfo(stock , g_UpdatedDeviceArray , i)

                    // 如果设备有驱动备份、设备没有故障且用户选择导出该驱动
                    //if (!(stock[7] & 0x00000010) && !stock[5] && ( g_UserDrvDeviceInfoArray[i+",21"] != false) )
                    //if ( !( stock[4] & 0x00000100 ) )
                    // 2006-9-29
                    // 如果设备安装驱动后不需要重启且驱动升级操作失败或者升级操作成功但设备状态有问题，都认为是升级失败
                    if ( !(stock[4] & 0x00000100) && ( !g_UpdatedDeviceArray[i+",22"] || ( g_UpdatedDeviceArray[i+",22"] && stock[5] ) ) )
                    {
                        var oRow,oCell;
                        oRow = document.createElement("TR");
                        g_oTBody0.appendChild(oRow);

                        // 将枚举到的设备信息 - 全局变量数组g_ImportedDeviceArray的第i行数组 
                        // 翻译成表格中第i行中的字符串数组形式存放到stock
                        TranslateDeviceInfoToArray( stock , g_UpdatedDeviceArray , i ,i );

                        if (!stock[6] || stock[1]==0 ||  !stock[4] )
                        {
                            stock[0] = stock[1] = stock[2] = stock[3] = stock[4] = stock[5] = stock[6] = stock[7] = "";
                        }
                        //if ( g_UpdatedDeviceArray[i+",22"] )
                        //{
                        //    var ImpDrvHtml = "<img src='img/yes.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_UpdatedDeviceArray[i+",23"] + "'>"
                        //}
                        //else
                        // 如果驱动升级操作失败
                        //if ( !g_UpdatedDeviceArray[i+",22"] )
                        //{
                            var ImpDrvHtml = ""//"<img src='img/err.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_UpdatedDeviceArray[i+",23"] + "'>"
                        //     stock[6] =  stock[6].replace( /green/ig , "red" )
                        //}
                        // 2006-9-29
                        //
                        // 如果升级操作成功但之后设备状态变为错误
                        // 2006-11-11
                        // if ( g_UpdatedDeviceArray[i+",22"] && stock[5] )
                        if ( g_UpdatedDeviceArray[i+",22"] && g_UpdatedDeviceArray[i+",5"] )
                        {
                            // 2006-11-9
                            //
                            // stock[6] += "<br>&nbsp;&nbsp;&nbsp;升级操作成功,设备有问题"
                            stock[6] += "<span style='color: green;font-style: normal;font-family: 宋体;' VALIGN='top'>"
                                     // 2006-11-11
                                     //  +  "升级成功,设备有问题(" + g_UpdatedDeviceArray[i+",23"] + ")"
                                     +  "(升级成功,设备有问题,原因是" + g_UpdatedDeviceArray[i+",23"] + ")"
                                     //
                                     +  "</span>"
                        }
                        // 如果升级失败而之后设备状态正常
                        // 2006-11-11
                        // else if ( !g_UpdatedDeviceArray[i+",22"] && !stock[5] )
                        else if ( !g_UpdatedDeviceArray[i+",22"] && !g_UpdatedDeviceArray[i+",5"] )
                        {
                            // 2006-11-9
                            // stock[6] += "<br>&nbsp;&nbsp;&nbsp;升级操作失败,驱动版本没有改变,设备可用"
                            stock[6] += "<span style='color: green;font-style: normal;font-family: 宋体;' VALIGN='top'>"
                                     // 2006-11-11
                                     //  +  "升级失败,驱动版本没有改变,设备仍可用(" + g_UpdatedDeviceArray[i+",23"] + ")"
                                     +  "(升级失败,驱动版本没有改变,设备仍可用,失败原因是" + g_UpdatedDeviceArray[i+",23"] + ")"
                                     //
                                     +  "</span>"
                        }
                        // 如果升级失败而之后设备状态变为错误
                        // 2006-11-11
                        // else if ( !g_UpdatedDeviceArray[i+",22"] && stock[5] )
                        else if ( !g_UpdatedDeviceArray[i+",22"] && g_UpdatedDeviceArray[i+",5"] )
                        {
                            // 2006-11-9
                            // stock[6] += "<br>&nbsp;&nbsp;&nbsp;升级操作失败,设备有问题"
                            stock[6] += "<span style='color: green;font-style: normal;font-family: 宋体;' VALIGN='top'>"
                                     // 2006-11-11
                                     //  +  "升级失败,设备有问题(" + g_UpdatedDeviceArray[i+",23"] + ")"
                                     +  "(升级失败,设备有问题,原因是" + g_UpdatedDeviceArray[i+",23"] + ")"
                                     //
                                     +  "</span>"
                        }
                        // 2006-11-9
                        else
                        {
                            // 2006-11-9
                            stock[6] += "<span style='color: green;font-style: normal;font-family: 宋体;' VALIGN='top'>"
                                     // 2006-11-11
                                     // +  "升级失败(" + g_UpdatedDeviceArray[i+",23"] + ")"
                                     +  "(升级失败,原因是" + g_UpdatedDeviceArray[i+",23"] + ")"
                                     //
                                     +  "</span>"
                        }

                        for (j=0; j<g_maxcols; j++)
                        {

                            oCell = document.createElement("TD");
                            //oCell.innerHTML	= stock[j];
                            (j==0)? oCell.innerHTML =""
                               :(j==1)? oCell.innerHTML = ImpDrvHtml
                                    :(j==2)	? oCell.innerHTML = stock[7]
                                        : (j==6) ? oCell.innerHTML = stock[2]
                                             : (j==7) ? oCell.innerHTML = stock[6]
                                                      : oCell.innerHTML = stock[j];
                            
                            oCell.vAlign	="top"; 
                            if (j==7)
                            {
                                oCell.align = "left";
                            }
                            else
                            {
                                oCell.align = "center";
                            }
                            oRow.appendChild(oCell);
                        }
                    }
                }
            }

		}

        if ( DevNeedRebootFlag )
        {
            // 2006-11-9
            //
            // to see the function beginning defined ...
            //
            // var stock = new Array()
        
            oRow = document.createElement("TR");
            oCell = document.createElement("TD");
            oCell.colSpan= g_maxcols+1
            oCell.align = "center"
            oCell.innerHTML = "<center><br>升级后需要重新启动<br></center><br>"
            oRow.appendChild(oCell);
            g_oTBody0.appendChild(oRow);


            for (var i=0; i<g_UpdatedDeviceRows ; i++)
            {
                ReadArrayToDeviceInfo(stock , g_UpdatedDeviceArray , i)

                // 如果设备有驱动备份、设备没有故障且用户选择导出该驱动
                //if (!(stock[7] & 0x00000010) && !stock[5] && ( g_UserDrvDeviceInfoArray[i+",21"] != false) )
                // 如果设备安装驱动后需要重启
                if ( stock[4] & 0x00000100 )
                {
                    var oRow,oCell;
                    oRow = document.createElement("TR");
                    g_oTBody0.appendChild(oRow);

                    // 将枚举到的设备信息 - 全局变量数组g_ImportedDeviceArray的第i行数组 
                    // 翻译成表格中第i行中的字符串数组形式存放到stock
                    TranslateDeviceInfoToArray( stock , g_UpdatedDeviceArray , i ,i );

                    if (!stock[6] || stock[1]==0 ||  !stock[4] )
                    {
                        stock[0] = stock[1] = stock[2] = stock[3] = stock[4] = stock[5] = stock[6] = stock[7] = "";
                    }
                    //if ( g_UpdatedDeviceArray[i+",22"] )
                    //{
                        var ImpDrvHtml = ""//"<img src='img/yes.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_UpdatedDeviceArray[i+",23"] + "'>"
                    //}
                    //else
                    //{
                    //    var ImpDrvHtml = ""//"<img src='img/err.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_UpdatedDeviceArray[i+",23"] + "'>"
                    //     stock[6] =  stock[6].replace( /green/ig , "red" )
                    //}
                    for (j=0; j<g_maxcols; j++)
                    {

                        oCell = document.createElement("TD");
                        //oCell.innerHTML	= stock[j];
                        (j==0)? oCell.innerHTML =""
                           :(j==1)? oCell.innerHTML = ImpDrvHtml
                                :(j==2)	? oCell.innerHTML = stock[7]
                                    : (j==6) ? oCell.innerHTML = stock[2]
                                         : (j==7) ? oCell.innerHTML = stock[6]
                                                  : oCell.innerHTML = stock[j];
                        
                        oCell.vAlign	="top"; 
                        if (j==7)
                        {
                            oCell.align = "left";
                        }
                        else
                        {
                            oCell.align = "center";
                        }
                        oRow.appendChild(oCell);
                    }
                }
            }
        }
	}

       
    // 2006-9-28
    //
    // 显示不能升级的驱动清单
	//
	// 如果有用户选择不升级的驱动或有不能升级的驱动
	//if ( g_NoUpdateDeviceRows )
	//{
	//	var stock = new Array()
    //
	//	oRow  = document.createElement("TR");
	//	oCell = document.createElement("TD");
    //
	//	oCell.colSpan= g_maxcols+1
    //    // 2006-8-29
    //    // oCell.innerHTML = "<center><br>没有升级的驱动<br></center><br>"
    //    oCell.innerHTML = "<center><br>未升级的驱动<br></center><br>"
	//	                  //+"<img border='0' src='img/6.GIF'>：不能导出&nbsp<img border='0' src='img/1.GIF'>：用户不要导出<br>"
	//	oCell.align = "right"
	//	oRow.appendChild(oCell);
	//	g_oTBody0.appendChild(oRow);
    //
    //
	//	for (var i=0; i<g_NoUpdateDeviceRows ; i++)
	//	{
	//		ReadArrayToDeviceInfo(stock , g_NoUpdateDeviceArray , i)
    //
	//		{
	//			var oRow,oCell;
	//			oRow = document.createElement("TR");
	//			g_oTBody0.appendChild(oRow);
    //
    //
	//			// 将枚举到的设备信息 - 全局变量数组g_NoImportDeviceArray的第i行数组 
	//			// 翻译成表格中第i行中的字符串数组形式存放到stock
	//			TranslateDeviceInfoToArray(stock,g_NoUpdateDeviceArray, i ,i );
    //
	//			if (!stock[6] || stock[1]==0 ||  !stock[4] )
	//			{
	//				stock[0] = stock[1] = stock[2] = stock[3] = stock[4] = stock[5] = stock[6] = stock[7] = "";
	//			}
    //            var ImpDrvHtml = "<img src='img/err2.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='驱动无法升级或您选择不升级该驱动'>"
    //            //stock[6] =  stock[6].replace( /green/ig , "red" )
	//			for (j=0; j<g_maxcols; j++)
	//			{
    //
	//				oCell = document.createElement("TD");
	//				//oCell.innerHTML	= stock[j];
	//				(j==0)? oCell.innerHTML =""
	//				   :(j==1)? oCell.innerHTML = ImpDrvHtml
	//					:(j==2)	? oCell.innerHTML = stock[7]
	//						: (j==6) ? oCell.innerHTML = stock[2]
	//								 : (j==7) ? oCell.innerHTML = stock[6]
	//										  : oCell.innerHTML = stock[j];
	//				
	//				oCell.vAlign	="top"; 
	//				if (j==7)
	//				{
	//					oCell.align = "left";
	//					//oCell.width = "90%";
	//				}
	//				else
	//				{
	//					oCell.align = "center";
	//				}
	//				oRow.appendChild(oCell);
	//			}
	//		}
	//	}
	//}
}   
function ImportDriverToGivenDeviceFromServer( UserID , DriverID , DeviceInfo )
{
    var RetInfo         = new Array()
    // 2007-3-7
    //
    // 将原始的设备信息保存
    var OrgDeviceInfo = DeviceInfo

    // 2006-8-20
    DisplayMessage( "正在为用户" + g_UserID + "安装驱动(UserID=" + UserID + ",DriverID=" + DriverID + ")..." )

    var FinishedPercent = 10
    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
    ProcessingInfo.innerHTML = '正在保存设备驱动初始状态...'
    DrvCert.UIRefresh()

    // 上传当前故障设备的状态信息，留作向用户收费的日志信息，一旦发生服务争议，此信息将做为用户服务证据。
    //
    // 2006-9-28 ..............................................................................................
    //
    //var errInfo = UploadDriverToImportDeviceInfoToServer( g_UserID , UserID , DriverID , DeviceInfo )
    //if ( errInfo )
    //{
    //    RetInfo["Success"]  = false
    //    RetInfo["Info"]     = errInfo
    //    return ( RetInfo )
    //}
    // 2006-8-20
    //DisplayMessage( "保存设备修复前的状态到服务器成功" )
    //
    // 2006-9-28 ...............................................................................................

    // 2006-10-29
    DisplayMessage( "正在为用户" + g_UserID + "读取远程驱动信息(UserID=" + UserID + ",DriverID=" + DriverID + ")..." )

    FinishedPercent = 20
    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
    ProcessingInfo.innerHTML = '正在读取远程驱动信息...'
    DrvCert.UIRefresh()
    // 获取当前用户g_UserID要下载驱动DriverID的信息，包括：驱动包CAB大小、驱动包CAB文件名、设备类别、设备提供商
    var DriverInfo = GetGivenDriverInfoFromServerByDriverID( g_UserID , DriverID )
    //DriverInfo["Success"   ] 
    //DriverInfo["Info"      ]
    //DriverInfo["DriverSize"]
    //DriverInfo["DriverName"]
    //DriverInfo["ClassName" ]
    //DriverInfo["Provider"  ]
    //DriverInfo["DriverDecKey"]
    //
    // 2006-8-20
    //
    //    DriverInfo["DeviceDesc" ]
    //    DriverInfo["DeviceID"   ]
    //    DriverInfo["InfName"    ]
    //    DriverInfo["Section"    ]
    //    DriverInfo["DriverHash" ]
    //    DriverInfo["UserID"     ]
    //    DriverInfo["DriverDate" ]
    //    DriverInfo["DriverVer"  ]
    //    DriverInfo["OSMajorVer" ]
    //    DriverInfo["OSMinorVer" ]
    //    DriverInfo["OSPlatform" ]
    //    DriverInfo["Description"]
    //    DriverInfo["Host"       ]

    if ( DriverInfo["Success"] )
    {
        DriverInfo["DriverID"] = DriverID
    }
    else
    {
        RetInfo["Success"]  = false
        RetInfo["Info"]     = DriverInfo["Info"]
        return ( RetInfo )
    }
    // 2006-8-20
    DisplayMessage( "从服务器读取驱动#" + DriverID + "信息成功" )


    FinishedPercent = 30
    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
    ProcessingInfo.innerHTML = '正在检测同名驱动文件...'
    DrvCert.UIRefresh()
    // 2007-2-13
    //
    //// 获取驱动下载目录
    //var SysPath = DrvCert.GetFolderPath( 36 )	// 36 0x24 - CSIDL_WINDOWS  
    //var DownloadPath =  SysPath + "\\MyDrivers\\ImportDrv\\" 
    //                            // 2006-10-19
    //                            // 去掉特殊字符，如：“/?*:<>|”
    //                            // + DriverInfo["Provider"]    + "\\" 
    //                            + DriverInfo["Provider"].replace( /[\/\?\*\:\<\>\|]/gi , "" )    + "\\" 
    //                            // 2006-10-19
    //                            // 去掉特殊字符，如：“/?*:<>|”
    //                            // + DriverInfo["Provider"]    + "\\" 
    //                            // + DriverInfo["ClassName"]   + "\\" 
    //                            + DriverInfo["ClassName"].replace( /[\/\?\*\:\<\>\|]/gi , "" )   + "\\" 
    //                            //
    //                            + DriverID   
    
    // 2007-3-12
    // 如果文件名中包含目录,就把该目录合并到下载目录中，同时文件名变量只取文件名部分（不包括路径）
    var DriverNameSubDir = ""
    // DriverName= "1\setup.userdrv.cab"
    if ( DriverInfo["DriverName"].indexOf( "\\" ) != -1 )
    {
        // DriverNameSubDir = "\1"
        DriverNameSubDir = "\\" + DriverInfo["DriverName"].substring( 0 , DriverInfo["DriverName"].indexOf("\\") )
        DriverInfo["DriverName"] = DriverInfo["DriverName"].substr( DriverInfo["DriverName"].indexOf("\\") + 1 )
    }
    // 获取驱动下载目录
    var DownloadPath =  g_DownloadPath + "\\" + DOWNLOAD_DRIVER_SUBDIR + "\\" // "\\Download\\" 
                                // 2006-10-19
                                // 去掉特殊字符，如：“/?*:<>|”
                                // + DriverInfo["Provider"]    + "\\" 
                                + DriverInfo["Provider"].replace( /[\/\?\*\:\<\>\|]/gi , "" )    + "\\" 
                                // 2006-10-19
                                // 去掉特殊字符，如：“/?*:<>|”
                                // + DriverInfo["Provider"]    + "\\" 
                                // + DriverInfo["ClassName"]   + "\\" 
                                + DriverInfo["ClassName"].replace( /[\/\?\*\:\<\>\|]/gi , "" )   + "\\" 
                                //
                                + DriverID   
                                // 2007-3-12
                                + DriverNameSubDir

    // 2007-2-13 <<<................................................................................................................
    //
    // 下载过的驱动不再删除，可以避免驱动重复下载
    //
    var DriverCabFilename = DownloadPath + "\\"  + DriverInfo["DriverName"] // "121231\1\setup.userdrv.cab"
	var DrvFileNameXml = DrvCert.FindFileInPath( DriverCabFilename ) ;// "img\\ClientLogo.gif"
    var FindFileName = GetXmlSingleNodeText( DrvFileNameXml , "FileItem0" )
    // 如果驱动文件已经存在且文件长度与服务器一致,就认为以前下载的驱动文件是可用的,下载驱动操作将被跳过
    if ( FindFileName && ( DrvCert.GetFileSize( DriverCabFilename ) == DriverInfo["DriverSize"] ) ) 
    {
        FinishedPercent = 40
        PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
        PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
        ProcessingInfo.innerHTML = '正在跳过下载远程驱动文件...'
        DrvCert.UIRefresh()
        DisplayMessage( "驱动文件[" + ( DriverCabFilename ) + "]已下载过,下载操作被跳过" )
    }
    //  如果驱动文件没有下载过或下载文件长度与服务器不一致,就下载驱动
    else
    {
        // 2007-3-10 <<<.....................................................................................................
        FinishedPercent = 35
        PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
        PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
        ProcessingInfo.innerHTML = '正在检测硬盘剩余空间...'
        DrvCert.UIRefresh()

        DisplayMessage( "正在检测" + g_DownloadPath.substring( 0 , 1 ) + ":" + "盘剩余空间..." )

        var CurDriveFreeSpaceXml = DrvCert.GetDiskFreeSpaceXml( g_DownloadPath.substring( 0 , 1 ) + ":" )
        var CurDriveFreeSpace    = parseInt( GetXmlSingleNodeText( CurDriveFreeSpaceXml , "FreeBytes" ) )
        if ( CurDriveFreeSpace < DriverInfo["DriverSize"] )
        {
            DisplayMessage( g_DownloadPath.substring( 0 , 1 ) + ":" + "盘剩余空间不足，无法下载驱动文件#" + DriverID + "(len=" + DriverInfo["DriverSize"] + ")" )

            RetInfo["Success"]  = false
            RetInfo["Info"]     = g_DownloadPath.substring( 0 , 1 ) + ":" + "盘剩余空间不足,请删除部分文件后重试"
            return ( RetInfo )
        }
        // 2007-3-10 .....................................................................................................>>>
        
        

        FinishedPercent = 40
        PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
        PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
        ProcessingInfo.innerHTML = '正在下载远程驱动文件...'
        DrvCert.UIRefresh()

        DrvCert.DeleteFile( DownloadPath + "\\" + DriverInfo["DriverName"] )
        // 2006-8-20
        DisplayMessage( "清理旧的驱动文件" + ( DownloadPath + "\\" + DriverInfo["DriverName"] ) + "完成" )

        // 下载指定UserID、DriverID的驱动；如果当前g_UserID != UserID，说明用户要借别人的驱动解决自己的故障
        // 同时上传下载文件的结果，以供系统分析修复用户驱动失败的原因
        var DownloadInfo = DownloadMatchingDriverFromServerToPath( g_UserID , DriverInfo , DownloadPath + "\\" + DriverInfo["DriverName"] )
        if ( DownloadInfo["Success"] )
        {
        }
        else
        {
            RetInfo["Success"]  = false
            RetInfo["Info"]     = DownloadInfo["Info"]
            return ( RetInfo )
        }
        // 2006-8-20
        DisplayMessage( "用户#" + g_UserID + "从服务器下载驱动#" + DriverInfo["DriverID"] + "到" + ( DownloadPath + "\\" + DriverInfo["DriverName"] ) + "完成" )

        var DriverCabFilename = DownloadPath + "\\" + DriverInfo["DriverName"]

        // 2006-10-20
        //
        // 有时发现由于服务器繁忙或其他错误，会导致下载失败，这种情况在这里进行判断
        if ( DrvCert.GetFileSize( DriverCabFilename ) < 50 )
        {
            RetInfo["Success"]  = false
            RetInfo["Info"]     = "从服务器下载驱动" + DriverCabFilename + "失败(服务器当前可能繁忙，请稍候重试)"
            return ( RetInfo )
        }
    }
    //
    // 2007-2-13 ................................................................................................................>>>

    FinishedPercent = 80
    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
    ProcessingInfo.innerHTML = '正在还原驱动文件...'
    DrvCert.UIRefresh()
    // 2007-3-12
    var ExtractCabPath = DownloadPath + "\\" + DriverCabFilename.substr( DriverCabFilename.lastIndexOf("\\") + 1 ).replace( /\.cab$/gi , "" )
    // 下载后保存并还原文件内容
    // 2007-3-12
    // var extractResult = DrvCert.ExtractCabToPath( DriverCabFilename , DownloadPath )
    var extractResult = DrvCert.ExtractCabToPath( DriverCabFilename , ExtractCabPath )
    // 2007-3-12
    //// 2006-8-20
    //DisplayMessage( "从服务器下载的驱动文件" + DriverCabFilename + "被解压缩到" + DownloadPath  )
    DisplayMessage( "从服务器下载的驱动文件" + DriverCabFilename + "被解压缩到" + ExtractCabPath  )

    FinishedPercent = 85
    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
    ProcessingInfo.innerHTML = '正在还原INF文件...'
    DrvCert.UIRefresh()
    //
    //
    // 如果用户要下载别人的驱动解决驱动故障
    //if ( UserID != g_UserID )
    // 2005-8-7
    // 
    // 如果用户要下载别人的驱动解决驱动故障、
    // 或者自己的驱动是冗余处理过的（它的驱动文件名指向另一个驱动记录号）
    //
    // 如果服务器soap服务程序返回DriverDecKey，就使用它解密INF文件
    if ( DriverInfo["DriverDecKey"] )
    {
        var EncryptKey = DriverInfo["DriverDecKey"]
    }
    // 如果用户要用自己的驱动（且不是冗余处理过的）解决驱动故障
    else
    {
        // 2006-10-5
        //var MainBoardInfoXml	    = GetMainBoardInfo()
        //var ComputerMfg             = GetInfoByTagFromXml( MainBoardInfoXml, "ComputerManufacturer" )
        //var ComputerModel           = GetInfoByTagFromXml( MainBoardInfoXml, "ComputerModel" )
        //var BaseBoardMfg            = GetInfoByTagFromXml( MainBoardInfoXml, "BaseBoardManufacturer" )
        //var BaseBoardProduct        = GetInfoByTagFromXml( MainBoardInfoXml, "BaseBoardProduct" )
        //var BaseBoardVersion        = GetInfoByTagFromXml( MainBoardInfoXml, "BaseBoardVersion" )
        //var BaseBoardSerialNumber   = GetInfoByTagFromXml( MainBoardInfoXml, "BaseBoardSerialNumber" )
        //var EncryptKey = DrvCert.GetDataHash( INF_ENCRYPT_CONST_STRING + //"e-Software.cn"
        //                                      ComputerMfg       + 
        //                                      ComputerModel     + 
        //                                      BaseBoardMfg      + 
        //                                      BaseBoardProduct  +
        //                                      BaseBoardVersion  + 
        //                                      BaseBoardSerialNumber )
    }
    // 2007-3-12
	// var FileNameXml = DrvCert.FindFileInPath( DownloadPath + "\\*.enc.inf" ) ;// "img\\ClientLogo.gif"
    var FileNameXml = DrvCert.FindFileInPath( ExtractCabPath + "\\*.enc.inf" ) ;// "img\\ClientLogo.gif"
    var EncINFFileName = GetXmlSingleNodeText( FileNameXml , "FileItem0" )
    if ( !EncINFFileName ) 
    {
        RetInfo["Success"]  = false
        // 2007-3-12
        // RetInfo["Info"]     = "目录" + DownloadPath + "中没有发现*.enc.inf文件错"
        RetInfo["Info"]     = "目录" + ExtractCabPath + "中没有发现*.enc.inf文件错"
        return ( RetInfo )
    }
    // 2007-3-2 <<<...............................
    // a.enc.inf在下载后不能被删除，因为在软件包中a.inf和a.enc.inf可能同时存在，如果用a.enc.inf覆盖a.inf然后再删除a.enc.inf就会导致原来的a.inf内容丢失
    // 使某些软件无法运行
    // var INFFIleName = EncINFFileName.replace( /.enc.inf$/gi,".Inf")
    var INFFIleName = EncINFFileName
    //
    // 2007-3-2 ...............................>>>

    //    5.为INF文件解密
    // 2007-3-12
    // var INFFilePathFileName = DownloadPath + "\\" + INFFIleName
    var INFFilePathFileName = ExtractCabPath + "\\" + INFFIleName
    // 2006-10-2
    //var INFContent          = DrvCert.GetBASE64StringFromBinFile( DownloadPath + "\\" + EncINFFileName )
    //var INFDecContent       = DrvCert.DencryptDataByKey( INFContent , EncryptKey )
    // 2006-10-2
    //var bSuccess      = DrvCert.SaveBASE64ToBinFile( INFDecContent , INFFilePathFileName )
    // 2007-3-2
    // DrvCert.CopyFile( DownloadPath + "\\" + EncINFFileName , INFFilePathFileName )

    // 2006-8-20
    DisplayMessage( "驱动主INF文件" + INFFilePathFileName + "还原成功" )    // 2006-10-6 "解密成功"

    // 2007-3-2
    // a.enc.inf在下载后不能被删除，因为在软件包中a.inf和a.enc.inf可能同时存在，如果用a.enc.inf覆盖a.inf然后再删除a.enc.inf就会导致原来的a.inf内容丢失
    // 使某些软件无法运行
    // DrvCert.DeleteFile( DownloadPath + "\\" + EncINFFileName )

    // 2007-2-13
    //
    // 下载的cab驱动在下载安装完后不要删除,下次再用就不用重复下载了
    //DrvCert.DeleteFile( DriverCabFilename )


    FinishedPercent = 90
    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
    ProcessingInfo.innerHTML = '正在安装驱动程序...'
    DrvCert.UIRefresh()
    // 为用户安装刚才下载的驱动
    //
    // 2006-1-6
    //
    // 获取刚才下载的驱动类型（是EXE驱动还是INF驱动，标志是INF文件Version节是否有DriverType=EXE内容）
    var InfHandle = DrvInf.OpenINFFile( INFFilePathFileName )
    
    // 2006-11-1 <<<........................................................
    if ( InfHandle == 0xFFFFFFFF )
    {
        // 2006-8-20
        DisplayMessage( "打开INF文件失败：" + INFFilePathFileName )

        RetInfo["Success"]  = false
        RetInfo["Info"]     = "打开INF文件失败：" + INFFIleName
        return ( RetInfo )
    }
    // 2006-11-1 ........................................................>>>

    var SectionFalg             = (DrvInf.GetSectionKeyValue( InfHandle , "Version" , "" , 0 )) ? true : false
    var DriverType              = ( SectionFalg ) ? DrvInf.GetSectionKeyValue( InfHandle , "Version" , "DriverType"  , 1 ) : ""
    var DriverProvider          = ( SectionFalg ) ? DrvInf.GetSectionKeyValue( InfHandle , "Version" , "Provider"    , 1 ) : ""

    // 如果下载的驱动类型是EXE类型，就加载执行EXE自安装程序
    if ( DriverType && ( DriverType.toUpperCase() == "EXE" ) )
    {
        // 2006-8-20
        DisplayMessage( "主INF文件显示驱动类型是EXE,提供商是" + DriverProvider )

        // 2007-3-8 <<<......................................................................
        DisplayMessage( "正在检测驱动文件#" + DriverID + "是否安装过..." )

        var HashValueExistFlag = false
        var hKey = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\MyDrivers")
        if ( hKey )
        {
            HashValueExistFlag = DrvCert.RegQueryValue( hKey , DriverInfo["DriverHash" ] )
            DrvCert.RegCloseKey( hKey )
            hKey = null
        }
        // 2007-3-10
        //// 如果驱动是EXE类型
        //// 且设备有问题或驱动没有安装过，安装当前驱动（即如果设备没有问题且驱动安装过，就不再安装当前驱动）
        if ( DeviceInfo[5] || !HashValueExistFlag )
        //
        // 2007-3-12
        //
        // 若驱动没有安装过，就安装当前驱动（无论设备有没有问题，只要驱动没有安装过，就安装当前驱动）
        //if ( !HashValueExistFlag )
        {
            // 2006-8-20 <<<............................................................................................................
            //
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            // 
            // 由于通过某些厂商驱动光盘转换工具转换的INF文件有多于1个的Add.Reg安装节，因此，在这里要找到与硬件匹配的那个安装节。
            // 某些厂商驱动光盘转换工具转换的INF文件内容片段如下：
            //
            //    [Manufacturer]
            //    "Lenovo"=Lenovo
            //
            //    [Lenovo]
            //    "Chipset_Intel925X" = Lenovo.0 , "PCI\VEN_8086&DEV_2584"
            //    "Intel 945" = Lenovo.1 , "PCI\VEN_8086&DEV_2770"
            //    "Intel910/915" = Lenovo.2 , "PCI\VEN_8086&DEV_2580"
            //
            //    [Lenovo.0]
            //    AddReg=Lenovo.0.Add.Reg
            //
            //    [Lenovo.0.Add.Reg]
            //    HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce,"RegStr1",,"%1%\setup.exe -f2c:\install.log -s"
            //
            //    [Lenovo.1]
            //    AddReg=Lenovo.1.Add.Reg
            //
            //    [Lenovo.1.Add.Reg]
            //    HKLM,Software\Microsoft\Windows\CurrentVersion\RunOnce,"RegStr1",,"%1%\setup.exe -s"
            //
            //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            //  因此，这里就不能简单用第一个安装节代表所有安装节内的参数
            //var InfContext              = DrvInf.FindFirstLineInSection( InfHandle , DriverProvider + ".0.Add.Reg" , "" )
            //
            // 先在[Lenovo]中找安装节
            var InfContext              = DrvInf.FindFirstLineInSection( InfHandle , DriverProvider , "" )
            // 2007-3-6
            var InfSectionName = ""
            var MatchingDeviceID = ""
            var StrArrayTmp1 = new Array
            var StrArrayTmp2 = new Array
            var AllLineContent = ""
            while ( InfContext )
            {
                // 2007-3-6
                // var InfSectionName          = DrvInf.GetFieldValueInLine( InfContext ,  1 )
                // var MatchingDeviceID        = DrvInf.GetFieldValueInLine( InfContext ,  2 )
                // 2007-3-7
                //AllLineContent          = DrvInf.GetFieldValueInLine( InfContext , -1 )
                ////InfSectionName          = DrvInf.GetFieldValueInLine( InfContext ,  1 )
                ////MatchingDeviceID        = DrvInf.GetFieldValueInLine( InfContext ,  2 )
                //// 2007-3-6
                //// 
                //// may be InfSectionName return : "澶╅?0A绯诲垪WindowsXP涓嬬數瀛愭。璇存槑涔﹀畨瑁呯▼搴? = lenovo.0 , 1118"
                ////                                "天逸80A系列WindowsXP下电子档说明书安装程序" = lenovo.0 , 1118
                //// and MatchingDeviceID return ""
                ////
                ////if ( !MatchingDeviceID )
                //{
                //    StrArrayTmp1 = AllLineContent.split( "=" )
                //    // 有等号说明是包含汉字的情况
                //    if (  StrArrayTmp1[1] )
                //    {
                //        StrArrayTmp2     = StrArrayTmp1[1].split( "," )
                //        InfSectionName   = StrArrayTmp2[0].replace( /[ \f\n\r\t\v\"]/gi , "" )
                //        MatchingDeviceID = StrArrayTmp2[1].replace( /[ \f\n\r\t\v\"]/gi , "" )
                //    }
                //    // 没有等号说明是英文的情况
                //    // "Realtek AC'97 Audio for VIA (R) Audio Controller" = lenovo.0 , PCI\VEN_1106&DEV_3059&SUBSYS_D0071631 , signed  , 2K-XP , alcxwdm12.inf
                //    // AllLineContent = “lenovo.0 , PCI\VEN_1106&DEV_3059&SUBSYS_D0071631 , signed  , 2K-XP , alcxwdm12.inf”
                //    else
                //    {
                //        StrArrayTmp2     = StrArrayTmp1[0].split( "," )
                //        InfSectionName   = StrArrayTmp2[0].replace( /[ \f\n\r\t\v\"]/gi , "" )
                //        MatchingDeviceID = StrArrayTmp2[1].replace( /[ \f\n\r\t\v\"]/gi , "" )
                //    }
                //}
                InfSectionName          = DrvInf.GetFieldValueInLine( InfContext ,  1 )
                MatchingDeviceID        = DrvInf.GetFieldValueInLine( InfContext ,  2 )
                if ( DriverInfo["DeviceID"].toUpperCase() == MatchingDeviceID.toUpperCase() )
                {
                    break
                }
                InfContext = DrvInf.FindNextLineInSection( InfContext )
            }
            // 2007-3-6
            //DisplayMessage( "InfSectionName=\"" + InfSectionName + "\" , MatchingDeviceID=\"" + MatchingDeviceID + "\"")

            InfContext              = DrvInf.FindFirstLineInSection( InfHandle , InfSectionName , "AddReg" )
            var AddRegSectionName   = DrvInf.GetFieldValueInLine( InfContext ,  1 )
            InfContext              = DrvInf.FindFirstLineInSection( InfHandle , AddRegSectionName , "" )
            //
            // 执行到这里，InfContext才真正找到多安装节情况下的EXE驱动安装参数
            //
            // 2006-8-20 ............................................................................................................>>>
            

            var SetupExePathFilename    = DrvInf.GetFieldValueInLine( InfContext ,  5 )
            // 2006-8-20
            DisplayMessage( "驱动安装命令行是\"" + SetupExePathFilename + "\"" )

            // 2006-1-10 //
            DrvInf.CloseINFFile( InfHandle )
            // 2007-3-12
            //// 2007-3-2
            ////// EXE类型的驱动程序中e-Drivers.EXEDrv.INF文件是易驱动工具打包产生的，为了保证系统的完全初始化状态，这里将它删除
            ////DrvCert.DeleteFile( INFFilePathFileName )
            DrvCert.DeleteFile( INFFilePathFileName )

            // 2007-3-2
            //
            // 去掉" /s"参数
            SetupExePathFilename = SetupExePathFilename.replace( / \/s/i , "" ) 

            // 2007-3-3
            if ( !SetupExePathFilename )
            {
                var installResult = 1
                var installResultInfo = "无法找到下列安装程序\"" + SetupExePathFilename + "\""
                // 2007-3-12
                // DisplayMessage( "从路径" + DownloadPath + "安装驱动失败：" + installResultInfo )
                DisplayMessage( "从路径" + ExtractCabPath + "安装驱动失败：" + installResultInfo )

                RetInfo["Success"]  = false
                RetInfo["Info"]     = installResultInfo
                return ( RetInfo )
            }
            else
            {
                ///////////////
                // 2006-9-2
                //DrvCert.ShellRun( SetupExePathFilename )
                //var EXEDrvShellRunFlag = true
                //
                // 2006-9-8
                //var EXEDrvShellRunFlag = DrvCert.ShellRun( SetupExePathFilename )
                var EXEDrvShellRunFlag = DrvCert.ShellRun( SetupExePathFilename , true )    // waitting until application finish
                // 2007-3-2
                //
                // 安装驱动成功
                var installResult = 0 
                // 2007-3-8 <<<..............................................................................
                //
                // EXE驱动安装成功后，在注册表登记驱动的Hash值，以便下次不再安装
                var hKey = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\MyDrivers")
                if ( hKey )
                {
                    var ValueDataString =	"<RegInfo>"
                                        +		"<RegValueType>REG_DWORD</RegValueType>"
                                        +		"<RegValueData>1</RegValueData>"
                                        +	"</RegInfo>"	
                    DrvCert.RegSetValue( hKey , DriverInfo["DriverHash" ] , ValueDataString )
                    
                    DrvCert.RegCloseKey( hKey )
                    hKey = null
                }
                //
                // 2007-3-8 ..............................................................................>>>
            }
        }
        // 2007-3-10
        else
        {
            // 2007-3-10
            DisplayMessage( "当前设备的驱动已经安装过，驱动安装请求被忽略" )
        }
    }
    // 如果下载的驱动类型不是EXE类型，就用INF驱动程序安装方式来安装
    else
    {
        // 2006-8-20
        DisplayMessage( "主INF文件显示驱动类型是INF,提供商是" + DriverProvider )

        // 2006-1-10
        DrvInf.CloseINFFile( InfHandle )

        // 2006-8-26 <<<.......................................................................................................
        //
        // 2006-8-30
        //// 查找设备编号的动态值
        //var NewDeviceIndex = DrvInst.GetLockedDeviceIndex( DeviceInfo["LockHandle"] )
        //// 如果查找失败，还用原来的设备编号
        //if ( NewDeviceIndex == 0xFFFFFFFF) NewDeviceIndex = DeviceInfo[1]
        var NewDeviceIndex = DeviceInfo[1]

        // 设置不允许操作系统枚举标志，以避免由于安装驱动造成的设备枚举对下一步取装备状态造成的干扰
        g_OSEnumDevFlag = 1
        // 2006-10-6
        //
        // 设置一个函数不断扫描当前所有窗口，若发现安装驱动期间让用户选择是否覆盖原来较新驱动的窗口时就将其置顶
        // 时间间隔为500ms
        //
        // 2006-10-28
        // var timerID = window.setInterval( "SetHiddenWinToTop()" , 500 )

        //
        // 如果驱动安装成功，installResult=0；否则installResult！=0 且installStatusString返回错误原因
        //
        // 2006-10-28
        DisplayMessage( "开始安装驱动..." )

        // 2007-3-12
        // var installResult       = DrvInst.InstallDriver( DownloadPath ,NewDeviceIndex )
        var installResult       = DrvInst.InstallDriver( ExtractCabPath ,NewDeviceIndex )
        
        var installStatusString = DrvInst.StatusString

        // 2006-10-6
        //
        // 驱动安装结束后就将置顶函数取消
        //
        // 2006-10-28
        //window.clearInterval( timerID )

        //
        // 设置允许操作系统枚举标志，以重新允许本程序响应设备枚举动作
        g_OSEnumDevFlag = 0

        // // 2006-8-20
        // DisplayMessage( "从路径" + DownloadPath + "安装驱动完毕" )
        var installResultInfo = ( installResult == 0 ) ? "成功" : "失败( " + installStatusString + " )"
        // 2007-3-12
        // DisplayMessage( "从路径" + DownloadPath + "安装驱动" + installResultInfo )
        DisplayMessage( "从路径" + ExtractCabPath + "安装驱动" + installResultInfo )
        //
        // 2006-8-26 .......................................................................................................>>>

    }
    // 2006-1-10
    //DrvInf.CloseINFFile( InfHandle )

    FinishedPercent = 95
    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
    ProcessingInfo.innerHTML = '正在读取安装驱动后的设备状态...'
    DrvCert.UIRefresh()


    // 2006-8-27 <<<.......................................................................................................
    //
    // 2006-8-30
    //// 查找设备编号的动态值
    //var NewDeviceIndex = DrvInst.GetLockedDeviceIndex( DeviceInfo["LockHandle"] )
    //// 如果查找失败，还用原来的设备编号
    //if ( NewDeviceIndex == 0xFFFFFFFF) NewDeviceIndex = DeviceInfo[1]

    // 如果取设备状态成功，getStatusResult=0；否则，getStatusResult ！=0 且getStatusResultString返回错误原因
    //
	 var getStatusResult       = DrvInst.GetDeviceStatus( DeviceInfo[1] )
    //var getStatusResult       = DrvInst.GetDeviceStatus( NewDeviceIndex )
    // 2006-8-26
    var getStatusResultString = DrvInst.StatusString
    // 出错 getStatusResult != 0 
    if ( getStatusResult )
    {
        // 2006-11-13
        // DisplayMessage( "读取设备#" + NewDeviceIndex + "的状态出错(" + getStatusResultString + ")" )
        DisplayMessage( "读取设备#" + DeviceInfo[1] + "的状态出错(" + getStatusResultString + ")" )
        // 还使用原来的设备信息
        // GetDeviceInfoToArray( DeviceInfo )
    }
    else
    {
        // 从DrvInst.dll读取枚举到的设备信息
        GetDeviceInfoToArray( DeviceInfo )
    }

    // 2006-10-22 <<<...........................................
    // 
    if ( 
            // 如果安装驱动失败,且错误原因是"设备管理器未发现指定的设备"
            // 这个安装驱动错误是已知可以通过重新启动解决的，因此，在做一些特殊处理后视为成功
            ( installResult && installStatusString && installStatusString.indexOf( "安装驱动失败 - 设备管理器未发现指定的设备" ) != -1 )
            // 2006-10-23
            // 或者驱动安装成功但设备状态还是有故障的
         //||
         //   ( !installResult && DeviceInfo[5] )
       )
    {
        DisplayMessage( "正在尝试为设备#" + DeviceInfo[1] + "部署驱动..." )
        // 更改设备安装驱动后的状态为“需要重新启动”
        DeviceInfo[4] |= 0x00000100
        //    DriverInfo["DeviceID"   ]
        //    DriverInfo["InfName"    ]
        //    DriverInfo["Section"    ]
        //
        // rundll32 setupapi.dll,InstallHinfSection yourSection 132 your.inf
        //
        // rundll32 advpack.dll,LaunchINFSection your.inf,yourSection
        //
    	//#define CSIDL_SYSTEM                    0x0025        // GetSystemDirectory()
        var Sys32Path = DrvCert.GetFolderPath( 37 )
        // 2006-10-23
        var InfNameTmp = DriverInfo["InfName"].replace( /.enc.inf$/gi, ".inf" )
        var ShellCmd   = Sys32Path + "\\rundll32 " + Sys32Path + "\\advpack.dll,LaunchINFSection " 
                       // 2007-3-12
                       // + DownloadPath + "\\" + InfNameTmp.substr( InfNameTmp.lastIndexOf("\\")+1 ) 
                       + ExtractCabPath + "\\" + InfNameTmp.substr( InfNameTmp.lastIndexOf("\\")+1 ) 
                       //
                       + "," + DriverInfo["Section"]
        //
        DisplayMessage( "为设备#" + DeviceInfo[1] + "部署驱动命令行为：" + ShellCmd )
        //DrvCert.ShellRun( ShellCmd , true )    // waitting until application finish
        // 删除故障设备的驱动设置，以便下次重启时OS自动安装驱动
        DrvInst.DelDevice( DeviceInfo[1] )
        // 安装驱动结果改为成功
        installResult = 0
    }
    //
    // 2006-10-22 ...........................................>>>

    // 2007-3-7 <<<...............................................................
    //
    // 如果原始的设备状态为正常，但通过安装驱动使设备出现问题，就恢复驱动
    //
    if ( !OrgDeviceInfo[5] && DeviceInfo[5] )
    {
        var flag = DrvInst.RestoreDriver( OrgDeviceInfo[1] )

        if (flag != 0)
        {
            DisplayMessage("恢复[" + DeviceInfo[6] + "](#" + OrgDeviceInfo[1] + ")驱动失败")
        }
        else
        {
            DisplayMessage("恢复[" + DeviceInfo[6] + "](#" + OrgDeviceInfo[1] + ")驱动成功")
        }
    }
    //
    //
    // 2007-3-7 ...............................................................>>>


    // 2006-8-27
    // 如果是安装的EXE类型驱动，就更改设备安装驱动后的状态为“需要重新启动”
    if ( EXEDrvShellRunFlag ) DeviceInfo[4] |= 0x00000100;
    //
    // 2006-8-27 .......................................................................................................>>>

    FinishedPercent = 98
    PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
    PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
    ProcessingInfo.innerHTML = '正在保存安装驱动后的设备驱动信息到服务器...'
    DrvCert.UIRefresh()
    // 将安装驱动后的设备信息读出来并上传到服务器，留作向用户收费的依据，一旦发生服务争议，此信息将和
    // 故障修复前的设备信息一起做为证据。
    //
    // 另外，如果用下载的驱动修复用户设备驱动故障失败，在此时也要让服务器程序做出动作，以标识该驱动有问题，
    // 以后不要再用了（无论是自己用还是给别人用）！
    //
    // 2006-9-28 ........................................................................................
    //
    //UploadDriverImportedDeviceInfoToServer( g_UserID , UserID , DriverID , DeviceInfo );
    //
    // 2006-9-28 ........................................................................................

    // 2006-8-27 <<<.................................................................................................................
                                             // 当安装驱动后设备有问题，如果驱动是EXE类型，就认为安装驱动是成功的
    RetInfo["Success"]  = (DeviceInfo[5])    ? ( EXEDrvShellRunFlag ) ? true 
                                             // 当安装驱动后设备有问题，如果驱动是INF类型，就根据installResult来判断驱动安装结果
                                             : ( installResult == 0 ) ? true : false 
                                             // 当安装驱动后设备没有问题，看安装驱动是否成功
                                             // 2006-9-27
                                             : ( installResult == 0 ) ? true : false 

                                             // 当安装驱动后设备有问题，如果驱动是EXE类型，就认为安装驱动是成功的
    RetInfo["Info"]     = (DeviceInfo[5])    ? ( EXEDrvShellRunFlag ) ? "安装驱动成功(如果设备不可用,建议重新启动机器以使设置生效)" 
                                             // 当安装驱动后设备有问题，如果驱动是INF类型，就根据installResult来判断驱动安装结果
                                             : ( installResult == 0 ) ? "安装驱动成功(如果设备不可用,建议重新启动机器以使设置生效)" 
                                                                      : "安装驱动失败(" + installStatusString + ")"
                                             // 当安装驱动后设备没有问题，看安装驱动是否成功
                                             // 2006-9-27
                                             : ( installResult == 0 ) ? "安装驱动成功" : "安装驱动" + installResultInfo
    // 2006-8-27 .................................................................................................................>>>

    return ( RetInfo )
}
function GetUserExportedDriverRows()
{
    var Rows = 0
	for (var i=0; i<g_DevErrDeviceRows ; i++)
	{
        if ( g_DevErrDeviceInfoArray[i+",UserID"  ] == g_UserID ) Rows ++
	}
    // 检查正常设备的驱动是否需要保护
	for (var i=0; i<g_UserDrvDeviceRows ; i++)
	{
        if ( g_UserDrvDeviceInfoArray[i+",UserID"  ] == g_UserID ) Rows ++
    }
    return Rows

}

// 上传当前故障设备的状态信息，留作向用户收费的日志信息，一旦发生服务争议，此信息将做为用户服务证据。
function UploadDriverToImportDeviceInfoToServer(        UserID , 
                                                        MatchingDriverUserID , 
                                                        MatchingDriverDriverID , 
                                                        DeviceInfo )
{
	//DeviceInfo[1]  = DrvInst.DeviceIndex;
	//DeviceInfo[2]  = DrvInst.DeviceClassID;
	//DeviceInfo[3]  = DrvInst.DeviceClassType;
	//DeviceInfo[4]  = DrvInst.DeviceStatus;
	//DeviceInfo[5]  = DrvInst.DeviceProblem;
	//DeviceInfo[6]  = DrvInst.DeviceName;
	//DeviceInfo[7]  = DrvInst.BackupDriverStatus;
	//DeviceInfo[8]  = DrvInst.HardwareID;
	//DeviceInfo[9]  = DrvInst.CompatibleID;
	//DeviceInfo[10] = DrvInst.MatchingDeviceID;
	//DeviceInfo[11] = DrvInst.DriverDate;
	//DeviceInfo[12] = DrvInst.DriverVer;
	//DeviceInfo[13] = DrvInst.DriverProvider;
	               

    var SoapApplyURL = ServerName.value + SoapAspURL.value		//   personal.e-drivers.cn/soap/SoapApply.asp

	var SoapRequestXML = ""
    // 2006-10-26
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:UploadDriverToImportDeviceInfo xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    SoapRequestXML += "         <UserID>"                   + UserID                        + "</UserID>\n"
    SoapRequestXML += "         <MatchingDriverUserID>"     + MatchingDriverUserID          + "</MatchingDriverUserID>\n"
    SoapRequestXML += "         <MatchingDriverDriverID>"   + MatchingDriverDriverID        + "</MatchingDriverDriverID>\n"
    SoapRequestXML += "         <DeviceIndex>"              + DeviceInfo[1]                 + "</DeviceIndex>\n"
    SoapRequestXML += "         <DeviceClassID>"            + DeviceInfo[2]                 + "</DeviceClassID>\n"
    SoapRequestXML += "         <DeviceClassType>"          + DeviceInfo[3]                 + "</DeviceClassType>\n"
    SoapRequestXML += "         <DeviceStatus>"             + DeviceInfo[4]                 + "</DeviceStatus>\n"
    SoapRequestXML += "         <DeviceProblem>"            + DeviceInfo[5]                 + "</DeviceProblem>\n"
    SoapRequestXML += "         <DeviceName>"               + XmlEncoding( DeviceInfo[6] )  + "</DeviceName>\n"
    SoapRequestXML += "         <BackupDriverStatus>"       + DeviceInfo[7]                 + "</BackupDriverStatus>\n"
    SoapRequestXML += "         <HardwareID>"               + XmlEncoding( DeviceInfo[8] )  + "</HardwareID>\n"
    SoapRequestXML += "         <CompatibleID>"             + XmlEncoding( DeviceInfo[9] )  + "</CompatibleID>\n"
    SoapRequestXML += "         <MatchingDeviceID>"         + XmlEncoding( DeviceInfo[10])  + "</MatchingDeviceID>\n"
    SoapRequestXML += "         <DriverDate>"               + XmlEncoding( DeviceInfo[11])  + "</DriverDate>\n"
    SoapRequestXML += "         <DriverVer>"                + XmlEncoding( DeviceInfo[12])  + "</DriverVer>\n"
    SoapRequestXML += "         <DriverProvider>"           + XmlEncoding( DeviceInfo[13])  + "</DriverProvider>\n"
    SoapRequestXML += "     </n:UploadDriverToImportDeviceInfo>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

	// 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )

	if (ReturnXML == null || ReturnXML == "")
	{
        DisplayMessage( "完成上传导入驱动前的设备信息请求没有回应,请求内容:\n" + SoapRequestXML )
		return "完成上传导入驱动前的设备信息请求没有回应"
	}

	var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if (ErrorInfo != null) 
	{
		return ErrorInfo
	}
	else
	{
        var UploadResult = GetInfoByTagFromXml( ReturnXML, "Result" )
		return ( UploadResult == "Success" ) ? "" : UploadResult
	}
}

// 2006-5-3 <................................................................
//
function DownloadMatchingDriverFromServerToPath( DownloadUserID , DriverInfo , DownloadPathFileName )
{
    //DriverInfo["Success"   ] 
    //DriverInfo["Info"      ]
    //DriverInfo["DriverSize"]
    //DriverInfo["DriverName"]
    //DriverInfo["ClassName" ]
    //DriverInfo["Provider"  ]
    //DriverInfo["DriverID"  ]

    // 如果用户要用CGI模式下载驱动（却省是CGI）
    var CookieFlag = GetCookie( "DrvTransforMode" )
	if ( ( CookieFlag == "true") || !CookieFlag ) 
    {
        var RetInfo = DownloadDriverByCGI( DriverInfo , DownloadPathFileName )
        return ( RetInfo )
    }
    else
    {
        var RetInfo = DownloadDriverBySOAP( DriverInfo , DownloadPathFileName )
        return ( RetInfo )
    }
}

function DownloadDriverByCGI( DriverInfo , DownloadPathFileName )
{
    // 开始下载驱动包，直到结束
    var CurFilePointer  = 0
    var ReadSize        = 0
    var FinishedPercent = 0

    // 退出当前用户下载修复驱动操作过程的标志
    // 该标志的值只在用户点击“取消”时被改变，在这里设置的任何值都会被程序初始化为0
    g_SkipImpCurDrvFlag = 0

    var RetInfo = new Array()
    RetInfo["Success"] = false
    RetInfo["Info"]    = ""

    try
    {
        //   personal.e-drivers.cn/soap/SoapApply.asp?Mode=DownloadDrv&DriverID=3360
        var URL = ServerName.value + SoapAspURL.value + "?Mode=DownloadDrv&DriverID=" + DriverInfo["DriverID"]

        var hHttpFile       = DrvCert.HttpOpenRequestToHandle( URL )
        if ( !hHttpFile ) 
        {
            RetInfo["Info"]    = "错误：HttpOpenRequestToHandle(" +  URL + ")失败"
            return ( RetInfo )
        }
        var SubmitFlag = DrvCert.HttpWriteFile( hHttpFile , null , 0 )
        if ( !SubmitFlag )
        {
            // 2006-7-8 .........................
            DrvCert.HttpCloseRequest( hHttpFile )
            // 2006-7-8 .........................

            RetInfo["Info"]    = "错误：HttpWriteFile(" +  hHttpFile + ")失败，原因：" + DrvCert.ErrorString
            return ( RetInfo )
        }

        var TotalSize       = DrvCert.HttpQueryFileLength( hHttpFile )
        if ( !TotalSize )
        {
            // 2007-3-6
            TotalSize = DriverInfo["DriverSize"]

            //// 2006-7-8 .........................
            //DrvCert.HttpCloseRequest( hHttpFile )
            //// 2006-7-8 .........................
            //
            //RetInfo["Info"]    = "错误：HttpQueryFileLength(" +  hHttpFile + ")失败，原因：" + DrvCert.ErrorString
            //return ( RetInfo )
        }

        // 2006-7-8 ......
        try
        {
        // 2006-7-8 ......

            var ReadSize        = CGI_DOWNLOAD_CAB_FILE_BUFFER_SIZE
            // 2006-10-15
            // var FileBinContent  = true
            var FileBinContent

            // 2006-7-8 .............................................
            //  先删除旧的下载文件，以免将数据追加到旧文件的尾部
            // 2006-7-8 .............................................
            DrvCert.DeleteFile( DownloadPathFileName )

            var TargetFileHandle = DrvCert.OpenFileForWrite( DownloadPathFileName )

            for (var ReadedSize = 0 ; ReadedSize < TotalSize ;  ReadedSize += ReadSize )
            {
                FinishedPercent = 40 + Math.floor( 40*( CurFilePointer / DriverInfo["DriverSize"] ) )
                PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
                PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
                // 2006-11-11
                // ProcessingInfo.innerHTML = '<div >正在从服务器导入驱动...'
                ProcessingInfo.innerHTML = '<div >正在下载驱动<br>此过程速度快慢受网络环境的影响...'
                //
                                         + Math.floor( CurFilePointer/1024 ) + 'k/' + Math.floor( DriverInfo["DriverSize"]/1024 ) + 'k'
                                         + '&nbsp;&nbsp;<a href="?" onclick="g_SkipImpCurDrvFlag=1;return false;">取消</a>'
                                         + '</div>'
                DrvCert.UIRefresh()

                // 如果从服务器导入驱动过程中用户单击了"取消"，就退出当前下载驱动操作
                if ( g_SkipImpCurDrvFlag )
                {
                    RetInfo["Info"]    = "用户取消了驱动导入操作"
                    return ( RetInfo )
                }
                //try
                //{
                FileBinContent  = DrvCert.HttpReadFile( hHttpFile , ReadSize )
                //}
                //catch( e ) 
                //{
                //    alert( "read file error , cur_file_point is : " + CurFilePointer + " ; read size is : " + ReadSize ) 
                //}
                
                // 2006-11-2
                //
                // 当网络环境不好时，很可能会导致DrvCert.HttpReadFile()读出的数据为空，这时再写数据到文件就会产生错误
                //if ( !FileBinContent )
                //{
                //    RetInfo["Info"]    = "从服务器下载文件失败"
                //    return ( RetInfo )
                //}

                if ( !DrvCert.AppendBinDataToFile( TargetFileHandle , FileBinContent ) )
                {
                    // 2006-10-19
                    // RetInfo["Info"]    = "错误：追加写文件失败，文件长度为" + FinishedSize
                    //
                    // 2006-11-9
                    // RetInfo["Info"]    = "追加写文件失败，文件长度为" + ReadedSize
                    //
                    // 2006-11-10 <<<.................................................................................................................
                    //
                    // RetInfo["Info"]    = "下载驱动时因网速过慢或连接有问题造成失败,请稍候重试"
                    // return ( RetInfo )
                    //
                    // 对因网络原因产生的传输中断，需要进行断点续传处理，而不是仅提示用户网速慢
                    //
                    // 2006-11-11
                    //if ( !confirm( "您的网络连接已经中断,请检查您的网络连接是否正常或者网络速度过慢\n选择重试请按“确定”，取消本次操作请按“取消”" ) )
                    //{
                    //    DisplayMessage( "网络连接中断,驱动下载操作被取消" )
                    //    RetInfo["Info"]    = "网络连接中断,您取消了驱动下载操作"
                    //    return ( RetInfo )
                    //}
                    DisplayMessage( "网络连接中断,正在尝试重新建立连接..." )
                    // 循环标志
                    var ContinueFlag = true
                    while( ContinueFlag )
                    {
                        DisplayMessage( "正在关闭连接句柄" + hHttpFile + "..." )
                        // 先关闭旧的句柄文件 
                        if ( ( hHttpFile != 0xffffffff ) && ( hHttpFile != 0 ) )   DrvCert.HttpCloseRequest( hHttpFile )

                        hHttpFile        = 0xffffffff

                        //   personal.e-drivers.cn/soap/SoapApply.asp?Mode=DownloadDrv&DriverID=3360&Offset=2312
                        URL = ServerName.value + SoapAspURL.value + "?Mode=DownloadDrv&DriverID=" + DriverInfo["DriverID"] + "&Offset=" + ( CurFilePointer + ReadSize )

                        DisplayMessage( "正在打开新的连接句柄(URL=" +URL + ")..." )
                        hHttpFile       = DrvCert.HttpOpenRequestToHandle( URL )
                        // 2006-11-11
                        if (!hHttpFile)     hHttpFile = DrvCert.HttpOpenRequestToHandle( URL )
                        if (!hHttpFile)     hHttpFile = DrvCert.HttpOpenRequestToHandle( URL )
                        if (!hHttpFile)     hHttpFile = DrvCert.HttpOpenRequestToHandle( URL )

                        // 如果重试3次还失败，就循环
                        if ( !hHttpFile )  
                        {
                            // 2006-11-11
                            if ( !confirm( "与服务器的连接被重置,请检查您的网络连接是否正常\n选择重试请按“确定”，取消本次操作请按“取消”" ) )
                            {
                                DisplayMessage( "网络连接中断,驱动下载操作被取消" )
                                RetInfo["Info"]    = "网络连接中断,您取消了驱动下载操作"
                                return ( RetInfo )
                            }
                            //

                            DisplayMessage( "打开新的连接句柄失败,正在重试..." )
                            DrvInst.Sleep( 3000 ) 
                            continue
                        }
                        DisplayMessage( "打开新的连接句柄成功(handle=" + hHttpFile + ")" )

                        DisplayMessage( "正在提交新的CGI请求..." )
                        // 如果发送请求失败就重试3次
                        SubmitFlag = DrvCert.HttpWriteFile( hHttpFile , null , 0 )
                        // 2006-11-11
                        if ( !SubmitFlag ) SubmitFlag = DrvCert.HttpWriteFile( hHttpFile , null , 0 )
                        if ( !SubmitFlag ) SubmitFlag = DrvCert.HttpWriteFile( hHttpFile , null , 0 )
                        if ( !SubmitFlag ) SubmitFlag = DrvCert.HttpWriteFile( hHttpFile , null , 0 )

                        if ( !SubmitFlag ) 
                        {
                            // 2006-11-11
                            if ( !confirm( "与服务器的连接被重置,请检查您的网络连接是否正常\n选择重试请按“确定”，取消本次操作请按“取消”" ) )
                            {
                                DisplayMessage( "网络连接中断,驱动下载操作被取消" )
                                RetInfo["Info"]    = "网络连接中断,您取消了驱动下载操作"
                                return ( RetInfo )
                            }
                            //

                            DisplayMessage( "提交新的CGI请求失败" )
                            DrvInst.Sleep( 3000 )
                            continue
                        }
                        DisplayMessage( "提交新的CGI请求成功" )

                        // TotalSize应该还保留原始的文件长度而不是断点续传的文件长度
                        //
                        //TotalSize       = DrvCert.HttpQueryFileLength( hHttpFile )
                        //if ( !TotalSize )
                        //{
                        //    DrvCert.HttpCloseRequest( hHttpFile )
                        //    RetInfo["Info"]    = "错误：HttpQueryFileLength(" +  hHttpFile + ")失败，原因：" + DrvCert.ErrorString
                        //    return ( RetInfo )
                        //}
                        DisplayMessage( "正在从网络读取内容(handle=" + hHttpFile + ",size=" + ReadSize + ")..." )
                        FileBinContent  = DrvCert.HttpReadFile( hHttpFile , ReadSize )
                        // 如果读网络下载的文件内容数据出错,就进入循环处理,这个过程的退出需要用户通过点击取消下载动作来结束
                        if ( !DrvCert.AppendBinDataToFile( TargetFileHandle , FileBinContent ) )
                        {
                            DisplayMessage( "从网络读取内容失败,正在重试..." )
                            continue
                        }
                        else
                        {
                            DisplayMessage( "从网络读取内容成功" )
                            ContinueFlag = false
                            break
                        }
                    }
                    //
                    // 2006-11-10 <<<.................................................................................................................
                }
                // 2006-10-16
                // FileBinContent = null

                CurFilePointer = ( ReadedSize > TotalSize ) ? TotalSize : ReadedSize
            }
        // 2006-7-8 ............................................
        //
        //    DrvCert.HttpCloseRequest( hHttpFile )
        //    DrvCert.CloseFileForRead( TargetFileHandle )
        //
        }
        finally
        {
            // 2006-11-10
            //
            // DrvCert.HttpCloseRequest( hHttpFile )
            // DrvCert.CloseFileForRead( TargetFileHandle )
            if ( ( hHttpFile          != 0xffffffff ) && ( hHttpFile          != 0 ) )   DrvCert.HttpCloseRequest( hHttpFile )
            if ( ( TargetFileHandle   != 0xffffffff ) && ( TargetFileHandle   != 0 ) )   DrvCert.CloseFileForRead( TargetFileHandle )
        }
        //
        // 2006-7-8 ............................................

        // 如果成功读完所有内容
        if ( ReadedSize >= TotalSize )
        {
            RetInfo["Success"] = true
            RetInfo["Info"]    = ""
            return ( RetInfo )
        }
        else
        {
            RetInfo["Success"] = false
            RetInfo["Info"]    = "下载文件" + DriverInfo["DriverName"] + "失败"
            return ( RetInfo )
        }
    }
    finally
    {
    }

}
function DownloadDriverBySOAP( DriverInfo , DownloadPathFileName )
{
    // 开始下载驱动包，直到结束
    var FinishedFlag    = false
    var CurFilePointer  = 0
    var FileContentInfo = ""
    var ReadSize        = 0
    var FinishedPercent = 0

    // 退出当前用户下载修复驱动操作过程的标志
    // 该标志的值只在用户点击“取消”时被改变，在这里设置的任何值都会被程序初始化为0
    g_SkipImpCurDrvFlag = 0
    do
    {
        FinishedPercent = 40 + Math.floor( 40*( CurFilePointer / DriverInfo["DriverSize"] ) )
        PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
        PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
        ProcessingInfo.innerHTML = '<div >正在从服务器导入驱动...'
                                 + Math.floor( CurFilePointer/1024 ) + 'k/' + Math.floor( DriverInfo["DriverSize"]/1024 ) + 'k'
                                 + '&nbsp;&nbsp;<a href="?" onclick="g_SkipImpCurDrvFlag=1;return false;">取消</a>'
                                 + '</div>'
        DrvCert.UIRefresh()

        // 如果从服务器导入驱动过程中用户单击了"取消"，就退出当前下载驱动操作
        if ( g_SkipImpCurDrvFlag )
        {
            var RetInfo = new Array()
            RetInfo["Success"] = false
            RetInfo["Info"]    = "用户取消了驱动导入操作"
            return ( RetInfo )
        }

        ReadSize = DOWNLOAD_CAB_FILE_BUFFER_SIZE
        FileContentInfo = ReadFileContentFromServerByFilePointer( DriverInfo["DriverID"] , CurFilePointer , ReadSize )
        // 如果没有读出内容，退出
        if ( !FileContentInfo["Success"]) break
        DrvCert.AppendBinDataInBASE64ToFile( DownloadPathFileName , FileContentInfo["Content"] )
        CurFilePointer += parseInt( FileContentInfo["ReadSize"] )
        // 如果读完了文件所有内容
        if ( CurFilePointer>= DriverInfo["DriverSize"] ) FinishedFlag = true
    }
    while (!FinishedFlag)
    var RetInfo = new Array()
    // 如果成功读完所有内容
    if ( FinishedFlag )
    {
        RetInfo["Success"] = true
        RetInfo["Info"]    = ""
        return ( RetInfo )
    }
    else
    {
        if ( !FileContentInfo["Success"] )
        {
            RetInfo["Success"] = false
            RetInfo["Info"]    = "下载文件" + DriverInfo["DriverName"] + "失败 : " + FileContentInfo["Info"]
            return ( RetInfo )
        }
        else
        {
            RetInfo["Success"] = false
            RetInfo["Info"]    = "下载文件" + DriverInfo["DriverName"] + "失败 : 文件长度错"
            return ( RetInfo )
        }
    }

}
// 2006-5-3 ...............................................................................>

// 将安装驱动后的设备信息读出来并上传到服务器，留作向用户收费的依据，一旦发生服务争议，此信息将和
// 故障修复前的设备信息一起做为证据。
//
// 另外，如果用下载的驱动修复用户设备驱动故障失败，在此时也要让服务器程序做出动作，以标识该驱动有问题，
// 以后不要再用了（无论是自己用还是给别人用）！
function UploadDriverImportedDeviceInfoToServer(  
                                            UserID , 
                                            MatchingDriverUserID , 
                                            MatchingDriverDriverID , 
                                            DeviceInfo )
{
	//DeviceInfo[1]  = DrvInst.DeviceIndex;
	//DeviceInfo[2]  = DrvInst.DeviceClassID;
	//DeviceInfo[3]  = DrvInst.DeviceClassType;
	//DeviceInfo[4]  = DrvInst.DeviceStatus;
	//DeviceInfo[5]  = DrvInst.DeviceProblem;
	//DeviceInfo[6]  = DrvInst.DeviceName;
	//DeviceInfo[7]  = DrvInst.BackupDriverStatus;
	//DeviceInfo[8]  = DrvInst.HardwareID;
	//DeviceInfo[9]  = DrvInst.CompatibleID;
	//DeviceInfo[10] = DrvInst.MatchingDeviceID;
	//DeviceInfo[11] = DrvInst.DriverDate;
	//DeviceInfo[12] = DrvInst.DriverVer;
	//DeviceInfo[13] = DrvInst.DriverProvider;
	               

    var SoapApplyURL = ServerName.value + SoapAspURL.value		//   personal.e-drivers.cn/soap/SoapApply.asp

	var SoapRequestXML = ""
    // 2006-10-26
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:UploadDriverImportedDeviceInfo xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    SoapRequestXML += "         <UserID>"                   + UserID                        + "</UserID>\n"
    SoapRequestXML += "         <MatchingDriverUserID>"     + MatchingDriverUserID          + "</MatchingDriverUserID>\n"
    SoapRequestXML += "         <MatchingDriverDriverID>"   + MatchingDriverDriverID        + "</MatchingDriverDriverID>\n"
    SoapRequestXML += "         <DeviceIndex>"              + DeviceInfo[1]                 + "</DeviceIndex>\n"
    SoapRequestXML += "         <DeviceClassID>"            + DeviceInfo[2]                 + "</DeviceClassID>\n"
    SoapRequestXML += "         <DeviceClassType>"          + DeviceInfo[3]                 + "</DeviceClassType>\n"
    SoapRequestXML += "         <DeviceStatus>"             + DeviceInfo[4]                 + "</DeviceStatus>\n"
    SoapRequestXML += "         <DeviceProblem>"            + DeviceInfo[5]                 + "</DeviceProblem>\n"
    SoapRequestXML += "         <DeviceName>"               + XmlEncoding( DeviceInfo[6] )  + "</DeviceName>\n"
    SoapRequestXML += "         <BackupDriverStatus>"       + DeviceInfo[7]                 + "</BackupDriverStatus>\n"
    SoapRequestXML += "         <HardwareID>"               + XmlEncoding( DeviceInfo[8] )  + "</HardwareID>\n"
    SoapRequestXML += "         <CompatibleID>"             + XmlEncoding( DeviceInfo[9] )  + "</CompatibleID>\n"
    SoapRequestXML += "         <MatchingDeviceID>"         + XmlEncoding( DeviceInfo[10])  + "</MatchingDeviceID>\n"
    SoapRequestXML += "         <DriverDate>"               + XmlEncoding( DeviceInfo[11])  + "</DriverDate>\n"
    SoapRequestXML += "         <DriverVer>"                + XmlEncoding( DeviceInfo[12])  + "</DriverVer>\n"
    SoapRequestXML += "         <DriverProvider>"           + XmlEncoding( DeviceInfo[13])  + "</DriverProvider>\n"
    SoapRequestXML += "     </n:UploadDriverImportedDeviceInfo>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

	// 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )

	if (ReturnXML == null || ReturnXML == "")
	{
        DisplayMessage( "完成上传导入过驱动的设备信息请求没有回应,请求内容:\n" + SoapRequestXML )
		return "完成上传导入过驱动的设备信息请求没有回应"
	}

	var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if (ErrorInfo != null) 
	{
		return ErrorInfo
	}
	else
	{
        var UploadResult = GetInfoByTagFromXml( ReturnXML, "Result" )
		return ( UploadResult == "Success" ) ? "" : UploadResult
	}
}

function GetGivenDriverInfoFromServerByDriverID( UserID , DriverID )
{
    var RetInfo = new Array()
    var SoapApplyURL = ServerName.value + SoapAspURL.value		//   personal.e-drivers.cn/soap/SoapApply.asp

	var SoapRequestXML = ""
    // 2006-10-26
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:GetDriverInfoByDriverID xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    SoapRequestXML += "         <DriverID>"                 + DriverID                      + "</DriverID>\n"
    SoapRequestXML += "         <Requester>"                + UserID                      + "</Requester>\n"
    SoapRequestXML += "     </n:GetDriverInfoByDriverID>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

	// 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )

	if (ReturnXML == null || ReturnXML == "")
	{
        DisplayMessage( "完成下载驱动前的驱动信息查询请求没有回应,请求内容:\n" + SoapRequestXML )
        RetInfo["Success"] = false
        RetInfo["Info"]    = "完成下载驱动前的驱动信息查询请求没有回应"
		return ( RetInfo )
	}

	var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if (ErrorInfo != null) 
	{
        RetInfo["Success"] = false
        RetInfo["Info"]    = ErrorInfo
		return ( RetInfo )
	}
	else
	{
        // 2006-8-20 <<<......................................................................................
        // 返回的ReturnXML是如下格式
        //
        //   "<Result>Success</Result>\n"
        // + "<DriverName>" + DriverInfo["DriverName"        ] + "</DriverName>\n"
        // + "<DriverSize>" + DriverInfo["DriverSize"        ] + "</DriverSize>\n"
        // + "<ClassName>"  + DriverInfo["ClassName"         ] + "</ClassName>\n"
        // + "<Provider>"   + DriverInfo["Provider"          ] + "</Provider>\n"
        //
        // + "<DeviceDesc>" + XmlEncoding( DriverInfo["DeviceDesc"        ] ) + "</DeviceDesc>\n"
        // + "<DeviceID>"   + XmlEncoding( DriverInfo["MatchingDeviceID"  ] ) + "</DeviceID>\n"
        // + "<InfName>"    + XmlEncoding( DriverInfo["INFName"           ] ) + "</InfName>\n"
        // + "<Section>"    + XmlEncoding( DriverInfo["INFSectionName"    ] ) + "</Section>\n"
        // + "<DriverHash>" + XmlEncoding( DriverInfo["DriverHash"        ] ) + "</DriverHash>\n"
        // + "<UserID>"     + DriverInfo["UserID"            ] + "</UserID>\n"
        // + "<DriverDate>" + DriverInfo["DriverDate"        ] + "</DriverDate>\n"
        // + "<DriverVer>"  + DriverInfo["DriverVer"         ] + "</DriverVer>\n"
        // + "<OSMajorVer>" + DriverInfo["OSMajorVer"        ] + "</OSMajorVer>\n"
        // + "<OSMinorVer>" + DriverInfo["OSMinorVer"        ] + "</OSMinorVer>\n"
        // + "<OSPlatform>" + DriverInfo["OSPlatform"        ] + "</OSPlatform>\n"
        // + "<Description>"+ DriverInfo["Description"       ] + "</Description>\n"
        // + "<Host>"       + DriverInfo["Host"              ] + "</Host>\n"
        // 2006-8-20 <<<......................................................................................
        // 
        var Result = GetInfoByTagFromXml( ReturnXML, "Result" )
        RetInfo["Success"] = ( Result == "Success" ) ? true : false
        RetInfo["Info"]    = ""
        // 驱动包CAB大小、驱动包CAB文件名、设备类别、设备提供商
        RetInfo["DriverSize"]    = GetInfoByTagFromXml( ReturnXML, "DriverSize" )
        RetInfo["DriverName"]    = GetInfoByTagFromXml( ReturnXML, "DriverName" )
        RetInfo["ClassName" ]    = GetInfoByTagFromXml( ReturnXML, "ClassName"  )
        RetInfo["Provider"  ]    = GetInfoByTagFromXml( ReturnXML, "Provider"   )
        RetInfo["DriverDecKey"]  = GetInfoByTagFromXml( ReturnXML, "DriverDecKey"   )
        // 2006-8-20 <<<......................................................................................
        // 返回的ReturnXML是如下格式
        //
        RetInfo["DeviceDesc" ]  = GetInfoByTagFromXml( ReturnXML, "DeviceDesc"   )
        RetInfo["DeviceID"   ]  = GetInfoByTagFromXml( ReturnXML, "DeviceID"     )
        RetInfo["InfName"    ]  = GetInfoByTagFromXml( ReturnXML, "InfName"      )
        RetInfo["Section"    ]  = GetInfoByTagFromXml( ReturnXML, "Section"      )
        RetInfo["DriverHash" ]  = GetInfoByTagFromXml( ReturnXML, "DriverHash"   )
        RetInfo["UserID"     ]  = GetInfoByTagFromXml( ReturnXML, "UserID"       )
        RetInfo["DriverDate" ]  = GetInfoByTagFromXml( ReturnXML, "DriverDate"   )
        RetInfo["DriverVer"  ]  = GetInfoByTagFromXml( ReturnXML, "DriverVer"    )
        RetInfo["OSMajorVer" ]  = GetInfoByTagFromXml( ReturnXML, "OSMajorVer"   )
        RetInfo["OSMinorVer" ]  = GetInfoByTagFromXml( ReturnXML, "OSMinorVer"   )
        RetInfo["OSPlatform" ]  = GetInfoByTagFromXml( ReturnXML, "OSPlatform"   )
        RetInfo["Description"]  = GetInfoByTagFromXml( ReturnXML, "Description"  )
        RetInfo["Host"       ]  = GetInfoByTagFromXml( ReturnXML, "Host"         )
        // 2006-8-20 <<<......................................................................................
		return ( RetInfo )
	}
}
function ReadFileContentFromServerByFilePointer( DriverID , CurFilePointer , ReadSize )
{
    var FileContentInBASE64 = ""

    var RetInfo = new Array()
    var SoapApplyURL = ServerName.value + SoapAspURL.value		//   personal.e-drivers.cn/soap/SoapApply.asp

	var SoapRequestXML = ""
    // 2006-10-26
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:ReadDriverContent xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    SoapRequestXML += "         <DriverID>"                 + DriverID                      + "</DriverID>\n"
    SoapRequestXML += "         <User>"                     + g_UserID                      + "</User>\n"
    SoapRequestXML += "         <ReadStart>"                + CurFilePointer                + "</ReadStart>\n"
    SoapRequestXML += "         <ReadSize>"                 + ReadSize                      + "</ReadSize>\n"
    SoapRequestXML += "     </n:ReadDriverContent>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

	// 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )

	if (ReturnXML == null || ReturnXML == "")
	{
        DisplayMessage( "下载驱动请求没有回应,请求内容:\n" + SoapRequestXML )
        RetInfo["Success"] = false
        RetInfo["Info"]    = "下载驱动请求没有回应"
		return ( RetInfo )
	}

	var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if (ErrorInfo != null) 
	{
        RetInfo["Success"] = false
        RetInfo["Info"]    = ErrorInfo
		return ( RetInfo )
	}
	else
	{
        var Result = GetInfoByTagFromXml( ReturnXML, "Result" )
        RetInfo["Success"] = ( Result == "Success" ) ? true : false
        RetInfo["Info"]    = ""
        // 驱动包CAB大小、驱动包CAB文件名、设备类别、设备提供商
        RetInfo["Content" ]    = GetInfoByTagFromXml( ReturnXML, "Content" )
        RetInfo["ReadSize"]    = GetInfoByTagFromXml( ReturnXML, "ReadSize" )
        ReadSize               = RetInfo["ReadSize"]
		return ( RetInfo )
	}
}
function GetDSPCertContent()
{
    var RetInfo = new Array()
    var SoapApplyURL = ServerName.value + SoapAspURL.value		//   personal.e-drivers.cn/soap/SoapApply.asp

	var SoapRequestXML = ""
    // 2006-10-26
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:GetDSPCertContent xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    SoapRequestXML += "     </n:GetDSPCertContent>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

	// 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )

	if (ReturnXML == null || ReturnXML == "")
	{
        DisplayMessage( "查询驱动服务提供商身份请求没有回应,请求内容:\n" + SoapRequestXML )
        RetInfo["Success"] = false
        RetInfo["Info"]    = "查询驱动服务提供商身份请求没有回应"
		return ( RetInfo )
	}

	var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if (ErrorInfo != null) 
	{
        RetInfo["Success"] = false
        RetInfo["Info"]    = ErrorInfo
		return ( RetInfo )
	}
	else
	{
        var Result = GetInfoByTagFromXml( ReturnXML, "Result" )
        RetInfo["Success"       ] = ( Result == "Success" ) ? true : false
        RetInfo["Info"          ] = ""
        RetInfo["DSPCert"       ] = GetInfoByTagFromXml( ReturnXML, "DSPCertContent" )
        RetInfo["VerifyData"    ] = GetInfoByTagFromXml( ReturnXML, "DSPServerTime" )
        RetInfo["VerifyValue"   ] = GetInfoByTagFromXml( ReturnXML, "DSPSignature" )
		return ( RetInfo )
	}
}


function CheckDSPCertValid()
{
    // 1.获得DSP证书到变量DSPCertContent
    var DSPCertContent = GetDSPCertContent()
    if ( !DSPCertContent["Success"] )
    {
		DisplayMessage( "打开驱动服务提供商身份失败: " + DSPCertContent["Info"] );
		Title.innerHTML = "<br><center>打开驱动服务提供商身份失败<br>(" + DSPCertContent["Info"] + ")</center>"
		return false
    }
    //alert( "Cert verify string is : " + DSPCertContent["VerifyData"] + "\r\nCert verify value is : " + DSPCertContent["VerifyValue"] )

    // 2.检查DSP证书有效性
    var DSPCertContext      = DrvCert.OpenCertInPFX( DSPCertContent["DSPCert"]  )

    var CertNotBeforeString = DrvCert.GetCertNotBefore(  DSPCertContext ) 
    var CertNotAfterString  = DrvCert.GetCertNotAfter(   DSPCertContext )

    // 2006-3-31 begin
    //
    //var CertNotBefore  = Date.parse( CertNotBeforeString )
    //var CertNotAfter   = Date.parse( CertNotAfterString )
    //
    // Date.parse( "2004/1/1" ) = Date.parse( "1/1/2004" ) = Date.parse( "1-1-2004" ) = 1072886400000
    // Date.parse( "2004-1-1" ) = NaN
    var CertNotBefore  = Date.parse( CNDateToUSDate( CertNotBeforeString ) )
    var CertNotAfter   = Date.parse( CNDateToUSDate( CertNotAfterString  ) )
    //
    // 2006-3-31 end
    

    // 3.检查DSP证书是否是易驱动根证书颁发的
    var SubCACertContext    = DrvCert.OpenCertInX509( EDRIVERS_ROOT_CA_CERT_CONTEXT_IN_X509_BASE64 )
    var DSPCertValidFlag    = DrvCert.CheckDSPCertIssuedBySubCACert( DSPCertContext , SubCACertContext )
    if ( !DSPCertValidFlag )
    {
		DisplayMessage("驱动服务提供商无权提供此项服务（原因：伪造身份）:" + DrvCert.ErrorString )
		Title.innerHTML = "<br><center>驱动服务提供商无权提供此项服务（原因：伪造身份）</center>"
        DrvCert.CloseUserCert( DSPCertContext )
        DrvCert.CloseUserCert( SubCACertContext )
		return false
    }
    
    // 4.检查DSP证书的私钥是否有效
	if (!DrvCert.VerifyStringByBASE64Sign( DSPCertContext , DSPCertContent["VerifyData"] , DSPCertContent["VerifyValue"] ))
	{
		DisplayMessage("驱动服务提供商无权提供此项服务（原因：盗版程序）" )
		Title.innerHTML = "<br><center>驱动服务提供商无权提供此项服务（原因：盗版程序）</center>"
        DrvCert.CloseUserCert( DSPCertContext )
        DrvCert.CloseUserCert( SubCACertContext )
		return false
	}

    DrvCert.CloseUserCert( DSPCertContext )
    DrvCert.CloseUserCert( SubCACertContext )


    // 5.检查DSP证书是否过期
    var d = new Date()
    var CurTime = d.getTime()
    
    // 2006-3-31
    var ActualTime = GetRecentDocTime()
    //alert( "实际时间：" + ActualTime + "\n当前时间：" + CurTime + "\nNotBefore:" + CertNotBefore + "\nNotAfter:" + CertNotAfter )
    // 如果最新文档的时间比当前机器时间还要晚，说明当前机器时间被人为提前，我们以最新文档时间为当前时间
    if ( ActualTime > CurTime ) CurTime = ActualTime
    // 2006-3-31
    if (!( ( CertNotBefore <= CurTime ) && ( CurTime <= CertNotAfter ) ) )
    {
		DisplayMessage("服务已失效(有效期从" + CertNotBeforeString + "至" + CertNotAfterString + ")" )
		Title.innerHTML = "<br><center>驱动服务提供商提供此项服务的有效期限已过。<br>您不能继续接受此项服务,请尽快与您的驱动服务提供商联系。</center>"
		return false
    }

    return true
}
// 2007-2-28
// function GetDeviceListInfoToXml()
function GetAllDeviceInfoToXml()
{

	var DeviceListInfo = g_DeviceInfo
	var DeviceNumber   = g_DeviceRows
	var DeviceName , HardwareID , CompatibleID, MatchingDeviceId
	var DriverDate , DriverVer , DriverProvider


	var Xml = "<DeviceList>\n"
	var CurDeviceInfo = new Array()
	var i
	for (i=0;i<DeviceNumber ;i++ )
	{
		ReadArrayToDeviceInfo( CurDeviceInfo , DeviceListInfo , i )

		DeviceName = CurDeviceInfo[6]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		DeviceName = DeviceName.replace(/(\&)/gi ,"&amp;");
		DeviceName = DeviceName.replace(/(\<)/gi ,"&lt;");
		DeviceName = DeviceName.replace(/(\>)/gi ,"&gt;");

		HardwareID = CurDeviceInfo[8]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		HardwareID = HardwareID.replace(/(\&)/gi ,"&amp;");
		HardwareID = HardwareID.replace(/(\<)/gi ,"&lt;");
		HardwareID = HardwareID.replace(/(\>)/gi ,"&gt;");

		CompatibleID = CurDeviceInfo[9]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		CompatibleID = CompatibleID.replace(/(\&)/gi ,"&amp;");
		CompatibleID = CompatibleID.replace(/(\<)/gi ,"&lt;");
		CompatibleID = CompatibleID.replace(/(\>)/gi ,"&gt;");

		MatchingDeviceId = CurDeviceInfo[10]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		MatchingDeviceId = MatchingDeviceId.replace(/(\&)/gi ,"&amp;");
		MatchingDeviceId = MatchingDeviceId.replace(/(\<)/gi ,"&lt;");
		MatchingDeviceId = MatchingDeviceId.replace(/(\>)/gi ,"&gt;");
		
		DriverDate = CurDeviceInfo[11]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		DriverDate = DriverDate.replace(/(\&)/gi ,"&amp;");
		DriverDate = DriverDate.replace(/(\<)/gi ,"&lt;");
		DriverDate = DriverDate.replace(/(\>)/gi ,"&gt;");

		DriverVer = CurDeviceInfo[12]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		DriverVer = DriverVer.replace(/(\&)/gi ,"&amp;");
		DriverVer = DriverVer.replace(/(\<)/gi ,"&lt;");
		DriverVer = DriverVer.replace(/(\>)/gi ,"&gt;");

		DriverProvider = CurDeviceInfo[13]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		DriverProvider = DriverProvider.replace(/(\&)/gi ,"&amp;");
		DriverProvider = DriverProvider.replace(/(\<)/gi ,"&lt;");
		DriverProvider = DriverProvider.replace(/(\>)/gi ,"&gt;");

		Xml += "\t<DeviceItem>\n"
		Xml += "\t\t<DeviceName>"			+ DeviceName		+ "</DeviceName>\n"
		Xml += "\t\t<DeviceIndex>"			+ CurDeviceInfo[1]	+ "</DeviceIndex>\n"
		Xml += "\t\t<DeviceClassID>"		+ CurDeviceInfo[2]	+ "</DeviceClassID>\n"
		Xml += "\t\t<DeviceClassType>"		+ CurDeviceInfo[3]	+ "</DeviceClassType>\n"
		Xml += "\t\t<DeviceStatus>"			+ CurDeviceInfo[4]	+ "</DeviceStatus>\n"
		Xml += "\t\t<DeviceProblem>"		+ CurDeviceInfo[5]	+ "</DeviceProblem>\n"
		Xml += "\t\t<HardwareID>"			+ HardwareID		+ "</HardwareID>\n"
		Xml += "\t\t<CompatibleID>"			+ CompatibleID		+ "</CompatibleID>\n"
		Xml += "\t\t<MatchingDeviceId>"		+ MatchingDeviceId	+ "</MatchingDeviceId>\n"
		Xml += "\t\t<DriverBackupStatus>"	+ CurDeviceInfo[7]	+ "</DriverBackupStatus>\n"
		Xml += "\t\t<DeviceRow>"			+ CurDeviceInfo[0]	+ "</DeviceRow>\n"
		Xml += "\t\t<DriverDate>"			+ DriverDate		+ "</DriverDate>\n"
		Xml += "\t\t<DriverVer>"			+ DriverVer			+ "</DriverVer>\n"
		Xml += "\t\t<DriverProvider>"		+ DriverProvider	+ "</DriverProvider>\n"
        //// 如果设备当前状态为正常（没有故障）且是用户安装的驱动
        if ( !CurDeviceInfo[5] && ( CurDeviceInfo[7] & 0x00080000 ) )
        {
            var SysPath = DrvCert.GetFolderPath( 36 )	// 36 0x24 - CSIDL_WINDOWS  
            var InfPathFileName = SysPath + "\\inf\\" + CurDeviceInfo[14]
            var InfContentInBASE64 = DrvCert.GetBASE64StringFromBinFile( InfPathFileName )
            var InfHash = DrvCert.GetDataHash( InfContentInBASE64 )
            Xml += "\t\t<InfHash>"          + InfHash                       + "</InfHash>\n"
        }
		Xml += "\t</DeviceItem>\n"
	}
	Xml += "</DeviceList>"
return (Xml)
}
function GetClientInfo()
{
    var ClientVersion   =""
    var OEMVendor       =""
    var Provider        =""
    var Language        =""
    // 2007-2-25
    //// 如果当前页面的服务器主机地址不为空，则用户是访问的服务器客户端页面；否则，用户是访问的用户端客户端页面。
    //var AccessMode      = "DrvImp"
    //
    // 
    var AccessMode      = g_LoaderString

    var hKey = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\DrvInst")
    if (hKey)
    {
        ClientVersion = DrvCert.RegQueryValue( hKey , "Version" )
        DrvCert.RegCloseKey( hKey)
        hKey = null
    }

    hKey = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\DrvInst\\Setup")
    if (hKey) 
    {
        Language  = DrvCert.RegQueryValue( hKey , "Language"   )
        OEMVendor = DrvCert.RegQueryValue( hKey , "OEMVendor" )
        Provider  = DrvCert.RegQueryValue( hKey , "Provider" )
        
        if ( !Language ) Language   = ""
        if ( !OEMVendor) OEMVendor  = ""
        if ( !Provider)  Provider   = ""

        DrvCert.RegCloseKey( hKey )
        hKey = null
    }

    var OSPlatform = GetInfoByTagFromXml( GetOSInfo() , "OSPlatform" )

    // 2007-2-9 <<<.................................................................................
    var CurUserLangPrimaryID = GetInfoByTagFromXml( GetOSInfo() , "OSCurUserLangPrimaryID" )
    var OSCurUserLangSubID   = GetInfoByTagFromXml( GetOSInfo() , "OSCurUserLangSubID" )
    if ( CurUserLangPrimaryID == 4 && OSCurUserLangSubID == 2 )
    {
        Language = "CN"
    }
    else
    {
        Language = "EN"
    }
    // 2007-2-9 .................................................................................>>>

    var RetInfo = ""
    // 2005-8-2
    RetInfo += "<ClientInfo>\n"
             + "  <Version>"      + XmlEncoding( ClientVersion )  + "</Version>\n"
             + "  <Vendor>"       + XmlEncoding( OEMVendor )      + "</Vendor>\n"
             + "  <Provider>"     + XmlEncoding( Provider )       + "</Provider>\n"
             + "  <Language>"     + XmlEncoding( Language )       + "</Language>\n"
             + "  <AccessMode>"   + XmlEncoding( AccessMode )     + "</AccessMode>\n"
             // 2005-8-7
             + "  <OSPlatform>"   + XmlEncoding( OSPlatform )     + "</OSPlatform>\n"
			 + "  <ClientType>Web</ClientType>\n"
             + "</ClientInfo>\n"
   return ( RetInfo )
}
// 2005-8-2
function RegUserDeviceInfoList( UserID )
{
    //g_DeviceInfo                        = new Array         // 当前用户机器中所有设备信息
    //g_DeviceRows                        = 0                 // 当前用户机器中所有设备数

    var stock = new Array()

    // 发送并保存正常状态的设备信息到服务器
	for (var i=0; i<g_DeviceRows ; i++)
	{

		ReadArrayToDeviceInfo( stock , g_DeviceInfo , i);

        PercentImg.width=PercentTbl.width*(i+1)/( g_DeviceRows )
        PercentString.innerHTML = '<center>' + Math.floor((i+1)/( g_DeviceRows )*100) + '%</center>'

        RunDriverExportToServerOpenProcess( stock );	

        ProcessingInfo.innerHTML = ''
        // document.recalc()
        // recalc()只更新对象属性的值，并不负责刷新用户界面
        //
        // PercentImg.refresh()
        // refresh()是TABLE对象的方法，在这里执行后程序停止
        //
        // PercentTbl.refresh()
        // PercentTbl虽然是TABLE对象，但在这里并不负责刷新用户界面
        // 
        // window.external.raiseEvent("event_onbgcolorchange",window.document);
        //
        DrvCert.UIRefresh()

        var RetInfo = RegUserDeviceInfo( UserID , stock )
        if ( RetInfo["Success"] )
        {
        }
        else
        {
        }

        // 设备处理完毕，关闭故障设备
        RunDriverExportToServerCloseProcess( stock )
	}
}
function RegUserDeviceInfo( UserID , DeviceInfo )
{
	//DeviceInfo[1]  DeviceIndex        
	//DeviceInfo[2]  DeviceClassID          "Net"
	//DeviceInfo[3]  DeviceClassType
	//DeviceInfo[4]  DeviceStatus
	//DeviceInfo[5]  DeviceProblem
	//DeviceInfo[6]  DeviceName
	//DeviceInfo[7]  BackupDriverStatus     0xc0000
	//DeviceInfo[8]  HardwareID
	//DeviceInfo[9]  CompatibleID           "pci\ven_1106&dev_3065&subsys_14011186..."
	//DeviceInfo[10] MatchingDeviceID
	//DeviceInfo[11] DriverDate
	//DeviceInfo[12] DriverVer
	//DeviceInfo[13] DriverProvider         "D-Link"


	var SoapApplyURL = ServerName.value + SoapAspURL.value		//   personal.e-drivers.cn/soap/SoapApply.asp

	var SoapRequestXML = ""
    // 2006-10-26
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:RegUserDeviceInfo xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    // 2005-8-2
    // [注意] "<UserID>xx</UserID>"必须放在SOAP-ENV:Body最后位置，否则，后台Soap服务程序会认为<UserID>后面没有数据
    //        这跟服务程序读取Soap数据的处理方式有关：它只能处理有严格三层Xml深度结构的数据内容；
    //        由于<UserID></UserID>只有一层深度，它以及它以后的数据都将被忽略
    // 2007-2-28
    // SoapRequestXML += GetDeviceInfoToXml( DeviceInfo )
    SoapRequestXML += GetDeviceRowInfoToXml( DeviceInfo )
    //
    SoapRequestXML += "         <UserID>" + UserID + "</UserID>\n"
	SoapRequestXML += "     </n:RegUserDeviceInfo>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

	// 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )

	if (ReturnXML == null || ReturnXML == "")
	{
        DisplayMessage( "登记设备[" + DeviceInfo[6] + "]请求没有反应\n请求内容是:\n" + SoapRequestXML )
        RetInfo["Success"       ] = false
        RetInfo["ErrorInfo"     ] = "登记设备[" + DeviceInfo[6] + "]请求没有反应"
		return ( RetInfo )
	}

    var RetInfo = new Array()

    var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if ( ErrorInfo ) 
	{
        DisplayMessage( "登记设备[" + DeviceInfo[6] + "]请求返回错误:\n" + ErrorInfo )
        RetInfo["Success"       ] = false
        RetInfo["ErrorInfo"     ] = ErrorInfo
		return ( RetInfo )
	}
	else
	{
        DisplayMessage( "登记设备[" + DeviceInfo[6] + "]请求成功" )
        var ResultString = GetInfoByTagFromXml( ReturnXML, "Result" )
        RetInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
        RetInfo["ErrorInfo"     ] = ""
		return ( RetInfo )
	}

}
// 2007-2-28
// function GetDeviceInfoToXml( DeviceInfo )
function GetDeviceRowInfoToXml( DeviceInfo )
{
	var Xml = "<DeviceList>"
	{
		DeviceName = DeviceInfo[6]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		DeviceName = DeviceName.replace(/(\&)/gi ,"&amp;");
		DeviceName = DeviceName.replace(/(\<)/gi ,"&lt;");
		DeviceName = DeviceName.replace(/(\>)/gi ,"&gt;");

		HardwareID = DeviceInfo[8]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		HardwareID = HardwareID.replace(/(\&)/gi ,"&amp;");
		HardwareID = HardwareID.replace(/(\<)/gi ,"&lt;");
		HardwareID = HardwareID.replace(/(\>)/gi ,"&gt;");

		CompatibleID = DeviceInfo[9]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		CompatibleID = CompatibleID.replace(/(\&)/gi ,"&amp;");
		CompatibleID = CompatibleID.replace(/(\<)/gi ,"&lt;");
		CompatibleID = CompatibleID.replace(/(\>)/gi ,"&gt;");

		MatchingDeviceId = DeviceInfo[10]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		MatchingDeviceId = MatchingDeviceId.replace(/(\&)/gi ,"&amp;");
		MatchingDeviceId = MatchingDeviceId.replace(/(\<)/gi ,"&lt;");
		MatchingDeviceId = MatchingDeviceId.replace(/(\>)/gi ,"&gt;");
		
		DriverDate = DeviceInfo[11]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		DriverDate = DriverDate.replace(/(\&)/gi ,"&amp;");
		DriverDate = DriverDate.replace(/(\<)/gi ,"&lt;");
		DriverDate = DriverDate.replace(/(\>)/gi ,"&gt;");

		DriverVer = DeviceInfo[12]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		DriverVer = DriverVer.replace(/(\&)/gi ,"&amp;");
		DriverVer = DriverVer.replace(/(\<)/gi ,"&lt;");
		DriverVer = DriverVer.replace(/(\>)/gi ,"&gt;");

		DriverProvider = DeviceInfo[13]
		// 替换“&”字符为“&amp;”；替换“<”为“&lt;”；替换“>”为“&gt;”
		// 以下就不用了：替换“'”为“&apos;”；替换“"”为“&quot;”；替换“#”为“&#35”
		DriverProvider = DriverProvider.replace(/(\&)/gi ,"&amp;");
		DriverProvider = DriverProvider.replace(/(\<)/gi ,"&lt;");
		DriverProvider = DriverProvider.replace(/(\>)/gi ,"&gt;");

		Xml += "\t<DeviceItem>\n"
		Xml += "\t\t<DeviceName>"			+ DeviceName		+ "</DeviceName>\n"
		Xml += "\t\t<DeviceIndex>"			+ DeviceInfo[1]	+ "</DeviceIndex>\n"
		Xml += "\t\t<DeviceClassID>"		+ DeviceInfo[2]	+ "</DeviceClassID>\n"
		Xml += "\t\t<DeviceClassType>"		+ DeviceInfo[3]	+ "</DeviceClassType>\n"
		Xml += "\t\t<DeviceStatus>"			+ DeviceInfo[4]	+ "</DeviceStatus>\n"
		Xml += "\t\t<DeviceProblem>"		+ DeviceInfo[5]	+ "</DeviceProblem>\n"
		Xml += "\t\t<HardwareID>"			+ HardwareID		+ "</HardwareID>\n"
		Xml += "\t\t<CompatibleID>"			+ CompatibleID		+ "</CompatibleID>\n"
		Xml += "\t\t<MatchingDeviceId>"		+ MatchingDeviceId	+ "</MatchingDeviceId>\n"
		Xml += "\t\t<DriverBackupStatus>"	+ DeviceInfo[7]	+ "</DriverBackupStatus>\n"
		Xml += "\t\t<DeviceRow>"			+ DeviceInfo[0]	+ "</DeviceRow>\n"
		Xml += "\t\t<DriverDate>"			+ DriverDate		+ "</DriverDate>\n"
		Xml += "\t\t<DriverVer>"			+ DriverVer			+ "</DriverVer>\n"
		Xml += "\t\t<DriverProvider>"		+ DriverProvider	+ "</DriverProvider>\n"
		Xml += "\t</DeviceItem>\n"
	}
	Xml += "</DeviceList>"
return (Xml)
}
// 2006-8-26 <<<...........................................................................................
// 
// 下面的代码有时会造成程序死锁
//
//// 2006-1-6
//function EraseDeviceDriver( DeviceInfo )
//{
////	DeviceInfo[0]  = DeviceRow
////	DeviceInfo[1]  = DeviceIndex;
////	DeviceInfo[2]  = DeviceClassID;
////	DeviceInfo[3]  = DeviceClassType;
////	DeviceInfo[4]  = DeviceStatus;
////	DeviceInfo[5]  = DeviceProblem;
////	DeviceInfo[6]  = DeviceName;
////	DeviceInfo[7]  = BackupDriverStatus;
////	DeviceInfo[8]  = HardwareID;
////	DeviceInfo[9]  = CompatibleID;
////	DeviceInfo[10] = MatchingDeviceID;
////	DeviceInfo[11] = DriverDate;
////	DeviceInfo[12] = DriverVer;
////	DeviceInfo[13] = DriverProvider;
//
//    var RetInfo = new Array()
//    RetInfo["Success"] = false
//    RetInfo["Info"   ] = ""
//
//    var SysPath    = DrvCert.GetFolderPath( 36 )	// 36 0x24 - CSIDL_WINDOWS  
//    var SysInfPath = SysPath + "\\inf"
//
//    var SysDrvInfFilesInfo = DrvCert.FindFileInPath( SysInfPath + "\\oem*.inf" )
//    var i=0
//    var SysDrvInfFile   = GetXmlSingleNodeText( SysDrvInfFilesInfo , "FileItem" + i )
//    while ( SysDrvInfFile )
//    {
//        var IfInfEraseFlag = false
//        var InfFilename = SysInfPath + "\\" + SysDrvInfFile
//        var InfHandle = DrvInf.OpenINFFile( InfFilename )
//        if ( InfHandle == 0xFFFFFFFF ) continue
//        var InfContext = DrvInf.FindFirstLineInSection( InfHandle , "Manufacturer" , "" )
//        var k=0
//        //[Manufacturer]
//        //%Adico% = Adico
//        do
//        {
//            var MfgSectionName     = DrvInf.GetFieldValueInLine( InfContext ,  1 )
//            var DeviveContext = DrvInf.FindFirstLineInSection( InfHandle , MfgSectionName , "" )
//            var j=0
//            //[Adico]
//            //; DisplayName           Section       DeviceID
//            //; -----------           -------       --------
//            //%AE310.DeviceDesc%     = ae310.ndi,   PCI\VEN_1113&DEV_1217
//            do
//            {
//                var DeviceID     = DrvInf.GetFieldValueInLine( DeviveContext ,  2 )
//                var tmpA = ";" + DeviceID + ";"
//                var tmpB = ";" + DeviceInfo[8] + ";" 
//                // 不要用正则表达式，因为字符串中会包含"\"特殊字符
//                //
//                //var re = new RegExp( tmpA ,"gi");  
//                //if ( tmpB.search( re ) != -1 )
//                if ( tmpB.toUpperCase().indexOf( tmpA.toUpperCase() ) != -1 )
//                {
//                    IfInfEraseFlag = true
//                    break
//                }
//                DeviveContext = DrvInf.FindNextLineInSection( DeviveContext )
//                j++
//            }
//            while ( DeviveContext );
//            // 如果确定该INF文件是要删除的文件，就退出循环不再查找其他的Mfg / DeviceID
//            if ( IfInfEraseFlag ) break
//            InfContext = DrvInf.FindNextLineInSection( InfContext )
//            k++
//        }
//        while( InfContext )
//        DrvInf.CloseINFFile( InfHandle )
//        // 如果找到了问题设备的故障驱动INF / PNF文件，就删除它们
//        if ( IfInfEraseFlag ) 
//        {
//            var DelInfResult = DrvCert.DeleteFile( InfFilename )
//            var PnfFilename  = InfFilename.replace( /\.inf$/gi , ".pnf" )
//            var DelPnfResult = DrvCert.DeleteFile( PnfFilename )
//            RetInfo["Success"] = true
//
//            if ( DelInfResult )
//            {
//                RetInfo["Info"   ] += "成功删除" + InfFilename + ";"
//            }
//            else
//            {
//                RetInfo["Info"   ] += "删除" + InfFilename + "失败;"
//            }
//
//            if ( PnfFilename )
//            {
//                RetInfo["Info"   ] += "成功删除" + PnfFilename + ";"
//            }
//            else
//            {
//                RetInfo["Info"   ] += "删除" + PnfFilename + "失败;"
//            }
//        }
//
//        i ++
//        SysDrvInfFile   = GetXmlSingleNodeText( SysDrvInfFilesInfo , "FileItem" + i )
//    }
//return ( RetInfo )
//}

// 2006-3-31
function GetRecentDocTime()
{
    var RecentDocPath = DrvCert.GetFolderPath( 8 )
    var DocInfoXml = DrvCert.FindFileInPath( RecentDocPath + "\\*.*" )
    var CurFileNum = 0
    var CurTime    = 0
    var LastFileTime = ""
    do
    {
    	var FileName = GetXmlSingleNodeText( DocInfoXml , "FileItem" + CurFileNum )
        if ( FileName )
        {
            var FileTime = DrvCert.GetFileDate( RecentDocPath + "\\" + FileName )
            var TimeTemp = Date.parse( CNDateToUSDate( FileTime ) )
            if ( TimeTemp > CurTime ) 
            {
                CurTime = TimeTemp
                LastFileTime = FileTime
            }
            CurFileNum ++
        }
    }
    while ( FileName )
return ( CurTime )
}
function CNDateToUSDate( CNDate )
{
    var USDate = CNDate
    USDate = USDate.replace( /^([0-9]+)[-\/]{1}([0-9]+)[-\/]{1}([0-9]+)(.*)$/i , "$2-$3-$1$4")
    return (USDate)
}
// 2006-7-8 ............................................................................................
function CreateMessageObject()
{
    // 2006-10-3
    if ( !g_CreateMessageObjFlag )
    {
	    var oDiv=window.document.createElement("<DIV ID='MsgTableTag'></DIV>");
	    window.document.body.appendChild(oDiv);
        // 2006-10-3
        g_CreateMessageObjFlag = true
    }

	var PromptTableHTML = "";
	PromptTableHTML += '<!-- A DHTML alert box -->'
	PromptTableHTML += '<Table bgcolor="#DDDDC8" border=0 cellspacing=0 cellpadding=0 ID="MsgTable" style="display:none; position:absolute;">'
	PromptTableHTML += '<!--上边黑边线-->'
	PromptTableHTML += '<TR>'
	PromptTableHTML += '	<TD BgColor=#000040 height=0 colspan=3></TD>'
	PromptTableHTML += '</TR>'
	PromptTableHTML += '<!--提示窗口标题-->'
	PromptTableHTML += '<TR>'
	PromptTableHTML += '	<!--左边黑边线-->'
	PromptTableHTML += '	<TD BgColor=#000040 width=1></TD>'
	PromptTableHTML += '	<!--中间提示信息框-->'
	PromptTableHTML += '	<TD bgcolor="#000000" valign="bottom">'
	PromptTableHTML += '      <p align="right"><input type="button" value="><" style="letter-spacing: -2; font-size: 6pt; color: black" onclick="HideMessageInfo()" onMouseMove="this.style.color=\'red\';this.style.cursor=\'hand\';" onMouseOut="this.style.color=\'black\';this.style.fontStyle=\'normal\';" ></p>'
	PromptTableHTML += '    </TD>'
	PromptTableHTML += '	<!--右边黑边线-->'
	PromptTableHTML += '	<TD BgColor=#000040 width=1></TD>'
	PromptTableHTML += '</TR>'
	PromptTableHTML += '<!--提示窗口标题下黑线-->'
	PromptTableHTML += '<TR>'
	PromptTableHTML += '	<TD BgColor=#000040 height=0 colspan=3></TD>'
	PromptTableHTML += '</TR>'
	PromptTableHTML += '<TR>'
	PromptTableHTML += '	<!--左边黑边线-->'
	PromptTableHTML += '	<TD BgColor=#000040 width=1></TD>'
	PromptTableHTML += '	<!--中间提示信息框-->'
	PromptTableHTML += '	<TD><br>'
	PromptTableHTML += '		<CENTER>'
	PromptTableHTML += '			<table width=100% height=100%><tr><td width=8></td><td><Span ID="MsgTag"></Span></td><td width=8></td></tr></table>'
	PromptTableHTML += '		</CENTER>'
	PromptTableHTML += '	  <br>'
	PromptTableHTML += '	</TD>'
	PromptTableHTML += '	<!--右边黑边线-->'
	PromptTableHTML += '	<TD BgColor=#000040 width=1></TD>'
	PromptTableHTML += '</TR> '
	PromptTableHTML += '<!--下边黑边线-->'
	PromptTableHTML += '<TR>'
	PromptTableHTML += '	<TD BgColor=#000040 height=0 colspan=3></TD>'
	PromptTableHTML += '</TR>'
	PromptTableHTML += '</Table>'

	// 2006-10-3
    //oDiv.innerHTML = PromptTableHTML
    MsgTableTag.innerHTML = PromptTableHTML
}

function DispMessageInfo( sMessage )
{
	// 显示提示信息
	MsgTag.innerHTML = '' + sMessage + ''
	MsgTable.style.display='';
    // 2007-3-10
    //MsgTable.style.pixelTop  = (window.document.body.clientHeight - MsgTable.clientHeight ) / 2
	//MsgTable.style.pixelLeft = (window.document.body.clientWidth  - MsgTable.clientWidth  ) / 2
    MsgTable.style.pixelTop  = (window.document.body.clientHeight - MsgTable.clientHeight ) / 2 + (window.document.body.scrollTop ) 
	MsgTable.style.pixelLeft = (window.document.body.clientWidth  - MsgTable.clientWidth  ) / 2 + (window.document.body.scrollLeft)
}
function HideMessageInfo() 
{
	window.status="";
	MsgTable.style.display='none';
}

// 2006-7-9 ................................................................................................
function FindDriver( UserID , MainBoardInfoXml , DeviceInfo , OSInfoXml )
{
    //    <MainBoardInfo>
    //      <MainBoardItem>
    //          <BIOSManufacturer>Award Software International, Inc.</BIOSManufacturer>
    //          <BIOSVersion>6.00 PG</BIOSVersion>
    //          <BIOSDate>11/06/2001</BIOSDate>
    //          <ComputerManufacturer>     </ComputerManufacturer>
    //          <ComputerModel> </ComputerModel>
    //          <BaseBoardManufacturer>ABIT </BaseBoardManufacturer>
    //          <BaseBoardProduct>i845-W83627HF</BaseBoardProduct>
    //          <BaseBoardVersion>BD7  Rev:1.0</BaseBoardVersion>
    //          <BaseBoardSerialNumber>6A69VA1D</BaseBoardSerialNumber>
    //      </MainBoardItem>
    //    </MainBoardInfo>
    //
	//      DeviceInfo[1]  DeviceIndex        
	//      DeviceInfo[2]  DeviceClassID          "Net"
	//      DeviceInfo[3]  DeviceClassType
	//      DeviceInfo[4]  DeviceStatus
	//      DeviceInfo[5]  DeviceProblem
	//      DeviceInfo[6]  DeviceName
	//      DeviceInfo[7]  BackupDriverStatus     0xc0000
	//      DeviceInfo[8]  HardwareID
	//      DeviceInfo[9]  CompatibleID           "pci\ven_1106&dev_3065&subsys_14011186..."
	//      DeviceInfo[10] MatchingDeviceID
	//      DeviceInfo[11] DriverDate
	//      DeviceInfo[12] DriverVer
	//      DeviceInfo[13] DriverProvider         "D-Link"
    //
    //    <OSInfo>
    //        <OSItem>
    //            <OSMajorVer>5</OSMajorVer>
    //            <OSMinorVer>0</OSMinorVer>
    //            <OSBuildNumber>2195</OSBuildNumber>
    //            <OSServicePack>Service Pack 2</OSServicePack>
    //            <OSPlatform>Windows 2000 Server</OSPlatform>
    //            <OSDefaultLangPrimaryID>4</OSDefaultLangPrimaryID>
    //            <OSDefaultLangSubID>2</OSDefaultLangSubID>
    //            <OSCurUserLangPrimaryID>4</OSCurUserLangPrimaryID>
    //            <OSCurUserLangSubID>2</OSCurUserLangSubID>
    //        </OSItem>
    //    </OSInfo>

    var RequestInfo = new Array()

    RequestInfo["UserID"] = UserID

    RequestInfo[ 1] = DeviceInfo[ 1]  //DeviceIndex        
    RequestInfo[ 2] = DeviceInfo[ 2]  //DeviceClassID          "Net"
    RequestInfo[ 3] = DeviceInfo[ 3]  //DeviceClassType
    RequestInfo[ 4] = DeviceInfo[ 4]  //DeviceStatus
    RequestInfo[ 5] = DeviceInfo[ 5]  //DeviceProblem
    RequestInfo[ 6] = DeviceInfo[ 6]  //DeviceName
    RequestInfo[ 7] = DeviceInfo[ 7]  //BackupDriverStatus     0xc0000
    RequestInfo[ 8] = DeviceInfo[ 8]  //HardwareID
    RequestInfo[ 9] = DeviceInfo[ 9]  //CompatibleID           "pci\ven_1106&dev_3065&subsys_14011186..."
    RequestInfo[10] = DeviceInfo[10]  //MatchingDeviceID
    RequestInfo[11] = DeviceInfo[11]  //DriverDate
    RequestInfo[12] = DeviceInfo[12]  //DriverVer
    RequestInfo[13] = DeviceInfo[13]  //DriverProvider         "D-Link"
    // 2007-2-9
    RequestInfo[14] = DeviceInfo[14]  //DriverInfFilename      "oem3.inf"

    //          <ComputerManufacturer>     </ComputerManufacturer>
    //          <ComputerModel> </ComputerModel>
    //          <BaseBoardManufacturer>ABIT </BaseBoardManufacturer>
    //          <BaseBoardProduct>i845-W83627HF</BaseBoardProduct>
    //          <BaseBoardVersion>BD7  Rev:1.0</BaseBoardVersion>
    var ComputerMfg             = GetXmlSingleNodeText( MainBoardInfoXml , "ComputerManufacturer" )
    var ComputerModel           = GetXmlSingleNodeText( MainBoardInfoXml , "ComputerModel" )
    var BaseBoardMfg            = GetXmlSingleNodeText( MainBoardInfoXml , "BaseBoardManufacturer" )
    var BaseBoardProduct        = GetXmlSingleNodeText( MainBoardInfoXml , "BaseBoardProduct" )
    var BaseBoardVersion        = GetXmlSingleNodeText( MainBoardInfoXml , "BaseBoardVersion" )

    RequestInfo["ComputerMfg"       ] = ( ComputerMfg       == null ) ? "undefined" : ComputerMfg
    RequestInfo["ComputerModel"     ] = ( ComputerModel     == null ) ? "undefined" : ComputerModel
    RequestInfo["BaseBoardMfg"      ] = ( BaseBoardMfg      == null ) ? "undefined" : BaseBoardMfg
    RequestInfo["BaseBoardProduct"  ] = ( BaseBoardProduct  == null ) ? "undefined" : BaseBoardProduct
    RequestInfo["BaseBoardVersion"  ] = ( BaseBoardVersion  == null ) ? "undefined" : BaseBoardVersion

    //            <OSMajorVer>5</OSMajorVer>
    //            <OSMinorVer>0</OSMinorVer>
    //            <OSPlatform>Windows 2000 Server</OSPlatform>
    RequestInfo["OSMajorVer"       ] = GetXmlSingleNodeText( OSInfoXml , "OSMajorVer" )
    RequestInfo["OSMinorVer"       ] = GetXmlSingleNodeText( OSInfoXml , "OSMinorVer" )
    RequestInfo["OSPlatform"       ] = GetXmlSingleNodeText( OSInfoXml , "OSPlatform" )

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    // 查找驱动时应按以下原则进行：
    //
    // 1、先匹配相同主机环境驱动，后匹配通用主机环境驱动（即先匹配私版驱动再匹配公版驱动）
    // 2、先匹配DeviceID为HardwareIDs，后匹配CompatibleIDs
    // 3、先匹配特定OS平台驱动，后匹配通用OS平台驱动
    //   （比如先匹配WIN2KPro，失败后再匹配WIN2K下所有平台WIN2KPro、WIN2KServer、WIN2KAdvServer）
    //
    // 实现时的算法是：
    // 1、先完全匹配主机环境、HardwareIDs、特定OS平台
    // 2、未果后逐步放开约束条件：
    //        1、先放开OS系统
    //        2、再放开主机环境
    //        3、最后放开设备标识DeviceID到CompatibleIDs
    //
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    // 由于将“是否用服务器中的驱动修复驱动故障”开关改为“驱动类型”（通用、专用、私用），
    // 因此，查找驱动规则做如下修改：
    //
    // 1、通用驱动：
    //
    //      1、先开放主机环境约束、然后完全匹配HardwareIDs、特定OS平台
    //      2、未果后逐步放开约束条件：
    //            1、先开放OS系统
    //            2、再开放设备标识到CompatibleIDs
    //
    // 2、专用驱动：
    //
    //      1、先完全匹配主机环境、HardwareIDs、特定OS平台
    //      2、未果后逐步放开约束条件：
    //            1、先开放OS系统
    //            2、再开放设备标识到CompatibleIDs
    //
    // 3、私用驱动：
    //
    //      由于私用驱动查询已经包含在每次的“通用驱动/专用驱动”查询中，因此，不用做特殊处理
    //

    // 如果是通用或私用驱动类型，就放开主机环境约束
    var DriverType = GetCookie( "DriverType" )
    if ( DriverType == "Public" || DriverType == "Private" )
    {
        //        放开主机环境
        RequestInfo["ComputerMfg"       ] = ""
        RequestInfo["ComputerModel"     ] = ""
        RequestInfo["BaseBoardMfg"      ] = ""
        RequestInfo["BaseBoardProduct"  ] = ""
        RequestInfo["BaseBoardVersion"  ] = ""
    }

    DisplayMessage( "正在进行设备[" + DeviceInfo[6] + "]的第一次驱动查询..." )
    // 2006-9-20
    //
    // 对驱动查询进行了逻辑上的改动，主要为某些厂商查询优化而做
    // 优化内容：
    //   将原来三次查询改为两次查询
    //
    // 取消MatchingDeviceID
    //
    // 1、先完全匹配主机环境、HardwareIDs、特定OS平台
    //
    //RequestInfo["DeviceIDs"] = ( DeviceInfo[10] ) 
    //                                    ? DeviceInfo[10] + ";" + DeviceInfo[8]  // MatchingDeviceID + HardwareIDs
    //                                    : DeviceInfo[8]                         // HardwareIDs
    RequestInfo["OSPlatform"] = ""
    RequestInfo["DeviceIDs"] = DeviceInfo[8]                                      // HardwareIDs

    var RetInfo = SubmitSoapRequestFindDriver( RequestInfo )
    //    RetInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
    //    RetInfo["ErrorInfo"     ] = ""
    //    RetInfo["UserID"        ] = ResultUserID
    //    RetInfo["DriverID"      ] = ResultDriverID
    //    RetInfo["DriverDate"    ] = ResultDriverDate
    //    RetInfo["DriverMfg"     ] = ResultDriverMfg
    //    RetInfo["DriverDesc"    ] = ResultDriverDesc
    //    RetInfo["NewUserID"     ] = ResultNewUserID
    //    RetInfo["NewDriverID"   ] = ResultNewDriverID
    //    RetInfo["NewDriverDate" ] = ResultNewDriverDate
    //    RetInfo["NewDriverMfg"  ] = ResultNewDriverMfg
    //    RetInfo["NewDriverDesc" ] = ResultNewDriverDesc
    // 
    // 2006-7-19 <<<....................................................................
    // if ( RetInfo["NewUserID"] && RetInfo["NewDriverID"] ) return ( RetInfo )
    if ( RetInfo["Success"] ) return ( RetInfo )
    // 2006-7-19 ....................................................................>>>

    DisplayMessage( "正在进行设备[" + DeviceInfo[6] + "]的第二次驱动查询..." )
    // 2、未果后逐步放开约束条件：
    //        1、先放开OS系统
    // 
    // 2006-9-20
    //RequestInfo["OSPlatform"] = ""
    //RetInfo = SubmitSoapRequestFindDriver( RequestInfo )

    // 2006-7-19 <<<....................................................................
    // if ( RetInfo["NewUserID"] && RetInfo["NewDriverID"] ) return ( RetInfo )
    // 2006-9-20
    //if ( RetInfo["Success"] ) return ( RetInfo )
    // 2006-7-19 ....................................................................>>>

    // 2006-9-20
    //DisplayMessage( "正在进行设备[" + DeviceInfo[6] + "]的第三次驱动查询..." )

    // 2、未果后逐步放开约束条件：
    //        3、最后放开设备标识DeviceID到CompatibleIDs
    RequestInfo["DeviceIDs"] = DeviceInfo[9]                // CompatibelIDs
    RetInfo = SubmitSoapRequestFindDriver( RequestInfo )
    // 2006-7-19 <<<....................................................................
    // if ( RetInfo["NewUserID"] && RetInfo["NewDriverID"] ) return ( RetInfo )
    if ( RetInfo["Success"] ) return ( RetInfo )
    // 2006-7-19 ....................................................................>>>

    return ( RetInfo )
}
function SubmitSoapRequestFindDriver( RequestInfo )
{
//    RequestInfo["UserID"            ]
//
//    RequestInfo[ 1] = DeviceInfo[ 1]  //DeviceIndex        
//    RequestInfo[ 2] = DeviceInfo[ 2]  //DeviceClassID          "Net"
//    RequestInfo[ 3] = DeviceInfo[ 3]  //DeviceClassType
//    RequestInfo[ 4] = DeviceInfo[ 4]  //DeviceStatus
//    RequestInfo[ 5] = DeviceInfo[ 5]  //DeviceProblem
//    RequestInfo[ 6] = DeviceInfo[ 6]  //DeviceName
//    RequestInfo[ 7] = DeviceInfo[ 7]  //BackupDriverStatus     0xc0000
//    RequestInfo[ 8] = DeviceInfo[ 8]  //HardwareID
//    RequestInfo[ 9] = DeviceInfo[ 9]  //CompatibleID           "pci\ven_1106&dev_3065&subsys_14011186..."
//    RequestInfo[10] = DeviceInfo[10]  //MatchingDeviceID
//    RequestInfo[11] = DeviceInfo[11]  //DriverDate
//    RequestInfo[12] = DeviceInfo[12]  //DriverVer
//    RequestInfo[13] = DeviceInfo[13]  //DriverProvider         "D-Link"
//
//    RequestInfo["DeviceIDs"         ]
//
//
//    //          <ComputerManufacturer>     </ComputerManufacturer>
//    //          <ComputerModel> </ComputerModel>
//    //          <BaseBoardManufacturer>ABIT </BaseBoardManufacturer>
//    //          <BaseBoardProduct>i845-W83627HF</BaseBoardProduct>
//    //          <BaseBoardVersion>BD7  Rev:1.0</BaseBoardVersion>
//    //
//    RequestInfo["ComputerMfg"       ] = ( ComputerMfg       == null ) ? "undefined" : ComputerMfg
//    RequestInfo["ComputerModel"     ] = ( ComputerModel     == null ) ? "undefined" : ComputerModel
//    RequestInfo["BaseBoardMfg"      ] = ( BaseBoardMfg      == null ) ? "undefined" : BaseBoardMfg
//    RequestInfo["BaseBoardProduct"  ] = ( BaseBoardProduct  == null ) ? "undefined" : BaseBoardProduct
//    RequestInfo["BaseBoardVersion"  ] = ( BaseBoardVersion  == null ) ? "undefined" : BaseBoardVersion
//
//    //            <OSMajorVer>5</OSMajorVer>
//    //            <OSMinorVer>0</OSMinorVer>
//    //            <OSPlatform>Windows 2000 Server</OSPlatform>
//    //
//    RequestInfo["OSMajorVer"       ]
//    RequestInfo["OSMinorVer"       ]
//    RequestInfo["OSPlatform"       ]

    var RetInfo     = new Array()

    var SoapApplyURL = ServerName.value + SoapAspURL.value

	var SoapRequestXML = ""
    // 2006-10-26
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:FindDriver xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    SoapRequestXML += "         <UserID>"               +              RequestInfo["UserID"          ]      + "</UserID>\n"
    SoapRequestXML += "         <HardwareIDCompaIDs>"   + XmlEncoding( RequestInfo["DeviceIDs"       ]  )   + "</HardwareIDCompaIDs>\n"
    SoapRequestXML += "         <ComputerMfg>"          + XmlEncoding( RequestInfo["ComputerMfg"     ]  )   + "</ComputerMfg>\n"
    SoapRequestXML += "         <ComputerModel>"        + XmlEncoding( RequestInfo["ComputerModel"   ]  )   + "</ComputerModel>\n"
    SoapRequestXML += "         <BaseBoardMfg>"         + XmlEncoding( RequestInfo["BaseBoardMfg"    ]  )   + "</BaseBoardMfg>\n"
    SoapRequestXML += "         <BaseBoardProduct>"     + XmlEncoding( RequestInfo["BaseBoardProduct"]  )   + "</BaseBoardProduct>\n"
    SoapRequestXML += "         <BaseBoardVersion>"     + XmlEncoding( RequestInfo["BaseBoardVersion"]  )   + "</BaseBoardVersion>\n"
    SoapRequestXML += "         <OSMajorVer>"           +              RequestInfo["OSMajorVer"      ]      + "</OSMajorVer>\n"
    SoapRequestXML += "         <OSMinorVer>"           +              RequestInfo["OSMinorVer"      ]      + "</OSMinorVer>\n"
    SoapRequestXML += "         <OSPlatform>"           + XmlEncoding( RequestInfo["OSPlatform"      ]  )   + "</OSPlatform>\n"
	SoapRequestXML += "     </n:FindDriver>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

	// 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )

	if ( ReturnXML == null || ReturnXML == "" )
	{
        //DisplayMessage( "查询设备[" + DeviceInfo[6] + "]驱动请求没有反应\n请求内容是:\n" + SoapRequestXML )
        RetInfo["Success"       ] = false
        RetInfo["ErrorInfo"     ] = "查询设备[" + RequestInfo[6] + "]驱动请求没有反应"      // 2006-9-21 old is : Device[6] , and then will error
		return ( RetInfo )
	}

    var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if ( ErrorInfo ) 
	{
        //DisplayMessage( "查询设备[" + DeviceInfo[6] + "]驱动请求返回错误:\n" + ErrorInfo )
        RetInfo["Success"       ] = false
        RetInfo["ErrorInfo"     ] = "查询设备[" + RequestInfo[6] + "]驱动请求返回错误:" + ErrorInfo // 2006-9-21 old is : Device[6] , and then will error
        RetInfo["UserID"        ] = 0
        RetInfo["DriverID"      ] = 0
        RetInfo["DriverDate"    ] = ""
        RetInfo["DriverMfg"     ] = ""
        RetInfo["NewUserID"     ] = 0
        RetInfo["NewDriverID"   ] = 0
        RetInfo["NewDriverDate" ] = ""
        RetInfo["NewDriverMfg"  ] = ""
	}
	else
	{
        //DisplayMessage( "查询设备[" + DeviceInfo[6] + "]驱动请求提交成功" )
        var ResultString         = GetInfoByTagFromXml( ReturnXML, "Result" )
        var ResultUserID         = GetInfoByTagFromXml( ReturnXML, "UserID" )
        var ResultDriverID       = GetInfoByTagFromXml( ReturnXML, "DriverID" )
        var ResultDriverDate     = GetInfoByTagFromXml( ReturnXML, "DriverDate" )
        var ResultDriverMfg      = GetInfoByTagFromXml( ReturnXML, "DriverMfg" )
        var ResultNewUserID      = GetInfoByTagFromXml( ReturnXML, "NewUserID" )
        var ResultNewDriverID    = GetInfoByTagFromXml( ReturnXML, "NewDriverID" )
        var ResultNewDriverDate  = GetInfoByTagFromXml( ReturnXML, "NewDriverDate" )
        var ResultNewDriverMfg   = GetInfoByTagFromXml( ReturnXML, "NewDriverMfg" )

        // 2006-7-8 .............................................................................
        var ResultDriverDesc     = GetInfoByTagFromXml( ReturnXML, "DriverDesc" )
        var ResultNewDriverDesc  = GetInfoByTagFromXml( ReturnXML, "NewDriverDesc" )

        var CurPath = DrvCert.GetFolderPath( 32 )
        // 从"F:\Documents and Settings\Administrator.SERVER.004\Local Settings\Temporary Internet Files"转到
        // "F:\Documents and Settings\Administrator.SERVER.004\Local Settings\Temp"
        CurPath     = CurPath.substring( 0 , CurPath.lastIndexOf( "\\" ) )    // not include last "\\"
        CurPath     = CurPath + "\\Temp"
        var TmpFileName = CurPath + "\\DrvImp.TMP"
        DrvCert.DeleteFile( TmpFileName )
        // 将驱动简介字符串内容从BASE64编码还原
        if ( ResultDriverDesc )
        {
            DrvCert.SaveBASE64ToBinFile( ResultDriverDesc , TmpFileName )
            ResultDriverDesc = DrvCert.GetStringFromFile( TmpFileName )
            DrvCert.DeleteFile( TmpFileName )
        }
        if ( ResultNewDriverDesc )
        {
            DrvCert.SaveBASE64ToBinFile( ResultNewDriverDesc , TmpFileName )
            ResultNewDriverDesc = DrvCert.GetStringFromFile( TmpFileName )
            DrvCert.DeleteFile( TmpFileName )
        }
        // 2006-7-8 .............................................................................

        RetInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
        RetInfo["ErrorInfo"     ] = ""
        RetInfo["UserID"        ] = ResultUserID
        RetInfo["DriverID"      ] = ResultDriverID
        RetInfo["DriverDate"    ] = ResultDriverDate
        RetInfo["DriverMfg"     ] = ResultDriverMfg
        // 2006-7-8
        RetInfo["DriverDesc"    ] = ResultDriverDesc

        RetInfo["NewUserID"     ] = ResultNewUserID
        RetInfo["NewDriverID"   ] = ResultNewDriverID
        RetInfo["NewDriverDate" ] = ResultNewDriverDate
        RetInfo["NewDriverMfg"  ] = ResultNewDriverMfg
        // 2006-7-8
        RetInfo["NewDriverDesc" ] = ResultNewDriverDesc
    }
return ( RetInfo )
}
// 2006-8-26 <<<..................................................................................................
function EraseDeviceDriver( DeviceInfo )
{
//	DeviceInfo[0]  = DeviceRow
//	DeviceInfo[1]  = DeviceIndex;
//	DeviceInfo[2]  = DeviceClassID;
//	DeviceInfo[3]  = DeviceClassType;
//	DeviceInfo[4]  = DeviceStatus;
//	DeviceInfo[5]  = DeviceProblem;
//	DeviceInfo[6]  = DeviceName;
//	DeviceInfo[7]  = BackupDriverStatus;
//	DeviceInfo[8]  = HardwareID;
//	DeviceInfo[9]  = CompatibleID;
//	DeviceInfo[10] = MatchingDeviceID;
//	DeviceInfo[11] = DriverDate;
//	DeviceInfo[12] = DriverVer;
//	DeviceInfo[13] = DriverProvider;


    var RetInfo = new Array()
    RetInfo["Success"] = false
    RetInfo["Info"   ] = ""


    var SysPath    = DrvCert.GetFolderPath( 36 )	// 36 0x24 - CSIDL_WINDOWS  
    var SysInfPath = SysPath + "\\inf"

	var SysDrvInfFilesInfo = DrvCert.FindFileInPath( SysInfPath + "\\oem*.inf" )
    var i=0
    var SysDrvInfFile   = GetXmlSingleNodeText( SysDrvInfFilesInfo , "FileItem" + i )
    // 2006-10-28
    DisplayMessage( "删除设备[" + DeviceInfo[6] + "]的问题驱动时找到inf文件:" + SysDrvInfFile )

    while ( SysDrvInfFile )
    {
        var IfInfEraseFlag = false
        var InfFilename = SysInfPath + "\\" + SysDrvInfFile
        var InfHandle = DrvInf.OpenINFFile( InfFilename )
        // 2006-9-8 <<<.................................................
        //
        // 下面的代码会导致%Windows%\inf目录中如果存在长度为0的oem*.inf文件程序出现锁死
        // 原因是continue语句执行后i值并没有改变，从而反复执行while()--continue之间代码的情况
        // 
        // [原因] continue语句一般使用在 for ()语句中，while()语句中使用不当就会出现死循环
        // [解决] 将{ i++; SysDrvInfFile   = GetXmlSingleNodeText( SysDrvInfFilesInfo , "FileItem" + i ) }
        //        加入到continue之前
        //
        if ( InfHandle == 0xFFFFFFFF ) 
        {
            // 2006-10-28
            DisplayMessage( "打开inf文件" + InfFilename + "失败" )

            i ++
            SysDrvInfFile   = GetXmlSingleNodeText( SysDrvInfFilesInfo , "FileItem" + i )
            continue
        }
        //
        // 2006-9-8 ................................................>>>

        // 2006-10-28
        DisplayMessage( "打开inf文件" + InfFilename + "成功" )

        var InfContext = DrvInf.FindFirstLineInSection( InfHandle , "Manufacturer" , "" )
        var MfgSectionName = new Array()
        MfgSectionName["Rows"] = 0 
        //[Manufacturer]
        //%Adico%  = Adico  , NT.5.1
        //%D-LINK% = D-LINK , NT.5.1
        for ( var k=0; InfContext ; k++)
        {
            var MfgSectionNameTmp  = "StartStart"
            // 1: 取=号后第一个参数值及以后的参数值
            for ( var j=1; MfgSectionNameTmp ; j++)
            {
                MfgSectionNameTmp  = DrvInf.GetFieldValueInLine( InfContext ,  j )
                if ( MfgSectionNameTmp )
                {
                    if ( j== 1 )
                    {
                        // = Adico
                        MfgSectionName[ MfgSectionName["Rows"] ] = MfgSectionNameTmp
                        MfgSectionName["Rows"] ++
                        // 2006-10-28
                        DisplayMessage( "找到inf文件" + InfFilename + "安装节[" + MfgSectionNameTmp + "]" )
                    }
                    else
                    {
                        // = "Adico" + "." + "NT.5.1"
                        MfgSectionName[ MfgSectionName["Rows"] ] = MfgSectionName[0] + "." + MfgSectionNameTmp
                        MfgSectionName["Rows"] ++
                        // 2006-10-28
                        DisplayMessage( "找到inf文件" + InfFilename + "安装节[" + MfgSectionName[ MfgSectionName["Rows"] ] + "]" )
                    }
                }
                else
                {
                    // 2006-10-28
                    DisplayMessage( "查找inf文件" + InfFilename + "安装节结束" )
                    break
                }
            }
            InfContext = DrvInf.FindNextLineInSection( InfContext )
        }
        // 2006-11-1
        //// 2006-10-28
        //DrvInf.CloseINFFile( InfHandle )

        //[Adico]
        //; DisplayName           Section       DeviceID
        //; -----------           -------       --------
        //%AE310.DeviceDesc%     = ae310.ndi,   PCI\VEN_1113&DEV_1217
        //
        //[Adico.NT.5.1]
        //; DisplayName           Section       DeviceID
        //; -----------           -------       --------
        //%AE310.DeviceDesc%     = ae310.ndi,   PCI\VEN_1113&DEV_1218
        for ( var k=0; k<MfgSectionName["Rows"]; k++)
        {
            // 2006-11-1
            //// 2006-10-28
            //InfHandle = DrvInf.OpenINFFile( InfFilename )

            var DeviveContext = DrvInf.FindFirstLineInSection( InfHandle , MfgSectionName[k] , "" )
            // 2006-10-28
            var DeviceID = ""
            var tmpA     = ""
            var tmpB     = ""
            // 
            // 2006-10-28
            DisplayMessage( "打开inf文件节[" + MfgSectionName[k] + "]查找故障设备DeviceID:" + DeviceInfo[8] + "..." )

            for ( var j=0; DeviveContext ; j++)
            {
                // ！！！！！！！！！　　下面的代码很可能是导致ＩＥ崩溃的主要原因　　！！！！！！！！！！
                //
                // 2006-10-28
                // var DeviceID     = DrvInf.GetFieldValueInLine( DeviveContext ,  2 )
                DeviceID     = DrvInf.GetFieldValueInLine( DeviveContext ,  2 )

                // 2006-11-1
                if ( DeviceID )
                {
                    // 2006-10-28
                    // DisplayMessage( "打开inf文件节[" + MfgSectionName[k] + "]第" + j + "个DeviceID:" + DeviceID )

                    // 2006-10-28
                    // var tmpA = ";" + DeviceID + ";"
                    // var tmpB = ";" + DeviceInfo[8] + ";" 
                    tmpA = ";" + DeviceID + ";"
                    tmpB = ";" + DeviceInfo[8] + ";" 

                    // 不要用正则表达式，因为字符串中会包含"\"特殊字符
                    //
                    //var re = new RegExp( tmpA ,"gi");  
                    //if ( tmpB.search( re ) != -1 )
                    if ( tmpB.toUpperCase().indexOf( tmpA.toUpperCase() ) != -1 )
                    {
                        // 2006-10-28
                        DisplayMessage( "在当前inf文件" + InfFilename + "中找到故障设备对应的DeviceID:" + DeviceID + ",查找操作退出" )

                        IfInfEraseFlag = true
                        break
                    }
                    // 2006-11-1
                    //// 2006-10-29
                    //DeviceID = null
                }

                DeviveContext = DrvInf.FindNextLineInSection( DeviveContext )
            }
            // 2006-11-1
            //// 2006-10-28
            //DrvInf.CloseINFFile( InfHandle )

            if ( IfInfEraseFlag ) break
        }
        // 如果确定该INF文件是要删除的文件，就退出循环不再查找其他的Mfg / DeviceID
        // 2006-10-28
        DrvInf.CloseINFFile( InfHandle )

        // 如果找到了问题设备的故障驱动INF / PNF文件，就删除它们
        if ( IfInfEraseFlag ) 
        {
            var DelInfResult = DrvCert.DeleteFile( InfFilename )
            var PnfFilename  = InfFilename.replace( /\.inf$/gi , ".pnf" )
            var DelPnfResult = DrvCert.DeleteFile( PnfFilename )
            RetInfo["Success"] = true

            if ( DelInfResult )
            {
                RetInfo["Info"   ] += "成功删除" + InfFilename + ";"
            }
            else
            {
                RetInfo["Info"   ] += "删除" + InfFilename + "失败;"
            }

            if ( PnfFilename )
            {
                RetInfo["Info"   ] += "成功删除" + PnfFilename + ";"
            }
            else
            {
                RetInfo["Info"   ] += "删除" + PnfFilename + "失败;"
            }
        }

        i ++
        SysDrvInfFile   = GetXmlSingleNodeText( SysDrvInfFilesInfo , "FileItem" + i )
    }
return ( RetInfo )
}
// 2006-8-26 ..................................................................................................>>>
///////////////////////////////////////////////////////////////////////////////////
// 该调用必须抢在第一次设备枚举结束后第二次枚举开始前执行
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
// 2006-9-22
function GetDriverExportStatusFromDBEx( UserID )
{
    var DeviceInfo  = new Array()
    DeviceInfo["Rows"] = 0 

    var stock = new Array()

    //ProcessingInfo.innerHTML = '正在读取驱动保护状态,这个过程可能需要等待1分钟...'
    //DrvCert.UIRefresh()

    // 2007-11-12
    //// 2006-10-29 <<<...................................................
    ////
    //PercentImg.width=PercentTbl.width*1/4
    //PercentString.innerHTML = '<center>20%</center>'
    PercentImg.width=PercentTbl.width*40/100
    PercentString.innerHTML = '<center>40%</center>'
    DrvCert.UIRefresh()
    //
    // 2006-10-29 ...................................................>>>

    DeviceInfo[ "UserID"] = UserID
    // 将故障设备驱动放入批量查询设备队列
	for (var i=0; i<g_DevErrDeviceRows ; i++)
	{
		ReadArrayToDeviceInfo( stock , g_DevErrDeviceInfoArray , i);



        // 2006-9-27
        //
        // 故障设备HardwareIDs、CompatibleIDs全传
        // 2006-9-28
        DeviceInfo[ DeviceInfo["Rows"] + ",HardwareIDs"   ] = stock[8]

        //
        // 2006-9-28
        // 在某些的机器上发现安装第4 HardwareIDs会出现重启/声音设备重启后不工作等情况
        // 因此,需要更改升级设备的逻辑为: 只匹配第1-2 HardwareIDs
        //var HardwareIDArray = stock[8].split( ";" )
        //var UpdateDeviceIDs = ( HardwareIDArray[1] ) ? HardwareIDArray[0] + ";" + HardwareIDArray[1] : HardwareIDArray[0] + ";" + UNKNOWN_DEVICE_ID
        //DeviceInfo[ DeviceInfo["Rows"] + ",HardwareIDs"   ] = UpdateDeviceIDs

        DeviceInfo[ DeviceInfo["Rows"] + ",CompatibleIDs" ] = stock[9]  //UNKNOWN_DEVICE_ID //stock[9]

        //var CompatibleIDArray = stock[9].split( ";" )
        //var UpdateDeviceIDs = ( CompatibleIDArray[1] ) ? CompatibleIDArray[0] + ";" + CompatibleIDArray[1] : CompatibleIDArray[0] + ";" + UNKNOWN_DEVICE_ID
        //DeviceInfo[ DeviceInfo["Rows"] + ",CompatibleIDs"   ] = UpdateDeviceIDs

        DeviceInfo[ DeviceInfo["Rows"] + ",Date"          ] = "01-01-1990"  // 找驱动数据库中的所有驱动
        DeviceInfo[ DeviceInfo["Rows"] + ",Class"         ] = "Error"
        DeviceInfo[ DeviceInfo["Rows"] + ",ClassDevRow"   ] = i
        // 2007-2-9
        DeviceInfo[ DeviceInfo["Rows"] + ",Inf"           ] = stock[14]
        // 2007-2-11
        DeviceInfo[ DeviceInfo["Rows"] + ",DeviceIndex"   ] = stock[1]


        DeviceInfo["Rows"] ++
	}

    // 2007-11-12
    //// 2006-10-29 <<<...................................................
    ////
    //PercentImg.width=PercentTbl.width*2/4
    //PercentString.innerHTML = '<center>40%</center>'
    PercentImg.width=PercentTbl.width*45/100
    PercentString.innerHTML = '<center>45%</center>'
    DrvCert.UIRefresh()
    //
    // 2006-10-29 ...................................................>>>

    // 升级用户类设备的驱动放入批量查询设备队列 
	for (var i=0; i<g_UserDrvDeviceRows ; i++)
	{


		ReadArrayToDeviceInfo( stock , g_UserDrvDeviceInfoArray , i);


        //DeviceInfo[ DeviceInfo["Rows"] + ",HardwareIDs"   ] = stock[8]
        
        // 2007-2-11
        //
        // 由于驱动匹配逻辑的重大变化,原来只传送用户类驱动的第1,2HardwareID(硬件标识),现在改为全部传送
        //
        //// 2006-9-28
        //// 在某些的机器上发现安装第4 HardwareIDs会出现重启/声音设备重启后不工作等情况
        //// 因此,需要更改升级设备的逻辑为: 只匹配第1-2 HardwareIDs
        //var HardwareIDArray = stock[8].split( ";" )
        //var UpdateDeviceIDs = ( HardwareIDArray[1] ) ? HardwareIDArray[0] + ";" + HardwareIDArray[1] : HardwareIDArray[0] + ";" + UNKNOWN_DEVICE_ID
        //DeviceInfo[ DeviceInfo["Rows"] + ",HardwareIDs"   ] = UpdateDeviceIDs
        //
        DeviceInfo[ DeviceInfo["Rows"] + ",HardwareIDs"   ] = stock[8]
        //alert( UpdateDeviceIDs )

        // 2007-2-11 <<<........................................................................................................................
        //
        //// 2006-9-27 <<<........................................................................................................
        ////
        //// 关于用户正常设备的驱动升级问题，策略上应该要求更严格
        //// 只有设备HardwareIDs的头2个并且驱动日期更新的，才可以认为是比用户驱动新
        //// 测试2楼试验室A06机器时发现匹配到pci\dev_8086&dev_24d5&subsys_xxxxxxxx没有问题
        //// 但当匹配到pci\dev_8086&dev_24d5&cc_040100时安装驱动过程中机器就会自动重启
        ////
        //// 2006-9-27
        ////
        ////DeviceInfo[ DeviceInfo["Rows"] + ",CompatibleIDs" ] = stock[9]
        ////var CompatibleIDArray = stock[9].split( ";" )
        ////var UpdateDeviceIDs = ( CompatibleIDArray[1] ) ? CompatibleIDArray[0] + ";" + CompatibleIDArray[1] : CompatibleIDArray[0] + ";" + UNKNOWN_DEVICE_ID
        ////DeviceInfo[ DeviceInfo["Rows"] + ",CompatibleIDs"   ] = UpdateDeviceIDs
        ////
        //// 2006-9-28
        ////
        //// 升级驱动不传兼容ID
        ////
        //DeviceInfo[ DeviceInfo["Rows"] + ",CompatibleIDs" ] = UNKNOWN_DEVICE_ID  // =  "UNKNOWN\\NULL_DEVICE_NULL_DEVICE_NULL_DEVICE"
        ////
        //// 2006-9-27 ........................................................................................................>>>
        //
        // 原来对用户类驱动不上传CompatibleIDs(兼容标识)，现在改为全部上传
        //
        DeviceInfo[ DeviceInfo["Rows"] + ",CompatibleIDs" ] = stock[9]
        // 2007-2-11 ........................................................................................................................>>>

        DeviceInfo[ DeviceInfo["Rows"] + ",Date"          ] = stock[11]
        DeviceInfo[ DeviceInfo["Rows"] + ",Class"         ] = "User"
        DeviceInfo[ DeviceInfo["Rows"] + ",ClassDevRow"   ] = i
        // 2007-2-9
        DeviceInfo[ DeviceInfo["Rows"] + ",Inf"           ] = stock[14]
        // 2007-2-11
        DeviceInfo[ DeviceInfo["Rows"] + ",DeviceIndex"   ] = stock[1]

        DeviceInfo["Rows"] ++
	}


    // 2007-2-9
    var UpdateSystemDrvFlag = ( GetCookie( "UpdateSystemDrvFlag" ) == "true" )
    var CurSystemDeviceRows = ( UpdateSystemDrvFlag ) ? g_NormalSystemDeviceRows : 0 
	if ( g_NormalSystemDeviceRows && UpdateSystemDrvFlag )
	{
		// 2007-2-9
        // alert( "升级系统类驱动时无法使用一次提交所有设备驱动的查询功能\n请修改你的页面设置" )
		//// 检查状态正常的系统类设备驱动是否需要升级
		//// 检查操作执行的条件是用户设置了“升级系统类驱动”标志
		//for (var i=0; i<g_NormalSystemDeviceRows && UpdateSystemDrvFlag ; i++)
		//{
		//
		//	ReadArrayToDeviceInfo( stock , g_NormalSystemDeviceInfoArray , i);
		//
		//	DeviceInfo[ DeviceInfo["Rows"] + ",HardwareIDs"   ] = stock[8]
		//	DeviceInfo[ DeviceInfo["Rows"] + ",CompatibleIDs" ] = stock[9]
		//	DeviceInfo[ DeviceInfo["Rows"] + ",Date"          ] = stock[11]
		//	DeviceInfo[ DeviceInfo["Rows"] + ",Class"         ] = "System"
		//	DeviceInfo[ DeviceInfo["Rows"] + ",ClassDevRow"   ] = i
		//
		//	DeviceInfo["Rows"] ++
		//}
        //
        //
		// 检查状态正常的系统类设备驱动是否需要升级
		// 检查操作执行的条件是用户设置了“升级系统类驱动”标志
		for (var i=0; i<g_NormalSystemDeviceRows && UpdateSystemDrvFlag ; i++)
		{
		
			ReadArrayToDeviceInfo( stock , g_NormalSystemDeviceInfoArray , i);
		
			DeviceInfo[ DeviceInfo["Rows"] + ",HardwareIDs"   ] = stock[8]
			DeviceInfo[ DeviceInfo["Rows"] + ",CompatibleIDs" ] = stock[9]
			DeviceInfo[ DeviceInfo["Rows"] + ",Date"          ] = stock[11]
			DeviceInfo[ DeviceInfo["Rows"] + ",Class"         ] = "System"
			DeviceInfo[ DeviceInfo["Rows"] + ",ClassDevRow"   ] = i
            // 2007-2-9
            DeviceInfo[ DeviceInfo["Rows"] + ",Inf"           ] = stock[14]
            // 2007-2-11
            DeviceInfo[ DeviceInfo["Rows"] + ",DeviceIndex"   ] = stock[1]
		
			DeviceInfo["Rows"] ++
		}
	}

//////////////////////////////////////////////////////////////////////////////////////////////
    // 2007-2-28 <<<...................................................
    //
    PercentImg.width=PercentTbl.width*60/100            // 2007-11-12   3/4
    PercentString.innerHTML = '<center>60%</center>'    // 2007-11-12'<center>60%</center>'
    DrvCert.UIRefresh()
    if ( g_LogConfigInfo[ USER_DEVICE_DETECT_LOG_NAME ] == "true" )
    {
        DisplayMessage("正在保存用户设备检测信息到日志数据库..." )

        SubmitUserDeviceInfoLog(    g_UserID , 
                                    g_CaseID , 
                                    g_DevErrDeviceInfoArray , g_DevErrDeviceRows ,
                                    g_UserDrvDeviceInfoArray , g_UserDrvDeviceRows ,
                                    g_NormalSystemDeviceInfoArray , g_NormalSystemDeviceRows ,
                                    USER_DEVICE_DETECT_LOG_NAME )   // ItemB
    }
    //
    //
    // 2007-2-28 ...................................................>>>

    // 2007-3-2
    // 返回系统运行状态标志cookie，以备其他系统读取当前系统的运行状态
    g_RunningStatus += "Step=1 , Status=1 , Finish=0 ; "
    SetCookie( "eDrv_Param" , g_RunningStatus , 1 )

    // 2006-10-29 <<<...................................................
    //
    PercentImg.width=PercentTbl.width*80/100          // 2007-11-12   3/4
    PercentString.innerHTML = '<center>80%</center>'
    DrvCert.UIRefresh()
    // 2006-10-29 ...................................................>>>

    g_MatchingDeviceInfo = SubmitSoapRequestFindDriverEx( DeviceInfo )

	//////////////////////////////////////////////////////////////////////////////////////////////
	//	<m:FindDriverRowsetResponse xmlns:m="http://e-drivers.cn/soap/" SOAP-ENV:encodingStyle="">
	//			<Result>Success</Result>
	//			<Rows>1</Rows>
	//			<Rowset>
	//				<Row>
	//						<OrgRow>8</OrgRow>
	//						<UserID>0</UserID>
	//						<DriverID>10676</DriverID>
	//						<DriverDate>2006/08/22</DriverDate>
	//						<DriverMfg>Realtek</DriverMfg>	
	//						<DriverDesc>PHRhYmxlPjx0...C90YWJsZT4A</DriverDesc>
    // 2006-10-22
	//						<InstallOrder>0</InstallOrder>
    // 2007-2-14
	//						<ForceInstall>1</ForceInstall>
    // 2007-3-5
    //                      <DispatchLogic>2</DispatchLogic>
    //                      <DriverHash>asdasd</DriverHash>
    // 2007-3-6
    //                      <DriverSize>12312</DriverSize>
    // 2007-3-12
    //                      <OldDrvID>1254</OldDrvID>
    // 2007-3-14
    //                      <DriverVer>1254</DriverVer>
	//				</Row>
	//			</Rowset>
	//	</m:FindDriverRowsetResponse>
	//////////////////////////////////////////////////////////////////////////////////////////////
	//
	//g_MatchingDeviceInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
	//g_MatchingDeviceInfo["ErrorInfo"     ] = ""
	//g_MatchingDeviceInfo[ "Rows"		  ] = i+1
	//g_MatchingDeviceInfo[ n ] = "Row" + i
	//g_MatchingDeviceInfo[ i + ",OrgRow"     ] = n / “-1”
	//g_MatchingDeviceInfo[ i + ",UserID"     ] = 
	//g_MatchingDeviceInfo[ i + ",DriverID"   ]
	//g_MatchingDeviceInfo[ i + ",DriverDate" ]
	//g_MatchingDeviceInfo[ i + ",DriverMfg"  ]
	//g_MatchingDeviceInfo[ i + ",DriverDesc" ]
    //
    // 2006-10-22
    //
	//g_MatchingDeviceInfo[ i + ",InstallOrder" ]
    //
    // 2007-2-14
    //
	//g_MatchingDeviceInfo[ i + ",ForceInstall" ]


	var TotalRows = 0 

    //alert( g_MatchingDeviceInfo[ "Rows"] + "\n" + g_MatchingDeviceInfo[ "0,OrgRow"] + "\n" + g_MatchingDeviceInfo[ "1,OrgRow"] )

    // 将故障设备驱动放入批量查询设备队列
	for (var i=0; i<g_DevErrDeviceRows ; i++)
	{
            // 2006-10-28
       		// ReadArrayToDeviceInfo( stock , g_UserDrvDeviceInfoArray , i);
            ReadArrayToDeviceInfo( stock , g_DevErrDeviceInfoArray , i);

			//if ( TotalRows == parseInt( g_MatchingDeviceInfo[ j + ",OrgRow"] ) )
            if ( g_MatchingDeviceInfo[ TotalRows ] )
			{
                var MatchingRow = g_MatchingDeviceInfo[ TotalRows ].replace( /^Row/gi , "" )
				DisplayMessage("设备[" + stock[6] + "]驱动已找到(DriverID=" + g_MatchingDeviceInfo[ MatchingRow + ",DriverID"] + ")" )
				// 设备驱动已保护标志
				g_DevErrDeviceInfoArray[i+",20"] = true
				g_DevErrDeviceInfoArray[i+",UserID"         ] = g_MatchingDeviceInfo[ MatchingRow + ",UserID"]
				g_DevErrDeviceInfoArray[i+",DriverID"       ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverID"]
				g_DevErrDeviceInfoArray[i+",DriverDate"     ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDate"]
				g_DevErrDeviceInfoArray[i+",DriverMfg"      ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverMfg"]
				// 2006-7-8
				g_DevErrDeviceInfoArray[i+",DriverDesc"     ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDesc"]

				g_DevErrDeviceInfoArray[i+",NewUserID"      ] = g_MatchingDeviceInfo[ MatchingRow + ",UserID"]
				g_DevErrDeviceInfoArray[i+",NewDriverID"    ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverID"]
				g_DevErrDeviceInfoArray[i+",NewDriverDate"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDate"]
				g_DevErrDeviceInfoArray[i+",NewDriverMfg"   ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverMfg"]
				// 2006-7-8
				g_DevErrDeviceInfoArray[i+",NewDriverDesc"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDesc"]
                // 2006-10-22
				g_DevErrDeviceInfoArray[i+",InstallOrder"   ] = g_MatchingDeviceInfo[ MatchingRow + ",InstallOrder"]
                // 2007-2-14
                // g_MatchingDeviceInfo[ i + ",ForceInstall" ] == 1 , 就说明驱动需要强制安装
                // 2007-3-3
				g_DevErrDeviceInfoArray[i+",ForceInstall"   ] = g_MatchingDeviceInfo[ MatchingRow + ",ForceInstall"]
                // 2007-3-5
				g_DevErrDeviceInfoArray[i+",DispatchLogic"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DispatchLogic"]
				g_DevErrDeviceInfoArray[i+",DriverHash"     ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverHash"   ]
                // 2007-3-6
				g_DevErrDeviceInfoArray[i+",DriverSize"     ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverSize"   ]
                // 2007-3-12
				g_DevErrDeviceInfoArray[i+",OldDrvID"       ] = g_MatchingDeviceInfo[ MatchingRow + ",OldDrvID"   ]
                // 2007-3-14
                g_DevErrDeviceInfoArray[i+",DriverVer"       ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverVer"   ]
                // 2007-2-14
                //
                // 驱动信息已经匹配到故障设备标记
                g_MatchingDeviceInfo[ MatchingRow + ",MatchDeviceClass"] = "Error," + i
                // 2007-2-15
                // 通过g_DevErrDeviceInfoArray可以反查g_MatchingDeviceInfo找到数据行号
                g_DevErrDeviceInfoArray[i+",FindDriverRetRow"   ] = MatchingRow

				g_DeviceRowsCanImportDriver ++
			}
			else
			{
				// 设备驱动未保护标志
				g_DevErrDeviceInfoArray[i+",20"] = false
				// 2006-7-10
				DisplayMessage("设备[" + stock[6] + "]驱动未找到:" + g_MatchingDeviceInfo["ErrorInfo"] )

                ////g_DevErrDeviceInfoArray[i+",NewUserID"      ] = g_MatchingDeviceInfo[ i + ",UserID"]
				////g_DevErrDeviceInfoArray[i+",NewDriverID"    ] = g_MatchingDeviceInfo[ i + ",DriverID"]
				////g_DevErrDeviceInfoArray[i+",NewDriverDate"  ] = g_MatchingDeviceInfo[ i + ",DriverDate"]
				////g_DevErrDeviceInfoArray[i+",NewDriverMfg"   ] = g_MatchingDeviceInfo[ i + ",DriverMfg"]
				////// 2006-7-8
				////g_DevErrDeviceInfoArray[i+",NewDriverDesc"  ] = g_MatchingDeviceInfo[ i + ",DriverDesc"]
                //
				// 2006-11-6
                g_DevErrDeviceInfoArray[i+",UserID"      ] = 0
				g_DevErrDeviceInfoArray[i+",DriverID"    ] = ""
				g_DevErrDeviceInfoArray[i+",DriverDate"  ] = ""
				g_DevErrDeviceInfoArray[i+",DriverMfg"   ] = ""
				g_DevErrDeviceInfoArray[i+",DriverDesc"  ] = ""

                g_DevErrDeviceInfoArray[i+",NewUserID"      ] = 0
				g_DevErrDeviceInfoArray[i+",NewDriverID"    ] = ""
				g_DevErrDeviceInfoArray[i+",NewDriverDate"  ] = ""
				g_DevErrDeviceInfoArray[i+",NewDriverMfg"   ] = ""
				g_DevErrDeviceInfoArray[i+",NewDriverDesc"  ] = ""

				g_DevErrDeviceInfoArray[i+",InstallOrder"   ] = 0
                // 2007-2-14
                // g_MatchingDeviceInfo[ i + ",ForceInstall" ] == 1 , 就说明驱动需要强制安装
                // 2007-3-3
                // 驱动不需要强制安装
				g_DevErrDeviceInfoArray[i+",ForceInstall"   ] = 0 
                // 2007-3-5
				g_DevErrDeviceInfoArray[i+",DispatchLogic"  ] = 0
				g_DevErrDeviceInfoArray[i+",DriverHash"     ] = ""
                // 2007-3-6
				g_DevErrDeviceInfoArray[i+",DriverSize"     ] = 0
                // 2007-3-12
				g_DevErrDeviceInfoArray[i+",OldDrvID"       ] = 0
                // 2007-3-14
                g_DevErrDeviceInfoArray[i+",DriverVer"      ] = ""

			}
		TotalRows ++
	}
    // 2006-10-29 <<<...................................................
    //
    PercentImg.width=PercentTbl.width
    PercentString.innerHTML = '<center>100%</center>'
    DrvCert.UIRefresh()
    //
    // 2006-10-29 ...................................................>>>

    // 用户类设备的驱动放入批量查询设备队列 
	for (var i=0; i<g_UserDrvDeviceRows ; i++)
	{
      		ReadArrayToDeviceInfo( stock , g_UserDrvDeviceInfoArray , i);

            if ( g_MatchingDeviceInfo[ TotalRows ] )
			{
                var MatchingRow = g_MatchingDeviceInfo[ TotalRows ].replace( /^Row/gi , "" )
				DisplayMessage("设备[" + stock[6] + "]驱动可以更新(DriverID=" + g_MatchingDeviceInfo[ MatchingRow + ",DriverID"] + ")" )

				// 设备驱动已保护标志
				g_UserDrvDeviceInfoArray[i+",20"          ] = true
				g_UserDrvDeviceInfoArray[i+",UserID"      ] = g_MatchingDeviceInfo[ MatchingRow + ",UserID"]
				g_UserDrvDeviceInfoArray[i+",DriverID"    ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverID"]
				g_UserDrvDeviceInfoArray[i+",DriverDate"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDate"]
				g_UserDrvDeviceInfoArray[i+",DriverMfg"   ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverMfg"]
				// 2006-7-8
				g_UserDrvDeviceInfoArray[i+",DriverDesc"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDesc"]

				g_UserDrvDeviceInfoArray[i+",NewUserID"      ] = g_MatchingDeviceInfo[ MatchingRow + ",UserID"]
				g_UserDrvDeviceInfoArray[i+",NewDriverID"    ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverID"]
				g_UserDrvDeviceInfoArray[i+",NewDriverDate"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDate"]
				g_UserDrvDeviceInfoArray[i+",NewDriverMfg"   ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverMfg"]
				// 2006-7-8
				g_UserDrvDeviceInfoArray[i+",NewDriverDesc"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDesc"]
                // 2006-10-22
				g_UserDrvDeviceInfoArray[i+",InstallOrder"   ] = g_MatchingDeviceInfo[ MatchingRow + ",InstallOrder"]
                // 2007-2-14
                // g_MatchingDeviceInfo[ i + ",ForceInstall" ] == 1 , 就说明驱动需要强制安装
                // 2007-3-3
				g_UserDrvDeviceInfoArray[i+",ForceInstall"   ] = g_MatchingDeviceInfo[ MatchingRow + ",ForceInstall"]
                // 2007-3-5
				g_UserDrvDeviceInfoArray[i+",DispatchLogic"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DispatchLogic"]
				g_UserDrvDeviceInfoArray[i+",DriverHash"     ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverHash"   ]
                // 2007-3-6
				g_UserDrvDeviceInfoArray[i+",DriverSize"     ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverSize"   ]
                // 2007-3-12
				g_UserDrvDeviceInfoArray[i+",OldDrvID"       ] = g_MatchingDeviceInfo[ MatchingRow + ",OldDrvID"   ]
                // 2007-3-14
                g_UserDrvDeviceInfoArray[i+",DriverVer"       ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverVer"   ]
                // 2007-2-14
                //
                // 驱动信息已经匹配到用户驱动类设备标记
                g_MatchingDeviceInfo[ MatchingRow + ",MatchDeviceClass"] = "User,"+i
                // 2007-2-15
                // 通过g_DevErrDeviceInfoArray可以反查g_MatchingDeviceInfo找到数据行号
                g_UserDrvDeviceInfoArray[i+",FindDriverRetRow"   ] = MatchingRow

			}
			else
			{
				DisplayMessage("设备[" + stock[6] + "]驱动不用更新")
				// 设备驱动未保护标志
				g_UserDrvDeviceInfoArray[i+",20"] = false

                ////g_UserDrvDeviceInfoArray[i+",NewUserID"      ] = g_MatchingDeviceInfo[ i + ",UserID"]
				////g_UserDrvDeviceInfoArray[i+",NewDriverID"    ] = g_MatchingDeviceInfo[ i + ",DriverID"]
				////g_UserDrvDeviceInfoArray[i+",NewDriverDate"  ] = g_MatchingDeviceInfo[ i + ",DriverDate"]
				////g_UserDrvDeviceInfoArray[i+",NewDriverMfg"   ] = g_MatchingDeviceInfo[ i + ",DriverMfg"]
				////// 2006-7-8
				////g_UserDrvDeviceInfoArray[i+",NewDriverDesc"  ] = g_MatchingDeviceInfo[ i + ",DriverDesc"]
                ////
				// 2006-11-6
                g_UserDrvDeviceInfoArray[i+",UserID"      ] = 0
				g_UserDrvDeviceInfoArray[i+",DriverID"    ] = ""
				g_UserDrvDeviceInfoArray[i+",DriverDate"  ] = ""
				g_UserDrvDeviceInfoArray[i+",DriverMfg"   ] = ""
				g_UserDrvDeviceInfoArray[i+",DriverDesc"  ] = ""

                g_UserDrvDeviceInfoArray[i+",NewUserID"      ] = 0
				g_UserDrvDeviceInfoArray[i+",NewDriverID"    ] = ""
				g_UserDrvDeviceInfoArray[i+",NewDriverDate"  ] = ""
				g_UserDrvDeviceInfoArray[i+",NewDriverMfg"   ] = ""
				g_UserDrvDeviceInfoArray[i+",NewDriverDesc"  ] = ""

				g_UserDrvDeviceInfoArray[i+",InstallOrder"   ] = 0
                // 2007-2-14
                // g_MatchingDeviceInfo[ i + ",ForceInstall" ] == 1 , 就说明驱动需要强制安装
				g_UserDrvDeviceInfoArray[i+",ForceInstall"   ] = 0
                // 2007-3-5
				g_UserDrvDeviceInfoArray[i+",DispatchLogic"  ] = 0
				g_UserDrvDeviceInfoArray[i+",DriverHash"     ] = ""
                // 2007-3-6
				g_UserDrvDeviceInfoArray[i+",DriverSize"     ] = ""
                // 2007-3-12
				g_UserDrvDeviceInfoArray[i+",OldDrvID"       ] = ""
                // 2007-3-14
                g_UserDrvDeviceInfoArray[i+",DriverVer"       ] = ""
				
			}
			// 如果该状态正常的用户类设备的驱动有更新版本的驱动
			if ( Date.parse( g_UserDrvDeviceInfoArray[i+",NewDriverDate"] ) > Date.parse( stock[11] ) )
			{
				g_DeviceRowsNeedUpdateDriver ++
			}
		TotalRows ++ 
	}

    // 2007-2-14 <<<.....................................................................................................
    //
    // 系统类设备的驱动放入批量查询设备队列 
	for (var i=0; i<g_NormalSystemDeviceRows ; i++)
	{
      		ReadArrayToDeviceInfo( stock , g_NormalSystemDeviceInfoArray , i);

            if ( g_MatchingDeviceInfo[ TotalRows ] )
			{
                var MatchingRow = g_MatchingDeviceInfo[ TotalRows ].replace( /^Row/gi , "" )
				DisplayMessage("设备[" + stock[6] + "]驱动可以更新(DriverID=" + g_MatchingDeviceInfo[ MatchingRow + ",DriverID"] + ")" )

				// 设备驱动已保护标志
				g_NormalSystemDeviceInfoArray[i+",20"          ] = true
				g_NormalSystemDeviceInfoArray[i+",UserID"      ] = g_MatchingDeviceInfo[ MatchingRow + ",UserID"]
				g_NormalSystemDeviceInfoArray[i+",DriverID"    ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverID"]
				g_NormalSystemDeviceInfoArray[i+",DriverDate"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDate"]
				g_NormalSystemDeviceInfoArray[i+",DriverMfg"   ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverMfg"]
				// 2006-7-8
				g_NormalSystemDeviceInfoArray[i+",DriverDesc"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDesc"]

				g_NormalSystemDeviceInfoArray[i+",NewUserID"      ] = g_MatchingDeviceInfo[ MatchingRow + ",UserID"]
				g_NormalSystemDeviceInfoArray[i+",NewDriverID"    ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverID"]
				g_NormalSystemDeviceInfoArray[i+",NewDriverDate"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDate"]
				g_NormalSystemDeviceInfoArray[i+",NewDriverMfg"   ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverMfg"]
				// 2006-7-8
				g_NormalSystemDeviceInfoArray[i+",NewDriverDesc"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverDesc"]
                // 2006-10-22
				g_NormalSystemDeviceInfoArray[i+",InstallOrder"   ] = g_MatchingDeviceInfo[ MatchingRow + ",InstallOrder"]
                // 2006-10-22
                // g_MatchingDeviceInfo[ i + ",ForceInstall" ] == 1 , 就说明驱动需要强制安装
                // 2007-3-3
				g_NormalSystemDeviceInfoArray[i+",ForceInstall"   ] = g_MatchingDeviceInfo[ MatchingRow + ",ForceInstall"]
                // 2007-3-5
				g_NormalSystemDeviceInfoArray[i+",DispatchLogic"  ] = g_MatchingDeviceInfo[ MatchingRow + ",DispatchLogic"]
				g_NormalSystemDeviceInfoArray[i+",DriverHash"     ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverHash"   ]
                // 2007-3-6
				g_NormalSystemDeviceInfoArray[i+",DriverSize"     ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverSize"   ]
                // 2007-3-12
				g_NormalSystemDeviceInfoArray[i+",OldDrvID"       ] = g_MatchingDeviceInfo[ MatchingRow + ",OldDrvID"     ]
                // 2007-3-14
                g_NormalSystemDeviceInfoArray[i+",DriverVer"      ] = g_MatchingDeviceInfo[ MatchingRow + ",DriverVer"     ]
                // 2007-2-14
                //
                // 驱动信息已经匹配到系统设备标记
                g_MatchingDeviceInfo[ MatchingRow + ",MatchDeviceClass"] = "System," + i
                // 2007-2-15
                // 通过g_DevErrDeviceInfoArray可以反查g_MatchingDeviceInfo找到数据行号
                g_NormalSystemDeviceInfoArray[i+",FindDriverRetRow"   ] = MatchingRow
			}
			else
			{
				//DisplayMessage("设备[" + stock[6] + "]驱动不用更新:" + g_MatchingDeviceInfo["ErrorInfo"] )
				// 设备驱动未保护标志
				g_NormalSystemDeviceInfoArray[i+",20"] = false

                ////g_NormalSystemDeviceInfoArray[i+",NewUserID"      ] = g_MatchingDeviceInfo[ i + ",UserID"]
				////g_NormalSystemDeviceInfoArray[i+",NewDriverID"    ] = g_MatchingDeviceInfo[ i + ",DriverID"]
				////g_NormalSystemDeviceInfoArray[i+",NewDriverDate"  ] = g_MatchingDeviceInfo[ i + ",DriverDate"]
				////g_NormalSystemDeviceInfoArray[i+",NewDriverMfg"   ] = g_MatchingDeviceInfo[ i + ",DriverMfg"]
				////// 2006-7-8
				////g_NormalSystemDeviceInfoArray[i+",NewDriverDesc"  ] = g_MatchingDeviceInfo[ i + ",DriverDesc"]
                ////
				// 2006-11-6
                g_NormalSystemDeviceInfoArray[i+",UserID"      ] = 0
				g_NormalSystemDeviceInfoArray[i+",DriverID"    ] = ""
				g_NormalSystemDeviceInfoArray[i+",DriverDate"  ] = ""
				g_NormalSystemDeviceInfoArray[i+",DriverMfg"   ] = ""
				g_NormalSystemDeviceInfoArray[i+",DriverDesc"  ] = ""

                g_NormalSystemDeviceInfoArray[i+",NewUserID"      ] = 0
				g_NormalSystemDeviceInfoArray[i+",NewDriverID"    ] = ""
				g_NormalSystemDeviceInfoArray[i+",NewDriverDate"  ] = ""
				g_NormalSystemDeviceInfoArray[i+",NewDriverMfg"   ] = ""
				g_NormalSystemDeviceInfoArray[i+",NewDriverDesc"  ] = ""

				g_NormalSystemDeviceInfoArray[i+",InstallOrder"   ] = 0
                // 2007-2-14
                // g_MatchingDeviceInfo[ i + ",ForceInstall" ] == 1 , 就说明驱动需要强制安装
				g_NormalSystemDeviceInfoArray[i+",ForceInstall"   ] = 0
                // 2007-3-5
				g_NormalSystemDeviceInfoArray[i+",DispatchLogic"  ] = 0
				g_NormalSystemDeviceInfoArray[i+",DriverHash"     ] = ""
                // 2007-3-6
				g_NormalSystemDeviceInfoArray[i+",DriverSize"     ] = ""
                // 2007-3-12
				g_NormalSystemDeviceInfoArray[i+",OldDrvID"       ] = ""
                // 2007-3-14
                g_NormalSystemDeviceInfoArray[i+",DriverVer"       ] = ""
				
			}
			// 如果该状态正常的用户类设备的驱动有更新版本的驱动
			if ( Date.parse( g_NormalSystemDeviceInfoArray[i+",NewDriverDate"] ) > Date.parse( stock[11] ) )
			{
				g_DeviceRowsNeedUpdateDriver ++
			}
		TotalRows ++ 
	}
	//g_MatchingDeviceInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
	//g_MatchingDeviceInfo["ErrorInfo"     ] = ""
	//g_MatchingDeviceInfo[ "Rows"		  ] = i+1
	//g_MatchingDeviceInfo[ n ] = "Row" + i
	//g_MatchingDeviceInfo[ i + ",OrgRow"     ] = n / “-1”
	//g_MatchingDeviceInfo[ i + ",UserID"     ] = 
	//g_MatchingDeviceInfo[ i + ",DriverID"   ]
	//g_MatchingDeviceInfo[ i + ",DriverDate" ]
	//g_MatchingDeviceInfo[ i + ",DriverMfg"  ]
	//g_MatchingDeviceInfo[ i + ",DriverDesc" ]
    //
    // 2006-10-22
    //
	//g_MatchingDeviceInfo[ i + ",InstallOrder" ]
    //
    // 2007-2-14
    //
	//g_MatchingDeviceInfo[ i + ",ForceInstall" ]
    // 2007-2-15
    //g_MatchingDeviceInfo[ i + ",MatchDeviceClass"] = "System," + x
    //                                               = "User,"   + x
    //                                               = "Error,"  + x

    g_NoMatchDeviceDriverInfoArray["Rows"] = 0
    var j = 0
    for ( var i=0; i<g_MatchingDeviceInfo[ "Rows" ]; i++ )
    {
        // 如果驱动不能和设备匹配上,就列入g_NoMatchDeviceDriverInfoArray
        //if ( g_MatchingDeviceInfo[ i + ",OrgRow"     ] == -1 )
        //
        // 如果找到的驱动信息没有与任何设备匹配上,就认为是其他类设备
        if ( !g_MatchingDeviceInfo[ i + ",MatchDeviceClass"] )
        {
			DisplayMessage("驱动需要强制安装(DriverID=" + g_MatchingDeviceInfo[ i + ",DriverID"] + ")" )
            j = g_NoMatchDeviceDriverInfoArray["Rows"]

            g_NoMatchDeviceDriverInfoArray[ j + ",20"               ] = true
            g_NoMatchDeviceDriverInfoArray[ j + ",UserID"           ] = g_MatchingDeviceInfo[ i + ",UserID"       ]
            g_NoMatchDeviceDriverInfoArray[ j + ",DriverID"         ] = g_MatchingDeviceInfo[ i + ",DriverID"     ]
            g_NoMatchDeviceDriverInfoArray[ j + ",DriverDate"       ] = g_MatchingDeviceInfo[ i + ",DriverDate"   ]
            g_NoMatchDeviceDriverInfoArray[ j + ",DriverMfg"        ] = g_MatchingDeviceInfo[ i + ",DriverMfg"    ]
            // 2006-7-8
            g_NoMatchDeviceDriverInfoArray[ j + ",DriverDesc"       ] = g_MatchingDeviceInfo[ i + ",DriverDesc"   ]
            g_NoMatchDeviceDriverInfoArray[ j + ",NewUserID"        ] = g_MatchingDeviceInfo[ i + ",UserID"       ]
            g_NoMatchDeviceDriverInfoArray[ j + ",NewDriverID"      ] = g_MatchingDeviceInfo[ i + ",DriverID"     ]
            g_NoMatchDeviceDriverInfoArray[ j + ",NewDriverDate"    ] = g_MatchingDeviceInfo[ i + ",DriverDate"   ]
            g_NoMatchDeviceDriverInfoArray[ j + ",NewDriverMfg"     ] = g_MatchingDeviceInfo[ i + ",DriverMfg"    ]
            // 2006-7-8
            g_NoMatchDeviceDriverInfoArray[ j + ",NewDriverDesc"    ] = g_MatchingDeviceInfo[ i + ",DriverDesc"   ]
            // 2006-10-22
            g_NoMatchDeviceDriverInfoArray[ j + ",InstallOrder"     ] = g_MatchingDeviceInfo[ i + ",InstallOrder" ]
            // 2006-10-22
            // g_MatchingDeviceInfo[ i + ",ForceInstall" ] == 1 , 就说明驱动需要强制安装
            // 2007-3-3
            g_NoMatchDeviceDriverInfoArray[ j + ",ForceInstall"     ] = g_MatchingDeviceInfo[ i + ",ForceInstall" ]
            // 2007-3-5
            g_NoMatchDeviceDriverInfoArray[ j + ",DispatchLogic"    ] = g_MatchingDeviceInfo[ i + ",DispatchLogic"]
            g_NoMatchDeviceDriverInfoArray[ j + ",DriverHash"       ] = g_MatchingDeviceInfo[ i + ",DriverHash"   ]
            // 2007-3-6
            g_NoMatchDeviceDriverInfoArray[ j + ",DriverSize"       ] = g_MatchingDeviceInfo[ i + ",DriverSize"   ]
            // 2007-3-12
            g_NoMatchDeviceDriverInfoArray[ j + ",OldDrvID"         ] = g_MatchingDeviceInfo[ i + ",OldDrvID"     ]
            // 2007-3-14
            g_NoMatchDeviceDriverInfoArray[ j + ",DriverVer"        ] = g_MatchingDeviceInfo[ i + ",DriverVer"     ]
            //
            g_NoMatchDeviceDriverInfoArray[ j + ",MatchDeviceClass" ] = g_MatchingDeviceInfo[ i + ",MatchDeviceClass"] = "Other," + j
                
            g_NoMatchDeviceDriverInfoArray["Rows"] ++
        }
    }
    //
    // 2007-2-14 .....................................................................................................>>>

}

function SubmitSoapRequestFindDriverEx( DeviceInfo )
{
    var RequestInfo = new Array()

    var MainBoardInfoXml = GetMainBoardInfo()

    //          <ComputerManufacturer>     </ComputerManufacturer>
    //          <ComputerModel> </ComputerModel>
    //          <BaseBoardManufacturer>ABIT </BaseBoardManufacturer>
    //          <BaseBoardProduct>i845-W83627HF</BaseBoardProduct>
    //          <BaseBoardVersion>BD7  Rev:1.0</BaseBoardVersion>
    var ComputerMfg             = GetXmlSingleNodeText( MainBoardInfoXml , "ComputerManufacturer" )
    var ComputerModel           = GetXmlSingleNodeText( MainBoardInfoXml , "ComputerModel" )
    var BaseBoardMfg            = GetXmlSingleNodeText( MainBoardInfoXml , "BaseBoardManufacturer" )
    var BaseBoardProduct        = GetXmlSingleNodeText( MainBoardInfoXml , "BaseBoardProduct" )
    var BaseBoardVersion        = GetXmlSingleNodeText( MainBoardInfoXml , "BaseBoardVersion" )

    RequestInfo["ComputerMfg"       ] = ( ComputerMfg       == null ) ? "undefined" : ComputerMfg
    RequestInfo["ComputerModel"     ] = ( ComputerModel     == null ) ? "undefined" : ComputerModel
    RequestInfo["BaseBoardMfg"      ] = ( BaseBoardMfg      == null ) ? "undefined" : BaseBoardMfg
    RequestInfo["BaseBoardProduct"  ] = ( BaseBoardProduct  == null ) ? "undefined" : BaseBoardProduct
    RequestInfo["BaseBoardVersion"  ] = ( BaseBoardVersion  == null ) ? "undefined" : BaseBoardVersion

    var OSInfoXml = GetOSInfo()
    //            <OSMajorVer>5</OSMajorVer>
    //            <OSMinorVer>0</OSMinorVer>
    //            <OSPlatform>Windows 2000 Server</OSPlatform>
    RequestInfo["OSMajorVer"       ] = GetXmlSingleNodeText( OSInfoXml , "OSMajorVer" )
    RequestInfo["OSMinorVer"       ] = GetXmlSingleNodeText( OSInfoXml , "OSMinorVer" )
    RequestInfo["OSPlatform"       ] = GetXmlSingleNodeText( OSInfoXml , "OSPlatform" )

    
    var RequestXml = ""

    var RetInfo     = new Array()
    RetInfo[ "Rows"     ] = 0

    var SoapApplyURL = ServerName.value + SoapAspURL.value

	var SoapRequestXML = ""
    // 2006-10-26
	//SoapRequestXML += '<?xml version="1.0" encoding="UTF-16" standalone="no"?>\n'
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
    SoapRequestXML += "<n:FindDriverRowset xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
                   +  "     <UserID>"            + DeviceInfo["UserID"            ]  + "</UserID>\n"
                   +  "     <OSMajorVer>"        + RequestInfo["OSMajorVer"       ]  + "</OSMajorVer>\n"
                   +  "     <OSMinorVer>"        + RequestInfo["OSMinorVer"       ]  + "</OSMinorVer>\n"
                   +  "     <OSPlatform>"        + RequestInfo["OSPlatform"       ]  + "</OSPlatform>\n"
                   +  "     <ComputerMfg>"       + RequestInfo["ComputerMfg"      ]  + "</ComputerMfg>\n"
                   +  "     <ComputerModel>"     + RequestInfo["ComputerModel"    ]  + "</ComputerModel>\n"
                   +  "     <BaseBoardMfg>"      + RequestInfo["BaseBoardMfg"     ]  + "</BaseBoardMfg>\n"
                   +  "     <BaseBoardProduct>"  + RequestInfo["BaseBoardProduct" ]  + "</BaseBoardProduct>\n"
                   +  "     <BaseBoardVersion>"  + RequestInfo["BaseBoardVersion" ]  + "</BaseBoardVersion>\n"
                   // 2007-2-15
                   +  "     <HostSerialNumber>"  + g_UserHostSerialNumber            + "</HostSerialNumber>\n"
                   //
    SoapRequestXML += "     <RowSet>\n"

    // 2007-2-9
    var SysPath
    var InfPathFileName
    var InfContentInBASE64
    var InfHash
    for (var i=0;i<DeviceInfo["Rows"];i++)
    {
        SoapRequestXML += "     <Row>\n"
        SoapRequestXML += "         <HardwareIDs>"      + XmlEncoding( DeviceInfo[ i + ",HardwareIDs"     ] ) + "</HardwareIDs>\n"
        SoapRequestXML += "         <CompatibleIDs>"    + XmlEncoding( DeviceInfo[ i + ",CompatibleIDs"   ] ) + "</CompatibleIDs>\n"
        SoapRequestXML += "         <DriverDate>"       + XmlEncoding( DeviceInfo[ i + ",Date"            ] ) + "</DriverDate>\n"
        SoapRequestXML += "         <RowID>"            + i                                                   + "</RowID>\n"
        // 2007-2-11
        SoapRequestXML += "         <ClassDevRow>"      + DeviceInfo[ i + ",ClassDevRow"      ]               + "</ClassDevRow>\n"
        SoapRequestXML += "         <DeviceIndex>"      + DeviceInfo[ i + ",DeviceIndex"      ]               + "</DeviceIndex>\n"
        // 2007-2-9 <<<......................................................................................................................
        SysPath = DrvCert.GetFolderPath( 36 )	// 36 0x24 - CSIDL_WINDOWS  
        // 2007-2-11
        //
        // 如果设备安装了驱动且驱动类型是用户类，就取驱动inf文件的哈希值
        if ( DeviceInfo[ i + ",Inf" ] && ( DeviceInfo[ i + ",Class"].toUpperCase() == "USER")  )
        {
            InfPathFileName = SysPath + "\\inf\\" + DeviceInfo[ i + ",Inf" ]
            InfContentInBASE64 = DrvCert.GetBASE64StringFromBinFile( InfPathFileName )
            InfHash = DrvCert.GetDataHash( InfContentInBASE64 )
            SoapRequestXML += "         <InfHash>"      + InfHash                                             + "</InfHash>\n"
        }
        // 2007-2-11
        // 如果设备设备没有安装驱动（或设备有故障）或设备驱动是操作系统安装的，就不用取驱动inf文件的哈希值
        else
        {
            SoapRequestXML += "         <InfHash></InfHash>\n"
        }
        SoapRequestXML += "         <Class>"             + XmlEncoding( DeviceInfo[ i + ",Class"            ] ) + "</Class>\n"
        // 2007-2-9 ......................................................................................................................>>>
        SoapRequestXML += "     </Row>\n"
    }
    SoapRequestXML += "     </RowSet>\n"
	SoapRequestXML += "   </n:FindDriverRowset>\n"
	SoapRequestXML += " </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

    //Title.innerText = SoapRequestXML
    //DrvCert.UIRefresh()

    // 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )


	//DrvCert.SaveStringToFile( ReturnXML , "c:\\myxml.txt" )

	//if ( ReturnXML == null || ReturnXML == "" )
	if ( ReturnXML == null)
	{

        //DisplayMessage( "查询设备[" + DeviceInfo[6] + "]驱动请求没有反应\n请求内容是:\n" + SoapRequestXML )
        RetInfo["Success"       ] = false
        RetInfo["ErrorInfo"     ] = "查询设备驱动请求没有反应"      // 2006-9-21 old is : Device[6] , and then will error
		return ( RetInfo )
	}


    var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )

	if ( ErrorInfo ) 
	{
        //DisplayMessage( "查询设备[" + DeviceInfo[6] + "]驱动请求返回错误:\n" + ErrorInfo )
        RetInfo["Success"       ] = false
        RetInfo["ErrorInfo"     ] = "查询设备驱动请求返回错误:" + ErrorInfo // 2006-9-21 old is : Device[6] , and then will error
        RetInfo["UserID"        ] = 0
        RetInfo["DriverID"      ] = 0
        RetInfo["DriverDate"    ] = ""
        RetInfo["DriverMfg"     ] = ""
        RetInfo["NewUserID"     ] = 0
        RetInfo["NewDriverID"   ] = 0
        RetInfo["NewDriverDate" ] = ""
        RetInfo["NewDriverMfg"  ] = ""
	}
	else
	{
		//////////////////////////////////////////////////////////////////////////////////////////////
		//	<m:FindDriverRowsetResponse xmlns:m="http://e-drivers.cn/soap/" SOAP-ENV:encodingStyle="">
		//			<Result>Success</Result>
		//			<Rows>1</Rows>
		//			<Rowset>
		//				<Row>
		//						<OrgRow>3</OrgRow>
		//						<UserID>0</UserID>
		//						<DriverID>10676</DriverID>
		//						<DriverDate>2006/08/22</DriverDate>
		//						<DriverMfg>Realtek</DriverMfg>	
		//						<DriverDesc>PHRhYmxlPjx0...C90YWJsZT4A</DriverDesc>
        // 2006-10-22
		//						<InstallOrder>1</InstallOrder>
        // 2007-2-14
		//						<ForceInstall>0</ForceInstall>
		//				</Row>
		//				<Row>
		//						<OrgRow>5</OrgRow>
		//						<UserID>0</UserID>
		//						<DriverID>10676</DriverID>
		//						<DriverDate>2006/08/22</DriverDate>
		//						<DriverMfg>Realtek</DriverMfg>	
		//						<DriverDesc>PHRhYmxlPjx0...C90YWJsZT4A</DriverDesc>
        // 2006-10-22
		//						<InstallOrder>1</InstallOrder>
        // 2007-2-14
		//						<ForceInstall>1</ForceInstall>
        // 2007-3-5
        //                      <DriverHash>ankjdasjkM</DriverHash>
        //                      <DispatchLogic>1</DispatchLogic>
        // 2007-3-7
        //                      <DriverSize>23123</DriverSize>
        // 2007-3-12
        //
        //                      <OldDrvID>1232</OldDrvID>
        // 2007-3-14
        //                      <DriverVer>1232</DriverVer>
        //
		//				</Row>
		//			</Rowset>
		//	</m:FindDriverRowsetResponse>
		//////////////////////////////////////////////////////////////////////////////////////////////

        //DisplayMessage( "查询设备[" + DeviceInfo[6] + "]驱动请求提交成功" )
        var ResultString         = GetInfoByTagFromXml( ReturnXML, "Result" )
		var ResultRows			 = GetInfoByTagFromXml( ReturnXML, "Rows" )
		if ( ResultRows )
		{
			var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
			xmlDoc.async = false
			xmlDoc.loadXML( ReturnXML )
			var objRowDataNode = xmlDoc.selectSingleNode("\/\/Rowset")
			if ( objRowDataNode )
			{
				var oNodeList ;
		
				var oNodeList = objRowDataNode.childNodes;
				for (var i=0;i<oNodeList.length ; i++)
				{
                    // 2007-2-14
                    //
                    // RetInfo[ i + ",OrgRow"     ] = 3
					RetInfo[ i + ",OrgRow"     ] = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "OrgRow" ) )
                    // 2007-2-14
                    //
                    // RetInfo[ 3 ] = "Row" + i
					RetInfo[ RetInfo[ i + ",OrgRow"] ] = "Row" + RetInfo[ "Rows"     ]
					RetInfo[ i + ",UserID"     ] = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "UserID" ) )
					RetInfo[ i + ",DriverID"   ] = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DriverID" ) )
					RetInfo[ i + ",DriverDate" ] = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DriverDate" ) )
					RetInfo[ i + ",DriverMfg"  ] = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DriverMfg" ) )
					RetInfo[ i + ",DriverDesc" ] = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DriverDesc" ) )
                    // 2006-10-22
					RetInfo[ i + ",InstallOrder"]= XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "InstallOrder" ) )
                    // 2007-3-2
                    //// 2007-2-14
					//RetInfo[ i + ",ForceInstall"]= XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "ForceInstall" ) )
                    var ForceInstFlag = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "ForceInstall" ) )
                    // ForceInst : 0 - force install , 1 - not force install
                    // 2007-3-3
                    // RetInfo[ i + ",ForceInstall"]= ( parseInt( ForceInstFlag ) == 1 ) ? 0 : 1
                    //
                    // ForceInstFlag = 0 , 就说明驱动需要强制安装
                    RetInfo[ i + ",ForceInstall"] = ( parseInt( ForceInstFlag ) == 0 ) ? 1 : 0
                    // 2007-3-5
                    var DispatchLogicFlag = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DispatchLogic" ) )
                    RetInfo[ i + ",DispatchLogic"] = parseInt( DispatchLogicFlag ) 
                    RetInfo[ i + ",DriverHash"] = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DriverHash" ) )
                    // 2007-3-7
                    RetInfo[ i + ",DriverSize"] = GetXmlSingleNodeText( oNodeList(i).xml , "DriverSize" )
                    // 2007-3-12
                    RetInfo[ i + ",OldDrvID"] = GetXmlSingleNodeText( oNodeList(i).xml , "OldDrvID" )
                    // 2007-3-14
                    RetInfo[ i + ",DriverVer"] = GetXmlSingleNodeText( oNodeList(i).xml , "DriverVer" )


					// 将驱动简介字符串内容从BASE64编码还原
					if ( RetInfo[ i + ",DriverDesc" ] )
					{
						var CurPath = DrvCert.GetFolderPath( 32 )
						// 从"F:\Documents and Settings\Administrator.SERVER.004\Local Settings\Temporary Internet Files"转到
						// "F:\Documents and Settings\Administrator.SERVER.004\Local Settings\Temp"
						CurPath     = CurPath.substring( 0 , CurPath.lastIndexOf( "\\" ) )    // not include last "\\"
						CurPath     = CurPath + "\\Temp"
						var TmpFileName = CurPath + "\\DrvImp.TMP"
						DrvCert.DeleteFile( TmpFileName )

						DrvCert.SaveBASE64ToBinFile( RetInfo[ i + ",DriverDesc" ] , TmpFileName )
						RetInfo[ i + ",DriverDesc" ] = DrvCert.GetStringFromFile( TmpFileName )
						DrvCert.DeleteFile( TmpFileName )
					}
					RetInfo[ "Rows"     ] = i+1
				}
			}
			RetInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
			RetInfo["ErrorInfo"     ] = ""
            // 2006-9-29
            // 为解决IE死而释放对象
            xmlDoc = null
		}
		else
		{
	        RetInfo["Success"       ] = false
			RetInfo["ErrorInfo"     ] = "没有发现要找的驱动"
		}
    }
return ( RetInfo )
}
// 2006-9-26 
//
function MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )
{
    var RespXml = ""
    var xmlhttp=false;
    ///*@cc_on @*/
    ///*@if (@_jscript_version >= 5)
    // JScript gives us Conditional compilation, we can cope with old IE versions.
    // and security blocked creation of the objects.
     try 
     {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
     } 
     catch (e) 
     {
        try 
        {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        } 
        catch (E) 
        {
            xmlhttp = false;
        }
     }
    ///@end @*/
    //if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    //    try 
    //    {
    //        xmlhttp = new XMLHttpRequest();
    //    } 
    //    catch (e) 
    //    {
    //        xmlhttp=false;
    //    }
    //}

    //if (!xmlhttp && window.createRequest) {
    //    try 
    //    {
    //        xmlhttp = window.createRequest();
    //    } 
    //    catch (e) 
    //    {
    //        xmlhttp=false;
    //    }
    //}
    if ( !xmlhttp ) 
    {
        // 2006-11-11
        // alert( "XMLHttpRequest open failed" ) 
        DisplayMessage( "XMLHttpRequest open failed" ) 

        return ( null )
    }

    try
    {
        //alert( SoapApplyURL + "\n" + SoapRequestXML )

        //var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
        //xmlDoc.async = false;
        //xmlDoc.loadXML( SoapRequestXML );
        //if (!xmlDoc) return(null)

        //var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP")
//alert( "http:\/\/" + SoapApplyURL )
        xmlhttp.Open( "POST", "http:\/\/" + SoapApplyURL , false )
        //xmlhttp.setRequestHeader("e-drivers", "POST http://" + SoapApplyURL + " HTTP/1.1")
        //xmlhttp.setRequestHeader("MessageType", "CALL")
        xmlhttp.setRequestHeader("Content-Type", "text/xml-SOAP" )
        //xmlhttp.setRequestHeader("Content-Length", SoapRequestXML.length )
        //xmlhttp.onreadystatechange=function() 
        //{
        //    if (xmlhttp.readyState==4) 
        //    {
        //        alert(xmlhttp.responseText)
        //    }
        //}
//alert( SoapRequestXML )
        xmlhttp.send( SoapRequestXML )    //
        //xmlhttp.onreadystatechange=function() 
        //{
        //    if (xmlhttp.readyState==4) 
        //    {
        //        RespXml = xmlhttp.responseXML
        //    }
        //}
        RespXml = xmlhttp.responseXML
        

//alert( "status=" + xmlhttp.status + "\n" + 
//       "readyState=" + xmlhttp.readyState + "\n" + 
//       "responseXML=" + RespXml )

        //xmlhttp= null
        //xmlDoc = null
    }
    catch( err ) 
    {
        var errInfo = "XMLHttpRequest() error - " + err.description + " (0x" + err.number.toString(16) + ")"
        // 2006-11-11
        // alert( errInfo )
        DisplayMessage( errInfo ) 
    }
    if (typeof(RespXml) == "object")
		RespXml = RespXml.xml
return ( RespXml )
}
// 2006-9-27
//
//<DiskInfo>
	
//    <DiskItem>
		
//        <DiskControllerIndex>Primary</DiskControllerIndex>
		
//        <DiskIndex>Master</DiskIndex>
		
//        <DiskModel>IC25N020ATCS04-0</DiskModel>
		
//        <DiskSerialNumber>      CSH206D9CKUY0F</DiskSerialNumber>
		
//        <DiskRevision>CA2OA71A</DiskRevision>
		
//        <DiskCacheSize>1810432</DiskCacheSize>
		
//        <DiskType>Fixed</DiskType>
		
//        <DiskCylinders>16383</DiskCylinders>
		
//        <DiskHeads>16</DiskHeads>
		
//        <DiskSectorsPerTrack>63</DiskSectorsPerTrack>
		
//        <DiskSize>20003M</DiskSize>
	
//    </DiskItem>

//</DiskInfo>
//
function CheckAndModifyDiskInfo( DiskInfoXml )
{
    var NewDiskInfoXml  = ""
    NewDiskInfoXml     += "<DiskInfo>\n"

    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
    xmlDoc.async = false
    xmlDoc.loadXML( DiskInfoXml )

    // 2006-9-29
    // 将循环中的变量声明移到外面
    // 防止出现IE死的情况
    var DiskModel           = ""
    var DiskSerialNumber    = ""
    //var DiskRevision        = ""
    //var DiskRevision        = ""
    //var DiskCacheSize       = ""

    // 2006-10-4
    var DiskType            = ""

    //var DiskCylinders       = ""
    var DiskHeads           = ""
    var DiskSectorsPerTrack = ""
    var DiskSize            = ""

    var objRowDataNode = xmlDoc.selectSingleNode("\/\/DiskInfo")
    if ( objRowDataNode )
    {
        var oNodeList = objRowDataNode.childNodes;
        for (var i=0;i<oNodeList.length ; i++)
        {
        
            // 2006-9-29
            // 将循环中的变量声明移到外面
            // 防止出现IE死的情况
            // 
            DiskModel           = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DiskModel" ) )
            DiskSerialNumber    = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DiskSerialNumber" ) )

            //2008-12-29 王磊
            if(DiskSerialNumber != null && !/^[a-z0-9A-Z]+$/.exec(DiskSerialNumber)) DiskSerialNumber="0";


            //DiskRevision        = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DiskRevision" ) )
            //DiskCacheSize       = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DiskCacheSize" ) )
            
            // 2006-10-4
            DiskType            = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DiskType" ) )
            // 2006-10-4

            //DiskCylinders       = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DiskCylinders" ) )
            DiskHeads           = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DiskHeads" ) )
            DiskSectorsPerTrack = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DiskSectorsPerTrack" ) )
            DiskSize            = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DiskSize" ) )

            // 如果为0,说明该条硬盘信息无效, 就过滤掉信息
            // 2006-10-4
            if ( !DiskModel || !DiskSerialNumber || ( !DiskHeads || !DiskSectorsPerTrack.toString(10) || !DiskSize.toString(10) ) || !DiskType )
            {
                //alert( oNodeList(i).xml )
            }
            // 否则,说明当前硬盘信息有效,就合并到导出的硬盘信息xml中
            else
            {
                // 2006-10-4
                //
                //<DiskItem>

                //    <DiskControllerIndex>3</DiskControllerIndex>

                //    <DiskIndex>Master</DiskIndex>

                //    <DiskModel>ST3160023AS</DiskModel>

                //    <DiskSerialNumber>3591362063</DiskSerialNumber>

                //    <DiskCacheSize></DiskCacheSize>

                //    <DiskType>Fixed hard disk media</DiskType>

                //    <DiskCylinders>18337</DiskCylinders>

                //    <DiskHeads>255</DiskHeads>

                //    <DiskSectorsPerTrack>63</DiskSectorsPerTrack>

                //    <DiskSize>150826959360</DiskSize>

                //    <DiskTracks>4675935</DiskTracks>

                //    <DiskTracksPerCylinder>255</DiskTracksPerCylinder>

                //    <DiskPartitions>3</DiskPartitions>

                //</DiskItem>
                DiskType            = XmlDencoding( GetXmlSingleNodeText( oNodeList(i).xml , "DiskType" ) )
                // if DiskType like this : "Fixed hard disk media" but not "Fixed"
                if ( ( DiskType.toUpperCase().indexOf( "FIXED" ) != -1 ) && ( DiskType != "Fixed" ) )
                {
                    var DiskTypeXmlDoc = new ActiveXObject("Microsoft.XMLDOM")
                    DiskTypeXmlDoc.async = false
                    DiskTypeXmlDoc.loadXML( oNodeList(i).xml )

                    var DiskTypeobjNode = DiskTypeXmlDoc.selectSingleNode("\/\/DiskType" )
                    DiskTypeobjNode.text= "Fixed"
                    NewDiskInfoXml += DiskTypeXmlDoc.xml
                    DiskTypeXmlDoc = null
                }
                else
                {
                    NewDiskInfoXml += oNodeList(i).xml
                }
            }           
        
        }
    }
    else
    {
        // 如果出现问题,就不修改原来的内容
        xmlDoc = null
        return ( DiskInfoXml ) 
    }

    NewDiskInfoXml += "</DiskInfo>\n"

    xmlDoc = null

return ( NewDiskInfoXml )
}
// 2006-9-28
//
// 将修复和升级的驱动需要重启的单列出来

function ListDriverNeedRebootResult()
{
    var NeedRebootFlag = false

    if ( g_ImportedDeviceRows + g_UpdatedDeviceRows )
    {
        for (var i=0; i<g_ImportedDeviceRows ; i++)
		{
            if ( g_ImportedDeviceArray[ i + ",4"] & 0x00000100 ) 
            {
                NeedRebootFlag = true
                break
            }
        }
        for (var i=0; i<g_UpdatedDeviceRows ; i++)
		{
            if ( g_UpdatedDeviceArray[ i + ",4"] & 0x00000100 ) 
            {
                NeedRebootFlag = true
                break
            }
        }
    }
    else
    {
        return
    }
    // 如果找到了需要重启的设备
    if ( NeedRebootFlag )
    {
        var stock = new Array()

        oRow = document.createElement("TR");
        oCell = document.createElement("TD");
        oCell.colSpan= g_maxcols+1
        oCell.align = "center"
        oCell.innerHTML = "下列设备需要重新启动后生效<br><br>"
        oRow.appendChild(oCell);
        g_oTBody0.appendChild(oRow)

        if ( g_ImportedDeviceRows )
        {
            for (var i=0; i<g_ImportedDeviceRows ; i++)
            {
                ReadArrayToDeviceInfo(stock , g_ImportedDeviceArray , i)

                if ( stock[4] & 0x00000100 ) 
                {
                    var oRow,oCell;
                    oRow = document.createElement("TR");
                    g_oTBody0.appendChild(oRow);
                    oCell = document.createElement("TD");
                    oCell.innerHTML	= stock[6]
                    oCell.vAlign	="top"; 
                    oCell.align = "left";
                    oRow.appendChild(oCell);
                }
            }
        }

        
        if ( g_UpdatedDeviceRows )
        {
            for (var i=0; i<g_UpdatedDeviceRows ; i++)
            {
                ReadArrayToDeviceInfo(stock , g_UpdatedDeviceArray , i)

                if ( stock[4] & 0x00000100 ) 
                {
                    var oRow,oCell;
                    oRow = document.createElement("TR");
                    g_oTBody0.appendChild(oRow);
                    oCell = document.createElement("TD");
                    oCell.innerHTML	= stock[6]
                    oCell.vAlign	="top"; 
                    oCell.align = "left";
                    oRow.appendChild(oCell);
                }
            }
        }
    }
}
// 2006-10-6
function SetHiddenWinToTop()
{
    var handle = DrvCert.DrvFindWindow( "确认文件替换" )
    if ( handle ) DrvCert.DrvSetWindowToTop( handle )
}

// 2007-2-12
function GetDownloadDrive()
{
    // 2007-3-9
    //var MaxSpaceLeftDrive = 0x44
    //var MaxSpaceLeft = 0
    //var CurDriveFreeSpaceXml
    //var CurDrive = ""
    //var CurDriveFreeSpace = 0
    //// 最大测试10个逻辑盘的剩余空间
    //var TotalPartitions = 10
    //for ( var i=0; i<TotalPartitions; i++)
    //{
    //    CurDrive = MaxSpaceLeftDrive + i 
    //    CurDriveFreeSpaceXml = DrvCert.GetDiskFreeSpaceXml( String.fromCharCode( CurDrive ) + ":" )
    //    // 如果不存在D盘，就以C盘代替,并退出
    //    if ( ( CurDriveFreeSpaceXml.indexOf("FreeBytes") == -1 ) && i== 0 )
    //    {
    //        MaxSpaceLeftDrive = 0x43
    //        MaxSpaceLeftDrive = String.fromCharCode( MaxSpaceLeftDrive ) + ":"  // C:
    //        break
    //    }
    //    CurDriveFreeSpace = parseInt( GetXmlSingleNodeText( CurDriveFreeSpaceXml , "FreeBytes" ) )
    //    // 如果不存在当前逻辑盘，就退出，这样可以通过在光驱停止而避免枚举到USB盘
    //    if ( !CurDriveFreeSpace ) break
    //    if ( CurDriveFreeSpace > MaxSpaceLeft )
    //    {
    //        MaxSpaceLeft        = CurDriveFreeSpace
    //        MaxSpaceLeftDrive   = String.fromCharCode( CurDrive ) + ":"
    //    }
    //}
    //return ( MaxSpaceLeftDrive )

    // 2007-3-10
    //
    // 如果只有一个逻辑盘就用C盘
    var MaxSpaceLeftDrive = "C:" //0x44
    var MaxSpaceLeft = 0
    var CurDriveFreeSpaceXml
    var CurDrive = ""
    var CurDriveFreeSpace = 0
    // 2007-3-9
    var LogicalDriveInfoXml = DrvCert.GetLogicalDriveInfo()
    var DriveName = ""
    var DriveType = ""
    var CurDrive  = ""
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
    xmlDoc.async = false
    xmlDoc.loadXML( LogicalDriveInfoXml )
    var objRowDataNode = xmlDoc.selectSingleNode("\/\/DriveInfo")
    if ( objRowDataNode )
    {
        var oNodeList = objRowDataNode.childNodes;
        for (var i=0;i<oNodeList.length ; i++)
        {
            DriveName = GetXmlSingleNodeText( oNodeList(i).xml , "DriveName" )
            DriveType = GetXmlSingleNodeText( oNodeList(i).xml , "DriveType" )
            if ( DriveType == "Fixed" )
            {
                CurDrive = DriveName.substring( 0 , 1 )
                // 2007-3-10
                //
                // 先在D:以后的驱动器中查找剩余空间最大的盘,如果有C:以外的逻辑盘，就取这些盘中剩余空间最大的
                // 如果遇到C盘就先跳过去
                if ( CurDrive == "C" || CurDrive == "c" ) continue
                CurDriveFreeSpaceXml = DrvCert.GetDiskFreeSpaceXml( CurDrive + ":" )
                CurDriveFreeSpace    = parseInt( GetXmlSingleNodeText( CurDriveFreeSpaceXml , "FreeBytes" ) )
                //if ( !CurDriveFreeSpace ) break
                if ( CurDriveFreeSpace > MaxSpaceLeft )
                {
                    MaxSpaceLeft        = CurDriveFreeSpace
                    MaxSpaceLeftDrive   = CurDrive + ":"
                }
            }
        }
        xmlDoc = null
    }
return ( MaxSpaceLeftDrive )
}
// 2007-2-12
function SubmitUserDownloadDriverPath( UserID , DownloadPath )
{
    var RetInfo = new Array()
    var SoapApplyURL = ServerName.value + SoapAspURL.value		//   personal.e-drivers.cn/soap/SoapApply.asp

	var SoapRequestXML = ""
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:SetUserDownloadDriverPath xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    SoapRequestXML += "         <UserID>"           + UserID                        + "</UserID>\n"
    SoapRequestXML += "         <DownloadPath>"     + XmlEncoding( DownloadPath )   + "</DownloadPath>\n"
    SoapRequestXML += "     </n:SetUserDownloadDriverPath>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

	// 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )

	if (ReturnXML == null || ReturnXML == "")
	{
        DisplayMessage( "设置用户下载路径请求没有回应,请求内容:\n" + SoapRequestXML )
        RetInfo["Success"] = false
        RetInfo["Info"]    = "设置用户下载路径请求没有回应"
		return ( RetInfo )
	}

	var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if (ErrorInfo != null) 
	{
        RetInfo["Success"] = false
        RetInfo["Info"]    = ErrorInfo
		return ( RetInfo )
	}
	else
	{
        var Result = GetInfoByTagFromXml( ReturnXML, "Result" )
        RetInfo["Success"       ] = ( Result == "Success" ) ? true : false
        RetInfo["Info"          ] = ""
		return ( RetInfo )
	}
}
// 2007-2-13
function  CheckUserHostSerialNumber( SerialNumber )
{
	DisplayMessage("用户输入的主机序列号：" + SerialNumber )
    var RetInfo = CheckUserHostSerialNumberMethod( SerialNumber , g_UserID )
    //RetInfo["Success"       ] = ( Result == "Success" ) ? true : false
    //RetInfo["Info"          ] = ""
    if ( RetInfo["Success"] == true )
    {
        g_UserHostSerialNumber = SerialNumber
        // 当用户输入的机器序列号验证为正确时，将序列号保存到cookie中
        SetCookie( "UserHostSerialNumber" , SerialNumber )
        // 2007-2-25
    	//DisplayMessage("主机序列号验证通过")

        EnumDeviceAfter()
    }
    // 2007-3-7
    //
    // 当用户输入的序列号与以前不一样时也可以继续
    else
    {
        Title.innerHTML = "<center><br><br>" + RetInfo["Info"] + "</center>"
    }
}
function CheckUserHostSerialNumberMethod( SerialNumber , UserID )
{
    var RetInfo = new Array()
    var SoapApplyURL = ServerName.value + SoapAspURL.value		//   personal.e-drivers.cn/soap/SoapApply.asp

	var SoapRequestXML = ""
	SoapRequestXML += '<?xml version="1.0" standalone="no"?>\n'
	SoapRequestXML += '<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http:\/\/schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http:\/\/schemas.xmlsoap.org/soap/envelope/">\n'
	SoapRequestXML += "   <SOAP-ENV:Header xmlns:wsu =\"http:\/\/schemas.xmlsoap.org/ws/2002/07/utility\" "
	SoapRequestXML += "                    xmlns:wsse=\"http:\/\/schemas.xmlsoap.org/ws/2002/07/secext\" >\n"
    SoapRequestXML += GetClientInfo()
	SoapRequestXML += "   </SOAP-ENV:Header>\n"
	SoapRequestXML += "   <SOAP-ENV:Body>\n"
	SoapRequestXML += "     <n:CheckUserHostSerialNumber xmlns:n=\"http:\/\/e-drivers.cn/soap/\">\n"
    SoapRequestXML += "         <UserID>"           + UserID                        + "</UserID>\n"
    SoapRequestXML += "         <SerialNumber>"     + XmlEncoding( SerialNumber )   + "</SerialNumber>\n"
    SoapRequestXML += "     </n:CheckUserHostSerialNumber>\n"
	SoapRequestXML += "   </SOAP-ENV:Body>\n"
	SoapRequestXML += "</SOAP-ENV:Envelope>"

	// 2006-10-25
    // var ReturnXML = DrvCert.SoapClientRequest( SoapApplyURL , SoapRequestXML )
    var ReturnXML = MyXMLHttpRequest( SoapApplyURL , SoapRequestXML )

	if (ReturnXML == null || ReturnXML == "")
	{
        DisplayMessage( "校验用户主机序列号请求没有回应,请求内容:\n" + SoapRequestXML )
        RetInfo["Success"] = false
        RetInfo["Info"]    = "校验用户主机序列号请求没有回应"
		return ( RetInfo )
	}

	var ErrorInfo = GetInfoByTagFromXml( ReturnXML, SOAP_RET_ERROR_STRING_TAG )
	if (ErrorInfo != null) 
	{
        RetInfo["Success"] = false
        RetInfo["Info"]    = ErrorInfo
		return ( RetInfo )
	}
	else
	{
        var Result = GetInfoByTagFromXml( ReturnXML, "Result" )
        RetInfo["Success"       ] = ( Result == "Success" ) ? true : false
        RetInfo["Info"          ] = ""
		return ( RetInfo )
	}
}
// 2007-2-14
function ListOtherDriverForImport()
{
	//var UserChoiceUseOthersDrvFlag = ( GetCookie( "DriverType" ) != "Private" ) 
    //var UpdateSystemDrvFlag = ( GetCookie( "UpdateSystemDrvFlag" ) == "true" )

    
    //g_MatchingDeviceInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
	//g_MatchingDeviceInfo["ErrorInfo"     ] = ""
	//g_MatchingDeviceInfo[ "Rows"		  ] = i+1
	//g_MatchingDeviceInfo[ n ] = "Row" + i
	//g_MatchingDeviceInfo[ i + ",OrgRow"     ] = n / “-1”
	//g_MatchingDeviceInfo[ i + ",UserID"     ] = 
	//g_MatchingDeviceInfo[ i + ",DriverID"   ]
	//g_MatchingDeviceInfo[ i + ",DriverDate" ]
	//g_MatchingDeviceInfo[ i + ",DriverMfg"  ]
	//g_MatchingDeviceInfo[ i + ",DriverDesc" ]
    //
    // 2006-10-22
    //
	//g_MatchingDeviceInfo[ i + ",InstallOrder" ]
    //
    // 2007-2-14
    //
	//g_MatchingDeviceInfo[ i + ",ForceInstall" ]
    // 2007-2-15
    //g_MatchingDeviceInfo[ i + ",MatchDeviceClass"] = "System," + x
    //                                               = "User,"   + x
    //                                               = "Error,"  + x
    //                                               = "Other,"  + x
    //g_MatchingDeviceInfo[ i + ",ListedFlag" ] = true (或没有该参数定义)
    var MatchingDriverType = ""
    var StringArray = new Array()
    var stock1       = new Array()
    var stock2       = new Array()
    var ListCurDeviceFlag
    var strTmp       = ""

    // 2007-3-12
    //
    //// 2007-2-16
    //for (var i=0; i<g_MatchingDeviceInfo["Rows"] ; i++)
    //{
    //    // 如果这个返回的匹配驱动信息还没有使用过，就显示到其他类设备驱动中
    //    if ( !g_MatchingDeviceInfo[ i + ",ListedFlag" ] )
    //    {
    //        g_OtherDriverListNumber ++
    //    }
    //}

	// 2007-2-16
    // if ( g_MatchingDeviceInfo["Rows"] )
    // 2007-3-12
    //if ( g_OtherDriverListNumber )
	{
		var stock = new Array()

		oRow  = document.createElement("TR");
		oCell = document.createElement("TD");
		oCell.colSpan= g_maxcols
        // 2007-3-12
		//oCell.align = "center"
        // 2007-3-12
        //
        // 如果在开始就决定显示“其他设备驱动”在编码上很不方便
        // 因为其他设备驱动的统计要在后面实现，因此，这里先放一个占位符
		// oCell.innerHTML = "<br>其他设备驱动<br><br>"
        oCell.innerHTML = "<span id=ListOtherTag></span>"
        //
		oRow.appendChild(oCell);
		g_oTBody0.appendChild(oRow);

        // 2007-3-8
        var ListCurDeviceFlag  = true
        var HashValueExistFlag = false
        var hKey               = 0

        for (var i=0; i<g_MatchingDeviceInfo["Rows"]; i++)
		{
            // 如果当前值为真，就显示当前设备的内容出来(缺省为假)
            ListCurDeviceFlag = false

            oCell = document.createElement("TD");
            oCell.align="right"
            // 如果这个返回的匹配驱动信息还没有使用过，就显示到其他类设备驱动中
            if ( !g_MatchingDeviceInfo[ i + ",ListedFlag" ] )
            {
                // 有两种情况：已经经过分类 / 未经过分类
                //
                // 如果驱动已经经过分类
                if ( g_MatchingDeviceInfo[ i + ",MatchDeviceClass"] )
                {
                    ListCurDeviceFlag = true
                    StringArray = g_MatchingDeviceInfo[ i + ",MatchDeviceClass"].split( "," )

                    // 2007-3-10 <<<..................................................................
                    HashValueExistFlag = false
                    // 若设备匹配的驱动Hash值存在
                    if ( g_MatchingDeviceInfo[i+",DriverHash"] )
                    {
                        hKey = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\MyDrivers")
                        if (hKey)
                        {
                            HashValueExistFlag = DrvCert.RegQueryValue( hKey , g_MatchingDeviceInfo[i+",DriverHash"] )
                            DrvCert.RegCloseKey( hKey )
                            hKey = null
                        }    
                    }
                    // 如果驱动已经安装过，就不再显示出来；否则，就显示出来，让用户选择安装
                    ListCurDeviceFlag = ( HashValueExistFlag ) ? false : true
                    // 2007-3-10 ..................................................................>>>

                    if ( StringArray[0] == "System" )
                    {
                        TranslateDeviceInfoToArray( stock2 , g_NormalSystemDeviceInfoArray , StringArray[1] , StringArray[1] );
                        // 2007-2-28
                        PushCurDeviceInfo( g_NormalSystemDeviceInfoArray , StringArray[1] , g_DeviceForOtherListArray )
                    }
                    if ( StringArray[0] == "User" )
                    {
                        TranslateDeviceInfoToArray( stock2 , g_UserDrvDeviceInfoArray , StringArray[1] , StringArray[1] );
                        // 2007-2-28
                        PushCurDeviceInfo( g_UserDrvDeviceInfoArray , StringArray[1] , g_DeviceForOtherListArray )
                    }
                    if ( StringArray[0] == "Error" )
                    {
                        TranslateDeviceInfoToArray( stock2 , g_DevErrDeviceInfoArray , StringArray[1] , StringArray[1] );
                        // 2007-2-28
                        PushCurDeviceInfo( g_DevErrDeviceInfoArray , StringArray[1] , g_DeviceForOtherListArray )
                    }
                    // 2007-3-1
                    if ( StringArray[0] == "Other" )
                    {
                        // 2007-3-8
                        // var ListCurDeviceFlag = true
                        ListCurDeviceFlag = false
                        // 2007-3-10
                        //// 2007-3-8
                        //// var HashValueExistFlag = false
                        //HashValueExistFlag = false
                        //// 若设备匹配的驱动Hash值存在
                        //if ( g_MatchingDeviceInfo[i+",DriverHash"] )
                        //{
                        //    hKey = DrvCert.RegOpenKey( 2 , "SOFTWARE\\Walker\\MyDrivers")
                        //    if (hKey)
                        //    {
                        //        HashValueExistFlag = DrvCert.RegQueryValue( hKey , g_MatchingDeviceInfo[i+",DriverHash"] )
                        //        DrvCert.RegCloseKey( hKey )
                        //        hKey = null
                        //    }
                        //    
                        //}
                        // 若设备匹配的驱动没有在本机器上安装过
                        if (  !HashValueExistFlag )
                        {
                            // 2007-3-8
                            ListCurDeviceFlag = true
                            // 2007-3-3
                            stock2[0] = 0   // DeviceRow
                            // 2007-3-3
                            // stock2[1] = ""
                            stock2[1] = 0   // DrvInst.DeviceIndex;
                            // 2007-3-2
                            stock2[2] = 0   // 未知设备类别 - DrvInst.DeviceClassID;
                            stock2[3] = ""  // DrvInst.DeviceClassType;
                            stock2[4] = ""  // DrvInst.DeviceStatus;
                            stock2[5] = ""  // DrvInst.DeviceProblem;
                            // 2007-3-1 
                            // 见db.inc - FindDriverInDBEx() - NewDriverDesc变量定义
                            //
                            // 先去掉前面的东西
                            strTmp = g_NoMatchDeviceDriverInfoArray[ StringArray[1] + ",DriverDesc" ].replace( /\<table\>\<tr\>  \<td\>\<b\>设备\<\/b\>\<\/td\><td>/gi , "" )
                            strTmp = strTmp.substring( 0 , strTmp.indexOf("\<\/td\>") )
                            // 2007-3-14
                            // stock2[6] = strTmp      // DrvInst.DeviceName;
                            // 对强制安装的软件或驱动，在显示名称时附带软件版本（有时服务器会发布多个版本，不显示版本号这些软件的文件名会相同）
                            stock2[6] =   ( g_MatchingDeviceInfo[ i + ",DriverVer"] != "null" ) 
                                         ? strTmp + " - " + g_MatchingDeviceInfo[ i + ",DriverVer"]
                                         : strTmp
                            //
                            stock2[7] = ""          // DrvInst.BackupDriverStatus;
                            stock2[8] = ""          //DrvInst.HardwareID;
                            stock2[9] = ""          //DrvInst.CompatibleID;
                            stock2[10] = ""         //DrvInst.MatchingDeviceID
                            stock2[11] = g_MatchingDeviceInfo[ i + ",DriverDate"]         //DrvInst.DriverDate
                            stock2[12] = ""         //DrvInst.DriverVer
                            stock2[13] = g_MatchingDeviceInfo[ i + ",DriverMfg"]         //DrvInst.DriverProvider
                            stock2[14] = ""         //DrvInst.DriverInfFilename
                            // 2007-3-3
                            // stock2["CanUpdate"] = ""
                            // stock2["21"]        = ""
                            stock2["CanUpdate"] = true
                            // 如果是强制安装的，驱动缺省被选中
                            //  1 , 就说明驱动需要强制安装
                            stock2["21"]        = ( g_MatchingDeviceInfo[ i + ",ForceInstall" ] ) ? true : false

                            stock2["NewDriverID"] = g_MatchingDeviceInfo[ i + ",DriverID"]
                            stock2["DriverID"   ] = g_MatchingDeviceInfo[ i + ",DriverID"]
                            // 2007-3-3
                            stock2["NewUserID"] = g_MatchingDeviceInfo[ i + ",UserID"]
                            stock2["UserID"   ] = g_MatchingDeviceInfo[ i + ",UserID"]

                            // 2007-2-28
                            //PushCurDeviceInfo( g_NoMatchDeviceDriverInfoArray , StringArray[1] , g_DeviceForOtherListArray )
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",0"  ] = stock2[0]
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",1"  ] = stock2[1];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",2"  ] = stock2[2];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",3"  ] = stock2[3];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",4"  ] = stock2[4];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",5"  ] = stock2[5];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",6"  ] = stock2[6];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",7"  ] = stock2[7];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",8"  ] = stock2[8];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",9"  ] = stock2[9];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",10" ] = stock2[10];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",11" ] = stock2[11];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",12" ] = stock2[12];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",13" ] = stock2[13];
                            g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",14" ] = stock2[14];
                            if ( stock2["CanUpdate"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",CanUpdate" ] = stock2["CanUpdate"]    
                            if ( stock2["21"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",21" ] = stock2["21"]
                            if ( stock2["NewDriverID"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",NewDriverID" ] = stock2["NewDriverID"]
                            if ( stock2["DriverID"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",DriverID" ] = stock2["DriverID"]
                            // 2007-3-3
                            if ( stock2["NewUserID"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",NewUserID" ] = stock2["NewUserID"]
                            if ( stock2["UserID"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",UserID" ] = stock2["UserID"]
                            // 2007-3-10
                            if ( g_MatchingDeviceInfo[ i + ",DriverHash"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",DriverHash" ] = g_MatchingDeviceInfo[ i + ",DriverHash"]

                            // 2007-3-12 <<<.................................................................................................................
                            if ( g_MatchingDeviceInfo[ i + ",ForceInstall"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",ForceInstall" ] = g_MatchingDeviceInfo[ i + ",ForceInstall"]
                            if ( g_MatchingDeviceInfo[ i + ",DispatchLogic"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",DispatchLogic" ] = g_MatchingDeviceInfo[ i + ",DispatchLogic"]
                            if ( g_MatchingDeviceInfo[ i + ",DriverSize"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",DriverSize" ] = g_MatchingDeviceInfo[ i + ",DriverSize"]
                            if ( g_MatchingDeviceInfo[ i + ",OldDrvID"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",OldDrvID" ] = g_MatchingDeviceInfo[ i + ",OldDrvID"]
                            // 2007-3-14
                            if ( g_MatchingDeviceInfo[ i + ",DriverVer"] )
                                g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",DriverVer" ] = g_MatchingDeviceInfo[ i + ",DriverVer"]
                            // 2007-3-12 .................................................................................................................>>>

                            g_DeviceForOtherListArray["Rows"] ++

                            // 2007-3-2
                            stock2[2] = "<img border='0' src='img/unknown.gif'"
                                + " alt='未知设备类别' " 
                                + " width='18' height='18' "
                                + " id='img" + g_MatchingDeviceInfo[ i + ",MatchDeviceClass"] + "'" 
                                + " onMouseMove='this.style.cursor=\"help\"' "
                                + " onMoveOut=DeviceMouseMoveOutEvent('" + g_MatchingDeviceInfo[ i + ",MatchDeviceClass"] + "')" 
                                + " >" 
                        }
                        // 2007-3-3
                        //// 设置该驱动可以升级标志，并让用户选择是否升级驱动
                        //g_MatchingDeviceInfo[i+",CanUpdate"]  = true
                        //// 缺省是选择不安装
                        //g_MatchingDeviceInfo[i+",21"]         = false
                        //oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="g_MatchingDeviceInfo[' + i + '+ \',21\']=this.checked">'

                    }
                    // 2007-3-9
                    // PushCurDeviceInfo()已经增加过，下面就不用执行了
                    //g_DeviceForOtherListArray["Rows"] ++

                    // 2007-3-10
                    //
                    // 如果驱动已经安装过
                    else
                    {
                    }

                    // 2007-3-3
                    // oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="g_DeviceForOtherListArray[' + g_DeviceForOtherListArray["Rows"] + '+ \',21\']=this.checked">'
                    oCell.innerHTML =   ( stock2["21"] )
                                      ? '<INPUT TYPE="checkbox" checked onclick="g_DeviceForOtherListArray[' + ( g_DeviceForOtherListArray["Rows"]-1 ) + '+ \',21\']=this.checked">'
                                      : '<INPUT TYPE="checkbox"         onclick="g_DeviceForOtherListArray[' + ( g_DeviceForOtherListArray["Rows"]-1 ) + '+ \',21\']=this.checked">'
                    // 2007-3-12
                    // 
                    // 当当前设备的驱动需要安装时，进行下面的优化：即缺省没有选中的设备驱动不再显示出来
                    if ( ListCurDeviceFlag )
                    {
                        // 2007-3-19
                        //// ListCurDeviceFlag = ( stock2["21"] ) ? true : false;
                        ListCurDeviceFlag = ( stock2["21"] ) ? true : false;
                    }
                }
                // 2007-3-3
                // 
                // 如果驱动未过分类，这种情况永远不存在
                // 因为所有驱动匹配信息已经经过了前面的分类处理
                //
                // ***************************************    因此下面的代码永远不会得到执行     *****************************************************
                //
                //// 如果驱动没有与设备关联，说明用户更换过部件或后台驱动数据库设置程序为强制安装
                //// 就显示显示钩选框、设备名和驱动手工点击下载连接
                else
                {
                    ListCurDeviceFlag = true
                    StringArray = g_MatchingDeviceInfo[ i + ",MatchDeviceClass"].split( "," )
                    // 2007-3-3
                    // stock1[6] = g_MatchingDeviceInfo[ i + ",DriverMfg"  ]
                    var strTmp = g_NoMatchDeviceDriverInfoArray[ StringArray[1] + ",DriverDesc" ].replace( /\<table\>\<tr\>  \<td\>\<b\>设备\<\/b\>\<\/td\><td>/gi , "" )
                    strTmp = strTmp.substring( 0 , strTmp.indexOf("\<\/td\>") )
                    stock2[6] = strTmp

                    // 2007-3-3
                    //// 设置该驱动可以升级标志，并让用户选择是否升级驱动
                    //g_MatchingDeviceInfo[i+",CanUpdate"]  = true
                    //// 缺省是选择安装
                    //g_MatchingDeviceInfo[i+",21"]         = false
                    //oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="alert(' + '该驱动没有关联的设备，您只能手工下载安装该驱动' + ');return false">'
                    // 设置该驱动可以升级标志，并让用户选择是否升级驱动
                    g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",CanUpdate"]  = true
                    // 缺省是选择安装
                    g_DeviceForOtherListArray[ g_DeviceForOtherListArray["Rows"] + ",21"]         = false
                    oCell.innerHTML = '<INPUT TYPE="checkbox" onclick="g_DeviceForOtherListArray[' + g_DeviceForOtherListArray["Rows"] + '+ \',21\']=this.checked">'
                    // 2007-2-28
                    PushCurDeviceInfo( g_MatchingDeviceInfo , i , g_DeviceForOtherListArray )
                }
            }
            // 如果这个返回的匹配驱动信息已经使用过，就不再显示了
            else
            {
            }


            if ( ListCurDeviceFlag )
            {
                // 2007-3-12
                g_OtherDriverListNumber ++

                oRow = document.createElement("TR");
                g_oTBody0.appendChild(oRow);
                oRow.appendChild(oCell)

                oCell = document.createElement("TD");
                oCell.align="right"
                // 如果用户可升级的驱动有驱动简介内容
                // 就显示驱动简介按钮
                // 2007-3-19
                //oCell.innerHTML = "<img src='img/what.gif' " 
                //                + "onclick='DispMessageInfo( g_MatchingDeviceInfo[\"" + i + ",DriverDesc\"] )' " 
                //                + "onMouseMove='this.style.cursor=\"help\"' width='16' height='16' "
                //                + "alt='驱动简介，单击可查看详细内容'>"
                oCell.innerHTML = "&nbsp;"

                oRow.appendChild(oCell)
                // 2006-7-25 ..................................................................................................

                var hostname        = ServerName.value + SoapAspURL.value
                // 2007-3-12
                //var DeviceDescHtml  = "<a href='http://" + hostname + "?mode=downloaddrv&driverid=" + g_MatchingDeviceInfo[ i + ",DriverID" ] + "' alt='点击可以手工下载驱动'>" + stock2[6] + "</a>"
                var DeviceDescHtml  = "<a href='http://support.lenovo.com.cn/service/Download/Downloads/Channel/Download_Driver.asp?Content_ID=" + g_MatchingDeviceInfo[i+",OldDrvID"] + "' alt='点击可以手工下载驱动'>" + stock2[6] + "</a>"

                for (j=g_mincols; j<g_maxcols; j++)
                {
                    oCell = document.createElement("TD");
                    //oCell.innerHTML	= stock2[j];
                    (j==2)	? oCell.innerHTML = stock2[7]
                            : (j==6) ? oCell.innerHTML = stock2[2]
                                    // 2007-2-1
                                    // : (j==7) ? oCell.innerHTML = stock2[6]
                                    : (j==7) ? oCell.innerHTML = DeviceDescHtml
                                              : oCell.innerHTML = stock2[j];
                    
                    oCell.vAlign	="top"; 
                    (j==7) ? oCell.align = "left": oCell.align = "center";
                    oRow.appendChild(oCell);
                }
            }
		}
    }
    // 2007-3-12
    //
    // 如果有其他设备,就显示"其他设备驱动";否则,什么也不显示
    if ( g_OtherDriverListNumber )
    {
        // 2007-3-19
        // ListOtherTag.innerHTML = "<br><center>其他设备驱动</center><br>"
        ListOtherTag.innerHTML = "<br><center>为了帮助您更好的使用电脑，您可以选择安装下列随机说明、资料</center><br>"
    }
    // 2007-3-19
    else
    {
        // 2007-3-14
        // ListUpdateTag.innerHTML = "<li>没有驱动需要升级"
        // 2007-3-19
        // ListUpdateImportResultTag.innerHTML += "<li>没有驱动需要升级"
        ListUpdateImportResultTag.innerHTML += "<li>经检测您的电脑没有需要安装的随机说明、资料"
    }
}
// 2007-2-15
function OtherDriverImportFromServer()
{
    //g_DeviceForOtherListArray["Rows"             ] = n
    //g_DeviceForOtherListArray[ i + ",0"          ]
	//g_DeviceForOtherListArray[ i + ",1"          ]
	//g_DeviceForOtherListArray[ i + ",2"          ]
	//g_DeviceForOtherListArray[ i + ",3"          ]
	//g_DeviceForOtherListArray[ i + ",4"          ]
	//g_DeviceForOtherListArray[ i + ",5"          ]
	//g_DeviceForOtherListArray[ i + ",6"          ]
	//g_DeviceForOtherListArray[ i + ",7"          ]
	//g_DeviceForOtherListArray[ i + ",8"          ]
	//g_DeviceForOtherListArray[ i + ",9"          ]
	//g_DeviceForOtherListArray[ i + ",10"         ]
	//g_DeviceForOtherListArray[ i + ",11"         ]
	//g_DeviceForOtherListArray[ i + ",12"         ]
	//g_DeviceForOtherListArray[ i + ",13"         ]
	//g_DeviceForOtherListArray[ i + ",14"         ]
    //g_DeviceForOtherListArray[ i + ",21"         ]
    //g_DeviceForOtherListArray[ i + ",CanUpdate"  ]
    //g_DeviceForOtherListArray[ i + ",NewDriverID"]
    //g_DeviceForOtherListArray[ i + ",DriverID"   ]
    // 2007-3-3
    //g_DeviceForOtherListArray[ i + ",NewUserID"  ]
    //g_DeviceForOtherListArray[ i + ",UserID"     ]

    //g_MatchingDeviceInfo["Success"       ] = ( ResultString == "Success" ) ? true : false
	//g_MatchingDeviceInfo["ErrorInfo"     ] = ""
	//g_MatchingDeviceInfo[ "Rows"		   ] = i+1
	//g_MatchingDeviceInfo[ n ] = "Row" + i
	//g_MatchingDeviceInfo[ i + ",OrgRow"     ] = n / “-1”
	//g_MatchingDeviceInfo[ i + ",UserID"     ] = 
	//g_MatchingDeviceInfo[ i + ",DriverID"   ]
	//g_MatchingDeviceInfo[ i + ",DriverDate" ]
	//g_MatchingDeviceInfo[ i + ",DriverMfg"  ]
	//g_MatchingDeviceInfo[ i + ",DriverDesc" ]
	//g_MatchingDeviceInfo[ i + ",InstallOrder" ]
	//g_MatchingDeviceInfo[ i + ",ForceInstall" ]
    //g_MatchingDeviceInfo[ i + ",MatchDeviceClass"] = "System," + x
    //                                               = "User,"   + x
    //                                               = "Error,"  + x
    //g_MatchingDeviceInfo[ i + ",ListedFlag" ] = true (或没有该参数定义)
    var DeviceInfo	= new Array;
    var OtherDriverNeedImpNumber = 0 
    var StringArray = new Array

    // 2007-3-3
    // if ( g_MatchingDeviceInfo["Rows"] )
    if ( g_DeviceForOtherListArray["Rows"] )
	{

        Title.innerHTML = '<center>正在处理其他驱动...</center>'
                        + '<br>'
                        + '<table align=center id=PercentTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
                        + '<tr><td>'
                        + '  <IMG id="PercentImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
                        + '</td></tr></table>'
                        + '<div id=PercentString>&nbsp;</div>'
                        + '<table align=center id=PercentSubTbl width=400 bgColor=black border=0 cellSpacing=0 cellPadding=0 >'
                        + '<tr><td>'
                        + '  <IMG id="PercentSubImg" SRC="img/img.gif" WIDTH="0" HEIGHT="16" BORDER=0>'
                        + '</td></tr></table>'
                        + '<div id=PercentSubString>&nbsp;</div>'
        DrvCert.UIRefresh()

        // 2007-3-3
        // for (var i=0; i<g_MatchingDeviceInfo["Rows"] ; i++)
        //{
        //    // 如果这个返回的匹配驱动信息还没有使用过，就显示到其他类设备驱动中
        //    if ( !g_MatchingDeviceInfo[ i + ",ListedFlag" ] )
        //    {
        //        // 如果用户选择安装这个驱动
        //        if ( g_MatchingDeviceInfo[i+",21"] )
        //        {
        //            g_OtherDriverNeedImpNumber ++
        //        }
        //    }
        //}
        for (var i=0; i<g_DeviceForOtherListArray["Rows"] ; i++)
        {
            // 如果这个返回的匹配驱动信息还没有使用过，就显示到其他类设备驱动中
            // 2007-3-3
            // if ( !g_DeviceForOtherListArray[ i + ",ListedFlag" ] )
            {
                // 如果用户选择安装这个驱动
                if ( g_DeviceForOtherListArray[i+",21"] )
                {
                    g_OtherDriverNeedImpNumber ++
                }
            }
        }

        // 如果存在有问题需要修复的设备
        // 2007-3-3
        // for (var i=0; i<g_MatchingDeviceInfo["Rows"]; i++)
        for (var i=0; i<g_DeviceForOtherListArray["Rows"]; i++)
        {
            // 2007-3-3
            //// 如果这个返回的匹配驱动信息还没有使用过，就显示到其他类设备驱动中
            //if ( !g_MatchingDeviceInfo[ i + ",ListedFlag" ] )
            //{
                // 如果用户选择安装这个驱动
                // 2007-3-3
                // if ( g_MatchingDeviceInfo[i+",21"] )
                if ( g_DeviceForOtherListArray[i+",21"] )
                {
                    // 2006-9-27
                    var FinishedValue = (g_ImportedOtherDriverRows+1)/g_OtherDriverNeedImpNumber
                    FinishedValue = ( FinishedValue > 1 ) ? 1 : FinishedValue
                    PercentImg.width=PercentTbl.width*FinishedValue
                    PercentString.innerHTML = '<center>' + Math.floor(FinishedValue*100) + '%</center>'

                    // 2007-3-3
                    //StringArray = g_MatchingDeviceInfo[ i + ",MatchDeviceClass"].split( "," )
                    //if ( StringArray[0] == "System" )
                    //{
                    //    ReadArrayToDeviceInfo( DeviceInfo , g_NormalSystemDeviceInfoArray , StringArray[1]);
                    //}
                    //else if ( StringArray[0] == "User" )
                    //{
                    //    ReadArrayToDeviceInfo( DeviceInfo , g_UserDrvDeviceInfoArray , StringArray[1]);
                    //}
                    //else if ( StringArray[0] == "Error" )
                    //{
                    //    ReadArrayToDeviceInfo( DeviceInfo , g_DevErrDeviceInfoArray , StringArray[1]);
                    //}
                    //// 这种情况是不与设备关联的驱动，程序前面已经屏蔽了用户选择安装这种驱动的可能，因此，程序永远不会执行到这里
                    //else
                    //{
                    //}
                    ReadArrayToDeviceInfo( DeviceInfo , g_DeviceForOtherListArray , i );

                    // 2007-3-3
                    //
                    // 安装其他类的驱动时，不需要读取被安装驱动的设备信息，因为其他类的驱动往往是个软件而不是驱动
                    // 因此如果这时读取设备信息往往读到的是最后一个枚举设备信息，因此，这里把驱动支持信息作为安装设备信息
                    // 
                    // 导出后的设备驱动信息保存到g_ImportedOtherDriverDeviceArray数组的第g_ImportedOtherDriverRows行
                    SaveDeviceInfoToArray( DeviceInfo , g_ImportedOtherDriverDeviceArray , g_ImportedOtherDriverRows )

                    RunDriverExportToServerOpenProcess( DeviceInfo );	
                    
                    DisplayMessage("正在安装设备[" + DeviceInfo[6] + "]的驱动...");
                    // 2007-3-3
                    //var ImportResult = ImportDriverToGivenDeviceFromServer( g_MatchingDeviceInfo[ i + ",UserID"     ] , 
                    //                                                        g_MatchingDeviceInfo[ i + ",DriverID"   ] ,
                    //                                                        DeviceInfo )
                    var ImportResult = ImportDriverToGivenDeviceFromServer( g_DeviceForOtherListArray[ i + ",UserID"     ] , 
                                                                            g_DeviceForOtherListArray[ i + ",DriverID"   ] ,
                                                                            DeviceInfo )
                    // 修复后的设备信息返回到DeviceInfo

                    // 2007-3-3
                    //
                    // 移到上面了
                    //
                    //// 导出后的设备驱动信息保存到g_ImportedOtherDriverDeviceArray数组的第g_ImportedOtherDriverRows行
                    //SaveDeviceInfoToArray( DeviceInfo , g_ImportedOtherDriverDeviceArray , g_ImportedOtherDriverRows )
                    // 2007-3-3
                    // 由于安装驱动后程序自动返回设备信息到DeviceInfo，因此一定与软件安装时的信息不匹配故重新读原始设备信息
                    ReadArrayToDeviceInfo( DeviceInfo , g_DeviceForOtherListArray , i );


                    if ( ImportResult["Success"] )
                    {

                        var FinishedPercent = 100
                        PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
                        PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
                        ProcessingInfo.innerHTML = '安装驱动成功'
                        DrvCert.UIRefresh()

                        DisplayMessage( "设备[" + DeviceInfo[6] + "]的驱动安装成功" )
                        g_ImportedOtherDriverDeviceArray[ g_ImportedOtherDriverRows + ",22"] = true
                        // 2006-1-6
                        g_ImportedOtherDriverDeviceArray[ g_ImportedOtherDriverRows + ",23"] = ImportResult["Info"] + ";"
                        // 2007-3-5
                        g_ImportedOtherDriverDeviceArray[ g_ImportedOtherDriverRows + ",NewDriverID"] = g_DeviceForOtherListArray[ i + ",DriverID"   ]
                        g_ImportedSuccessDeviceRows ++
                    }
                    else
                    {
                        var FinishedPercent = 100
                        PercentSubImg.width=PercentSubTbl.width*FinishedPercent/100
                        PercentSubString.innerHTML='<center>' + FinishedPercent + '%</center>'
                        ProcessingInfo.innerHTML = '安装驱动失败'
                        DrvCert.UIRefresh()

                        DisplayMessage( "设备[" + DeviceInfo[6] + "]的驱动安装失败(原因:" + ImportResult["Info"] + ")" )
                        // 设备信息保存到g_ImportedOtherDriverDeviceArray数组的第g_ImportedOtherDriverRows行
                        g_ImportedOtherDriverDeviceArray[ g_ImportedOtherDriverRows + ",22"] = false
                        // 2006-1-6
                        g_ImportedOtherDriverDeviceArray[ g_ImportedOtherDriverRows + ",23"] = "驱动安装失败:" + ImportResult["Info"] + ";"
                        // 2007-3-5
                        g_ImportedOtherDriverDeviceArray[ g_ImportedOtherDriverRows + ",NewDriverID"] = g_DeviceForOtherListArray[ i + ",DriverID"   ]
                    }
                    g_ImportedOtherDriverRows ++
                    // 2007-2-16
                    g_ImportedOtherDriverDeviceArray["Rows"] = g_ImportedOtherDriverRows
                }
                // 如果驱动故障无法修复或用户选择不导出驱动
                else
                {
                    // 设备信息保存到g_NoImportOtherDriverDeviceArray数组的第g_NoImportOtherDriverDeviceRows行
                    SaveDeviceInfoToArray( DeviceInfo , g_NoImportOtherDriverDeviceArray , g_NoImportOtherDriverDeviceRows )
                    g_NoImportOtherDriverDeviceRows ++
                    // 2007-2-16
                    g_NoImportOtherDriverDeviceArray["Rows"] = g_NoImportOtherDriverDeviceRows
                }
                // 设备处理完毕，关闭故障设备
                RunDriverExportToServerCloseProcess( DeviceInfo )
            // 2007-3-3
            //}
        }
    }
    return true
}
// 2007-2-16
function ListOtherDriverImportedResult()
{
    //var g_OtherDriverListNumber             = 0 
    //var g_OtherDriverNeedImpNumber          = 0 
    //var g_ImportedOtherDriverRows           = 0 
    //var g_ImportedOtherDriverDeviceArray    = new Array
    //var g_NoImportOtherDriverDeviceArray    = new Array
    //var g_NoImportOtherDriverDeviceRows     = 0

    // 2006-11-9
    var stock = new Array()

    if ( g_OtherDriverListNumber )
	{
        // 2007-3-3
        // 2006-9-28 <<<..............................................................................
        //var DevNeedRebootFlag   = false
        //var DevNoNeedRebootFlag = false
        //// 算算有几个修复驱动后需要重启启动的
        //for (var i=0; i<g_ImportedOtherDriverRows ; i++)
		//{
        //    if ( g_ImportedOtherDriverDeviceArray[ i + ",4"] & 0x00000100 ) 
        //    {
        //        DevNeedRebootFlag = true
        //    }
        //    else
        //    {
        //        DevNoNeedRebootFlag = true
        //    }
        //}
        var DevNeedRebootFlag   = false
        // 安装其他类驱动缺省不需要重启
        var DevNoNeedRebootFlag = true  

        // 按成功/失败/重启来显示结果
        //
        // 如果存在不需要重新启动的设备
        if ( DevNoNeedRebootFlag )
        {
        // 2006-9-28 ..............................................................................>>>

            // 2006-9-28
            var SuccessFlag = false
            var FalseFlag   = false
            for (var i=0; i<g_ImportedOtherDriverRows ; i++)
            {
                // 2007-3-3
                //// 2006-11-9
                ////
                //// 下面筛选修复成功和失败的逻辑与后面显示时的逻辑不一致，会导致某些修复结果无法显示，因此应屏蔽此代码
                ////
                //// if ( g_ImportedDeviceArray[i+",22"] ) 
                ////
                //// 如果驱动安装后不需要重启 且 驱动安装成功 + 驱动安装后设备没有故障
                //ReadArrayToDeviceInfo(stock , g_ImportedOtherDriverDeviceArray , i)
                //if ( !( stock[4] & 0x00000100 ) && ( g_ImportedOtherDriverDeviceArray[i+",22"] && !stock[5] ) )
                //{
                //    SuccessFlag = true
                //}
                //// 2006-11-9
                //// else
                //// 如果设备修复安装驱动后不需要重启, 且驱动修复失败 , 或修复成功后设备状态仍然为有故障
                //if ( !( stock[4] & 0x00000100 ) && ( !g_ImportedOtherDriverDeviceArray[i+",22"] || ( g_ImportedOtherDriverDeviceArray[i+",22"] && stock[5]) ) )
                //{
                //    FalseFlag = true
                //}
                if ( g_ImportedOtherDriverDeviceArray[ i + ",22"] == true )
                    SuccessFlag = true
                if ( g_ImportedOtherDriverDeviceArray[ i + ",22"] == false )
                    FalseFlag = true
            }

            if ( SuccessFlag )
            {
                // 2006-11-9
                //
                // to see the function beginning defined ...
                //
                // var stock = new Array()

                oRow = document.createElement("TR");
                oCell = document.createElement("TD");
                oCell.colSpan= g_maxcols+1
                oCell.align = "center"
                // 2006-8-29
                // oCell.innerHTML = "修复驱动结果<br><br>"
                oCell.innerHTML = "安装成功<br><br>"

                oRow.appendChild(oCell);
                g_oTBody0.appendChild(oRow);


                for (var i=0; i<g_ImportedOtherDriverRows ; i++)
                {
                    if ( g_ImportedOtherDriverDeviceArray[ i + ",22"] == true )
                    {
                        ReadArrayToDeviceInfo(stock , g_ImportedOtherDriverDeviceArray , i)

                        // 如果设备有驱动备份、设备没有故障且用户选择导出该驱动
                        //if (!(stock[7] & 0x00000010) && !stock[5] && ( g_UserDrvDeviceInfoArray[i+",21"] != false) )
                        //
                        //
                        // 2006-9-29
                        // 如果驱动安装后不需要重启且驱动安装成功+驱动安装后设备没有故障
                        // 2007-3-3
                        // if ( !( stock[4] & 0x00000100 ) && ( g_ImportedOtherDriverDeviceArray[i+",22"] && !stock[5] ) )
                        {
                            var oRow,oCell;
                            oRow = document.createElement("TR");
                            g_oTBody0.appendChild(oRow);

                            // 将枚举到的设备信息 - 全局变量数组g_ImportedOtherDriverDeviceArray的第i行数组 
                            // 翻译成表格中第i行中的字符串数组形式存放到stock
                            TranslateDeviceInfoToArray( stock , g_ImportedOtherDriverDeviceArray , i ,i );

                            // 2007-3-3
                            //if (!stock[6] || stock[1]==0 ||  !stock[4] )
                            //{
                            //    stock[0] = stock[1] = stock[2] = stock[3] = stock[4] = stock[5] = stock[6] = stock[7] = "";
                            //}
                            //if ( g_ImportedOtherDriverDeviceArray[i+",22"] )
                            //{
                                var ImpDrvHtml = ""//"<img src='img/yes.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_ImportedOtherDriverDeviceArray[i+",23"] + "'>"
                            //}
                            //else
                            //{
                            //    var ImpDrvHtml = "<img src='img/err.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_ImportedOtherDriverDeviceArray[i+",23"] + "'>"
                            //     stock[6] =  stock[6].replace( /green/ig , "red" )
                            //}
                            for (j=0; j<g_maxcols; j++)
                            {

                                oCell = document.createElement("TD");
                                //oCell.innerHTML	= stock[j];
                                (j==0)? oCell.innerHTML =""
                                   :(j==1)? oCell.innerHTML = ImpDrvHtml
                                        :(j==2)	? oCell.innerHTML = stock[7]
                                            : (j==6) ? oCell.innerHTML = stock[2]
                                                 : (j==7) ? oCell.innerHTML = stock[6]
                                                          : oCell.innerHTML = stock[j];
                                
                                oCell.vAlign	="top"; 
                                if (j==7)
                                {
                                    oCell.align = "left";
                                }
                                else
                                {
                                    oCell.align = "center";
                                }
                                oRow.appendChild(oCell);
                            }
                        }
                    }
                }
            }

            if ( FalseFlag )
            {
                // 2006-11-9
                //
                // to see the function beginning defined ...
                //
                // var stock = new Array()

                oRow = document.createElement("TR");
                oCell = document.createElement("TD");
                oCell.colSpan= g_maxcols+1
                oCell.align = "center"
                // 2006-8-29
                // oCell.innerHTML = "修复驱动结果<br><br>"
                oCell.innerHTML = "<br>安装失败<br><br>"

                oRow.appendChild(oCell);
                g_oTBody0.appendChild(oRow);


                for (var i=0; i<g_ImportedOtherDriverRows ; i++)
                {
                    if ( g_ImportedOtherDriverDeviceArray[ i + ",22"] == false )
                    {
                        ReadArrayToDeviceInfo(stock , g_ImportedOtherDriverDeviceArray , i)

                        // 如果设备有驱动备份、设备没有故障且用户选择导出该驱动
                        //if (!(stock[7] & 0x00000010) && !stock[5] && ( g_UserDrvDeviceInfoArray[i+",21"] != false) )
                        //
                        // 2006-9-29
                        // 如果设备修复安装驱动后不需要重启, 且驱动修复失败 , 或修复成功后设备状态仍然为有故障
                        // 2006-10-22
                        //if ( !( stock[4] & 0x00000100 ) && ( !g_ImportedOtherDriverDeviceArray[i+",22"] || ( g_ImportedOtherDriverDeviceArray[i+",22"] && !stock[5]) ) )
                        // 2007-3-3
                        // if ( !( stock[4] & 0x00000100 ) && ( !g_ImportedOtherDriverDeviceArray[i+",22"] || ( g_ImportedOtherDriverDeviceArray[i+",22"] && stock[5]) ) )
                        //
                        {
                            var oRow,oCell;
                            oRow = document.createElement("TR");
                            g_oTBody0.appendChild(oRow);

                            // 将枚举到的设备信息 - 全局变量数组g_ImportedOtherDriverDeviceArray的第i行数组 
                            // 翻译成表格中第i行中的字符串数组形式存放到stock
                            TranslateDeviceInfoToArray( stock , g_ImportedOtherDriverDeviceArray , i ,i );

                            // 2007-3-3
                            //if (!stock[6] || stock[1]==0 ||  !stock[4] )
                            //{
                            //    stock[0] = stock[1] = stock[2] = stock[3] = stock[4] = stock[5] = stock[6] = stock[7] = "";
                            //}
                            // 2006-9-28
                            //if ( g_ImportedOtherDriverDeviceArray[i+",22"] )
                            //{
                            //    var ImpDrvHtml = "<img src='img/yes.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_ImportedOtherDriverDeviceArray[i+",23"] + "'>"
                            //}
                            //if ( !g_ImportedOtherDriverDeviceArray[i+",22"] )
                            //{
                                var ImpDrvHtml = ""//"<img src='img/err.gif' onMouseMove='this.style.cursor=\"help\"' width='16' height='16' alt='" + g_ImportedOtherDriverDeviceArray[i+",23"] + "'>"
                            //     stock[6] =  stock[6].replace( /green/ig , "red" )
                            //}
                            // 2006-9-29
                            //
                            // 如果驱动修复成功但设备状态仍然有问题
                            // 2006-11-11
                            // 一般是安装exe类驱动的情况
                            // 2006-11-11
                            // if ( g_ImportedOtherDriverDeviceArray[i+",22"] && !stock[5] ) 
                            if ( g_ImportedOtherDriverDeviceArray[i+",22"] && !g_ImportedOtherDriverDeviceArray[i+",5"] ) 
                            {
                                // 2006-10-22
                                // stock[6] += "&nbsp;&nbsp;&nbsp;修复操作成功,设备仍不可用,请尝试重启机器"
                                stock[6] += "<span style='color: green;font-style: normal;font-family: 宋体;' VALIGN='top'>"
                                          + "(安装驱动成功,设备仍不可用,请尝试重启机器)"
                                          + "</span>"
                            }
                            else if ( !g_ImportedOtherDriverDeviceArray[i+",22"] )
                            {
                                // 2006-10-22
                                stock[6] += "<span style='color: green;font-style: normal;font-family: 宋体;' VALIGN='top'>"
  