Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenpipespy.cpp
Go to the documentation of this file.
00001 /* 00002 * PipeSpy 00003 * Copyright (c) 2004, Skywing (skywing@valhallalegends.com) 00004 * Released under the GNU GPL for the ReactOS project 00005 * 00006 * This program can be used to spy on a named pipe in Windows NT(+) 00007 * or ReactOS. It is particularly intended to be used for 00008 * understanding the remote kernel debugging protocol used 00009 * by windows kd. 00010 * 00011 * USE: 00012 * 00013 * PipeSpy \\.\pipe\debug_server \\.\pipe\debug_client > PipeSpy.log 00014 * 00015 * VMware: act as client, connect to \\.\pipe\debug_server, pipe is connected 00016 * to application 00017 * 00018 * WinDbg -k com:pipe,port=\\.\pipe\debug_client,resets=0 00019 * 00020 * NOTE: 00021 * 00022 * This program hasn't really been tested against ReactOS, and has only 00023 * been built with Visual Studio .NET 2003. 00024 */ 00025 #include <process.h> 00026 #include <windows.h> 00027 #include <stdio.h> 00028 00029 HANDLE g_DebugServerPipe, g_DebugClientPipe; 00030 CRITICAL_SECTION g_OutputLock; 00031 00032 void dumphex(const char *buf, int len, int pos) 00033 { 00034 int i, j; 00035 for(j = 0; j < len; j += 16) { 00036 for(i = 0; i < 16; i++) { 00037 if(i + j < len) 00038 printf("%02x%c", (unsigned char)buf[i + j], j + i + 1 == pos ? '*' : ' '); 00039 else 00040 printf(" "); 00041 } 00042 for(i = 0; i < 16; i++) { 00043 if(i + j < len) 00044 printf("%c", buf[i + j] >= ' ' ? buf[i + j] : '.'); 00045 else 00046 printf(" "); 00047 } 00048 printf("\n"); 00049 } 00050 } 00051 00052 enum { 00053 PIPEBUF_INITIAL_SIZE = 4096, 00054 PIPEBUF_MAX_SIZE = 16384 00055 }; 00056 00057 typedef struct _READ_OVERLAPPED { 00058 OVERLAPPED ReadOverlapped; 00059 char* Buffer; 00060 HANDLE Pipe, OtherPipe; 00061 bool Server; 00062 bool Connected; 00063 } READ_OVERLAPPED; 00064 00065 VOID WINAPI WritePipeCompletion(DWORD dwErrorCode, DWORD dwNumberOfBytesTransferred, LPOVERLAPPED lpOverlapped) 00066 { 00067 if(dwErrorCode) { 00068 EnterCriticalSection(&g_OutputLock); 00069 printf(lpOverlapped->hEvent ? "Server> Error %u writing to client pipe\n" : "Client> Error %u writing to server pipe\n", dwErrorCode); 00070 LeaveCriticalSection(&g_OutputLock); 00071 } 00072 00073 free((void*)lpOverlapped); 00074 } 00075 00076 VOID WINAPI ReadPipeCompletion(DWORD dwErrorCode, DWORD dwNumberOfBytesTransferred, LPOVERLAPPED lpOverlapped) 00077 { 00078 READ_OVERLAPPED* ReadOverlapped = (READ_OVERLAPPED*)lpOverlapped; 00079 LPOVERLAPPED WriteOverlapped; 00080 00081 EnterCriticalSection(&g_OutputLock); 00082 00083 if(dwErrorCode) { 00084 printf(ReadOverlapped->Server ? "Server> Error %u reading from pipe\n" : "Client> Error %u reading from pipe\n", dwErrorCode); 00085 ReadOverlapped->Connected = false; 00086 } else { 00087 SYSTEMTIME SystemTime; 00088 00089 GetLocalTime(&SystemTime); 00090 printf(ReadOverlapped->Server ? "Server> [%02u:%02u:%02u.%03u] Received %u byte message:\n" : "Client> [%02u:%02u:%02u.%03u] Received %u byte message:\n", 00091 SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, SystemTime.wMilliseconds, dwNumberOfBytesTransferred); 00092 dumphex(ReadOverlapped->Buffer, (int)dwNumberOfBytesTransferred, -1); 00093 printf("\n"); 00094 } 00095 00096 LeaveCriticalSection(&g_OutputLock); 00097 00098 WriteOverlapped = (LPOVERLAPPED)malloc(sizeof(OVERLAPPED)+dwNumberOfBytesTransferred); 00099 00100 if(!WriteOverlapped) 00101 printf(ReadOverlapped->Server ? "Server> Out of memory\n" : "Client> Out of memory\n"); 00102 else { 00103 ZeroMemory(WriteOverlapped, sizeof(OVERLAPPED)); 00104 WriteOverlapped->hEvent = (HANDLE)ReadOverlapped->Server; 00105 memcpy(((char*)WriteOverlapped)+sizeof(OVERLAPPED), ReadOverlapped->Buffer, dwNumberOfBytesTransferred); 00106 WriteFileEx(ReadOverlapped->OtherPipe, ((char*)WriteOverlapped)+sizeof(OVERLAPPED), dwNumberOfBytesTransferred, WriteOverlapped, 00107 WritePipeCompletion); 00108 } 00109 00110 if(!dwErrorCode) { 00111 ZeroMemory(ReadOverlapped, sizeof(OVERLAPPED)); 00112 ReadFileEx(ReadOverlapped->Pipe, ReadOverlapped->Buffer, PIPEBUF_INITIAL_SIZE, &ReadOverlapped->ReadOverlapped, ReadPipeCompletion); 00113 } 00114 } 00115 00116 void __cdecl pipeserver(void* param) 00117 { 00118 READ_OVERLAPPED ReadOverlapped; 00119 00120 ReadOverlapped.Pipe = (HANDLE)param, ReadOverlapped.OtherPipe = ReadOverlapped.Pipe == g_DebugServerPipe ? g_DebugClientPipe : g_DebugServerPipe; 00121 ReadOverlapped.Server = ReadOverlapped.Pipe == g_DebugServerPipe; 00122 ReadOverlapped.Buffer = (char*)malloc(PIPEBUF_INITIAL_SIZE); 00123 00124 for(;;) { 00125 if(!ConnectNamedPipe(ReadOverlapped.Pipe, 0) && GetLastError() != ERROR_PIPE_CONNECTED) { 00126 printf(ReadOverlapped.Server ? "Server> Error %u accepting pipe connection\n" : "Client> Error %u accepting pipe connection\n", 00127 GetLastError()); 00128 break; 00129 } 00130 00131 ReadOverlapped.Connected = true; 00132 printf(ReadOverlapped.Server ? "Server> Connected\n" : "Client> Connected\n"); 00133 00134 ZeroMemory(&ReadOverlapped.ReadOverlapped, sizeof(OVERLAPPED)); 00135 ReadFileEx(ReadOverlapped.Pipe, ReadOverlapped.Buffer, PIPEBUF_INITIAL_SIZE, &ReadOverlapped.ReadOverlapped, ReadPipeCompletion); 00136 00137 do { 00138 SleepEx(INFINITE, TRUE); 00139 } while(ReadOverlapped.Connected) ; 00140 00141 DisconnectNamedPipe(ReadOverlapped.Pipe); 00142 printf(ReadOverlapped.Server ? "Server> Disconnected\n" : "Client> Disconnected\n"); 00143 } 00144 00145 printf(ReadOverlapped.Server ? "Server> Shutting down\n" : "Client> Shutting down\n"); 00146 00147 free(ReadOverlapped.Buffer); 00148 CloseHandle(ReadOverlapped.Pipe); 00149 SleepEx(0, TRUE); 00150 } 00151 00152 int main(int ac, char **av) 00153 { 00154 if(ac != 3) { 00155 printf("syntax: pipespy serverpipe clientpipe\n"); 00156 return 0; 00157 } 00158 00159 g_DebugServerPipe = CreateNamedPipe(av[1], PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 00160 1, 4096, 4096, NMPWAIT_WAIT_FOREVER, 0); 00161 00162 if(g_DebugServerPipe == INVALID_HANDLE_VALUE) { 00163 printf("Error %u creating server pipe\n", GetLastError()); 00164 return 0; 00165 } 00166 00167 g_DebugClientPipe = CreateNamedPipe(av[2], PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 00168 1, 4096, 4096, NMPWAIT_WAIT_FOREVER, 0); 00169 00170 if(g_DebugClientPipe == INVALID_HANDLE_VALUE) { 00171 printf("Error %u creating client pipe\n", GetLastError()); 00172 CloseHandle(g_DebugServerPipe); 00173 return 0; 00174 } 00175 00176 InitializeCriticalSection(&g_OutputLock); 00177 _beginthread(pipeserver, 0, (void*)g_DebugServerPipe); 00178 pipeserver((void*)g_DebugClientPipe); 00179 DeleteCriticalSection(&g_OutputLock); 00180 return 0; 00181 } 00182 00183 00184 /* 00185 while(!Error) { 00186 SleepEx(0, TRUE); 00187 BufferPos = 0; 00188 00189 if(BufferSize > PIPEBUF_MAX_SIZE) { 00190 char* NewBuf = (char*)realloc(Buffer, PIPEBUF_MAX_SIZE); 00191 00192 if(NewBuf) { 00193 Buffer = NewBuf; 00194 BufferSize = PIPEBUF_MAX_SIZE; 00195 } 00196 } 00197 00198 for(;;) { 00199 char* NewBuf; 00200 00201 if(ReadFile(Pipe, Buffer+BufferPos, BufferSize-BufferPos, &Read, 0)) { 00202 BufferPos += Read; 00203 Error = 0; 00204 break; 00205 } 00206 00207 Error = GetLastError(); 00208 00209 printf("Error=%u read=%u\n", Error, Read); 00210 00211 if(Error != ERROR_MORE_DATA) { 00212 printf(Server ? "Server> Error %u reading from pipe\n" : "Client> Error %u reading from pipe\n", GetLastError()); 00213 break; 00214 } 00215 00216 NewBuf = (char*)realloc(Buffer, BufferSize << 1); 00217 00218 if(!NewBuf) { 00219 printf(Server ? "Server> Out of memory\n" : "Client> Out of memory\n"); 00220 break; 00221 } 00222 00223 BufferSize <<= 1; 00224 BufferPos += Read; 00225 Error = 0; 00226 } 00227 00228 if(Error) 00229 break; 00230 00231 WriteOverlapped = (LPOVERLAPPED)malloc(sizeof(OVERLAPPED)+BufferPos); 00232 00233 if(!WriteOverlapped) 00234 printf(Server ? "Server> Out of memory\n" : "Client> Out of memory\n"); 00235 else { 00236 ZeroMemory(WriteOverlapped, sizeof(OVERLAPPED)); 00237 memcpy(((char*)WriteOverlapped)+sizeof(OVERLAPPED), Buffer, BufferPos); 00238 WriteFileEx(OtherPipe, ((char*)WriteOverlapped)+sizeof(OVERLAPPED), BufferPos, WriteOverlapped, WritePipeCompletion); 00239 } 00240 00241 EnterCriticalSection(&g_OutputLock); 00242 printf(Server ? "Server> Received %u byte message:\n" : "Client> Received %u byte message:\n", BufferPos); 00243 dumphex(Buffer, (int)BufferPos, -1); 00244 printf("\n"); 00245 LeaveCriticalSection(&g_OutputLock); 00246 } 00247 00248 DisconnectNamedPipe(Pipe); 00249 printf(Server ? "Server> Disconnected\n" : "Client> Disconnected\n"); 00250 00251 */ Generated on Sat May 26 2012 04:36:37 for ReactOS by
1.7.6.1
|