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 
00023 
#if defined(FE_SB)
00024 
ULONG
00025 SrvGetConsoleCharType(
00026     IN OUT PCSR_API_MSG m,
00027     IN OUT PCSR_REPLY_STATUS ReplyStatus
00028     )
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 {
00047     
NTSTATUS Status;
00048     PCONSOLE_CHAR_TYPE_MSG a = (PCONSOLE_CHAR_TYPE_MSG)&m->u.ApiMessageData;
00049     
PCONSOLE_INFORMATION Console;
00050     
PSCREEN_INFORMATION ScreenInfo;
00051     
PHANDLE_DATA HandleData;
00052     
SHORT RowIndex;
00053     
PROW Row;
00054     PWCHAR Char;
00055 
00056     
Status = 
ApiPreamble(a->ConsoleHandle,
00057                          &Console
00058                         );
00059     
if (!
NT_SUCCESS(Status)) {
00060         
return Status;
00061     }
00062 
00063     
Status = 
DereferenceIoHandle(
CONSOLE_PERPROCESSDATA(),
00064                                  a->Handle,
00065                                  CONSOLE_OUTPUT_HANDLE,
00066                                  GENERIC_READ,
00067                                  &HandleData
00068                                 );
00069     
if (
NT_SUCCESS(Status)) {
00070 
00071         ScreenInfo = HandleData->
Buffer.ScreenBuffer;
00072 
00073 
#if defined(DBG) && defined(DBG_KATTR)
00074 
        BeginKAttrCheck(ScreenInfo);
00075 
#endif
00076 
00077         
if (a->coordCheck.X >= ScreenInfo->
ScreenBufferSize.X ||
00078             a->coordCheck.Y >= ScreenInfo->
ScreenBufferSize.Y) {
00079             
Status = STATUS_INVALID_PARAMETER;
00080         }
00081         
else {
00082             RowIndex = (ScreenInfo->
BufferInfo.TextInfo.FirstRow+a->coordCheck.Y) % ScreenInfo->
ScreenBufferSize.Y;
00083             Row = &ScreenInfo->
BufferInfo.TextInfo.Rows[RowIndex];
00084             Char = &Row->
CharRow.
Chars[a->coordCheck.X];
00085             
if (!CONSOLE_IS_DBCS_OUTPUTCP(ScreenInfo->
Console))
00086                 a->dwType = CHAR_TYPE_SBCS;
00087             
else if (Row->
CharRow.KAttrs[a->coordCheck.X] & ATTR_TRAILING_BYTE)
00088                 a->dwType = CHAR_TYPE_TRAILING;
00089             
else if (Row->
CharRow.KAttrs[a->coordCheck.X] & ATTR_LEADING_BYTE)
00090                 a->dwType = CHAR_TYPE_LEADING;
00091             
else
00092                 a->dwType = CHAR_TYPE_SBCS;
00093         }
00094     }
00095 
00096     
UnlockConsole(Console);
00097     
return((ULONG) 
Status);
00098     UNREFERENCED_PARAMETER(ReplyStatus);    
00099 }
00100 
00101 ULONG
00102 SrvSetConsoleLocalEUDC(
00103     IN OUT PCSR_API_MSG m,
00104     IN OUT PCSR_REPLY_STATUS ReplyStatus
00105     )
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 
00122 
00123 {
00124     PCONSOLE_LOCAL_EUDC_MSG a = (PCONSOLE_LOCAL_EUDC_MSG)&m->u.ApiMessageData;
00125     
NTSTATUS Status;
00126     
PCONSOLE_INFORMATION Console;
00127     
PHANDLE_DATA HandleData;
00128     
CHAR Source[4];
00129     WCHAR Target[2];
00130 
00131     
Status = 
ApiPreamble(a->ConsoleHandle,
00132                          &Console
00133                         );
00134     
if (!
NT_SUCCESS(Status)) {
00135         
return Status;
00136     }
00137 
00138     
Status = 
DereferenceIoHandle(
CONSOLE_PERPROCESSDATA(),
00139                                  a->Handle,
00140                                  CONSOLE_OUTPUT_HANDLE,
00141                                  GENERIC_WRITE,
00142                                  &HandleData
00143                                 );
00144     
if (!
NT_SUCCESS(Status)) {
00145         
UnlockConsole(Console);
00146         
return((ULONG) 
Status);
00147     }
00148 
00149     
if (!CsrValidateMessageBuffer(m, &a->FontFace, ((a->FontSize.X + 7) / 8), a->FontSize.Y)) {
00150         
UnlockConsole(Console);
00151         
return STATUS_INVALID_PARAMETER;
00152     }
00153 
00154     Source[0] = (
char)(a->CodePoint >> 8) ;
00155     Source[1] = (
char)(a->CodePoint & 0x00ff) ;
00156     Source[2] = 0 ;
00157     
ConvertOutputToUnicode(Console->
OutputCP,Source,2,Target,1);
00158 
00159     
if (
IsEudcRange(Console,Target[0]))
00160     {
00161         
Status = 
RegisterLocalEUDC(Console,Target[0],a->FontSize,a->FontFace);
00162         
if (
NT_SUCCESS(Status)) {
00163             ((
PEUDC_INFORMATION)(Console->EudcInformation))->LocalVDMEudcMode = 
TRUE;
00164         }
00165     }
00166     
else {
00167         
UnlockConsole(Console);
00168         
return (ULONG)STATUS_INVALID_PARAMETER;
00169     }
00170 
00171     
UnlockConsole(Console);
00172     
return STATUS_SUCCESS;
00173     UNREFERENCED_PARAMETER(ReplyStatus);    
00174 }
00175 
00176 ULONG
00177 SrvSetConsoleCursorMode(
00178     IN OUT PCSR_API_MSG m,
00179     IN OUT PCSR_REPLY_STATUS ReplyStatus
00180     )
00181 
00182 
00183 
00184 
00185 
00186 
00187 
00188 
00189 
00190 
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 {
00199     PCONSOLE_CURSOR_MODE_MSG a = (PCONSOLE_CURSOR_MODE_MSG)&m->u.ApiMessageData;
00200     
NTSTATUS Status;
00201     
PCONSOLE_INFORMATION Console;
00202     
PHANDLE_DATA HandleData;
00203 
00204     
Status = 
ApiPreamble(a->ConsoleHandle,
00205                          &Console
00206                         );
00207     
if (!
NT_SUCCESS(Status)) {
00208         
return Status;
00209     }
00210 
00211     
Status = 
DereferenceIoHandle(
CONSOLE_PERPROCESSDATA(),
00212                                  a->Handle,
00213                                  CONSOLE_OUTPUT_HANDLE,
00214                                  GENERIC_WRITE,
00215                                  &HandleData
00216                                 );
00217     
if (!
NT_SUCCESS(Status)) {
00218         
UnlockConsole(Console);
00219         
return((ULONG) 
Status);
00220     }
00221 
00222     HandleData->
Buffer.ScreenBuffer->BufferInfo.TextInfo.CursorBlink = (BOOLEAN)a->Blink ;
00223     HandleData->
Buffer.ScreenBuffer->BufferInfo.TextInfo.CursorDBEnable = (BOOLEAN)a->DBEnable ;
00224 
00225     
UnlockConsole(Console);
00226     
return Status;
00227     UNREFERENCED_PARAMETER(ReplyStatus);    
00228 }
00229 
00230 
00231 ULONG
00232 SrvGetConsoleCursorMode(
00233     IN OUT PCSR_API_MSG m,
00234     IN OUT PCSR_REPLY_STATUS ReplyStatus
00235     )
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245 
00246 
00247 
00248 
00249 
00250 
00251 
00252 
00253 {
00254     PCONSOLE_CURSOR_MODE_MSG a = (PCONSOLE_CURSOR_MODE_MSG)&m->u.ApiMessageData;
00255     
NTSTATUS Status;
00256     
PCONSOLE_INFORMATION Console;
00257     
PHANDLE_DATA HandleData;
00258 
00259     
Status = 
ApiPreamble(a->ConsoleHandle,
00260                          &Console
00261                         );
00262     
if (!
NT_SUCCESS(Status)) {
00263         
return Status;
00264     }
00265 
00266     
Status = 
DereferenceIoHandle(
CONSOLE_PERPROCESSDATA(),
00267                                  a->Handle,
00268                                  CONSOLE_OUTPUT_HANDLE,
00269                                  GENERIC_READ,
00270                                  &HandleData
00271                                 );
00272     
if (!
NT_SUCCESS(Status)) {
00273         
UnlockConsole(Console);
00274         
return((ULONG) 
Status);
00275     }
00276 
00277     a->Blink = HandleData->
Buffer.ScreenBuffer->BufferInfo.TextInfo.CursorBlink ;
00278     a->DBEnable = HandleData->
Buffer.ScreenBuffer->BufferInfo.TextInfo.CursorDBEnable ;
00279 
00280     
UnlockConsole(Console);
00281     
return Status;
00282     UNREFERENCED_PARAMETER(ReplyStatus);    
00283 }
00284 
00285 ULONG
00286 SrvRegisterConsoleOS2(
00287     IN OUT PCSR_API_MSG m,
00288     IN OUT PCSR_REPLY_STATUS ReplyStatus
00289     )
00290 
00291 
00292 
00293 
00294 
00295 
00296 
00297 {
00298     PCONSOLE_REGISTEROS2_MSG a = (PCONSOLE_REGISTEROS2_MSG)&m->u.ApiMessageData;
00299     
NTSTATUS Status;
00300     
PCONSOLE_INFORMATION Console;
00301     HANDLE hEvent = 
NULL;
00302 
00303     
Status = 
ApiPreamble(a->ConsoleHandle,
00304                          &Console
00305                         );
00306     
if (!
NT_SUCCESS(Status)) {
00307         
return Status;
00308     }
00309 
#if defined(i386)
00310 
    {
00311         
if (!a->fOs2Register) {
00312             Console->
Flags &= ~ CONSOLE_OS2_REGISTERED;
00313             
ResizeWindow(Console->
CurrentScreenBuffer, &Console->Os2SavedWindowRect, FALSE);
00314         }
00315         
else {
00316             Console->
Flags |= CONSOLE_OS2_REGISTERED;
00317             Console->Os2SavedWindowRect = Console->
CurrentScreenBuffer->
Window;
00318         }
00319     }
00320 
#endif // i386
00321 
00322     
UnlockConsole(Console);
00323     
return Status;
00324     UNREFERENCED_PARAMETER(ReplyStatus);    
00325 }
00326 
00327 ULONG
00328 SrvSetConsoleOS2OemFormat(
00329     IN OUT PCSR_API_MSG m,
00330     IN OUT PCSR_REPLY_STATUS ReplyStatus
00331     )
00332 
00333 
00334 
00335 
00336 
00337 
00338 
00339 {
00340     PCONSOLE_SETOS2OEMFORMAT_MSG a = (PCONSOLE_SETOS2OEMFORMAT_MSG)&m->u.ApiMessageData;
00341     
NTSTATUS Status;
00342     
PCONSOLE_INFORMATION Console;
00343 
00344     
Status = 
ApiPreamble(a->ConsoleHandle,
00345                          &Console
00346                         );
00347     
if (!
NT_SUCCESS(Status)) {
00348         
return Status;
00349     }
00350 
#if defined(i386)
00351 
    {
00352         
if (!a->fOs2OemFormat) {
00353             Console->
Flags &= ~CONSOLE_OS2_OEM_FORMAT;
00354         }
00355         
else {
00356             Console->
Flags |= CONSOLE_OS2_OEM_FORMAT;
00357         }
00358     }
00359 
#endif // i386
00360 
00361     
UnlockConsole(Console);
00362     
return Status;
00363     UNREFERENCED_PARAMETER(ReplyStatus);    
00364 }
00365 
00366 
#if defined(FE_IME)
00367 
ULONG
00368 SrvGetConsoleNlsMode(
00369     IN OUT PCSR_API_MSG m,
00370     IN OUT PCSR_REPLY_STATUS ReplyStatus
00371     )
00372 
00373 
00374 
00375 
00376 
00377 
00378 
00379 
00380 
00381 
00382 
00383 
00384 
00385 
00386 
00387 
00388 
00389 {
00390     
NTSTATUS Status;
00391     PCONSOLE_NLS_MODE_MSG a = (PCONSOLE_NLS_MODE_MSG)&m->u.ApiMessageData;
00392     
PCONSOLE_INFORMATION Console;
00393     
PHANDLE_DATA HandleData;
00394     HANDLE hEvent = 
NULL;
00395 
00396     
Status = 
ApiPreamble(a->ConsoleHandle,
00397                          &Console
00398                         );
00399     
if (!
NT_SUCCESS(Status)) {
00400         
return Status;
00401     }
00402 
00403     
Status = 
DereferenceIoHandle(
CONSOLE_PERPROCESSDATA(),
00404                                  a->Handle,
00405                                  CONSOLE_INPUT_HANDLE,
00406                                  GENERIC_READ,
00407                                  &HandleData
00408                                 );
00409     
if (!
NT_SUCCESS(Status)) {
00410         
goto SrvGetConsoleNlsModeFailure;
00411     }
00412 
00413     
Status = 
NtDuplicateObject(
CONSOLE_CLIENTPROCESSHANDLE(),
00414                        a->hEvent,
00415                        NtCurrentProcess(),
00416                        &hEvent,
00417                        0,
00418                        FALSE,
00419                        DUPLICATE_SAME_ACCESS
00420                        );
00421     
if (!
NT_SUCCESS(Status)) {
00422         
goto SrvGetConsoleNlsModeFailure;
00423     }
00424 
00425     
00426 
00427 
00428     
if (a->Ready == 
FALSE)
00429     {
00430         a->Ready = HandleData->
Buffer.InputBuffer->ImeMode.ReadyConversion;
00431 
00432         
if (a->Ready == 
FALSE)
00433         {
00434             
00435 
00436 
00437 
00438             
Status = 
QueueConsoleMessage(Console,
00439                         CM_GET_NLSMODE,
00440                         (WPARAM)hEvent,
00441                         0L
00442                        );
00443             
if (!
NT_SUCCESS(Status)) {
00444                 
goto SrvGetConsoleNlsModeFailure;
00445             }
00446         }
00447         
else
00448         {
00449             
if (! HandleData->
Buffer.InputBuffer->ImeMode.Disable) {
00450                 a->NlsMode = 
ImmConversionToConsole(
00451                                  HandleData->
Buffer.InputBuffer->ImeMode.Conversion );
00452             }
00453             
else {
00454                 a->NlsMode = 0;
00455             }
00456             
NtSetEvent(hEvent, NULL);
00457             
NtClose(hEvent);
00458         }
00459     }
00460     
else
00461     {
00462         
if (! HandleData->
Buffer.InputBuffer->ImeMode.Disable) {
00463             a->NlsMode = 
ImmConversionToConsole(
00464                              HandleData->
Buffer.InputBuffer->ImeMode.Conversion );
00465         }
00466         
else {
00467             a->NlsMode = 0;
00468         }
00469         
NtSetEvent(hEvent, NULL);
00470         
NtClose(hEvent);
00471     }
00472 
00473     
UnlockConsole(Console);
00474     
return((ULONG) 
Status);
00475 
00476 SrvGetConsoleNlsModeFailure:
00477     
if (hEvent) {
00478         
NtSetEvent(hEvent, NULL);
00479         
NtClose(hEvent);
00480     }
00481     
UnlockConsole(Console);
00482     
return((ULONG) 
Status);
00483 
00484     UNREFERENCED_PARAMETER(ReplyStatus);    
00485 }
00486 
00487 ULONG
00488 SrvSetConsoleNlsMode(
00489     IN OUT PCSR_API_MSG m,
00490     IN OUT PCSR_REPLY_STATUS ReplyStatus
00491     )
00492 
00493 
00494 
00495 
00496 
00497 
00498 
00499 
00500 
00501 
00502 
00503 
00504 
00505 
00506 
00507 
00508 
00509 {
00510     PCONSOLE_NLS_MODE_MSG a = (PCONSOLE_NLS_MODE_MSG)&m->u.ApiMessageData;
00511     
NTSTATUS Status;
00512     
PCONSOLE_INFORMATION Console;
00513     
PHANDLE_DATA HandleData;
00514     HANDLE hEvent = 
NULL;
00515 
00516     
Status = 
ApiPreamble(a->ConsoleHandle,
00517                          &Console
00518                         );
00519     
if (!
NT_SUCCESS(Status)) {
00520         
return Status;
00521     }
00522 
00523     
Status = 
DereferenceIoHandle(
CONSOLE_PERPROCESSDATA(),
00524                                  a->Handle,
00525                                  CONSOLE_INPUT_HANDLE,
00526                                  GENERIC_WRITE,
00527                                  &HandleData
00528                                 );
00529     
if (!
NT_SUCCESS(Status)) {
00530         
goto SrvSetConsoleNlsModeFailure;
00531     }
00532 
00533     
Status = 
NtDuplicateObject(
CONSOLE_CLIENTPROCESSHANDLE(),
00534                        a->hEvent,
00535                        NtCurrentProcess(),
00536                        &hEvent,
00537                        0,
00538                        FALSE,
00539                        DUPLICATE_SAME_ACCESS
00540                        );
00541     
if (!
NT_SUCCESS(Status)) {
00542         
goto SrvSetConsoleNlsModeFailure;
00543     }
00544 
00545     
Status = 
QueueConsoleMessage(Console,
00546                 CM_SET_NLSMODE,
00547                 (WPARAM)hEvent,
00548                 a->NlsMode
00549                );
00550     
if (!
NT_SUCCESS(Status)) {
00551         
goto SrvSetConsoleNlsModeFailure;
00552     }
00553 
00554     
UnlockConsole(Console);
00555     
return Status;
00556 
00557 SrvSetConsoleNlsModeFailure:
00558     
if (hEvent) {
00559         
NtSetEvent(hEvent, NULL);
00560         
NtClose(hEvent);
00561     }
00562     
UnlockConsole(Console);
00563     
return Status;
00564 
00565     UNREFERENCED_PARAMETER(ReplyStatus);    
00566 }
00567 
00568 ULONG
00569 SrvRegisterConsoleIME(
00570     IN OUT PCSR_API_MSG m,
00571     IN OUT PCSR_REPLY_STATUS ReplyStatus
00572     )
00573 
00574 
00575 
00576 
00577 
00578 
00579 
00580 
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 
00589 
00590 {
00591     PCONSOLE_REGISTER_CONSOLEIME_MSG a = (PCONSOLE_REGISTER_CONSOLEIME_MSG)&m->u.ApiMessageData;
00592     
NTSTATUS Status;
00593     PCSR_PROCESS Process;
00594     HDESK hdesk;
00595     HWINSTA hwinsta;
00596     UNICODE_STRING strDesktopName;
00597 
00598     a->dwConsoleThreadId = 0;
00599 
00600     
if (!CsrValidateMessageBuffer(m, &a->Desktop, a->DesktopLength, 
sizeof(BYTE))) {
00601         
return STATUS_INVALID_PARAMETER;
00602     }
00603 
00604     
00605     
00606     
00607 
00608     
if (!CsrImpersonateClient(NULL)) {
00609         
return (ULONG)STATUS_BAD_IMPERSONATION_LEVEL;
00610     }
00611 
00612     Process = (PCSR_PROCESS)(CSR_SERVER_QUERYCLIENTTHREAD()->Process);
00613     
if (a->DesktopLength)
00614         
RtlInitUnicodeString(&strDesktopName, a->Desktop);
00615     
else
00616         
RtlInitUnicodeString(&strDesktopName, L
"Default");
00617     hdesk = 
NtUserResolveDesktop(
00618             Process->ProcessHandle,
00619             &strDesktopName, FALSE, &hwinsta);
00620 
00621     CsrRevertToSelf();
00622 
00623     
if (hdesk == 
NULL) {
00624         
return (ULONG)STATUS_UNSUCCESSFUL;
00625     }
00626 
00627     
Status = ConSrvRegisterConsoleIME(Process,
00628                                       hdesk,
00629                                       hwinsta,
00630                                       a->hWndConsoleIME,
00631                                       a->dwConsoleIMEThreadId,
00632                                       REGCONIME_REGISTER,
00633                                       &a->dwConsoleThreadId
00634                                      );
00635 
00636 
00637     
return ((ULONG)
Status);
00638     UNREFERENCED_PARAMETER(ReplyStatus);    
00639 }
00640 
00641 ULONG
00642 SrvUnregisterConsoleIME(
00643     IN OUT PCSR_API_MSG m,
00644     IN OUT PCSR_REPLY_STATUS ReplyStatus
00645     )
00646 
00647 
00648 
00649 
00650 
00651 
00652 
00653 
00654 
00655 
00656 
00657 
00658 
00659 
00660 
00661 
00662 
00663 {
00664     PCONSOLE_UNREGISTER_CONSOLEIME_MSG a = (PCONSOLE_UNREGISTER_CONSOLEIME_MSG)&m->u.ApiMessageData;
00665     
NTSTATUS Status;
00666     PCSR_PROCESS Process;
00667     
PCONSOLE_PER_PROCESS_DATA ProcessData;
00668 
00669     Process = (PCSR_PROCESS)(CSR_SERVER_QUERYCLIENTTHREAD()->Process);
00670     ProcessData = 
CONSOLE_FROMPROCESSPERPROCESSDATA(Process);
00671 
00672     
Status = ConSrvRegisterConsoleIME(Process,
00673                                       ProcessData->hDesk,
00674                                       ProcessData->hWinSta,
00675                                       NULL,
00676                                       a->dwConsoleIMEThreadId,
00677                                       REGCONIME_UNREGISTER,
00678                                       NULL
00679                                      );
00680 
00681 
00682     
return ((ULONG)
Status);
00683     UNREFERENCED_PARAMETER(ReplyStatus);    
00684 }
00685 
#endif // FE_IME
00686 
00687 
#endif // FE_SB