00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
#include "precomp.h"
00020 
#pragma hdrstop
00021 
00022 #define WWSB_NOFE
00023 
#include "dispatch.h"
00024 
#undef  WWSB_NOFE
00025 #define WWSB_FE
00026 
#include "dispatch.h"
00027 
#undef  WWSB_FE
00028 
00029 
#if defined(FE_SB)
00030 
00031 
00032 
NTSTATUS
00033 
DoSrvWriteConsole(
00034     IN OUT PCSR_API_MSG m,
00035     IN OUT PCSR_REPLY_STATUS ReplyStatus,
00036     IN 
PCONSOLE_INFORMATION Console,
00037     IN 
PHANDLE_DATA HandleData
00038     )
00039 {
00040     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00041         
return FE_DoSrvWriteConsole(m,ReplyStatus,Console,HandleData);
00042     
else
00043         
return SB_DoSrvWriteConsole(m,ReplyStatus,Console,HandleData);
00044 }
00045 
00046 
NTSTATUS
00047 
WriteOutputString(
00048     IN 
PSCREEN_INFORMATION ScreenInfo,
00049     IN PVOID Buffer,
00050     IN COORD WriteCoord,
00051     IN ULONG StringType,
00052     IN OUT PULONG NumRecords, 
00053     OUT PULONG NumColumns OPTIONAL
00054     )
00055 {
00056     
PCONSOLE_INFORMATION Console = ScreenInfo->Console;
00057 
00058     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00059         
return FE_WriteOutputString(ScreenInfo, Buffer, WriteCoord, StringType, NumRecords, NumColumns);
00060     
else
00061         
return SB_WriteOutputString(ScreenInfo, Buffer, WriteCoord, StringType, NumRecords, NumColumns);
00062 }
00063 
00064 
00065 
VOID
00066 
WriteRectToScreenBuffer(
00067     PBYTE Source,
00068     COORD SourceSize,
00069     PSMALL_RECT SourceRect,
00070     
PSCREEN_INFORMATION ScreenInfo,
00071     COORD TargetPoint,
00072     IN UINT Codepage
00073     )
00074 {
00075     
PCONSOLE_INFORMATION Console = ScreenInfo->
Console;
00076 
00077     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00078         FE_WriteRectToScreenBuffer(Source,SourceSize,SourceRect,ScreenInfo,TargetPoint,Codepage);
00079     
else
00080         SB_WriteRectToScreenBuffer(Source,SourceSize,SourceRect,ScreenInfo,TargetPoint,Codepage);
00081 }
00082 
00083 
VOID
00084 
WriteToScreen(
00085     IN 
PSCREEN_INFORMATION ScreenInfo,
00086     PSMALL_RECT Region    
00087     )
00088 {
00089     
PCONSOLE_INFORMATION Console = ScreenInfo->Console;
00090 
00091     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00092         FE_WriteToScreen(ScreenInfo, Region);
00093     
else
00094         SB_WriteToScreen(ScreenInfo, Region);
00095 }
00096 
00097 
VOID
00098 
WriteRegionToScreen(
00099     IN 
PSCREEN_INFORMATION ScreenInfo,
00100     IN PSMALL_RECT Region
00101     )
00102 {
00103     
PCONSOLE_INFORMATION Console = ScreenInfo->Console;
00104 
00105     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00106         FE_WriteRegionToScreen(ScreenInfo, Region);
00107     
else
00108         SB_WriteRegionToScreen(ScreenInfo, Region);
00109 }
00110 
00111 
NTSTATUS
00112 
FillOutput(
00113     IN 
PSCREEN_INFORMATION ScreenInfo,
00114     IN WORD Element,
00115     IN COORD WriteCoord,
00116     IN ULONG ElementType,
00117     IN OUT PULONG Length 
00118     )
00119 {
00120     
PCONSOLE_INFORMATION Console = ScreenInfo->Console;
00121 
00122     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00123         
return FE_FillOutput(ScreenInfo, Element, WriteCoord, ElementType, Length);
00124     
else
00125         
return SB_FillOutput(ScreenInfo, Element, WriteCoord, ElementType, Length);
00126 }
00127 
00128 
VOID
00129 
FillRectangle(
00130     IN CHAR_INFO Fill,
00131     IN OUT 
PSCREEN_INFORMATION ScreenInfo,
00132     IN PSMALL_RECT TargetRect
00133     )
00134 {
00135     
PCONSOLE_INFORMATION Console = ScreenInfo->Console;
00136 
00137     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00138         FE_FillRectangle(Fill, ScreenInfo, TargetRect);
00139     
else
00140         SB_FillRectangle(Fill, ScreenInfo, TargetRect);
00141 }
00142 
00143 
00144 ULONG
00145 
DoWriteConsole(
00146     IN OUT PCSR_API_MSG m,
00147     IN 
PCONSOLE_INFORMATION Console,
00148     IN PCSR_THREAD Thread
00149     )
00150 {
00151     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00152         
return FE_DoWriteConsole(m,Console,Thread);
00153     
else
00154         
return SB_DoWriteConsole(m,Console,Thread);
00155 }
00156 
00157 
00158 
NTSTATUS
00159 
WriteChars(
00160     IN 
PSCREEN_INFORMATION ScreenInfo,
00161     IN PWCHAR lpBufferBackupLimit,
00162     IN PWCHAR lpBuffer,
00163     IN PWCHAR lpRealUnicodeString,
00164     IN OUT PDWORD NumBytes,
00165     OUT PLONG NumSpaces OPTIONAL,
00166     IN SHORT OriginalXPosition,
00167     IN DWORD dwFlags,
00168     OUT PSHORT ScrollY OPTIONAL
00169     )
00170 {
00171     
PCONSOLE_INFORMATION Console = ScreenInfo->Console;
00172 
00173     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00174         
return FE_WriteChars(ScreenInfo,lpBufferBackupLimit,lpBuffer,lpRealUnicodeString,NumBytes,NumSpaces,OriginalXPosition,dwFlags,ScrollY);
00175     
else
00176         
return SB_WriteChars(ScreenInfo,lpBufferBackupLimit,lpBuffer,lpRealUnicodeString,NumBytes,NumSpaces,OriginalXPosition,dwFlags,ScrollY);
00177 }
00178 
00179 
00180 
00181 
NTSTATUS
00182 
AdjustCursorPosition(
00183     IN 
PSCREEN_INFORMATION ScreenInfo,
00184     IN COORD CursorPosition,
00185     IN BOOL KeepCursorVisible,
00186     OUT PSHORT ScrollY OPTIONAL
00187     )
00188 {
00189     
PCONSOLE_INFORMATION Console = ScreenInfo->Console;
00190 
00191     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00192         
return FE_AdjustCursorPosition(ScreenInfo, CursorPosition, KeepCursorVisible, ScrollY);
00193     
else
00194         
return SB_AdjustCursorPosition(ScreenInfo, CursorPosition, KeepCursorVisible, ScrollY);
00195 }
00196 
00197 
NTSTATUS
00198 
TranslateOutputToAnsiUnicode(
00199     IN 
PCONSOLE_INFORMATION Console,
00200     IN OUT PCHAR_INFO OutputBuffer,
00201     IN COORD Size,
00202     IN OUT PCHAR_INFO OutputBufferR
00203     )
00204 {
00205     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00206         
return FE_TranslateOutputToAnsiUnicode(Console,OutputBuffer,Size,OutputBufferR);
00207     
else
00208         
return SB_TranslateOutputToAnsiUnicode(Console,OutputBuffer,Size);
00209 }
00210 
00211 
NTSTATUS
00212 
TranslateOutputToUnicode(
00213     IN 
PCONSOLE_INFORMATION Console,
00214     IN OUT PCHAR_INFO OutputBuffer,
00215     IN COORD Size)
00216 {
00217     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00218         
return FE_TranslateOutputToUnicode(Console,OutputBuffer,Size);
00219     
else
00220         
return SB_TranslateOutputToUnicode(Console,OutputBuffer,Size);
00221 }
00222 
00223 
NTSTATUS
00224 
TranslateOutputToOemUnicode(
00225     IN 
PCONSOLE_INFORMATION Console,
00226     IN OUT PCHAR_INFO OutputBuffer,
00227     IN COORD Size,
00228     IN BOOL fRemoveDbcsMark
00229     )
00230 {
00231     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00232         
return FE_TranslateOutputToOemUnicode(Console,OutputBuffer,Size,fRemoveDbcsMark);
00233     
else
00234         
return SB_TranslateOutputToOemUnicode(Console,OutputBuffer,Size);
00235 }
00236 
00237 
NTSTATUS
00238 
TranslateOutputToOem(
00239     IN 
PCONSOLE_INFORMATION Console,
00240     IN OUT PCHAR_INFO OutputBuffer,
00241     IN COORD Size
00242     )
00243 {
00244     
if (CONSOLE_IS_DBCS_OUTPUTCP(Console))
00245         
return FE_TranslateOutputToOem(Console,OutputBuffer,Size);
00246     
else
00247         
return SB_TranslateOutputToOem(Console,OutputBuffer,Size);
00248 }
00249 
00250 ULONG
00251 
TranslateInputToUnicode(
00252     IN 
PCONSOLE_INFORMATION Console,
00253     IN OUT PINPUT_RECORD InputRecords,
00254     IN ULONG NumRecords,
00255     IN OUT PINPUT_RECORD DBCSLeadByte
00256     )
00257 {
00258     
if (CONSOLE_IS_DBCS_CP(Console))
00259         
return FE_TranslateInputToUnicode(Console,InputRecords,NumRecords,DBCSLeadByte);
00260     
else
00261         
return SB_TranslateInputToUnicode(Console,InputRecords,NumRecords);
00262 }
00263 
00264 ULONG
00265 
TranslateInputToOem(
00266     IN 
PCONSOLE_INFORMATION Console,
00267     IN OUT PINPUT_RECORD InputRecords,
00268     IN ULONG NumRecords,    
00269     IN ULONG UnicodeLength, 
00270     OUT PINPUT_RECORD DbcsLeadInpRec
00271     )
00272 {
00273     
if (CONSOLE_IS_DBCS_CP(Console))
00274         
return FE_TranslateInputToOem(Console,InputRecords,NumRecords,UnicodeLength,DbcsLeadInpRec);
00275     
else
00276         
return SB_TranslateInputToOem(Console,InputRecords,NumRecords);
00277 }
00278 
00279 WCHAR
00280 
CharToWchar(
00281     IN 
PCONSOLE_INFORMATION Console,
00282     IN UINT Codepage,
00283     IN 
char *Ch
00284     )
00285 {
00286     WCHAR wc;
00287     
if (CONSOLE_IS_DBCS_CP(Console))
00288     {
00289         
if (
IsDBCSLeadByteConsole(*Ch, &Console->OutputCPInfo))
00290         {
00291             
ConvertOutputToUnicode(Console->OutputCP,
00292                                    Ch,
00293                                    2,
00294                                    &wc,
00295                                    1);
00296         }
00297         
else
00298         {
00299             
ConvertOutputToUnicode(Console->OutputCP,
00300                                    Ch,
00301                                    1,
00302                                    &wc,
00303                                    1);
00304         }
00305     }
00306     
else
00307     {
00308         wc = SB_CharToWchar(Codepage, *Ch);
00309     }
00310     
return wc;
00311 }
00312 
00313 
00314 
#ifdef i386
00315 
VOID
00316 WriteRegionToScreenHW(
00317     IN 
PSCREEN_INFORMATION ScreenInfo,
00318     IN PSMALL_RECT Region
00319     )
00320 {
00321     
if (CONSOLE_IS_DBCS_OUTPUTCP(ScreenInfo->Console))
00322         
FE_WriteRegionToScreenHW(ScreenInfo,Region);
00323     
else
00324         SB_WriteRegionToScreenHW(ScreenInfo,Region);
00325 }
00326 
#endif
00327 
00328 
#endif