ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

pipespy.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.