GetStdHandle Problem

Ignasi Villagrasa gri at netcom.es
Wed Feb 20 09:54:41 CST 2002


I have inspected wine source code and found the following information:

environ.c implements the function as follows:

HANDLE <http://www.winehq.com/source/memory/ident?i=HANDLE> WINAPI <http://www.winehq.com/source/memory/ident?i=WINAPI> GetStdHandle <http://www.winehq.com/source/memory/ident?i=GetStdHandle>( DWORD <http://www.winehq.com/source/memory/ident?i=DWORD> std_handle )
609 <http://www.winehq.com/source/memory/source/memory/environ.c#L609> {
610 <http://www.winehq.com/source/memory/source/memory/environ.c#L610>     switch(std_handle)
611 <http://www.winehq.com/source/memory/source/memory/environ.c#L611>     {
612 <http://www.winehq.com/source/memory/source/memory/environ.c#L612>         case STD_INPUT_HANDLE <http://www.winehq.com/source/memory/ident?i=STD_INPUT_HANDLE>:  return current_envdb <http://www.winehq.com/source/memory/ident?i=current_envdb>.hStdin;
613 <http://www.winehq.com/source/memory/source/memory/environ.c#L613>         case STD_OUTPUT_HANDLE <http://www.winehq.com/source/memory/ident?i=STD_OUTPUT_HANDLE>: return current_envdb <http://www.winehq.com/source/memory/ident?i=current_envdb>.hStdout;
614 <http://www.winehq.com/source/memory/source/memory/environ.c#L614>         case STD_ERROR_HANDLE <http://www.winehq.com/source/memory/ident?i=STD_ERROR_HANDLE>:  return current_envdb <http://www.winehq.com/source/memory/ident?i=current_envdb>.hStderr;
615 <http://www.winehq.com/source/memory/source/memory/environ.c#L615>     }
616 <http://www.winehq.com/source/memory/source/memory/environ.c#L616>     SetLastError( ERROR_INVALID_PARAMETER <http://www.winehq.com/source/memory/ident?i=ERROR_INVALID_PARAMETER> );
617 <http://www.winehq.com/source/memory/source/memory/environ.c#L617>     return INVALID_HANDLE_VALUE <http://www.winehq.com/source/memory/ident?i=INVALID_HANDLE_VALUE>;
618 <http://www.winehq.com/source/memory/source/memory/environ.c#L618> }
619 <http://www.winehq.com/source/memory/source/memory/environ.c#L619> 


So the function returns current_envdb.hStdin. or current_envdb.hStdout.
Inspecting current_envdb structure also in environ.c:

 
 92 <http://www.winehq.com/source/memory/source/memory/environ.c#L92> ENVDB <http://www.winehq.com/source/memory/ident?i=ENVDB> current_envdb <http://www.winehq.com/source/memory/ident?i=current_envdb> =
 93 <http://www.winehq.com/source/memory/source/memory/environ.c#L93> {
 94 <http://www.winehq.com/source/memory/source/memory/environ.c#L94>     0,                       /* environ */
 95 <http://www.winehq.com/source/memory/source/memory/environ.c#L95>     0,                       /* unknown1 */
 96 <http://www.winehq.com/source/memory/source/memory/environ.c#L96>     0,                       /* cmd_line */
 97 <http://www.winehq.com/source/memory/source/memory/environ.c#L97>     0,                       /* cur_dir */
 98 <http://www.winehq.com/source/memory/source/memory/environ.c#L98>     &current_startupinfo <http://www.winehq.com/source/memory/ident?i=current_startupinfo>,    /* startup_info */
 99 <http://www.winehq.com/source/memory/source/memory/environ.c#L99>     0,                       /* hStdin */
100 <http://www.winehq.com/source/memory/source/memory/environ.c#L100>     0,                       /* hStdout */
101 <http://www.winehq.com/source/memory/source/memory/environ.c#L101>     0,                       /* hStderr */
102 <http://www.winehq.com/source/memory/source/memory/environ.c#L102>     0,                       /* unknown2 */
103 <http://www.winehq.com/source/memory/source/memory/environ.c#L103>     0,                       /* inherit_console */
104 <http://www.winehq.com/source/memory/source/memory/environ.c#L104>     0,                       /* break_type */
105 <http://www.winehq.com/source/memory/source/memory/environ.c#L105>     0,                       /* break_sem */
106 <http://www.winehq.com/source/memory/source/memory/environ.c#L106>     0,                       /* break_event */
107 <http://www.winehq.com/source/memory/source/memory/environ.c#L107>     0,                       /* break_thread */
108 <http://www.winehq.com/source/memory/source/memory/environ.c#L108>     0                        /* break_handlers */
109 <http://www.winehq.com/source/memory/source/memory/environ.c#L109> };


hStdin and hStdout are always 0. So that's the value the function always 
will return. I've tested it in Win32 enviroment and returns a number 
corresponding to the specific handler for each call. 7 and 8 are the 
usual numbers. I could supose 0 as a valid number in wine, but 
FlushConsoleInputBuffer(conhanin) fails and tells me I'm using a wrong 
handler.

Does anyone know more about this GetStdHandle implementation ?

Why is current_envdb set to 0 values ?

Thanks in advance, Ignasi Villagrasa.




 


 






More information about the wine-devel mailing list