static NTSTATUS vbsfWriteInternal(IN PRX_CONTEXT RxContext) { NTSTATUS Status = STATUS_SUCCESS; RxCaptureFcb; RxCaptureFobx; PMRX_VBOX_DEVICE_EXTENSION pDeviceExtension = VBoxMRxGetDeviceExtension(RxContext); PMRX_VBOX_NETROOT_EXTENSION pNetRootExtension = VBoxMRxGetNetRootExtension(capFcb->pNetRoot); PMRX_VBOX_FOBX pVBoxFobx = VBoxMRxGetFileObjectExtension(capFobx); PLOWIO_CONTEXT LowIoContext = &RxContext->LowIoContext; PMDL BufferMdl = LowIoContext->ParamsFor.ReadWrite.Buffer; uint32_t ByteCount = LowIoContext->ParamsFor.ReadWrite.ByteCount; RXVBO ByteOffset = LowIoContext->ParamsFor.ReadWrite.ByteOffset; PVOID pbUserBuffer = RxLowIoGetBufferAddress(RxContext); int vboxRC; BOOLEAN AsyncIo = BooleanFlagOn(RxContext->Flags, RX_CONTEXT_FLAG_ASYNC_OPERATION); LONGLONG FileSize; RxGetFileSizeWithLock((PFCB)capFcb, &FileSize); Log(("VBOXSF: vbsfWriteInternal: AsyncIo = %d, Fcb->FileSize = 0x%RX64\n", AsyncIo, capFcb->Header.FileSize.QuadPart)); Log(("VBOXSF: vbsfWriteInternal: UserBuffer %p, BufferMdl %p\n", pbUserBuffer, BufferMdl)); Log(("VBOXSF: vbsfWriteInternal: ByteCount is 0x%X, ByteOffset is 0x%RX64, FileSize 0x%RX64\n", ByteCount, ByteOffset, FileSize)); /* @todo allow to write 0 bytes. */ if ( BufferMdl == NULL || ByteCount == 0) { AssertFailed(); return STATUS_INVALID_PARAMETER; } /* @todo Split large writes. */ vboxRC = vboxCallWrite(&pDeviceExtension->hgcmClient, &pNetRootExtension->map, pVBoxFobx->hFile, ByteOffset, &ByteCount, (uint8_t *)pbUserBuffer, true /* locked */); Status = VBoxErrorToNTStatus(vboxRC); if (Status != STATUS_SUCCESS) { /* Nothing written. */ ByteCount = 0; } RxContext->InformationToReturn = ByteCount; Log(("VBOXSF: vbsfWriteInternal: Status = 0x%08X, ByteCount = 0x%X\n", Status, ByteCount)); return Status; }
static NTSTATUS vbsfWriteInternal(IN PRX_CONTEXT RxContext) { NTSTATUS Status = STATUS_SUCCESS; VBSFTRANSFERCTX ctx; RxCaptureFcb; RxCaptureFobx; PMRX_VBOX_DEVICE_EXTENSION pDeviceExtension = VBoxMRxGetDeviceExtension(RxContext); PMRX_VBOX_NETROOT_EXTENSION pNetRootExtension = VBoxMRxGetNetRootExtension(capFcb->pNetRoot); PMRX_VBOX_FOBX pVBoxFobx = VBoxMRxGetFileObjectExtension(capFobx); PLOWIO_CONTEXT LowIoContext = &RxContext->LowIoContext; PMDL BufferMdl = LowIoContext->ParamsFor.ReadWrite.Buffer; uint32_t ByteCount = LowIoContext->ParamsFor.ReadWrite.ByteCount; RXVBO ByteOffset = LowIoContext->ParamsFor.ReadWrite.ByteOffset; PVOID pbUserBuffer = RxLowIoGetBufferAddress(RxContext); int vboxRC; BOOLEAN AsyncIo = BooleanFlagOn(RxContext->Flags, RX_CONTEXT_FLAG_ASYNC_OPERATION); LONGLONG FileSize; RxGetFileSizeWithLock((PFCB)capFcb, &FileSize); Log(("VBOXSF: vbsfWriteInternal: AsyncIo = %d, Fcb->FileSize = 0x%RX64\n", AsyncIo, capFcb->Header.FileSize.QuadPart)); Log(("VBOXSF: vbsfWriteInternal: UserBuffer %p, BufferMdl %p\n", pbUserBuffer, BufferMdl)); Log(("VBOXSF: vbsfWriteInternal: ByteCount is 0x%X, ByteOffset is 0x%RX64, FileSize 0x%RX64\n", ByteCount, ByteOffset, FileSize)); /* @todo allow to write 0 bytes. */ if ( !BufferMdl || ByteCount == 0) { AssertFailed(); return STATUS_INVALID_PARAMETER; } ctx.pClient = &pDeviceExtension->hgcmClient; ctx.pMap = &pNetRootExtension->map; ctx.hFile = pVBoxFobx->hFile; ctx.offset = (uint64_t)ByteOffset; ctx.cbData = ByteCount; ctx.pMdl = BufferMdl; ctx.pBuffer = (uint8_t *)pbUserBuffer; ctx.fLocked = true; ctx.pfnTransferBuffer = vbsfTransferBufferWrite; ctx.pfnTransferPages = vbsfTransferPagesWrite; vboxRC = vbsfTransferCommon(&ctx); ByteCount = ctx.cbData; Status = VBoxErrorToNTStatus(vboxRC); if (Status != STATUS_SUCCESS) { /* Nothing written. */ ByteCount = 0; } RxContext->InformationToReturn = ByteCount; Log(("VBOXSF: vbsfWriteInternal: Status = 0x%08X, ByteCount = 0x%X\n", Status, ByteCount)); return Status; }
static NTSTATUS vbsfReadInternal(IN PRX_CONTEXT RxContext) { NTSTATUS Status = STATUS_SUCCESS; VBSFTRANSFERCTX ctx; RxCaptureFcb; RxCaptureFobx; PMRX_VBOX_DEVICE_EXTENSION pDeviceExtension = VBoxMRxGetDeviceExtension(RxContext); PMRX_VBOX_NETROOT_EXTENSION pNetRootExtension = VBoxMRxGetNetRootExtension(capFcb->pNetRoot); PMRX_VBOX_FOBX pVBoxFobx = VBoxMRxGetFileObjectExtension(capFobx); PLOWIO_CONTEXT LowIoContext = &RxContext->LowIoContext; PMDL BufferMdl = LowIoContext->ParamsFor.ReadWrite.Buffer; uint32_t ByteCount = LowIoContext->ParamsFor.ReadWrite.ByteCount; RXVBO ByteOffset = LowIoContext->ParamsFor.ReadWrite.ByteOffset; PVOID pbUserBuffer = RxLowIoGetBufferAddress(RxContext); int vboxRC; BOOLEAN AsyncIo = BooleanFlagOn(RxContext->Flags, RX_CONTEXT_FLAG_ASYNC_OPERATION); LONGLONG FileSize; RxGetFileSizeWithLock((PFCB)capFcb, &FileSize); Log(("VBOXSF: vbsfReadInternal: AsyncIo = %d, Fcb->FileSize = 0x%RX64\n", AsyncIo, capFcb->Header.FileSize.QuadPart)); Log(("VBOXSF: vbsfReadInternal: UserBuffer %p, BufferMdl %p\n", pbUserBuffer, BufferMdl)); Log(("VBOXSF: vbsfReadInternal: ByteCount 0x%X, ByteOffset 0x%RX64, FileSize 0x%RX64\n", ByteCount, ByteOffset, FileSize)); /* @todo check if this is necessary. */ #ifdef FCB_STATE_READCACHING_ENABLED /* Correct spelling for Vista 6001 SDK. */ if (!FlagOn(capFcb->FcbState, FCB_STATE_READCACHING_ENABLED)) #else if (!FlagOn(capFcb->FcbState, FCB_STATE_READCACHEING_ENABLED)) #endif { if (ByteOffset >= FileSize) { Log(("VBOXSF: vbsfReadInternal: EOF\n")); return STATUS_END_OF_FILE; } if (ByteCount > FileSize - ByteOffset) ByteCount = (ULONG)(FileSize - ByteOffset); } /* @todo read 0 bytes == always success? */ if ( !BufferMdl || ByteCount == 0) { AssertFailed(); return STATUS_INVALID_PARAMETER; } ctx.pClient = &pDeviceExtension->hgcmClient; ctx.pMap = &pNetRootExtension->map; ctx.hFile = pVBoxFobx->hFile; ctx.offset = (uint64_t)ByteOffset; ctx.cbData = ByteCount; ctx.pMdl = BufferMdl; ctx.pBuffer = (uint8_t *)pbUserBuffer; ctx.fLocked = true; ctx.pfnTransferBuffer = vbsfTransferBufferRead; ctx.pfnTransferPages = vbsfTransferPagesRead; vboxRC = vbsfTransferCommon(&ctx); ByteCount = ctx.cbData; Status = VBoxErrorToNTStatus(vboxRC); if (Status != STATUS_SUCCESS) { /* Nothing read. */ ByteCount = 0; } RxContext->InformationToReturn = ByteCount; Log(("VBOXSF: vbsfReadInternal: Status = 0x%08X, ByteCount = 0x%X\n", Status, ByteCount)); return Status; }