DECLCALLBACK(int) vboxUhgsmiKmtBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock) { PVBOXUHGSMI_BUFFER_PRIVATE_KMT pBuffer = VBOXUHGSMIKMT_GET_BUFFER(pBuf); D3DKMT_LOCK DdiLock = {0}; DdiLock.hDevice = pBuffer->pHgsmi->Device.hDevice; DdiLock.hAllocation = pBuffer->BasePrivate.hAllocation; DdiLock.PrivateDriverData = NULL; EnterCriticalSection(&pBuffer->CritSect); int rc = vboxUhgsmiBaseLockData(pBuf, offLock, cbLock, fFlags, &DdiLock.Flags, &DdiLock.NumPages, pBuffer->aLockPageIndices); AssertRC(rc); if (RT_FAILURE(rc)) return rc; if (DdiLock.NumPages) DdiLock.pPages = pBuffer->aLockPageIndices; else DdiLock.pPages = NULL; NTSTATUS Status = pBuffer->pHgsmi->Callbacks.pfnD3DKMTLock(&DdiLock); Assert(!Status); LeaveCriticalSection(&pBuffer->CritSect); if (!Status) { *pvLock = (void*)(((uint8_t*)DdiLock.pData) + (offLock & 0xfff)); return VINF_SUCCESS; } return VERR_GENERAL_FAILURE; }
DECLCALLBACK(int) vboxUhgsmiD3DBufferLock(PVBOXUHGSMI_BUFFER pBuf, uint32_t offLock, uint32_t cbLock, VBOXUHGSMI_BUFFER_LOCK_FLAGS fFlags, void**pvLock) { PVBOXUHGSMI_BUFFER_PRIVATE_D3D pBuffer = VBOXUHGSMID3D_GET_BUFFER(pBuf); D3DDDICB_LOCK DdiLock = {0}; DdiLock.hAllocation = pBuffer->BasePrivate.hAllocation; DdiLock.PrivateDriverData = 0; int rc = vboxUhgsmiBaseLockData(pBuf, offLock, cbLock, fFlags, &DdiLock.Flags, &DdiLock.NumPages, pBuffer->aLockPageIndices); AssertRC(rc); if (RT_FAILURE(rc)) return rc; if (DdiLock.NumPages) DdiLock.pPages = pBuffer->aLockPageIndices; else DdiLock.pPages = NULL; HRESULT hr = pBuffer->pDevice->RtCallbacks.pfnLockCb(pBuffer->pDevice->hDevice, &DdiLock); Assert(hr == S_OK); if (hr == S_OK) { *pvLock = (void*)(((uint8_t*)DdiLock.pData) + (offLock & 0xfff)); return VINF_SUCCESS; } return VERR_GENERAL_FAILURE; }