diff options
Diffstat (limited to 'common')
-rw-r--r-- | common/stdint.h | 394 | ||||
-rw-r--r-- | common/vdcommon.h | 58 | ||||
-rw-r--r-- | common/vdlog.cpp | 114 | ||||
-rw-r--r-- | common/vdlog.h | 60 |
4 files changed, 626 insertions, 0 deletions
diff --git a/common/stdint.h b/common/stdint.h new file mode 100644 index 0000000..9316d56 --- /dev/null +++ b/common/stdint.h @@ -0,0 +1,394 @@ +/* ISO C9x 7.18 Integer types <stdint.h> + + * Based on ISO/IEC SC22/WG14 9899 Committee draft (SC22 N2794) + + * + + * THIS SOFTWARE IS NOT COPYRIGHTED + + * + + * Contributor: Danny Smith <danny_r_smith_2001@yahoo.co.nz> + + * + + * This source code is offered for use in the public domain. You may + + * use, modify or distribute it freely. + + * + + * This code is distributed in the hope that it will be useful but + + * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY + + * DISCLAIMED. This includes but is not limited to warranties of + + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + * + + * Date: 2000-12-02 + + */ + + + + + +#ifndef _STDINT_H + +#define _STDINT_H + +#define __need_wint_t + +#define __need_wchar_t + +#include <stddef.h> + + + +#ifdef _WIN32_WCE + +typedef _int64 int64_t; + +typedef unsigned _int64 uint64_t; + +#else + +typedef long long int64_t; + +typedef unsigned long long uint64_t; + +#endif /* _WIN32_WCE */ + + + +/* 7.18.1.1 Exact-width integer types */ + +typedef signed char int8_t; + +typedef unsigned char uint8_t; + +typedef short int16_t; + +typedef unsigned short uint16_t; + +typedef int int32_t; + +typedef unsigned uint32_t; + + + +/* 7.18.1.2 Minimum-width integer types */ + +typedef signed char int_least8_t; + +typedef unsigned char uint_least8_t; + +typedef short int_least16_t; + +typedef unsigned short uint_least16_t; + +typedef int int_least32_t; + +typedef unsigned uint_least32_t; + +#ifndef _WIN32_WCE + +typedef long long int_least64_t; + +typedef unsigned long long uint_least64_t; + +#endif + + + +/* 7.18.1.3 Fastest minimum-width integer types + + * Not actually guaranteed to be fastest for all purposes + + * Here we use the exact-width types for 8 and 16-bit ints. + + */ + +typedef char int_fast8_t; + +typedef unsigned char uint_fast8_t; + +typedef short int_fast16_t; + +typedef unsigned short uint_fast16_t; + +typedef int int_fast32_t; + +typedef unsigned int uint_fast32_t; + +#ifndef _WIN32_WCE + +typedef long long int_fast64_t; + +typedef unsigned long long uint_fast64_t; + +#endif + + + +/* 7.18.1.4 Integer types capable of holding object pointers */ + +typedef int intptr_t; + +typedef unsigned uintptr_t; + + + +/* 7.18.1.5 Greatest-width integer types */ + +#ifndef _WIN32_WCE + +typedef long long intmax_t; + +typedef unsigned long long uintmax_t; + +#endif + + + +/* 7.18.2 Limits of specified-width integer types */ + +#if !defined ( __cplusplus) || defined (__STDC_LIMIT_MACROS) + + + +/* 7.18.2.1 Limits of exact-width integer types */ + +#define INT8_MIN (-128) + +#define INT16_MIN (-32768) + +#define INT32_MIN (-2147483647 - 1) + +#define INT64_MIN (-9223372036854775807LL - 1) + + + +#define INT8_MAX 127 + +#define INT16_MAX 32767 + +#define INT32_MAX 2147483647 + +#define INT64_MAX 9223372036854775807LL + + + +#define UINT8_MAX 0xff /* 255U */ + +#define UINT16_MAX 0xffff /* 65535U */ + +#define UINT32_MAX 0xffffffff /* 4294967295U */ + +#define UINT64_MAX 0xffffffffffffffffULL /* 18446744073709551615ULL */ + + + +/* 7.18.2.2 Limits of minimum-width integer types */ + +#define INT_LEAST8_MIN INT8_MIN + +#define INT_LEAST16_MIN INT16_MIN + +#define INT_LEAST32_MIN INT32_MIN + +#define INT_LEAST64_MIN INT64_MIN + + + +#define INT_LEAST8_MAX INT8_MAX + +#define INT_LEAST16_MAX INT16_MAX + +#define INT_LEAST32_MAX INT32_MAX + +#define INT_LEAST64_MAX INT64_MAX + + + +#define UINT_LEAST8_MAX UINT8_MAX + +#define UINT_LEAST16_MAX UINT16_MAX + +#define UINT_LEAST32_MAX UINT32_MAX + +#define UINT_LEAST64_MAX UINT64_MAX + + + +/* 7.18.2.3 Limits of fastest minimum-width integer types */ + +#define INT_FAST8_MIN INT8_MIN + +#define INT_FAST16_MIN INT16_MIN + +#define INT_FAST32_MIN INT32_MIN + +#define INT_FAST64_MIN INT64_MIN + + + +#define INT_FAST8_MAX INT8_MAX + +#define INT_FAST16_MAX INT16_MAX + +#define INT_FAST32_MAX INT32_MAX + +#define INT_FAST64_MAX INT64_MAX + + + +#define UINT_FAST8_MAX UINT8_MAX + +#define UINT_FAST16_MAX UINT16_MAX + +#define UINT_FAST32_MAX UINT32_MAX + +#define UINT_FAST64_MAX UINT64_MAX + + + +/* 7.18.2.4 Limits of integer types capable of holding + + object pointers */ + +#define INTPTR_MIN INT32_MIN + +#define INTPTR_MAX INT32_MAX + +#define UINTPTR_MAX UINT32_MAX + + + +/* 7.18.2.5 Limits of greatest-width integer types */ + +#define INTMAX_MIN INT64_MIN + +#define INTMAX_MAX INT64_MAX + +#define UINTMAX_MAX UINT64_MAX + + + +/* 7.18.3 Limits of other integer types */ + +#define PTRDIFF_MIN INT32_MIN + +#define PTRDIFF_MAX INT32_MAX + + + +#define SIG_ATOMIC_MIN INT32_MIN + +#define SIG_ATOMIC_MAX INT32_MAX + + + +#define SIZE_MAX UINT32_MAX + + + +#ifndef WCHAR_MIN /* also in wchar.h */ + +#define WCHAR_MIN 0 + +#define WCHAR_MAX 0xffff /* UINT16_MAX */ + +#endif + + + +/* + + * wint_t is unsigned short for compatibility with MS runtime + + */ + +#define WINT_MIN 0 + +#define WINT_MAX 0xffff /* UINT16_MAX */ + + + +#endif /* !defined ( __cplusplus) || defined __STDC_LIMIT_MACROS */ + + + + + +/* 7.18.4 Macros for integer constants */ + +#if !defined ( __cplusplus) || defined (__STDC_CONSTANT_MACROS) + + + +/* 7.18.4.1 Macros for minimum-width integer constants + + + + Accoding to Douglas Gwyn <gwyn@arl.mil>: + + "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC + + 9899:1999 as initially published, the expansion was required + + to be an integer constant of precisely matching type, which + + is impossible to accomplish for the shorter types on most + + platforms, because C99 provides no standard way to designate + + an integer constant with width less than that of type int. + + TC1 changed this to require just an integer constant + + *expression* with *promoted* type." + +*/ + + + +#define INT8_C(val) ((int8_t) + (val)) + +#define UINT8_C(val) ((uint8_t) + (val##U)) + +#define INT16_C(val) ((int16_t) + (val)) + +#define UINT16_C(val) ((uint16_t) + (val##U)) + + + +#define INT32_C(val) val##L + +#define UINT32_C(val) val##UL + +#define INT64_C(val) val##LL + +#define UINT64_C(val) val##ULL + + + +/* 7.18.4.2 Macros for greatest-width integer constants */ + +#define INTMAX_C(val) INT64_C(val) + +#define UINTMAX_C(val) UINT64_C(val) + + + +#endif /* !defined ( __cplusplus) || defined __STDC_CONSTANT_MACROS */ + + + +#endif + + + diff --git a/common/vdcommon.h b/common/vdcommon.h new file mode 100644 index 0000000..2e4ed5d --- /dev/null +++ b/common/vdcommon.h @@ -0,0 +1,58 @@ +/* + Copyright (C) 2009 Red Hat, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef _H_VDCOMMON +#define _H_VDCOMMON + +#pragma warning(disable:4200) + +#include <windows.h> +#include "vd_agent.h" +#include "vdlog.h" + +#define VD_SERVICE_PIPE_NAME TEXT("\\\\.\\pipe\\vdservicepipe") +#define VD_MESSAGE_HEADER_SIZE (sizeof(VDPipeMessage) + sizeof(VDAgentMessage)) +#define VD_PIPE_BUF_SIZE (1024 * 1024) + +enum { + VD_AGENT_COMMAND, + VD_AGENT_RESET, + VD_AGENT_RESET_ACK, + VD_AGENT_QUIT, +}; + +typedef __declspec (align(1)) struct VDPipeMessage { + uint32_t type; + uint32_t opaque; + uint8_t data[0]; +} VDPipeMessage; + +typedef struct VDPipeBuffer { + OVERLAPPED overlap; + DWORD start; + DWORD end; + uint8_t data[VD_PIPE_BUF_SIZE]; +} VDPipeBuffer; + +typedef struct VDPipeState { + HANDLE pipe; + VDPipeBuffer write; + VDPipeBuffer read; +} VDPipeState; + +#endif + diff --git a/common/vdlog.cpp b/common/vdlog.cpp new file mode 100644 index 0000000..19f7a7c --- /dev/null +++ b/common/vdlog.cpp @@ -0,0 +1,114 @@ +/* + Copyright (C) 2009 Red Hat, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "vdlog.h" +#include <stdio.h> +#include <stdarg.h> +#include <share.h> + +#define LOG_ROLL_SIZE (1024 * 1024) + +VDLog* VDLog::_log = NULL; + +VDLog::VDLog(FILE* handle) + : _handle(handle) +{ + _log = this; +} + +VDLog::~VDLog() +{ + if (_log && _handle) { + fclose(_handle); + _log = NULL; + } +} + +VDLog* VDLog::get(TCHAR* path) +{ +#ifdef LOG_ENABLED + if (_log || !path) { + return _log; + } + DWORD size = 0; + HANDLE file = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, + NULL); + if (file != INVALID_HANDLE_VALUE) { + size = GetFileSize(file, NULL); + CloseHandle(file); + } + if (size != INVALID_FILE_SIZE && size > LOG_ROLL_SIZE) { + TCHAR roll_path[MAX_PATH]; + swprintf_s(roll_path, MAX_PATH, L"%s.1", path); + if (!MoveFileEx(path, roll_path, MOVEFILE_REPLACE_EXISTING)) { + return NULL; + } + } + FILE* handle = _wfsopen(path, L"a+", _SH_DENYNO); + if (!handle) { + return NULL; + } + _log = new VDLog(handle); + return _log; +#else + return NULL; +#endif +} + +void VDLog::printf(const char* format, ...) +{ + va_list args; + + va_start(args, format); + vfprintf(_handle, format, args); + va_end(args); + fflush(_handle); +} + +void log_version() +{ + DWORD handle; + TCHAR module_fname[MAX_PATH]; + TCHAR* info_buf = NULL; + try { + if (!GetModuleFileName(NULL, module_fname, MAX_PATH)) { + throw; + } + DWORD version_inf_size = GetFileVersionInfoSize(module_fname, &handle); + if (version_inf_size == 0) { + throw; + } + TCHAR* info_buf = new TCHAR[version_inf_size]; + if (!GetFileVersionInfo(module_fname, handle, version_inf_size, info_buf)) { + throw; + } + UINT size; + VS_FIXEDFILEINFO* file_info; + if (!VerQueryValue(info_buf, L"\\", (VOID**)&file_info, &size) || + size < sizeof(VS_FIXEDFILEINFO)) { + throw; + } + vd_printf("%d.%d.%d.%d", + file_info->dwFileVersionMS >> 16, + file_info->dwFileVersionMS & 0x0ffff, + file_info->dwFileVersionLS >> 16, + file_info->dwFileVersionLS & 0x0ffff); + } catch (...) { + vd_printf("get version info failed"); + } + delete[] info_buf; +} diff --git a/common/vdlog.h b/common/vdlog.h new file mode 100644 index 0000000..419248a --- /dev/null +++ b/common/vdlog.h @@ -0,0 +1,60 @@ +/* + Copyright (C) 2009 Red Hat, Inc. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef _H_VDLOG +#define _H_VDLOG + +#include <tchar.h> +#include <crtdbg.h> +#include <windows.h> + +#define LOG_ENABLED + +class VDLog { +public: + ~VDLog(); + static VDLog* get(TCHAR* path = NULL); + void printf(const char* format, ...); + +private: + VDLog(FILE* handle); + +private: + static VDLog* _log; + FILE* _handle; +}; + +#ifdef LOG_ENABLED +#define vd_printf(format, ...) { \ + VDLog* log = VDLog::get(); \ + double secs = GetTickCount() / 1000.0; \ + if (log) { \ + log->printf("%.3f %s: " format "\n", secs, __FUNCTION__, __VA_ARGS__); \ + } else { \ + printf("%.3f %s: " format "\n", secs, __FUNCTION__, __VA_ARGS__); \ + } \ +} + +#define ASSERT(x) _ASSERTE(x) +#else +#define vd_printf(format, ...) +#define ASSERT(x) +#endif + +void log_version(); + +#endif |