|
|
/******************************Module*Header*******************************\
* Module Name: MISC.CXX * * * * _HYDRA_ routines * * * * Copyright (c) 1997-1999 Microsoft * \**************************************************************************/
#include "precomp.hxx"
#pragma hdrstop
BOOL G_fDoubleDpi = FALSE; BOOL G_fConsole = TRUE; PFILE_OBJECT G_RemoteVideoFileObject = NULL; PFILE_OBJECT G_RemoteConnectionFileObject = NULL; HANDLE G_RemoteConnectionChannel = NULL; PBYTE G_PerformanceStatistics = NULL; LPWSTR G_DisplayDriverNames = L"vgastub\0";
PFILE_OBJECT G_SaveRemoteVideoFileObject = NULL; PFILE_OBJECT G_SaveRemoteConnectionFileObject = NULL; HANDLE G_SaveRemoteConnectionChannel = NULL; PBYTE G_SavePerformanceStatistics = NULL;
/******************************Exported*Routine****************************\
* * GreConsoleShadowStart( ) * * * Saves remote channel handles and swicth to channel handles for Console Shadow * \**************************************************************************/
BOOL GreConsoleShadowStart( HANDLE hRemoteConnectionChannel, PBYTE pPerformanceStatistics, PFILE_OBJECT pVideoFile, PFILE_OBJECT pRemoteConnectionFileObject ) {
G_SaveRemoteVideoFileObject = G_RemoteVideoFileObject; G_SaveRemoteConnectionFileObject = G_RemoteConnectionFileObject; G_SavePerformanceStatistics = G_PerformanceStatistics; G_SaveRemoteConnectionChannel = G_RemoteConnectionChannel;
G_RemoteVideoFileObject = pVideoFile; G_RemoteConnectionFileObject = pRemoteConnectionFileObject; G_PerformanceStatistics = pPerformanceStatistics; G_RemoteConnectionChannel = hRemoteConnectionChannel;
return TRUE; }
/******************************Exported*Routine****************************\
* * GreConsoleShadowStop( ) * * * Restores remote channel handles after Console Shadow * \**************************************************************************/
BOOL GreConsoleShadowStop( VOID ) {
G_RemoteVideoFileObject = G_SaveRemoteVideoFileObject; G_RemoteConnectionFileObject = G_SaveRemoteConnectionFileObject; G_PerformanceStatistics = G_SavePerformanceStatistics; G_RemoteConnectionChannel = G_SaveRemoteConnectionChannel;
return TRUE; }
/******************************Exported*Routine****************************\
* * GreMultiUserInitSession( ) * * * Initialize the multi-user session gre library * \**************************************************************************/
BOOL GreMultiUserInitSession( HANDLE hRemoteConnectionChannel, PBYTE pPerformanceStatistics, PFILE_OBJECT pVideoFile, PFILE_OBJECT pRemoteConnectionFileObject, ULONG DisplayDriverNameLength, PWCHAR DisplayDriverName ) { BOOL bRet = FALSE;
G_RemoteVideoFileObject = pVideoFile; G_RemoteConnectionFileObject = pRemoteConnectionFileObject; G_PerformanceStatistics = pPerformanceStatistics; G_RemoteConnectionChannel = hRemoteConnectionChannel;
G_DisplayDriverNames = (LPWSTR)GdiAllocPool( (DisplayDriverNameLength + 1) * sizeof(WCHAR), 'yssU');
if (G_DisplayDriverNames) { wcsncpy(G_DisplayDriverNames, DisplayDriverName, DisplayDriverNameLength + 1); bRet = TRUE; }
return bRet; }
/******************************Exported*Routine****************************\
* HDXDrvEscape( hdev, iEsc, pInbuffer, cbInbuffer ) * * Tell the TShare display driver to perform the specified operation. * * hdev (input) * Identifies the device * * iEsc (input) * Specifies the Operation to be performed * * ESC_FLUSH_FRAME_BUFFER Flush the frame buffer * ESC_SET_WD_TIMEROBJ Pass the timer object to the WD * * pInbuffer (input) * Data buffer * * cbInbuffer (input) * Data buffer length * \**************************************************************************/
BOOL HDXDrvEscape( HDEV hdev, ULONG iEsc, PVOID pInbuffer, ULONG cbInbuffer ) { BOOL Result; PDEVOBJ po(hdev);
if (!po.bValid()) return(FALSE);;
//
// If this is not a DISPLAY, return error
//
if (!po.bDisplayPDEV()) return(FALSE);;
//
// Wait for the display to become available and lock it.
//
GreAcquireSemaphoreEx(po.hsemDevLock(), SEMORDER_DEVLOCK, NULL); { SEMOBJ so(po.hsemPointer());
//
// The device may have something going on, synchronize with it first
//
po.vSync(po.pSurface()->pSurfobj(),NULL,0);
//
// Call the driver to perform the specified operation
//
if ( PPFNVALID(po,Escape) ) Result = (*PPFNDRV(po,Escape))(&po.pSurface()->so, iEsc, cbInbuffer, pInbuffer, 0, NULL ); else Result = TRUE; } GreReleaseSemaphoreEx(po.hsemDevLock());
return(Result); }
/******************************Exported*Routine****************************\
* * bDrvReconnect( hDev, RemoteConnectionChannel ) * * This is done for reconnects. * * Notify the display driver of a new connection (not a shadow connection) * * hdev (input) * Identifies device to be connected * RemoteConnectionChannel (input) * Remote channel handle * pRemoteConnectionFileObject (input) * Remote connection channel file object * \**************************************************************************/
BOOL bDrvReconnect( HDEV hdev, HANDLE RemoteConnectionChannel, PFILE_OBJECT pRemoteConnectionFileObject, BOOL bSetPalette ) { BOOL Result;
PDEVOBJ po(hdev);
if (!po.bValid()) return(FALSE);
//
// If this is not a DISPLAY, return error
//
if (!po.bDisplayPDEV()) return(FALSE);
//
// Wait for the display to become available and lock it.
//
GreAcquireSemaphoreEx(po.hsemDevLock(), SEMORDER_DEVLOCK, NULL);
{ SEMOBJ so(po.hsemPointer());
//
// The device may have something going on, synchronize with it first
//
po.vSync(po.pSurface()->pSurfobj(),NULL,0);
//
// Call the driver connect function (if defined)
//
if ( PPFNVALID(po,Reconnect) ) Result = (*PPFNDRV(po,Reconnect))( RemoteConnectionChannel, pRemoteConnectionFileObject ); else Result = TRUE;
if ( bSetPalette == TRUE ) {
//
// Set the palette
//
XEPALOBJ pal(po.ppalSurf()); ASSERTGDI(pal.bValid(), "EPALOBJ failure\n");
if ((Result == TRUE) && pal.bIsPalManaged()) { ASSERTGDI(PPFNVALID(po,SetPalette), "ERROR palette is not managed");
(*PPFNDRV(po,SetPalette))(po.dhpdev(), (PALOBJ *) &pal, 0, 0, pal.cEntries()); } } }
GreReleaseSemaphoreEx(po.hsemDevLock());
return( Result ); }
/******************************Exported*Routine****************************\
* bDrvDisconnect(hdev) * * Notify the display driver that the connection is going away. * This is the primary connection. * * hdev (input) * Identifies device to be disabled * * RemoteConnectionChannel (input) * Channel being disconnected * * pRemoteConnectionFileObject (input) * File object pointer to Channel being disconnected * \**************************************************************************/
BOOL bDrvDisconnect( HDEV hdev, HANDLE RemoteConnectionChannel, PFILE_OBJECT pRemoteConnectionFileObject ) { BOOL Result;
PDEVOBJ po(hdev);
if (!po.bValid()) return(FALSE);
//
// If this is not a DISPLAY, return error
//
if (!po.bDisplayPDEV()) return(FALSE);
//
// Wait for the display to become available and lock it.
//
GreAcquireSemaphoreEx(po.hsemDevLock(), SEMORDER_DEVLOCK, NULL);
{ SEMOBJ so(po.hsemPointer());
//
// The device may have something going on, synchronize with it first
//
po.vSync(po.pSurface()->pSurfobj(),NULL,0);
//
// Call the driver disconnect function (if defined)
//
if ( PPFNVALID(po,Disconnect) ) Result = (*PPFNDRV(po,Disconnect))( RemoteConnectionChannel, pRemoteConnectionFileObject ); else Result = TRUE; }
GreReleaseSemaphoreEx(po.hsemDevLock());
return( Result ); }
/******************************Exported*Routine****************************\
* * bDrvShadowConnect( hDev, RemoteConnectionChannel, pRemoteConnectionFileObject ) * * This is done for new shadow connections. * * hdev (input) * Identifies device to be connected * RemoteConnectionChannel ( input ) * Remote connection channel of shadow (for modes) * pRemoteConnectionFileObject ( input ) * Remote Connection file object pointer of shadow (for modes) * \**************************************************************************/
BOOL bDrvShadowConnect( HDEV hdev, PVOID pRemoteConnectionData, ULONG RemoteConnectionDataLength ) { BOOL Result;
PDEVOBJ po(hdev);
if (!po.bValid()) return(FALSE);
//
// If this is not a DISPLAY, return error
//
if (!po.bDisplayPDEV()) return(FALSE);
//
// Wait for the display to become available and lock it.
//
GreAcquireSemaphoreEx(po.hsemDevLock(), SEMORDER_DEVLOCK, NULL);
{ SEMOBJ so(po.hsemPointer());
//
// The device may have something going on, synchronize with it first
//
po.vSync(po.pSurface()->pSurfobj(),NULL,0);
//
// Call the driver connect function (if defined)
//
if ( PPFNVALID(po,ShadowConnect) ) Result = (*PPFNDRV(po,ShadowConnect))( pRemoteConnectionData, RemoteConnectionDataLength ); else Result = TRUE;
//
// Set the palette
//
XEPALOBJ pal(po.ppalSurf()); ASSERTGDI(pal.bValid(), "EPALOBJ failure\n");
if ((Result == TRUE) && pal.bIsPalManaged()) { ASSERTGDI(PPFNVALID(po,SetPalette), "ERROR palette is not managed");
(*PPFNDRV(po,SetPalette))(po.dhpdev(), (PALOBJ *) &pal, 0, 0, pal.cEntries()); } }
GreReleaseSemaphoreEx(po.hsemDevLock());
return( Result ); }
/******************************Exported*Routine****************************\
* bDrvShadowDisconnect(hdev, RemoteConnectionChannel, pRemoteConnectionFileObject) * * Notify the display driver that the shadow connection is going away. * * hdev (input) * Identifies device to be disabled * * RemoteConnectionChannel (input) * Shadow Channel being disconnected * pRemoteConnectionFileObject (input) * Shadow Channel being disconnected * \**************************************************************************/
BOOL bDrvShadowDisconnect( HDEV hdev, PVOID pRemoteConnectionData, ULONG RemoteConnectionDataLength ) { BOOL Result;
PDEVOBJ po(hdev);
if (!po.bValid()) return(FALSE);
//
// If this is not a DISPLAY, return error
//
if (!po.bDisplayPDEV()) return(FALSE);
//
// Wait for the display to become available and lock it.
//
GreAcquireSemaphoreEx(po.hsemDevLock(), SEMORDER_DEVLOCK, NULL);
{ SEMOBJ so(po.hsemPointer());
//
// The device may have something going on, synchronize with it first
//
po.vSync(po.pSurface()->pSurfobj(),NULL,0);
//
// Call the driver disconnect function (if defined)
//
if ( PPFNVALID(po,ShadowDisconnect) ) Result = (*PPFNDRV(po,ShadowDisconnect))( pRemoteConnectionData, RemoteConnectionDataLength ); else Result = TRUE;
//
// Reset the palette
//
XEPALOBJ pal(po.ppalSurf()); ASSERTGDI(pal.bValid(), "EPALOBJ failure\n");
if ((Result == TRUE) && pal.bIsPalManaged()) { ASSERTGDI(PPFNVALID(po,SetPalette), "ERROR palette is not managed");
(*PPFNDRV(po,SetPalette))(po.dhpdev(), (PALOBJ *) &pal, 0, 0, pal.cEntries()); } }
GreReleaseSemaphoreEx(po.hsemDevLock());
return( Result ); }
/******************************Exported*Routine****************************\
* vDrvInvalidateRect( hdev, prcl ) * * Tell the display driver to invalidate the specified rect. * * hdev (input) * Identifies the device * * prcl (input) * Identifies the rectangle to invalidate * \**************************************************************************/
VOID vDrvInvalidateRect( HDEV hdev, PRECT prcl ) { GDIFunctionID(vDrvInvalidateRect);
PDEVOBJ po(hdev);
if (!po.bValid()) return;
//
// If this is not a DISPLAY, return error
//
if (!po.bDisplayPDEV()) return;
//
// Wait for the display to become available and lock it.
//
GreAcquireSemaphoreEx(po.hsemDevLock(), SEMORDER_DEVLOCK, NULL); GreEnterMonitoredSection(po.ppdev, WD_DEVLOCK);
{ SEMOBJ so(po.hsemPointer());
//
// The device may have something going on, synchronize with it first
//
po.vSync(po.pSurface()->pSurfobj(),NULL,0);
//
// Call the driver invalidate rect function (if defined)
//
if ( PPFNVALID(po,InvalidateRect) ) (*PPFNDRV(po,InvalidateRect))( prcl ); }
GreExitMonitoredSection(po.ppdev, WD_DEVLOCK); GreReleaseSemaphore(po.hsemDevLock()); }
/******************************Exported*Routine****************************\
* vDrvDispalyIOCtl( hdev, pbuffer, cbbuffer ) * * Tell the display driver to invalidate the specified rect. * * hdev (input) * Identifies the device * * pbuffer (input) * IOCtl data buffer * * cbbuffer (input) * IOCtl data buffer length * \**************************************************************************/
BOOL bDrvDisplayIOCtl( HDEV hdev, PVOID pbuffer, ULONG cbbuffer ) { BOOL Result; PDEVOBJ po(hdev);
if (!po.bValid()) return(FALSE);;
//
// If this is not a DISPLAY, return error
//
if (!po.bDisplayPDEV()) return(FALSE);;
//
// Wait for the display to become available and lock it.
//
GreAcquireSemaphoreEx(po.hsemDevLock(), SEMORDER_DEVLOCK, NULL); GreEnterMonitoredSection(po.ppdev, WD_DEVLOCK);
{ SEMOBJ so(po.hsemPointer());
//
// The device may have something going on, synchronize with it first
//
po.vSync(po.pSurface()->pSurfobj(),NULL,0);
//
// Call the driver invalidate rect function (if defined)
//
if ( PPFNVALID(po,DisplayIOCtl) ) Result = (*PPFNDRV(po,DisplayIOCtl))( pbuffer, cbbuffer ); else Result = TRUE; }
GreExitMonitoredSection(po.ppdev, WD_DEVLOCK); GreReleaseSemaphoreEx(po.hsemDevLock());
return(Result); }
|