[BASESRV]

Move the GET_NEXT_VDM_COMMAND_DATA structure to a global header, and
rename it to VDM_COMMAND_INFO.
Implement BaseSrvCopyCommand, which moves the BASE_CHECK_VDM structure data
into a new VDM_COMMAND_INFO structure.
Implement BaseSrvFreeVDMInfo which frees a VDM_COMMAND_INFO structure and
everything in it.


svn path=/branches/ntvdm/; revision=62374
This commit is contained in:
Aleksandar Andrejevic 2014-03-02 02:50:40 +00:00
parent ab9978f190
commit 8656d3a5f6
5 changed files with 201 additions and 34 deletions

View file

@ -1130,7 +1130,7 @@ ExitVDM(BOOL IsWow, ULONG iWowTask)
*/
DWORD
WINAPI
GetNextVDMCommand(PGET_NEXT_VDM_COMMAND_DATA CommandData)
GetNextVDMCommand(PVDM_COMMAND_INFO CommandData)
{
STUB;
return 0;

View file

@ -25,39 +25,6 @@ typedef enum _VDM_ENTRY_CODE
#define VDM_UNDO_REUSE 0x04
#define VDM_UNDO_COMPLETED 0x08
/* STRUCTURES *****************************************************************/
typedef struct _GET_NEXT_VDM_COMMAND_DATA
{
ULONG iTask;
ULONG dwUnused;
ULONG dwExitCode;
ULONG dwCodePage;
HANDLE hStdIn;
HANDLE hStdOut;
HANDLE hStdErr;
LPSTR lpCmdLine;
LPSTR lpAppName;
LPSTR lpPifFile;
LPSTR lpCurDirectory;
LPSTR lpEnv;
ULONG dwEnvLen;
STARTUPINFOA StartupInfo;
LPSTR lpDesktop;
ULONG dwDesktopLen;
LPSTR lpTitle;
ULONG dwTitleLen;
LPVOID lpReserved;
ULONG dwReservedLen;
USHORT wCmdLen;
USHORT wAppLen;
USHORT wPifLen;
USHORT wCurDirectoryLen;
USHORT wVDMState;
USHORT wCurrentDrive;
BOOLEAN fComingFromBat;
} GET_NEXT_VDM_COMMAND_DATA, *PGET_NEXT_VDM_COMMAND_DATA;
/* FUNCTION PROTOTYPES ********************************************************/
BOOL

View file

@ -30,6 +30,37 @@
#define VDM_NOT_READY 0x02
#define VDM_READY 0x04
typedef struct
{
ULONG TaskId;
ULONG Unused;
ULONG ExitCode;
ULONG CodePage;
HANDLE StdIn;
HANDLE StdOut;
HANDLE StdErr;
LPSTR CmdLine;
LPSTR AppName;
LPSTR PifFile;
LPSTR CurDirectory;
LPSTR Env;
ULONG EnvLen;
STARTUPINFOA StartupInfo;
LPSTR Desktop;
ULONG DesktopLen;
LPSTR Title;
ULONG TitleLen;
LPVOID Reserved;
ULONG ReservedLen;
USHORT CmdLen;
USHORT AppLen;
USHORT PifLen;
USHORT CurDirectoryLen;
USHORT VDMState;
USHORT CurrentDrive;
BOOLEAN ComingFromBat;
} VDM_COMMAND_INFO, *PVDM_COMMAND_INFO;
#endif // _VDM_H
/* EOF */

View file

@ -187,6 +187,166 @@ NTSTATUS NTAPI BaseSrvCreatePairWaitHandles(PHANDLE ServerEvent, PHANDLE ClientE
return Status;
}
VOID BaseSrvFreeVDMInfo(PVDM_COMMAND_INFO CommandInfo)
{
/* Free the allocated structure members */
if (CommandInfo->CmdLine != NULL) RtlFreeHeap(BaseSrvHeap, 0, CommandInfo->CmdLine);
if (CommandInfo->AppName != NULL) RtlFreeHeap(BaseSrvHeap, 0, CommandInfo->AppName);
if (CommandInfo->PifFile != NULL) RtlFreeHeap(BaseSrvHeap, 0, CommandInfo->PifFile);
if (CommandInfo->CurDirectory != NULL) RtlFreeHeap(BaseSrvHeap, 0, CommandInfo->CurDirectory);
if (CommandInfo->Env != NULL) RtlFreeHeap(BaseSrvHeap, 0, CommandInfo->Env);
if (CommandInfo->Desktop != NULL) RtlFreeHeap(BaseSrvHeap, 0, CommandInfo->Desktop);
if (CommandInfo->Title != NULL) RtlFreeHeap(BaseSrvHeap, 0, CommandInfo->Title);
if (CommandInfo->Reserved != NULL) RtlFreeHeap(BaseSrvHeap, 0, CommandInfo->Reserved);
/* Free the structure itself */
RtlFreeHeap(BaseSrvHeap, 0, CommandInfo);
}
BOOLEAN NTAPI BaseSrvCopyCommand(PBASE_CHECK_VDM CheckVdmRequest, PVDM_DOS_RECORD DosRecord)
{
BOOLEAN Success = FALSE;
PVDM_COMMAND_INFO CommandInfo = NULL;
/* Allocate the command information structure */
CommandInfo = (PVDM_COMMAND_INFO)RtlAllocateHeap(BaseSrvHeap,
HEAP_ZERO_MEMORY,
sizeof(VDM_COMMAND_INFO));
if (CommandInfo == NULL) return FALSE;
/* Fill the structure */
CommandInfo->TaskId = CheckVdmRequest->iTask;
CommandInfo->ExitCode = DosRecord->ExitCode;
CommandInfo->CodePage = CheckVdmRequest->CodePage;
CommandInfo->StdIn = CheckVdmRequest->StdIn;
CommandInfo->StdOut = CheckVdmRequest->StdOut;
CommandInfo->StdErr = CheckVdmRequest->StdErr;
/* Allocate memory for the command line */
CommandInfo->CmdLine = RtlAllocateHeap(BaseSrvHeap,
HEAP_ZERO_MEMORY,
CheckVdmRequest->CmdLen);
if (CommandInfo->CmdLine == NULL) goto Cleanup;
/* Copy the command line */
RtlMoveMemory(CommandInfo->CmdLine, CheckVdmRequest->CmdLine, CheckVdmRequest->CmdLen);
/* Allocate memory for the application name */
CommandInfo->AppName = RtlAllocateHeap(BaseSrvHeap,
HEAP_ZERO_MEMORY,
CheckVdmRequest->AppLen);
if (CommandInfo->AppName == NULL) goto Cleanup;
/* Copy the application name */
RtlMoveMemory(CommandInfo->AppName, CheckVdmRequest->AppName, CheckVdmRequest->AppLen);
/* Allocate memory for the PIF file name */
if (CheckVdmRequest->PifLen != 0)
{
CommandInfo->PifFile = RtlAllocateHeap(BaseSrvHeap,
HEAP_ZERO_MEMORY,
CheckVdmRequest->PifLen);
if (CommandInfo->PifFile == NULL) goto Cleanup;
/* Copy the PIF file name */
RtlMoveMemory(CommandInfo->PifFile, CheckVdmRequest->PifFile, CheckVdmRequest->PifLen);
}
else CommandInfo->PifFile = NULL;
/* Allocate memory for the current directory */
if (CheckVdmRequest->CurDirectoryLen != 0)
{
CommandInfo->CurDirectory = RtlAllocateHeap(BaseSrvHeap,
HEAP_ZERO_MEMORY,
CheckVdmRequest->CurDirectoryLen);
if (CommandInfo->CurDirectory == NULL) goto Cleanup;
/* Copy the current directory */
RtlMoveMemory(CommandInfo->CurDirectory,
CheckVdmRequest->CurDirectory,
CheckVdmRequest->CurDirectoryLen);
}
else CommandInfo->CurDirectory = NULL;
/* Allocate memory for the environment block */
CommandInfo->Env = RtlAllocateHeap(BaseSrvHeap,
HEAP_ZERO_MEMORY,
CheckVdmRequest->EnvLen);
if (CommandInfo->Env == NULL) goto Cleanup;
/* Copy the environment block */
RtlMoveMemory(CommandInfo->Env, CheckVdmRequest->Env, CheckVdmRequest->EnvLen);
CommandInfo->EnvLen = CheckVdmRequest->EnvLen;
RtlMoveMemory(&CommandInfo->StartupInfo,
CheckVdmRequest->StartupInfo,
sizeof(STARTUPINFOA));
/* Allocate memory for the desktop */
if (CheckVdmRequest->DesktopLen != 0)
{
CommandInfo->Desktop = RtlAllocateHeap(BaseSrvHeap,
HEAP_ZERO_MEMORY,
CheckVdmRequest->DesktopLen);
if (CommandInfo->Desktop == NULL) goto Cleanup;
/* Copy the desktop name */
RtlMoveMemory(CommandInfo->Desktop, CheckVdmRequest->Desktop, CheckVdmRequest->DesktopLen);
}
else CommandInfo->Desktop = NULL;
CommandInfo->DesktopLen = CheckVdmRequest->DesktopLen;
/* Allocate memory for the title */
if (CheckVdmRequest->TitleLen != 0)
{
CommandInfo->Title = RtlAllocateHeap(BaseSrvHeap,
HEAP_ZERO_MEMORY,
CheckVdmRequest->TitleLen);
if (CommandInfo->Title == NULL) goto Cleanup;
/* Copy the title */
RtlMoveMemory(CommandInfo->Title, CheckVdmRequest->Title, CheckVdmRequest->TitleLen);
}
else CommandInfo->Title = NULL;
CommandInfo->TitleLen = CheckVdmRequest->TitleLen;
/* Allocate memory for the reserved field */
if (CheckVdmRequest->ReservedLen != 0)
{
CommandInfo->Reserved = RtlAllocateHeap(BaseSrvHeap,
HEAP_ZERO_MEMORY,
CheckVdmRequest->ReservedLen);
if (CommandInfo->Reserved == NULL) goto Cleanup;
/* Copy the reserved field */
RtlMoveMemory(CommandInfo->Reserved,
CheckVdmRequest->Reserved,
CheckVdmRequest->ReservedLen);
}
else CommandInfo->Reserved = NULL;
CommandInfo->ReservedLen = CheckVdmRequest->ReservedLen;
CommandInfo->CmdLen = CheckVdmRequest->CmdLen;
CommandInfo->AppLen = CheckVdmRequest->AppLen;
CommandInfo->PifLen = CheckVdmRequest->PifLen;
CommandInfo->CurDirectoryLen = CheckVdmRequest->CurDirectoryLen;
CommandInfo->VDMState = DosRecord->State;
// TODO: Set CommandInfo->CurrentDrive
// TODO: Set CommandInfo->ComingFromBat
/* Set the DOS record's command structure */
DosRecord->CommandInfo = CommandInfo;
Cleanup:
/* If it wasn't successful, free the memory */
if (!Success) BaseSrvFreeVDMInfo(CommandInfo);
return Success;
}
VOID NTAPI BaseInitializeVDM(VOID)
{
/* Initialize the list head */
@ -300,6 +460,14 @@ CSR_API(BaseSrvCheckVDM)
Status = BaseSrvCreatePairWaitHandles(&DosRecord->ServerEvent, &DosRecord->ClientEvent);
if (!NT_SUCCESS(Status)) goto Cleanup;
/* Translate the input structure into a VDM command structure and set it in the DOS record */
if (!BaseSrvCopyCommand(CheckVdmRequest, DosRecord))
{
/* The only possibility is that an allocation failure occurred */
Status = STATUS_NO_MEMORY;
goto Cleanup;
}
/* Add the DOS record */
InsertHeadList(&ConsoleRecord->DosListHead, &DosRecord->Entry);

View file

@ -34,6 +34,7 @@ typedef struct _VDM_DOS_RECORD
ULONG ExitCode;
HANDLE ServerEvent;
HANDLE ClientEvent;
PVDM_COMMAND_INFO CommandInfo;
// TODO: Structure incomplete!!!
} VDM_DOS_RECORD, *PVDM_DOS_RECORD;