Move console input/output codepages to server

Kirill K. Smirnov lich at math.spbu.ru
Fri Apr 20 02:28:57 CDT 2007


> "Kirill K. Smirnov" <lich at math.spbu.ru> wrote:
> > @@ -141,12 +138,19 @@ HWND WINAPI GetConsoleWindow(VOID)
> >   */
> >  UINT WINAPI GetConsoleCP(VOID)
> >  {
> > -    if (!console_input_codepage)
> > +    BOOL ret;
> > +    UINT codepage = GetOEMCP(); /* default value */
> > +
> > +    SERVER_START_REQ(get_console_input_info)
> >      {
> > -        console_input_codepage = GetOEMCP();
> > - TRACE("%u\n", console_input_codepage);
> > +        req->handle = 0;
> > +        ret = !wine_server_call_err( req );
> > +        if (ret && reply->codepage)
> > +            codepage = reply->codepage;
>
> Did you test what happens when an app sets console code page to a pseudo
> cp like CP_ACP (0)? Your code will force code page to be always equal to
> what GetOEMCP returns in that case.

IsValidCodePage will fail. App is not allowed to pass CP_ACP, CP_OEMCP and 
other pseudo codepages to these function.

#include <windows.h>

int main(void)
{
    printf("%d\n", IsValidCodePage(CP_ACP));
    printf("%d\n", IsValidCodePage(CP_OEMCP));

    SetConsoleCP(CP_ACP);
    printf("%d\n", GetConsoleCP());
    SetConsoleOutputCP(CP_ACP);
    printf("%d\n", GetConsoleOutputCP());

    SetConsoleCP(CP_OEMCP);
    printf("%d\n", GetConsoleCP());
    SetConsoleOutputCP(CP_OEMCP);
    printf("%d\n", GetConsoleOutputCP());
    return 0;
}

Small test:
This will write under both wine and windows:
0
0
866
866
866
866


If change codepage to cp1251 via chcp, output will be:
0
0
1251
1251
1251
1251


So my code is OK.
--
Kirill



More information about the wine-devel mailing list