/*++ Copyright (c) 1989 Microsoft Corporation Module Name: dllvio.c Abstract: This module implements the VIOCALLS OS/2 V2.0 API Calls Author: Revision History: --*/ #define INCL_OS2V20_TASKING #define INCL_OS2V20_NLS #define INCL_OS2V20_ERRORS #include "os2dll.h" #include "os2dll16.h" #include "conrqust.h" #include "os2nls.h" #include "os2win.h" #include #if DBG #define EXCEPTION_IN_VIO() \ { \ KdPrint(("%s: GP Exception\n", FuncName)); \ Od2ExitGP(); \ } #else #define EXCEPTION_IN_VIO() \ Od2ExitGP(); #endif #define SET_SCROLL_PARMS() \ Scroll.ScrollRect.Left = (SHORT)ulLeftCol; \ Scroll.ScrollRect.Top = (SHORT)ulTopRow; \ Scroll.ScrollRect.Right = (SHORT)ulRightCol; \ Scroll.ScrollRect.Bottom = (SHORT)ulBotRow; \ Scroll.cbLines = (SHORT)cbLines; \ try \ { \ RtlMoveMemory( &Scroll.Cell[0], \ pbCell, \ SesGrp->BytesPerCell); \ } except( EXCEPTION_EXECUTE_HANDLER ) \ { \ EXCEPTION_IN_VIO() \ } #if DBG #define TEST_HVIO_NON_AVIO() \ if (hVio != 0) \ { \ KdPrint(("%s: hVio non NULL - AVIO not supported yet\n", \ FuncName)); \ return ERROR_VIO_INVALID_HANDLE; \ } #else #define TEST_HVIO_NON_AVIO() \ if (hVio != 0) \ { \ return ERROR_VIO_INVALID_HANDLE; \ } #endif #if DBG #define CHECK_RETURN_STATUS() \ if ( RetCode ) \ { \ IF_OD2_DEBUG( VIO ) \ KdPrint(("%s: status %lu\n", FuncName, RetCode)); \ return(RetCode); \ } #else #define CHECK_RETURN_STATUS() \ if ( RetCode ) \ { \ return(RetCode); \ } #endif #if DBG #define CHECK_POPUP_EXIST() \ if (SesGrp->PopUpFlag && \ (SesGrp->PopUpProcess == (HANDLE)(Od2Process->Pib.ProcessId))) \ { \ IF_OD2_DEBUG( VIO ) \ KdPrint(("%s: illegal call when PopUp exist\n", FuncName )); \ return( ERROR_VIO_ILLEGAL_DURING_POPUP ); \ } #else #define CHECK_POPUP_EXIST() \ if (SesGrp->PopUpFlag && \ (SesGrp->PopUpProcess == (HANDLE)(Od2Process->Pib.ProcessId))) \ { \ return( ERROR_VIO_ILLEGAL_DURING_POPUP ); \ } #endif APIRET Od2VioCheckPopupAndPause( IN BOOLEAN AllowedInPopup, IN BOOLEAN Wait #if DBG ,IN PSZ FuncName #endif ); /* * Each API is composed of the following steps: * * 1. Dump to the debugger the func name and some parms * (protected by "#if DBG" and "IF_OD2_DEBUG( VIO )" * 2A. Testing for non AVIO (hVio zero) * 2B. Test other parm legalty * 2C. Probe address parmeters * 2D. Check popup and pause * 3. Call Ow2Xxxx API (from os2ses\viorqust.c) * 4. CHECK_RETURN_STATUS() * 5. Update return parms * 6. Return Rc */ APIRET VioWrtTTY(IN PCH string, IN ULONG Length, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioWrtTTY"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Len %lu, 0x%x...\n", FuncName, hVio, Length, (ULONG)(UCHAR)*string)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForRead(string, Length, 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioWriteTTYStr( string, Length, (ULONG)VIOWrtTTY ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioWrtCellStr(IN PCH CellStr, IN ULONG Length, IN ULONG Row, IN ULONG Col, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioWrtCellStr"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Len %lu, Row %lu, Col %lu, CellString 0x%x:0x%x...\n", FuncName, hVio, Length ,Row, Col, (ULONG)(UCHAR)CellStr[0],(ULONG)(UCHAR)CellStr[1])); } #endif TEST_HVIO_NON_AVIO() //try //{ // Od2ProbeForRead(CellStr, Length, 1); //} except( EXCEPTION_EXECUTE_HANDLER ) //{ // EXCEPTION_IN_VIO() //} if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } Length &= SesGrp->VioLengthMask; /* length should be even */ RetCode = Ow2VioWriteCellStr( Length, Row, Col, CellStr ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioWrtCharStr(IN PCH CharStr, IN ULONG Length, IN ULONG Row, IN ULONG Col, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioWrtCharStr"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Len %lu, Row %lu, Col %lu, 0x%x...\n", FuncName, hVio, Length, Row, Col, (ULONG)(UCHAR)*CharStr)); } #endif TEST_HVIO_NON_AVIO() //try //{ // Od2ProbeForRead(CharStr, Length, 1); //} except( EXCEPTION_EXECUTE_HANDLER ) //{ // EXCEPTION_IN_VIO() //} if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioWriteCharStr( Length, Row, Col, CharStr ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioWrtCharStrAtt(IN PCH CharStr, IN ULONG Length, IN ULONG Row, IN ULONG Col, IN PBYTE Attr, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioWrtCharStrAtt"; IF_OD2_DEBUG(VIO) { #if 0 UCHAR Buffer[256], *Ptr = CharStr, *Ptr1; ULONG Count = Length, CurCount, i, j; #endif KdPrint(("%s: hVio %lx, Len %lu, Row %lu, Col %lu, Attr %x, 0x%x...\n", FuncName, hVio, Length, Row, Col, (ULONG)(UCHAR)*Attr, (ULONG)(UCHAR)*CharStr)); #if 0 for ( j = 0 ; Count ; Count -= CurCount, Ptr += CurCount, j++ ) { CurCount = ( Count > 16 ) ? 16 : Count; sprintf(Buffer, " %2.2x. %2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x = ", j, Ptr[0], Ptr[1], Ptr[2], Ptr[3], Ptr[4], Ptr[5], Ptr[6], Ptr[7], Ptr[8], Ptr[9], Ptr[10], Ptr[11], Ptr[12], Ptr[13], Ptr[14], Ptr[15] ); Ptr1 = &Buffer[59]; for ( i = 0 ; i < 16 ; i++ ) { if ( i >= CurCount ) { Buffer[8 + i * 3] = Buffer[9 + i * 3] = Buffer[10 + i * 3] = ' '; } else if ((Ptr[i] < 0x20) || (Ptr[i] > 0x7E)) { *Ptr1++ = '?'; } else { *Ptr1++ = Ptr[i]; } } *Ptr1++ = '\n'; *Ptr1 = '\0'; KdPrint((Buffer)); } #endif } #endif TEST_HVIO_NON_AVIO() try { // Od2ProbeForRead(CharStr, Length, 1); Od2ProbeForRead(Attr, SesGrp->BytesPerCell - 1, 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioWriteCharStrAtt( Length, Row, Col, CharStr, Attr ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioWrtNCell(IN PBYTE Cell, IN ULONG Number, IN ULONG Row, IN ULONG Col, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioWrtNCell"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Num %lu, Cell %x:%x, Row %lu, Col %lu\n", FuncName, hVio, Number, (ULONG)(UCHAR)Cell[0], (ULONG)(UCHAR)Cell[1], Row, Col)); } #endif TEST_HVIO_NON_AVIO() try { #ifdef DBCS // MSKK Jan.13.1993 V-AkihiS // MSKK Oct.11.1993 V-AkihiS if (Ow2NlsIsDBCSLeadByte(*Cell, SesGrp->VioCP)) { Od2ProbeForRead(Cell, SesGrp->BytesPerCell * 2, 1); } else { Od2ProbeForRead(Cell, SesGrp->BytesPerCell, 1); } #else Od2ProbeForRead(Cell, SesGrp->BytesPerCell, 1); #endif } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } RetCode = Ow2VioFillNCell( Number, Row, Col, Cell ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioWrtNAttr(IN PBYTE Attr, IN ULONG Number, IN ULONG Row, IN ULONG Col, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioWrtNAttr"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Num %lu, Attr %x, Row %lu, Col %lu\n", FuncName, hVio, Number, (ULONG)(UCHAR)*Attr, Row, Col)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForRead(Attr, SesGrp->BytesPerCell - 1, 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } RetCode = Ow2VioFillNAttr( Number, Row, Col, Attr ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioWrtNChar(IN PBYTE Char, IN ULONG Number, IN ULONG Row, IN ULONG Col, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioWrtNChar"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Num %lu, Char %x, Row %lu, Col %lu\n", FuncName, hVio, Number, (ULONG)(UCHAR)*Char, Row, Col)); } #endif TEST_HVIO_NON_AVIO() try { #ifdef DBCS // MSKK Jan.13.1993 V-AkihiS // MSKK Oct.11.1993 V-AkihiS if (Ow2NlsIsDBCSLeadByte(*Char, SesGrp->VioCP)) { Od2ProbeForRead(Char, 2, 1); } else { Od2ProbeForRead(Char, 1, 1); } #else Od2ProbeForRead(Char, 1, 1); #endif } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } RetCode = Ow2VioFillNChar( Number, Row, Col, Char ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioReadCellStr(OUT PCH CellStr, IN OUT PUSHORT Length, IN ULONG Row, IN ULONG Col, IN ULONG hVio) { APIRET RetCode; ULONG VioLength; #if DBG PSZ FuncName; FuncName = "VioReadCellStr"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Len %u, Row %lu, Col %lu\n", FuncName, hVio, (ULONG)*Length, Row, Col)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForWrite(Length, sizeof(USHORT), 1); // Od2ProbeForWrite(CellStr, *Length, 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } VioLength = *Length & SesGrp->VioLengthMask; /* length should be even */ RetCode = Ow2VioReadCellStr( &VioLength, Row, Col, CellStr ); CHECK_RETURN_STATUS() *Length = (USHORT)VioLength; return NO_ERROR; } APIRET VioReadCharStr(OUT PCH CharStr, IN OUT PUSHORT Length, IN ULONG Row, IN ULONG Col, IN ULONG hVio) { APIRET RetCode; ULONG VioLength; #if DBG PSZ FuncName; FuncName = "VioReadCharStr"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Len %u, Row %lu, Col %lu\n", FuncName, hVio, (ULONG)*Length, Row, Col)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForWrite(Length, sizeof(USHORT), 1); // Od2ProbeForWrite(CharStr, *Length, 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } VioLength = *Length; RetCode = Ow2VioReadCharStr( &VioLength, Row, Col, CharStr ); CHECK_RETURN_STATUS() *Length = (USHORT)VioLength; return NO_ERROR; } APIRET VioScrollDn(IN ULONG ulTopRow, IN ULONG ulLeftCol, IN ULONG ulBotRow, IN ULONG ulRightCol, IN ULONG cbLines, IN PBYTE pbCell, IN ULONG hVio) { VIOSCROLL Scroll; APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioScrollDown"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, # %lu, at %lu:%lu:%lu:%lu, %x:%x\n", FuncName, hVio, cbLines, ulTopRow, ulLeftCol, ulBotRow, ulRightCol, (ULONG)*pbCell, (ULONG)pbCell[1])); } #endif TEST_HVIO_NON_AVIO() SET_SCROLL_PARMS() if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioScroll( (PVOID)&Scroll, 1 ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioScrollLf(IN ULONG ulTopRow, IN ULONG ulLeftCol, IN ULONG ulBotRow, IN ULONG ulRightCol, IN ULONG cbLines, IN PBYTE pbCell, IN ULONG hVio) { VIOSCROLL Scroll; APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioScrollLeft"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, # %lu, at %lu:%lu:%lu:%lu, %x:%x\n", FuncName, hVio, cbLines, ulTopRow, ulLeftCol, ulBotRow, ulRightCol, (ULONG)*pbCell, (ULONG)pbCell[1])); } #endif TEST_HVIO_NON_AVIO() SET_SCROLL_PARMS() if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioScroll( (PVOID)&Scroll, 4 ); CHECK_RETURN_STATUS() return( NO_ERROR ); } APIRET VioScrollRt(IN ULONG ulTopRow, IN ULONG ulLeftCol, IN ULONG ulBotRow, IN ULONG ulRightCol, IN ULONG cbLines, IN PBYTE pbCell, IN ULONG hVio) { VIOSCROLL Scroll; APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioScrollRight"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, # %lu, at %lu:%lu:%lu:%lu, %x:%x\n", FuncName, hVio, cbLines, ulTopRow, ulLeftCol, ulBotRow, ulRightCol, (ULONG)*pbCell, (ULONG)pbCell[1])); } #endif TEST_HVIO_NON_AVIO() SET_SCROLL_PARMS() if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioScroll( (PVOID)&Scroll, 2 ); CHECK_RETURN_STATUS() return( NO_ERROR ); } APIRET VioScrollUp(IN ULONG ulTopRow, IN ULONG ulLeftCol, IN ULONG ulBotRow, IN ULONG ulRightCol, IN ULONG cbLines, IN PBYTE pbCell, IN ULONG hVio) { VIOSCROLL Scroll; APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioScrollUp"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, # %lu, at %lu:%lu:%lu:%lu, %x:%x\n", FuncName, hVio, cbLines, ulTopRow, ulLeftCol, ulBotRow, ulRightCol, (ULONG)*pbCell, (ULONG)pbCell[1])); } #endif TEST_HVIO_NON_AVIO() SET_SCROLL_PARMS() if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioScroll( (PVOID)&Scroll, 3 ); CHECK_RETURN_STATUS() return( NO_ERROR ); } APIRET VioGetAnsi( OUT PUSHORT pfAnsi, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioGetAnsi"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForWrite(pfAnsi, 2, 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } *pfAnsi = (USHORT)SesGrp->AnsiMode; #if DBG IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Ansi %u\n", FuncName, hVio, (ULONG)*pfAnsi)); } #endif return NO_ERROR; } APIRET VioSetAnsi( IN ULONG fAnsi, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioSetAnsi"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Ansi %lu\n", FuncName, hVio, fAnsi)); } #endif TEST_HVIO_NON_AVIO() if (RetCode = Od2VioCheckPopupAndPause( FALSE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } if ((fAnsi!= ANSI_ON) && (fAnsi!=ANSI_OFF)) { return(ERROR_VIO_INVALID_PARMS); } SesGrp->AnsiMode = fAnsi; return NO_ERROR; } APIRET VioGetConfig( IN ULONG usConfigId, // this is no longer reserved value IN OUT PVIOCONFIGINFO Config, IN ULONG hVio) { APIRET RetCode = NO_ERROR; #if DBG PSZ FuncName; FuncName = "VioGetConfig"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, size %u\n", FuncName, hVio, (ULONG)Config->cb)); } #endif TEST_HVIO_NON_AVIO() if (usConfigId > VIO_CONFIG_PRIMARY) // it's not CURRENT/PRIMARY { return(ERROR_VIO_INVALID_PARMS); } try { if ((Config->cb != sizeof(VIOCONFIGINFO)) && (Config->cb != 10)) { #if DBG IF_OD2_DEBUG(VIO) { KdPrint(("%s: illegal length(cb) %u\n", FuncName, Config->cb)); } #endif RetCode = ERROR_VIO_INVALID_LENGTH; } Od2ProbeForWrite(Config, Config->cb, 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode) { return(RetCode); } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioGetConfig( (PVOID)Config ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioGetCp( IN ULONG usReserved, OUT PUSHORT pIdCodePage, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioGetCp"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() if (usReserved) { return(ERROR_VIO_INVALID_PARMS); } try { Od2ProbeForWrite(pIdCodePage, 2, 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } *pIdCodePage = (USHORT)SesGrp->VioCP; #if DBG IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Cp %u\n", FuncName, hVio, (ULONG)*pIdCodePage)); } #endif return NO_ERROR; } APIRET VioSetCp( IN ULONG usReserved, IN ULONG idCodePage, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioSetCp"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Cp %lu\n", FuncName, hVio, idCodePage)); } #endif TEST_HVIO_NON_AVIO() if (usReserved) { return(ERROR_VIO_INVALID_PARMS); } #ifdef DBCS // MSKK Apr.15.1993 V-AkihiS // allow code page = 0 if (( idCodePage != 0 ) && ( idCodePage != SesGrp->PrimaryCP ) && ( idCodePage != SesGrp->SecondaryCP )) #else if (( idCodePage == 0 ) || (( idCodePage != SesGrp->PrimaryCP ) && ( idCodePage != SesGrp->SecondaryCP ))) #endif { #if DBG IF_OD2_DEBUG(VIO) { KdPrint(("%s: invalid CP %lu\n", idCodePage)); } #endif return (ERROR_INVALID_CODE_PAGE); } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioSetNewCp( idCodePage ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioGetCurPos( OUT PUSHORT pusRow, OUT PUSHORT pusColumn, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioGetCurPos"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForWrite(pusRow, sizeof(USHORT), 1); Od2ProbeForWrite(pusColumn, sizeof(USHORT), 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioGetCurPos( pusRow, pusColumn ); CHECK_RETURN_STATUS() #if DBG IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Row %u, Col %u\n", FuncName, hVio, (ULONG)*pusRow, (ULONG)*pusColumn)); } #endif return NO_ERROR; } APIRET VioSetCurPos( IN ULONG usRow, IN ULONG usColumn, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioSetCurPos"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Row %lu, Col %lu\n", FuncName, hVio, usRow, usColumn)); } #endif TEST_HVIO_NON_AVIO() if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioSetCurPos( usRow, usColumn ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioGetCurType( OUT PVIOCURSORINFO pCurType, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioGetCurType"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForWrite(pCurType, sizeof(PVIOCURSORINFO), 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioGetCurType( (PVOID)pCurType ); CHECK_RETURN_STATUS() #if DBG IF_OD2_DEBUG(VIO) { KdPrint(("%s: yStart %u, cEnd %u, cx %u, %sVisible (attr %u)\n", FuncName, (ULONG)pCurType->yStart, (ULONG)pCurType->cEnd, (ULONG)pCurType->cx, (pCurType->attr == 0xffff) ? "no " : "", (ULONG)pCurType->attr)); } #endif return NO_ERROR; } APIRET VioSetCurType( OUT PVIOCURSORINFO pCurType, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioSetCurType"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, yStart %u, cEnd %u, cx %u, %sVisible (attr %u)\n", FuncName, hVio, (ULONG)pCurType->yStart, (ULONG)pCurType->cEnd, (ULONG)pCurType->cx, (pCurType->attr == 0xffff) ? "no " : "", (ULONG)pCurType->attr)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForRead(pCurType, sizeof(PVIOCURSORINFO), 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioSetCurType( (PVOID)pCurType ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioGetMode( IN OUT PVIOMODEINFO Mode, IN ULONG hVio) { APIRET RetCode = NO_ERROR; USHORT Length; #if DBG PSZ FuncName; FuncName = "VioGetMode"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, size %u\n", FuncName, hVio, (ULONG)Mode->cb)); } #endif TEST_HVIO_NON_AVIO() try { if (Mode->cb < 2 ) { RetCode = ERROR_VIO_INVALID_LENGTH; } else { Length = Mode->cb; if (Length > sizeof(VIOMODEINFO)) { Mode->cb = 12; } else if ((Length > 4) && (Length < 12) && (Length & 1)) { Mode->cb &= 0xFFFE; //} else if ((Length > 12) && (Length < 34) && (Length & 3)) //{ // Mode->cb &= 0xFFFC; } Od2ProbeForWrite(Mode, Mode->cb, 1); } } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode) { return(RetCode); } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioGetMode( (PVOID)Mode ); CHECK_RETURN_STATUS() #if DBG IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Type %u, Color %u, Row %u, Col %u\n", FuncName, hVio, (ULONG)Mode->fbType, (ULONG)Mode->color, (ULONG)Mode->row, (ULONG)Mode->col)); } #endif return NO_ERROR; } APIRET VioSetMode( IN OUT PVIOMODEINFO Mode, IN ULONG hVio) { APIRET RetCode = NO_ERROR; VIOMODEINFO LocalMode; register USHORT Length; #if DBG PSZ FuncName; FuncName = "VioSetMode"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Type %u, Color %u, Row %u, Col %u\n", FuncName, hVio, (ULONG)Mode->fbType, (ULONG)Mode->color, (ULONG)Mode->row, (ULONG)Mode->col)); } #endif TEST_HVIO_NON_AVIO() RtlZeroMemory(&LocalMode, sizeof(VIOMODEINFO)); try { Length = Mode->cb; if (Length < 2 ) { RetCode = ERROR_VIO_INVALID_LENGTH; } else { if (Length > sizeof(VIOMODEINFO)) { Length = sizeof(VIOMODEINFO); } else if ((Length > 4) && (Length < 12) && (Length & 1)) { Length &= 0xFFFE; } else if ((Length > 14) && (Length < 34) && (Length & 3)) { Length &= 0xFFFC; } RtlMoveMemory(&LocalMode, Mode, Length); LocalMode.cb = Length; } } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode) { return(RetCode); } if (LocalMode.fbType > 1) { return (ERROR_VIO_MODE); } if (RetCode = Od2VioCheckPopupAndPause( FALSE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioSetMode( (PVOID)&LocalMode ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioDeRegister() { #if DBG PSZ FuncName; FuncName = "VioDeRegister"; #endif CHECK_POPUP_EXIST() UNSUPPORTED_API() } APIRET VioRegister(IN PSZ pszModuleName, IN PSZ pszEntryName, IN ULONG flFunction1, IN ULONG flFunction2) { #if DBG PSZ FuncName; FuncName = "VioRegister"; #endif UNREFERENCED_PARAMETER(pszModuleName); UNREFERENCED_PARAMETER(pszEntryName); UNREFERENCED_PARAMETER(flFunction1); UNREFERENCED_PARAMETER(flFunction2); CHECK_POPUP_EXIST() UNSUPPORTED_API() } APIRET VioPopUp(IN PUSHORT pWait, IN ULONG hVio) { APIRET RetCode; LARGE_INTEGER TimeOut; #if DBG PSZ FuncName; FuncName = "VioPopUp"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Wait %s-%u\n", FuncName, hVio, (*pWait & VP_WAIT) ? "Yes" : "No", (ULONG)*pWait)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForRead(pWait, sizeof(USHORT), 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } /* * catch PopUp semaphore */ TimeOut.LowPart = 0L; TimeOut.HighPart = 0L; RetCode = Od2WaitForSingleObject(PopUpSemaphore, TRUE, (*pWait & VP_WAIT) ? NULL : &TimeOut); if ( RetCode ) { #if DBG IF_OD2_DEBUG( VIO ) KdPrint(("%s: can't get PopUp semaphore\n", FuncName )); #endif return( ERROR_VIO_EXISTING_POPUP ); } SesGrp->PopUpProcess = (HANDLE)(Od2Process->Pib.ProcessId); RetCode = Ow2VioPopUp( (ULONG)*pWait, &Od2Process->ApplName[0] ); if ( RetCode ) { NtReleaseSemaphore( PopUpSemaphore, 1, NULL); #if DBG IF_OD2_DEBUG( VIO ) KdPrint(("%s: status %lx\n", FuncName, RetCode)); #endif return(RetCode); } SesGrp->PopUpFlag = TRUE; return NO_ERROR; } APIRET VioEndPopUp(IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioEndPopUp"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() if ((!SesGrp->PopUpFlag) || (SesGrp->PopUpProcess != (HANDLE)(Od2Process->Pib.ProcessId))) { #if DBG IF_OD2_DEBUG( VIO ) KdPrint(("%s: PopUp does not exist\n", FuncName )); #endif return( ERROR_VIO_NO_POPUP ); } RetCode = Ow2VioEndPopUp(); CHECK_RETURN_STATUS() NtReleaseSemaphore( PopUpSemaphore, 1, NULL); SesGrp->PopUpFlag = FALSE; return( NO_ERROR ); } APIRET VioGetBuf( OUT PULONG pulLVB, OUT PUSHORT pcbLVB, IN ULONG hVio) { APIRET RetCode; ULONG Length = SesGrp->LVBsize; BOOLEAN FirstTime = FALSE; #if DBG PSZ FuncName; FuncName = "VioGetBuf"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForWrite(pulLVB, sizeof(ULONG), 1); Od2ProbeForWrite(pcbLVB, sizeof(USHORT), 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (VioBuff == NULL) { if (OpenLVBsection()) { #if DBG KdPrint(("%s: unable to OpenLvbSection\n", FuncName)); #endif return(ERROR_VIO_RETURN); } FirstTime = TRUE; } if (RetCode = Od2VioCheckPopupAndPause( FALSE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } if (FirstTime) { RetCode = Ow2VioGetLVBBuf( &Length ); CHECK_RETURN_STATUS() } *pcbLVB = (USHORT)Length; *pulLVB = (ULONG) (FLATTOFARPTR((ULONG)VioBuff)); #if DBG IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, buff %p, address 0x%lx, length %u\n", FuncName, hVio, VioBuff, *pulLVB, (ULONG)*pcbLVB)); } #endif return NO_ERROR; } APIRET VioShowBuf( IN ULONG offLVB, IN ULONG cbOutput, IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioShowBuf"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, buff %p, offset 0x%lx, length 0x%lx\n", FuncName, hVio, VioBuff, offLVB, cbOutput)); } #endif TEST_HVIO_NON_AVIO() if (RetCode = Od2VioCheckPopupAndPause( FALSE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } if (offLVB >= SesGrp->LVBsize) { offLVB = SesGrp->LVBsize - 1; } RetCode = Ow2VioShowLVBBuf( cbOutput, offLVB ); CHECK_RETURN_STATUS() return NO_ERROR; } APIRET VioGetFont( IN OUT PVIOFONTINFO Font, IN ULONG hVio) { #if DBG PSZ FuncName; FuncName = "VioGetFont"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() try { if (Font->cb != sizeof(VIOFONTINFO)) { return(ERROR_VIO_INVALID_LENGTH); } Od2ProbeForWrite(Font, sizeof(VIOFONTINFO), 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } UNSUPPORTED_API() } APIRET VioSetFont( IN PVIOFONTINFO Font, IN ULONG hVio) { #if DBG PSZ FuncName; FuncName = "VioSetFont"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() try { if (Font->cb != sizeof(VIOFONTINFO)) { return(ERROR_VIO_INVALID_LENGTH); } } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } UNSUPPORTED_API() } APIRET VioGetState( IN OUT PVOID State, IN ULONG hVio) { #if DBG PSZ FuncName; FuncName = "VioGetState"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() UNREFERENCED_PARAMETER(State); UNSUPPORTED_API() } APIRET VioSetState( IN PVOID State, IN ULONG hVio) { #if DBG PSZ FuncName; FuncName = "VioSetState"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() UNREFERENCED_PARAMETER(State); UNSUPPORTED_API() } APIRET VioGetPhysBuf( PVOID pviopb, ULONG Resr) { #if DBG PSZ FuncName; FuncName = "VioGetPhysBuf"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: called\n", FuncName)); } #endif UNREFERENCED_PARAMETER(pviopb); UNREFERENCED_PARAMETER(Resr); CHECK_POPUP_EXIST() // UNSUPPORTED_API() #if DBG KdPrint(("%s called but isn't supported\n", FuncName)); #endif return (ERROR_VIO_IN_BG); } APIRET VioModeUndo(IN ULONG fRelinqush, IN ULONG fTerminate, IN ULONG hVio) { #if DBG PSZ FuncName; FuncName = "VioModeUndo"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() UNREFERENCED_PARAMETER(fRelinqush); UNREFERENCED_PARAMETER(fTerminate); CHECK_POPUP_EXIST() UNSUPPORTED_API() } APIRET VioModeWait(IN ULONG fEvent, OUT PUSHORT pfNotify, IN ULONG hVio) { #if DBG PSZ FuncName; FuncName = "VioModeWait"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() UNREFERENCED_PARAMETER(fEvent); UNREFERENCED_PARAMETER(pfNotify); CHECK_POPUP_EXIST() DosSleep( (ULONG)SEM_INDEFINITE_WAIT ); UNSUPPORTED_API() } APIRET VioSavRedrawUndo(IN ULONG fRelinqush, IN ULONG fTerminate, IN ULONG hVio) { #if DBG PSZ FuncName; FuncName = "VioSavRedrawUndo"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() UNREFERENCED_PARAMETER(fRelinqush); UNREFERENCED_PARAMETER(fTerminate); CHECK_POPUP_EXIST() UNSUPPORTED_API() } APIRET VioSavRedrawWait( IN ULONG fEvent, OUT PUSHORT pfNotify, IN ULONG Resr) { #if DBG PSZ FuncName; FuncName = "VioSavRedrawWait"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: called\n", FuncName)); } #endif UNREFERENCED_PARAMETER(fEvent); UNREFERENCED_PARAMETER(pfNotify); UNREFERENCED_PARAMETER(Resr); CHECK_POPUP_EXIST() DosSleep( (ULONG)SEM_INDEFINITE_WAIT ); UNSUPPORTED_API() } APIRET VioScrLock(IN ULONG fWait, OUT PBYTE pfNotLocked, IN ULONG hVio) { LARGE_INTEGER TimeOut; APIRET RetCode; BOOLEAN Wait; #if DBG PSZ FuncName; FuncName = "VioScrLock"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Wait %s-%lu\n", FuncName, hVio, ( fWait == LOCKIO_WAIT ) ? "Yes" : "No", fWait)); } #endif TEST_HVIO_NON_AVIO() try { *pfNotLocked = LOCK_FAIL; } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (( fWait != LOCKIO_WAIT ) && ( fWait != LOCKIO_NOWAIT )) { return (ERROR_VIO_WAIT_FLAG); } Wait = (fWait == LOCKIO_WAIT) ? TRUE : FALSE; if (RetCode = Od2VioCheckPopupAndPause( FALSE, Wait #if DBG ,FuncName #endif )) { return(RetCode); } /* * catch ScreenLock semaphore */ TimeOut.LowPart = 0L; TimeOut.HighPart = 0L; RetCode = Od2WaitForSingleObject(ScreenLockSemaphore, TRUE, (fWait & LOCKIO_WAIT) ? NULL : &TimeOut); if ( RetCode ) { return( ERROR_VIO_LOCK ); } SesGrp->LockProcess = (HANDLE)(Od2Process->Pib.ProcessId); *pfNotLocked = LOCK_SUCCESS; return (NO_ERROR); } APIRET VioScrUnLock(IN ULONG hVio) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioScrUnLock"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio )); } #endif TEST_HVIO_NON_AVIO() if (RetCode = Od2VioCheckPopupAndPause( FALSE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } if ( SesGrp->LockProcess != (HANDLE)(Od2Process->Pib.ProcessId) ) { return( ERROR_VIO_UNLOCK ); } NtReleaseSemaphore( ScreenLockSemaphore, 1, NULL); SesGrp->LockProcess = (HANDLE) NULL; return (NO_ERROR); } APIRET VioPrtSc(IN ULONG hVio) { #if DBG PSZ FuncName; FuncName = "VioPrtSc"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() return (ERROR_VIO_SMG_ONLY); } APIRET VioPrtScToggle(IN ULONG hVio) { #if DBG PSZ FuncName; FuncName = "VioPrtScToggle"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx\n", FuncName, hVio)); } #endif TEST_HVIO_NON_AVIO() return (ERROR_VIO_SMG_ONLY); } APIRET VioWrite(IN PFILE_HANDLE hFileRecord, IN PCH Buffer, IN ULONG Length, OUT PULONG BytesWritten, IN VIOREQUESTNUMBER RequestType) { APIRET RetCode; #if DBG PSZ FuncName; FuncName = "VioWrite"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: entering with %lx, Len %lu, 0x%x...\n", FuncName, hFileRecord, Length, (ULONG)*Buffer)); } #endif //Request.d.Vio.hVio = hFileRecord->NtHandle; if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioWriteTTYStr( Buffer, Length, (ULONG)RequestType ); CHECK_RETURN_STATUS() *BytesWritten = Length; return NO_ERROR; } #ifdef DBCS // MSKK Jun.23.1992 KazuM // MSKK Jan.13.1993 V-AkihiS // MSKK Apr.20.1993 V-AkihiS APIRET VioCheckCharType(OUT PUSHORT pchType, IN ULONG usRow, IN ULONG usColumn, IN ULONG hVio) { APIRET RetCode; DWORD chType; #if DBG PSZ FuncName; FuncName = "VioCheckCharType"; IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Row %lu, Col %lu\n", FuncName, hVio, usRow, usColumn)); } #endif TEST_HVIO_NON_AVIO() try { Od2ProbeForWrite(pchType, sizeof(USHORT), 1); } except( EXCEPTION_EXECUTE_HANDLER ) { EXCEPTION_IN_VIO() } if (RetCode = Od2VioCheckPopupAndPause( TRUE, TRUE #if DBG ,FuncName #endif )) { return(RetCode); } RetCode = Ow2VioCheckCharType( (PVOID)&chType, usRow, usColumn ); CHECK_RETURN_STATUS() #if DBG IF_OD2_DEBUG(VIO) { KdPrint(("%s: hVio %lx, Char %u\n", FuncName, hVio, *pchType)); } #endif *pchType = (USHORT)chType; return NO_ERROR; } #endif APIRET Od2VioCheckPopupAndPause( IN BOOLEAN AllowedInPopup, IN BOOLEAN Wait #if DBG ,IN PSZ FuncName #endif ) { APIRET RetCode; LARGE_INTEGER TimeOut, *pTimeOut = NULL; #if DBG IF_OD2_DEBUG( VIO ) { KdPrint(("Od2VioCheckPopupAndPause (PID-TID %d:%d): Popup %s and Wait %s for %s\n", (USHORT)(Od2Process->Pib.ProcessId), (USHORT)(Od2CurrentThreadId()), (AllowedInPopup) ? "ALLOWED" : "NOT PERMITTED", (Wait) ? "ON" : "OFF", FuncName )); } #endif if (!Wait) { TimeOut.LowPart = 0L; TimeOut.HighPart = 0L; pTimeOut = &TimeOut; } if ( SesGrp->PopUpFlag ) { if (AllowedInPopup) { if ( SesGrp->PopUpProcess != (HANDLE)(Od2Process->Pib.ProcessId) ) { if ( RetCode = Od2WaitForSingleObject(PopUpSemaphore, TRUE, pTimeOut) ) { #if DBG IF_OD2_DEBUG( VIO ) { KdPrint(("%s: failed to wait (%lu) for PopUp to terminate\n", FuncName, RetCode )); } #endif return(ERROR_VIO_EXISTING_POPUP); } else { // Don't catch the semaphore. Just make sure it's free // (the popup had ended), and release it. NtReleaseSemaphore( PopUpSemaphore, 1, NULL); } } } else { if (SesGrp->PopUpProcess == (HANDLE)(Od2Process->Pib.ProcessId)) { #if DBG IF_OD2_DEBUG( VIO ) { KdPrint(("%s: illegal call when PopUp exist\n", FuncName )); } #endif return( ERROR_VIO_ILLEGAL_DURING_POPUP ); } } } if ( SesGrp->PauseScreenUpdate ) { RetCode = Od2WaitForSingleObject(PauseEvent, TRUE, pTimeOut); if ( RetCode ) { #if DBG IF_OD2_DEBUG( VIO ) { KdPrint(("%s: wait for PauseEvent failed %lu\n", FuncName, RetCode )); } #endif return(ERROR_VIO_INVALID_HANDLE); /* =>BUGBUG fix the error code */ } else { NtSetEvent(PauseEvent, NULL); } } return(NO_ERROR); }