日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IClass与电源管理

發布時間:2023/12/15 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IClass与电源管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

IClass與電源管理

?

前段時間為J9項目上添加電源管理,中間走了一些彎路。之前錯誤的認為,IClass只是與電源狀態的改變方法有關,也就是說IClass的正確與否只會影響到設備電源狀態的正確與否,而不會造成設備是否可以支持設備電源狀態的轉換。

結果后來整USB的時候,發現完全不是這么回事,郁悶了兩天。

擔心忘記了,電源管理中與IClass相關知識趕緊寫下來。

一.PM中的相關內容說明

1.結構體DEVICE_LIST

首先看一下結構體DEVICE_LIST的定義:

// this structure describes a set of power manageable devices

typedef struct _DeviceList_tag {

??? LPCGUID???? pGuid;????????????????? // class of device

??? PDEVICE_STATE pList;??????????????? // pointer to devices

??? HANDLE????? hMsgQ;????????????????? // device notification queue

??? HANDLE????? hnClass;??????????????? // handle from RequestDeviceNotifications()

??? PDEVICE_INTERFACE????? pInterface; // interface to the device class power management routines

??? struct _DeviceList_tag *pNext;????? // singly linked list pointer

} DEVICE_LIST, *PDEVICE_LIST;

可以看到其第一個成員pGuid指向了GUID的名字,大家都知道CE中的PM相關GUID有四個,分別是通用設備,網絡設備,塊設備和GWES設備。默認在注冊表[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/Interfaces]下進行聲明,它是通過PM.dll中的相關宏定義進行指定,可以將PM Driver移植到BSP下后進行修改。

典型的定義如下:

; Power Manager interfaces.? These list the interface classes that the Power

; Manager will monitor for new devices.

;

[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/Interfaces]

??? "{A32942B7-920C-486b-B0E6-92A702A99B35}"="Generic power-manageable devices"

??? "{8DD679CE-8AB4-43c8-A14A-EA4963FAA715}"="Power-manageable block devices"

; @CESYSGEN IF CE_MODULES_NDIS

??? "{98C5250D-C29A-4985-AE5F-AFE5367E5006}"="Power-manageable NDIS miniports"

; @CESYSGEN ENDIF CE_MODULES_NDIS

; @CESYSGEN IF CE_MODULES_GWES

??? "{EB91C7C9-8BF6-4a2d-9AB8-69724EED97D1}"="Power-manageable display"

; @CESYSGEN ENDIF CE_MODULES_GWES

?

顯然,系統中應當維護著4DEVICE_LIST結構體變量,它們最終組成一個單向鏈表,通過全局變量gpDeviceLists指向其表頭,該鏈表在函數DeviceListsInit()中進行初始化,而DeviceListsInit()PmInit()進行調用。

2.結構體DEVICE_STATE

首先看一下結構體DEVICE_STATE的定義:

// this structure describes a power-manageable device

typedef struct _DeviceState_tag {

??? LPCTSTR???? pszName;??????????????? // device's name

??? CEDEVICE_POWER_STATE??? curDx;????? // current official power state (not necessarily supported by the device)

??? CEDEVICE_POWER_STATE??? floorDx;??? // minimum device power state, or PwrDeviceUnspecified

??? CEDEVICE_POWER_STATE??? ceilingDx;? // maximum device power state, or PwrDeviceUnspecified

??? CEDEVICE_POWER_STATE??? setDx; ?????// power state if explicitly set, or PwrDeviceUnspecified

??? CEDEVICE_POWER_STATE??? lastReqDx;? // last state requested by the device

??? CEDEVICE_POWER_STATE??? actualDx;?? // current actual device power state

??? CEDEVICE_POWER_STATE??? pendingDx;? // Pending DX for updating

??? DWORD?????????????????? dwNumPending; // Number of Pending for updating.

??? struct _DeviceState_tag *pParent;?? // parent device, or NULL

??? POWER_CAPABILITIES????? caps;?????? // as reported by the device

??? DWORD???? ??dwRefCount;???????????? // structure can be deallocated when this is 0

??? HANDLE????? hDevice;??????????????? // handle to the device from OpenDevice(), or NULL

??? PDEVICE_INTERFACE?????? pInterface; // interface to the device class power management routines

??? struct _DeviceList_tag? *pListHead; // pointer to the containing list

??? struct _DeviceState_tag *pNext;???? // linked list pointers

??? struct _DeviceState_tag *pPrev;

} DEVICE_STATE, *PDEVICE_STATE;

?????? 可以看到,該鏈表是一個雙向鏈表,可以通過其前向和后驅雙向遍歷。

?????? 每一個由Device.exe6.0下應該是kernel.exe/GWES加載的設備以及網絡和通用設備都對應一個該結構體的變量。

每一類GUID設備會組成一個DEVICE_STATE鏈表,也就是說系統中最大只有四個這種鏈表,通過結構體DEVICE_LISTpList成員進行指向。

?????? 好了,現在你可以知道要找到一個設備的DEVICE_STATE的方法了,就是先找到它對應的GUID類的DEVICE_LIST結構體,然后從該類結構體的pList里面遍歷特定的設備名找到你的DEVICE_STATE結點。

?????? 系統中已經實現了該函數,即GetDeviceListFromClassDeviceStateFindListGetDeviceListFromClass代碼如下:

// this routine determines to which device list a particular device class

// corresponds

PDEVICE_LIST

GetDeviceListFromClass(LPCGUID guidDevClass)

{

??? PDEVICE_LIST pdl;

??? SETFNAME(_T("GetDeviceListFromClass"));

?

??? PREFAST_DEBUGCHK(guidDevClass != NULL);

?

??? // look for a match

??? __try {

??????? for(pdl = gpDeviceLists; pdl != NULL; pdl = pdl->pNext) {

??????????? if(*pdl->pGuid == *guidDevClass) {

??????????????? break;

???? ???????}

??????? }

??? }

??? __except(EXCEPTION_EXECUTE_HANDLER) {

??????? PMLOGMSG(TRUE, (_T("%s: exception accessing guidDevClass 0x%08x/r/n"),

??????????? pszFname, guidDevClass));

??????? pdl = NULL;

??? }

?

??? return pdl;

}

?????? DeviceStateFindList代碼如下:

// This routine looks for a device on a list.? If it finds the device, it

// increments its reference counter and returns a pointer to it.? The caller

// should decrement the reference counter when it is done with the pointer.

// Note that the search is case sensitive.

PDEVICE_STATE

DeviceStateFindList(PDEVICE_LIST pdl, LPCTSTR pszName)

{

??? PDEVICE_STATE pds;

??? SETFNAME(_T("DeviceStateFindList"));

?

??? PMLOCK();

?

??? __try {

??????? // look for a match

??????? for(pds = pdl->pList; pds != NULL; pds = pds->pNext) {

??????????? if(_tcscmp(pds->pszName, pszName) == 0) {

??????????????? // increment the reference count and exit

??????????????? DeviceStateAddRef(pds);

??????????????? break;

??????????? }

??????? }

??? }

??? __except(EXCEPTION_EXECUTE_HANDLER) {

??????? PMLOGMSG(ZONE_WARN, (_T("%s: exception searching list/r/n"), pszFname));

??????? pds = NULL;

??? }

?

??? PMUNLOCK();

?

??? return pds;

}

3.指針函數結構體DEVICE_INTERFACE

?????? 首先看一下結構體DEVICE_INTERFACE的定義:

typedef struct _DeviceInterface_tag {

??? BOOL (WINAPI * pfnInitInterface) (VOID);

??? HANDLE (WINAPI *pfnOpenDevice) (struct _DeviceState_tag *);

??? BOOL (WINAPI * pfnCloseDevice) (HANDLE);

??? BOOL (WINAPI * pfnRequestDevice) (HANDLE, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD);

} DEVICE_INTERFACE, *PDEVICE_INTERFACE;

?????? 系統中共維護兩個該結構體的變量,即PMMDDDriver中定義的gStreamInterfacegDisplayInterface

?????? 其中,gDisplayInterface對應的GWES加載的設備,而gStreamInterface對應的是網絡設備,塊驅動設備和通用設備。

?????? 其各個成員的意思就不再贅述。

二.IClass在電源管理中的用途

1PM的相關初始化

1> 誰加載了PM.dll???

CE5.0中,設備管理器是Device.exe,到6.0里面由于單個Process空間上了GB的級別,就將其改為Device.dll,掛在了Kernel.exe里面。慚愧的是對于6.0,小弟始終沒有找到在哪里LoadLibrary(“Device.dll”)

小弟猜測應該是Filesys加載的PM.dll,幫助文檔中講述Filesys的啟動過程的時候也沒有提到這點,但是由于Filesys并沒有源碼,不知道各位有沒有比較好的方法可以驗證這一點。

2> PM的初始化

?????? Filesys.exe/Filesys.dll調用了Device.exe/Device.dll的導出函數StartDeviceManager(),而在函數StartDeviceManager()中調用了PM.dll導出的初始化函數PmInit()

PmInit()首先調用DeviceListsInit()去查詢注冊表的配置并初始化DEVICE_LIST鏈表。函數DeviceListsInit()代碼如下:

// This routine reads the registry to determine what type of device interfaces

// we will be monitoring.? The default PM GUID is ignored if present in the

// registry and is always added last (so it's first in the list).

BOOL

DeviceListsInit(VOID)

{

??? BOOL fOk = TRUE;

??? PDEVICE_LIST pdl;

??? DWORD dwStatus;

??? HKEY hk;

??? TCHAR szBuf[MAX_PATH];

??? SETFNAME(_T("DeviceListsInit"));

?

??? // enumerate all the device classes

???? // 到注冊表[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power/Interfaces]

???? // 獲取GUID的值,默認情況下,ICLASS共有類別,此處直接通過枚舉的方式查詢到每一個GUID

??? wsprintf(szBuf, _T("%s//Interfaces"), PWRMGR_REG_KEY);

??? dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szBuf, 0, 0, &hk);

??? if(dwStatus == ERROR_SUCCESS) {

??????? DWORD dwIndex = 0;

??????? do {

??????????? DWORD cbValueName = dim(szBuf), dwType;

??????????? GUID idInterface;

?

??????????? dwStatus = RegEnumValue(hk, dwIndex, szBuf, &cbValueName, NULL,

??????????????? &dwType, NULL, NULL);

??????????? if(dwStatus == ERROR_SUCCESS) {

??????????????? if(dwType != REG_SZ) {

??????????????????? PMLOGMSG(ZONE_WARN, (_T("%s: invalid type for value '%s'/r/n"),

??????????????????????? pszFname, szBuf));

??????????????? }

?????????????????? // GUID進行轉換

?????????????????? else if(!ConvertStringToGuid(szBuf, &idInterface)) {

??????????????????? PMLOGMSG(ZONE_WARN, (_T("%s: can't convert '%s' to GUID/r/n"),

??????????????????????? pszFname, szBuf));

??????????????? }

?????????????????? // 如果是通用設備的GUID,則跳過,留到最后進行初始化其DEVICE_LIST

?????????????????? else if(idInterface == idGenericPMDeviceClass) {

??????????????????? PMLOGMSG(ZONE_INIT, (_T("%s: default GUID found in registry as expected/r/n"),

??????????????????????? pszFname));

??????????????? }

?????????????????? // 為特定GUID類分配并初始化一個DEVICE_LIST結構體變量

?????????????????? else if((pdl = DeviceListCreate(&idInterface)) == NULL) {

??????????????????? PMLOGMSG(ZONE_WARN, (_T("%s: DeviceListCreate() failed/r/n"),

??????????????????????? pszFname));

??????????????? }

?????????????????? // 初始化上面分配的DEVICE_LIST結構體變量的成員pInterface,使其指向有效的函數指針結構體

?????????????????? // 函數PlatformDeviceListInit這里非常重要,它初始化了DEVICE_LIST結構體變量的成員pInterface,而pInterface的具體實現包括gDisplayInterfacegStreamInterface,在pmstream.cpppmdisplay.cpp可以找到其具體的實現,代碼寫的蠻經典的

?????????????????? // 這些函數指針結構體通過PM DriverMDD層獲得

?????????????????? else if(PlatformDeviceListInit(pdl) == FALSE) {

??????????????????? PMLOGMSG(ZONE_WARN, (_T("%s: PlatformDeviceListInit() failed/r/n"),

??????????????????????? pszFname));

??????????????????? DeviceListDestroy(pdl);

??????????????? }

?????????????????? // 將當前GUIDDEVICE_LIST結構體變量添加鏈表gpDeviceLists

?????????????????? else {

??????????????????? // add the new entry to the list

??????????????????? pdl->pNext = gpDeviceLists;

??????????????????? gpDeviceLists = pdl;

??????????????? }

?

??????????????? // update the index

??????????????? dwIndex++;

??????????? }

?????? ?} while(dwStatus == ERROR_SUCCESS);

?

??????? // check for abnormal termination of the loop

??????? if(dwStatus != ERROR_NO_MORE_ITEMS) {

??????????? fOk = FALSE;

??????? }

?

??????? // close the registry handle

??????? RegCloseKey(hk);

??? }

?

// add the default list last

// 通用設備類留在最后進行初始化,為什么?

// 主要是為了讓通用設備類保持在gpDeviceLists的最前面,利于后面的處理

??? if(fOk) {

??????? fOk = FALSE;

??????? pdl = DeviceListCreate(&idGenericPMDeviceClass);

??????? if(pdl != NULL) {

??????????? if(PlatformDeviceListInit(pdl) == FALSE) {

??????????????? PMLOGMSG(ZONE_INIT || ZONE_WARN,

??????????????????? (_T("%s: PlatformDeviceListInit() failed for default class/r/n"),

??????????????????? pszFname));

??????????????? DeviceListDestroy(pdl);

??????????? } else {

??????????????? pdl->pNext = gpDeviceLists;

??????????????? gpDeviceLists = pdl;

??????????????? fOk = TRUE;

??????????? }

??????? }

??? }

?

??? // clean up if necessary

??? if(!fOk) {

??????? PMLOGMSG(ZONE_WARN, (_T("%s: error during list initialization/r/n"),

??????????? pszFname));

??????? while(gpDeviceLists != NULL) {

??????????? pdl = gpDeviceLists;

??????????? gpDeviceLists = pdl->pNext;

??????????? pdl->pNext = NULL;

??????????? DeviceListDestroy(pdl);

??????? }

??? }

?

??? return fOk;

}

?????? 接下來PmInit會去創建線程PnpThreadProc,該線程非常重要,它主要來檢測系統中地新加載的設備。雖然其名字是PNP,但是其服務對象不僅僅是PNP設備,迷惑了我十幾分鐘。

PnpThreadProc優先級可以通過注冊表項PnPPriority256去進行配置,如果沒有配置,將采用默認的249

// this thread waits for power manageable devices to be announced.? When

// they arrive they are added to the PM's list of devices and initialized

// appropriately.? If a device goes away, its entry will be removed

// from the list.

DWORD WINAPI

PnpThreadProc(LPVOID lpvParam)

{

??? DWORD dwStatus;

??? HANDLE hnGeneric = NULL;

??? HANDLE hevReady = (HANDLE) lpvParam;

??? HANDLE hEvents[MAXIMUM_WAIT_OBJECTS];

??? DWORD dwNumEvents = 0;

??? BOOL fDone = FALSE;

??? BOOL fOk;

??? INT iPriority;

??? PDEVICE_LIST pdl;

??? SETFNAME(_T("PnpThreadProc"));

?

??? PMLOGMSG(ZONE_INIT, (_T("+%s: thread 0x%08x/r/n"), pszFname, GetCurrentThreadId()));

?

??? // set the thread priority

??? if(!GetPMThreadPriority(_T("PnPPriority256"), &iPriority)) {

??????? iPriority = DEF_PNP_THREAD_PRIORITY;

??? }

??? CeSetThreadPriority(GetCurrentThread(), iPriority);

?

??? // first list entry is the exit event

??? hEvents[dwNumEvents++] = ghevPmShutdown;

?

??? // set up device notifications

??? for(pdl = gpDeviceLists; pdl != NULL && dwNumEvents < dim(hEvents); pdl = pdl->pNext) {

??????? hEvents[dwNumEvents++] = pdl->hMsgQ;

???????? // 有幾個GUID類別,就申請幾個通知

??????? pdl->hnClass = RequestDeviceNotifications(pdl->pGuid, pdl->hMsgQ, TRUE);

??????? if(pdl->hnClass == NULL) {

??????????? PMLOGMSG(ZONE_WARN, (_T("%s: RequestDeviceNotifications() failed %d/r/n"),

??????????????? pszFname, GetLastError()));

??????? }

??? }

??? DEBUGCHK(dwNumEvents > 1);

?

??? // we're up and running

??? SetEvent(hevReady);

?

??? // wait for new devices to arrive

??? while(!fDone) {

??????? dwStatus = WaitForMultipleObjects(dwNumEvents, hEvents, FALSE, INFINITE);

?? ?????if(dwStatus == (WAIT_OBJECT_0 + 0)) {

??????????? PMLOGMSG(ZONE_WARN, (_T("%s: shutdown event set/r/n"), pszFname));

??????????? fDone = TRUE;

??????? } else if(dwStatus > WAIT_OBJECT_0 && dwStatus <= (WAIT_OBJECT_0 + MAXIMUM_WAIT_OBJECTS)) {

?????? ?????dwStatus -= WAIT_OBJECT_0;

????????????? // 收到通知就就對特定GUID設備的電源狀態進行獲取

??????????? fOk = ProcessPnPMsgQueue(hEvents[dwStatus]);

??????????? if(!fOk) {

??????????????? PMLOGMSG(ZONE_WARN, (_T("%s: ProcessPnPMsgQueue(0x%08x) failed/r/n"), pszFname,

???????????????? ???hEvents[dwStatus]));

??????????? }

??????? } else {

??????????? PMLOGMSG(ZONE_WARN, (_T("%s: WaitForMultipleObjects() returned %d, status is %d/r/n"),

??????????????? pszFname, dwStatus, GetLastError()));

??????????? fDone = TRUE;

??????????? break;

? ??????}

??? }

?

??? // release resources

??? for(pdl = gpDeviceLists; pdl != NULL; pdl = pdl->pNext) {

??????? if(pdl->hnClass != NULL) StopDeviceNotifications(pdl->hnClass);

??? }

?

??? // all done

??? PMLOGMSG(ZONE_INIT | ZONE_WARN, (_T("-%s: exiting/r/n"), pszFname));

??? return 0;

}

?????? 可以上面可以看到,線程PnpThreadProc只會偵測鏈表gpDeviceLists中創建的GUID類設備的通知,而gpDeviceLists是由函數DeviceListsInit()中進行初始化的。也就是說,PM最終所能夠識別的設備是那些在注冊表[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet

/Control/Power/Interfaces]下定義的GUID類,這也是為什么設備支持電源管理的話必須定義IClass

?????? 當然,理論上來講,你可以修改注冊表,添加一種新的GUID類,并ReWrite PM的代碼,使其支持你所添加的GUID類設備。

2PM獲取新加載設備所支持電源狀態過程

?????? 從上面函數PnpThreadProc()中可以看到,當偵測到有新設備通知發出來后,將會調用函數ProcessPnPMsgQueue()

?????? 函數ProcessPnPMsgQueue()完成的功能是獲取設備所支持的電源狀態,方式是調用MDD層提供的函數RequestStreamDevice或者RequestDisplayDevice。再說的具體一點就是,分別調用到設備驅動中的DeviceIoControlExtEscape

?????? 請看函數ProcessPnPMsgQueue()的代碼:

// This routine adds a device to the list associated with its device class.

// This routine does not return a value; it will either create a new

// device state structure and add it to a list or it will not.? If the new

// device duplicates an existing one this routine won't create a new node.

// This routine executes in the context of the PnP thread, which handles

// device interface additions and removals.

VOID

AddDevice(LPCGUID guidDevClass, LPCTSTR pszName, PDEVICE_STATE pdsParent,

????????? PPOWER_CAPABILITIES pCaps)

{

??? SETFNAME(_T("AddDevice"));

?

??? PMLOGMSG(ZONE_DEVICE,

??????? (_T("%s: adding '%s', pdsParent 0x%08x, pCaps 0x%08x to class %08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x/r/n"),

??????? pszFname, pszName, pdsParent, pCaps,

??????? guidDevClass->Data1, guidDevClass->Data2, guidDevClass->Data3,

??????? (guidDevClass->Data4[0] << 8) + guidDevClass->Data4[1], guidDevClass->Data4[2], guidDevClass->Data4[3],

??????? guidDevClass->Data4[4], guidDevClass->Data4[5], guidDevClass->Data4[6], guidDevClass->Data4[7]));

?

??? // figure out onto which list this device should be added

???? // DEVICE_LIST鏈表中查詢當前設備所在的GUID類對應的DEVICE_LIST指針

??? PDEVICE_LIST pdl = GetDeviceListFromClass(guidDevClass);

???

??? // did we find the list?

??? if(pdl != NULL) {

??????? // check for duplicates

???????? // 到當前設備所對應的DEVICE_LIST鏈表中查詢是否在名字為pszName的設備

??????? PDEVICE_STATE pds = DeviceStateFindList(pdl, pszName);

???????

??????? // create the device if it doesn't already exist

???????? // 如果不存在,則創建一個

??????? if(pds == NULL) {

??????????? BOOL fOk = FALSE;

????????????? // 為當前設備創建一個DEVICE_STATE節點

??????????? pds = DeviceStateCreate(pszName);

??????????? if(pds != NULL) {

??????????????? // if we are passed the device's capabilities, just copy them

??????????????? // into the structure

??????????????? if(pCaps != NULL) {

??????????????????? __try {

??????????????????????? pds->caps = *pCaps;

??????????????????? }

??????????????????? __except(EXCEPTION_EXECUTE_HANDLER) {

??????????????????????? PMLOGMSG(ZONE_WARN,

??????????????????????????? (_T("%s: exception during capabilities copy from 0x%08x/r/n"),

??????????????????????????? pszFname, pCaps));

??????????????????????? pCaps = NULL;

??????????????????? }

??????????????? }

???????????????

??????????????? // update the device's parent pointer

??????????????? if(pdsParent != NULL) {

??????????????????? DeviceStateAddRef(pdsParent);

??????????????? }

??????????????? pds->pParent = pdsParent;

???????????????

??????????????? // add the new device to its class list

?????????????????? // 將當前設備的DEVICE_STATE加入到guidDevClass對應的DEVICE_LIST鏈表中

??????????????? if(!DeviceStateAddList(pdl, pds)) {

????????????? ??????// deallocate the node, reference count isn't incremented

??????????????????? DeviceStateDecRef(pds);

??????????????????? pds = NULL;

??????????????? } else {

??????????????????? PREFAST_DEBUGCHK(pds->pInterface != NULL);

??????????????????? PREFAST_DEBUGCHK(pds->pInterface->pfnOpenDevice != NULL);

??????????????????? PREFAST_DEBUGCHK(pds->pInterface->pfnRequestDevice != NULL);

??????????????????? PREFAST_DEBUGCHK(pds->pInterface->pfnCloseDevice != NULL);

?????????????????????? // 獲取設備的操作Handle,這里比較重要,調用的其實是MDD層中首先的函數OpenStreamDevice或者OpenDisplayDevice

??????????????????? pds->hDevice = pds->pInterface->pfnOpenDevice(pds);

??????????????????? if(pds->hDevice == INVALID_HANDLE_VALUE) {

??????????????????????? PMLOGMSG(ZONE_WARN, (_T("%s: couldn't open device '%s'/r/n"),

??????????????????????????? pszFname, pszName != NULL ? _T("<NULL>") : pszName));

??????????????????? } else {

??????????????????????? // do we need to request capabilities?

??????????????????????? fOk = TRUE;???????????? // assume success

??????????????? ????????if(pCaps == NULL) {

??????????????????????????? DWORD dwBytesReturned;

??????????????????????????? POWER_RELATIONSHIP pr;

??????????????????????????? PPOWER_RELATIONSHIP ppr = NULL;

??????????????????????????? memset(&pr, 0, sizeof(pr));

????????? ??????????????????if(pds->pParent != NULL) {

??????????????????????????????? PMLOGMSG(ZONE_DEVICE, (_T("%s: parent of '%s' is '%s'/r/n"),

??????????????????????????????????? pszFname, pds->pszName, pds->pParent->pszName));

??????????????????????????????? pr.hParent = (HANDLE) pds->pParent;

??????????????????????????????? pr.pwsParent = pds->pParent->pszName;

??????????????????????????????? pr.hChild = (HANDLE) pds;

??????????????????????????????? pr.pwsChild = pds->pszName;

??????????????????????????????? ppr = &pr;

??????????????????????????? }???????????????????????

???????????????????????????

??????????????????????????? // get the device's capabilities structure

???????????????????????????????? // 有點意思了,呵呵,調用IOCTL_POWER_CAPABILITIES獲取設備所支持的電源狀態這里比較重要,調用的其實是MDD層中首先的函數RequestStreamDevice或者RequestDisplayDevice,對于這兩類設備來說,分別調用到設備驅動中的DeviceIoControlExtEscape

??????????????????????????? fOk = pds->pInterface->pfnRequestDevice(pds->hDevice, IOCTL_POWER_CAPABILITIES,

??????????????????????????????? ppr, ppr == NULL ? 0 : sizeof(*ppr),

??????????????????????????????? &pds->caps, sizeof(pds->caps), &dwBytesReturned);

???????????????????????????

??????????????????????????? // sanity check the size in case a device is just returning

??????????????????????????? // a good status on all ioctls for some reason

??????????????????????????? if(fOk && dwBytesReturned != sizeof(pds->caps)) {

??????????????????????????????? PMLOGMSG(ZONE_WARN,

??????????????????????????????????? (_T("%s: invalid size returned from IOCTL_POWER_CAPABILITIES/r/n"),

? ??????????????????????????????????pszFname));

??????????????????????????????? fOk = FALSE;

??????????????????????????? }

??????????????????????? }

?

??????????????????????? // any problems so far?

??????????????????????? if(fOk) {

????????????????????????? ??// determine whether we should request power relationships from a parent device

???????????????????????????????? // 幫助文檔中提到,這里的意思是:

???????????????????????????????? // Set to POWER_CAP_PARENT bit if the device would like to receive an IOCTL_REGISTER_POWER_RELATIONSHIP call after initialization

???????????????????????????????? // BSP中并沒有使用,應該不用關注

??????????????????????????? if((pds->caps.Flags & POWER_CAP_PARENT) != 0) {

??????????????????????????????? pds->pInterface->pfnRequestDevice(pds->hDevice, IOCTL_REGISTER_POWER_RELATIONSHIP,

??????????????????????????????????? NULL, 0, NULL, 0, NULL);

??????????????????????????? }

??????????????????????? }

??????????????????? }

??????????????? }

???????????????

??????????????? // have we read all the configuration information we need from

??????????????? // the new device

??????????????? if(!fOk) {

??????????????????? // no, delete the device

??????????????????? DeviceStateRemList(pds);

??????????????? } else {

??????????????????? // See if the device supports multiple handles.? Power manageable devices

??????????????????? // should allow multiple open handles, but if they don't we will have to open

??????????????????? // one before each access.

??????????????????? HANDLE hDevice = pds->pInterface->pfnOpenDevice(pds);

??????????????????? if(hDevice == INVALID_HANDLE_VALUE) {

??????????????? ????????PMLOGMSG(ZONE_WARN, (_T("%s: WARNING: '%s' does not support multiple handles/r/n"),

??????????????????????????? pszFname));

??????????????????????? pds->pInterface->pfnCloseDevice(pds->hDevice);

??????????????????????? pds->hDevice = INVALID_HANDLE_VALUE;

??????????????????? } else {

??????????????????????? // close the second handle, since we don't need it

??????????????????????? pds->pInterface->pfnCloseDevice(hDevice);

??????????????????? }

???????????????????

??????????????????? // initialize the new device's power state variables

?????????????????????? // 這里就不用說了,更新電源狀態,呵呵

??????????????????? UpdateDeviceState(pds);

??????????????? }

??????????? }

??????? }

???????

??????? // we are done with the device pointer

??????? if(pds != NULL) {

??????????? DeviceStateDecRef(pds);

??????? }

??? } else {

??????? PMLOGMSG(ZONE_WARN, (_T("%s: class for device '%s' not supported/r/n"),

??????????? pszFname, pszName));

??? }

}

3IClassAP層面的影響

?????? 這個比較簡單,可以參照Help文檔,如下:

Beginning with Windows CE .NET 4.10, power-manageable devices can belong to varying device classes. These device classes consist both of predefined classes as well as custom device classes. The Power Manager APIs that accept device names can also accept class-qualified device names. For example, each of the following names is a valid device name:

·???????????????? COM1:

·???????????????? {A32942B7-920C-486b-B0E6-92A702A99B35}/COM1:

·???????????????? {98C5250D-C29A-4985-AE5F-AFE5367E5006}/CISCO1

·???????????????? {8DD679CE-8AB4-43c8-A14A-EA4963FAA715}/DSK1:

If a class does not qualify a device name, the device is assumed to belong to the default device class. For example, the names COM1: and {A32942B7-920C-486b-B0E6-92A702A99B35}/COM1: are equivalent.

?????? 可以看到,AP調用PMAPI嘗試去獲取或者改變設備的電源狀態的時候,需要傳入爭取地Device name,如果傳入的Device name不包含IClass的話,系統將其認為是默認的IClass類,也就是{A32942B7-920C-486b-B0E6-92A702A99B35}

?????? 由于SDK中會有GUID類的定義,所以AP中調用PM API的時候最好能夠傳入完整的Device name

?

?

總結

以上是生活随笔為你收集整理的IClass与电源管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

成年人免费看的视频 | 国产精品国内免费一区二区三区 | 丁香在线观看完整电影视频 | 精品国内自产拍在线观看视频 | 免费看国产一级片 | 999一区二区三区 | 欧美一级在线观看视频 | 午夜手机看片 | 视频国产 | 久久视频在线免费观看 | 国产免费观看久久黄 | 亚洲综合色丁香婷婷六月图片 | 精品资源在线 | 91 中文字幕| 性色av免费在线观看 | 超碰在线cao | 国产一级视屏 | 伊香蕉大综综综合久久啪 | 81精品国产乱码久久久久久 | 涩五月婷婷 | 黄色av三级在线 | 日韩在线欧美在线 | 99在线观看免费视频精品观看 | 中文亚洲欧美日韩 | 超碰公开在线观看 | 免费在线观看av片 | 欧美日韩不卡在线 | 日本中文字幕电影在线免费观看 | 500部大龄熟乱视频 欧美日本三级 | 夜夜高潮夜夜爽国产伦精品 | 片网站| 黄色网在线播放 | 日韩sese | 91麻豆产精品久久久久久 | 99r在线精品 | 国产视频精品久久 | 有码中文字幕在线观看 | 国产视频每日更新 | 久久久久久久久久久精 | 国产精品国产亚洲精品看不卡15 | 国产精品综合在线 | 久久精品com | 操操操日日日 | 国产午夜精品av一区二区 | 在线观看免费视频你懂的 | 在线观看完整版免费 | 99久久99久国产黄毛片 | 欧美最猛性xxx | 99精品免费观看 | 黄色精品在线看 | 国产二区免费视频 | 狠狠色香婷婷久久亚洲精品 | 91精品国产成人观看 | 午夜精品999 | 九九免费在线观看视频 | 日韩在线电影一区 | av在线免费网| 国产精品2018 | 五月天久久综合网 | 一级片观看 | 91视频在线免费下载 | 日韩久久久久久久久久 | 天天做综合网 | 亚洲精品国产欧美在线观看 | 69国产成人综合久久精品欧美 | 深爱五月激情五月 | 日本视频网| 成人免费视频播放 | 精品专区一区二区 | 久久久久久久网 | 免费精品国产va自在自线 | 国产精品色婷婷 | 久久精品一二三区 | 国产精品一区二区精品视频免费看 | 蜜臀久久99精品久久久无需会员 | 日韩激情视频在线观看 | 不卡国产在线 | av成人在线看 | 久久久久久欧美二区电影网 | 黄色大片网 | 日韩av看片| 成人影片在线免费观看 | 懂色av一区二区在线播放 | a黄色 | 人人干狠狠干 | 日日操日日| 天天色天天射天天干 | 国产黄色片免费看 | 波多野结衣一区三区 | 久久综合九色综合久久久精品综合 | 国产成人一区二区三区电影 | 国产精品久久久久久久久久久久午夜片 | 亚洲日本在线一区 | 婷婷六月天综合 | 中国黄色一级大片 | 天天做天天爱天天爽综合网 | 国产精品不卡 | 99视频在线免费看 | 久久免费大片 | www在线观看视频 | 精品美女久久久久久免费 | 欧美污污视频 | 丁香久久激情 | 亚洲一区二区三区在线看 | 国产日韩在线观看一区 | 日韩精品无| 在线看片视频 | 99看视频在线观看 | 日韩欧美国产激情在线播放 | 欧美亚洲久久 | 99视频在线免费播放 | av免费电影在线观看 | 亚洲成人资源在线观看 | 婷婷国产在线观看 | 黄色中文字幕 | 外国av网 | 久久精品欧美日韩精品 | www国产精品com | 亚洲精品国产精品久久99热 | 久久免费看视频 | 成人免费看片98欧美 | 亚洲人成免费网站 | 青草视频在线看 | 在线观av | 麻豆视屏| 婷婷丁香五 | 久久99精品国产麻豆宅宅 | 免费试看一区 | 国产成人一区二区三区 | 成人小视频在线 | 69精品在线| 日韩欧美视频二区 | 久久免费在线 | 欧美日韩在线精品一区二区 | 久久久久欧美精品 | 高清日韩一区二区 | 欧美视频www| 就要干b | 日本中文字幕在线免费观看 | 久久久91精品国产一区二区精品 | 中文在线| 激情伊人| aⅴ精品av导航 | 国产一线二线三线性视频 | 国产精品嫩草影视久久久 | 欧美一级性生活视频 | 国产精品自在欧美一区 | 亚洲黄色小说网址 | 日韩精品极品视频 | av成人免费在线 | 久久久久激情 | 一区二区三区在线播放 | 免费看一级特黄a大片 | 天天综合入口 | 热久久国产 | 日韩成人欧美 | 99热精品国产一区二区在线观看 | 亚洲综合丁香 | 国产精品av久久久久久无 | 久久精品人人做人人综合老师 | 久久久激情网 | 91插插视频 | 97国产人人| 亚洲视频精品 | 超碰免费成人 | 99久久久成人国产精品 | 日韩大陆欧美高清视频区 | 天天操比| 91丨九色丨国产丨porny精品 | 中文字幕大全 | 精品自拍sae8—视频 | 亚洲日本三级 | 黄色成人在线观看 | 精品国产一区二区三区噜噜噜 | av视屏在线播放 | 91精品在线播放 | 欧美国产日韩一区二区 | 国产精品黄色影片导航在线观看 | 精品国产伦一区二区三区观看方式 | 国产成人精品久久久久蜜臀 | 婷婷色5月| 亚洲国产操 | 丁香六月网| 九草视频在线观看 | 成人一区二区三区中文字幕 | 成人免费一级 | 一区二区三区日韩在线观看 | 久久成人人人人精品欧 | 国产日韩欧美在线 | 国产精品一区二区av麻豆 | 免费观看9x视频网站在线观看 | 国产精品系列在线观看 | 日韩电影中文,亚洲精品乱码 | 欧美动漫一区二区三区 | 色婷婷电影网 | 69久久久| 奇米影视在线99精品 | 亚洲国产高清视频 | 国产婷婷精品av在线 | 亚洲视屏在线播放 | 在线天堂亚洲 | 国产群p视频 | www.eeuss影院av撸 | 国产成人不卡 | 1024手机在线看 | 最近中文字幕在线中文高清版 | 四虎影视精品永久在线观看 | 成人午夜网址 | 国产在线黄 | 特黄免费av| 97国产大学生情侣白嫩酒店 | 精品国产电影一区 | 中文字幕在线观看免费高清完整版 | 色播亚洲婷婷 | 不卡的av电影 | 国产精品mv | 国产一级做a| 久久精品视频免费播放 | 中文在线8新资源库 | 欧美视频国产视频 | 久久久久草 | 久久精品国产精品亚洲精品 | 密桃av在线 | 色欲综合视频天天天 | 免费视频黄 | 久久不卡日韩美女 | a级国产乱理论片在线观看 特级毛片在线观看 | 成人av免费网站 | 日本在线观看一区二区 | 91九色国产| 一区二区三区手机在线观看 | 成年人在线视频观看 | 国产在线国偷精品产拍免费yy | 人人爽人人爽 | 亚洲国产成人久久 | 91精品国产麻豆国产自产影视 | 好看av在线 | 四虎成人精品永久免费av | 久久a级片 | 91插插插网站 | 国产视频一区在线 | 成人av一区二区在线观看 | 日韩精品观看 | 青青色影院 | 久久久久久久久久久电影 | 在线免费观看黄网站 | 日韩在线视频观看 | 在线看免费 | 新版资源中文在线观看 | 久久久久久久久久免费视频 | 国产福利在线 | 在线久热 | 婷婷在线色| www黄在线| 国产资源精品在线观看 | 久久不色 | 久草在线资源网 | 最近中文字幕mv免费高清在线 | 精品国产免费久久 | 91亚洲成人 | 一区二区三区中文字幕在线观看 | 久久久国产精品电影 | 国产黄色高清 | 2019久久精品 | 97色婷婷| 久久久三级视频 | 成人在线观看日韩 | 天天色天天综合网 | 欧美疯狂性受xxxxx另类 | 欧美日韩国产一二三区 | 麻豆网站免费观看 | 亚洲综合色网站 | 精品一区二区影视 | 久久夜色精品国产欧美一区麻豆 | 亚洲精品www久久久久久 | 成人在线播放免费观看 | 久久爱992xxoo | 日韩理论 | 91亚洲激情 | 亚洲欧美日韩国产一区二区三区 | 国产一二三区av | 国产又粗又猛又爽又黄的视频免费 | 久久成人高清视频 | 国产精品视频最多的网站 | 中文字幕一区二区三区四区视频 | 精品国产一区二区三区四 | 国产精品毛片久久久久久久久久99999999 | 国产高清视频在线播放 | 999国产在线 | 夜夜夜草| 精品96久久久久久中文字幕无 | 国产精品久久久久久久久久尿 | 特级黄色视频毛片 | 天天操天天操天天操天天操天天操天天操 | 精品一区精品二区高清 | 欧美日韩免费看 | 西西大胆免费视频 | 天堂av在线7 | 亚洲成人精品 | 欧美韩日在线 | 四虎国产精品成人免费4hu | 91一区二区三区久久久久国产乱 | 成人免费观看网站 | 国产人成看黄久久久久久久久 | 亚洲精品麻豆 | 日本韩国精品在线 | 久久露脸国产精品 | 亚州性色 | 狠狠色综合网站久久久久久久 | 亚洲成av人片在线观看无 | 在线观看免费 | 黄色网址中文字幕 | 麻豆av一区二区三区在线观看 | 一区二区三区在线观看免费 | 91桃色免费观看 | 国产丝袜 | 成人黄色片在线播放 | 91av视频在线观看 | 蜜臀久久99精品久久久无需会员 | 亚洲精品乱码久久久久久写真 | 亚洲精品看片 | 国产女人40精品一区毛片视频 | 免费视频一区 | 日韩精品中文字幕在线观看 | 中文字幕麻豆 | 美女精品久久久 | 香蕉网址 | 天天天干夜夜夜操 | 色在线视频 | 午夜av免费观看 | 日韩v欧美v日本v亚洲v国产v | 亚洲成av人片在线观看无 | 婷婷丁香色综合狠狠色 | 国产午夜在线观看 | 国产成视频在线观看 | 久久毛片高清国产 | 亚洲乱亚洲乱妇 | 久久精品一区八戒影视 | 91日韩免费| 免费网站在线 | 亚洲综合视频在线观看 | 欧美 日韩 性 | 九九精品在线观看 | 日本色小说视频 | 欧美性色黄大片在线观看 | 午夜电影久久 | 日韩精品视 | 久久草在线视频国产 | 久久夜色电影 | 九九热在线精品视频 | 国产性天天综合网 | 国产精品一区在线 | 射久久 | 久久精品99久久久久久 | 精品国产乱码久久久久久1区2匹 | 97视频人人澡人人爽 | 久久综合网色—综合色88 | 日韩高清在线观看 | 国产小视频福利在线 | www.日日日.com| 超碰免费av| 手机av网站 | 国产精品久久久久久久久婷婷 | 日本动漫做毛片一区二区 | 久久五月婷婷综合 | 色香com. | 成人国产在线 | 五月天综合 | 中文视频在线播放 | 国产成人精品一区一区一区 | 91在线看视频免费 | 亚洲精品麻豆视频 | 全黄色一级片 | 天天色天天操综合 | 日韩av在线看 | 国产精品国产三级国产aⅴ无密码 | a v在线观看 | 久热超碰| 亚洲综合在线一区二区三区 | 色网影音先锋 | 91精品老司机久久一区啪 | sesese图片| 亚洲国产视频网站 | 天堂av网站 | 91资源在线视频 | 黄色美女免费网站 | 精品国产乱子伦一区二区 | 五月天久久 | h视频在线看 | 中文字幕中文字幕在线中文字幕三区 | 国产乱码精品一区二区蜜臀 | 成人免费观看网址 | 高清av网站| 欧美巨大荫蒂茸毛毛人妖 | 久久精品导航 | 深爱婷婷网 | 亚洲九九九在线观看 | 日韩中文字幕国产精品 | 99色| 中文字幕成人在线 | 在线视频一二区 | 日韩亚洲在线视频 | 亚洲第一中文字幕 | 中文字幕大全 | 国产精品视频在线看 | www.伊人网.com | 在线观看91av | 婷婷5月色| 欧美男同视频网站 | av在线免费网站 | 天天色成人 | 欧美三级免费 | 亚洲精品乱码久久久久久蜜桃不爽 | 色婷婷亚洲 | 久久久久免费看 | 婷婷国产精品 | 日韩国产精品一区 | 日韩黄色在线电影 | 91精品国产综合久久福利不卡 | www.色国产| 日韩电影中文,亚洲精品乱码 | 精品国产一区二区三区噜噜噜 | 欧亚日韩精品一区二区在线 | 17婷婷久久www | 欧美aa一级片 | 中文字幕4| 人人爽人人爽人人爽人人爽 | 最新国产在线观看 | 成人网色 | 91插插插网站 | 久久看免费视频 | 国产毛片在线 | 毛片3 | 欧美综合久久 | 欧美激情在线看 | 91一区啪爱嗯打偷拍欧美 | 人人爱爱 | 国产精品青草综合久久久久99 | 久久久男人的天堂 | 97成人精品 | 在线精品视频在线观看高清 | 成人黄性视频 | 麻豆视频在线播放 | 91在线视频一区 | 国产在线资源 | 特级a老妇做爰全过程 | 久久久久亚洲精品成人网小说 | 久久国产一二区 | 欧美日韩另类视频 | 日韩精品在线观看视频 | 日产乱码一二三区别免费 | 高清免费在线视频 | 久草在线视频在线观看 | 国产在线视频资源 | 九色91av| 99精品在这里 | www91在线观看 | 国内精自线一二区永久 | 四虎成人网| 狠狠久久伊人 | 天天综合导航 | 这里只有精彩视频 | 久久久久国产视频 | 69av视频在线 | 麻豆一精品传二传媒短视频 | 久久成人在线 | 最近更新的中文字幕 | 日韩免费电影在线观看 | 黄色av成人在线观看 | 91亚洲国产成人久久精品网站 | 国产黄色片免费看 | 91九色视频观看 | 麻豆传媒视频观看 | 波多野结衣一区 | 日本中文字幕网址 | 在线午夜| 免费日韩一区二区三区 | 欧美精品资源 | www.69xx| 日韩中文字幕免费在线播放 | 欧美一区二视频在线免费观看 | 蜜桃视频在线视频 | 国产午夜三级一二三区 | 中文字幕在线免费看 | 国产日韩欧美视频 | av官网在线 | 99精品国产兔费观看久久99 | 欧美日韩精 | 国产日产av | 99在线观看免费视频精品观看 | 亚洲第一av在线 | 久久免费视频一区 | 精品国产一区二区三区久久久蜜臀 | 国产第一页在线播放 | 色婷婷狠狠 | 中文字幕在线免费观看视频 | 亚洲成av | 中文字幕在线影院 | 国产黄色片一级三级 | 亚洲成aⅴ人片久久青草影院 | 色天天中文 | 毛片在线网 | 狠狠干网站 | 九七在线视频 | 免费看片网址 | 精品视频99 | 国产香蕉97碰碰碰视频在线观看 | 国产一级视频在线 | 欧美日韩精品免费观看 | 99精品久久久久久久 | 五月婷在线视频 | 精品一区在线 | 九九九视频在线 | 久久视频在线免费观看 | 国产中文欧美日韩在线 | 福利精品在线 | 日韩字幕在线 | 粉嫩av一区二区三区四区 | 激情综合五月婷婷 | 一级大片在线观看 | 黄色一集片| 波多野结衣视频网址 | 中文字幕一区二区三区四区视频 | 国产精品爽爽久久久久久蜜臀 | 五月天激情综合 | 激情综合五月婷婷 | 日本中文字幕在线视频 | 国产成人精品一区二区三区在线观看 | 黄色www在线观看 | 国产不卡在线观看视频 | 久久视频免费 | 国产精品福利视频 | 日韩在线观看第一页 | 激情久久伊人 | 免费91麻豆精品国产自产在线观看 | 成人免费视频播放 | 亚洲无毛专区 | 亚洲激情综合网 | 亚洲视频h | 国产麻豆电影在线观看 | 日韩综合第一页 | 久久亚洲区 | 国产精品自产拍在线观看蜜 | 天天综合精品 | 五月天综合婷婷 | 日韩欧美在线一区 | 一本一本久久a久久精品牛牛影视 | 在线视频你懂 | 天天色天天色天天色 | 四虎影视4hu4虎成人 | 欧美一二区在线 | 亚洲精品国偷自产在线99热 | 亚洲成av人影片在线观看 | 国产精品久久久久久久毛片 | 欧美日韩视频在线观看一区二区 | 丁香花在线观看视频在线 | 中文字幕影视 | 五月开心婷婷 | 99热九九这里只有精品10 | 91av免费观看 | 99亚洲精品在线 | 国产伦理久久精品久久久久_ | 激情五月婷婷综合网 | 91天堂影院 | 五月天综合网站 | 国产精品18毛片一区二区 | 国产欧美精品一区二区三区 | 亚洲天天综合网 | 亚洲第一区在线观看 | 九七视频在线观看 | 7777精品伊人久久久大香线蕉 | 日韩久久久久久久久久 | 西西www444| 不卡视频在线 | 国产第一页福利影院 | 91精品国产99久久久久久红楼 | 国产玖玖视频 | 久久香蕉电影网 | 成片免费观看视频999 | 日日碰狠狠躁久久躁综合网 | 97色在线观看 | 欧美性黑人 | 国产精品一区二区在线播放 | 一区二区三区在线免费播放 | 国产在线观 | 国产国产人免费人成免费视频 | 91av综合 | 精品久久久久久国产 | 久日精品 | 欧美日韩一区二区三区免费视频 | 欧美日韩一区二区免费在线观看 | 成人黄色电影免费观看 | 婷婷伊人五月天 | 国产特级毛片aaaaaa毛片 | 正在播放五月婷婷狠狠干 | 免费观看视频黄 | 日日夜夜天天久久 | 综合久久一本 | 人人爽夜夜爽 | 黄色在线看网站 | 久久不卡av | 国产精品系列在线 | 精品久久久99 | 精品国产一区二区三区日日嗨 | 色国产精品 | 99热在线国产 | 亚洲色图av | 国产精品 中文字幕 亚洲 欧美 | 91精品啪在线观看国产81旧版 | 亚洲日本激情 | 奇米网网址 | 午夜 免费 | 又爽又黄又无遮挡网站动态图 | 免费看三级黄色片 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 人人射| 日韩免费一区二区在线观看 | 奇米777777| 蜜臀av一区二区 | 国产高清在线免费观看 | 久久国产经典视频 | 免费观看成人网 | 欧日韩在线 | 亚洲高清av | 天天躁日日躁狠狠躁av中文 | 久久九九精品 | 狠狠色伊人亚洲综合网站色 | 久久免费国产视频 | 天天干亚洲 | 国产一区麻豆 | 午夜精品久久久久久中宇69 | 久久99视频免费观看 | 在线视频99 | 国产成本人视频在线观看 | 在线观看免费一区 | 国产成人精品午夜在线播放 | 国产精品亚洲片在线播放 | 9在线观看免费高清完整 | 亚洲成av人片 | 97超碰在线资源 | 久草免费在线视频 | 日韩高清在线一区二区三区 | 激情视频综合网 | 爱爱一区 | 在线观看日韩精品视频 | 色噜噜噜| 中文字幕日韩高清 | 久久精品美女视频 | 啪啪免费视频网站 | 日韩欧美在线一区二区 | 国产91精品一区二区绿帽 | 精品视频免费播放 | 久久艹在线观看 | 国产日韩欧美自拍 | 99久久精品久久亚洲精品 | 免费观看黄 | 999久久a精品合区久久久 | 二区中文字幕 | 久久久久久久久久久免费av | 欧美巨大荫蒂茸毛毛人妖 | 夜夜爽88888免费视频4848 | 人人澡超碰碰 | 亚州人成在线播放 | 欧美精品在线观看 | 国产成人一区二区三区免费看 | 亚洲在线网址 | 91黄视频在线| 91精品久久久久久久久久久久久 | av成人黄色| 日韩国产欧美在线播放 | 亚洲精品www. | 狠狠操欧美 | 色综合久久五月天 | 成人黄色在线电影 | 久久99视频精品 | 91专区在线观看 | www.狠狠操 | 日韩女同一区二区三区在线观看 | 永久精品视频 | 亚洲综合欧美精品电影 | 中文字幕在线视频第一页 | 国产高清av在线播放 | 激情五月***国产精品 | 亚洲精品理论片 | 丝袜美腿亚洲综合 | 国产精品成人久久久久 | 在线视频福利 | 国产精品毛片久久蜜 | 97视频免费 | 伊甸园永久入口www 99热 精品在线 | 丁香久久久 | 麻豆国产电影 | 成人资源站 | 日本精品在线视频 | 黄视频网站大全 | 国产精品丝袜在线 | 免费看黄在线看 | 亚洲最大av在线播放 | 最新中文字幕在线观看视频 | 欧美激情视频在线观看免费 | 99久久夜色精品国产亚洲 | 国产精品久久久久久a | 国产色就色| av中文在线影视 | 人人插人人草 | 少妇视频一区 | 天天天操操操 | 亚洲天堂社区 | 麻豆视频免费在线 | 狠狠色丁香婷婷综合视频 | 欧美久久久久 | 丰满少妇在线观看资源站 | 亚洲成人黄色在线观看 | 日本视频久久久 | 日日夜夜免费精品 | 国产精品国内免费一区二区三区 | 欧美日韩亚洲在线观看 | 精品国产成人av | 国产日韩在线播放 | 又黄又网站| 色婷婷狠狠五月综合天色拍 | 久久成人黄色 | av一区在线 | 亚洲欧洲成人精品av97 | 91探花在线视频 | 久久免费福利视频 | 91在线免费播放视频 | 久久五月精品 | 亚洲欧美偷拍另类 | 亚洲欧洲精品一区二区 | 超碰在线人人艹 | 免费麻豆网站 | av电影中文字幕在线观看 | 99色婷婷| 日韩一区正在播放 | 欧美精品小视频 | 久久精品视频一 | 国产精品99久久久精品免费观看 | 久久超级碰 | 成人综合免费 | 欧美日韩国产xxx | 操操操日日日 | 香蕉久久久久久av成人 | 日韩在线精品一区 | 国产在线97| 亚洲午夜在线视频 | 久久一二三四 | 免费黄a | 国产精品影音先锋 | 国产一二三在线视频 | 久久久免费精品视频 | 日韩精选在线 | 九九热免费在线视频 | 午夜精品视频一区二区三区在线看 | 成人一级视频在线观看 | 在线免费观看视频a | 精品一区av | 日韩欧美视频一区二区三区 | 久久在线视频精品 | 人人舔人人爽 | 日韩大陆欧美高清视频区 | 91色在线观看 | 一区二区三区在线观看免费 | 日本午夜免费福利视频 | 久久综合丁香 | 黄色app网站在线观看 | 五月婷社区 | 国产精品自在欧美一区 | 丁香5月婷婷久久 | 一区二区三区免费在线观看 | 97天天干 | 亚洲成人在线免费 | 免费十分钟 | 91干干干 | 日韩高清精品一区二区 | 国产亚洲精品bv在线观看 | www五月天com| 欧美性一级观看 | 国产在线观看免费 | 毛片a级片 | 99免费在线视频观看 | 亚洲 欧美 成人 | 四川妇女搡bbbb搡bbbb搡 | 亚洲资源 | 日韩动态视频 | 久久亚洲影视 | 久久久久五月 | 免费一级日韩欧美性大片 | 午夜精品久久久久久久99无限制 | 99九九热只有国产精品 | 天天曰天天曰 | 在线观看资源 | 在线天堂8√ | 久久欧美在线电影 | 麻豆视频免费在线播放 | 国产美女网 | 亚洲美女精品区人人人人 | 青青草国产成人99久久 | 在线日韩 | 亚洲视频大全 | 久久亚洲综合国产精品99麻豆的功能介绍 | 99精品视频免费全部在线 | a视频在线观看 | 日批视频在线观看免费 | 婷婷深爱网 | 久久经典国产视频 | 国产五月婷| 国产一级在线播放 | 中文字幕在线一区二区三区 | 成人亚洲精品国产www | 久久免费观看少妇a级毛片 久久久久成人免费 | 91精品免费在线 | 制服丝袜亚洲 | 在线欧美日韩 | 国产亚洲视频中文字幕视频 | 久久久久国产精品一区二区 | 亚洲国产黄色 | 玖玖视频免费在线 | 免费福利在线观看 | 日韩成人免费在线观看 | 不卡的av在线播放 | 91激情视频在线观看 | 日韩天天操 | 亚洲欧美成人在线 | 免费一级片在线 | 97国产小视频 | 精品91| 国产高清不卡 | 精品福利视频在线观看 | 最近中文字幕视频完整版 | 国产日韩欧美视频在线观看 | 国产成人综 | 久久成人免费 | 国产精品麻豆果冻传媒在线播放 | 超碰在线日本 | 丁香综合av| 四虎影视成人精品国库在线观看 | 国产精品一区二区三区在线看 | 韩国视频一区二区三区 | 黄色a一级视频 | 丝袜制服天堂 | 免费看一及片 | 久久99精品波多结衣一区 | 国产又粗又长又硬免费视频 | 成年人在线电影 | 日韩免费小视频 | 免费69视频 | 亚洲最新av在线网址 | 五月婷综合| 美女黄频在线观看 | 在线 国产 亚洲 欧美 | 99久久久久免费精品国产 | 999成人| 97免费在线视频 | 欧美大jb| 午夜三级理论 | 日日夜夜综合网 | 中文 一区二区 | 丝袜美腿一区 | 久久亚洲区| 国产97视频 | 91激情 | 国内视频在线观看 | 久草在线资源免费 | 亚洲黄色av网址 | 国模精品一区二区三区 | 精品国产一区二区三区久久久蜜臀 | 欧美日韩国产精品爽爽 | 日韩二区三区在线观看 | 中中文字幕av在线 | 91久久久国产精品 | 日日爽日日操 | 国产精彩在线视频 | 天天爱天天射 | 九九九毛片 | 成人电影毛片 | 欧美日韩aaaa | 中文字幕av网站 | 亚洲精品麻豆 | 天天曰夜夜爽 | 婷婷精品国产欧美精品亚洲人人爽 | 日韩最新av在线 | 国产精品99久久久久久小说 | 日韩精品中文字幕久久臀 | 日批视频国产 | 日韩在线免费高清视频 | 黄色av电影| 欧美激情第八页 | 激情视频综合网 | 插久久 | 最新av免费在线观看 | 国产精品高清免费在线观看 | 97国产电影 | 久久久免费精品 | 国产在线精品观看 | 草在线视频 | 99国产精品久久久久久久久久 | 精品国产一区二区三区在线 | 一区三区视频 | 天天色综合三 | 国产亚洲欧美一区 | 久久视频在线观看 | 国产精品视频线看 | 黄色成人av在线 | 日韩欧美国产成人 | 欧美贵妇性狂欢 | 涩涩成人在线 | 成人免费大片黄在线播放 | 天天操夜夜操国产精品 | 精品视频久久久 | 国产精品video爽爽爽爽 | 亚洲在线视频观看 | 97免费视频在线 | 五月宗合网 | 91精品国产一区二区在线观看 | 免费观看成人 | a级黄色片视频 | 久久在线电影 | av爱干| 波多野结衣在线视频免费观看 | 欧美午夜精品久久久久 | 天天草天天爽 | 日韩精品一区二区三区高清免费 | 97视频一区 | 欧美国产不卡 | 在线免费高清一区二区三区 | 99这里只有精品99 | 欧美日韩3p | 久草观看视频 | 国产录像在线观看 | 在线综合 亚洲 欧美在线视频 | 91av电影网| 日韩最新在线 | 天天天操操操 | 免费观看www视频 | 亚洲欧美精品一区二区 | 在线观看成人 | 亚洲成年人免费网站 | 亚洲一区二区视频在线播放 | 亚洲美女免费精品视频在线观看 | 999久久久久久久久6666 | 久久综合影音 | 国产精品第2页 | 国产成人综 | 9999在线观看| 日韩久久精品一区 | 在线观看免费av网站 | 在线观看 亚洲 | 黄色精品在线看 | 在线电影av | 九九视频这里只有精品 | 成人免费视频a | 婷婷久久国产 | 一二三区视频在线 | 国产精品国产三级国产aⅴ无密码 | 国产小视频你懂的 | 天天干人人干 | 亚洲免费公开视频 | 999电影免费在线观看2020 | 亚洲综合色激情五月 | 夜夜夜影院 | 永久免费av在线播放 | 亚洲成人免费 | 欧美巨乳波霸 | 国产精品久久久久亚洲影视 | 日韩在线视频免费看 | 在线91播放 | 中文字幕 国产 一区 | 香蕉色综合 | 国产又黄又爽无遮挡 | 久久久久国产a免费观看rela | 精品国产一区二区三区av性色 | 欧美aa一级片 | 免费观看91 | 亚洲一区二区天堂 | 精品视频中文字幕 | 久久黄页| 国产黄大片在线观看 | 狠狠色丁香婷婷综合久久片 | 国产视频精品在线 | 国产在线观看高清视频 | 亚洲码国产日韩欧美高潮在线播放 | 国产精品正在播放 | 成人免费一区二区三区在线观看 | 一级黄色片在线免费看 | 国产精品久久 | 中文字幕在线日本 | 日韩伦理一区二区三区av在线 | 日韩一区二区三区高清免费看看 | h久久| 精品成人免费 | 亚洲有 在线| 99re国产| 成人在线观看网址 | 国产精品嫩草在线 | 亚洲 中文 欧美 日韩vr 在线 | japanesexxxxfreehd乱熟 | 一级一片免费视频 |