|
|
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
srvvdm.h
Abstract:
Include file for VDM related functions
Author:
Sudeep Bharati (sudeepb) 03-Sep-1991
Revision History:
--*/
// Shared wow vdm definition
typedef struct tagSharedWowRecord *PSHAREDWOWRECORD; typedef struct _WOWRecord *PWOWRECORD;
typedef struct tagSharedWowRecord {
// all these structures are wired to the console list
// so that each shared wow is identified in the console list by it's handle
// the reason for this extra linkage is to speed up certain calls in which we
// already know it's wow
PSHAREDWOWRECORD pNextSharedWow; // points to the next shared vdm
HANDLE hConsole; // hidden console of wow
HANDLE hwndWowExec; // handle to a wow exec window
DWORD dwWowExecProcessId; // process id of a wowexec
DWORD dwWowExecThreadId; // thread id for wowexec
// why sequence number:
// Davehart explains that we could get in trouble if basesrv thinks
// that wowexec could be identified uniquely by it's window handle, process id and thread id.
// In reality, these values are recycled rather quickly which could lead us to [mistakenly]
// accept hwndWowExec for a wowexec window when, in reality the relevant wowexec has long been
// gone. This number reflects a sequential order in which processes are created.
// And while it could still be recycled (when it overflows) this is a rather rare event.
// all the sequence number info that we are in need of is located in the console
// record itself
// This is a unicode string representing windows station/desktop which is supported by this
// particular ntvdm
UNICODE_STRING WowExecDesktopName;
ULONG VDMState; // the state of this shared wow
// task queue
PWOWRECORD pWOWRecord;
// LUID - auth id for this wow
LUID WowAuthId;
// WOWUserToken - auth process token
HANDLE WOWUserToken;
// this is what is so interesting about this particular setting
// special id that uniquely identifies this wow in the context of this machine
// consists of [Time] + [SequenceNumber]
// size of this structure is variable and depends on the length of the desktop name as
// it is fitted together with this structure
// sequence number
ULONG SequenceNumber; ULONG ParentSequenceNumber; LPTHREAD_START_ROUTINE pfnW32HungAppNotifyThread; // For VDMTerminateTask
} SHAREDWOWRECORD, *PSHAREDWOWRECORD;
typedef struct _DOSRecord *PDOSRECORD; typedef struct _DOSRecord { PDOSRECORD DOSRecordNext; // Task record chain
ULONG VDMState; // VDM State (bit flags)
ULONG ErrorCode; // Error Code returned by DOS
HANDLE hWaitForParent; // Handle to wait object for parent to wait on
HANDLE hWaitForParentDup; // Dup of hWaitForParent
PVDMINFO lpVDMInfo; // Pointer to VDM Information block
ULONG iTask; DWORD dwThreadId; WORD hTask16; WORD hMod16; PCHAR pFilePath; CHAR szModName[9]; } DOSRECORD, *PDOSRECORD;
typedef struct _CONSOLERECORD *PCONSOLERECORD; typedef struct _CONSOLERECORD { PCONSOLERECORD Next;
HANDLE hConsole; // Console Handle of the session
HANDLE hVDM; // NTVDM process handle running in the console
// these two members below are used only with dos vdm
HANDLE hWaitForVDM; // Handle on which VDM will wait
HANDLE hWaitForVDMDup; // Handle on which server will wake up the VDM (Its a dup of previous one)
ULONG nReEntrancy; // Re-entrancy count
ULONG SequenceNumber; // Sequencenumber from PCSR_PROCESS
ULONG ParentSequenceNumber; // Sequencenumber of parent
ULONG DosSesId; // Temp Session ID for no-console
DWORD dwProcessId;
// these two members below are used only with dos vdm
ULONG cchCurDirs; // Length of NTVDM current directory in bytes
PCHAR lpszzCurDirs; // NTVDM current directory accross VDMs
PDOSRECORD DOSRecord; // Information for Tasks in this console
// UserToken - auth process token
HANDLE DosUserToken; LPTHREAD_START_ROUTINE pfnW32HungAppNotifyThread; // For VDMTerminateTask
} CONSOLERECORD, *PCONSOLERECORD;
typedef struct _WOWRecord { ULONG iTask; BOOL fDispatched; // Is Command Dispatched
HANDLE hWaitForParent; // Parent Will wait on it
HANDLE hWaitForParentServer; // Server will wake up the parent on it
PVDMINFO lpVDMInfo; // Pointer to VDM Information block
PWOWRECORD WOWRecordNext; // Task Record chain
DWORD dwThreadId; WORD hTask16; WORD hMod16; PCHAR pFilePath; CHAR szModName[9]; } WOWRECORD, *PWOWRECORD;
typedef struct _INFORECORD { ULONG iTag; union { PWOWRECORD pWOWRecord; PDOSRECORD pDOSRecord; } pRecord; } INFORECORD, *PINFORECORD;
typedef struct _BATRECORD { HANDLE hConsole; ULONG SequenceNumber; struct _BATRECORD *BatRecordNext; } BATRECORD, *PBATRECORD;
#define WOWMINID 1
#define WOWMAXID 0xfffffffe
// VDMState Defines
#define VDM_TO_TAKE_A_COMMAND 1
#define VDM_BUSY 2
#define VDM_HAS_RETURNED_ERROR_CODE 4
#define VDM_READY 8
VOID BaseSrvVDMInit(VOID); ULONG BaseSrvCheckVDM(PCSR_API_MSG, PCSR_REPLY_STATUS); ULONG BaseSrvUpdateVDMEntry(PCSR_API_MSG, PCSR_REPLY_STATUS); ULONG BaseSrvGetNextVDMCommand(PCSR_API_MSG, PCSR_REPLY_STATUS); ULONG BaseSrvExitVDM(PCSR_API_MSG, PCSR_REPLY_STATUS); ULONG BaseSrvIsFirstVDM(PCSR_API_MSG, PCSR_REPLY_STATUS); ULONG BaseSrvSetReenterCount (PCSR_API_MSG, PCSR_REPLY_STATUS); ULONG BaseSrvCheckWOW(PBASE_CHECKVDM_MSG, HANDLE); ULONG BaseSrvCheckDOS(PBASE_CHECKVDM_MSG, HANDLE); BOOL BaseSrvCopyCommand(PBASE_CHECKVDM_MSG,PINFORECORD); ULONG BaseSrvUpdateWOWEntry(PBASE_UPDATE_VDM_ENTRY_MSG,ULONG); ULONG BaseSrvUpdateDOSEntry(PBASE_UPDATE_VDM_ENTRY_MSG,ULONG); NTSTATUS BaseSrvExitWOWTask(PBASE_EXIT_VDM_MSG, ULONG); NTSTATUS BaseSrvExitDOSTask(PBASE_EXIT_VDM_MSG, ULONG); ULONG BaseSrvGetWOWRecord(ULONG,PWOWRECORD *); ULONG BaseSrvGetVDMExitCode(PCSR_API_MSG,PCSR_REPLY_STATUS); ULONG BaseSrvDupStandardHandles(HANDLE, PDOSRECORD); NTSTATUS BaseSrvGetConsoleRecord (HANDLE,PCONSOLERECORD*); VOID BaseSrvFreeWOWRecord (PWOWRECORD); PCONSOLERECORD BaseSrvAllocateConsoleRecord (VOID); VOID BaseSrvFreeConsoleRecord (PCONSOLERECORD); VOID BaseSrvRemoveConsoleRecord (PCONSOLERECORD); PDOSRECORD BaseSrvAllocateDOSRecord(VOID); VOID BaseSrvFreeDOSRecord (PDOSRECORD); VOID BaseSrvAddDOSRecord (PCONSOLERECORD,PDOSRECORD); VOID BaseSrvRemoveDOSRecord (PCONSOLERECORD,PDOSRECORD); VOID BaseSrvFreeVDMInfo(PVDMINFO); ULONG BaseSrvCreatePairWaitHandles (HANDLE *, HANDLE *); VOID BaseSrvAddConsoleRecord(PCONSOLERECORD); VOID BaseSrvCloseStandardHandles (HANDLE, PDOSRECORD); VOID BaseSrvClosePairWaitHandles (PDOSRECORD); VOID BaseSrvVDMTerminated (HANDLE, ULONG);
NTSTATUS BaseSrvUpdateVDMSequenceNumber ( IN ULONG VdmBinaryType, // binary type
IN HANDLE hVDM, // console handle
IN ULONG DosSesId, // session id
IN HANDLE UniqueProcessClientID, IN HANDLE UniqueProcessParentID );
VOID BaseSrvCleanupVDMResources (PCSR_PROCESS); VOID BaseSrvExitVDMWorker (PCONSOLERECORD); NTSTATUS BaseSrvFillPifInfo (PVDMINFO,PBASE_GET_NEXT_VDM_COMMAND_MSG); ULONG BaseSrvGetVDMCurDirs(PCSR_API_MSG, PCSR_REPLY_STATUS); ULONG BaseSrvSetVDMCurDirs(PCSR_API_MSG, PCSR_REPLY_STATUS); ULONG BaseSrvBatNotification(PCSR_API_MSG, PCSR_REPLY_STATUS); ULONG BaseSrvRegisterWowExec(PCSR_API_MSG, PCSR_REPLY_STATUS); PBATRECORD BaseSrvGetBatRecord(HANDLE); PBATRECORD BaseSrvAllocateAndAddBatRecord(HANDLE); VOID BaseSrvFreeAndRemoveBatRecord(PBATRECORD); BOOL BaseSrvIsVdmAllowed(VOID); NTSTATUS BaseSrvIsClientVdm(HANDLE UniqueProcessClientId);
|