青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級} {C#界面,C++核心算法} {設(shè)計模式} {C#基礎(chǔ)}

windows核心編程--作業(yè)

作業(yè): 作業(yè)可以看作是一組進(jìn)程的容器,把這些進(jìn)程當(dāng)作一個整體,對這個整體整個加入更多的限制.
         
          因為Wi n d o w s并不維護(hù)進(jìn)程之間的父/子關(guān)系。即使父進(jìn)程已經(jīng)終止運行,子進(jìn)程仍然會繼續(xù)運行。Microsoft Windoss 2000提供了一個新的作業(yè)內(nèi)核對象,使你能夠?qū)⑦M(jìn)程組合在一起,并且創(chuàng)建一個“沙框”,以便限制進(jìn)程能夠進(jìn)行的操作。最好將作業(yè)對象視為一個進(jìn)程的容器。但是,創(chuàng)建包含單個進(jìn)程的作業(yè)是有用的,因為這樣一來,就可以對該進(jìn)程加上通常情況下不能加的限制。


創(chuàng)建一個新作業(yè)內(nèi)核對象:
HANDLE CreateJobObject( PSECURITY_ATTRIBUTES psa, PCTSTR pszName);

與所有的內(nèi)核對象一樣,它的第一個參數(shù)將安全信息與新作業(yè)對象關(guān)聯(lián)起來,并且告訴系統(tǒng),是否想要使返回的句柄成為可繼承的句柄。最后一個參數(shù)用于給作業(yè)對象命名,使它可以供另一個進(jìn)程通過下面所示的O p e n J o b O b j e c t函數(shù)進(jìn)行訪問。

HANDLE OpenJobObject( DWORD dwDesiredAccess,
   BOOL bInheritHandle, PCTSTR pszName);
與平常一樣,如果知道你將不再需要訪問代碼中的作業(yè)對象,那么就必須通過調(diào)用C l o s e H a n d l e來關(guān)閉它的句柄。

應(yīng)該知道,關(guān)閉作業(yè)對象并不會迫使作業(yè)中的所有進(jìn)程終止運行。該作業(yè)對象實際上做上了刪除標(biāo)記,只有當(dāng)作業(yè)中的所有進(jìn)程全部終止運行之后,該作業(yè)對象才被自動撤消。
注意,關(guān)閉作業(yè)的句柄后,盡管該作業(yè)仍然存在,但是該作業(yè)將無法被所有進(jìn)程訪問。


將一個進(jìn)程放入一個作業(yè),以限制該進(jìn)程進(jìn)行某些操作的能力。 Windows 98 Windows 98不支持作業(yè)的操作。
void StartRestrictedProcess()
{
   //Create a job kernel object.
   HANDLE hjob = CreateJobObject(NULL, NULL);

   //Place some restrictions on processes in the job.
   //First,set some basic restrictions.
   JOBOBJECT_BASIC_LIMIT_INFORMATION jobli = { 0 };

   //The process always runs in the idle priority class.
   jobli.PriorityClass = IDLE_PRIORITY_CLASS;

   //The job cannot use more than 1 second of CPU time.
   jobli.PerJobUserTimeLimit.QuadPart = 10000000; 
   //1 sec in 100-ns intervals

   //These are the only 2 restrictions I want placed on the job (process).
   jobli.LimitFlags = JOB_OBJECT_LIMIT_PRIORITY_CLASS |
      JOB_OBJECT_LIMIT_JOB_TIME;
     
   SetInformationJobObject(hjob,
      JobObjectBasicLimitInformation,
      &jobli, sizeof(jobli));

   //Second, set some UI restrictions.
   JOBOBJECT_BASIC_UI_RESTRICTIONS jobuir;
   jobuir.UIRestrictionsClass = JOB_OBJECT_UILIMIT_NONE;    
   //A fancy zero

   //The process can't log off the system.
   jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_EXITWINDOWS;

   //The process can't access USER objects
   //(such as other windows) in the system.
   jobuir.UIRestrictionsClass |= JOB_OBJECT_UILIMIT_HANDLES;

   SetInformationJobObject(hjob,JobObjectBasicUIRestrictions,
      &jobuir, sizeof(jobuir));

   //Spawn the process that is to be in the job.
   //Note: You must first spawn the process and then place the process in
   //the job. This means that the process's thread must be initially
   //suspended so that it can't execute any code outside
   //of the job's restrictions.

   STARTUPINFO si = { sizeof(si) };
   PROCESS_INFORMATION pi;
   CreateProcess(NULL, "CMD", NULL, NULL, FALSE,
      CREATE_SUSPENDED, NULL, NULL, &si, π);
   //Place the process in the job.
   //Note:if this process spawns any children,the children are
   //automatically part of the same job.
   AssignProcessToJobObject(hjob,pi.hProcess);

   //Now we can allow the child process's thread to execute code.
   ResumeThread(pi.hThread);
   CloseHandle(pi.hThread);

   //Wait for the process to terminate or for all the job's
   //allotted CPU time to be used.
   HANDLE h[2];
   h[0] = pi.hProcess;
   h[1] = hjob;
   DWORD dw = WaitForMultipleObjects(2,h,FALSE,INFINITE);
   switch( dw-WAIT_OBJECT_0 )
   {
     case 0:
        //The process has terminated
        break;
     case 1:
        //All of the job's allotted CPU time was used
        break;
    }

    //Clean up properly.
    CloseHandle(pi.hProcess);
    CloseHandle(hjob);
}


對作業(yè)進(jìn)程的限制
進(jìn)程創(chuàng)建后,通常需要設(shè)置一個沙框(設(shè)置一些限制),以便限制作業(yè)中的進(jìn)程能夠進(jìn)行的操作。可以給一個作業(yè)加上若干不同類型的限制:

• 基本限制和擴(kuò)展基本限制,用于防止作業(yè)中的進(jìn)程壟斷系統(tǒng)的資源。

• 基本的U I限制,用于防止作業(yè)中的進(jìn)程改變用戶界面。

• 安全性限制,用于防止作業(yè)中的進(jìn)程訪問保密資源(文件、注冊表子關(guān)鍵字等)。

通過調(diào)用下面的代碼,可以給作業(yè)加上各種限制:

 

BOOL SetInformationJobObject(
HANDLE hJob,
JOBOBJECTINFOCLASS JobObjectInformationClass,
PVOID pJobObjectInformation,
DWORD cbJobObjectInformationLength);
第一個參數(shù)用于標(biāo)識要限制的作業(yè)。第二個參數(shù)是個枚舉類型,用于指明要使用的限制類型。第三個參數(shù)是包含限制設(shè)置值的數(shù)據(jù)結(jié)構(gòu)的地址,第四個參數(shù)用于指明該結(jié)構(gòu)的大小(用于確定版本)。

可以做的限制有:(具體參數(shù)的意思參看windows核心編程)
JOB_OBJECT_BASIC_LIMIT_INFORMATION結(jié)構(gòu)類似下面的樣子: (基本限制)

typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION{    LARGE_INTEGER  PerProcessUserTimeLimit;    LARGE_INTEGER  PerJobUserTimeLimit;    DWORD          LimitFlags;    DWORD          MinimumWorkingSetSize;    DWORD          MaximumWorkingSetSize;    DWORD          ActiveProcessLimit;    DWORD_PTR      Affinity;    DWORD          PriorityClass;    DWORD          SchedulingClass;} JOBOBJECT_BASIC_LIMIT_INFORMATION,  *PJOBOBJECT_BASIC_LIMIT_INFORMATION;

J O B O B J E C T _ E X T E N D E D _ L I M I T _ I N F O R M AT I O N結(jié)構(gòu)對作業(yè)設(shè)置: (擴(kuò)展限制)
typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION
{
    JOBOBJECT_BASIC_LIMIT_INFORMATION   BasicLimitInformation;
    IO_COUNTERS                         oInfo;
    SIZE_T                              ProcessMemoryLimit;
    SIZE_T                              JobMemoryLimit;
    SIZE_T                              PeakProcessMemoryUsed;
    SIZE_T                              PeakJobMemoryUsed;
} JOBOBJECT_EXTENDED_LIMIT_INFORMATION,  *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;

J O B O B J E C T _ B A S I C _ U I _ R E S T R I C T I O NS結(jié)構(gòu)的樣子: (其他限制)
typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS
{
    DWORD UIRestrictionsClass;
} JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;
J O B O B J E C T _ S E C U R I T Y _ L I M I T _ I N F O R M AT I O N的結(jié)構(gòu)類似下面的形式: (安全限制)
typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION
{
    DWORD              SecurityLimitFlags;
    HANDLE             JobToken;
    PTOKEN_GROUPS      SidsToDisable;
    PTOKEN_PRIVILEGES  PrivilegesToDelete;
    PTOKEN_GROUPS      RestrictedSids;
} JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION;

當(dāng)然,一旦給作業(yè)設(shè)置了限制條件,就可以查詢這些限制。通過調(diào)用下面的代碼,就可以進(jìn)行這一操作:

 

BOOL QueryInformationJobObject(
HANDLE hJob,
JOBOBJECTINFOCLASS JobObjectInformationClass,
PVOID pvJobObjectInformation,
DWORD cbJobObjectInformationLength,
PDWORD pdwReturnLength);
你為該函數(shù)傳遞作業(yè)的句柄(就像你對SetInformationJobObject操作時那樣),這些句柄包括用于指明你想要的限制信息的枚舉類型,函數(shù)要進(jìn)行初始化的數(shù)據(jù)結(jié)構(gòu)的地址,以及包含該結(jié)構(gòu)的數(shù)據(jù)塊的長度。最后一個參數(shù)是pdwReturnLength,用于指向該函數(shù)填寫的DWORD,它告訴你有多少字節(jié)放入了緩存。如果你愿意的話,可以(并且通常)為該參數(shù)傳遞N U L L。

將進(jìn)程放入作業(yè):

BOOL AssignProcessToJobObject(
   HANDLE hJob,
   HANDLE hProcess);
該函數(shù)告訴系統(tǒng),將該進(jìn)程(由hProcess標(biāo)識)視為現(xiàn)有作業(yè)(由h J o b標(biāo)識)的一部分。
注意,該函數(shù)只允許將尚未被賦予任何作業(yè)的進(jìn)程賦予一個作業(yè)。一旦進(jìn)程成為一個作業(yè)的組成部分,
它就不能轉(zhuǎn)到另一個作業(yè),并且不能是無作業(yè)的進(jìn)程。另外,當(dāng)作為作業(yè)的一部分的進(jìn)程生成另一個進(jìn)程的時候,
新進(jìn)程將自動成為父作業(yè)的組成部分。注意:調(diào)用此函數(shù)后要調(diào)用ResumeThread();這樣,
進(jìn)程的線程就可以在作業(yè)的限制下執(zhí)行代碼。終止作業(yè)中所有進(jìn)程的運行
若要撤消作業(yè)中的進(jìn)程,只需要調(diào)用下面的代碼:


BOOL TerminateJobObject(
HANDLE hJob,
UINT uExitCode);
這類似為作業(yè)中的每個進(jìn)程調(diào)用TerminateProcess函數(shù),將它們的所有退出代碼設(shè)置為uExitCode。

查詢作業(yè)統(tǒng)計信息
Q u e r y I n f o r m a t i o n J o b O b j e c t函數(shù)來獲取對作業(yè)的當(dāng)前限制信息。也可以使用它來獲取關(guān)于作業(yè)的統(tǒng)計信息。通過傳入不同的參數(shù),可以查詢到不同的作業(yè)統(tǒng)計信息.
例如,若要獲取基本的統(tǒng)計信息,可以調(diào)用Q u e r y I n f o r m a t i o n J o b O b j e c t,為第二個參數(shù)傳遞J o b O b j e c t B a s i c A c c o u n t i n g I n f o r m a t i o n ,并傳遞J O B O B J E C T _ B A S I C _ A C C O U N T I N G _ I N F O R M AT I O N結(jié)構(gòu)的地址:

typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION{   LARGE_INTEGER TotalUserTime;   LARGE_INTEGER TotalKernelTime;   LARGE_INTEGER ThisPeriodTotalUserTime;   LARGE_INTEGER ThisPeriodTotalKernelTime;   DWORD TotalPageFaultCount;   DWORD TotalProcesses;   DWORD ActiveProcesses;   DWORD TotalTerminatedProcesses;} JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;

 


除了查詢這些基本統(tǒng)計信息外,可以進(jìn)行一次函數(shù)調(diào)用,以同時查詢基本統(tǒng)計信息和I/O統(tǒng)計信息。為此,必須為第二個參數(shù)傳遞J o b O b j e c t B a s i c A n d I o A c c o u n t i n g I n f o r m a t i o n ,并傳遞J O B O B J E C T _ B A S I C _ A N D _ I O _ A C C O U N T I N G _ I N F O R M AT I O N結(jié)構(gòu)的地址:

typedef struct JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION
{
   JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
   IO_COUNTERS IoInfo;
} JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;

如你所見,這個結(jié)構(gòu)只返回一個J O B O B J E C T _ B A S I C _ A C C O U N T I N G _ I N F O R M AT I O N結(jié)構(gòu)和I O _ C O U N T E R S結(jié)構(gòu):

 

typedef struct _IO_COUNTERS
{
   ULONGLONG ReadOperationCount;
   ULONGLONG WriteOperationCount;
   ULONGLONG OtherOperationCount;
   ULONGLONG ReadTransferCount;
   ULONGLONG WriteTransferCount;
   ULONGLONG OtherTransferCount;
} IO_COUNTERS;

另外,可以使用下面這個新的G e t P r o c e s s I o C o u n t e r s函數(shù),以便獲取不是這些作業(yè)中的進(jìn)程的這些信息:


BOOL GetProcessIoCounters(
   HANDLE hProcess,
   PIO_COUNTERS pIoCounters);
也可以隨時調(diào)用Q u e r y I n f o r m a t i o n J o b O b j e c t函數(shù),以便獲取當(dāng)前在作業(yè)中運行的進(jìn)程的一組進(jìn)程I D。若要進(jìn)行這項操作,首先必須確定你想在作業(yè)中看到多少進(jìn)程,然后必須分配足夠的內(nèi)存塊,來放置這些進(jìn)程I D的數(shù)組,并指定J O B O B J E C T _ B A S I C _ P R O C E S S _ I D _ L I S T結(jié)構(gòu)的大小:


typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST
{
DWORD NumberOfAssignedProcesses;
DWORD NumberOfProcessIdsInList;
DWORD ProcessIdList[1];
} JOBOBJECT_BASIC_PROCESS_ID_LIST,  *PJOBOBJECT_BASIC_PROCESS_ID_LIST;
因此,若要獲得當(dāng)前作業(yè)中的一組進(jìn)程I D,必須執(zhí)行類似下面的代碼:

void EnumProcessIdsInJob(HANDLE hjob)
{
    //I assume that there will never be more
    //than 10 processes in this job.
    #define MAX_PROCESS_IDS     10

    //Calculate the number of bytes needed for
    //structure  & process IDs.
    DWORD Cb = sizeof(JOBOBJECT_BASIC_PROCESS_ID_LIST) +
       (MAX_PROCESS_IDS - 1) * sizeof(DWORD);

    //Allocate the block of memory.
    PJOBOBJECT_BASIC_PROCESS_ID_LIST pjobpil = _alloca(cb);

    //Tell the function the maximum number of processes
    //that we allocated space for.
    pjobpil->NumberOfAssignedProcesses = MAX_PROCESS_IDS;

    //Request the current set of process IDs.
    QueryInformationJobObject(hjob, JobObjectBasicProcessIdList,
       pjobpil, cb, &cb);

    //Enumerate the process IDs.
    for(int x=0; x < pjobpil -> NumberOfProcessIdsInList; x++)
    {
        //Use pjobpil->ProcessIdList[x]
    }

    //Since _alloca was used to allocate the memory,
    //we don't need to free it here.
}

 

作業(yè)通知信息

如果關(guān)心的是分配的所有C P U時間是否已經(jīng)到期,那么可以非常容易地得到這個通知信息。當(dāng)作業(yè)中的進(jìn)程尚未用完分配的C P U時間時,作業(yè)對象就得不到通知。一旦分配的所有C P U時間已經(jīng)用完, Wi n d o w s就強制撤消作業(yè)中的所有進(jìn)程,并將情況通知作業(yè)對象。通過調(diào)用Wa i t F o r S i n g l e O b j e c t (或類似的函數(shù)),可以很容易跟蹤這個事件。有時,可以在晚些時候調(diào)用S e t I n f o r m a t i o n J o b O b j e c t函數(shù),使作業(yè)對象恢復(fù)未通知狀態(tài),并為作業(yè)賦予更多的C P U時間。

當(dāng)開始對作業(yè)進(jìn)行操作時,我覺得當(dāng)作業(yè)中沒有任何進(jìn)程運行時,應(yīng)該將這個事件通知作業(yè)對象。畢竟當(dāng)進(jìn)程和線程停止運行時,進(jìn)程和線程對象就會得到通知。因此,當(dāng)作業(yè)停止運行時它也應(yīng)該得到通知。這樣,就能夠很容易確定作業(yè)何時結(jié)束運行。但是, M i c r o s o f t選擇在分配的C P U時間到期時才向作業(yè)發(fā)出通知,因為這顯示了一個錯誤條件。由于許多作業(yè)啟動時有一個父進(jìn)程始終處于工作狀態(tài),直到它的所有子進(jìn)程運行結(jié)束,因此只需要在父進(jìn)程的句柄上等待,就可以了解整個作業(yè)何時運行結(jié)束。S t a r t R e s t r i c t e d P r o c e s s函數(shù)用于顯示分配給作業(yè)的C P U時間何時到期,或者作業(yè)中的進(jìn)程何時終止運行。

前面介紹了如何獲得某些簡單的通知信息,但是尚未說明如何獲得更高級的通知信息,如進(jìn)程創(chuàng)建/終止運行等。如果想要得到這些通知信息,必須將更多的基礎(chǔ)結(jié)構(gòu)放入應(yīng)用程序。特別是,必須創(chuàng)建一個I / O完成端口內(nèi)核對象,并將作業(yè)對象或多個作業(yè)對象與完成端口關(guān)聯(lián)起來。然后,必須讓一個或多個線程在完成端口上等待作業(yè)通知的到來,這樣它們才能得到處理。

一旦創(chuàng)建了I / O完成端口,通過調(diào)用S e t I n f o r m a t i o n J o b O b j e c t函數(shù),就可以將作業(yè)與該端口關(guān)聯(lián)起來,如下面的代碼所示:


 

JOBOBJECT_ASSOCIATE_COMPLETION_PORT joacp;
//Any value to uniquely identify this job
joacp.CompletionKey = 1;      

//Handle of completion port that receives notifications
joacp.CompletionPort = hIOCP; 
SetInformationJobObject(hJob,
   jobObjectAssociateCompletionPortInformation,
   &joacp, sizeof(jaocp));

當(dāng)上面的代碼運行時,系統(tǒng)將監(jiān)視該作業(yè)的運行,當(dāng)事件發(fā)生時,它將事件送往I / O完成端口(順便說一下,可以調(diào)用Q u e r y I n f o r m a t i o m J o b O b j e c t函數(shù)來檢索完成關(guān)鍵字和完成端口句柄。但是,這樣做的機會很少)。線程通過調(diào)用G e t Q u e u e d C o m p l e t i o n S t a t u s函數(shù)來監(jiān)控I / O完成端口:


BOOL GetQueuedCompletionStatus(
   HANDLE hIOCP,
   PDWORD pNumBytesTransferred,
   PULONG_PTR pCompletionKey,
   POVERLAPPED *pOverlapped,
   DWORD dwMilliseconds);

當(dāng)該函數(shù)返回一個作業(yè)事件通知時,* p C o m p l e t i o n K e y包含了調(diào)用S e t I n f o r m a t i o n J o b O b j e c t時設(shè)置的完成關(guān)鍵字值,用于將作業(yè)與完成端口關(guān)聯(lián)起來。它使你能夠知道哪個作業(yè)存在一個事件。* p N u m B y t e s Tr a n s f e r r e d中的值用于指明發(fā)生了哪個事件。


 

posted on 2006-09-13 09:15 夢在天涯 閱讀(2206) 評論(1)  編輯 收藏 引用 所屬分類: Windows API

評論

# re: windows核心編程--作業(yè) 2013-10-10 20:14 panpan

好文章  回復(fù)  更多評論   

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計

  • 隨筆 - 461
  • 文章 - 4
  • 評論 - 746
  • 引用 - 0

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1812911
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              国产欧美一区二区三区另类精品| 久久av一区二区三区亚洲| 国模 一区 二区 三区| 久久精品国产69国产精品亚洲| 亚洲欧美日韩另类| 国产欧美一区二区精品仙草咪 | 欧美91大片| 亚洲人成久久| 亚洲美女视频网| 国产欧美日韩精品丝袜高跟鞋| 久久久久国产精品人| 老司机精品视频网站| 一本色道久久加勒比精品| 日韩视频在线一区二区| 国产精品一区二区在线观看网站| 久久精品欧美| 欧美激情第五页| 亚洲欧美影院| 猛男gaygay欧美视频| 亚洲精品在线三区| 亚洲欧美精品在线| 亚洲国内欧美| 亚洲欧美激情在线视频| 在线观看的日韩av| 在线综合亚洲| 在线观看视频一区| 亚洲午夜国产成人av电影男同| 国内外成人免费激情在线视频| 亚洲黄色天堂| 国产欧美一区二区精品秋霞影院| 欧美激情精品久久久六区热门| 欧美性猛交xxxx乱大交蜜桃| 麻豆精品视频在线| 国产精品私人影院| 亚洲欧洲一区二区三区在线观看| 国产日韩精品一区| 亚洲精一区二区三区| 激情久久五月天| 亚洲一区二区三区精品动漫| 亚洲美女视频在线观看| 久久久久在线观看| 午夜精品999| 欧美日韩一卡| 亚洲高清免费| 亚洲成人在线视频网站| 欧美一区国产二区| 欧美一级片久久久久久久| 欧美国产视频在线观看| 狂野欧美激情性xxxx欧美| 国产精品区一区二区三区| 亚洲人成网站影音先锋播放| 悠悠资源网亚洲青| 欧美制服第一页| 欧美亚洲一级片| 国产精品久久久久aaaa九色| 亚洲美女精品一区| 99精品视频免费| 欧美国产日韩一区| 国产精品久久久久久久午夜| 亚洲第一精品夜夜躁人人爽 | 国产人成一区二区三区影院| 一区二区三区你懂的| 制服丝袜亚洲播放| 欧美日韩你懂的| 夜夜嗨av一区二区三区四区| 欧美日韩亚洲精品内裤| 亚洲精品一区在线| 亚洲视屏在线播放| 欧美午夜精品理论片a级按摩| 亚洲精品一区二区在线| 这里只有精品视频| 欧美吻胸吃奶大尺度电影| 夜夜嗨av一区二区三区| 亚洲一区二区三区中文字幕在线| 欧美日韩国产综合一区二区| 日韩视频在线免费| 亚洲欧美在线观看| 国产欧美亚洲精品| 久久久噜噜噜久久| 欧美激情第10页| 一本色道久久综合亚洲精品不卡| 欧美日韩黄视频| 亚洲在线视频观看| 久色婷婷小香蕉久久| 亚洲日韩中文字幕在线播放| 欧美久久电影| 亚洲综合社区| 免费在线观看日韩欧美| 亚洲毛片在线看| 国产精品久久久久久久久久免费 | 国产精品亚洲一区二区三区在线| 亚洲综合视频网| 欧美 日韩 国产 一区| 日韩亚洲欧美综合| 国产伦精品一区二区三区视频黑人 | 亚洲黄色尤物视频| 欧美亚洲第一页| 欧美有码视频| 亚洲精品视频在线播放| 久久国产精品久久久久久久久久| 亚洲高清不卡| 国产精品日韩一区二区三区| 久久久噜噜噜久噜久久 | 欧美 亚欧 日韩视频在线| 一本色道综合亚洲| 狠狠久久五月精品中文字幕| 欧美日韩二区三区| 久久精品欧洲| 国产精品99久久99久久久二8| 久久久久国产精品厨房| 亚洲视频久久| 亚洲高清免费在线| 国产欧美一区二区白浆黑人| 欧美精品一区二区蜜臀亚洲| 西西人体一区二区| 一本色道久久88综合日韩精品 | 另类综合日韩欧美亚洲| 一个人看的www久久| 国产有码一区二区| 欧美日韩久久精品| 美女视频黄 久久| 亚洲你懂的在线视频| 亚洲二区在线观看| 久久尤物视频| 欧美在线观看视频| 亚洲一区二区日本| 亚洲免费福利视频| 亚洲电影免费观看高清完整版在线观看 | 久久综合久久久久88| 欧美日韩综合在线免费观看| 亚洲欧美春色| 一区二区三区欧美在线| 亚洲国产精品悠悠久久琪琪| 久久激情网站| 久久精品人人做人人爽| 性18欧美另类| 性欧美xxxx大乳国产app| 亚洲天堂av在线免费观看| 亚洲精品少妇| 亚洲清纯自拍| 99热在线精品观看| 亚洲欧洲在线视频| 亚洲日本中文字幕| 亚洲精品视频一区二区三区| 亚洲激情在线观看| 亚洲精品视频一区| 一区二区高清视频| 亚洲素人一区二区| 亚洲一区二区三区四区在线观看 | 国产一区二区三区免费观看| 国产精品一区二区三区四区| 国产精品久久国产愉拍| 国产精品久久97| 国产欧美亚洲一区| 激情久久五月| 亚洲人成高清| 亚洲午夜精品久久久久久浪潮| 中日韩视频在线观看| 亚洲摸下面视频| 久久精品官网| 欧美激情视频网站| 99国产精品久久久久久久久久| 一本久久青青| 欧美一区激情| 欧美成人午夜激情| 国产精品久久久久三级| 国产手机视频精品| 91久久精品一区二区别| 亚洲先锋成人| 久久夜色精品国产噜噜av| 亚洲黄色影片| 小嫩嫩精品导航| 免费试看一区| 国产精品亚洲精品| 亚洲国产欧美一区二区三区久久| 99国产精品久久久久久久久久 | 亚洲三级影院| 亚洲欧美一区二区原创| 葵司免费一区二区三区四区五区| 欧美啪啪一区| 国产综合精品一区| 日韩小视频在线观看| 久久精品国产视频| 91久久中文| 久久国产综合精品| 欧美日韩一区在线视频| 韩国女主播一区| 亚洲视频一二区| 免费欧美高清视频| 亚洲一区二区三区精品在线| 欧美xx视频| 欧美亚洲午夜视频在线观看| 国产欧美一区二区三区另类精品 | 久久综合色婷婷| 国产精品草草| 亚洲麻豆av| 免费在线看一区| 香蕉av777xxx色综合一区| 欧美日韩国产精品一区二区亚洲| 激情成人在线视频|