Share via


(ddrawint.h) PDD_SURFCB_LOCK 回呼函式

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。

除非DD_LOCKDATA 的 dwFlags 成員另有指定,否則驅動程式可以將記憶體指標傳回DD_LOCKDATA lpSurfData 成員中表面頂端的記憶體指標。 如果驅動程式需要計算自己的介面位址,它可以依賴傳入 DD_LOCKDATA fpProcess 成員的指標,做為其 DirectDraw 可存取框架緩衝區之使用者模式對應的個別進程指標。

鎖定不提供要求的記憶體區塊獨佔存取權;也就是說,多個線程可以同時鎖定相同的表面。 應用程式必須負責同步存取取得其指標的記憶體區塊。

除非驅動程式的 DdCreateSurface 函式先前使用 PLEASE_ALLOC_USERMEM 旗標配置這類記憶體,否則在 NT 型作業系統上執行的驅動程式不應從其 DdLock 函式傳回系統記憶體的指標。 如果未使用PLEASE_ALLOC_USERMEM,應用程式可能會在嘗試存取這類記憶體時收到錯誤。 如需詳細資訊 ,請參閱NT核心的 DDLOCK_NOSYSLOCK 實作

您可以使用停用的 PDEV 呼叫 DdLock。 呼叫顯示器驅動程式的 DrvAssertMode 函式,以停用或啟用PDEV。 如需詳細資訊 ,請參閱管理 PDEV

NT 核心實作DDLOCK_NOSYSLOCK

應用程式可以使用 DirectDraw 和 Direct3D 的應用程式開發介面, (API) 取得影片記憶體資源的長期鎖定。 這類鎖定稱為「NOSYSLOCK」鎖定。 這些鎖定的運作方式與一般視訊記憶體鎖定不同,如下列段落所述。

在 DirectDraw 執行時間呼叫驅動程式的 DdLock 函式,並在 DD_LOCKDATA的 dwFlags 成員中指定DDLOCK_NOSYSLOCK旗標之後,運行時間會檢查驅動程式所傳回介面內容的指標。 運行時間不會將驅動程式傳回的指標直接傳遞至應用程式,而是建立第二個使用者模式的視訊記憶體對應, (本機和非本機) ,並計算該對應中的對等虛擬位址。 此虛擬地址稱為記憶體鎖定的別名指標。 運行時間會將這個別名鎖定指標傳遞給應用程式。 應用程式會使用此別名鎖定指標直接讀取和寫入至視訊記憶體。 應用程式或驅動程式都不知道它使用不同的鎖定記憶體指標。

稍後,在模式切換時間,DirectDraw 運行時間會記下任何未完成的別名鎖定指標。 而不是等候別名鎖定指標完成,就像一般視訊記憶體鎖定一樣,運行時間會重新對應視訊記憶體的使用者模式對應,並允許模式切換繼續。 運行時間會將使用者模式對應重新對應至單一虛擬頁面;應用程式會繼續讀取和寫入該虛擬頁面,否則不會察覺任何變更。 然後,運行時間必須藉由呼叫驅動程式的 DdUnlock 函式來清除別名鎖定指標。 運行時間可以清除別名鎖定指標,因為應用程式不再寫入到視訊記憶體中。 由於這項清除會在模式切換時間發生,因此序列中的下一個步驟是遺失表面,這表示終結驅動程式的每個表面物件。 換句話說,運行時間會針對所有表面呼叫驅動程式的 DdDestroySurface 函式,包括應用程式繼續視為鎖定的介面。 事實上,應用程式會繼續讀取和寫入系統記憶體的虛擬頁面。

只有當 DdLock 傳回的記憶體指標是視訊記憶體的一些對應時,此整個進程才有效。 此視訊記憶體對應可以是 DirectDraw 內核模式運行時間所執行之非本機視訊記憶體的使用者模式對應,或是驅動程式的 DdMapMemory 函式所提供的對應。 如果記憶體指標無法屬性化為其中一個對應,運行時間就不會重新對應鎖定。 模式切換會繼續,這表示驅動程式的介面物件會透過分別呼叫驅動程式的 DdUnlockDdDestroySurface 函式解除鎖定和終結。 然後,驅動程式通常會釋放驅動程式在鎖定時配置的任何系統記憶體。 因為應用程式仍在寫入此記憶體,所以會發生存取違規。

因此,除非驅動程式的 DdCreateSurface 函式先前使用 PLEASE_ALLOC_USERMEM 旗標配置這類記憶體,否則驅動程式不應該嘗試從其 DdLock 函式傳回系統記憶體指標。 DirectDraw 運行時間擁有以這種方式配置的記憶體,而且可以延遲釋放此記憶體,直到應用程式解除鎖定記憶體為止。 因此,驅動程式的 DdLock 函式可以傳回以這種方式配置的記憶體指標,而不會有損毀應用程式的風險。

規格需求

需求
目標平台 桌面
標頭 ddrawint.h (包含 Winddi.h)

另請參閱

DD_LOCKDATA

DdMapMemory

DdUnlock