PDD_SURFCB_LOCK回呼函式 (ddrawint.h)
DdLock 回呼函式會鎖定指定的表面記憶體區域,並提供與表面相關聯之內存區塊的有效指標。
語法
PDD_SURFCB_LOCK PddSurfcbLock;
DWORD PddSurfcbLock(
PDD_LOCKDATA unnamedParam1
)
{...}
參數
unnamedParam1
指向 DD_LOCKDATA 結構,其中包含執行鎖定所需的資訊。
傳回值
DdLock 會傳回下列其中一個回呼碼:
言論
DdLock 應該將 lpLock DD_LOCKDATA 結構的 ddRVal 成員設定為 DDERR_WASSTILLDRAWING,並在 blit 或 flip 進行時傳回DDHAL_DRIVER_HANDLED。
除非由 dwFlags 成員DD_LOCKDATA所指定,否則驅動程式可以將記憶體指標傳回 lpSurfData DD_LOCKDATA 之介面頂端的記憶體指標。 如果驅動程式需要計算介面自己的位址,它可以依賴傳入 fpProcess 的指標,DD_LOCKDATA成員 做為其 DirectDraw 可存取框架緩衝區之使用者模式對應的每一進程指標。
鎖定不提供要求的記憶體區塊獨佔存取權;也就是說,多個線程可以同時鎖定相同的介面。 應用程式必須負責同步存取要取得其指標的記憶體區塊。
在 NT 型作系統上執行的驅動程式不應該從其 DdLock 函式傳回系統記憶體的指標,除非該驅動程式的 DdCreateSurface 函式先前使用 PLEASE_ALLOC_USERMEM 旗標配置這類記憶體。 如果未使用PLEASE_ALLOC_USERMEM,應用程式可能會在嘗試存取這類記憶體時收到錯誤。 如需詳細資訊,請參閱 NT Kernel 的實作 DDLOCK_NOSYSLOCK。
DdLock 可以使用停用 PDEV呼叫。 呼叫顯示器驅動程式的 DrvAssertMode 函式來停用或啟用 PDEV。 如需詳細資訊,請參閱 管理 PDEV。
NT 核心實作DDLOCK_NOSYSLOCK
應用程式可以使用 DirectDraw 和 Direct3D 的應用程式開發介面 (API) 來取得影片記憶體資源的長時間鎖定。 這類鎖定稱為「NOSYSLOCK」鎖定。 這些鎖定的運作方式與一般視訊記憶體鎖定不同,如下列段落所述。DirectDraw 運行時間呼叫驅動程式的 DdLock 函式,並在 DD_LOCKDATA 的 dwFlags 成員中指定DDLOCK_NOSYSLOCK旗標之後,運行時間會檢查驅動程式所傳回介面內容的指標。 運行時間不會將驅動程式傳回的指標直接傳遞至應用程式,而是建立視訊記憶體的第二個使用者模式對應(本機和非本機),並計算該對應內的對等虛擬位址。 此虛擬地址稱為記憶體鎖定的別名指標。 運行時間會將這個別名鎖定指標傳遞給應用程式。 應用程式會使用此別名鎖定指標直接讀取和寫入視訊記憶體。 應用程式或驅動程式都不知道它使用不同的鎖定記憶體指標。
稍後,在模式切換時間,DirectDraw 運行時間會記下任何未處理的別名鎖定指標。 運行時間會重新對應視訊記憶體的使用者模式對應,並允許模式切換繼續,而不是等候別名鎖定指標完成,就像一般視訊記憶體鎖定一樣。 運行時間會將使用者模式對應重新對應至單一虛擬頁面;應用程式會繼續讀取和寫入該虛擬頁面,否則不會察覺任何變更。 然後,運行時間必須藉由呼叫驅動程式的 DdUnlock 函式來清除別名鎖定指標。 運行時間可以清除別名鎖定指標,因為應用程式不再寫入視訊記憶體中。 由於這項清除會在模式切換時間發生,序列中的下一個步驟是失去表面,這表示終結驅動程式的每個表面物件。 換句話說,運行時間會針對所有表面呼叫驅動程式的 DdDestroySurface 函式,包括應用程式繼續視為鎖定的介面。 事實上,應用程式會繼續讀取和寫入系統記憶體的虛擬頁面。
只有當 DdLock 傳回的記憶體指標 是視訊記憶體的一些對應時,這個整個進程才會運作。 此視訊記憶體對應可以是 DirectDraw 內核模式運行時間所執行非本機視訊記憶體的使用者模式對應,或是驅動程式的 DdMapMemory 函式所提供的對應。 如果記憶體指標無法歸因於其中一個對應,運行時間不會重新對應鎖定。 模式切換會繼續,這表示驅動程式的表面物件會透過呼叫驅動程式的 DdUnlock 和 DdDestroySurface 函式來解除鎖定和終結。 然後驅動程式通常會釋放驅動程式在鎖定時配置的任何系統記憶體。 由於應用程式仍在寫入此記憶體,因此會發生存取違規。
因此,驅動程式不應該嘗試從其 DdLock 函式傳回系統記憶體指標,除非該驅動程式的 DdCreateSurface 函式先前使用 PLEASE_ALLOC_USERMEM 旗標配置這類記憶體。 DirectDraw 運行時間擁有以這種方式配置的記憶體,而且可以延遲釋放此記憶體,直到應用程式解除鎖定記憶體為止。 因此,驅動程式的 DdLock 函式可以傳回以這種方式配置的記憶體指標,而不會造成應用程式損毀的風險。
要求
要求 | 價值 |
---|---|
目標平臺 | 桌面 |
標頭 | ddrawint.h (包括 Winddi.h) |