function GetDrvCopyFileList( 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["DriverProvider"]      "D-LINK"
    //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"
    var CopyFilesQueue = new Array()
    CopyFilesQueue["DevRows"] = 0


        var INFFileName     = BackupDriverInfo["DriverBackupPath"] + "\\" + BackupDriverInfo["INFName"]
        var MfgName         = BackupDriverInfo["DriverProvider"]
        var SectionName     = BackupDriverInfo["INFSectionName"]
        var SectionExtName  =   ( SectionName.search( /.nt$/i    ) != -1 ) ? ".NT"
                              : ( SectionName.search( /.ntx86$/i ) != -1 ) ? ".NTx86"
                              : ( SectionName.search( /.x86$/i   ) != -1 ) ? ".x86" 
                              : ""
        var HardwareID      = BackupDriverInfo["MatchingDeviceID"]
        var DevDesc         = BackupDriverInfo["DeviceDesc"]

        var InfHandle = DrvInf.OpenINFFile( INFFileName )
        if ( InfHandle == 0xFFFFFFFF ) 
        {
            alert( "无法打开INF文件6：" + INFFileName )
            return ( CopyFilesQueue )
        }

        CopyFilesQueue["Dev0,InfPathFileName"]  = INFFileName
        CopyFilesQueue["Dev0,InfCopyFiles"   ]  = 0

//        2005-8-9
//
//        var CatalogFile = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "CatalogFile" , 1 )
//        CopyFilesQueue["Dev0,CatFileName"]      = CatalogFile
//
//        CatalogFile = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "CatalogFile.NT" , 1 )
//        CopyFilesQueue["Dev0,NTCatFileName"]      = CatalogFile
//
//        CatalogFile = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "CatalogFile.x86" , 1 )
//        CopyFilesQueue["Dev0,x86CatFileName"]      = CatalogFile
//        
//        CatalogFile = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "CatalogFile.NTx86" , 1 )
//        CopyFilesQueue["Dev0,NTx86CatFileName"]      = CatalogFile

        var CatalogFile = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "CatalogFile" + SectionExtName , 1 )
        CopyFilesQueue["Dev0,CatFileName"]      = CatalogFile

        CopyFilesQueue["Dev0,DeviceID"]     = HardwareID
        CopyFilesQueue["Dev0,DeviceDesc"]   = DevDesc
        CopyFilesQueue["Dev0,SectionName"]  = SectionName

        var Class       = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "Class" , 1 )
        CopyFilesQueue["Dev0,DeviceClass"]  =  Class

        CopyFilesQueue["Dev0,Mfg"]          = MfgName
        
        var DriverDate   = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "DriverVer" , 1 )
        CopyFilesQueue["Dev0,Date"]         = DriverDate

        var SectionFalg             = (DrvInf.GetSectionKeyValue( InfHandle , SectionName , "" , 0 )) ? true : false
        // 2005-8-9
        CopyFilesQueue["DevRows"]  |= ( SectionFalg )   ? 1 : 0

        var CopyFileLine            = ( SectionFalg )   ? DrvInf.GetSectionKeyValue( InfHandle , SectionName, "CopyFiles" , -1 ) : ""
        var CopyFileSectionArray    = ( CopyFileLine )   ? CopyFileLine.split(",") : ""
        if ( CopyFileLine )
        {
            var CopyFileInfo = new Array()
            for (var i=0;CopyFileSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyFileSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        var CopyINFLine            = ( SectionFalg )   ? DrvInf.GetSectionKeyValue( InfHandle , SectionName, "CopyINF" , -1 ) : ""
        var CopyINFSectionArray    = ( CopyINFLine )   ? CopyINFLine.split(",") : ""
        if ( CopyINFLine )
        {
            for (var i=0;CopyINFSectionArray[i];i++)
            {   
                CopyINFSectionArray[i] = "@" + CopyINFSectionArray[i]
            }
            var CopyFileInfo = new Array()
            for (var i=0;CopyINFSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyINFSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyINFSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }

        var SectionNTFalg           = (DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NT", "" , 0 )) ? true : false
        // 2005-10-4
        CopyFilesQueue["DevRows"]  |= ( SectionNTFalg )   ? 1 : 0
        var CopyFileNTLine          = ( SectionNTFalg ) ? DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NT","CopyFiles" , -1 ) : ""
        var CopyFileNTSectionArray  = ( CopyFileNTLine ) ? CopyFileNTLine.split(",") : ""
        if ( CopyFileNTLine )
        {
            for (var i=0;CopyFileNTSectionArray[i];i++)
            {
                var CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileNTSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]  = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]  = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"] = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName + ".NT"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]=CopyFileNTSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        var CopyINFLine            = ( SectionNTFalg )   ? DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NT", "CopyINF" , -1 ) : ""
        var CopyINFSectionArray    = ( CopyINFLine )   ? CopyINFLine.split(",") : ""
        if ( CopyINFLine )
        {
            for (var i=0;CopyINFSectionArray[i];i++)
            {   
                CopyINFSectionArray[i] = "@" + CopyINFSectionArray[i]
            }
            var CopyFileInfo = new Array()
            for (var i=0;CopyINFSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyINFSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName+".NT"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyINFSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }

        var SectionNTx86Falg        = (DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NTx86" , "" , 0 )) ? true : false
        // 2005-10-4
        CopyFilesQueue["DevRows"]  |= ( SectionNTx86Falg )   ? 1 : 0
        var CopyFileNTx86Line       = (SectionNTx86Falg)? DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NTx86","CopyFiles" , -1 ) : ""
        var CopyFileNTx86SectionArray=(CopyFileNTx86Line)? CopyFileNTx86Line.split(",") : ""
        if ( CopyFileNTx86Line )
        {
            for (var i=0;CopyFileNTx86SectionArray[i];i++)
            {
                var CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileNTx86SectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]  = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]  = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"] = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName + ".NTx86"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]=CopyFileNTx86SectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        var CopyINFLine            = ( SectionNTx86Falg )   ? DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NTx86", "CopyINF" , -1 ) : ""
        var CopyINFSectionArray    = ( CopyINFLine )   ? CopyINFLine.split(",") : ""
        if ( CopyINFLine )
        {
            for (var i=0;CopyINFSectionArray[i];i++)
            {   
                CopyINFSectionArray[i] = "@" + CopyINFSectionArray[i]
            }
            var CopyFileInfo = new Array()
            for (var i=0;CopyINFSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyINFSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName+".NTx86"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyINFSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }

        var SectionFalg       = (DrvInf.GetSectionKeyValue( InfHandle , SectionName+".CoInstallers" , "" , 0 )) ? true : false
        // 2005-8-9
        CopyFilesQueue["DevRows"]  |= ( SectionFalg )   ? 1 : 0
        var CopyFileLine      = (SectionFalg)? DrvInf.GetSectionKeyValue( InfHandle , SectionName+".CoInstallers","CopyFiles" , -1 ) : ""
        var CopyFileSectionArray=(CopyFileLine)? CopyFileLine.split(",") : ""
        if ( CopyFileLine )
        {
            var CopyFileInfo = new Array()
            for (var i=0;CopyFileSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName + ".CoInstallers"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyFileSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        var CopyINFLine            = ( SectionFalg )   ? DrvInf.GetSectionKeyValue( InfHandle , SectionName+".CoInstallers", "CopyINF" , -1 ) : ""
        var CopyINFSectionArray    = ( CopyINFLine )   ? CopyINFLine.split(",") : ""
        if ( CopyINFLine )
        {
            for (var i=0;CopyINFSectionArray[i];i++)
            {   
                CopyINFSectionArray[i] = "@" + CopyINFSectionArray[i]
            }
            var CopyFileInfo = new Array()
            for (var i=0;CopyINFSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyINFSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName+".CoInstallers"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyINFSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }

        var SectionFalg       = (DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NT.CoInstallers" , "" , 0 )) ? true : false
        // 2005-10-4
        CopyFilesQueue["DevRows"]  |= ( SectionFalg )   ? 1 : 0
        var CopyFileLine      = (SectionFalg)? DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NT.CoInstallers","CopyFiles" , -1 ) : ""
        var CopyFileSectionArray=(CopyFileLine)? CopyFileLine.split(",") : ""
        if ( CopyFileLine )
        {
            var CopyFileInfo = new Array()
            for (var i=0;CopyFileSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName + ".NT.CoInstallers"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyFileSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        var CopyINFLine            = ( SectionFalg )   ? DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NT.CoInstallers", "CopyINF" , -1 ) : ""
        var CopyINFSectionArray    = ( CopyINFLine )   ? CopyINFLine.split(",") : ""
        if ( CopyINFLine )
        {
            for (var i=0;CopyINFSectionArray[i];i++)
            {   
                CopyINFSectionArray[i] = "@" + CopyINFSectionArray[i]
            }
            var CopyFileInfo = new Array()
            for (var i=0;CopyINFSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyINFSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName+".NT.CoInstallers"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyINFSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }

        var SectionFalg       = (DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NTx86.CoInstallers" , "" , 0 )) ? true : false
        // 2005-10-4
        CopyFilesQueue["DevRows"]  |= ( SectionFalg )   ? 1 : 0
        var CopyFileLine      = (SectionFalg)? DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NTx86.CoInstallers","CopyFiles" , -1 ) : ""
        var CopyFileSectionArray=(CopyFileLine)? CopyFileLine.split(",") : ""
        if ( CopyFileLine )
        {
            var CopyFileInfo = new Array()
            for (var i=0;CopyFileSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName + ".NTx86.CoInstallers"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyFileSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        var CopyINFLine            = ( SectionFalg )   ? DrvInf.GetSectionKeyValue( InfHandle , SectionName+".NTx86.CoInstallers", "CopyINF" , -1 ) : ""
        var CopyINFSectionArray    = ( CopyINFLine )   ? CopyINFLine.split(",") : ""
        if ( CopyINFLine )
        {
            for (var i=0;CopyINFSectionArray[i];i++)
            {   
                CopyINFSectionArray[i] = "@" + CopyINFSectionArray[i]
            }
            var CopyFileInfo = new Array()
            for (var i=0;CopyINFSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyINFSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = SectionName+".NTx86.CoInstallers"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyINFSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }

        var SectionFalg       = (DrvInf.GetSectionKeyValue( InfHandle , "ClassInstall32" + SectionExtName , "" , 0 )) ? true : false
        // 2005-8-9
        CopyFilesQueue["DevRows"]  |= ( SectionFalg )   ? 1 : 0
        var CopyFileLine      = (SectionFalg)? DrvInf.GetSectionKeyValue( InfHandle , "ClassInstall32" + SectionExtName,"CopyFiles" , -1 ) : ""
        var CopyFileSectionArray=(CopyFileLine)? CopyFileLine.split(",") : ""
        // [ClassInstall32]内没有CopyINF关键字
        if ( CopyFileLine )
        {
            var CopyFileInfo = new Array()
            for (var i=0;CopyFileSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = "ClassInstall32" + SectionExtName
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyFileSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }

        var SectionFalg       = (DrvInf.GetSectionKeyValue( InfHandle , "ClassInstall32.NT" , "" , 0 )) ? true : false
        // 2005-10-4
        CopyFilesQueue["DevRows"]  |= ( SectionFalg )   ? 1 : 0
        var CopyFileLine      = (SectionFalg)? DrvInf.GetSectionKeyValue( InfHandle , "ClassInstall32.NT","CopyFiles" , -1 ) : ""
        var CopyFileSectionArray=(CopyFileLine)? CopyFileLine.split(",") : ""
        if ( CopyFileLine )
        {
            var CopyFileInfo = new Array()
            for (var i=0;CopyFileSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = "ClassInstall32.NT"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyFileSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        // [ClassInstall32]内没有CopyINF关键字

        var SectionFalg       = (DrvInf.GetSectionKeyValue( InfHandle , "ClassInstall32.NTx86" , "" , 0 )) ? true : false
        // 2005-10-4
        CopyFilesQueue["DevRows"]  |= ( SectionFalg )   ? 1 : 0
        var CopyFileLine      = (SectionFalg)? DrvInf.GetSectionKeyValue( InfHandle , "ClassInstall32.NTx86","CopyFiles" , -1 ) : ""
        var CopyFileSectionArray=(CopyFileLine)? CopyFileLine.split(",") : ""
        if ( CopyFileLine )
        {
            var CopyFileInfo = new Array()
            for (var i=0;CopyFileSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = "ClassInstall32.NTx86"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyFileSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        // [ClassInstall32]内没有CopyINF关键字

        var SectionFalg       = (DrvInf.GetSectionKeyValue( InfHandle , "DefaultInstall" + SectionExtName , "" , 0 )) ? true : false
        // 2005-8-9
        CopyFilesQueue["DevRows"]  |= ( SectionFalg )   ? 1 : 0
        var CopyFileLine      = (SectionFalg)? DrvInf.GetSectionKeyValue( InfHandle , "DefaultInstall" + SectionExtName ,"CopyFiles" , -1 ) : ""
        var CopyFileSectionArray=(CopyFileLine)? CopyFileLine.split(",") : ""
        if ( CopyFileLine )
        {
            var CopyFileInfo = new Array()
            for (var i=0;CopyFileSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = "DefaultInstall" + SectionExtName
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyFileSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        var CopyINFLine            = ( SectionFalg )   ? DrvInf.GetSectionKeyValue( InfHandle , "DefaultInstall" + SectionExtName , "CopyINF" , -1 ) : ""
        var CopyINFSectionArray    = ( CopyINFLine )   ? CopyINFLine.split(",") : ""
        if ( CopyINFLine )
        {
            for (var i=0;CopyINFSectionArray[i];i++)
            {   
                CopyINFSectionArray[i] = "@" + CopyINFSectionArray[i]
            }
            var CopyFileInfo = new Array()
            for (var i=0;CopyINFSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyINFSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = "DefaultInstall" + SectionExtName
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyINFSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }

        var SectionFalg       = (DrvInf.GetSectionKeyValue( InfHandle , "DefaultInstall.NT" , "" , 0 )) ? true : false
        // 2005-10-4
        CopyFilesQueue["DevRows"]  |= ( SectionFalg )   ? 1 : 0
        var CopyFileLine      = (SectionFalg)? DrvInf.GetSectionKeyValue( InfHandle , "DefaultInstall.NT","CopyFiles" , -1 ) : ""
        var CopyFileSectionArray=(CopyFileLine)? CopyFileLine.split(",") : ""
        if ( CopyFileLine )
        {
            var CopyFileInfo = new Array()
            for (var i=0;CopyFileSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = "DefaultInstall.NT"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyFileSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        var CopyINFLine            = ( SectionFalg )   ? DrvInf.GetSectionKeyValue( InfHandle , "DefaultInstall.NT", "CopyINF" , -1 ) : ""
        var CopyINFSectionArray    = ( CopyINFLine )   ? CopyINFLine.split(",") : ""
        if ( CopyINFLine )
        {
            for (var i=0;CopyINFSectionArray[i];i++)
            {   
                CopyINFSectionArray[i] = "@" + CopyINFSectionArray[i]
            }
            var CopyFileInfo = new Array()
            for (var i=0;CopyINFSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyINFSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = "DefaultInstall.NT"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyINFSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }

        var SectionFalg       = (DrvInf.GetSectionKeyValue( InfHandle , "DefaultInstall.NTx86" , "" , 0 )) ? true : false
        // 2005-10-4
        CopyFilesQueue["DevRows"]  |= ( SectionFalg )   ? 1 : 0
        var CopyFileLine      = (SectionFalg)? DrvInf.GetSectionKeyValue( InfHandle , "DefaultInstall.NTx86","CopyFiles" , -1 ) : ""
        var CopyFileSectionArray=(CopyFileLine)? CopyFileLine.split(",") : ""
        if ( CopyFileLine )
        {
            var CopyFileInfo = new Array()
            for (var i=0;CopyFileSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyFileSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = "DefaultInstall.NTx86"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyFileSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }
        var CopyINFLine            = ( SectionFalg )   ? DrvInf.GetSectionKeyValue( InfHandle , "DefaultInstall.NTx86", "CopyINF" , -1 ) : ""
        var CopyINFSectionArray    = ( CopyINFLine )   ? CopyINFLine.split(",") : ""
        if ( CopyINFLine )
        {
            for (var i=0;CopyINFSectionArray[i];i++)
            {   
                CopyINFSectionArray[i] = "@" + CopyINFSectionArray[i]
            }
            var CopyFileInfo = new Array()
            for (var i=0;CopyINFSectionArray[i];i++)
            {
                CopyFileInfo    = GetCopyFileInfo( INFFileName , CopyINFSectionArray[i] )
                for ( var j=0;j<CopyFileInfo["Rows"];j++)
                {
                    var m = CopyFilesQueue["Dev0,InfCopyFiles"   ]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFilePath"]         = CopyFileInfo[j+",SourcePath"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileName"]         = CopyFileInfo[j+",SourceFileName"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileClass"]        = CopyFileInfo[j+",NeedUserInstFlag"]
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileRootSection"]  = "DefaultInstall.NTx86"
                    CopyFilesQueue["Dev0,CopyFile" + m + ",SourceFileSection"]      = CopyINFSectionArray[i]
                    CopyFilesQueue["Dev0,InfCopyFiles"   ] ++
                }
            }
        }

        // 2005-8-9
        //
        //CopyFilesQueue["DevRows"] ++

    // 程序执行到这里CopyFilesQueue数组中包含了要打包的驱动文件信息
    // CopyFilesQueue结构如下：
    //
    // 
    //    CopyFilesQueue["DevRows"                ] = 1
    //    --------------------------------------------------
    //    CopyFilesQueue["Dev0,InfPathFileName"   ]
    //    CopyFilesQueue["Dev0,InfCopyFiles"      ] = n+1
    //
    //    CopyFilesQueue["Dev0,CatFileName"       ]
    //    CopyFilesQueue["Dev0,NTCatFileName"     ]
    //    CopyFilesQueue["Dev0,x86CatFileName"    ]
    //    CopyFilesQueue["Dev0,NTx86CatFileName"  ]
    //    CopyFilesQueue["Dev0,DeviceID"          ]
    //    CopyFilesQueue["Dev0,DeviceDesc"        ]
    //    CopyFilesQueue["Dev0,SectionName"       ]
    //    CopyFilesQueue["Dev0,DeviceClass"       ]
    //    CopyFilesQueue["Dev0,Mfg"               ]
    //    CopyFilesQueue["Dev0,Date"              ]
    //
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFilePath"   ]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileName"   ]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileClass"  ]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileRootSection"]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileSection"]
    //        。
    //        。
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFilePath"   ]
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFileName"   ]
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFileClass"  ]
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFileSection"]
    //
    //    --------------------------------------------------
return (CopyFilesQueue)
}
function GetCopyFileInfo( INFFileName , CopyFileSectionName )
{
    var CopyFileList = new Array()
    
    //var INFFileName = InfList.options( InfList.selectedIndex ).value
    var InfHandle = DrvInf.OpenINFFile( INFFileName )
    if ( InfHandle == 0xFFFFFFFF ) 
    {
        alert( "无法打开INF文件4：" + INFFileName )
        return false
    }

    // 如果节名以@开始，说明是"@filename1"形式
    if ( CopyFileSectionName.indexOf("@") == 0 )
    {
        var FileName    = CopyFileSectionName.substr(1)
        var SourcePath  = DrvInf.GetSourceFilePath( InfHandle , FileName )
        var TargetPath  = DrvInf.GetTargetFilePath( InfHandle , "DefaultDestDir" )
        if (!TargetPath) TargetPath = "%" + DrvInf.GetSectionKeyValue( InfHandle , "DestinationDirs" ,"DefaultDestDir" , -1 ) + "%"
        CopyFileList["Rows"]                = 1
        CopyFileList["0,FileName"]          = FileName
        CopyFileList["0,SourceFileName"]    = FileName
        CopyFileList["0,SourcePath"]        = SourcePath
        CopyFileList["TargetPath"]          = TargetPath
        
        var CurInfExistDrvFileFlag = DrvInf.GetSectionKeyValue( InfHandle , "SourceDisksFiles" , FileName , 0 ) ? true : false

        // 通过打开%System%中的layout.inf等文件，查找驱动程序是否在OS自带的驱动程序中，以此判断驱动程序是"User"类型还是"System"/"Unknown"
        var MasterInfHandle = DrvInf.OpenMasterINF()
        var MasterInfExistDrvFileAFlag  = DrvInf.GetSectionKeyValue( MasterInfHandle , "SourceDisksFiles"     , FileName , 0 ) ? true : false
        var MasterInfExistDrvFileBFlag  = DrvInf.GetSectionKeyValue( MasterInfHandle , "SourceDisksFiles.x86" , FileName , 0 ) ? true : false
        DrvInf.CloseINFFile( MasterInfHandle )

        if ( CurInfExistDrvFileFlag )
        {
            CopyFileList["0,NeedUserInstFlag"] = "User"
        }
        else if ( MasterInfExistDrvFileAFlag || MasterInfExistDrvFileBFlag )
        {
            CopyFileList["0,NeedUserInstFlag"] = "System"
        }
        else
        {
            CopyFileList["0,NeedUserInstFlag"] = "Unknown"
        }
    }
    // 程序执行到这里，说明已经排除了节名的@filename的特殊形式，应该是一般的节名形式
    else
    {
        CopyFileList = GetCopyFileList( INFFileName , CopyFileSectionName )
        for (var i=0;i<CopyFileList["Rows"];i++)
        {
            var SourcePath  = DrvInf.GetSourceFilePath( InfHandle , CopyFileList[i+",SourceFileName"] )
            CopyFileList[i+",SourcePath"] = SourcePath
        }
        var TargetPath  = DrvInf.GetTargetFilePath( InfHandle , CopyFileSectionName )
        if (!TargetPath) TargetPath = "%" + DrvInf.GetSectionKeyValue( InfHandle , "DestinationDirs" ,"DefaultDestDir" , -1 ) + "%"
        CopyFileList["TargetPath"] = TargetPath
    }
    DrvInf.CloseINFFile( InfHandle )
// 如果节名是"@filename1"形式，返回以下内容：
//
//CopyFileList["TargetPath"]
//CopyFileList["Rows"] = 1
//
//CopyFileList["0,FileName"]
//CopyFileList["0,SourceFileName"]
//CopyFileList["0,SourcePath"]
//CopyFileList["0,NeedUserInstFlag"] = User / System / Unknown
//
// 如果节名是一般节名形式，返回以下内容：
//
//CopyFileList["TargetPath"]
//CopyFileList["Rows"] = n+1
//
//CopyFileList["0,FileName"]
//CopyFileList["0,SourceFileName"]
//CopyFileList["0,SourcePath"]
//CopyFileList["0,NeedUserInstFlag"]
//    。
//    。
//    。
//CopyFileList["n,FileName"]
//CopyFileList["n,SourceFileName"]
//CopyFileList["n,SourcePath"]
//CopyFileList["n,NeedUserInstFlag"]
return ( CopyFileList )
}
function GetCopyFileList( INFFileName , CopyFileSectionName )
{
    var FileList = new Array()
    //var INFFileName = InfList.options( InfList.selectedIndex ).value
    var InfHandle = DrvInf.OpenINFFile( INFFileName )
    if ( InfHandle == 0xFFFFFFFF ) 
    {
        alert( "无法打开INF文件5：" + INFFileName )
        return false
    }
    
    var InfContext = DrvInf.FindFirstLineInSection( InfHandle , CopyFileSectionName , "" )
    if ( !InfContext ) 
    {
        FileList["Rows"] = 0
        //alert( "打开INF文件" + INFFileName + "节[" + CopyFileSectionName + "]失败" )
        return (FileList)
    }
    var i=0
    do
    {
        var FileName        = DrvInf.GetFieldValueInLine( InfContext ,  1 )
        var SourceFileName  = DrvInf.GetFieldValueInLine( InfContext ,  2 )
        if ( !SourceFileName) SourceFileName = FileName

        FileList[i+",FileName"] = FileName
        FileList[i+",SourceFileName"] = SourceFileName

        var SourceDisksFileName = DrvInf.GetSectionKeyValue( InfHandle , "SourceDisksFiles" , SourceFileName , 0 )
        var CurInfExistDrvFileFlag = ( SourceDisksFileName != "" ) ? true : false
        if ( !CurInfExistDrvFileFlag )
        {
            SourceDisksFileName = DrvInf.GetSectionKeyValue( InfHandle , "SourceDisksFiles.x86" , SourceFileName , 0 )
            CurInfExistDrvFileFlag = ( SourceDisksFileName != "" ) ? true : false
        }

        var MasterInfHandle = DrvInf.OpenMasterINF()
        var MasterInfExistDrvFileAFlag  = DrvInf.GetSectionKeyValue( MasterInfHandle , "SourceDisksFiles"     , FileName , 0 ) ? true : false
        var MasterInfExistDrvFileBFlag  = DrvInf.GetSectionKeyValue( MasterInfHandle , "SourceDisksFiles.x86" , FileName , 0 ) ? true : false
        DrvInf.CloseINFFile( MasterInfHandle )

        if ( CurInfExistDrvFileFlag )
        {
            FileList[i+",NeedUserInstFlag"] = "User"
        }
        else if ( MasterInfExistDrvFileAFlag || MasterInfExistDrvFileBFlag )
        {
            FileList[i+",NeedUserInstFlag"] = "System"
        }
        else
        {
            FileList[i+",NeedUserInstFlag"] = "Unknown"
        }
        
        i++
        FileList["Rows"] = i

        InfContext = DrvInf.FindNextLineInSection( InfContext )
    }
    while( InfContext )
    DrvInf.CloseINFFile( InfHandle )
return ( FileList )
}
function ChangeDrvCopyFilesQueueToInfCopyFilesQueue( CopyFilesQueue )
{
    // CopyFilesQueue结构如下：
    //
    // 
    //    CopyFilesQueue["DevRows"                ] = m+1
    //    --------------------------------------------------
    //    CopyFilesQueue["Dev0,InfPathFileName"   ]
    //    CopyFilesQueue["Dev0,InfCopyFiles"      ] = n+1
    //
    //    CopyFilesQueue["Dev0,CatFileName"       ]
    //    CopyFilesQueue["Dev0,NTCatFileName"     ]
    //    CopyFilesQueue["Dev0,x86CatFileName"    ]
    //    CopyFilesQueue["Dev0,NTx86CatFileName"  ]
    //    CopyFilesQueue["Dev0,DeviceID"          ]
    //    CopyFilesQueue["Dev0,DeviceDesc"        ]
    //    CopyFilesQueue["Dev0,SectionName"       ]
    //    CopyFilesQueue["Dev0,DeviceClass"       ]
    //    CopyFilesQueue["Dev0,Mfg"               ]
    //    CopyFilesQueue["Dev0,Date"              ]
    //
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFilePath"   ]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileName"   ]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileClass"  ]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileSection"]
    //        。
    //        。
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFilePath"   ]
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFileName"   ]
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFileClass"  ]
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFileSection"]
    //
    //    --------------------------------------------------
    //        。
    //        。
    //        。
    //        。
    //    --------------------------------------------------
    //    CopyFilesQueue["Devm,InfPathFileName"   ]
    //    CopyFilesQueue["Devm,InfCopyFiles"      ] = k+1
    //
    //    CopyFilesQueue["Devm,CatFileName"       ]
    //    CopyFilesQueue["Devm,NTCatFileName"     ]
    //    CopyFilesQueue["Devm,x86CatFileName"    ]
    //    CopyFilesQueue["Devm,NTx86CatFileName"  ]
    //    CopyFilesQueue["Devm,DeviceID"          ]
    //    CopyFilesQueue["Devm,DeviceDesc"        ]
    //    CopyFilesQueue["Devm,SectionName"       ]
    //    CopyFilesQueue["Devm,DeviceClass"       ]
    //    CopyFilesQueue["Devm,Mfg"               ]
    //    CopyFilesQueue["Devm,Date"              ]
    //
    //    CopyFilesQueue["Devm,CopyFile0,SourceFilePath"   ]
    //    CopyFilesQueue["Devm,CopyFile0,SourceFileName"   ]
    //    CopyFilesQueue["Devm,CopyFile0,SourceFileClass"  ]
    //    CopyFilesQueue["Devm,CopyFile0,SourceFileSection"]
    //        。
    //        。
    //    CopyFilesQueue["Devm,CopyFilek,SourceFilePath"   ]
    //    CopyFilesQueue["Devm,CopyFilek,SourceFileName"   ]
    //    CopyFilesQueue["Devm,CopyFilek,SourceFileClass"  ]
    //    CopyFilesQueue["Devm,CopyFilek,SourceFileSection"]
    //    --------------------------------------------------
    //      

    
    // 检查
    // [] 选择的OS平台（不选OS平台和全选是一样的）与选择的设备驱动之间是否矛盾；
    // [] 设备驱动是否缺少文件而导致整个驱动包无法使用

    // 将CopyFilesQueue进行预处理，去掉冗余信息（即重复文件信息，包括INF和所有驱动文件），
    // 得到一个每个驱动程序文件唯一的、要打包驱动文件信息数组CopyFilesUniqueQueue
    var CopyFilesUniqueQueue = new Array()
    CopyFilesUniqueQueue["InfRows"] = 0

    for (var i=0;i<CopyFilesQueue["DevRows"];i++)
    {
        // 有时驱动程序包只有一个INF文件（或者还包括一个CAT文件），
        // 此时CopyFilesQueue["Dev" + i + ",InfCopyFiles"]=0
        // 为了可以把这个单独的INF文件打包，j必须使j<=0(j<=...)，
        //  CopyFilesQueue["Dev0,InfPathFileName"]、CopyFilesQueue["Dev0,CatFileName"]这些信息才会被处理
        for (var j=0;j<=CopyFilesQueue["Dev" + i + ",InfCopyFiles"];j++)
        {
            var InfExistFlag     = false

            for (var k=0;k<CopyFilesUniqueQueue["InfRows"];k++)
            {
                if ( !CopyFilesUniqueQueue["Inf" + k + ",InfPathFileName"] ) continue
                // 如果当前设备驱动的INF文件已经加入队列
                if ( CopyFilesUniqueQueue["Inf" + k + ",InfPathFileName"].toUpperCase() == CopyFilesQueue["Dev" + i + ",InfPathFileName"].toUpperCase() )
                {
                    InfExistFlag = true
                    // 
                    var DrvFileExistFlag = false
                    for (var l=0;l<CopyFilesUniqueQueue["Inf" + k + ",InfCopyFiles"] ;l++)
                    {
                        // 如果该值不存在
                        if ( !CopyFilesUniqueQueue["Inf" + k + ",CopyFile" + l + ",SourceFileName"] ) continue
                        var InfCopyFileName = CopyFilesUniqueQueue["Inf" + k + ",CopyFile" + l + ",SourceFileName"]
                        var DrvCopyFileName = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFileName"]
                        // 如果驱动文件不存在
                        //   （比如CopyFilesQueue["Dev0,InfCopyFiles"]是3，此时j=3,CopyFilesQueue["Dev0,CopyFile3,SourceFileName"]为"undefined"，
                        //    这种情况下就视为驱动文件已经处理过就可以拉）
                        if (!InfCopyFileName || !DrvCopyFileName ) 
                        {
                            DrvFileExistFlag = true
                            break
                        }
                        // 如果当前设备驱动的驱动文件已经加入队列
                        if (  InfCopyFileName.toUpperCase() == DrvCopyFileName.toUpperCase() ) 
                        {
                            DrvFileExistFlag = true
                            break
                        }
                    }
                    // 在队列中没有发现当前设备的驱动文件，就将其加入队列
                    if ( !DrvFileExistFlag && CopyFilesQueue["Dev" + i + ",InfCopyFiles"] )
                    {
                        var z = CopyFilesUniqueQueue["Inf" + k + ",InfCopyFiles"]
                        CopyFilesUniqueQueue["Inf" + k + ",CopyFile" + z + ",SourceFileName"]           = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFileName"]
                        CopyFilesUniqueQueue["Inf" + k + ",CopyFile" + z + ",SourceFilePath"]           = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFilePath"]
                        CopyFilesUniqueQueue["Inf" + k + ",CopyFile" + z + ",SourceFileClass"]          = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFileClass"]
                        CopyFilesUniqueQueue["Inf" + k + ",CopyFile" + z + ",SourceFileRootSection"]    = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFileRootSection"]
                        CopyFilesUniqueQueue["Inf" + k + ",CopyFile" + z + ",SourceFileSection"]        = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFileSection"]
                        CopyFilesUniqueQueue["Inf" + k + ",InfCopyFiles"] ++
                    }
                }
            }
            // 在队列中没有发现当前设备的INF文件，就将其加入队列
            if ( !InfExistFlag )
            {
                var x = CopyFilesUniqueQueue["InfRows"]
                CopyFilesUniqueQueue["Inf" + x + ",InfPathFileName"]     = CopyFilesQueue["Dev" + i + ",InfPathFileName"]

                CopyFilesUniqueQueue["Inf" + x + ",CatFileName"]         = CopyFilesQueue["Dev" + i + ",CatFileName"]
                if ( CopyFilesQueue["Dev" + i + ",NTCatFileName"] )
                    CopyFilesUniqueQueue["Inf" + x + ",NTCatFileName"]   = CopyFilesQueue["Dev" + i + ",NTCatFileName"]
                if ( CopyFilesQueue["Dev" + i + ",x86CatFileName"] )
                    CopyFilesUniqueQueue["Inf" + x + ",x86CatFileName"]  = CopyFilesQueue["Dev" + i + ",x86CatFileName"]
                if ( CopyFilesQueue["Dev" + i + ",NTx86CatFileName"] )
                    CopyFilesUniqueQueue["Inf" + x + ",NTx86CatFileName"]= CopyFilesQueue["Dev" + i + ",NTx86CatFileName"]

                    CopyFilesUniqueQueue["Inf" + x + ",DeviceClass"]     = CopyFilesQueue["Dev" + i + ",DeviceClass"]
                    CopyFilesUniqueQueue["Inf" + x + ",Mfg"]             = CopyFilesQueue["Dev" + i + ",Mfg"]
                    CopyFilesUniqueQueue["Inf" + x + ",Date"]            = CopyFilesQueue["Dev" + i + ",Date"]

                CopyFilesUniqueQueue["Inf" + x + ",InfCopyFiles"]    = 0
                
                if (  CopyFilesQueue["Dev" + i + ",InfCopyFiles"] )
                {
                    CopyFilesUniqueQueue["Inf" + x + ",CopyFile0,SourceFileName"]           = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFileName"]
                    CopyFilesUniqueQueue["Inf" + x + ",CopyFile0,SourceFilePath"]           = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFilePath"]
                    CopyFilesUniqueQueue["Inf" + x + ",CopyFile0,SourceFileClass"]          = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFileClass"]
                    CopyFilesUniqueQueue["Inf" + x + ",CopyFile0,SourceFileRootSection"]    = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFileRootSection"]
                    CopyFilesUniqueQueue["Inf" + x + ",CopyFile0,SourceFileSection"]        = CopyFilesQueue["Dev" + i + ",CopyFile" + j + ",SourceFileSection"]

                    CopyFilesUniqueQueue["Inf" + x + ",InfCopyFiles"] ++
                }
                CopyFilesUniqueQueue["InfRows"] ++
            }
        }
    }
    // 程序执行到这里CopyFilesUniqueQueue数组中包含了要打包的驱动文件信息
    // CopyFilesUniqueQueue结构如下：
    //
    // 
    //    CopyFilesUniqueQueue["InfRows"                ] = 1
    //    --------------------------------------------------
    //    CopyFilesUniqueQueue["Inf0,CatFileName"       ]
    //    CopyFilesUniqueQueue["Inf0,NTCatFileName"     ]
    //    CopyFilesUniqueQueue["Inf0,x86CatFileName"    ]
    //    CopyFilesUniqueQueue["Inf0,NTx86CatFileName"  ]
    //    CopyFilesUniqueQueue["Inf0,DeviceClass"       ]
    //    CopyFilesUniqueQueue["Inf0,Mfg"               ]
    //    CopyFilesUniqueQueue["Inf0,Date"              ]
    //
    //    CopyFilesUniqueQueue["Inf0,InfPathFileName"   ]
    //    CopyFilesUniqueQueue["Inf0,InfCopyFiles"      ] = n+1
    //
    //    CopyFilesUniqueQueue["Inf0,CopyFile0,SourceFilePath"   ]
    //    CopyFilesUniqueQueue["Inf0,CopyFile0,SourceFileName"   ]
    //    CopyFilesUniqueQueue["Inf0,CopyFile0,SourceFileClass"  ]
    //    CopyFilesUniqueQueue["Inf0,CopyFile0,SourceFileSection"]
    //        。
    //        。
    //    CopyFilesUniqueQueue["Inf0,CopyFilen,SourceFilePath"   ]
    //    CopyFilesUniqueQueue["Inf0,CopyFilen,SourceFileName"   ]
    //    CopyFilesUniqueQueue["Inf0,CopyFilen,SourceFileClass"  ]
    //    CopyFilesUniqueQueue["Inf0,CopyFilen,SourceFileSection"]
    //
    //    --------------------------------------------------
return ( CopyFilesUniqueQueue )
}
function CheckExportDriverValidity( 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["DriverProvider"]      "D-LINK"
    //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"

    var CopyFilesQueue = GetDrvCopyFileList( BackupDriverInfo )

    // 2006-12-29
    //DisplayMessage( "有" + CopyFilesQueue["DevRows"] + "个Inf文件,有" + CopyFilesQueue["Dev0,InfCopyFiles"] + "个CopyFiles" )

    //    CopyFilesQueue["DevRows"                ] = 1
    //    --------------------------------------------------
    //    CopyFilesQueue["Dev0,InfPathFileName"   ]
    //    CopyFilesQueue["Dev0,InfCopyFiles"      ] = n+1
    //
    //    CopyFilesQueue["Dev0,CatFileName"       ]
    //    CopyFilesQueue["Dev0,NTCatFileName"     ]
    //    CopyFilesQueue["Dev0,x86CatFileName"    ]
    //    CopyFilesQueue["Dev0,NTx86CatFileName"  ]
    //    CopyFilesQueue["Dev0,DeviceID"          ]
    //    CopyFilesQueue["Dev0,DeviceDesc"        ]
    //    CopyFilesQueue["Dev0,SectionName"       ]
    //    CopyFilesQueue["Dev0,DeviceClass"       ]
    //    CopyFilesQueue["Dev0,Mfg"               ]
    //    CopyFilesQueue["Dev0,Date"              ]
    //
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFilePath"   ]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileName"   ]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileClass"  ]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileRootSection"]
    //    CopyFilesQueue["Dev0,CopyFile0,SourceFileSection"]
    //        。
    //        。
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFilePath"   ]
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFileName"   ]
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFileClass"  ]
    //    CopyFilesQueue["Dev0,CopyFilen,SourceFileSection"]
    if ( !CopyFilesQueue["DevRows"] )
    {
        return "驱动程序包不完整或无法使用"
    }
    // 将以设备为标识的驱动信息队列转换为以INF为标识的驱动信息队列
    // “设备为标识的驱动信息”与“INF为标识的驱动信息”有以下关系：
    // 一个INF驱动包中可能包含了多个OS平台下的多个设备的驱动程序，而通过选择其中若干OS平台下的若干个设备这种方式
    // 发布驱动程序包，可以简化INF表示的该驱动程序包。比如：INF文件A.INF说明了98和NT两个平台下的Dev1和Dev2两个设备的
    // 驱动，通过本程序，可以选择只发布该驱动程序包中的98平台的Dev1设备的驱动程序，这样就大大简化了驱动程序。
    var CopyFilesUniqueQueue = ChangeDrvCopyFilesQueueToInfCopyFilesQueue( CopyFilesQueue )
    //    CopyFilesUniqueQueue["InfRows"                ] = 1
    //    --------------------------------------------------
    //    CopyFilesUniqueQueue["Inf0,CatFileName"       ]
    //    CopyFilesUniqueQueue["Inf0,NTCatFileName"     ]
    //    CopyFilesUniqueQueue["Inf0,x86CatFileName"    ]
    //    CopyFilesUniqueQueue["Inf0,NTx86CatFileName"  ]
    //    CopyFilesUniqueQueue["Inf0,DeviceClass"       ]
    //    CopyFilesUniqueQueue["Inf0,Mfg"               ]
    //    CopyFilesUniqueQueue["Inf0,Date"              ]
    //
    //    CopyFilesUniqueQueue["Inf0,InfPathFileName"   ]
    //    CopyFilesUniqueQueue["Inf0,InfCopyFiles"      ] = n+1
    //
    //    CopyFilesUniqueQueue["Inf0,CopyFile0,SourceFilePath"   ]
    //    CopyFilesUniqueQueue["Inf0,CopyFile0,SourceFileName"   ]
    //    CopyFilesUniqueQueue["Inf0,CopyFile0,SourceFileClass"  ]
    //    CopyFilesUniqueQueue["Inf0,CopyFile0,SourceFileSection"]
    //        。
    //        。
    //    CopyFilesUniqueQueue["Inf0,CopyFilen,SourceFilePath"   ]
    //    CopyFilesUniqueQueue["Inf0,CopyFilen,SourceFileName"   ]
    //    CopyFilesUniqueQueue["Inf0,CopyFilen,SourceFileClass"  ]
    //    CopyFilesUniqueQueue["Inf0,CopyFilen,SourceFileSection"]
    //
    //    --------------------------------------------------

    // 2006-12-29
    //DisplayMessage( "有" + CopyFilesUniqueQueue["InfRows"] + "个Inf文件,有" + CopyFilesUniqueQueue["Inf0,InfCopyFiles"] + "个CopyFiles文件" )

    var DrvFileErrorString = ""
    // 查找数组中每个文件是否存在（System可以只说明不出现在驱动程序包中，因为OS会在系统驱动程序文件包中查找它）
    for (var i=0;i<CopyFilesUniqueQueue["InfRows"];i++)
    {
        var missingFileFlag = false

        // 取驱动程序目录
        var pathLen = CopyFilesUniqueQueue["Inf" + i + ",InfPathFileName"].lastIndexOf("\\")+1// +1 : 包括"\"
        var InfFilePath   = CopyFilesUniqueQueue["Inf" + i + ",InfPathFileName"].substring( 0 , pathLen )
        var InfFileDriver = CopyFilesUniqueQueue["Inf" + i + ",InfPathFileName"].substring( 0 , 2 )

        // 2006-12-29
        //DisplayMessage( "Inf文件有" + CopyFilesUniqueQueue["Inf" + i + ",InfCopyFiles"] + "个CopyFiles文件" )

        for (var j=0;j<CopyFilesUniqueQueue["Inf" + i + ",InfCopyFiles"];j++)
        {
            var DrvClass = CopyFilesUniqueQueue["Inf" + i + ",CopyFile" + j + ",SourceFileClass"]
            // 2006-12-29
            //DisplayMessage( "CopyFiles文件Class=" + DrvClass + ",SrcName=" + CopyFilesUniqueQueue["Inf" + i + ",CopyFile" + j + ",SourceFileName"] )

            if ( DrvClass == "User" )// also means : if ( DrvClass != "System"  && DrvClass != "Unknown" ) 
            {
                var DrvFilePath = ""
                // 如果驱动文件路径是以"\"开头
                if ( CopyFilesUniqueQueue["Inf" + i + ",CopyFile" + j + ",SourceFilePath"].indexOf("\\") == 0 )
                {   // "f:" + "\x86" + "\"
                    var DrvSubDir = CopyFilesUniqueQueue["Inf" + i + ",CopyFile" + j + ",SourceFilePath"]
                    DrvSubDir = ( DrvSubDir.length == 1 ) ? "\\" : DrvSubDir + "\\"
                    DrvFilePath = InfFileDriver + DrvSubDir
                }
                else
                {   // "f:\D-LINK\" + "x86" + "\"
                    var DrvSubDir = CopyFilesUniqueQueue["Inf" + i + ",CopyFile" + j + ",SourceFilePath"]
                    DrvSubDir = DrvSubDir ? DrvSubDir + "\\" : ""
                    DrvFilePath = InfFilePath + DrvSubDir
                }


                var DrvFilePathFileName = DrvFilePath + CopyFilesUniqueQueue["Inf" + i + ",CopyFile" + j + ",SourceFileName"]
                // 2006-12-29
                //DisplayMessage( "正在查找:" + DrvFilePathFileName + "..." )

                var DrvFileNameXml = DrvCert.FindFileInPath( DrvFilePathFileName )
                var DrvFileName = GetXmlSingleNodeText( DrvFileNameXml , "FileItem0" )
                if ( !DrvFileName )
                {
                    if ( !missingFileFlag )
                    {

                        // 2006-12-25 <<<.....................................................
                        //
                        //DrvFileErrorString  += "" + CopyFilesUniqueQueue["Inf" + i + ",InfPathFileName"] + "指示缺少下列文件：\n"
                        //DrvFileErrorString  += "" + DrvFilePath + CopyFilesUniqueQueue["Inf" + i + ",CopyFile" + j + ",SourceFileName"] + ";\n"
                        //missingFileFlag     = true
                        //
                        // 若找不到文件，再匹配是否是.sy_这样的微软压缩格式文件的情况
                        var UnderLineDrvFilePathFileName = DrvFilePathFileName.substring( 0 , DrvFilePathFileName.length - 1 ) + "_"
                        // 2006-12-29
                        //DisplayMessage( "正在查找:" + UnderLineDrvFilePathFileName + "..." )

                        DrvFileNameXml = DrvCert.FindFileInPath( UnderLineDrvFilePathFileName )
                        DrvFileName = GetXmlSingleNodeText( DrvFileNameXml , "FileItem0" )
                        if ( DrvFileName )
                        {
                            // 2006-12-29
                            //DisplayMessage( "找到:" + UnderLineDrvFilePathFileName + "" )
                        }
                        else
                        {
                            // 2006-12-30
                            //
                            // 如果文件不是.sys->.sy_的形式，还要检查是否是.ax->.ax_的情况
                            UnderLineDrvFilePathFileName = DrvFilePathFileName.substring( 0 , DrvFilePathFileName.length ) + "_"
                            DrvFileNameXml = DrvCert.FindFileInPath( UnderLineDrvFilePathFileName )
                            DrvFileName = GetXmlSingleNodeText( DrvFileNameXml , "FileItem0" )
                            if ( !DrvFileName )
                            {
                                DrvFileErrorString  += "" + CopyFilesUniqueQueue["Inf" + i + ",InfPathFileName"] + "指示缺少下列文件：\n"
                                DrvFileErrorString  += "" + DrvFilePath + CopyFilesUniqueQueue["Inf" + i + ",CopyFile" + j + ",SourceFileName"] + ";\n"
                                missingFileFlag     = true
                            }
                            //
                            // 2006-12-30
                        }
                        //
                        // 2006-12-25 ....................................................>>>

                    }
                    else
                    {
                        // 2006-12-30
                        //
                        // 这种情况会只以第一个驱动文件的是否存在为所有文件是否存在的依据
                        //
                        //DrvFileErrorString  += "" + DrvFilePath + CopyFilesUniqueQueue["Inf" + i + ",CopyFile" + j + ",SourceFileName"] + ";\n"
                        //// 2006-12-29
                        ////DisplayMessage( "查找:" + DrvFilePathFileName + "失败" )

                        // 2006-12-30
                        //
                        // 若找不到文件，再匹配是否是.sy_这样的微软压缩格式文件的情况
                        var UnderLineDrvFilePathFileName = DrvFilePathFileName.substring( 0 , DrvFilePathFileName.length - 1 ) + "_"
                        DrvFileNameXml = DrvCert.FindFileInPath( UnderLineDrvFilePathFileName )
                        DrvFileName = GetXmlSingleNodeText( DrvFileNameXml , "FileItem0" )
                        if ( !DrvFileName )
                        {
                            // 如果文件不是.sys->.sy_的形式，还要检查是否是.ax->.ax_的情况
                            UnderLineDrvFilePathFileName = DrvFilePathFileName.substring( 0 , DrvFilePathFileName.length ) + "_"
                            DrvFileNameXml = DrvCert.FindFileInPath( UnderLineDrvFilePathFileName )
                            DrvFileName = GetXmlSingleNodeText( DrvFileNameXml , "FileItem0" )
                            if ( !DrvFileName )
                            {
                                DrvFileErrorString  += "" + DrvFilePath + CopyFilesUniqueQueue["Inf" + i + ",CopyFile" + j + ",SourceFileName"] + ";\n"
                                // 2006-12-29
                                //DisplayMessage( "查找:" + DrvFilePathFileName + "失败" )
                            }
                        }
                        //
                        // 2006-12-25 ....................................................>>>
                    }
                }
            }
        }
    }

    return  DrvFileErrorString 
}
function GetAllSourceFileListFromINF( INFPathFilename )
{
    var FileList = new Array()
    var INFPath = INFPathFilename.substring( 0 , INFPathFilename.lastIndexOf("\\") )
    //var INFFileName = InfList.options( InfList.selectedIndex ).value
    var InfHandle = DrvInf.OpenINFFile( INFPathFilename )
    if ( InfHandle == 0xFFFFFFFF ) 
    {
        FileList["Success"] = false
        FileList["Info"   ] = "无法打开INF文件5：" + INFPathFilename
        return ( FileList )
    }
    try
    {
        FileList["Rows"   ] = 1
        FileList[0]         = INFPathFilename

        var CatalogFile = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "CatalogFile" , 1 )
        if ( !CatalogFile )
            CatalogFile = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "CatalogFile.NT" , 1 )
        if ( !CatalogFile )
            CatalogFile = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "CatalogFile.x86" , 1 )
        if ( !CatalogFile )
            CatalogFile = DrvInf.GetSectionKeyValue( InfHandle , "Version" , "CatalogFile.NTx86" , 1 )
        if ( CatalogFile )
        {
            FileList["Rows"   ] = 2
            FileList[1]         = INFPath + "\\" + CatalogFile
        }

        var InfContext = DrvInf.FindFirstLineInSection( InfHandle , "SourceDisksFiles" , "" )
        if ( InfContext == 0) 
        {
            FileList["Success"] = true
            FileList["Info"   ] = ""
            return (FileList)
        }
        var i=FileList["Rows"]
        do
        {
            var FileName  = DrvInf.GetFieldValueInLine( InfContext ,  0 )
            var FilePath  = DrvInf.GetSourceFilePath( InfHandle , FileName )
            FileList[ i ] = INFPath + "\\"
            // 如果FilePath为空，全部的文件名中就会出现"f:\dir\\file.inf"这样的双"\\"目录，
            // CAB打包时文件名就会是"\file.inf"
            if ( FilePath ) FileList[ i ] += FilePath + "\\"
            FileList[ i ] += FileName

            i++
            FileList["Rows"] = i

            InfContext = DrvInf.FindNextLineInSection( InfContext )
        }
        while( InfContext != 0 )
    }
    finally
    {
        DrvInf.CloseINFFile( InfHandle )
    }
    FileList["Success"] = true
    FileList["Info"   ] = ""
return ( FileList )
//            FileList["Success"] = true
//            FileList["Info"   ] = ""
//            FileList["Rows"   ] = i+1
//            FileList[i        ] = PathFileName
}