Author: aandrejevic Date: Mon Feb 10 13:56:55 2014 New Revision: 62097
URL: http://svn.reactos.org/svn/reactos?rev=62097&view=rev Log: [KERNEL32] Implement GetVDMCurrentDirectories. [BASESRV] Fix a bug in BaseSrvGetVDMCurDirs.
Modified: branches/ntvdm/dll/win32/kernel32/client/vdm.c branches/ntvdm/subsystems/win/basesrv/vdm.c
Modified: branches/ntvdm/dll/win32/kernel32/client/vdm.c URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/dll/win32/kernel32/client/... ============================================================================== --- branches/ntvdm/dll/win32/kernel32/client/vdm.c [iso-8859-1] (original) +++ branches/ntvdm/dll/win32/kernel32/client/vdm.c [iso-8859-1] Mon Feb 10 13:56:55 2014 @@ -1138,17 +1138,51 @@
/* - * @unimplemented + * @implemented */ DWORD WINAPI -GetVDMCurrentDirectories ( - DWORD Unknown0, - DWORD Unknown1 - ) -{ - STUB; - return 0; +GetVDMCurrentDirectories(DWORD cchCurDirs, PCHAR lpszzCurDirs) +{ + 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; }
Modified: branches/ntvdm/subsystems/win/basesrv/vdm.c URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/subsystems/win/basesrv/vdm... ============================================================================== --- branches/ntvdm/subsystems/win/basesrv/vdm.c [iso-8859-1] (original) +++ branches/ntvdm/subsystems/win/basesrv/vdm.c [iso-8859-1] Mon Feb 10 13:56:55 2014 @@ -218,6 +218,9 @@ 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) {