30#define WIN32_LEAN_AND_MEAN
37static char m_input[256];
38static unsigned m_inputUsed;
40static void InitConsole(
void)
44 HANDLE h=GetStdHandle(STD_INPUT_HANDLE);
49 h=GetStdHandle(STD_OUTPUT_HANDLE);
50 CONSOLE_SCREEN_BUFFER_INFO info;
51 GetConsoleScreenBufferInfo(h,&info);
54 newSize.X=info.srWindow.Right+1;
55 newSize.Y=info.srWindow.Bottom+1;
56 SetConsoleScreenBufferSize(h,newSize);
59 CONSOLE_CURSOR_INFO ci;
62 SetConsoleCursorInfo(h,&ci);
65static char *InputConsole(
void)
68 HANDLE h=GetStdHandle(STD_INPUT_HANDLE);
69 bool returnChars=
false;
73 if (!GetNumberOfConsoleInputEvents(h,&dwRecords))
79 ReadConsoleInput(h,&record,1,&dwRecords);
80 if (record.EventType!=KEY_EVENT)
83 KEY_EVENT_RECORD &key=record.Event.KeyEvent;
84 if (!key.bKeyDown||!key.uChar.AsciiChar)
87 if (key.uChar.AsciiChar==
'\r'||
88 key.uChar.AsciiChar==
'\n')
90 m_input[m_inputUsed++]=
'\n';
97 if (key.uChar.AsciiChar==
'\b')
102 else if (((
unsigned char)key.uChar.AsciiChar)>=
' ')
104 if (m_inputUsed<
sizeof(m_input)-1)
105 m_input[m_inputUsed++]=key.uChar.AsciiChar;
110 h=GetStdHandle(STD_OUTPUT_HANDLE);
111 CONSOLE_SCREEN_BUFFER_INFO info;
112 GetConsoleScreenBufferInfo(h,&info);
113 CHAR_INFO ci[
sizeof(m_input)+1];
114 for (
unsigned k=0;k<=
sizeof(m_input);k++)
116 ci[k].Char.AsciiChar=k<m_inputUsed?m_input[k]:
' ';
117 ci[k].Attributes=BACKGROUND_BLUE|FOREGROUND_BLUE|FOREGROUND_GREEN
118 |FOREGROUND_RED|FOREGROUND_INTENSITY;
122 if (GetTickCount()&512)
123 ci[m_inputUsed].Attributes=BACKGROUND_BLUE|BACKGROUND_GREEN
124 |BACKGROUND_RED|BACKGROUND_INTENSITY|FOREGROUND_BLUE;
126 COORD srcSize,srcCoord;
127 srcSize.X=
sizeof(m_input); srcSize.Y=1;
128 srcCoord.X=srcCoord.Y=0;
131 r.Left=r.Top=r.Bottom=0; r.Right=info.dwSize.X-1;
132 WriteConsoleOutput(h,ci+(m_inputUsed<=info.dwSize.X?0:m_inputUsed-info.dwSize.X),
133 srcSize,srcCoord,&r);
136 if (returnChars&&m_inputUsed>1)
138 m_input[--m_inputUsed]=0;
149 Pipe& operator=(
const Pipe&);
161 m_pipe(INVALID_HANDLE_VALUE),
162 m_src(
NULL), m_str(
NULL), m_stringType(0)
168 if (m_pipe!=INVALID_HANDLE_VALUE)
170 DisconnectNamedPipe(m_pipe);
179 m_pipe=CreateNamedPipe(name,
181 PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_NOWAIT,
182 PIPE_UNLIMITED_INSTANCES,1024,1024,0,
NULL);
184 return m_pipe!=INVALID_HANDLE_VALUE;
191 ConnectNamedPipe(m_pipe,
NULL);
192 if (GetLastError()==ERROR_PIPE_CONNECTED)
195 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
"\n<connect>\n",11,&dwDummy,
NULL);
206 if (!WriteFile(m_pipe,&
msg,1,&dummy,
NULL)||!dummy)
209 wsprintf(sp,
"%c:%i/%i\n",
msg,dummy,GetLastError());
212 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),sp,strlen(sp),&dwDummy,
NULL);
222 if (!ReadFile(m_pipe,&m_stringType,1,&read,
NULL))
229 if (!ReadFile(m_pipe,&m_len,4,&read,
NULL))
234 m_src=(
char *)realloc(m_src,m_len+1);
236 m_str=(
char *)realloc(m_str,m_len+1);
241 if (!ReadFile(m_pipe,m_src,m_len,&read,
NULL))
250 if (!ReadFile(m_pipe,m_str,m_len,&read,
NULL))
261 if (GetLastError()==ERROR_BROKEN_PIPE)
263 DisconnectNamedPipe(m_pipe);
266 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
"\n<disconnect>\n",14,&dwDummy,
NULL);
274int CALLBACK
WinMain(HINSTANCE,HINSTANCE,LPSTR,
int)
278 char buf1[200],buf2[400];
279 DWORD dwDummy=
sizeof(buf1);
280 GetComputerName(buf1,&dwDummy);
281 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),buf2,
282 wsprintf(buf2,
"\n\nSimple debug.net Server ready. Enter 'quit' to exit.\n\nLocal machine: %s\n\n",buf1),
286 for (
int k=0;k<10;k++)
287 if (!p[k].Create(
"\\\\.\\pipe\\ea_debug_v1"))
290 wsprintf(
msg,
"Can't create named pipe (Code %i).",GetLastError());
291 MessageBox(
NULL,
msg,
"Error",MB_OK);
297 char *input=InputConsole();
300 if (!strcmp(input,
"quit"))
304 for (
int k=0;k<10;k++)
306 if (!p[k].Connected())
313 WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),
msg,strlen(
msg),&dwDummy,
NULL);
318 for (
unsigned i=0;input[i];i++)
319 p[k].Write(input[i]);
bool Create(const char *name)
int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int)