1eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Copyright (c) 2008, Google Inc. 2eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// All rights reserved. 3eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 4eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Redistribution and use in source and binary forms, with or without 5eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// modification, are permitted provided that the following conditions are 6eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// met: 7eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 8eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// * Redistributions of source code must retain the above copyright 9eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// notice, this list of conditions and the following disclaimer. 10eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// * Redistributions in binary form must reproduce the above 11eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// copyright notice, this list of conditions and the following disclaimer 12eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// in the documentation and/or other materials provided with the 13eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// distribution. 14eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// * Neither the name of Google Inc. nor the names of its 15eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// contributors may be used to endorse or promote products derived from 16eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// this software without specific prior written permission. 17eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// 18eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 30eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ 31eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ 32eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 33eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#include <list> 34eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#include <string> 35eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#include "client/windows/common/ipc_protocol.h" 36eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#include "client/windows/crash_generation/minidump_generator.h" 370fd594340f87c59b3f9302cfea4d39dd25ec028fthestig@chromium.org#include "common/scoped_ptr.h" 38eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 39eeca9921c563d802cccc5593bf55dcb7683e7250mmentovainamespace google_breakpad { 40b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.orgclass ClientInfo; 41eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 42eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Abstraction for server side implementation of out-of-process crash 43eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// generation protocol for Windows platform only. It generates Windows 44eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// minidump files for client processes that request dump generation. When 45eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// the server is requested to start listening for clients (by calling the 46eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// Start method), it creates a named pipe and waits for the clients to 47eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// register. In response, it hands them event handles that the client can 48eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// signal to request dump generation. When the clients request dump 49eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai// generation in this way, the server generates Windows minidump files. 50eeca9921c563d802cccc5593bf55dcb7683e7250mmentovaiclass CrashGenerationServer { 51eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai public: 52eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai typedef void (*OnClientConnectedCallback)(void* context, 53eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai const ClientInfo* client_info); 54eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 55eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai typedef void (*OnClientDumpRequestCallback)(void* context, 569033edcd7bab5a25c748dd1979f51853bbe06f87doshimun const ClientInfo* client_info, 579033edcd7bab5a25c748dd1979f51853bbe06f87doshimun const std::wstring* file_path); 58eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 59eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai typedef void (*OnClientExitedCallback)(void* context, 60eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai const ClientInfo* client_info); 61eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 62eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org typedef void (*OnClientUploadRequestCallback)(void* context, 63eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org const DWORD crash_id); 64eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org 65eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Creates an instance with the given parameters. 66eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // 6705ec557277a40d214eb82183392b50e039a022a3doshimun // Parameter pipe_name: Name of the Windows named pipe 6835c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun // Parameter pipe_sec_attrs Security attributes to set on the pipe. Pass 6935c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun // NULL to use default security on the pipe. By default, the pipe created 7035c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun // allows Local System, Administrators and the Creator full control and 7135c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun // the Everyone group read access on the pipe. 72eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Parameter connect_callback: Callback for a new client connection. 73eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Parameter connect_context: Context for client connection callback. 74eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Parameter crash_callback: Callback for a client crash dump request. 75eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Parameter crash_context: Context for client crash dump request callback. 76eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Parameter exit_callback: Callback for client process exit. 77eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Parameter exit_context: Context for client exit callback. 78eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Parameter generate_dumps: Whether to automatically generate dumps. 79eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Client code of this class might want to generate dumps explicitly in the 80eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // crash dump request callback. In that case, false can be passed for this 81eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // parameter. 82eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Parameter dump_path: Path for generating dumps; required only if true is 83eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // passed for generateDumps parameter; NULL can be passed otherwise. 84eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CrashGenerationServer(const std::wstring& pipe_name, 8535c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun SECURITY_ATTRIBUTES* pipe_sec_attrs, 86eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai OnClientConnectedCallback connect_callback, 87eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void* connect_context, 88eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai OnClientDumpRequestCallback dump_callback, 89eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void* dump_context, 90eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai OnClientExitedCallback exit_callback, 91eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void* exit_context, 92eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org OnClientUploadRequestCallback upload_request_callback, 93eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org void* upload_context, 94eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool generate_dumps, 95eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai const std::wstring* dump_path); 96eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 97eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ~CrashGenerationServer(); 98eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 99b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // Performs initialization steps needed to start listening to clients. Upon 100b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // successful return clients may connect to this server's pipe. 101eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // 102eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Returns true if initialization is successful; false otherwise. 103eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool Start(); 104eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 105c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com void pre_fetch_custom_info(bool do_pre_fetch) { 106c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com pre_fetch_custom_info_ = do_pre_fetch; 107c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com } 108c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com 109eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai private: 110eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Various states the client can be in during the handshake with 111eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // the server. 112eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai enum IPCServerState { 113b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // Server starts in this state. 114b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org IPC_SERVER_STATE_UNINITIALIZED, 115b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org 116eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Server is in error state and it cannot serve any clients. 117eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IPC_SERVER_STATE_ERROR, 118eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 119eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Server starts in this state. 120eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IPC_SERVER_STATE_INITIAL, 121eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 122eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Server has issued an async connect to the pipe and it is waiting 123eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // for the connection to be established. 124eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IPC_SERVER_STATE_CONNECTING, 125eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 126eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Server is connected successfully. 127eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IPC_SERVER_STATE_CONNECTED, 128eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 129eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Server has issued an async read from the pipe and it is waiting for 130eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // the read to finish. 131eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IPC_SERVER_STATE_READING, 132eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 133eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Server is done reading from the pipe. 134eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IPC_SERVER_STATE_READ_DONE, 135eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 136eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Server has issued an async write to the pipe and it is waiting for 137eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // the write to finish. 138eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IPC_SERVER_STATE_WRITING, 139eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 140eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Server is done writing to the pipe. 141eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IPC_SERVER_STATE_WRITE_DONE, 142eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 143eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Server has issued an async read from the pipe for an ack and it 144eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // is waiting for the read to finish. 145eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IPC_SERVER_STATE_READING_ACK, 146eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 147eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Server is done writing to the pipe and it is now ready to disconnect 148eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // and reconnect. 149eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai IPC_SERVER_STATE_DISCONNECTING 150eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai }; 151eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 152eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // 153eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Helper methods to handle various server IPC states. 154eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // 155eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleErrorState(); 156eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleInitialState(); 157eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleConnectingState(); 158eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleConnectedState(); 159eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleReadingState(); 160eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleReadDoneState(); 161eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleWritingState(); 162eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleWriteDoneState(); 163eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleReadingAckState(); 164eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleDisconnectingState(); 165eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 166eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Prepares reply for a client from the given parameters. 167eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool PrepareReply(const ClientInfo& client_info, 168eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ProtocolMessage* reply) const; 169eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 170eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Duplicates various handles in the ClientInfo object for the client 171eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // process and stores them in the given ProtocolMessage instance. If 172eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // creating any handle fails, ProtocolMessage will contain the handles 173eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // already created successfully, which should be closed by the caller. 174eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool CreateClientHandles(const ClientInfo& client_info, 175eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ProtocolMessage* reply) const; 176eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 177eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Response to the given client. Return true if all steps of 178eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // responding to the client succeed, false otherwise. 179eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool RespondToClient(ClientInfo* client_info); 180eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 181eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Handles a connection request from the client. 182eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleConnectionRequest(); 183eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 184eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Handles a dump request from the client. 185eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void HandleDumpRequest(const ClientInfo& client_info); 186eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 187eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Callback for pipe connected event. 188eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai static void CALLBACK OnPipeConnected(void* context, BOOLEAN timer_or_wait); 189eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 190eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Callback for a dump request. 191eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai static void CALLBACK OnDumpRequest(void* context, BOOLEAN timer_or_wait); 192eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 193eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Callback for client process exit event. 194eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai static void CALLBACK OnClientEnd(void* context, BOOLEAN timer_or_wait); 195eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 19655cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com // Handles client process exit. 19755cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com void HandleClientProcessExit(ClientInfo* client_info); 198eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 199eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Adds the given client to the list of registered clients. 200eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool AddClient(ClientInfo* client_info); 201eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 202eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Generates dump for the given client. 2039033edcd7bab5a25c748dd1979f51853bbe06f87doshimun bool GenerateDump(const ClientInfo& client, std::wstring* dump_path); 204eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 205b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // Puts the server in a permanent error state and sets a signal such that 206b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // the state will be immediately entered after the current state transition 207b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // is complete. 208b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org void EnterErrorState(); 209b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org 210b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // Puts the server in the specified state and sets a signal such that the 211b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // state is immediately entered after the current state transition is 212b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // complete. 213b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org void EnterStateImmediately(IPCServerState state); 214b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org 215b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // Puts the server in the specified state. No signal will be set, so the state 216b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // transition will only occur when signaled manually or by completion of an 217b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org // asynchronous IO operation. 218b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org void EnterStateWhenSignaled(IPCServerState state); 219b6ee7dcb220db5c396d12ddf12e071c8ec48dfd3erikwright@chromium.org 22055cc396a9f783213f6033a6f4e12d56d47af40a5ivan.penkov@gmail.com // Sync object for thread-safe access to the shared list of clients. 22120371bcb7ed6fdcf505ac01dacfed7dc113d18f8mark@chromium.org CRITICAL_SECTION sync_; 222eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 223eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // List of clients. 224eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai std::list<ClientInfo*> clients_; 225eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 226eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Pipe name. 227eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai std::wstring pipe_name_; 228eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 22935c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun // Pipe security attributes 23035c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun SECURITY_ATTRIBUTES* pipe_sec_attrs_; 23135c34d6bb9b1deb656bfe65741f2c4f8401045f4doshimun 232eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Handle to the pipe used for handshake with clients. 233eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE pipe_; 234eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 235eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Pipe wait handle. 236eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE pipe_wait_handle_; 237eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 238eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Handle to server-alive mutex. 239eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai HANDLE server_alive_handle_; 240eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 241eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Callback for a successful client connection. 242eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai OnClientConnectedCallback connect_callback_; 243eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 244eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Context for client connected callback. 245eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void* connect_context_; 246eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 247eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Callback for a client dump request. 248eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai OnClientDumpRequestCallback dump_callback_; 249eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 250eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Context for client dump request callback. 251eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void* dump_context_; 252eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 253eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Callback for client process exit. 254eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai OnClientExitedCallback exit_callback_; 255eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 256eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Context for client process exit callback. 257eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai void* exit_context_; 258eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 259eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org // Callback for upload request. 260eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org OnClientUploadRequestCallback upload_request_callback_; 261eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org 262eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org // Context for upload request callback. 263eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org void* upload_context_; 264eb991531e31b7c001200cf23ce07efc5a32b41aecdn@chromium.org 265eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Whether to generate dumps. 266eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai bool generate_dumps_; 267eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 268c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com // Wether to populate custom information up-front. 269c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com bool pre_fetch_custom_info_; 270c20745c254b0934520c5c45de9fdf0c4cbce54fdivan.penkov@gmail.com 271f1cb1b4882b1b6111b922902ea7cf19730777bd0cdn@chromium.org // The dump path for the server. 272f1cb1b4882b1b6111b922902ea7cf19730777bd0cdn@chromium.org const std::wstring dump_path_; 273eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 274eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // State of the server in performing the IPC with the client. 275eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Note that since we restrict the pipe to one instance, we 276eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // only need to keep one state of the server. Otherwise, server 277eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // would have one state per client it is talking to. 27820371bcb7ed6fdcf505ac01dacfed7dc113d18f8mark@chromium.org IPCServerState server_state_; 279eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 280eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Whether the server is shutting down. 28120371bcb7ed6fdcf505ac01dacfed7dc113d18f8mark@chromium.org bool shutting_down_; 282eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 283eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Overlapped instance for async I/O on the pipe. 284eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai OVERLAPPED overlapped_; 285eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 286eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Message object used in IPC with the client. 287eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ProtocolMessage msg_; 288eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 289eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Client Info for the client that's connecting to the server. 290eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai ClientInfo* client_info_; 291eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 292eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai // Disable copy ctor and operator=. 293eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CrashGenerationServer(const CrashGenerationServer& crash_server); 294eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai CrashGenerationServer& operator=(const CrashGenerationServer& crash_server); 295eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai}; 296eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 297eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai} // namespace google_breakpad 298eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai 299eeca9921c563d802cccc5593bf55dcb7683e7250mmentovai#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ 300