test: convdm.c File Reference

Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

# convdm.c File Reference

`#include "precomp.h"`

Go to the source code of this file.

## Functions

BOOL APIENTRY | VDMConsoleOperation (DWORD iFunction, LPVOID lpData)

## Function Documentation

BOOL APIENTRY VDMConsoleOperation | ( | DWORD | iFunction,
|  | LPVOID | lpData
| ) |

Definition at line 26 of file convdm.c.

References _CONSOLE_VDM_MSG::Bool, _CONSOLE_VDM_MSG::ConsoleHandle, ConsolepVDMOperation, CsrAllocateCaptureBuffer(), CsrCaptureMessageBuffer(), CsrClientCallServer(), CsrFreeCaptureBuffer(), EXCEPTION_EXECUTE_HANDLER, FALSE, GET_CONSOLE_HANDLE, _CONSOLE_VDM_MSG::iFunction, NT_SUCCESS, NULL, _CONSOLE_VDM_MSG::Point, SET_LAST_ERROR, SET_LAST_NT_ERROR, TRUE, and _CONSOLE_API_MSG::u.

    00033           :
    00034
    00035     iFunction - Function Index.
    00036     VDM_HIDE_WINDOW
    00037
    00038 Return Value:
    00039
    00040     TRUE - The operation was successful.
    00041
    00042     FALSE/NULL - The operation failed. Extended error status is available
    00043         using GetLastError.
    00044
    00045
    00046 --*/
    00047
    00048 {
    00049     CONSOLE_API_MSG m;
    00050     PCONSOLE_VDM_MSG a = &m.u.VDMConsoleOperation;
    00051     LPRECT lpRect;
    00052     LPPOINT lpPoint;
    00053     PBOOL lpBool;
    00054     PCSR_CAPTURE_HEADER CaptureBuffer = NULL;
    00055 #if defined(FE_SB)
    00056 #if defined(i386)
    00057     LPVDM_IOCTL_PARAM lpIoctlParam;
    00058 #endif
    00059 #endif // FE_SB
    00060
    00061     a->ConsoleHandle = GET_CONSOLE_HANDLE;
    00062     a->iFunction = iFunction;
    00063     if (iFunction == VDM_CLIENT_TO_SCREEN ||
    00064         iFunction == VDM_SCREEN_TO_CLIENT) {
    00065         lpPoint = (LPPOINT)lpData;
    00066         a->Point = *lpPoint;
    00067     } else if (iFunction == VDM_FULLSCREEN_NOPAINT) {
    00068         a->Bool = (lpData != NULL);
    00069     }
    00070 #if defined(FE_SB)
    00071     else if (iFunction == VDM_SET_VIDEO_MODE) {
    00072         a->Bool = (lpData != NULL);
    00073     }
    00074 #if defined(i386)
    00075     else if (iFunction == VDM_SAVE_RESTORE_HW_STATE) {
    00076         a->Bool = (lpData != NULL);
    00077     }
    00078     else if (iFunction == VDM_VIDEO_IOCTL) {
    00079         lpIoctlParam = (LPVDM_IOCTL_PARAM)lpData;
    00080         a->VDMIoctlParam = *lpIoctlParam;
    00081         if (lpIoctlParam->lpvInBuffer != NULL) {
    00082             if (lpIoctlParam->lpvOutBuffer != NULL || lpIoctlParam->cbInBuffer == 0) {
    00083                 SET_LAST_ERROR(ERROR_INVALID_PARAMETER);
    00084                 return FALSE;
    00085             }
    00086             CaptureBuffer = CsrAllocateCaptureBuffer( 1,
    00087                                                       lpIoctlParam->cbInBuffer
    00088                                                     );
    00089             if (CaptureBuffer == NULL) {
    00090                 SET_LAST_ERROR(ERROR_NOT_ENOUGH_MEMORY);
    00091                 return FALSE;
    00092             }
    00093             CsrCaptureMessageBuffer( CaptureBuffer,
    00094                                      (PCHAR) lpIoctlParam->lpvInBuffer,
    00095                                      lpIoctlParam->cbInBuffer,
    00096                                      (PVOID *) &a->VDMIoctlParam.lpvInBuffer
    00097                                    );
    00098         }
    00099         if (lpIoctlParam->lpvOutBuffer != NULL) {
    00100             if (lpIoctlParam->cbOutBuffer == 0) {
    00101                 SET_LAST_ERROR(ERROR_INVALID_PARAMETER);
    00102                 return FALSE;
    00103             }
    00104             CaptureBuffer = CsrAllocateCaptureBuffer( 1,
    00105                                                       lpIoctlParam->cbOutBuffer
    00106                                                     );
    00107             if (CaptureBuffer == NULL) {
    00108                 SET_LAST_ERROR(ERROR_NOT_ENOUGH_MEMORY);
    00109                 return FALSE;
    00110             }
    00111             CsrCaptureMessageBuffer( CaptureBuffer,
    00112                                      (PCHAR) lpIoctlParam->lpvOutBuffer,
    00113                                      lpIoctlParam->cbOutBuffer,
    00114                                      (PVOID *) &a->VDMIoctlParam.lpvOutBuffer
    00115                                    );
    00116         }
    00117     }
    00118 #endif // i386
    00119 #endif // FE_SB
    00120     CsrClientCallServer( (PCSR_API_MSG)&m,
    00121                          CaptureBuffer,
    00122                          CSR_MAKE_API_NUMBER( CONSRV_SERVERDLL_INDEX,
    00123                          ConsolepVDMOperation
    00124                                             ),
    00125                          sizeof( *a )
    00126                        );
    00127     if (NT_SUCCESS( m.ReturnValue )) {
    00128         switch (iFunction) {
    00129             case VDM_IS_ICONIC:
    00130             case VDM_IS_HIDDEN:
    00131                 lpBool = (PBOOL)lpData;
    00132                 *lpBool = a->Bool;
    00133                 break;
    00134             case VDM_CLIENT_RECT:
    00135                 lpRect = (LPRECT)lpData;
    00136                 *lpRect = a->Rect;
    00137                 break;
    00138             case VDM_CLIENT_TO_SCREEN:
    00139             case VDM_SCREEN_TO_CLIENT:
    00140                 *lpPoint = a->Point;
    00141                 break;
    00142 #if defined(FE_SB)
    00143 #if defined(i386)
    00144             case VDM_VIDEO_IOCTL:
    00145                 if (lpIoctlParam->lpvOutBuffer != NULL) {
    00146                     try {
    00147                         RtlCopyMemory( lpIoctlParam->lpvOutBuffer,
    00148                                        a->VDMIoctlParam.lpvOutBuffer,
    00149                                        lpIoctlParam->cbOutBuffer );
    00150                     } except( EXCEPTION_EXECUTE_HANDLER ) {
    00151                         CsrFreeCaptureBuffer( CaptureBuffer );
    00152                         SET_LAST_ERROR(ERROR_INVALID_ACCESS);
    00153                         return FALSE;
    00154                     }
    00155                 }
    00156                 if (CaptureBuffer != NULL) {
    00157                     CsrFreeCaptureBuffer( CaptureBuffer );
    00158                 }
    00159                 break;
    00160 #endif // i386
    00161 #endif // FE_SB
    00162             default:
    00163                 break;
    00164         }
    00165         return TRUE;
    00166     } else {
    00167 #if defined(FE_SB)
    00168 #if defined(i386)
    00169         if (CaptureBuffer != NULL) {
    00170             CsrFreeCaptureBuffer( CaptureBuffer );
    00171         }
    00172 #endif // i386
    00173 #endif // FE_SB
    00174         SET_LAST_NT_ERROR (m.ReturnValue);
    00175         return FALSE;
    00176     }
    00177 }
    }