亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? fat_file.c

?? fat16文件系統(tǒng)源碼。需要的請(qǐng)下
?? C
?? 第 1 頁 / 共 3 頁
字號(hào):

#define  FAT_GLOBAL

#include "type.h"
#include "global.h"
#include "hard.h"
#include "fat.h" 
#include "fat_h.h"   

#include <string.h>



//---------------------------------------------------------------------------------
void fat_read_sector(INT32U u32Sector)
{
   phy_read_open(u32Sector);
   phy_read_sector();
   phy_read_close();  
}



//---------------------------------------------------------------------------------
INT32U fat_U8_to_U32_LH(INT8U LSB, INT8U L, INT8U M, INT8U MSB)
{
   INT32U U32;
   
   U32 = ( ((INT32U)MSB) << 24 ) + ( ((INT32U)M) << 16 ) + ( ((INT32U)L) << 8 ) + LSB;
   return U32;
}


//---------------------------------------------------------------------------------
INT16U fat_U8_to_U16_LH(INT8U LSB, INT8U MSB)
{
   INT16U U16;
   
   U16 = ( ((INT16U)MSB) << 8 ) + LSB;
   return U16;
}



/*F**************************************************************************
* NAME: fat_initialize
*----------------------------------------------------------------------------
* PARAMS: none
*
* return:
*   - OK: intallation succeeded
*   - KO: - partition is not active
*         - FAT type is not FAT16 or FAT12
*         - MBR or PBR signatures are not correct
*         - low level read open failure
*----------------------------------------------------------------------------
* PURPOSE:
*   Install the fat system, read mbr, bootrecords...
*----------------------------------------------------------------------------
* NOTE:
*   if MBR not found, try to mount unpartitionned FAT
*   fat_ptr_fats = partition offset + nb_reserved_sector
*   fat_ptr_rdir = fat_ptr_fat + fat_size * nb_fat
*   fat_ptr_data = fat_ptr_rdir + nb_root_entries * 32 / sect_size
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
Byte fat_initialize(void)
{          
	Byte i;
	Uint32 tot_sect;
	Uint32 fat_nb_sector;

  /* read and check usefull MBR info */
  /* go to the first partition field */
 //	fat_is_fat32 = 0;
 //	fat_is_fat16 = 0;

    fat_read_sector(MBR_ADDRESS);  // go to first partition entry

    /* check first partition state */
	if(gl_buffer[446]!=PARTITION_ACTIVE)
    {
       fat_ptr_fats = 0x00000000;            /* disk may not be partitionned */
    }
    else
    {
	     // ((Byte*)&fat_ptr_fats)[3] = gl_buffer[454];
	     // ((Byte*)&fat_ptr_fats)[2] = gl_buffer[455];
	     // ((Byte*)&fat_ptr_fats)[1] = gl_buffer[456];
	     // ((Byte*)&fat_ptr_fats)[0] = gl_buffer[457];  
	      
	      fat_ptr_fats = fat_U8_to_U32_LH(gl_buffer[454], gl_buffer[455], gl_buffer[456], gl_buffer[457]); 
	      
	      /* go to the MBR signature field */
	
	      if ((gl_buffer[510] != LOW(BR_SIGNATURE)) ||
	          (gl_buffer[511] != HIGH(BR_SIGNATURE)))    
	      {
	        fat_ptr_fats = 0x00000000;          /* disk may not be partitionned */
	      }
    }

    /* read and check usefull PBR info */
    fat_read_sector(fat_ptr_fats);

	//((Byte*)&fat_sector_size)[1] = gl_buffer[11];
	//((Byte*)&fat_sector_size)[0] = gl_buffer[12];
	
    fat_sector_size = fat_U8_to_U16_LH(gl_buffer[11], gl_buffer[12]);

    if((fat_sector_size != 512) && (fat_sector_size != 2048))
	{
	   if((gl_buffer[510] == 0x55) && (gl_buffer[511] == 0xaa))
	   {
	       Uint16 u16Count = 0;
	       while(1)
		   {
	          fat_read_sector(++ fat_ptr_fats);
	          
			  if((gl_buffer[0] == 0xeb)||(gl_buffer[0] == 0xe9))
			  {
			  	// ((Byte*)&fat_sector_size)[1] = gl_buffer[11];
		        // ((Byte*)&fat_sector_size)[0] = gl_buffer[12];
		         fat_sector_size = fat_U8_to_U16_LH(gl_buffer[11], gl_buffer[12]);
		         
	             if((fat_sector_size == 512)||(fat_sector_size == 2048))
				 {
                    break;
                 }
			  }
			  u16Count++;
			  if(u16Count == 0xFFFF)
			  {
                 break;
			  }
		   }
		}
	}

    /* read cluster size (in sector) */
    fat_cluster_size = gl_buffer[13]; //Hard_read_byte();
//    fat_cluster_mask = HIGH((Uint16)fat_cluster_size * fat_sector_size) - 1;
    /* compute FATs sector address: add reserved sector number */
    fat_ptr_fats += gl_buffer[14];
    fat_ptr_fats += ((Uint16)(gl_buffer[15])) << 8;  
    /* read number of FATs */
    i = gl_buffer[16];
    if (i == 2)
       fat_2_is_present = TRUE;
    else
      fat_2_is_present = FALSE;
    /* read number of dir entries  and compute rdir offset */
    

   // ((Byte*)&fat_ptr_data)[3] = gl_buffer[17];
   // ((Byte*)&fat_ptr_data)[2] = gl_buffer[18];
   // ((Byte*)&fat_ptr_data)[1] = 0;
   // ((Byte*)&fat_ptr_data)[0] = 0;
   
    fat_ptr_data = fat_U8_to_U32_LH(gl_buffer[17],gl_buffer[18],0,0); 

	fat_root_entries = (Uint16)(fat_ptr_data);

    fat_ptr_data = (fat_ptr_data * DIR_SIZE) /fat_sector_size;

	/* read number of sector in partition (<32Mb) */
	//((Byte*)&fat_nb_sector)[3] =  gl_buffer[19];
	//((Byte*)&fat_nb_sector)[2] =  gl_buffer[20];
	//((Byte*)&fat_nb_sector)[1] = 0x00;
	//((Byte*)&fat_nb_sector)[0] = 0x00;
	fat_nb_sector = fat_U8_to_U32_LH(gl_buffer[19],gl_buffer[20],0,0);
  
    /* read number of sector in partition (>32Mb) */
    //((Byte*)&fat_nb_sector)[3] += gl_buffer[32]; 
    //((Byte*)&fat_nb_sector)[2] += gl_buffer[33]; 
   // ((Byte*)&fat_nb_sector)[1] += gl_buffer[34]; 
   // ((Byte*)&fat_nb_sector)[0] += gl_buffer[35]; 
   
    fat_nb_sector = fat_U8_to_U32_LH(gl_buffer[32],gl_buffer[33],gl_buffer[34],gl_buffer[35]);
////////////////////////////////////////////////////////////////////////////////////
	//((Byte*)&fat_fat_size)[3] = gl_buffer[22]; 
   // ((Byte*)&fat_fat_size)[2] = gl_buffer[23]; 
    //((Byte*)&fat_fat_size)[1] = 0; 
   // ((Byte*)&fat_fat_size)[0] = 0;	
    fat_fat_size = fat_U8_to_U32_LH(gl_buffer[22],gl_buffer[23],0,0);

	if(fat_fat_size == 0)
	{
		//((Byte*)&fat_fat_size)[3] += gl_buffer[36]; 
	   // ((Byte*)&fat_fat_size)[2] += gl_buffer[37]; 
	   // ((Byte*)&fat_fat_size)[1] += gl_buffer[38]; 
	   // ((Byte*)&fat_fat_size)[0] += gl_buffer[39];
	   fat_fat_size = fat_U8_to_U32_LH(gl_buffer[36],gl_buffer[37],gl_buffer[38],gl_buffer[39]);
	   
	}
    
	fat_ptr_rdir = i * fat_fat_size;
	fat_ptr_rdir += fat_ptr_fats;
/////////////////////////////////////////////////////////////////////////////////////
    tot_sect = fat_nb_sector - (1 + (i * fat_fat_size) + fat_ptr_data);
    fat_count_of_clusters = tot_sect / fat_cluster_size;

    if (fat_count_of_clusters <= MAX_CLUSTERS12)
       fat_type_id = FAT_IS_12;
    else if (fat_count_of_clusters <= MAX_CLUSTERS16)
        fat_type_id = FAT_IS_16;
	else
	{
		fat_type_id = FAT_IS_32;
		
		//((Byte*)&fat32_root_cluster)[3] = gl_buffer[44];
		//((Byte*)&fat32_root_cluster)[2] = gl_buffer[45];
		//((Byte*)&fat32_root_cluster)[1] = gl_buffer[46];
		//((Byte*)&fat32_root_cluster)[0] = gl_buffer[47];
		fat32_root_cluster = fat_U8_to_U32_LH(gl_buffer[44],gl_buffer[45],gl_buffer[46],gl_buffer[47]);
	}
    /* else is FAT32 not supported */

    /* compute data sector address */
    fat_ptr_data += fat_ptr_rdir;

	fat_max_cluster_number = (Uint16)(104857600 /(((Uint32)fat_sector_size) * fat_cluster_size)) + 2;

//	fat_2_is_present = 0;	// improve speed

    /* go to the signature field */
    if(0x200 != fat_sector_size)
	     return KO;

     return OK;
}


/*F**************************************************************************
* NAME: fat_goto_rootdir
*----------------------------------------------------------------------------
* PARAMS: none
*----------------------------------------------------------------------------
* PURPOSE:
*   go to root diretory
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void fat_goto_rootdir(void)
{
	Byte i;
   	fat_dir_current_sect = fat_ptr_rdir;
   	fat_dclust_byte_count = 0;
   	fat_dir_sector_offset = 0;
    fat_fsave_read_handle = 0;
   	dir_is_root = TRUE;

	//init fsave struct
	fat_fsave_index = 0;
	for(i=0; i<MAX_SUBDIR_DEPTH; i++)
	{
		fat_fsave[i].index = 0;
		fat_fsave[i].file = SCAN_XXX;	
	}


#if COMPILE_FAT_32 == TRUE
	if(fat_type_id == FAT_IS_32)
	{
		fat_cache.current.start_cluster.l = fat32_root_cluster;
		fat_get_clusters(&dclusters, MAX_DIR_FRAGMENT_NUMBER);
	}
#endif
	
}

/*F**************************************************************************
* NAME: fat_get_dir_entry
*----------------------------------------------------------------------------
* PARAMS:
*   entry: directory entry structure
* return: none
*----------------------------------------------------------------------------
* PURPOSE:
*   Get from directory all information about a directory or file entry
*----------------------------------------------------------------------------
* NOTE:
*   This function reads directly datas from sectors
*   It automaticaly computes difference between LFN and normal entries
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void fat_get_dir_entry (fat_st_dir_entry  *entry)
{
	Byte    exit_flag = FALSE;
	Byte    lfn_entry_found = FALSE;
	Byte    i;
	Uint16  num;
	Uint16  j;
	Byte flag;
	byte count;

  	num = fat_dir_sector_offset; /*number of bytes to seek in a cluster*/
  	flag = FALSE;
  	count = 0;

 	for (i=MAX_FILENAME_LEN; i!=0; lfn_name[--i] = '\0');

  	phy_read_sector();

  	//num = num%fat_sector_size;

  	while (!exit_flag)
  	/* loop while the entry is not a normal one. */
  	{
	    /* read the directory entry */
      	if(flag == TRUE)
      	{
		    if ((dir_is_root == TRUE)&&(fat_type_id != FAT_IS_32))
		    { 
				 if((num%fat_sector_size)==0)
				 {
				  	  //phy_read_open(fat_ptr_rdir+n);
					  phy_read_sector();
				      num=0;		
				 }
			}
		    else
		    { /* subdir can be fragmented -> dgetc() */
				 if(num % fat_sector_size == 0 )
				 {
			         fat_dgetsector();
					 num=0;
				 }
			}
      	}
      
        j = num;			  
	    num += DIR_SIZE;
        flag = TRUE;
        

       	/*computes gathered data        */
       	/* check if we have a LFN entry */
      	if (gl_buffer[11+j] != ATTR_LFN_ENTRY)
       	{
	      	if (!lfn_entry_found)
	      	{
		        /* true DOS 8.3 entry format */
		        for (i = 0; i < 8; i++)
		        {
		          	lfn_name[i] = gl_buffer[i+j];
		          
		          	if (lfn_name[i] == ' ')
		          	{ /* space is end of name */
		            	break;
		          	}
		        }
		        /* append extension */
				if((gl_buffer[11+j] & ATTR_DIRECTORY )!= ATTR_DIRECTORY)
				{
			        lfn_name[i++] = '.';
				}
			    lfn_name[i++] = gl_buffer[8+j];
			    lfn_name[i++] = gl_buffer[9+j];
			    lfn_name[i++] = gl_buffer[10+j];

			    lfn_name[i] = '\0';        /* end of string */				
		  	}	        
	      	else
	      	{ // LFN name treatment //

               	i = 0;
			   	while((lfn_name[i] != '\0') && (lfn_name[i] != 0xff))
			   	{
			       	i++;
			   	}
			   	lfn_name[i] = '\0';
	      	}
	
	      	/* store extension */
	      	ext[0]= gl_buffer[8+j];
	      	ext[1]= gl_buffer[9+j];
	      	ext[2]= gl_buffer[10+j];
	
	      	/* standard computing for normal entry */
	      	entry->attributes = gl_buffer[11+j];
	      	entry->start_cluster.b[0] = gl_buffer[26+j];
			entry->start_cluster.b[1] = gl_buffer[27+j];
			entry->start_cluster.b[2] = gl_buffer[20+j];
			entry->start_cluster.b[3] = gl_buffer[21+j];
	      	//entry->start_cluster += ((Uint16) gl_buffer[27+j]) << 8;
	      	entry->size.b[0] = gl_buffer[28+j];
	      	entry->size.b[1] = gl_buffer[29+j];
	      	entry->size.b[2] = gl_buffer[30+j];
	      	entry->size.b[3] = gl_buffer[31+j];
	      	/* now it's time to stop */
	      	exit_flag = TRUE;

	  	}// end  if (name_buffer[11] != ATTR_LFN_ENTRY)
      	else
	  	{
          	lfn_entry_found = TRUE;
		  	//lfn_name[0] = 'L';
		  if(count < 5)
          {	
			  if((gl_buffer[0 + j] & LFN_SEQ_MASK) <= MAX_LFN_ENTRIES)
			  {
				  for(i=0; i<5; i++)
				  {
				     lfn_name[i*2 + 26*((gl_buffer[0+j] & LFN_SEQ_MASK) - 1) + 1] = gl_buffer[2*i + 1 +j];
				     lfn_name[i*2 + 26*((gl_buffer[0+j] & LFN_SEQ_MASK) - 1)] = gl_buffer[2*i + 2 +j];
				  }
				  for(i=0; i<6; i++)
				  {
				     lfn_name[i*2 + 10 + 26*((gl_buffer[0+j] & LFN_SEQ_MASK) - 1) + 1] = gl_buffer[2*i + 14 +j];
				     lfn_name[i*2 + 10 + 26*((gl_buffer[0+j] & LFN_SEQ_MASK) - 1)] = gl_buffer[2*i + 15 +j];
				  }
				  for(i=0; i<2; i++)
				  {
				     lfn_name[i*2 + 22 + 26*((gl_buffer[0+j] & LFN_SEQ_MASK) - 1) + 1] = gl_buffer[2*i + 28 +j];
				     lfn_name[i*2 + 22 + 26*((gl_buffer[0+j] & LFN_SEQ_MASK) - 1)] = gl_buffer[2*i + 29 +j];
				  }
			 }
		 }
          	count++;
	   	}                
    }//end while
   	phy_read_close();                        /* close physical read */

}




/*F**************************************************************************
* NAME: fat_dgetsector
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
*   Return the directory data page at the current position
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/ 
void fat_dgetsector (void)
{
  	Uint32 next_cluster;  
    /* new cluster in allocation list */
//  	if((fat_dclust_byte_count % (fat_sector_size * fat_cluster_size)) == 0 )
	if(((fat_dclust_byte_count / fat_sector_size) % fat_cluster_size) == 0 )
  	{
	    //fat_dclust_byte_count=0;
		/* extract if necessary the next cluster from the allocation list */
		if ((dclusters[fat_dchain_index].number == fat_dchain_nb_clust)&&(dclusters[0].number != 0))
		{ /* new fragment */
		  	fat_dchain_index++;
		  	fat_dchain_nb_clust = 1;
		  	next_cluster = dclusters[fat_dchain_index].cluster.l;
		  	fat_dir_current_sect = fat_ptr_data + ((Uint32)(next_cluster) * fat_cluster_size);
		  	phy_read_open(fat_dir_current_sect);
		}
		else
		{ /* no new fragment */
		  	if(dclusters[fat_dchain_index].number == 0)
		  	 	fat_dchain_nb_clust = 0;
		  	//next_cluster = dclusters[fat_dchain_index].cluster + fat_dchain_nb_clust;
		  	next_cluster = dclusters[fat_dchain_index].cluster.l + fat_dchain_nb_clust;
		  	fat_dir_current_sect = fat_ptr_data + ((Uint32)(next_cluster) * fat_cluster_size);
		  //if((fat_dchain_index == 0)&&(fat_dchain_nb_clust == 0))
          //{
			  phy_read_open(fat_dir_current_sect);
          //}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合天天综合网国产成人综合天 | 日韩一级片网站| 日韩免费视频一区二区| 国产调教视频一区| 亚洲精品乱码久久久久久久久| 亚洲成人1区2区| 韩国精品在线观看| 99久久久精品免费观看国产蜜| 欧美日韩中文精品| 久久久国产精华| 一区二区三区鲁丝不卡| 久久er99热精品一区二区| 成人av资源在线| 欧美丰满嫩嫩电影| 国产精品免费观看视频| 性久久久久久久| 高清在线观看日韩| 欧美伦理影视网| 欧美国产乱子伦| 亚洲成人精品一区二区| 成人免费视频视频在线观看免费| 欧美日韩综合不卡| 国产精品视频yy9299一区| 午夜精品国产更新| 豆国产96在线|亚洲| 欧美一区二区三区视频| 亚洲日本在线天堂| 精品制服美女丁香| 在线视频欧美区| 中文成人综合网| 乱一区二区av| 欧美丝袜第三区| 欧美国产日产图区| 久久爱另类一区二区小说| 欧美伊人久久久久久久久影院| 国产精品污污网站在线观看| 久久66热re国产| 欧美日韩中文字幕一区二区| 中文字幕视频一区| 国产成人aaaa| 欧美大片在线观看一区| 视频在线观看91| 色综合天天综合网天天狠天天| 日本一区二区三区国色天香| 美国三级日本三级久久99| 在线观看区一区二| 亚洲视频综合在线| 国产91精品欧美| 久久久久久久久蜜桃| 蜜乳av一区二区| 欧美日韩美少妇| 亚洲麻豆国产自偷在线| 北条麻妃一区二区三区| 久久久精品蜜桃| 国内精品写真在线观看| 日韩一卡二卡三卡四卡| 天天av天天翘天天综合网色鬼国产| 色综合欧美在线| 国产精品欧美极品| 波多野结衣亚洲| 中文字幕精品综合| 国产高清精品久久久久| 久久无码av三级| 国产一区二区三区免费| 精品久久久久久亚洲综合网| 久久精品国产一区二区三| 3atv一区二区三区| 日韩国产欧美三级| 日韩丝袜美女视频| 美女国产一区二区三区| 精品女同一区二区| 久久99国产精品免费| 欧美videos大乳护士334| 另类专区欧美蜜桃臀第一页| 精品国产乱码久久久久久图片| 久久99九九99精品| 久久精品日韩一区二区三区| 国产精品一区二区三区乱码 | 国产不卡视频在线观看| 久久精品一级爱片| 丰满少妇久久久久久久| 国产精品久久久久aaaa樱花 | 亚洲美女区一区| 欧美三级电影在线看| 婷婷夜色潮精品综合在线| 欧美一卡2卡3卡4卡| 美女被吸乳得到大胸91| 26uuu成人网一区二区三区| 国产精品一品视频| 国产精品三级电影| 99re视频这里只有精品| 亚洲精品第一国产综合野| 欧美亚日韩国产aⅴ精品中极品| 日韩精品1区2区3区| 日韩三级视频在线看| 国产一区二区三区四| 国产精品久久久久久久久搜平片| 色综合久久99| 视频一区国产视频| 久久色成人在线| a在线播放不卡| 亚洲不卡在线观看| 久久久亚洲精华液精华液精华液| 国产传媒欧美日韩成人| 亚洲欧美国产三级| 欧美高清你懂得| 韩国一区二区视频| 亚洲欧美激情一区二区| 91精品国产一区二区| 国产精品综合av一区二区国产馆| 国产精品电影院| 欧美精品1区2区| 成人午夜私人影院| 一区二区在线观看免费| 欧美一区二区二区| 成人午夜视频网站| 午夜精彩视频在线观看不卡| 久久亚洲二区三区| 色一区在线观看| 蜜臀久久99精品久久久画质超高清| 欧美极品美女视频| 欧美高清视频不卡网| 成人av电影在线播放| 日精品一区二区三区| 国产精品久久久久久户外露出| 制服丝袜亚洲精品中文字幕| 成人综合婷婷国产精品久久| 午夜精品福利视频网站| 欧美国产激情二区三区| 欧美二区在线观看| 懂色av一区二区三区免费看| 天天操天天干天天综合网| 国产精品美女久久久久久久久| 欧美一卡二卡在线观看| 91无套直看片红桃| eeuss鲁片一区二区三区在线观看| 午夜电影一区二区| 国产精品超碰97尤物18| 精品日韩av一区二区| 欧美日精品一区视频| 成人激情校园春色| 捆绑调教美女网站视频一区| 一区二区三区四区不卡视频| 久久久久久久久久久久久久久99| 欧美日韩一级黄| 色综合欧美在线| 成人一区二区三区| 久久精品国产**网站演员| 亚洲综合激情小说| 中文字幕一区二区视频| 26uuu精品一区二区| 欧美一区2区视频在线观看| 在线一区二区三区做爰视频网站| 国产suv精品一区二区三区| 久久99久久久欧美国产| 午夜精品久久久久久久久久久| 玉足女爽爽91| 国产精品成人免费| 欧美极品少妇xxxxⅹ高跟鞋| 久久综合久久综合九色| 91精品国产综合久久精品性色 | 亚洲美女偷拍久久| 国产精品短视频| 中文字幕第一页久久| 精品日韩99亚洲| 日韩欧美高清在线| 91精品国模一区二区三区| 欧美日韩一区二区三区在线| 91激情五月电影| 色综合久久88色综合天天| jizzjizzjizz欧美| 成人综合激情网| 成人精品视频网站| 国产a视频精品免费观看| 国产成人在线色| 国产超碰在线一区| 成人永久aaa| 成人综合在线观看| 不卡的电视剧免费网站有什么| 国产精品亚洲午夜一区二区三区 | 欧美极品美女视频| 中文字幕精品一区二区精品绿巨人| 国产欧美1区2区3区| 国产精品女主播av| 亚洲欧美日韩在线| 亚洲天堂免费看| 亚洲激情在线播放| 亚洲一区二区av电影| 午夜私人影院久久久久| 日韩激情一二三区| 另类欧美日韩国产在线| 狠狠色丁香久久婷婷综合_中| 国产一区二区91| 福利电影一区二区| 91女厕偷拍女厕偷拍高清| 91美女视频网站| 欧美性猛交一区二区三区精品| 欧美视频你懂的| 日韩欧美亚洲国产精品字幕久久久| 欧美精品一区二区久久久|