From 5a678ff4e0113e375b1c61c120a747a8322f8148 Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Mon, 10 Feb 2014 13:56:55 +0000 Subject: [PATCH 1/1] [KERNEL32] Implement GetVDMCurrentDirectories. [BASESRV] Fix a bug in BaseSrvGetVDMCurDirs. svn path=/branches/ntvdm/; revision=62097 --- dll/win32/kernel32/client/vdm.c | 48 ++++++++++++++++++++++++++++----- subsystems/win/basesrv/vdm.c | 3 +++ 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/dll/win32/kernel32/client/vdm.c b/dll/win32/kernel32/client/vdm.c index 06df702766f..e3679487f41 100644 --- a/dll/win32/kernel32/client/vdm.c +++ b/dll/win32/kernel32/client/vdm.c @@ -1138,17 +1138,51 @@ GetNextVDMCommand(PGET_NEXT_VDM_COMMAND_DATA CommandData) /* - * @unimplemented + * @implemented */ DWORD WINAPI -GetVDMCurrentDirectories ( - DWORD Unknown0, - DWORD Unknown1 - ) +GetVDMCurrentDirectories(DWORD cchCurDirs, PCHAR lpszzCurDirs) { - STUB; - return 0; + BASE_API_MESSAGE ApiMessage; + PBASE_GETSET_VDM_CURDIRS VDMCurrentDirsRequest = &ApiMessage.Data.VDMCurrentDirsRequest; + PCSR_CAPTURE_BUFFER CaptureBuffer; + + /* Allocate the capture buffer */ + CaptureBuffer = CsrAllocateCaptureBuffer(1, cchCurDirs); + if (CaptureBuffer == NULL) + { + BaseSetLastNTError(STATUS_NO_MEMORY); + return 0; + } + + /* Setup the input parameters */ + VDMCurrentDirsRequest->cchCurDirs = cchCurDirs; + CsrAllocateMessagePointer(CaptureBuffer, + cchCurDirs, + (PVOID*)&VDMCurrentDirsRequest->lpszzCurDirs); + + /* Call CSRSS */ + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(BASESRV_SERVERDLL_INDEX, BasepGetVDMCurDirs), + sizeof(BASE_GETSET_VDM_CURDIRS)); + + /* Set the last error */ + BaseSetLastNTError(ApiMessage.Status); + + if (NT_SUCCESS(ApiMessage.Status)) + { + /* Copy the result */ + RtlMoveMemory(lpszzCurDirs, VDMCurrentDirsRequest->lpszzCurDirs, cchCurDirs); + } + + /* Free the capture buffer */ + CsrFreeCaptureBuffer(CaptureBuffer); + + /* Return the size if it was successful, or if the buffer was too small */ + return (NT_SUCCESS(ApiMessage.Status) || (ApiMessage.Status == STATUS_BUFFER_TOO_SMALL)) + ? VDMCurrentDirsRequest->cchCurDirs : 0; } diff --git a/subsystems/win/basesrv/vdm.c b/subsystems/win/basesrv/vdm.c index 408f3a344eb..dcfeb6d5730 100644 --- a/subsystems/win/basesrv/vdm.c +++ b/subsystems/win/basesrv/vdm.c @@ -218,6 +218,9 @@ CSR_API(BaseSrvGetVDMCurDirs) Status = BaseSrvGetConsoleRecord(VDMCurrentDirsRequest->ConsoleHandle, &ConsoleRecord); if (!NT_SUCCESS(Status)) goto Cleanup; + /* Return the actual size of the current directory information */ + VDMCurrentDirsRequest->cchCurDirs = ConsoleRecord->CurDirsLength; + /* Check if the buffer is large enough */ if (VDMCurrentDirsRequest->cchCurDirs < ConsoleRecord->CurDirsLength) { -- 2.17.1