Fix newlines (#253). rs=ted.mielczarek

http://groups.google.com/group/google-breakpad-dev/browse_thread/thread/7e62a299ce3fa222


git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@255 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
mmentovai 2008-04-07 21:50:57 +00:00
parent 61ea8bf0d5
commit eeca9921c5
29 changed files with 27796 additions and 27796 deletions

View file

@ -1,49 +1,49 @@
 
Microsoft Visual Studio Solution File, Format Version 9.00 Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005 # Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exception_handler", "handler\exception_handler.vcproj", "{B55CA863-B374-4BAF-95AC-539E4FA4C90C}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "exception_handler", "handler\exception_handler.vcproj", "{B55CA863-B374-4BAF-95AC-539E4FA4C90C}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
{A820AF62-6239-4693-8430-4F516C1838F4} = {A820AF62-6239-4693-8430-4F516C1838F4} {A820AF62-6239-4693-8430-4F516C1838F4} = {A820AF62-6239-4693-8430-4F516C1838F4}
EndProjectSection EndProjectSection
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash_report_sender", "sender\crash_report_sender.vcproj", "{9946A048-043B-4F8F-9E07-9297B204714C}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash_report_sender", "sender\crash_report_sender.vcproj", "{9946A048-043B-4F8F-9E07-9297B204714C}"
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash_generation", "crash_generation\crash_generation.vcproj", "{A820AF62-6239-4693-8430-4F516C1838F4}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash_generation", "crash_generation\crash_generation.vcproj", "{A820AF62-6239-4693-8430-4F516C1838F4}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32
DebugStaticCRT|Win32 = DebugStaticCRT|Win32 DebugStaticCRT|Win32 = DebugStaticCRT|Win32
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
ReleaseStaticCRT|Win32 = ReleaseStaticCRT|Win32 ReleaseStaticCRT|Win32 = ReleaseStaticCRT|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B55CA863-B374-4BAF-95AC-539E4FA4C90C}.Debug|Win32.ActiveCfg = Debug|Win32 {B55CA863-B374-4BAF-95AC-539E4FA4C90C}.Debug|Win32.ActiveCfg = Debug|Win32
{B55CA863-B374-4BAF-95AC-539E4FA4C90C}.Debug|Win32.Build.0 = Debug|Win32 {B55CA863-B374-4BAF-95AC-539E4FA4C90C}.Debug|Win32.Build.0 = Debug|Win32
{B55CA863-B374-4BAF-95AC-539E4FA4C90C}.DebugStaticCRT|Win32.ActiveCfg = DebugStaticCRT|Win32 {B55CA863-B374-4BAF-95AC-539E4FA4C90C}.DebugStaticCRT|Win32.ActiveCfg = DebugStaticCRT|Win32
{B55CA863-B374-4BAF-95AC-539E4FA4C90C}.DebugStaticCRT|Win32.Build.0 = DebugStaticCRT|Win32 {B55CA863-B374-4BAF-95AC-539E4FA4C90C}.DebugStaticCRT|Win32.Build.0 = DebugStaticCRT|Win32
{B55CA863-B374-4BAF-95AC-539E4FA4C90C}.Release|Win32.ActiveCfg = Release|Win32 {B55CA863-B374-4BAF-95AC-539E4FA4C90C}.Release|Win32.ActiveCfg = Release|Win32
{B55CA863-B374-4BAF-95AC-539E4FA4C90C}.Release|Win32.Build.0 = Release|Win32 {B55CA863-B374-4BAF-95AC-539E4FA4C90C}.Release|Win32.Build.0 = Release|Win32
{B55CA863-B374-4BAF-95AC-539E4FA4C90C}.ReleaseStaticCRT|Win32.ActiveCfg = ReleaseStaticCRT|Win32 {B55CA863-B374-4BAF-95AC-539E4FA4C90C}.ReleaseStaticCRT|Win32.ActiveCfg = ReleaseStaticCRT|Win32
{B55CA863-B374-4BAF-95AC-539E4FA4C90C}.ReleaseStaticCRT|Win32.Build.0 = ReleaseStaticCRT|Win32 {B55CA863-B374-4BAF-95AC-539E4FA4C90C}.ReleaseStaticCRT|Win32.Build.0 = ReleaseStaticCRT|Win32
{9946A048-043B-4F8F-9E07-9297B204714C}.Debug|Win32.ActiveCfg = Debug|Win32 {9946A048-043B-4F8F-9E07-9297B204714C}.Debug|Win32.ActiveCfg = Debug|Win32
{9946A048-043B-4F8F-9E07-9297B204714C}.Debug|Win32.Build.0 = Debug|Win32 {9946A048-043B-4F8F-9E07-9297B204714C}.Debug|Win32.Build.0 = Debug|Win32
{9946A048-043B-4F8F-9E07-9297B204714C}.DebugStaticCRT|Win32.ActiveCfg = DebugStaticCRT|Win32 {9946A048-043B-4F8F-9E07-9297B204714C}.DebugStaticCRT|Win32.ActiveCfg = DebugStaticCRT|Win32
{9946A048-043B-4F8F-9E07-9297B204714C}.DebugStaticCRT|Win32.Build.0 = DebugStaticCRT|Win32 {9946A048-043B-4F8F-9E07-9297B204714C}.DebugStaticCRT|Win32.Build.0 = DebugStaticCRT|Win32
{9946A048-043B-4F8F-9E07-9297B204714C}.Release|Win32.ActiveCfg = Release|Win32 {9946A048-043B-4F8F-9E07-9297B204714C}.Release|Win32.ActiveCfg = Release|Win32
{9946A048-043B-4F8F-9E07-9297B204714C}.Release|Win32.Build.0 = Release|Win32 {9946A048-043B-4F8F-9E07-9297B204714C}.Release|Win32.Build.0 = Release|Win32
{9946A048-043B-4F8F-9E07-9297B204714C}.ReleaseStaticCRT|Win32.ActiveCfg = ReleaseStaticCRT|Win32 {9946A048-043B-4F8F-9E07-9297B204714C}.ReleaseStaticCRT|Win32.ActiveCfg = ReleaseStaticCRT|Win32
{9946A048-043B-4F8F-9E07-9297B204714C}.ReleaseStaticCRT|Win32.Build.0 = ReleaseStaticCRT|Win32 {9946A048-043B-4F8F-9E07-9297B204714C}.ReleaseStaticCRT|Win32.Build.0 = ReleaseStaticCRT|Win32
{A820AF62-6239-4693-8430-4F516C1838F4}.Debug|Win32.ActiveCfg = Debug|Win32 {A820AF62-6239-4693-8430-4F516C1838F4}.Debug|Win32.ActiveCfg = Debug|Win32
{A820AF62-6239-4693-8430-4F516C1838F4}.Debug|Win32.Build.0 = Debug|Win32 {A820AF62-6239-4693-8430-4F516C1838F4}.Debug|Win32.Build.0 = Debug|Win32
{A820AF62-6239-4693-8430-4F516C1838F4}.DebugStaticCRT|Win32.ActiveCfg = DebugStaticCRT|Win32 {A820AF62-6239-4693-8430-4F516C1838F4}.DebugStaticCRT|Win32.ActiveCfg = DebugStaticCRT|Win32
{A820AF62-6239-4693-8430-4F516C1838F4}.DebugStaticCRT|Win32.Build.0 = DebugStaticCRT|Win32 {A820AF62-6239-4693-8430-4F516C1838F4}.DebugStaticCRT|Win32.Build.0 = DebugStaticCRT|Win32
{A820AF62-6239-4693-8430-4F516C1838F4}.Release|Win32.ActiveCfg = Release|Win32 {A820AF62-6239-4693-8430-4F516C1838F4}.Release|Win32.ActiveCfg = Release|Win32
{A820AF62-6239-4693-8430-4F516C1838F4}.Release|Win32.Build.0 = Release|Win32 {A820AF62-6239-4693-8430-4F516C1838F4}.Release|Win32.Build.0 = Release|Win32
{A820AF62-6239-4693-8430-4F516C1838F4}.ReleaseStaticCRT|Win32.ActiveCfg = ReleaseStaticCRT|Win32 {A820AF62-6239-4693-8430-4F516C1838F4}.ReleaseStaticCRT|Win32.ActiveCfg = ReleaseStaticCRT|Win32
{A820AF62-6239-4693-8430-4F516C1838F4}.ReleaseStaticCRT|Win32.Build.0 = ReleaseStaticCRT|Win32 {A820AF62-6239-4693-8430-4F516C1838F4}.ReleaseStaticCRT|Win32.Build.0 = ReleaseStaticCRT|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View file

@ -1,63 +1,63 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ #ifndef CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__
#define CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ #define CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__
#include <Windows.h> #include <Windows.h>
namespace google_breakpad { namespace google_breakpad {
// Automatically enters the critical section in the constructor and leaves // Automatically enters the critical section in the constructor and leaves
// the critical section in the destructor. // the critical section in the destructor.
class AutoCriticalSection { class AutoCriticalSection {
public: public:
// Creates a new instance with the given critical section object // Creates a new instance with the given critical section object
// and enters the critical section immediately. // and enters the critical section immediately.
explicit AutoCriticalSection(CRITICAL_SECTION* cs) : cs_(cs) { explicit AutoCriticalSection(CRITICAL_SECTION* cs) : cs_(cs) {
assert(cs_); assert(cs_);
EnterCriticalSection(cs_); EnterCriticalSection(cs_);
} }
// Destructor: leaves the critical section. // Destructor: leaves the critical section.
~AutoCriticalSection() { ~AutoCriticalSection() {
LeaveCriticalSection(cs_); LeaveCriticalSection(cs_);
} }
private: private:
// Disable copy ctor and operator=. // Disable copy ctor and operator=.
AutoCriticalSection(const AutoCriticalSection&); AutoCriticalSection(const AutoCriticalSection&);
AutoCriticalSection& operator=(const AutoCriticalSection&); AutoCriticalSection& operator=(const AutoCriticalSection&);
CRITICAL_SECTION* cs_; CRITICAL_SECTION* cs_;
}; };
} // namespace google_breakpad } // namespace google_breakpad
#endif // CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ #endif // CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__

View file

@ -1,122 +1,122 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ #ifndef CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__
#define CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ #define CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__
#include <Windows.h> #include <Windows.h>
#include <DbgHelp.h> #include <DbgHelp.h>
#include "google_breakpad/common/minidump_format.h" #include "google_breakpad/common/minidump_format.h"
namespace google_breakpad { namespace google_breakpad {
// Constants for the protocol between client and the server. // Constants for the protocol between client and the server.
// Tags sent with each message indicating the purpose of // Tags sent with each message indicating the purpose of
// the message. // the message.
enum MessageTag { enum MessageTag {
MESSAGE_TAG_NONE = 0, MESSAGE_TAG_NONE = 0,
MESSAGE_TAG_REGISTRATION_REQUEST = 1, MESSAGE_TAG_REGISTRATION_REQUEST = 1,
MESSAGE_TAG_REGISTRATION_RESPONSE = 2, MESSAGE_TAG_REGISTRATION_RESPONSE = 2,
MESSAGE_TAG_REGISTRATION_ACK = 3 MESSAGE_TAG_REGISTRATION_ACK = 3
}; };
// Message structure for IPC between crash client and crash server. // Message structure for IPC between crash client and crash server.
struct ProtocolMessage { struct ProtocolMessage {
ProtocolMessage() ProtocolMessage()
: tag(MESSAGE_TAG_NONE), : tag(MESSAGE_TAG_NONE),
pid(0), pid(0),
dump_type(MiniDumpNormal), dump_type(MiniDumpNormal),
thread_id(0), thread_id(0),
exception_pointers(NULL), exception_pointers(NULL),
assert_info(NULL), assert_info(NULL),
dump_request_handle(NULL), dump_request_handle(NULL),
dump_generated_handle(NULL), dump_generated_handle(NULL),
server_alive_handle(NULL) { server_alive_handle(NULL) {
} }
// Creates an instance with the given parameters. // Creates an instance with the given parameters.
ProtocolMessage(MessageTag arg_tag, ProtocolMessage(MessageTag arg_tag,
DWORD arg_pid, DWORD arg_pid,
MINIDUMP_TYPE arg_dump_type, MINIDUMP_TYPE arg_dump_type,
DWORD* arg_thread_id, DWORD* arg_thread_id,
EXCEPTION_POINTERS** arg_exception_pointers, EXCEPTION_POINTERS** arg_exception_pointers,
MDRawAssertionInfo* arg_assert_info, MDRawAssertionInfo* arg_assert_info,
HANDLE arg_dump_request_handle, HANDLE arg_dump_request_handle,
HANDLE arg_dump_generated_handle, HANDLE arg_dump_generated_handle,
HANDLE arg_server_alive) HANDLE arg_server_alive)
: tag(arg_tag), : tag(arg_tag),
pid(arg_pid), pid(arg_pid),
dump_type(arg_dump_type), dump_type(arg_dump_type),
thread_id(arg_thread_id), thread_id(arg_thread_id),
exception_pointers(arg_exception_pointers), exception_pointers(arg_exception_pointers),
assert_info(arg_assert_info), assert_info(arg_assert_info),
dump_request_handle(arg_dump_request_handle), dump_request_handle(arg_dump_request_handle),
dump_generated_handle(arg_dump_generated_handle), dump_generated_handle(arg_dump_generated_handle),
server_alive_handle(arg_server_alive) { server_alive_handle(arg_server_alive) {
} }
// Tag in the message. // Tag in the message.
MessageTag tag; MessageTag tag;
// Process id. // Process id.
DWORD pid; DWORD pid;
// Dump type requested. // Dump type requested.
MINIDUMP_TYPE dump_type; MINIDUMP_TYPE dump_type;
// Client thread id pointer. // Client thread id pointer.
DWORD* thread_id; DWORD* thread_id;
// Exception information. // Exception information.
EXCEPTION_POINTERS** exception_pointers; EXCEPTION_POINTERS** exception_pointers;
// Assert information in case of an invalid parameter or // Assert information in case of an invalid parameter or
// pure call failure. // pure call failure.
MDRawAssertionInfo* assert_info; MDRawAssertionInfo* assert_info;
// Handle to signal the crash event. // Handle to signal the crash event.
HANDLE dump_request_handle; HANDLE dump_request_handle;
// Handle to check if server is done generating crash. // Handle to check if server is done generating crash.
HANDLE dump_generated_handle; HANDLE dump_generated_handle;
// Handle to a mutex that becomes signaled (WAIT_ABANDONED) // Handle to a mutex that becomes signaled (WAIT_ABANDONED)
// if server process goes down. // if server process goes down.
HANDLE server_alive_handle; HANDLE server_alive_handle;
private: private:
// Disable copy ctor and operator=. // Disable copy ctor and operator=.
ProtocolMessage(const ProtocolMessage& msg); ProtocolMessage(const ProtocolMessage& msg);
ProtocolMessage& operator=(const ProtocolMessage& msg); ProtocolMessage& operator=(const ProtocolMessage& msg);
}; };
} // namespace google_breakpad } // namespace google_breakpad
#endif // CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ #endif // CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__

View file

@ -1,58 +1,58 @@
========================================================================= =========================================================================
State machine transitions for the Crash Generation Server State machine transitions for the Crash Generation Server
========================================================================= =========================================================================
========================================================================= =========================================================================
| |
STATE | ACTIONS STATE | ACTIONS
| |
========================================================================= =========================================================================
ERROR | Clean up resources used to serve clients. ERROR | Clean up resources used to serve clients.
| Always remain in ERROR state. | Always remain in ERROR state.
------------------------------------------------------------------------- -------------------------------------------------------------------------
INITIAL | Connect to the pipe asynchronously. INITIAL | Connect to the pipe asynchronously.
| If connection is successfully queued up asynchronously, | If connection is successfully queued up asynchronously,
| go into CONNECTING state. | go into CONNECTING state.
| If connection is done synchronously, go into CONNECTED | If connection is done synchronously, go into CONNECTED
| state. | state.
| For any unexpected problems, go into ERROR state. | For any unexpected problems, go into ERROR state.
------------------------------------------------------------------------- -------------------------------------------------------------------------
CONNECTING | Get the result of async connection request. CONNECTING | Get the result of async connection request.
| If I/O is still incomplete, remain in the CONNECTING | If I/O is still incomplete, remain in the CONNECTING
| state. | state.
| If connection is complete, go into CONNECTED state. | If connection is complete, go into CONNECTED state.
| For any unexpected problems, go into DISCONNECTING state. | For any unexpected problems, go into DISCONNECTING state.
------------------------------------------------------------------------- -------------------------------------------------------------------------
CONNECTED | Read from the pipe asynchronously. CONNECTED | Read from the pipe asynchronously.
| If read request is successfully queued up asynchronously, | If read request is successfully queued up asynchronously,
| go into READING state. | go into READING state.
| For any unexpected problems, go into DISCONNECTING state. | For any unexpected problems, go into DISCONNECTING state.
------------------------------------------------------------------------- -------------------------------------------------------------------------
READING | Get the result of async read request. READING | Get the result of async read request.
| If read is done, go into READ_DONE state. | If read is done, go into READ_DONE state.
| For any unexpected problems, go into DISCONNECTING state. | For any unexpected problems, go into DISCONNECTING state.
------------------------------------------------------------------------- -------------------------------------------------------------------------
READ_DONE | Register the client, prepare the reply and write the READ_DONE | Register the client, prepare the reply and write the
| reply to the pipe asynchronously. | reply to the pipe asynchronously.
| If write request is successfully queued up asynchronously, | If write request is successfully queued up asynchronously,
| go into WRITING state. | go into WRITING state.
| For any unexpected problems, go into DISCONNECTING state. | For any unexpected problems, go into DISCONNECTING state.
------------------------------------------------------------------------- -------------------------------------------------------------------------
WRITING | Get the result of the async write request. WRITING | Get the result of the async write request.
| If write is done, go into WRITE_DONE state. | If write is done, go into WRITE_DONE state.
| For any unexpected problems, go into DISCONNECTING state. | For any unexpected problems, go into DISCONNECTING state.
------------------------------------------------------------------------- -------------------------------------------------------------------------
WRITE_DONE | Read from the pipe asynchronously (for an ACK). WRITE_DONE | Read from the pipe asynchronously (for an ACK).
| If read request is successfully queued up asynchonously, | If read request is successfully queued up asynchonously,
| go into READING_ACK state. | go into READING_ACK state.
| For any unexpected problems, go into DISCONNECTING state. | For any unexpected problems, go into DISCONNECTING state.
------------------------------------------------------------------------- -------------------------------------------------------------------------
READING_ACK | Get the result of the async read request. READING_ACK | Get the result of the async read request.
| If read is done, perform action for successful client | If read is done, perform action for successful client
| connection. | connection.
| Go into DISCONNECTING state. | Go into DISCONNECTING state.
------------------------------------------------------------------------- -------------------------------------------------------------------------
DISCONNECTING | Disconnect from the pipe, reset the event and go into DISCONNECTING | Disconnect from the pipe, reset the event and go into
| INITIAL state and signal the event again. If anything | INITIAL state and signal the event again. If anything
| fails, go into ERROR state. | fails, go into ERROR state.
========================================================================= =========================================================================

View file

@ -1,147 +1,147 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "client/windows/crash_generation/client_info.h" #include "client/windows/crash_generation/client_info.h"
namespace google_breakpad { namespace google_breakpad {
ClientInfo::ClientInfo(CrashGenerationServer* crash_server, ClientInfo::ClientInfo(CrashGenerationServer* crash_server,
DWORD pid, DWORD pid,
MINIDUMP_TYPE dump_type, MINIDUMP_TYPE dump_type,
DWORD* thread_id, DWORD* thread_id,
EXCEPTION_POINTERS** ex_info, EXCEPTION_POINTERS** ex_info,
MDRawAssertionInfo* assert_info) MDRawAssertionInfo* assert_info)
: crash_server_(crash_server), : crash_server_(crash_server),
pid_(pid), pid_(pid),
dump_type_(dump_type), dump_type_(dump_type),
ex_info_(ex_info), ex_info_(ex_info),
assert_info_(assert_info), assert_info_(assert_info),
thread_id_(thread_id), thread_id_(thread_id),
process_handle_(NULL), process_handle_(NULL),
dump_requested_handle_(NULL), dump_requested_handle_(NULL),
dump_generated_handle_(NULL), dump_generated_handle_(NULL),
dump_request_wait_handle_(NULL), dump_request_wait_handle_(NULL),
process_exit_wait_handle_(NULL) { process_exit_wait_handle_(NULL) {
} }
bool ClientInfo::Initialize() { bool ClientInfo::Initialize() {
process_handle_ = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid_); process_handle_ = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid_);
if (!process_handle_) { if (!process_handle_) {
return false; return false;
} }
dump_requested_handle_ = CreateEvent(NULL, // Security attributes. dump_requested_handle_ = CreateEvent(NULL, // Security attributes.
TRUE, // Manual reset. TRUE, // Manual reset.
FALSE, // Initial state. FALSE, // Initial state.
NULL); // Name. NULL); // Name.
if (!dump_requested_handle_) { if (!dump_requested_handle_) {
return false; return false;
} }
dump_generated_handle_ = CreateEvent(NULL, // Security attributes. dump_generated_handle_ = CreateEvent(NULL, // Security attributes.
TRUE, // Manual reset. TRUE, // Manual reset.
FALSE, // Initial state. FALSE, // Initial state.
NULL); // Name. NULL); // Name.
return dump_generated_handle_ != NULL; return dump_generated_handle_ != NULL;
} }
ClientInfo::~ClientInfo() { ClientInfo::~ClientInfo() {
if (process_handle_) { if (process_handle_) {
CloseHandle(process_handle_); CloseHandle(process_handle_);
} }
if (dump_requested_handle_) { if (dump_requested_handle_) {
CloseHandle(dump_requested_handle_); CloseHandle(dump_requested_handle_);
} }
if (dump_generated_handle_) { if (dump_generated_handle_) {
CloseHandle(dump_generated_handle_); CloseHandle(dump_generated_handle_);
} }
if (dump_request_wait_handle_) { if (dump_request_wait_handle_) {
// Wait for callbacks that might already be running to finish. // Wait for callbacks that might already be running to finish.
UnregisterWaitEx(dump_request_wait_handle_, INVALID_HANDLE_VALUE); UnregisterWaitEx(dump_request_wait_handle_, INVALID_HANDLE_VALUE);
} }
if (process_exit_wait_handle_) { if (process_exit_wait_handle_) {
// Wait for the callback that might already be running to finish. // Wait for the callback that might already be running to finish.
UnregisterWaitEx(process_exit_wait_handle_, INVALID_HANDLE_VALUE); UnregisterWaitEx(process_exit_wait_handle_, INVALID_HANDLE_VALUE);
} }
} }
bool ClientInfo::UnregisterWaits() { bool ClientInfo::UnregisterWaits() {
bool success = true; bool success = true;
if (dump_request_wait_handle_) { if (dump_request_wait_handle_) {
if (!UnregisterWait(dump_request_wait_handle_)) { if (!UnregisterWait(dump_request_wait_handle_)) {
success = false; success = false;
} else { } else {
dump_request_wait_handle_ = NULL; dump_request_wait_handle_ = NULL;
} }
} }
if (process_exit_wait_handle_) { if (process_exit_wait_handle_) {
if (!UnregisterWait(process_exit_wait_handle_)) { if (!UnregisterWait(process_exit_wait_handle_)) {
success = false; success = false;
} else { } else {
process_exit_wait_handle_ = NULL; process_exit_wait_handle_ = NULL;
} }
} }
return success; return success;
} }
bool ClientInfo::GetClientExceptionInfo( bool ClientInfo::GetClientExceptionInfo(
EXCEPTION_POINTERS** ex_info) const { EXCEPTION_POINTERS** ex_info) const {
SIZE_T bytes_count = 0; SIZE_T bytes_count = 0;
if (!ReadProcessMemory(process_handle_, if (!ReadProcessMemory(process_handle_,
ex_info_, ex_info_,
ex_info, ex_info,
sizeof(*ex_info), sizeof(*ex_info),
&bytes_count)) { &bytes_count)) {
return false; return false;
} }
return bytes_count == sizeof(*ex_info); return bytes_count == sizeof(*ex_info);
} }
bool ClientInfo::GetClientThreadId(DWORD* thread_id) const { bool ClientInfo::GetClientThreadId(DWORD* thread_id) const {
SIZE_T bytes_count = 0; SIZE_T bytes_count = 0;
if (!ReadProcessMemory(process_handle_, if (!ReadProcessMemory(process_handle_,
thread_id_, thread_id_,
thread_id, thread_id,
sizeof(*thread_id), sizeof(*thread_id),
&bytes_count)) { &bytes_count)) {
return false; return false;
} }
return bytes_count == sizeof(*thread_id); return bytes_count == sizeof(*thread_id);
} }
} // namespace google_breakpad } // namespace google_breakpad

View file

@ -1,145 +1,145 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ #ifndef CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__
#define CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ #define CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__
#include <Windows.h> #include <Windows.h>
#include <DbgHelp.h> #include <DbgHelp.h>
#include "google_breakpad/common/minidump_format.h" #include "google_breakpad/common/minidump_format.h"
namespace google_breakpad { namespace google_breakpad {
class CrashGenerationServer; class CrashGenerationServer;
// Abstraction for a crash client process. // Abstraction for a crash client process.
class ClientInfo { class ClientInfo {
public: public:
// Creates an instance with the given values. Gets the process // Creates an instance with the given values. Gets the process
// handle for the given process id and creates necessary event // handle for the given process id and creates necessary event
// objects. // objects.
ClientInfo(CrashGenerationServer* crash_server, ClientInfo(CrashGenerationServer* crash_server,
DWORD pid, DWORD pid,
MINIDUMP_TYPE dump_type, MINIDUMP_TYPE dump_type,
DWORD* thread_id, DWORD* thread_id,
EXCEPTION_POINTERS** ex_info, EXCEPTION_POINTERS** ex_info,
MDRawAssertionInfo* assert_info); MDRawAssertionInfo* assert_info);
~ClientInfo(); ~ClientInfo();
CrashGenerationServer* crash_server() const { return crash_server_; } CrashGenerationServer* crash_server() const { return crash_server_; }
DWORD pid() const { return pid_; } DWORD pid() const { return pid_; }
MINIDUMP_TYPE dump_type() const { return dump_type_; } MINIDUMP_TYPE dump_type() const { return dump_type_; }
EXCEPTION_POINTERS** ex_info() const { return ex_info_; } EXCEPTION_POINTERS** ex_info() const { return ex_info_; }
MDRawAssertionInfo* assert_info() const { return assert_info_; } MDRawAssertionInfo* assert_info() const { return assert_info_; }
DWORD* thread_id() const { return thread_id_; } DWORD* thread_id() const { return thread_id_; }
HANDLE process_handle() const { return process_handle_; } HANDLE process_handle() const { return process_handle_; }
HANDLE dump_requested_handle() const { return dump_requested_handle_; } HANDLE dump_requested_handle() const { return dump_requested_handle_; }
HANDLE dump_generated_handle() const { return dump_generated_handle_; } HANDLE dump_generated_handle() const { return dump_generated_handle_; }
HANDLE dump_request_wait_handle() const { HANDLE dump_request_wait_handle() const {
return dump_request_wait_handle_; return dump_request_wait_handle_;
} }
void set_dump_request_wait_handle(HANDLE value) { void set_dump_request_wait_handle(HANDLE value) {
dump_request_wait_handle_ = value; dump_request_wait_handle_ = value;
} }
HANDLE process_exit_wait_handle() const { HANDLE process_exit_wait_handle() const {
return process_exit_wait_handle_; return process_exit_wait_handle_;
} }
void set_process_exit_wait_handle(HANDLE value) { void set_process_exit_wait_handle(HANDLE value) {
process_exit_wait_handle_ = value; process_exit_wait_handle_ = value;
} }
// Unregister all waits for the client. // Unregister all waits for the client.
bool UnregisterWaits(); bool UnregisterWaits();
bool Initialize(); bool Initialize();
bool GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const; bool GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const;
bool GetClientThreadId(DWORD* thread_id) const; bool GetClientThreadId(DWORD* thread_id) const;
private: private:
// Crash generation server. // Crash generation server.
CrashGenerationServer* crash_server_; CrashGenerationServer* crash_server_;
// Client process ID. // Client process ID.
DWORD pid_; DWORD pid_;
// Dump type requested by the client. // Dump type requested by the client.
MINIDUMP_TYPE dump_type_; MINIDUMP_TYPE dump_type_;
// Address of an EXCEPTION_POINTERS* variable in the client // Address of an EXCEPTION_POINTERS* variable in the client
// process address space that will point to an instance of // process address space that will point to an instance of
// EXCEPTION_POINTERS containing information about crash. // EXCEPTION_POINTERS containing information about crash.
// //
// WARNING: Do not dereference these pointers as they are pointers // WARNING: Do not dereference these pointers as they are pointers
// in the address space of another process. // in the address space of another process.
EXCEPTION_POINTERS** ex_info_; EXCEPTION_POINTERS** ex_info_;
// Address of an instance of MDRawAssertionInfo in the client // Address of an instance of MDRawAssertionInfo in the client
// process address space that will contain information about // process address space that will contain information about
// non-exception related crashes like invalid parameter assertion // non-exception related crashes like invalid parameter assertion
// failures and pure calls. // failures and pure calls.
// //
// WARNING: Do not dereference these pointers as they are pointers // WARNING: Do not dereference these pointers as they are pointers
// in the address space of another process. // in the address space of another process.
MDRawAssertionInfo* assert_info_; MDRawAssertionInfo* assert_info_;
// Address of a variable in the client process address space that // Address of a variable in the client process address space that
// will contain the thread id of the crashing client thread. // will contain the thread id of the crashing client thread.
// //
// WARNING: Do not dereference these pointers as they are pointers // WARNING: Do not dereference these pointers as they are pointers
// in the address space of another process. // in the address space of another process.
DWORD* thread_id_; DWORD* thread_id_;
// Client process handle. // Client process handle.
HANDLE process_handle_; HANDLE process_handle_;
// Dump request event handle. // Dump request event handle.
HANDLE dump_requested_handle_; HANDLE dump_requested_handle_;
// Dump generated event handle. // Dump generated event handle.
HANDLE dump_generated_handle_; HANDLE dump_generated_handle_;
// Wait handle for dump request event. // Wait handle for dump request event.
HANDLE dump_request_wait_handle_; HANDLE dump_request_wait_handle_;
// Wait handle for process exit event. // Wait handle for process exit event.
HANDLE process_exit_wait_handle_; HANDLE process_exit_wait_handle_;
// Disallow copy ctor and operator=. // Disallow copy ctor and operator=.
ClientInfo(const ClientInfo& client_info); ClientInfo(const ClientInfo& client_info);
ClientInfo& operator=(const ClientInfo& client_info); ClientInfo& operator=(const ClientInfo& client_info);
}; };
} // namespace google_breakpad } // namespace google_breakpad
#endif // CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ #endif // CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__

View file

@ -1,343 +1,343 @@
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8.00"
Name="crash_generation" Name="crash_generation"
ProjectGUID="{A820AF62-6239-4693-8430-4F516C1838F4}" ProjectGUID="{A820AF62-6239-4693-8430-4F516C1838F4}"
RootNamespace="CrashGenerationServer" RootNamespace="CrashGenerationServer"
Keyword="Win32Proj" Keyword="Win32Proj"
> >
<Platforms> <Platforms>
<Platform <Platform
Name="Win32" Name="Win32"
/> />
</Platforms> </Platforms>
<ToolFiles> <ToolFiles>
</ToolFiles> </ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0500" PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0500"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="3" RuntimeLibrary="3"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="4" WarningLevel="4"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
WholeProgramOptimization="1" WholeProgramOptimization="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0500" PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0500"
RuntimeLibrary="2" RuntimeLibrary="2"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="4" WarningLevel="4"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="DebugStaticCRT|Win32" Name="DebugStaticCRT|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0500" PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0500"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="4" WarningLevel="4"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="ReleaseStaticCRT|Win32" Name="ReleaseStaticCRT|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
WholeProgramOptimization="1" WholeProgramOptimization="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0500" PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN;_WIN32_WINNT=0x0500"
RuntimeLibrary="0" RuntimeLibrary="0"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="4" WarningLevel="4"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
</References> </References>
<Files> <Files>
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
> >
<File <File
RelativePath=".\client_info.cc" RelativePath=".\client_info.cc"
> >
</File> </File>
<File <File
RelativePath=".\crash_generation_client.cc" RelativePath=".\crash_generation_client.cc"
> >
</File> </File>
<File <File
RelativePath=".\crash_generation_server.cc" RelativePath=".\crash_generation_server.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\guid_string.cc" RelativePath="..\..\..\common\windows\guid_string.cc"
> >
</File> </File>
<File <File
RelativePath=".\minidump_generator.cc" RelativePath=".\minidump_generator.cc"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
> >
<File <File
RelativePath="..\common\auto_critical_section.h" RelativePath="..\common\auto_critical_section.h"
> >
</File> </File>
<File <File
RelativePath=".\client_info.h" RelativePath=".\client_info.h"
> >
</File> </File>
<File <File
RelativePath=".\crash_generation_client.h" RelativePath=".\crash_generation_client.h"
> >
</File> </File>
<File <File
RelativePath=".\crash_generation_server.h" RelativePath=".\crash_generation_server.h"
> >
</File> </File>
<File <File
RelativePath="..\common\ipc_protocol.h" RelativePath="..\common\ipc_protocol.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\google_breakpad\common\minidump_format.h" RelativePath="..\..\..\google_breakpad\common\minidump_format.h"
> >
</File> </File>
<File <File
RelativePath=".\minidump_generator.h" RelativePath=".\minidump_generator.h"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
> >
</Filter> </Filter>
<File <File
RelativePath=".\ReadMe.txt" RelativePath=".\ReadMe.txt"
> >
</File> </File>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>
</VisualStudioProject> </VisualStudioProject>

View file

@ -1,329 +1,329 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "client/windows/crash_generation/crash_generation_client.h" #include "client/windows/crash_generation/crash_generation_client.h"
#include <cassert> #include <cassert>
#include "client/windows/common/ipc_protocol.h" #include "client/windows/common/ipc_protocol.h"
namespace google_breakpad { namespace google_breakpad {
const int kPipeBusyWaitTimeoutMs = 2000; const int kPipeBusyWaitTimeoutMs = 2000;
#ifdef _DEBUG #ifdef _DEBUG
const DWORD kWaitForServerTimeoutMs = INFINITE; const DWORD kWaitForServerTimeoutMs = INFINITE;
#else #else
const DWORD kWaitForServerTimeoutMs = 15000; const DWORD kWaitForServerTimeoutMs = 15000;
#endif #endif
const int kPipeConnectMaxAttempts = 2; const int kPipeConnectMaxAttempts = 2;
const DWORD kPipeDesiredAccess = FILE_READ_DATA | const DWORD kPipeDesiredAccess = FILE_READ_DATA |
FILE_WRITE_DATA | FILE_WRITE_DATA |
FILE_WRITE_ATTRIBUTES; FILE_WRITE_ATTRIBUTES;
const DWORD kPipeFlagsAndAttributes = SECURITY_IDENTIFICATION | const DWORD kPipeFlagsAndAttributes = SECURITY_IDENTIFICATION |
SECURITY_SQOS_PRESENT; SECURITY_SQOS_PRESENT;
const DWORD kPipeMode = PIPE_READMODE_MESSAGE; const DWORD kPipeMode = PIPE_READMODE_MESSAGE;
const size_t kWaitEventCount = 2; const size_t kWaitEventCount = 2;
// This function is orphan for production code. It can be used // This function is orphan for production code. It can be used
// for debugging to help repro some scenarios like the client // for debugging to help repro some scenarios like the client
// is slow in writing to the pipe after connecting, the client // is slow in writing to the pipe after connecting, the client
// is slow in reading from the pipe after writing, etc. The parameter // is slow in reading from the pipe after writing, etc. The parameter
// overlapped below is not used and it is present to match the signature // overlapped below is not used and it is present to match the signature
// of this function to TransactNamedPipe Win32 API. Uncomment if needed // of this function to TransactNamedPipe Win32 API. Uncomment if needed
// for debugging. // for debugging.
/** /**
static bool TransactNamedPipeDebugHelper(HANDLE pipe, static bool TransactNamedPipeDebugHelper(HANDLE pipe,
const void* in_buffer, const void* in_buffer,
DWORD in_size, DWORD in_size,
void* out_buffer, void* out_buffer,
DWORD out_size, DWORD out_size,
DWORD* bytes_count, DWORD* bytes_count,
LPOVERLAPPED) { LPOVERLAPPED) {
// Uncomment the next sleep to create a gap before writing // Uncomment the next sleep to create a gap before writing
// to pipe. // to pipe.
// Sleep(5000); // Sleep(5000);
if (!WriteFile(pipe, if (!WriteFile(pipe,
in_buffer, in_buffer,
in_size, in_size,
bytes_count, bytes_count,
NULL)) { NULL)) {
return false; return false;
} }
// Uncomment the next sleep to create a gap between write // Uncomment the next sleep to create a gap between write
// and read. // and read.
// Sleep(5000); // Sleep(5000);
return ReadFile(pipe, out_buffer, out_size, bytes_count, NULL) != FALSE; return ReadFile(pipe, out_buffer, out_size, bytes_count, NULL) != FALSE;
} }
**/ **/
CrashGenerationClient::CrashGenerationClient(const wchar_t* pipe_name, CrashGenerationClient::CrashGenerationClient(const wchar_t* pipe_name,
MINIDUMP_TYPE dump_type) MINIDUMP_TYPE dump_type)
: pipe_name_(pipe_name), : pipe_name_(pipe_name),
dump_type_(dump_type), dump_type_(dump_type),
thread_id_(0), thread_id_(0),
server_process_id_(0), server_process_id_(0),
crash_event_(NULL), crash_event_(NULL),
crash_generated_(NULL), crash_generated_(NULL),
server_alive_(NULL), server_alive_(NULL),
exception_pointers_(NULL) { exception_pointers_(NULL) {
memset(&assert_info_, 0, sizeof(assert_info_)); memset(&assert_info_, 0, sizeof(assert_info_));
} }
CrashGenerationClient::~CrashGenerationClient() { CrashGenerationClient::~CrashGenerationClient() {
if (crash_event_) { if (crash_event_) {
CloseHandle(crash_event_); CloseHandle(crash_event_);
} }
if (crash_generated_) { if (crash_generated_) {
CloseHandle(crash_generated_); CloseHandle(crash_generated_);
} }
if (server_alive_) { if (server_alive_) {
CloseHandle(server_alive_); CloseHandle(server_alive_);
} }
} }
// Performs the registration step with the server process. // Performs the registration step with the server process.
// The registration step involves communicating with the server // The registration step involves communicating with the server
// via a named pipe. The client sends the following pieces of // via a named pipe. The client sends the following pieces of
// data to the server: // data to the server:
// //
// * Message tag indicating the client is requesting registration. // * Message tag indicating the client is requesting registration.
// * Process id of the client process. // * Process id of the client process.
// * Address of a DWORD variable in the client address space // * Address of a DWORD variable in the client address space
// that will contain the thread id of the client thread that // that will contain the thread id of the client thread that
// caused the crash. // caused the crash.
// * Address of a EXCEPTION_POINTERS* variable in the client // * Address of a EXCEPTION_POINTERS* variable in the client
// address space that will point to an instance of EXCEPTION_POINTERS // address space that will point to an instance of EXCEPTION_POINTERS
// when the crash happens. // when the crash happens.
// * Address of an instance of MDRawAssertionInfo that will contain // * Address of an instance of MDRawAssertionInfo that will contain
// relevant information in case of non-exception crashes like assertion // relevant information in case of non-exception crashes like assertion
// failures and pure calls. // failures and pure calls.
// //
// In return the client expects the following information from the server: // In return the client expects the following information from the server:
// //
// * Message tag indicating successful registration. // * Message tag indicating successful registration.
// * Server process id. // * Server process id.
// * Handle to an object that client can signal to request dump // * Handle to an object that client can signal to request dump
// generation from the server. // generation from the server.
// * Handle to an object that client can wait on after requesting // * Handle to an object that client can wait on after requesting
// dump generation for the server to finish dump generation. // dump generation for the server to finish dump generation.
// * Handle to a mutex object that client can wait on to make sure // * Handle to a mutex object that client can wait on to make sure
// server is still alive. // server is still alive.
// //
// If any step of the expected behavior mentioned above fails, the // If any step of the expected behavior mentioned above fails, the
// registration step is not considered successful and hence out-of-process // registration step is not considered successful and hence out-of-process
// dump generation service is not available. // dump generation service is not available.
// //
// Returns true if the registration is successful; false otherwise. // Returns true if the registration is successful; false otherwise.
bool CrashGenerationClient::Register() { bool CrashGenerationClient::Register() {
HANDLE pipe = ConnectToServer(); HANDLE pipe = ConnectToServer();
if (!pipe) { if (!pipe) {
return false; return false;
} }
bool success = RegisterClient(pipe); bool success = RegisterClient(pipe);
CloseHandle(pipe); CloseHandle(pipe);
return success; return success;
} }
HANDLE CrashGenerationClient::ConnectToServer() { HANDLE CrashGenerationClient::ConnectToServer() {
HANDLE pipe = ConnectToPipe(pipe_name_.c_str(), HANDLE pipe = ConnectToPipe(pipe_name_.c_str(),
kPipeDesiredAccess, kPipeDesiredAccess,
kPipeFlagsAndAttributes); kPipeFlagsAndAttributes);
if (!pipe) { if (!pipe) {
return NULL; return NULL;
} }
DWORD mode = kPipeMode; DWORD mode = kPipeMode;
if (!SetNamedPipeHandleState(pipe, &mode, NULL, NULL)) { if (!SetNamedPipeHandleState(pipe, &mode, NULL, NULL)) {
CloseHandle(pipe); CloseHandle(pipe);
pipe = NULL; pipe = NULL;
} }
return pipe; return pipe;
} }
bool CrashGenerationClient::RegisterClient(HANDLE pipe) { bool CrashGenerationClient::RegisterClient(HANDLE pipe) {
ProtocolMessage msg(MESSAGE_TAG_REGISTRATION_REQUEST, ProtocolMessage msg(MESSAGE_TAG_REGISTRATION_REQUEST,
GetCurrentProcessId(), GetCurrentProcessId(),
dump_type_, dump_type_,
&thread_id_, &thread_id_,
&exception_pointers_, &exception_pointers_,
&assert_info_, &assert_info_,
NULL, NULL,
NULL, NULL,
NULL); NULL);
ProtocolMessage reply; ProtocolMessage reply;
DWORD bytes_count = 0; DWORD bytes_count = 0;
// The call to TransactNamedPipe below can be changed to a call // The call to TransactNamedPipe below can be changed to a call
// to TransactNamedPipeDebugHelper to help repro some scenarios. // to TransactNamedPipeDebugHelper to help repro some scenarios.
// For details see comments for TransactNamedPipeDebugHelper. // For details see comments for TransactNamedPipeDebugHelper.
if (!TransactNamedPipe(pipe, if (!TransactNamedPipe(pipe,
&msg, &msg,
sizeof(msg), sizeof(msg),
&reply, &reply,
sizeof(ProtocolMessage), sizeof(ProtocolMessage),
&bytes_count, &bytes_count,
NULL)) { NULL)) {
return false; return false;
} }
if (!ValidateResponse(reply)) { if (!ValidateResponse(reply)) {
return false; return false;
} }
ProtocolMessage ack_msg; ProtocolMessage ack_msg;
ack_msg.tag = MESSAGE_TAG_REGISTRATION_ACK; ack_msg.tag = MESSAGE_TAG_REGISTRATION_ACK;
if (!WriteFile(pipe, &ack_msg, sizeof(ack_msg), &bytes_count, NULL)) { if (!WriteFile(pipe, &ack_msg, sizeof(ack_msg), &bytes_count, NULL)) {
return false; return false;
} }
crash_event_ = reply.dump_request_handle; crash_event_ = reply.dump_request_handle;
crash_generated_ = reply.dump_generated_handle; crash_generated_ = reply.dump_generated_handle;
server_alive_ = reply.server_alive_handle; server_alive_ = reply.server_alive_handle;
server_process_id_ = reply.pid; server_process_id_ = reply.pid;
return true; return true;
} }
HANDLE CrashGenerationClient::ConnectToPipe(const wchar_t* pipe_name, HANDLE CrashGenerationClient::ConnectToPipe(const wchar_t* pipe_name,
DWORD pipe_access, DWORD pipe_access,
DWORD flags_attrs) { DWORD flags_attrs) {
for (int i = 0; i < kPipeConnectMaxAttempts; ++i) { for (int i = 0; i < kPipeConnectMaxAttempts; ++i) {
HANDLE pipe = CreateFile(pipe_name, HANDLE pipe = CreateFile(pipe_name,
pipe_access, pipe_access,
0, 0,
NULL, NULL,
OPEN_EXISTING, OPEN_EXISTING,
flags_attrs, flags_attrs,
NULL); NULL);
if (pipe != INVALID_HANDLE_VALUE) { if (pipe != INVALID_HANDLE_VALUE) {
return pipe; return pipe;
} }
// Cannot continue retrying if error is something other than // Cannot continue retrying if error is something other than
// ERROR_PIPE_BUSY. // ERROR_PIPE_BUSY.
if (GetLastError() != ERROR_PIPE_BUSY) { if (GetLastError() != ERROR_PIPE_BUSY) {
break; break;
} }
// Cannot continue retrying if wait on pipe fails. // Cannot continue retrying if wait on pipe fails.
if (!WaitNamedPipe(pipe_name, kPipeBusyWaitTimeoutMs)) { if (!WaitNamedPipe(pipe_name, kPipeBusyWaitTimeoutMs)) {
break; break;
} }
} }
return NULL; return NULL;
} }
bool CrashGenerationClient::ValidateResponse( bool CrashGenerationClient::ValidateResponse(
const ProtocolMessage& msg) const { const ProtocolMessage& msg) const {
return (msg.tag == MESSAGE_TAG_REGISTRATION_RESPONSE) && return (msg.tag == MESSAGE_TAG_REGISTRATION_RESPONSE) &&
(msg.pid != 0) && (msg.pid != 0) &&
(msg.dump_request_handle != NULL) && (msg.dump_request_handle != NULL) &&
(msg.dump_generated_handle != NULL) && (msg.dump_generated_handle != NULL) &&
(msg.server_alive_handle != NULL); (msg.server_alive_handle != NULL);
} }
bool CrashGenerationClient::IsRegistered() const { bool CrashGenerationClient::IsRegistered() const {
return crash_event_ != NULL; return crash_event_ != NULL;
} }
bool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info) { bool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info) {
if (!IsRegistered()) { if (!IsRegistered()) {
return false; return false;
} }
exception_pointers_ = ex_info; exception_pointers_ = ex_info;
thread_id_ = GetCurrentThreadId(); thread_id_ = GetCurrentThreadId();
assert_info_.line = 0; assert_info_.line = 0;
assert_info_.type = 0; assert_info_.type = 0;
assert_info_.expression[0] = 0; assert_info_.expression[0] = 0;
assert_info_.file[0] = 0; assert_info_.file[0] = 0;
assert_info_.function[0] = 0; assert_info_.function[0] = 0;
return SignalCrashEventAndWait(); return SignalCrashEventAndWait();
} }
bool CrashGenerationClient::RequestDump(MDRawAssertionInfo* assert_info) { bool CrashGenerationClient::RequestDump(MDRawAssertionInfo* assert_info) {
if (!IsRegistered()) { if (!IsRegistered()) {
return false; return false;
} }
exception_pointers_ = NULL; exception_pointers_ = NULL;
if (assert_info) { if (assert_info) {
memcpy(&assert_info_, assert_info, sizeof(assert_info_)); memcpy(&assert_info_, assert_info, sizeof(assert_info_));
} else { } else {
memset(&assert_info_, 0, sizeof(assert_info_)); memset(&assert_info_, 0, sizeof(assert_info_));
} }
thread_id_ = GetCurrentThreadId(); thread_id_ = GetCurrentThreadId();
return SignalCrashEventAndWait(); return SignalCrashEventAndWait();
} }
bool CrashGenerationClient::SignalCrashEventAndWait() { bool CrashGenerationClient::SignalCrashEventAndWait() {
assert(crash_event_); assert(crash_event_);
assert(crash_generated_); assert(crash_generated_);
assert(server_alive_); assert(server_alive_);
// Reset the dump generated event before signaling the crash // Reset the dump generated event before signaling the crash
// event so that the server can set the dump generated event // event so that the server can set the dump generated event
// once it is done generating the event. // once it is done generating the event.
if (!ResetEvent(crash_generated_)) { if (!ResetEvent(crash_generated_)) {
return false; return false;
} }
if (!SetEvent(crash_event_)) { if (!SetEvent(crash_event_)) {
return false; return false;
} }
HANDLE wait_handles[kWaitEventCount] = {crash_generated_, server_alive_}; HANDLE wait_handles[kWaitEventCount] = {crash_generated_, server_alive_};
DWORD result = WaitForMultipleObjects(kWaitEventCount, DWORD result = WaitForMultipleObjects(kWaitEventCount,
wait_handles, wait_handles,
FALSE, FALSE,
kWaitForServerTimeoutMs); kWaitForServerTimeoutMs);
// Crash dump was successfully generated only if the server // Crash dump was successfully generated only if the server
// signaled the crash generated event. // signaled the crash generated event.
return result == WAIT_OBJECT_0; return result == WAIT_OBJECT_0;
} }
} // namespace google_breakpad } // namespace google_breakpad

View file

@ -1,151 +1,151 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ #ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__
#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ #define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__
#include <windows.h> #include <windows.h>
#include <dbghelp.h> #include <dbghelp.h>
#include <string> #include <string>
#include "client/windows/common/ipc_protocol.h" #include "client/windows/common/ipc_protocol.h"
namespace google_breakpad { namespace google_breakpad {
// Abstraction of client-side implementation of out of process // Abstraction of client-side implementation of out of process
// crash generation. // crash generation.
// //
// The process that desires to have out-of-process crash dump // The process that desires to have out-of-process crash dump
// generation service can use this class in the following way: // generation service can use this class in the following way:
// //
// * Create an instance. // * Create an instance.
// * Call Register method so that the client tries to register // * Call Register method so that the client tries to register
// with the server process and check the return value. If // with the server process and check the return value. If
// registration is not successful, out-of-process crash dump // registration is not successful, out-of-process crash dump
// generation will not be available // generation will not be available
// * Request dump generation by calling either of the two // * Request dump generation by calling either of the two
// overloaded RequestDump methods - one in case of exceptions // overloaded RequestDump methods - one in case of exceptions
// and the other in case of assertion failures // and the other in case of assertion failures
// //
// Note that it is the responsibility of the client code of // Note that it is the responsibility of the client code of
// this class to set the unhandled exception filter with the // this class to set the unhandled exception filter with the
// system by calling the SetUnhandledExceptionFilter function // system by calling the SetUnhandledExceptionFilter function
// and the client code should explicitly request dump generation. // and the client code should explicitly request dump generation.
class CrashGenerationClient { class CrashGenerationClient {
public: public:
CrashGenerationClient(const wchar_t* pipe_name, CrashGenerationClient(const wchar_t* pipe_name,
MINIDUMP_TYPE dump_type); MINIDUMP_TYPE dump_type);
~CrashGenerationClient(); ~CrashGenerationClient();
// Registers the client process with the crash server. // Registers the client process with the crash server.
// //
// Returns true if the registration is successful; false otherwise. // Returns true if the registration is successful; false otherwise.
bool Register(); bool Register();
// Requests the crash server to generate a dump with the given // Requests the crash server to generate a dump with the given
// exception information. // exception information.
// //
// Returns true if the dump was successful; false otherwise. Note that // Returns true if the dump was successful; false otherwise. Note that
// if the registration step was not performed or it was not successful, // if the registration step was not performed or it was not successful,
// false will be returned. // false will be returned.
bool RequestDump(EXCEPTION_POINTERS* ex_info); bool RequestDump(EXCEPTION_POINTERS* ex_info);
// Requests the crash server to generate a dump with the given // Requests the crash server to generate a dump with the given
// assertion information. // assertion information.
// //
// Returns true if the dump was successful; false otherwise. Note that // Returns true if the dump was successful; false otherwise. Note that
// if the registration step was not performed or it was not successful, // if the registration step was not performed or it was not successful,
// false will be returned. // false will be returned.
bool RequestDump(MDRawAssertionInfo* assert_info); bool RequestDump(MDRawAssertionInfo* assert_info);
private: private:
// Connects to the appropriate pipe and sets the pipe handle state. // Connects to the appropriate pipe and sets the pipe handle state.
// //
// Returns the pipe handle if everything goes well; otherwise Returns NULL. // Returns the pipe handle if everything goes well; otherwise Returns NULL.
HANDLE ConnectToServer(); HANDLE ConnectToServer();
// Performs a handshake with the server over the given pipe which should be // Performs a handshake with the server over the given pipe which should be
// already connected to the server. // already connected to the server.
// //
// Returns true if handshake with the server was successful; false otherwise. // Returns true if handshake with the server was successful; false otherwise.
bool RegisterClient(HANDLE pipe); bool RegisterClient(HANDLE pipe);
// Validates the given server response. // Validates the given server response.
bool ValidateResponse(const ProtocolMessage& msg) const; bool ValidateResponse(const ProtocolMessage& msg) const;
// Returns true if the registration step succeeded; false otherwise. // Returns true if the registration step succeeded; false otherwise.
bool IsRegistered() const; bool IsRegistered() const;
// Connects to the given named pipe with given parameters. // Connects to the given named pipe with given parameters.
// //
// Returns true if the connection is successful; false otherwise. // Returns true if the connection is successful; false otherwise.
HANDLE ConnectToPipe(const wchar_t* pipe_name, HANDLE ConnectToPipe(const wchar_t* pipe_name,
DWORD pipe_access, DWORD pipe_access,
DWORD flags_attrs); DWORD flags_attrs);
// Signals the crash event and wait for the server to generate crash. // Signals the crash event and wait for the server to generate crash.
bool SignalCrashEventAndWait(); bool SignalCrashEventAndWait();
// Pipe name to use to talk to server. // Pipe name to use to talk to server.
std::wstring pipe_name_; std::wstring pipe_name_;
// Type of dump to generate. // Type of dump to generate.
MINIDUMP_TYPE dump_type_; MINIDUMP_TYPE dump_type_;
// Event to signal in case of a crash. // Event to signal in case of a crash.
HANDLE crash_event_; HANDLE crash_event_;
// Handle to wait on after signaling a crash for the server // Handle to wait on after signaling a crash for the server
// to finish generating crash dump. // to finish generating crash dump.
HANDLE crash_generated_; HANDLE crash_generated_;
// Handle to a mutex that will become signaled with WAIT_ABANDONED // Handle to a mutex that will become signaled with WAIT_ABANDONED
// if the server process goes down. // if the server process goes down.
HANDLE server_alive_; HANDLE server_alive_;
// Server process id. // Server process id.
DWORD server_process_id_; DWORD server_process_id_;
// Id of the thread that caused the crash. // Id of the thread that caused the crash.
DWORD thread_id_; DWORD thread_id_;
// Exception pointers for an exception crash. // Exception pointers for an exception crash.
EXCEPTION_POINTERS* exception_pointers_; EXCEPTION_POINTERS* exception_pointers_;
// Assertion info for an invalid parameter or pure call crash. // Assertion info for an invalid parameter or pure call crash.
MDRawAssertionInfo assert_info_; MDRawAssertionInfo assert_info_;
// Disable copy ctor and operator=. // Disable copy ctor and operator=.
CrashGenerationClient(const CrashGenerationClient& crash_client); CrashGenerationClient(const CrashGenerationClient& crash_client);
CrashGenerationClient& operator=(const CrashGenerationClient& crash_client); CrashGenerationClient& operator=(const CrashGenerationClient& crash_client);
}; };
} // namespace google_breakpad } // namespace google_breakpad
#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ #endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__

File diff suppressed because it is too large Load diff

View file

@ -1,260 +1,260 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ #ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__
#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ #define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__
#include <list> #include <list>
#include <string> #include <string>
#include "client/windows/common/ipc_protocol.h" #include "client/windows/common/ipc_protocol.h"
#include "client/windows/crash_generation/client_info.h" #include "client/windows/crash_generation/client_info.h"
#include "client/windows/crash_generation/minidump_generator.h" #include "client/windows/crash_generation/minidump_generator.h"
#include "processor/scoped_ptr.h" #include "processor/scoped_ptr.h"
namespace google_breakpad { namespace google_breakpad {
// Abstraction for server side implementation of out-of-process crash // Abstraction for server side implementation of out-of-process crash
// generation protocol for Windows platform only. It generates Windows // generation protocol for Windows platform only. It generates Windows
// minidump files for client processes that request dump generation. When // minidump files for client processes that request dump generation. When
// the server is requested to start listening for clients (by calling the // the server is requested to start listening for clients (by calling the
// Start method), it creates a named pipe and waits for the clients to // Start method), it creates a named pipe and waits for the clients to
// register. In response, it hands them event handles that the client can // register. In response, it hands them event handles that the client can
// signal to request dump generation. When the clients request dump // signal to request dump generation. When the clients request dump
// generation in this way, the server generates Windows minidump files. // generation in this way, the server generates Windows minidump files.
class CrashGenerationServer { class CrashGenerationServer {
public: public:
typedef void (*OnClientConnectedCallback)(void* context, typedef void (*OnClientConnectedCallback)(void* context,
const ClientInfo* client_info); const ClientInfo* client_info);
typedef void (*OnClientDumpRequestCallback)(void* context, typedef void (*OnClientDumpRequestCallback)(void* context,
const ClientInfo* client_info); const ClientInfo* client_info);
typedef void (*OnClientExitedCallback)(void* context, typedef void (*OnClientExitedCallback)(void* context,
const ClientInfo* client_info); const ClientInfo* client_info);
// Creates an instance with the given parameters. // Creates an instance with the given parameters.
// //
// Parameter pipe_name: Name of the Windows Named pipe // Parameter pipe_name: Name of the Windows Named pipe
// Parameter connect_callback: Callback for a new client connection. // Parameter connect_callback: Callback for a new client connection.
// Parameter connect_context: Context for client connection callback. // Parameter connect_context: Context for client connection callback.
// Parameter crash_callback: Callback for a client crash dump request. // Parameter crash_callback: Callback for a client crash dump request.
// Parameter crash_context: Context for client crash dump request callback. // Parameter crash_context: Context for client crash dump request callback.
// Parameter exit_callback: Callback for client process exit. // Parameter exit_callback: Callback for client process exit.
// Parameter exit_context: Context for client exit callback. // Parameter exit_context: Context for client exit callback.
// Parameter generate_dumps: Whether to automatically generate dumps. // Parameter generate_dumps: Whether to automatically generate dumps.
// Client code of this class might want to generate dumps explicitly in the // Client code of this class might want to generate dumps explicitly in the
// crash dump request callback. In that case, false can be passed for this // crash dump request callback. In that case, false can be passed for this
// parameter. // parameter.
// Parameter dump_path: Path for generating dumps; required only if true is // Parameter dump_path: Path for generating dumps; required only if true is
// passed for generateDumps parameter; NULL can be passed otherwise. // passed for generateDumps parameter; NULL can be passed otherwise.
CrashGenerationServer(const std::wstring& pipe_name, CrashGenerationServer(const std::wstring& pipe_name,
OnClientConnectedCallback connect_callback, OnClientConnectedCallback connect_callback,
void* connect_context, void* connect_context,
OnClientDumpRequestCallback dump_callback, OnClientDumpRequestCallback dump_callback,
void* dump_context, void* dump_context,
OnClientExitedCallback exit_callback, OnClientExitedCallback exit_callback,
void* exit_context, void* exit_context,
bool generate_dumps, bool generate_dumps,
const std::wstring* dump_path); const std::wstring* dump_path);
~CrashGenerationServer(); ~CrashGenerationServer();
// Performs initialization steps needed to start listening to clients. // Performs initialization steps needed to start listening to clients.
// //
// Returns true if initialization is successful; false otherwise. // Returns true if initialization is successful; false otherwise.
bool Start(); bool Start();
private: private:
// Various states the client can be in during the handshake with // Various states the client can be in during the handshake with
// the server. // the server.
enum IPCServerState { enum IPCServerState {
// Server is in error state and it cannot serve any clients. // Server is in error state and it cannot serve any clients.
IPC_SERVER_STATE_ERROR, IPC_SERVER_STATE_ERROR,
// Server starts in this state. // Server starts in this state.
IPC_SERVER_STATE_INITIAL, IPC_SERVER_STATE_INITIAL,
// Server has issued an async connect to the pipe and it is waiting // Server has issued an async connect to the pipe and it is waiting
// for the connection to be established. // for the connection to be established.
IPC_SERVER_STATE_CONNECTING, IPC_SERVER_STATE_CONNECTING,
// Server is connected successfully. // Server is connected successfully.
IPC_SERVER_STATE_CONNECTED, IPC_SERVER_STATE_CONNECTED,
// Server has issued an async read from the pipe and it is waiting for // Server has issued an async read from the pipe and it is waiting for
// the read to finish. // the read to finish.
IPC_SERVER_STATE_READING, IPC_SERVER_STATE_READING,
// Server is done reading from the pipe. // Server is done reading from the pipe.
IPC_SERVER_STATE_READ_DONE, IPC_SERVER_STATE_READ_DONE,
// Server has issued an async write to the pipe and it is waiting for // Server has issued an async write to the pipe and it is waiting for
// the write to finish. // the write to finish.
IPC_SERVER_STATE_WRITING, IPC_SERVER_STATE_WRITING,
// Server is done writing to the pipe. // Server is done writing to the pipe.
IPC_SERVER_STATE_WRITE_DONE, IPC_SERVER_STATE_WRITE_DONE,
// Server has issued an async read from the pipe for an ack and it // Server has issued an async read from the pipe for an ack and it
// is waiting for the read to finish. // is waiting for the read to finish.
IPC_SERVER_STATE_READING_ACK, IPC_SERVER_STATE_READING_ACK,
// Server is done writing to the pipe and it is now ready to disconnect // Server is done writing to the pipe and it is now ready to disconnect
// and reconnect. // and reconnect.
IPC_SERVER_STATE_DISCONNECTING IPC_SERVER_STATE_DISCONNECTING
}; };
// //
// Helper methods to handle various server IPC states. // Helper methods to handle various server IPC states.
// //
void HandleErrorState(); void HandleErrorState();
void HandleInitialState(); void HandleInitialState();
void HandleConnectingState(); void HandleConnectingState();
void HandleConnectedState(); void HandleConnectedState();
void HandleReadingState(); void HandleReadingState();
void HandleReadDoneState(); void HandleReadDoneState();
void HandleWritingState(); void HandleWritingState();
void HandleWriteDoneState(); void HandleWriteDoneState();
void HandleReadingAckState(); void HandleReadingAckState();
void HandleDisconnectingState(); void HandleDisconnectingState();
// Prepares reply for a client from the given parameters. // Prepares reply for a client from the given parameters.
bool PrepareReply(const ClientInfo& client_info, bool PrepareReply(const ClientInfo& client_info,
ProtocolMessage* reply) const; ProtocolMessage* reply) const;
// Duplicates various handles in the ClientInfo object for the client // Duplicates various handles in the ClientInfo object for the client
// process and stores them in the given ProtocolMessage instance. If // process and stores them in the given ProtocolMessage instance. If
// creating any handle fails, ProtocolMessage will contain the handles // creating any handle fails, ProtocolMessage will contain the handles
// already created successfully, which should be closed by the caller. // already created successfully, which should be closed by the caller.
bool CreateClientHandles(const ClientInfo& client_info, bool CreateClientHandles(const ClientInfo& client_info,
ProtocolMessage* reply) const; ProtocolMessage* reply) const;
// Response to the given client. Return true if all steps of // Response to the given client. Return true if all steps of
// responding to the client succeed, false otherwise. // responding to the client succeed, false otherwise.
bool RespondToClient(ClientInfo* client_info); bool RespondToClient(ClientInfo* client_info);
// Handles a connection request from the client. // Handles a connection request from the client.
void HandleConnectionRequest(); void HandleConnectionRequest();
// Handles a dump request from the client. // Handles a dump request from the client.
void HandleDumpRequest(const ClientInfo& client_info); void HandleDumpRequest(const ClientInfo& client_info);
// Callback for pipe connected event. // Callback for pipe connected event.
static void CALLBACK OnPipeConnected(void* context, BOOLEAN timer_or_wait); static void CALLBACK OnPipeConnected(void* context, BOOLEAN timer_or_wait);
// Callback for a dump request. // Callback for a dump request.
static void CALLBACK OnDumpRequest(void* context, BOOLEAN timer_or_wait); static void CALLBACK OnDumpRequest(void* context, BOOLEAN timer_or_wait);
// Callback for client process exit event. // Callback for client process exit event.
static void CALLBACK OnClientEnd(void* context, BOOLEAN timer_or_wait); static void CALLBACK OnClientEnd(void* context, BOOLEAN timer_or_wait);
// Releases resources for a client. // Releases resources for a client.
static DWORD WINAPI CleanupClient(void* context); static DWORD WINAPI CleanupClient(void* context);
// Cleans up for the given client. // Cleans up for the given client.
void DoCleanup(ClientInfo* client_info); void DoCleanup(ClientInfo* client_info);
// Adds the given client to the list of registered clients. // Adds the given client to the list of registered clients.
bool AddClient(ClientInfo* client_info); bool AddClient(ClientInfo* client_info);
// Generates dump for the given client. // Generates dump for the given client.
bool GenerateDump(const ClientInfo& client); bool GenerateDump(const ClientInfo& client);
// Sync object for thread-safe access to the shared list of clients. // Sync object for thread-safe access to the shared list of clients.
CRITICAL_SECTION clients_sync_; CRITICAL_SECTION clients_sync_;
// List of clients. // List of clients.
std::list<ClientInfo*> clients_; std::list<ClientInfo*> clients_;
// Pipe name. // Pipe name.
std::wstring pipe_name_; std::wstring pipe_name_;
// Handle to the pipe used for handshake with clients. // Handle to the pipe used for handshake with clients.
HANDLE pipe_; HANDLE pipe_;
// Pipe wait handle. // Pipe wait handle.
HANDLE pipe_wait_handle_; HANDLE pipe_wait_handle_;
// Handle to server-alive mutex. // Handle to server-alive mutex.
HANDLE server_alive_handle_; HANDLE server_alive_handle_;
// Callback for a successful client connection. // Callback for a successful client connection.
OnClientConnectedCallback connect_callback_; OnClientConnectedCallback connect_callback_;
// Context for client connected callback. // Context for client connected callback.
void* connect_context_; void* connect_context_;
// Callback for a client dump request. // Callback for a client dump request.
OnClientDumpRequestCallback dump_callback_; OnClientDumpRequestCallback dump_callback_;
// Context for client dump request callback. // Context for client dump request callback.
void* dump_context_; void* dump_context_;
// Callback for client process exit. // Callback for client process exit.
OnClientExitedCallback exit_callback_; OnClientExitedCallback exit_callback_;
// Context for client process exit callback. // Context for client process exit callback.
void* exit_context_; void* exit_context_;
// Whether to generate dumps. // Whether to generate dumps.
bool generate_dumps_; bool generate_dumps_;
// Instance of a mini dump generator. // Instance of a mini dump generator.
scoped_ptr<MinidumpGenerator> dump_generator_; scoped_ptr<MinidumpGenerator> dump_generator_;
// State of the server in performing the IPC with the client. // State of the server in performing the IPC with the client.
// Note that since we restrict the pipe to one instance, we // Note that since we restrict the pipe to one instance, we
// only need to keep one state of the server. Otherwise, server // only need to keep one state of the server. Otherwise, server
// would have one state per client it is talking to. // would have one state per client it is talking to.
IPCServerState server_state_; IPCServerState server_state_;
// Whether the server is shutting down. // Whether the server is shutting down.
volatile bool shutting_down_; volatile bool shutting_down_;
// Overlapped instance for async I/O on the pipe. // Overlapped instance for async I/O on the pipe.
OVERLAPPED overlapped_; OVERLAPPED overlapped_;
// Message object used in IPC with the client. // Message object used in IPC with the client.
ProtocolMessage msg_; ProtocolMessage msg_;
// Client Info for the client that's connecting to the server. // Client Info for the client that's connecting to the server.
ClientInfo* client_info_; ClientInfo* client_info_;
// Count of clean-up work items that are currently running or are // Count of clean-up work items that are currently running or are
// already queued to run. // already queued to run.
volatile LONG cleanup_item_count_; volatile LONG cleanup_item_count_;
// Disable copy ctor and operator=. // Disable copy ctor and operator=.
CrashGenerationServer(const CrashGenerationServer& crash_server); CrashGenerationServer(const CrashGenerationServer& crash_server);
CrashGenerationServer& operator=(const CrashGenerationServer& crash_server); CrashGenerationServer& operator=(const CrashGenerationServer& crash_server);
}; };
} // namespace google_breakpad } // namespace google_breakpad
#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ #endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__

View file

@ -1,228 +1,228 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "client/windows/crash_generation/minidump_generator.h" #include "client/windows/crash_generation/minidump_generator.h"
#include <cassert> #include <cassert>
#include "client/windows/common/auto_critical_section.h" #include "client/windows/common/auto_critical_section.h"
#include "common/windows/guid_string.h" #include "common/windows/guid_string.h"
using std::wstring; using std::wstring;
namespace google_breakpad { namespace google_breakpad {
MinidumpGenerator::MinidumpGenerator(const wstring& dump_path) MinidumpGenerator::MinidumpGenerator(const wstring& dump_path)
: dbghelp_module_(NULL), : dbghelp_module_(NULL),
rpcrt4_module_(NULL), rpcrt4_module_(NULL),
dump_path_(dump_path), dump_path_(dump_path),
write_dump_(NULL), write_dump_(NULL),
create_uuid_(NULL) { create_uuid_(NULL) {
InitializeCriticalSection(&module_load_sync_); InitializeCriticalSection(&module_load_sync_);
InitializeCriticalSection(&get_proc_address_sync_); InitializeCriticalSection(&get_proc_address_sync_);
} }
MinidumpGenerator::~MinidumpGenerator() { MinidumpGenerator::~MinidumpGenerator() {
if (dbghelp_module_) { if (dbghelp_module_) {
FreeLibrary(dbghelp_module_); FreeLibrary(dbghelp_module_);
} }
if (rpcrt4_module_) { if (rpcrt4_module_) {
FreeLibrary(rpcrt4_module_); FreeLibrary(rpcrt4_module_);
} }
DeleteCriticalSection(&get_proc_address_sync_); DeleteCriticalSection(&get_proc_address_sync_);
DeleteCriticalSection(&module_load_sync_); DeleteCriticalSection(&module_load_sync_);
} }
bool MinidumpGenerator::WriteMinidump(HANDLE process_handle, bool MinidumpGenerator::WriteMinidump(HANDLE process_handle,
DWORD process_id, DWORD process_id,
DWORD thread_id, DWORD thread_id,
DWORD requesting_thread_id, DWORD requesting_thread_id,
EXCEPTION_POINTERS* exception_pointers, EXCEPTION_POINTERS* exception_pointers,
MDRawAssertionInfo* assert_info, MDRawAssertionInfo* assert_info,
MINIDUMP_TYPE dump_type, MINIDUMP_TYPE dump_type,
bool is_client_pointers) { bool is_client_pointers) {
MiniDumpWriteDumpType write_dump = GetWriteDump(); MiniDumpWriteDumpType write_dump = GetWriteDump();
if (!write_dump) { if (!write_dump) {
return false; return false;
} }
wstring dump_file_path; wstring dump_file_path;
if (!GenerateDumpFilePath(&dump_file_path)) { if (!GenerateDumpFilePath(&dump_file_path)) {
return false; return false;
} }
HANDLE dump_file = CreateFile(dump_file_path.c_str(), HANDLE dump_file = CreateFile(dump_file_path.c_str(),
GENERIC_WRITE, GENERIC_WRITE,
0, 0,
NULL, NULL,
CREATE_NEW, CREATE_NEW,
FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_NORMAL,
NULL); NULL);
if (dump_file == INVALID_HANDLE_VALUE) { if (dump_file == INVALID_HANDLE_VALUE) {
return false; return false;
} }
MINIDUMP_EXCEPTION_INFORMATION* dump_exception_pointers = NULL; MINIDUMP_EXCEPTION_INFORMATION* dump_exception_pointers = NULL;
MINIDUMP_EXCEPTION_INFORMATION dump_exception_info; MINIDUMP_EXCEPTION_INFORMATION dump_exception_info;
// Setup the exception information object only if it's a dump // Setup the exception information object only if it's a dump
// due to an exception. // due to an exception.
if (exception_pointers) { if (exception_pointers) {
dump_exception_pointers = &dump_exception_info; dump_exception_pointers = &dump_exception_info;
dump_exception_info.ThreadId = thread_id; dump_exception_info.ThreadId = thread_id;
dump_exception_info.ExceptionPointers = exception_pointers; dump_exception_info.ExceptionPointers = exception_pointers;
dump_exception_info.ClientPointers = is_client_pointers; dump_exception_info.ClientPointers = is_client_pointers;
} }
// Add an MDRawBreakpadInfo stream to the minidump, to provide additional // Add an MDRawBreakpadInfo stream to the minidump, to provide additional
// information about the exception handler to the Breakpad processor. // information about the exception handler to the Breakpad processor.
// The information will help the processor determine which threads are // The information will help the processor determine which threads are
// relevant. The Breakpad processor does not require this information but // relevant. The Breakpad processor does not require this information but
// can function better with Breakpad-generated dumps when it is present. // can function better with Breakpad-generated dumps when it is present.
// The native debugger is not harmed by the presence of this information. // The native debugger is not harmed by the presence of this information.
MDRawBreakpadInfo breakpad_info; MDRawBreakpadInfo breakpad_info;
breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID |
MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID;
breakpad_info.dump_thread_id = thread_id; breakpad_info.dump_thread_id = thread_id;
breakpad_info.requesting_thread_id = requesting_thread_id; breakpad_info.requesting_thread_id = requesting_thread_id;
// Leave room in user_stream_array for a possible assertion info stream. // Leave room in user_stream_array for a possible assertion info stream.
MINIDUMP_USER_STREAM user_stream_array[2]; MINIDUMP_USER_STREAM user_stream_array[2];
user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM; user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM;
user_stream_array[0].BufferSize = sizeof(breakpad_info); user_stream_array[0].BufferSize = sizeof(breakpad_info);
user_stream_array[0].Buffer = &breakpad_info; user_stream_array[0].Buffer = &breakpad_info;
MINIDUMP_USER_STREAM_INFORMATION user_streams; MINIDUMP_USER_STREAM_INFORMATION user_streams;
user_streams.UserStreamCount = 1; user_streams.UserStreamCount = 1;
user_streams.UserStreamArray = user_stream_array; user_streams.UserStreamArray = user_stream_array;
MDRawAssertionInfo* actual_assert_info = assert_info; MDRawAssertionInfo* actual_assert_info = assert_info;
MDRawAssertionInfo client_assert_info = {0}; MDRawAssertionInfo client_assert_info = {0};
if (assert_info) { if (assert_info) {
// If the assertion info object lives in the client process, // If the assertion info object lives in the client process,
// read the memory of the client process. // read the memory of the client process.
if (is_client_pointers) { if (is_client_pointers) {
SIZE_T bytes_read = 0; SIZE_T bytes_read = 0;
if (!ReadProcessMemory(process_handle, if (!ReadProcessMemory(process_handle,
assert_info, assert_info,
&client_assert_info, &client_assert_info,
sizeof(client_assert_info), sizeof(client_assert_info),
&bytes_read)) { &bytes_read)) {
CloseHandle(dump_file); CloseHandle(dump_file);
return false; return false;
} }
if (bytes_read != sizeof(client_assert_info)) { if (bytes_read != sizeof(client_assert_info)) {
CloseHandle(dump_file); CloseHandle(dump_file);
return false; return false;
} }
actual_assert_info = &client_assert_info; actual_assert_info = &client_assert_info;
} }
user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM; user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM;
user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo); user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo);
user_stream_array[1].Buffer = actual_assert_info; user_stream_array[1].Buffer = actual_assert_info;
++user_streams.UserStreamCount; ++user_streams.UserStreamCount;
} }
bool result = write_dump(process_handle, bool result = write_dump(process_handle,
process_id, process_id,
dump_file, dump_file,
dump_type, dump_type,
exception_pointers ? &dump_exception_info : NULL, exception_pointers ? &dump_exception_info : NULL,
&user_streams, &user_streams,
NULL) != FALSE; NULL) != FALSE;
CloseHandle(dump_file); CloseHandle(dump_file);
return result; return result;
} }
HMODULE MinidumpGenerator::GetDbghelpModule() { HMODULE MinidumpGenerator::GetDbghelpModule() {
AutoCriticalSection lock(&module_load_sync_); AutoCriticalSection lock(&module_load_sync_);
if (!dbghelp_module_) { if (!dbghelp_module_) {
dbghelp_module_ = LoadLibrary(TEXT("dbghelp.dll")); dbghelp_module_ = LoadLibrary(TEXT("dbghelp.dll"));
} }
return dbghelp_module_; return dbghelp_module_;
} }
MinidumpGenerator::MiniDumpWriteDumpType MinidumpGenerator::GetWriteDump() { MinidumpGenerator::MiniDumpWriteDumpType MinidumpGenerator::GetWriteDump() {
AutoCriticalSection lock(&get_proc_address_sync_); AutoCriticalSection lock(&get_proc_address_sync_);
if (!write_dump_) { if (!write_dump_) {
HMODULE module = GetDbghelpModule(); HMODULE module = GetDbghelpModule();
if (module) { if (module) {
FARPROC proc = GetProcAddress(module, "MiniDumpWriteDump"); FARPROC proc = GetProcAddress(module, "MiniDumpWriteDump");
write_dump_ = reinterpret_cast<MiniDumpWriteDumpType>(proc); write_dump_ = reinterpret_cast<MiniDumpWriteDumpType>(proc);
} }
} }
return write_dump_; return write_dump_;
} }
HMODULE MinidumpGenerator::GetRpcrt4Module() { HMODULE MinidumpGenerator::GetRpcrt4Module() {
AutoCriticalSection lock(&module_load_sync_); AutoCriticalSection lock(&module_load_sync_);
if (!rpcrt4_module_) { if (!rpcrt4_module_) {
rpcrt4_module_ = LoadLibrary(TEXT("rpcrt4.dll")); rpcrt4_module_ = LoadLibrary(TEXT("rpcrt4.dll"));
} }
return rpcrt4_module_; return rpcrt4_module_;
} }
MinidumpGenerator::UuidCreateType MinidumpGenerator::GetCreateUuid() { MinidumpGenerator::UuidCreateType MinidumpGenerator::GetCreateUuid() {
AutoCriticalSection lock(&module_load_sync_); AutoCriticalSection lock(&module_load_sync_);
if (!create_uuid_) { if (!create_uuid_) {
HMODULE module = GetRpcrt4Module(); HMODULE module = GetRpcrt4Module();
if (module) { if (module) {
FARPROC proc = GetProcAddress(module, "UuidCreate"); FARPROC proc = GetProcAddress(module, "UuidCreate");
create_uuid_ = reinterpret_cast<UuidCreateType>(proc); create_uuid_ = reinterpret_cast<UuidCreateType>(proc);
} }
} }
return create_uuid_; return create_uuid_;
} }
bool MinidumpGenerator::GenerateDumpFilePath(wstring* file_path) { bool MinidumpGenerator::GenerateDumpFilePath(wstring* file_path) {
UUID id = {0}; UUID id = {0};
UuidCreateType create_uuid = GetCreateUuid(); UuidCreateType create_uuid = GetCreateUuid();
if(!create_uuid) { if(!create_uuid) {
return false; return false;
} }
create_uuid(&id); create_uuid(&id);
wstring id_str = GUIDString::GUIDToWString(&id); wstring id_str = GUIDString::GUIDToWString(&id);
*file_path = dump_path_ + TEXT("\\") + id_str + TEXT(".dmp"); *file_path = dump_path_ + TEXT("\\") + id_str + TEXT(".dmp");
return true; return true;
} }
} // namespace google_breakpad } // namespace google_breakpad

View file

@ -1,118 +1,118 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ #ifndef CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__
#define CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ #define CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__
#include <windows.h> #include <windows.h>
#include <dbghelp.h> #include <dbghelp.h>
#include <list> #include <list>
#include "google_breakpad/common/minidump_format.h" #include "google_breakpad/common/minidump_format.h"
namespace google_breakpad { namespace google_breakpad {
// Abstraction for various objects and operations needed to generate // Abstraction for various objects and operations needed to generate
// minidump on Windows. This abstraction is useful to hide all the gory // minidump on Windows. This abstraction is useful to hide all the gory
// details for minidump generation and provide a clean interface to // details for minidump generation and provide a clean interface to
// the clients to generate minidumps. // the clients to generate minidumps.
class MinidumpGenerator { class MinidumpGenerator {
public: public:
// Creates an instance with the given dump path. // Creates an instance with the given dump path.
explicit MinidumpGenerator(const std::wstring& dump_path); explicit MinidumpGenerator(const std::wstring& dump_path);
~MinidumpGenerator(); ~MinidumpGenerator();
// Writes the minidump with the given parameters. // Writes the minidump with the given parameters.
bool WriteMinidump(HANDLE process_handle, bool WriteMinidump(HANDLE process_handle,
DWORD process_id, DWORD process_id,
DWORD thread_id, DWORD thread_id,
DWORD requesting_thread_id, DWORD requesting_thread_id,
EXCEPTION_POINTERS* exception_pointers, EXCEPTION_POINTERS* exception_pointers,
MDRawAssertionInfo* assert_info, MDRawAssertionInfo* assert_info,
MINIDUMP_TYPE dump_type, MINIDUMP_TYPE dump_type,
bool is_client_pointers); bool is_client_pointers);
private: private:
// Function pointer type for MiniDumpWriteDump, which is looked up // Function pointer type for MiniDumpWriteDump, which is looked up
// dynamically. // dynamically.
typedef BOOL (WINAPI* MiniDumpWriteDumpType)( typedef BOOL (WINAPI* MiniDumpWriteDumpType)(
HANDLE hProcess, HANDLE hProcess,
DWORD ProcessId, DWORD ProcessId,
HANDLE hFile, HANDLE hFile,
MINIDUMP_TYPE DumpType, MINIDUMP_TYPE DumpType,
CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);
// Function pointer type for UuidCreate, which is looked up dynamically. // Function pointer type for UuidCreate, which is looked up dynamically.
typedef RPC_STATUS (RPC_ENTRY* UuidCreateType)(UUID* Uuid); typedef RPC_STATUS (RPC_ENTRY* UuidCreateType)(UUID* Uuid);
// Loads the appropriate DLL lazily in a thread safe way. // Loads the appropriate DLL lazily in a thread safe way.
HMODULE GetDbghelpModule(); HMODULE GetDbghelpModule();
// Loads the appropriate DLL and gets a pointer to the MiniDumpWriteDump // Loads the appropriate DLL and gets a pointer to the MiniDumpWriteDump
// function lazily and in a thread-safe manner. // function lazily and in a thread-safe manner.
MiniDumpWriteDumpType GetWriteDump(); MiniDumpWriteDumpType GetWriteDump();
// Loads the appropriate DLL lazily in a thread safe way. // Loads the appropriate DLL lazily in a thread safe way.
HMODULE GetRpcrt4Module(); HMODULE GetRpcrt4Module();
// Loads the appropriate DLL and gets a pointer to the UuidCreate // Loads the appropriate DLL and gets a pointer to the UuidCreate
// function lazily and in a thread-safe manner. // function lazily and in a thread-safe manner.
UuidCreateType GetCreateUuid(); UuidCreateType GetCreateUuid();
// Returns the path for the file to write dump to. // Returns the path for the file to write dump to.
bool GenerateDumpFilePath(std::wstring* file_path); bool GenerateDumpFilePath(std::wstring* file_path);
// Handle to dynamically loaded DbgHelp.dll. // Handle to dynamically loaded DbgHelp.dll.
HMODULE dbghelp_module_; HMODULE dbghelp_module_;
// Pointer to the MiniDumpWriteDump function. // Pointer to the MiniDumpWriteDump function.
MiniDumpWriteDumpType write_dump_; MiniDumpWriteDumpType write_dump_;
// Handle to dynamically loaded rpcrt4.dll. // Handle to dynamically loaded rpcrt4.dll.
HMODULE rpcrt4_module_; HMODULE rpcrt4_module_;
// Pointer to the UuidCreate function. // Pointer to the UuidCreate function.
UuidCreateType create_uuid_; UuidCreateType create_uuid_;
// Folder path to store dump files. // Folder path to store dump files.
std::wstring dump_path_; std::wstring dump_path_;
// Critical section to sychronize action of loading modules dynamically. // Critical section to sychronize action of loading modules dynamically.
CRITICAL_SECTION module_load_sync_; CRITICAL_SECTION module_load_sync_;
// Critical section to synchronize action of dynamically getting function // Critical section to synchronize action of dynamically getting function
// addresses from modules. // addresses from modules.
CRITICAL_SECTION get_proc_address_sync_; CRITICAL_SECTION get_proc_address_sync_;
}; };
} // namespace google_breakpad } // namespace google_breakpad
#endif // CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ #endif // CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__

View file

@ -1,323 +1,323 @@
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8.00"
Name="exception_handler" Name="exception_handler"
ProjectGUID="{B55CA863-B374-4BAF-95AC-539E4FA4C90C}" ProjectGUID="{B55CA863-B374-4BAF-95AC-539E4FA4C90C}"
RootNamespace="exception_handler" RootNamespace="exception_handler"
Keyword="Win32Proj" Keyword="Win32Proj"
> >
<Platforms> <Platforms>
<Platform <Platform
Name="Win32" Name="Win32"
/> />
</Platforms> </Platforms>
<ToolFiles> <ToolFiles>
</ToolFiles> </ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="3" RuntimeLibrary="3"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
AdditionalDependencies="crash_generation.lib" AdditionalDependencies="crash_generation.lib"
AdditionalLibraryDirectories="..\$(ConfigurationName)" AdditionalLibraryDirectories="..\$(ConfigurationName)"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
WholeProgramOptimization="1" WholeProgramOptimization="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN"
RuntimeLibrary="2" RuntimeLibrary="2"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
AdditionalDependencies="crash_generation.lib" AdditionalDependencies="crash_generation.lib"
AdditionalLibraryDirectories="..\$(ConfigurationName)" AdditionalLibraryDirectories="..\$(ConfigurationName)"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="DebugStaticCRT|Win32" Name="DebugStaticCRT|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
AdditionalDependencies="crash_generation.lib" AdditionalDependencies="crash_generation.lib"
AdditionalLibraryDirectories="..\$(ConfigurationName)" AdditionalLibraryDirectories="..\$(ConfigurationName)"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="ReleaseStaticCRT|Win32" Name="ReleaseStaticCRT|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
WholeProgramOptimization="1" WholeProgramOptimization="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN"
RuntimeLibrary="0" RuntimeLibrary="0"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
AdditionalDependencies="crash_generation.lib" AdditionalDependencies="crash_generation.lib"
AdditionalLibraryDirectories="..\$(ConfigurationName)" AdditionalLibraryDirectories="..\$(ConfigurationName)"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
</References> </References>
<Files> <Files>
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
> >
<File <File
RelativePath=".\exception_handler.cc" RelativePath=".\exception_handler.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\guid_string.cc" RelativePath="..\..\..\common\windows\guid_string.cc"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
> >
<File <File
RelativePath=".\exception_handler.h" RelativePath=".\exception_handler.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\guid_string.h" RelativePath="..\..\..\common\windows\guid_string.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\google_breakpad\common\minidump_format.h" RelativePath="..\..\..\google_breakpad\common\minidump_format.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\string_utils-inl.h" RelativePath="..\..\..\common\windows\string_utils-inl.h"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
> >
</Filter> </Filter>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>
</VisualStudioProject> </VisualStudioProject>

View file

@ -1,307 +1,307 @@
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8.00"
Name="crash_report_sender" Name="crash_report_sender"
ProjectGUID="{9946A048-043B-4F8F-9E07-9297B204714C}" ProjectGUID="{9946A048-043B-4F8F-9E07-9297B204714C}"
RootNamespace="crash_report_sender" RootNamespace="crash_report_sender"
Keyword="Win32Proj" Keyword="Win32Proj"
> >
<Platforms> <Platforms>
<Platform <Platform
Name="Win32" Name="Win32"
/> />
</Platforms> </Platforms>
<ToolFiles> <ToolFiles>
</ToolFiles> </ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="3" RuntimeLibrary="3"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
WholeProgramOptimization="1" WholeProgramOptimization="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN"
RuntimeLibrary="2" RuntimeLibrary="2"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="DebugStaticCRT|Win32" Name="DebugStaticCRT|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;_DEBUG;_LIB;WIN32_LEAN_AND_MEAN"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="ReleaseStaticCRT|Win32" Name="ReleaseStaticCRT|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
CharacterSet="1" CharacterSet="1"
WholeProgramOptimization="1" WholeProgramOptimization="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\.." AdditionalIncludeDirectories="..\..\.."
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN"
RuntimeLibrary="0" RuntimeLibrary="0"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
</References> </References>
<Files> <Files>
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
> >
<File <File
RelativePath=".\crash_report_sender.cc" RelativePath=".\crash_report_sender.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\http_upload.cc" RelativePath="..\..\..\common\windows\http_upload.cc"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
> >
<File <File
RelativePath=".\crash_report_sender.h" RelativePath=".\crash_report_sender.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\http_upload.h" RelativePath="..\..\..\common\windows\http_upload.h"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
> >
</Filter> </Filter>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>
</VisualStudioProject> </VisualStudioProject>

View file

@ -1,53 +1,53 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "precompile.h" #include "precompile.h"
namespace google_breakpad { namespace google_breakpad {
Base::Base(Derived* derived) Base::Base(Derived* derived)
: derived_(derived) { : derived_(derived) {
} }
Base::~Base() { Base::~Base() {
derived_->DoSomething(); derived_->DoSomething();
} }
#pragma warning(push) #pragma warning(push)
#pragma warning(disable:4355) #pragma warning(disable:4355)
// Disable warning C4355: 'this' : used in base member initializer list. // Disable warning C4355: 'this' : used in base member initializer list.
Derived::Derived() Derived::Derived()
: Base(this) { // C4355 : Base(this) { // C4355
} }
#pragma warning(pop) #pragma warning(pop)
void Derived::DoSomething() { void Derived::DoSomething() {
} }
} // namespace google_breakpad } // namespace google_breakpad

View file

@ -1,57 +1,57 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_ABSTRACT_CLASS_H__ #ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_ABSTRACT_CLASS_H__
#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_ABSTRACT_CLASS_H__ #define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_ABSTRACT_CLASS_H__
namespace google_breakpad { namespace google_breakpad {
// Dummy classes to help generate a pure call violation. // Dummy classes to help generate a pure call violation.
class Derived; class Derived;
class Base { class Base {
public: public:
Base(Derived* derived); Base(Derived* derived);
virtual ~Base(); virtual ~Base();
virtual void DoSomething() = 0; virtual void DoSomething() = 0;
private: private:
Derived* derived_; Derived* derived_;
}; };
class Derived : public Base { class Derived : public Base {
public: public:
Derived(); Derived();
virtual void DoSomething(); virtual void DoSomething();
}; };
} // namespace google_breakpad } // namespace google_breakpad
#endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ #endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__

View file

@ -1,467 +1,467 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// crash_generation_app.cpp : Defines the entry point for the application. // crash_generation_app.cpp : Defines the entry point for the application.
// //
#include "precompile.h" #include "precompile.h"
namespace google_breakpad { namespace google_breakpad {
const int kMaxLoadString = 100; const int kMaxLoadString = 100;
const wchar_t kPipeName[] = L"\\\\.\\pipe\\GoogleCrashServices"; const wchar_t kPipeName[] = L"\\\\.\\pipe\\GoogleCrashServices";
const DWORD kEditBoxStyles = WS_CHILD | const DWORD kEditBoxStyles = WS_CHILD |
WS_VISIBLE | WS_VISIBLE |
WS_VSCROLL | WS_VSCROLL |
ES_LEFT | ES_LEFT |
ES_MULTILINE | ES_MULTILINE |
ES_AUTOVSCROLL | ES_AUTOVSCROLL |
ES_READONLY; ES_READONLY;
// Maximum length of a line in the edit box. // Maximum length of a line in the edit box.
const size_t kMaximumLineLength = 256; const size_t kMaximumLineLength = 256;
// CS to access edit control in a thread safe way. // CS to access edit control in a thread safe way.
static CRITICAL_SECTION* cs_edit = NULL; static CRITICAL_SECTION* cs_edit = NULL;
// Edit control. // Edit control.
static HWND client_status_edit_box; static HWND client_status_edit_box;
HINSTANCE current_instance; // Current instance. HINSTANCE current_instance; // Current instance.
TCHAR title[kMaxLoadString]; // Title bar text. TCHAR title[kMaxLoadString]; // Title bar text.
TCHAR window_class[kMaxLoadString]; // Main window class name. TCHAR window_class[kMaxLoadString]; // Main window class name.
ATOM MyRegisterClass(HINSTANCE instance); ATOM MyRegisterClass(HINSTANCE instance);
BOOL InitInstance(HINSTANCE, int); BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
static ExceptionHandler* handler = NULL; static ExceptionHandler* handler = NULL;
static CrashGenerationServer* crash_server = NULL; static CrashGenerationServer* crash_server = NULL;
// Registers the window class. // Registers the window class.
// //
// This function and its usage are only necessary if you want this code // This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx' // to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this // function that was added to Windows 95. It is important to call this
// function so that the application will get 'well formed' small icons // function so that the application will get 'well formed' small icons
// associated with it. // associated with it.
ATOM MyRegisterClass(HINSTANCE instance) { ATOM MyRegisterClass(HINSTANCE instance) {
WNDCLASSEX wcex; WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX); wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc; wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0; wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0; wcex.cbWndExtra = 0;
wcex.hInstance = instance; wcex.hInstance = instance;
wcex.hIcon = LoadIcon(instance, wcex.hIcon = LoadIcon(instance,
MAKEINTRESOURCE(IDI_CRASHGENERATIONAPP)); MAKEINTRESOURCE(IDI_CRASHGENERATIONAPP));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP);
wcex.lpszClassName = window_class; wcex.lpszClassName = window_class;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex); return RegisterClassEx(&wcex);
} }
// Saves instance handle and creates main window // Saves instance handle and creates main window
// //
// In this function, we save the instance handle in a global variable and // In this function, we save the instance handle in a global variable and
// create and display the main program window. // create and display the main program window.
BOOL InitInstance(HINSTANCE instance, int command_show) { BOOL InitInstance(HINSTANCE instance, int command_show) {
current_instance = instance; current_instance = instance;
HWND wnd = CreateWindow(window_class, HWND wnd = CreateWindow(window_class,
title, title,
WS_OVERLAPPEDWINDOW, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
0, 0,
CW_USEDEFAULT, CW_USEDEFAULT,
0, 0,
NULL, NULL,
NULL, NULL,
instance, instance,
NULL); NULL);
if (!wnd) { if (!wnd) {
return FALSE; return FALSE;
} }
ShowWindow(wnd, command_show); ShowWindow(wnd, command_show);
UpdateWindow(wnd); UpdateWindow(wnd);
return TRUE; return TRUE;
} }
static void AppendTextToEditBox(TCHAR* text) { static void AppendTextToEditBox(TCHAR* text) {
EnterCriticalSection(cs_edit); EnterCriticalSection(cs_edit);
SYSTEMTIME current_time; SYSTEMTIME current_time;
GetLocalTime(&current_time); GetLocalTime(&current_time);
TCHAR line[kMaximumLineLength]; TCHAR line[kMaximumLineLength];
int result = swprintf_s(line, int result = swprintf_s(line,
kMaximumLineLength, kMaximumLineLength,
L"[%.2d-%.2d-%.4d %.2d:%.2d:%.2d] %s", L"[%.2d-%.2d-%.4d %.2d:%.2d:%.2d] %s",
current_time.wMonth, current_time.wMonth,
current_time.wDay, current_time.wDay,
current_time.wYear, current_time.wYear,
current_time.wHour, current_time.wHour,
current_time.wMinute, current_time.wMinute,
current_time.wSecond, current_time.wSecond,
text); text);
if (result == -1) { if (result == -1) {
return; return;
} }
int length = GetWindowTextLength(client_status_edit_box); int length = GetWindowTextLength(client_status_edit_box);
SendMessage(client_status_edit_box, SendMessage(client_status_edit_box,
EM_SETSEL, EM_SETSEL,
(WPARAM)length, (WPARAM)length,
(LPARAM)length); (LPARAM)length);
SendMessage(client_status_edit_box, SendMessage(client_status_edit_box,
EM_REPLACESEL, EM_REPLACESEL,
(WPARAM)FALSE, (WPARAM)FALSE,
(LPARAM)line); (LPARAM)line);
LeaveCriticalSection(cs_edit); LeaveCriticalSection(cs_edit);
} }
static DWORD WINAPI AppendTextWorker(void* context) { static DWORD WINAPI AppendTextWorker(void* context) {
TCHAR* text = reinterpret_cast<TCHAR*>(context); TCHAR* text = reinterpret_cast<TCHAR*>(context);
AppendTextToEditBox(text); AppendTextToEditBox(text);
delete[] text; delete[] text;
return 0; return 0;
} }
bool ShowDumpResults(const wchar_t* dump_path, bool ShowDumpResults(const wchar_t* dump_path,
const wchar_t* minidump_id, const wchar_t* minidump_id,
void* context, void* context,
EXCEPTION_POINTERS* exinfo, EXCEPTION_POINTERS* exinfo,
MDRawAssertionInfo* assertion, MDRawAssertionInfo* assertion,
bool succeeded) { bool succeeded) {
TCHAR* text = new TCHAR[kMaximumLineLength]; TCHAR* text = new TCHAR[kMaximumLineLength];
int result = swprintf_s(text, int result = swprintf_s(text,
kMaximumLineLength, kMaximumLineLength,
TEXT("Dump generation request %s\r\n"), TEXT("Dump generation request %s\r\n"),
succeeded ? TEXT("succeeded") : TEXT("failed")); succeeded ? TEXT("succeeded") : TEXT("failed"));
if (result == -1) { if (result == -1) {
delete [] text; delete [] text;
} }
AppendTextWorker(text); AppendTextWorker(text);
return succeeded; return succeeded;
} }
static void _cdecl ShowClientConnected(void* context, static void _cdecl ShowClientConnected(void* context,
const ClientInfo* client_info) { const ClientInfo* client_info) {
TCHAR* line = new TCHAR[kMaximumLineLength]; TCHAR* line = new TCHAR[kMaximumLineLength];
int result = swprintf_s(line, int result = swprintf_s(line,
kMaximumLineLength, kMaximumLineLength,
L"Client connected:\t\t%d\r\n", L"Client connected:\t\t%d\r\n",
client_info->pid()); client_info->pid());
if (result == -1) { if (result == -1) {
delete[] line; delete[] line;
return; return;
} }
QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT);
} }
static void _cdecl ShowClientCrashed(void* context, static void _cdecl ShowClientCrashed(void* context,
const ClientInfo* client_info) { const ClientInfo* client_info) {
TCHAR* line = new TCHAR[kMaximumLineLength]; TCHAR* line = new TCHAR[kMaximumLineLength];
int result = swprintf_s(line, int result = swprintf_s(line,
kMaximumLineLength, kMaximumLineLength,
TEXT("Client requested dump:\t%d\r\n"), TEXT("Client requested dump:\t%d\r\n"),
client_info->pid()); client_info->pid());
if (result == -1) { if (result == -1) {
delete[] line; delete[] line;
return; return;
} }
QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT);
} }
static void _cdecl ShowClientExited(void* context, static void _cdecl ShowClientExited(void* context,
const ClientInfo* client_info) { const ClientInfo* client_info) {
TCHAR* line = new TCHAR[kMaximumLineLength]; TCHAR* line = new TCHAR[kMaximumLineLength];
int result = swprintf_s(line, int result = swprintf_s(line,
kMaximumLineLength, kMaximumLineLength,
TEXT("Client exited:\t\t%d\r\n"), TEXT("Client exited:\t\t%d\r\n"),
client_info->pid()); client_info->pid());
if (result == -1) { if (result == -1) {
delete[] line; delete[] line;
return; return;
} }
QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT); QueueUserWorkItem(AppendTextWorker, line, WT_EXECUTEDEFAULT);
} }
void CrashServerStart() { void CrashServerStart() {
// Do not create another instance of the server. // Do not create another instance of the server.
if (crash_server) { if (crash_server) {
return; return;
} }
std::wstring dump_path = L"C:\\Dumps\\"; std::wstring dump_path = L"C:\\Dumps\\";
crash_server = new CrashGenerationServer(kPipeName, crash_server = new CrashGenerationServer(kPipeName,
ShowClientConnected, ShowClientConnected,
NULL, NULL,
ShowClientCrashed, ShowClientCrashed,
NULL, NULL,
ShowClientExited, ShowClientExited,
NULL, NULL,
true, true,
&dump_path); &dump_path);
if (!crash_server->Start()) { if (!crash_server->Start()) {
MessageBoxW(NULL, L"Unable to start server", L"Dumper", MB_OK); MessageBoxW(NULL, L"Unable to start server", L"Dumper", MB_OK);
delete crash_server; delete crash_server;
crash_server = NULL; crash_server = NULL;
} }
} }
void CrashServerStop() { void CrashServerStop() {
delete crash_server; delete crash_server;
crash_server = NULL; crash_server = NULL;
} }
void DerefZeroCrash() { void DerefZeroCrash() {
int* x = 0; int* x = 0;
*x = 1; *x = 1;
} }
void InvalidParamCrash() { void InvalidParamCrash() {
printf(NULL); printf(NULL);
} }
void PureCallCrash() { void PureCallCrash() {
Derived derived; Derived derived;
} }
void RequestDump() { void RequestDump() {
if (!handler->WriteMinidump()) { if (!handler->WriteMinidump()) {
MessageBoxW(NULL, L"Dump request failed", L"Dumper", MB_OK); MessageBoxW(NULL, L"Dump request failed", L"Dumper", MB_OK);
} }
} }
void CleanUp() { void CleanUp() {
if (cs_edit) { if (cs_edit) {
DeleteCriticalSection(cs_edit); DeleteCriticalSection(cs_edit);
delete cs_edit; delete cs_edit;
} }
if (handler) { if (handler) {
delete handler; delete handler;
} }
if (crash_server) { if (crash_server) {
delete crash_server; delete crash_server;
} }
} }
// Processes messages for the main window. // Processes messages for the main window.
// //
// WM_COMMAND - process the application menu. // WM_COMMAND - process the application menu.
// WM_PAINT - Paint the main window. // WM_PAINT - Paint the main window.
// WM_DESTROY - post a quit message and return. // WM_DESTROY - post a quit message and return.
LRESULT CALLBACK WndProc(HWND wnd, LRESULT CALLBACK WndProc(HWND wnd,
UINT message, UINT message,
WPARAM w_param, WPARAM w_param,
LPARAM l_param) { LPARAM l_param) {
int message_id; int message_id;
int message_event; int message_event;
PAINTSTRUCT ps; PAINTSTRUCT ps;
HDC hdc; HDC hdc;
#pragma warning(push) #pragma warning(push)
#pragma warning(disable:4312) #pragma warning(disable:4312)
// Disable warning C4312: 'type cast' : conversion from 'LONG' to // Disable warning C4312: 'type cast' : conversion from 'LONG' to
// 'HINSTANCE' of greater size. // 'HINSTANCE' of greater size.
// The value returned by GetwindowLong in the case below returns unsigned. // The value returned by GetwindowLong in the case below returns unsigned.
HINSTANCE instance = (HINSTANCE)GetWindowLong(wnd, GWL_HINSTANCE); HINSTANCE instance = (HINSTANCE)GetWindowLong(wnd, GWL_HINSTANCE);
#pragma warning(pop) #pragma warning(pop)
switch (message) { switch (message) {
case WM_COMMAND: case WM_COMMAND:
// Parse the menu selections. // Parse the menu selections.
message_id = LOWORD(w_param); message_id = LOWORD(w_param);
message_event = HIWORD(w_param); message_event = HIWORD(w_param);
switch (message_id) { switch (message_id) {
case IDM_ABOUT: case IDM_ABOUT:
DialogBox(current_instance, DialogBox(current_instance,
MAKEINTRESOURCE(IDD_ABOUTBOX), MAKEINTRESOURCE(IDD_ABOUTBOX),
wnd, wnd,
About); About);
break; break;
case IDM_EXIT: case IDM_EXIT:
DestroyWindow(wnd); DestroyWindow(wnd);
break; break;
case ID_SERVER_START: case ID_SERVER_START:
CrashServerStart(); CrashServerStart();
break; break;
case ID_SERVER_STOP: case ID_SERVER_STOP:
CrashServerStop(); CrashServerStop();
break; break;
case ID_CLIENT_DEREFZERO: case ID_CLIENT_DEREFZERO:
DerefZeroCrash(); DerefZeroCrash();
break; break;
case ID_CLIENT_INVALIDPARAM: case ID_CLIENT_INVALIDPARAM:
InvalidParamCrash(); InvalidParamCrash();
break; break;
case ID_CLIENT_PURECALL: case ID_CLIENT_PURECALL:
PureCallCrash(); PureCallCrash();
break; break;
case ID_CLIENT_REQUESTEXPLICITDUMP: case ID_CLIENT_REQUESTEXPLICITDUMP:
RequestDump(); RequestDump();
break; break;
default: default:
return DefWindowProc(wnd, message, w_param, l_param); return DefWindowProc(wnd, message, w_param, l_param);
} }
break; break;
case WM_CREATE: case WM_CREATE:
client_status_edit_box = CreateWindow(TEXT("EDIT"), client_status_edit_box = CreateWindow(TEXT("EDIT"),
NULL, NULL,
kEditBoxStyles, kEditBoxStyles,
0, 0,
0, 0,
0, 0,
0, 0,
wnd, wnd,
NULL, NULL,
instance, instance,
NULL); NULL);
break; break;
case WM_SIZE: case WM_SIZE:
// Make the edit control the size of the window's client area. // Make the edit control the size of the window's client area.
MoveWindow(client_status_edit_box, MoveWindow(client_status_edit_box,
0, 0,
0, 0,
LOWORD(l_param), // width of client area. LOWORD(l_param), // width of client area.
HIWORD(l_param), // height of client area. HIWORD(l_param), // height of client area.
TRUE); // repaint window. TRUE); // repaint window.
break; break;
case WM_SETFOCUS: case WM_SETFOCUS:
SetFocus(client_status_edit_box); SetFocus(client_status_edit_box);
break; break;
case WM_PAINT: case WM_PAINT:
hdc = BeginPaint(wnd, &ps); hdc = BeginPaint(wnd, &ps);
EndPaint(wnd, &ps); EndPaint(wnd, &ps);
break; break;
case WM_DESTROY: case WM_DESTROY:
CleanUp(); CleanUp();
PostQuitMessage(0); PostQuitMessage(0);
break; break;
default: default:
return DefWindowProc(wnd, message, w_param, l_param); return DefWindowProc(wnd, message, w_param, l_param);
} }
return 0; return 0;
} }
// Message handler for about box. // Message handler for about box.
INT_PTR CALLBACK About(HWND dlg, INT_PTR CALLBACK About(HWND dlg,
UINT message, UINT message,
WPARAM w_param, WPARAM w_param,
LPARAM l_param) { LPARAM l_param) {
UNREFERENCED_PARAMETER(l_param); UNREFERENCED_PARAMETER(l_param);
switch (message) { switch (message) {
case WM_INITDIALOG: case WM_INITDIALOG:
return (INT_PTR)TRUE; return (INT_PTR)TRUE;
case WM_COMMAND: case WM_COMMAND:
if (LOWORD(w_param) == IDOK || LOWORD(w_param) == IDCANCEL) { if (LOWORD(w_param) == IDOK || LOWORD(w_param) == IDCANCEL) {
EndDialog(dlg, LOWORD(w_param)); EndDialog(dlg, LOWORD(w_param));
return (INT_PTR)TRUE; return (INT_PTR)TRUE;
} }
break; break;
} }
return (INT_PTR)FALSE; return (INT_PTR)FALSE;
} }
} // namespace google_breakpad } // namespace google_breakpad
int APIENTRY _tWinMain(HINSTANCE instance, int APIENTRY _tWinMain(HINSTANCE instance,
HINSTANCE previous_instance, HINSTANCE previous_instance,
LPTSTR command_line, LPTSTR command_line,
int command_show) { int command_show) {
using namespace google_breakpad; using namespace google_breakpad;
UNREFERENCED_PARAMETER(previous_instance); UNREFERENCED_PARAMETER(previous_instance);
UNREFERENCED_PARAMETER(command_line); UNREFERENCED_PARAMETER(command_line);
cs_edit = new CRITICAL_SECTION(); cs_edit = new CRITICAL_SECTION();
InitializeCriticalSection(cs_edit); InitializeCriticalSection(cs_edit);
// This is needed for CRT to not show dialog for invalid param // This is needed for CRT to not show dialog for invalid param
// failures and instead let the code handle it. // failures and instead let the code handle it.
_CrtSetReportMode(_CRT_ASSERT, 0); _CrtSetReportMode(_CRT_ASSERT, 0);
handler = new ExceptionHandler(L"C:\\dumps\\", handler = new ExceptionHandler(L"C:\\dumps\\",
NULL, NULL,
google_breakpad::ShowDumpResults, google_breakpad::ShowDumpResults,
NULL, NULL,
ExceptionHandler::HANDLER_ALL, ExceptionHandler::HANDLER_ALL,
MiniDumpNormal, MiniDumpNormal,
kPipeName); kPipeName);
// Initialize global strings. // Initialize global strings.
LoadString(instance, IDS_APP_TITLE, title, kMaxLoadString); LoadString(instance, IDS_APP_TITLE, title, kMaxLoadString);
LoadString(instance, LoadString(instance,
IDC_CRASHGENERATIONAPP, IDC_CRASHGENERATIONAPP,
window_class, window_class,
kMaxLoadString); kMaxLoadString);
MyRegisterClass(instance); MyRegisterClass(instance);
// Perform application initialization. // Perform application initialization.
if (!InitInstance (instance, command_show)) { if (!InitInstance (instance, command_show)) {
return FALSE; return FALSE;
} }
HACCEL accel_table = LoadAccelerators( HACCEL accel_table = LoadAccelerators(
instance, instance,
MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP)); MAKEINTRESOURCE(IDC_CRASHGENERATIONAPP));
// Main message loop. // Main message loop.
MSG msg; MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) { while (GetMessage(&msg, NULL, 0, 0)) {
if (!TranslateAccelerator(msg.hwnd, accel_table, &msg)) { if (!TranslateAccelerator(msg.hwnd, accel_table, &msg)) {
TranslateMessage(&msg); TranslateMessage(&msg);
DispatchMessage(&msg); DispatchMessage(&msg);
} }
} }
return (int)msg.wParam; return (int)msg.wParam;
} }

View file

@ -1,35 +1,35 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ #ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__
#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ #define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__
#include "resource.h" #include "resource.h"
#endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__ #endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_CRASH_GENERATION_APP_H__

View file

@ -1,144 +1,144 @@
// Microsoft Visual C++ generated resource script. // Microsoft Visual C++ generated resource script.
// //
#include "resource.h" #include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS #define APSTUDIO_READONLY_SYMBOLS
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Generated from the TEXTINCLUDE 2 resource. // Generated from the TEXTINCLUDE 2 resource.
// //
#define APSTUDIO_HIDDEN_SYMBOLS #define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h" #include "windows.h"
#undef APSTUDIO_HIDDEN_SYMBOLS #undef APSTUDIO_HIDDEN_SYMBOLS
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS #undef APSTUDIO_READONLY_SYMBOLS
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources // English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32 #ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252) #pragma code_page(1252)
#endif //_WIN32 #endif //_WIN32
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Icon // Icon
// //
// Icon with lowest ID value placed first to ensure application icon // Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems. // remains consistent on all systems.
IDI_CRASHGENERATIONAPP ICON "crash_generation_app.ico" IDI_CRASHGENERATIONAPP ICON "crash_generation_app.ico"
IDI_SMALL ICON "small.ico" IDI_SMALL ICON "small.ico"
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Menu // Menu
// //
IDC_CRASHGENERATIONAPP MENU IDC_CRASHGENERATIONAPP MENU
BEGIN BEGIN
POPUP "&File" POPUP "&File"
BEGIN BEGIN
MENUITEM "E&xit", IDM_EXIT MENUITEM "E&xit", IDM_EXIT
END END
POPUP "&Server" POPUP "&Server"
BEGIN BEGIN
MENUITEM "&Start", ID_SERVER_START MENUITEM "&Start", ID_SERVER_START
MENUITEM "S&top", ID_SERVER_STOP MENUITEM "S&top", ID_SERVER_STOP
END END
POPUP "&Client" POPUP "&Client"
BEGIN BEGIN
MENUITEM "&Deref Zero", ID_CLIENT_DEREFZERO MENUITEM "&Deref Zero", ID_CLIENT_DEREFZERO
MENUITEM "&Invalid Param", ID_CLIENT_INVALIDPARAM MENUITEM "&Invalid Param", ID_CLIENT_INVALIDPARAM
MENUITEM "&Pure Call", ID_CLIENT_PURECALL MENUITEM "&Pure Call", ID_CLIENT_PURECALL
MENUITEM "&Request Dump", ID_CLIENT_REQUESTEXPLICITDUMP MENUITEM "&Request Dump", ID_CLIENT_REQUESTEXPLICITDUMP
END END
END END
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Accelerator // Accelerator
// //
IDC_CRASHGENERATIONAPP ACCELERATORS IDC_CRASHGENERATIONAPP ACCELERATORS
BEGIN BEGIN
"?", IDM_ABOUT, ASCII, ALT "?", IDM_ABOUT, ASCII, ALT
"/", IDM_ABOUT, ASCII, ALT "/", IDM_ABOUT, ASCII, ALT
END END
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Dialog // Dialog
// //
IDD_ABOUTBOX DIALOG 22, 17, 230, 75 IDD_ABOUTBOX DIALOG 22, 17, 230, 75
STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "About" CAPTION "About"
FONT 8, "System" FONT 8, "System"
BEGIN BEGIN
ICON IDI_CRASHGENERATIONAPP,IDC_MYICON,14,9,16,16 ICON IDI_CRASHGENERATIONAPP,IDC_MYICON,14,9,16,16
LTEXT "CrashGenerationApp Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX LTEXT "CrashGenerationApp Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX
LTEXT "Copyright (C) 2008",IDC_STATIC,49,20,119,8 LTEXT "Copyright (C) 2008",IDC_STATIC,49,20,119,8
DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP
END END
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// TEXTINCLUDE // TEXTINCLUDE
// //
1 TEXTINCLUDE 1 TEXTINCLUDE
BEGIN BEGIN
"resource.h\0" "resource.h\0"
END END
2 TEXTINCLUDE 2 TEXTINCLUDE
BEGIN BEGIN
"#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#define APSTUDIO_HIDDEN_SYMBOLS\r\n"
"#include ""windows.h""\r\n" "#include ""windows.h""\r\n"
"#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n"
"\0" "\0"
END END
3 TEXTINCLUDE 3 TEXTINCLUDE
BEGIN BEGIN
"\r\n" "\r\n"
"\0" "\0"
END END
#endif // APSTUDIO_INVOKED #endif // APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// String Table // String Table
// //
STRINGTABLE STRINGTABLE
BEGIN BEGIN
IDS_APP_TITLE "CrashGenerationApp" IDS_APP_TITLE "CrashGenerationApp"
IDC_CRASHGENERATIONAPP "CRASHGENERATIONAPP" IDC_CRASHGENERATIONAPP "CRASHGENERATIONAPP"
END END
#endif // English (U.S.) resources #endif // English (U.S.) resources
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED #ifndef APSTUDIO_INVOKED
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// //
// Generated from the TEXTINCLUDE 3 resource. // Generated from the TEXTINCLUDE 3 resource.
// //
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED #endif // not APSTUDIO_INVOKED

View file

@ -1,26 +1,26 @@
 
Microsoft Visual Studio Solution File, Format Version 9.00 Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005 # Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash_generation_app", "crash_generation_app.vcproj", "{A15674ED-713D-4B37-B1D2-0C29C7E533C8}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "crash_generation_app", "crash_generation_app.vcproj", "{A15674ED-713D-4B37-B1D2-0C29C7E533C8}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32 Debug|Win32 = Debug|Win32
DebugStaticCRT|Win32 = DebugStaticCRT|Win32 DebugStaticCRT|Win32 = DebugStaticCRT|Win32
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
ReleaseStaticCRT|Win32 = ReleaseStaticCRT|Win32 ReleaseStaticCRT|Win32 = ReleaseStaticCRT|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A15674ED-713D-4B37-B1D2-0C29C7E533C8}.Debug|Win32.ActiveCfg = Debug|Win32 {A15674ED-713D-4B37-B1D2-0C29C7E533C8}.Debug|Win32.ActiveCfg = Debug|Win32
{A15674ED-713D-4B37-B1D2-0C29C7E533C8}.Debug|Win32.Build.0 = Debug|Win32 {A15674ED-713D-4B37-B1D2-0C29C7E533C8}.Debug|Win32.Build.0 = Debug|Win32
{A15674ED-713D-4B37-B1D2-0C29C7E533C8}.DebugStaticCRT|Win32.ActiveCfg = DebugStaticCRT|Win32 {A15674ED-713D-4B37-B1D2-0C29C7E533C8}.DebugStaticCRT|Win32.ActiveCfg = DebugStaticCRT|Win32
{A15674ED-713D-4B37-B1D2-0C29C7E533C8}.DebugStaticCRT|Win32.Build.0 = DebugStaticCRT|Win32 {A15674ED-713D-4B37-B1D2-0C29C7E533C8}.DebugStaticCRT|Win32.Build.0 = DebugStaticCRT|Win32
{A15674ED-713D-4B37-B1D2-0C29C7E533C8}.Release|Win32.ActiveCfg = Release|Win32 {A15674ED-713D-4B37-B1D2-0C29C7E533C8}.Release|Win32.ActiveCfg = Release|Win32
{A15674ED-713D-4B37-B1D2-0C29C7E533C8}.Release|Win32.Build.0 = Release|Win32 {A15674ED-713D-4B37-B1D2-0C29C7E533C8}.Release|Win32.Build.0 = Release|Win32
{A15674ED-713D-4B37-B1D2-0C29C7E533C8}.ReleaseStaticCRT|Win32.ActiveCfg = ReleaseStaticCRT|Win32 {A15674ED-713D-4B37-B1D2-0C29C7E533C8}.ReleaseStaticCRT|Win32.ActiveCfg = ReleaseStaticCRT|Win32
{A15674ED-713D-4B37-B1D2-0C29C7E533C8}.ReleaseStaticCRT|Win32.Build.0 = ReleaseStaticCRT|Win32 {A15674ED-713D-4B37-B1D2-0C29C7E533C8}.ReleaseStaticCRT|Win32.Build.0 = ReleaseStaticCRT|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

View file

@ -1,431 +1,431 @@
<?xml version="1.0" encoding="Windows-1252"?> <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8.00"
Name="crash_generation_app" Name="crash_generation_app"
ProjectGUID="{A15674ED-713D-4B37-B1D2-0C29C7E533C8}" ProjectGUID="{A15674ED-713D-4B37-B1D2-0C29C7E533C8}"
RootNamespace="CrashGenerationServerApp" RootNamespace="CrashGenerationServerApp"
Keyword="Win32Proj" Keyword="Win32Proj"
> >
<Platforms> <Platforms>
<Platform <Platform
Name="Win32" Name="Win32"
/> />
</Platforms> </Platforms>
<ToolFiles> <ToolFiles>
</ToolFiles> </ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1" ConfigurationType="1"
CharacterSet="1" CharacterSet="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\..\..\" AdditionalIncludeDirectories="..\..\..\..\"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="3" RuntimeLibrary="3"
UsePrecompiledHeader="2" UsePrecompiledHeader="2"
PrecompiledHeaderThrough="PreCompile.h" PrecompiledHeaderThrough="PreCompile.h"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="exception_handler.lib" AdditionalDependencies="exception_handler.lib"
LinkIncremental="2" LinkIncremental="2"
AdditionalLibraryDirectories="..\..\$(ConfigurationName)" AdditionalLibraryDirectories="..\..\$(ConfigurationName)"
GenerateDebugInformation="true" GenerateDebugInformation="true"
SubSystem="2" SubSystem="2"
TargetMachine="1" TargetMachine="1"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCManifestTool" Name="VCManifestTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCAppVerifierTool" Name="VCAppVerifierTool"
/> />
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCWebDeploymentTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1" ConfigurationType="1"
CharacterSet="1" CharacterSet="1"
WholeProgramOptimization="1" WholeProgramOptimization="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\..\..\" AdditionalIncludeDirectories="..\..\..\..\"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
RuntimeLibrary="2" RuntimeLibrary="2"
UsePrecompiledHeader="2" UsePrecompiledHeader="2"
PrecompiledHeaderThrough="precompile.h" PrecompiledHeaderThrough="precompile.h"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="exception_handler.lib" AdditionalDependencies="exception_handler.lib"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="..\..\$(ConfigurationName)" AdditionalLibraryDirectories="..\..\$(ConfigurationName)"
GenerateDebugInformation="true" GenerateDebugInformation="true"
SubSystem="2" SubSystem="2"
OptimizeReferences="2" OptimizeReferences="2"
EnableCOMDATFolding="2" EnableCOMDATFolding="2"
TargetMachine="1" TargetMachine="1"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCManifestTool" Name="VCManifestTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCAppVerifierTool" Name="VCAppVerifierTool"
/> />
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCWebDeploymentTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="DebugStaticCRT|Win32" Name="DebugStaticCRT|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1" ConfigurationType="1"
CharacterSet="1" CharacterSet="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="..\..\..\..\" AdditionalIncludeDirectories="..\..\..\..\"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
UsePrecompiledHeader="2" UsePrecompiledHeader="2"
PrecompiledHeaderThrough="PreCompile.h" PrecompiledHeaderThrough="PreCompile.h"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="exception_handler.lib" AdditionalDependencies="exception_handler.lib"
LinkIncremental="2" LinkIncremental="2"
AdditionalLibraryDirectories="..\..\$(ConfigurationName)" AdditionalLibraryDirectories="..\..\$(ConfigurationName)"
GenerateDebugInformation="true" GenerateDebugInformation="true"
SubSystem="2" SubSystem="2"
TargetMachine="1" TargetMachine="1"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCManifestTool" Name="VCManifestTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCAppVerifierTool" Name="VCAppVerifierTool"
/> />
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCWebDeploymentTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="ReleaseStaticCRT|Win32" Name="ReleaseStaticCRT|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="1" ConfigurationType="1"
CharacterSet="1" CharacterSet="1"
WholeProgramOptimization="1" WholeProgramOptimization="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="..\..\..\..\" AdditionalIncludeDirectories="..\..\..\..\"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
RuntimeLibrary="0" RuntimeLibrary="0"
UsePrecompiledHeader="2" UsePrecompiledHeader="2"
PrecompiledHeaderThrough="precompile.h" PrecompiledHeaderThrough="precompile.h"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="exception_handler.lib" AdditionalDependencies="exception_handler.lib"
LinkIncremental="1" LinkIncremental="1"
AdditionalLibraryDirectories="..\..\$(ConfigurationName)" AdditionalLibraryDirectories="..\..\$(ConfigurationName)"
GenerateDebugInformation="true" GenerateDebugInformation="true"
SubSystem="2" SubSystem="2"
OptimizeReferences="2" OptimizeReferences="2"
EnableCOMDATFolding="2" EnableCOMDATFolding="2"
TargetMachine="1" TargetMachine="1"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCManifestTool" Name="VCManifestTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCAppVerifierTool" Name="VCAppVerifierTool"
/> />
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCWebDeploymentTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
</References> </References>
<Files> <Files>
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
> >
<File <File
RelativePath=".\abstract_class.cc" RelativePath=".\abstract_class.cc"
> >
</File> </File>
<File <File
RelativePath=".\crash_generation_app.cc" RelativePath=".\crash_generation_app.cc"
> >
</File> </File>
<File <File
RelativePath=".\precompile.cc" RelativePath=".\precompile.cc"
> >
<FileConfiguration <FileConfiguration
Name="Debug|Win32" Name="Debug|Win32"
> >
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
UsePrecompiledHeader="1" UsePrecompiledHeader="1"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration <FileConfiguration
Name="Release|Win32" Name="Release|Win32"
> >
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
UsePrecompiledHeader="1" UsePrecompiledHeader="1"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration <FileConfiguration
Name="DebugStaticCRT|Win32" Name="DebugStaticCRT|Win32"
> >
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
UsePrecompiledHeader="1" UsePrecompiledHeader="1"
/> />
</FileConfiguration> </FileConfiguration>
<FileConfiguration <FileConfiguration
Name="ReleaseStaticCRT|Win32" Name="ReleaseStaticCRT|Win32"
> >
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
UsePrecompiledHeader="1" UsePrecompiledHeader="1"
/> />
</FileConfiguration> </FileConfiguration>
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
> >
<File <File
RelativePath=".\abstract_class.h" RelativePath=".\abstract_class.h"
> >
</File> </File>
<File <File
RelativePath=".\crash_generation_app.h" RelativePath=".\crash_generation_app.h"
> >
</File> </File>
<File <File
RelativePath=".\precompile.h" RelativePath=".\precompile.h"
> >
</File> </File>
<File <File
RelativePath=".\Resource.h" RelativePath=".\Resource.h"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
> >
<File <File
RelativePath=".\crash_generation_app.ico" RelativePath=".\crash_generation_app.ico"
> >
</File> </File>
<File <File
RelativePath=".\crash_generation_app.rc" RelativePath=".\crash_generation_app.rc"
> >
</File> </File>
<File <File
RelativePath=".\small.ico" RelativePath=".\small.ico"
> >
</File> </File>
</Filter> </Filter>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>
</VisualStudioProject> </VisualStudioProject>

View file

@ -1,37 +1,37 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// precompile.cpp : source file that includes just the standard includes // precompile.cpp : source file that includes just the standard includes
// CrashGenerationApp.pch will be the pre-compiled header // CrashGenerationApp.pch will be the pre-compiled header
// precompile.obj will contain the pre-compiled type information // precompile.obj will contain the pre-compiled type information
#include "precompile.h" #include "precompile.h"
// Reference any additional headers you need in PRECOMPILE.H // Reference any additional headers you need in PRECOMPILE.H
// and not in this file. // and not in this file.

View file

@ -1,89 +1,89 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// PreCompile.h : include file for standard system include files, // PreCompile.h : include file for standard system include files,
// or project specific include files that are used frequently, but // or project specific include files that are used frequently, but
// are changed infrequently // are changed infrequently
// //
#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_PRECOMPILE_H__ #ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_PRECOMPILE_H__
#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_PRECOMPILE_H__ #define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_PRECOMPILE_H__
// Modify the following defines if you have to target a platform prior to // Modify the following defines if you have to target a platform prior to
// the ones specified below. Refer to MSDN for the latest info on // the ones specified below. Refer to MSDN for the latest info on
// corresponding values for different platforms. // corresponding values for different platforms.
// Allow use of features specific to Windows XP or later. // Allow use of features specific to Windows XP or later.
#ifndef WINVER #ifndef WINVER
// Change this to the appropriate value to target other versions of Windows. // Change this to the appropriate value to target other versions of Windows.
#define WINVER 0x0501 #define WINVER 0x0501
#endif #endif
// Allow use of features specific to Windows XP or later. // Allow use of features specific to Windows XP or later.
#ifndef _WIN32_WINNT #ifndef _WIN32_WINNT
// Change this to the appropriate value to target other versions of Windows. // Change this to the appropriate value to target other versions of Windows.
#define _WIN32_WINNT 0x0501 #define _WIN32_WINNT 0x0501
#endif #endif
// Allow use of features specific to Windows 98 or later. // Allow use of features specific to Windows 98 or later.
#ifndef _WIN32_WINDOWS #ifndef _WIN32_WINDOWS
// Change this to the appropriate value to target Windows Me or later. // Change this to the appropriate value to target Windows Me or later.
#define _WIN32_WINDOWS 0x0410 #define _WIN32_WINDOWS 0x0410
#endif #endif
// Allow use of features specific to IE 6.0 or later. // Allow use of features specific to IE 6.0 or later.
#ifndef _WIN32_IE #ifndef _WIN32_IE
// Change this to the appropriate value to target other versions of IE. // Change this to the appropriate value to target other versions of IE.
#define _WIN32_IE 0x0600 #define _WIN32_IE 0x0600
#endif #endif
// Exclude rarely-used stuff from Windows headers // Exclude rarely-used stuff from Windows headers
#define WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN
#include <windows.h> #include <windows.h>
#include <DbgHelp.h> #include <DbgHelp.h>
#include <malloc.h> #include <malloc.h>
#include <memory.h> #include <memory.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <tchar.h> #include <tchar.h>
#include <cassert> #include <cassert>
#include <list> #include <list>
#include "client/windows/crash_generation/client_info.h" #include "client/windows/crash_generation/client_info.h"
#include "client/windows/crash_generation/crash_generation_client.h" #include "client/windows/crash_generation/crash_generation_client.h"
#include "client/windows/crash_generation/crash_generation_server.h" #include "client/windows/crash_generation/crash_generation_server.h"
#include "client/windows/crash_generation/minidump_generator.h" #include "client/windows/crash_generation/minidump_generator.h"
#include "client/windows/handler/exception_handler.h" #include "client/windows/handler/exception_handler.h"
#include "client/windows/tests/crash_generation_app/abstract_class.h" #include "client/windows/tests/crash_generation_app/abstract_class.h"
#include "client/windows/tests/crash_generation_app/crash_generation_app.h" #include "client/windows/tests/crash_generation_app/crash_generation_app.h"
#include "google_breakpad/common/minidump_format.h" #include "google_breakpad/common/minidump_format.h"
#endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_PRECOMPILE_H__ #endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_PRECOMPILE_H__

View file

@ -1,73 +1,73 @@
// Copyright (c) 2008, Google Inc. // Copyright (c) 2008, Google Inc.
// All rights reserved. // All rights reserved.
// //
// Redistribution and use in source and binary forms, with or without // Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are // modification, are permitted provided that the following conditions are
// met: // met:
// //
// * Redistributions of source code must retain the above copyright // * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer. // notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above // * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer // copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the // in the documentation and/or other materials provided with the
// distribution. // distribution.
// * Neither the name of Google Inc. nor the names of its // * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from // contributors may be used to endorse or promote products derived from
// this software without specific prior written permission. // this software without specific prior written permission.
// //
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// PreCompile.h : include file for standard system include files, // PreCompile.h : include file for standard system include files,
// or project specific include files that are used frequently, but // or project specific include files that are used frequently, but
// are changed infrequently // are changed infrequently
// //
#ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__ #ifndef CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__
#define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__ #define CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__
//{{NO_DEPENDENCIES}} //{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file. // Microsoft Visual C++ generated include file.
// Used by crash_generation_app.rc // Used by crash_generation_app.rc
// //
#define IDC_MYICON 2 #define IDC_MYICON 2
#define IDD_CRASHGENERATIONAPP_DIALOG 102 #define IDD_CRASHGENERATIONAPP_DIALOG 102
#define IDS_APP_TITLE 103 #define IDS_APP_TITLE 103
#define IDD_ABOUTBOX 103 #define IDD_ABOUTBOX 103
#define IDM_ABOUT 104 #define IDM_ABOUT 104
#define IDM_EXIT 105 #define IDM_EXIT 105
#define IDI_CRASHGENERATIONAPP 107 #define IDI_CRASHGENERATIONAPP 107
#define IDI_SMALL 108 #define IDI_SMALL 108
#define IDC_CRASHGENERATIONAPP 109 #define IDC_CRASHGENERATIONAPP 109
#define IDR_MAINFRAME 128 #define IDR_MAINFRAME 128
#define ID_SERVER_START 32771 #define ID_SERVER_START 32771
#define ID_SERVER_STOP 32772 #define ID_SERVER_STOP 32772
#define ID_CLIENT_INVALIDPARAM 32773 #define ID_CLIENT_INVALIDPARAM 32773
#define ID_CLIENT_ASSERTFAILURE 32774 #define ID_CLIENT_ASSERTFAILURE 32774
#define ID_CLIENT_DEREFZERO 32775 #define ID_CLIENT_DEREFZERO 32775
#define ID_CLIENT_PURECALL 32777 #define ID_CLIENT_PURECALL 32777
#define ID_CLIENT_REQUESTEXPLICITDUMP 32778 #define ID_CLIENT_REQUESTEXPLICITDUMP 32778
#define IDC_STATIC -1 #define IDC_STATIC -1
// Next default values for new objects // Next default values for new objects
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1 #define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 129 #define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_COMMAND_VALUE 32780 #define _APS_NEXT_COMMAND_VALUE 32780
#define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 110 #define _APS_NEXT_SYMED_VALUE 110
#endif #endif
#endif #endif
#endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__ #endif // CLIENT_WINDOWS_TESTS_CRASH_GENERATION_APP_RESOURCE_H__

View file

@ -1,319 +1,319 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8.00"
Name="ms_symbol_server_converter" Name="ms_symbol_server_converter"
ProjectGUID="{1463C4CD-23FC-4DE9-BFDE-283338200157}" ProjectGUID="{1463C4CD-23FC-4DE9-BFDE-283338200157}"
> >
<Platforms> <Platforms>
<Platform <Platform
Name="Win32" Name="Win32"
/> />
</Platforms> </Platforms>
<ToolFiles> <ToolFiles>
</ToolFiles> </ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="3" RuntimeLibrary="3"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
AdditionalDependencies="dbghelp.lib diaguids.lib" AdditionalDependencies="dbghelp.lib diaguids.lib"
AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;" AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
PreprocessorDefinitions="WIN32;_CONSOLE;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;_CONSOLE;WIN32_LEAN_AND_MEAN"
RuntimeLibrary="2" RuntimeLibrary="2"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
AdditionalDependencies="dbghelp.lib diaguids.lib" AdditionalDependencies="dbghelp.lib diaguids.lib"
AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;" AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="DebugStaticCRT|Win32" Name="DebugStaticCRT|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
AdditionalDependencies="dbghelp.lib diaguids.lib" AdditionalDependencies="dbghelp.lib diaguids.lib"
AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;" AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="ReleaseStaticCRT|Win32" Name="ReleaseStaticCRT|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)" OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)" IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4" ConfigurationType="4"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
PreprocessorDefinitions="WIN32;_CONSOLE;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;_CONSOLE;WIN32_LEAN_AND_MEAN"
RuntimeLibrary="0" RuntimeLibrary="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLibrarianTool" Name="VCLibrarianTool"
AdditionalDependencies="dbghelp.lib diaguids.lib" AdditionalDependencies="dbghelp.lib diaguids.lib"
AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;" AdditionalLibraryDirectories="&quot;$(VSInstallDir)\DIA SDK\lib&quot;"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
</References> </References>
<Files> <Files>
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
> >
<File <File
RelativePath="..\..\..\common\windows\guid_string.cc" RelativePath="..\..\..\common\windows\guid_string.cc"
> >
</File> </File>
<File <File
RelativePath=".\ms_symbol_server_converter.cc" RelativePath=".\ms_symbol_server_converter.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\pdb_source_line_writer.cc" RelativePath="..\..\..\common\windows\pdb_source_line_writer.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\string_utils.cc" RelativePath="..\..\..\common\windows\string_utils.cc"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
> >
<File <File
RelativePath="..\..\..\common\windows\guid_string.h" RelativePath="..\..\..\common\windows\guid_string.h"
> >
</File> </File>
<File <File
RelativePath=".\ms_symbol_server_converter.h" RelativePath=".\ms_symbol_server_converter.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\pdb_source_line_writer.h" RelativePath="..\..\..\common\windows\pdb_source_line_writer.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\string_utils-inl.h" RelativePath="..\..\..\common\windows\string_utils-inl.h"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
> >
</Filter> </Filter>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>
</VisualStudioProject> </VisualStudioProject>

View file

@ -1,222 +1,222 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8.00"
Name="dump_syms" Name="dump_syms"
ProjectGUID="{792E1530-E2C5-4289-992E-317BA30E9D9F}" ProjectGUID="{792E1530-E2C5-4289-992E-317BA30E9D9F}"
RootNamespace="dumpsyms" RootNamespace="dumpsyms"
Keyword="Win32Proj" Keyword="Win32Proj"
> >
<Platforms> <Platforms>
<Platform <Platform
Name="Win32" Name="Win32"
/> />
</Platforms> </Platforms>
<ToolFiles> <ToolFiles>
</ToolFiles> </ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
OutputDirectory="Debug" OutputDirectory="Debug"
IntermediateDirectory="Debug" IntermediateDirectory="Debug"
ConfigurationType="1" ConfigurationType="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="3" RuntimeLibrary="3"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="&quot;$(VSInstallDir)\DIA SDK\lib\diaguids.lib&quot;" AdditionalDependencies="&quot;$(VSInstallDir)\DIA SDK\lib\diaguids.lib&quot;"
LinkIncremental="2" LinkIncremental="2"
GenerateDebugInformation="true" GenerateDebugInformation="true"
SubSystem="1" SubSystem="1"
TargetMachine="1" TargetMachine="1"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCManifestTool" Name="VCManifestTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCAppVerifierTool" Name="VCAppVerifierTool"
/> />
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCWebDeploymentTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
OutputDirectory="Release" OutputDirectory="Release"
IntermediateDirectory="Release" IntermediateDirectory="Release"
ConfigurationType="1" ConfigurationType="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN"
RuntimeLibrary="2" RuntimeLibrary="2"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="&quot;$(VSInstallDir)\DIA SDK\lib\diaguids.lib&quot;" AdditionalDependencies="&quot;$(VSInstallDir)\DIA SDK\lib\diaguids.lib&quot;"
LinkIncremental="2" LinkIncremental="2"
GenerateDebugInformation="true" GenerateDebugInformation="true"
SubSystem="1" SubSystem="1"
OptimizeReferences="2" OptimizeReferences="2"
EnableCOMDATFolding="2" EnableCOMDATFolding="2"
TargetMachine="1" TargetMachine="1"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCManifestTool" Name="VCManifestTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCAppVerifierTool" Name="VCAppVerifierTool"
/> />
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCWebDeploymentTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
</References> </References>
<Files> <Files>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
> >
<File <File
RelativePath="..\..\..\common\windows\guid_string.h" RelativePath="..\..\..\common\windows\guid_string.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\pdb_source_line_writer.h" RelativePath="..\..\..\common\windows\pdb_source_line_writer.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\string_utils-inl.h" RelativePath="..\..\..\common\windows\string_utils-inl.h"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
> >
</Filter> </Filter>
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
> >
<File <File
RelativePath=".\dump_syms.cc" RelativePath=".\dump_syms.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\guid_string.cc" RelativePath="..\..\..\common\windows\guid_string.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\pdb_source_line_writer.cc" RelativePath="..\..\..\common\windows\pdb_source_line_writer.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\string_utils.cc" RelativePath="..\..\..\common\windows\string_utils.cc"
> >
</File> </File>
</Filter> </Filter>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>
</VisualStudioProject> </VisualStudioProject>

View file

@ -1,231 +1,231 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<VisualStudioProject <VisualStudioProject
ProjectType="Visual C++" ProjectType="Visual C++"
Version="8.00" Version="8.00"
Name="symupload" Name="symupload"
ProjectGUID="{E156ED87-9DE9-47C8-94EC-A5A9CDD65E18}" ProjectGUID="{E156ED87-9DE9-47C8-94EC-A5A9CDD65E18}"
Keyword="Win32Proj" Keyword="Win32Proj"
> >
<Platforms> <Platforms>
<Platform <Platform
Name="Win32" Name="Win32"
/> />
</Platforms> </Platforms>
<ToolFiles> <ToolFiles>
</ToolFiles> </ToolFiles>
<Configurations> <Configurations>
<Configuration <Configuration
Name="Debug|Win32" Name="Debug|Win32"
OutputDirectory="Debug" OutputDirectory="Debug"
IntermediateDirectory="Debug" IntermediateDirectory="Debug"
ConfigurationType="1" ConfigurationType="1"
CharacterSet="1" CharacterSet="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="3" RuntimeLibrary="3"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="4" DebugInformationFormat="4"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="&quot;$(VSInstallDir)\DIA SDK\lib\diaguids.lib&quot; wininet.lib version.lib" AdditionalDependencies="&quot;$(VSInstallDir)\DIA SDK\lib\diaguids.lib&quot; wininet.lib version.lib"
LinkIncremental="2" LinkIncremental="2"
GenerateDebugInformation="true" GenerateDebugInformation="true"
SubSystem="1" SubSystem="1"
TargetMachine="1" TargetMachine="1"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCManifestTool" Name="VCManifestTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCAppVerifierTool" Name="VCAppVerifierTool"
/> />
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCWebDeploymentTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
<Configuration <Configuration
Name="Release|Win32" Name="Release|Win32"
OutputDirectory="Release" OutputDirectory="Release"
IntermediateDirectory="Release" IntermediateDirectory="Release"
ConfigurationType="1" ConfigurationType="1"
CharacterSet="1" CharacterSet="1"
> >
<Tool <Tool
Name="VCPreBuildEventTool" Name="VCPreBuildEventTool"
/> />
<Tool <Tool
Name="VCCustomBuildTool" Name="VCCustomBuildTool"
/> />
<Tool <Tool
Name="VCXMLDataGeneratorTool" Name="VCXMLDataGeneratorTool"
/> />
<Tool <Tool
Name="VCWebServiceProxyGeneratorTool" Name="VCWebServiceProxyGeneratorTool"
/> />
<Tool <Tool
Name="VCMIDLTool" Name="VCMIDLTool"
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.." AdditionalIncludeDirectories="&quot;$(VSInstallDir)\DIA SDK\include&quot;;..\..\.."
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN" PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;WIN32_LEAN_AND_MEAN"
RuntimeLibrary="2" RuntimeLibrary="2"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
Detect64BitPortabilityProblems="true" Detect64BitPortabilityProblems="true"
DebugInformationFormat="3" DebugInformationFormat="3"
/> />
<Tool <Tool
Name="VCManagedResourceCompilerTool" Name="VCManagedResourceCompilerTool"
/> />
<Tool <Tool
Name="VCResourceCompilerTool" Name="VCResourceCompilerTool"
/> />
<Tool <Tool
Name="VCPreLinkEventTool" Name="VCPreLinkEventTool"
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="&quot;$(VSInstallDir)\DIA SDK\lib\diaguids.lib&quot; wininet.lib version.lib" AdditionalDependencies="&quot;$(VSInstallDir)\DIA SDK\lib\diaguids.lib&quot; wininet.lib version.lib"
LinkIncremental="2" LinkIncremental="2"
GenerateDebugInformation="true" GenerateDebugInformation="true"
SubSystem="1" SubSystem="1"
OptimizeReferences="2" OptimizeReferences="2"
EnableCOMDATFolding="2" EnableCOMDATFolding="2"
TargetMachine="1" TargetMachine="1"
/> />
<Tool <Tool
Name="VCALinkTool" Name="VCALinkTool"
/> />
<Tool <Tool
Name="VCManifestTool" Name="VCManifestTool"
/> />
<Tool <Tool
Name="VCXDCMakeTool" Name="VCXDCMakeTool"
/> />
<Tool <Tool
Name="VCBscMakeTool" Name="VCBscMakeTool"
/> />
<Tool <Tool
Name="VCFxCopTool" Name="VCFxCopTool"
/> />
<Tool <Tool
Name="VCAppVerifierTool" Name="VCAppVerifierTool"
/> />
<Tool <Tool
Name="VCWebDeploymentTool" Name="VCWebDeploymentTool"
/> />
<Tool <Tool
Name="VCPostBuildEventTool" Name="VCPostBuildEventTool"
/> />
</Configuration> </Configuration>
</Configurations> </Configurations>
<References> <References>
</References> </References>
<Files> <Files>
<Filter <Filter
Name="Header Files" Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd" Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
> >
<File <File
RelativePath="..\..\..\common\windows\guid_string.h" RelativePath="..\..\..\common\windows\guid_string.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\http_upload.h" RelativePath="..\..\..\common\windows\http_upload.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\pdb_source_line_writer.h" RelativePath="..\..\..\common\windows\pdb_source_line_writer.h"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\string_utils-inl.h" RelativePath="..\..\..\common\windows\string_utils-inl.h"
> >
</File> </File>
</Filter> </Filter>
<Filter <Filter
Name="Resource Files" Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx" Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}" UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
> >
</Filter> </Filter>
<Filter <Filter
Name="Source Files" Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx" Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}" UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
> >
<File <File
RelativePath="..\..\..\common\windows\guid_string.cc" RelativePath="..\..\..\common\windows\guid_string.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\http_upload.cc" RelativePath="..\..\..\common\windows\http_upload.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\pdb_source_line_writer.cc" RelativePath="..\..\..\common\windows\pdb_source_line_writer.cc"
> >
</File> </File>
<File <File
RelativePath="..\..\..\common\windows\string_utils.cc" RelativePath="..\..\..\common\windows\string_utils.cc"
> >
</File> </File>
<File <File
RelativePath=".\symupload.cc" RelativePath=".\symupload.cc"
> >
</File> </File>
</Filter> </Filter>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>
</VisualStudioProject> </VisualStudioProject>