From 09e06a8cb7886543cd79ae20e97433194ae1e1e7 Mon Sep 17 00:00:00 2001 From: Petr Benes Date: Thu, 17 Jan 2019 17:44:57 +0100 Subject: [PATCH] Add support for Windows Drivers --- include/msgpack/object.h | 2 + include/msgpack/pack_template.h | 8 ++++ include/msgpack/sysdep.h | 24 +++++++---- include/msgpack/unpack_template.h | 5 +++ src/objectc.c | 72 ++++++++++++++++++------------- 5 files changed, 72 insertions(+), 39 deletions(-) diff --git a/include/msgpack/object.h b/include/msgpack/object.h index 0da280f5..e9431744 100644 --- a/include/msgpack/object.h +++ b/include/msgpack/object.h @@ -97,8 +97,10 @@ typedef struct msgpack_object_kv { msgpack_object val; } msgpack_object_kv; +#if !defined(_KERNEL_MODE) MSGPACK_DLLEXPORT void msgpack_object_print(FILE* out, msgpack_object o); +#endif MSGPACK_DLLEXPORT int msgpack_object_print_buffer(char *buffer, size_t buffer_size, msgpack_object o); diff --git a/include/msgpack/pack_template.h b/include/msgpack/pack_template.h index 5e2313cb..c534076d 100644 --- a/include/msgpack/pack_template.h +++ b/include/msgpack/pack_template.h @@ -34,6 +34,10 @@ #error msgpack_pack_append_buffer callback is not defined #endif +#if defined(_MSC_VER) +# pragma warning(push) +# pragma warning(disable : 4204) /* nonstandard extension used: non-constant aggregate initializer */ +#endif /* * Integer @@ -935,3 +939,7 @@ msgpack_pack_inline_func(_timestamp)(msgpack_pack_user x, const msgpack_timestam #undef msgpack_pack_real_int16 #undef msgpack_pack_real_int32 #undef msgpack_pack_real_int64 + +#if defined(_MSC_VER) +# pragma warning(pop) +#endif diff --git a/include/msgpack/sysdep.h b/include/msgpack/sysdep.h index b430956b..e5a69fdb 100644 --- a/include/msgpack/sysdep.h +++ b/include/msgpack/sysdep.h @@ -42,10 +42,14 @@ #endif #ifdef _WIN32 -# define _msgpack_atomic_counter_header -# if !defined(WIN32_LEAN_AND_MEAN) -# define WIN32_LEAN_AND_MEAN -# endif /* WIN32_LEAN_AND_MEAN */ +# if defined(_KERNEL_MODE) +# define _msgpack_atomic_counter_header +# else +# define _msgpack_atomic_counter_header +# if !defined(WIN32_LEAN_AND_MEAN) +# define WIN32_LEAN_AND_MEAN +# endif /* WIN32_LEAN_AND_MEAN */ +# endif typedef long _msgpack_atomic_counter_t; # define _msgpack_sync_decr_and_fetch(ptr) InterlockedDecrement(ptr) # define _msgpack_sync_incr_and_fetch(ptr) InterlockedIncrement(ptr) @@ -180,11 +184,13 @@ #if !defined(__cplusplus) && defined(_MSC_VER) -# if !defined(FALSE) -# define FALSE (0) -# endif -# if !defined(TRUE) -# define TRUE (!FALSE) +# if !defined(_KERNEL_MODE) +# if !defined(FALSE) +# define FALSE (0) +# endif +# if !defined(TRUE) +# define TRUE (!FALSE) +# endif # endif # if _MSC_VER >= 1800 # include diff --git a/include/msgpack/unpack_template.h b/include/msgpack/unpack_template.h index e557bb6d..de30f3cf 100644 --- a/include/msgpack/unpack_template.h +++ b/include/msgpack/unpack_template.h @@ -38,6 +38,11 @@ #endif #endif +#if defined(_KERNEL_MODE) +#undef assert +#define assert NT_ASSERT +#endif + msgpack_unpack_struct_decl(_stack) { msgpack_unpack_object obj; size_t count; diff --git a/src/objectc.c b/src/objectc.c index 2722b634..84f96bbf 100644 --- a/src/objectc.c +++ b/src/objectc.c @@ -7,9 +7,15 @@ * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) */ +#if defined(_KERNEL_MODE) +# undef _NO_CRT_STDIO_INLINE +# define _NO_CRT_STDIO_INLINE +#endif + #include "msgpack/object.h" #include "msgpack/pack.h" #include + #include #include @@ -25,6 +31,10 @@ #include #endif +#if defined(_KERNEL_MODE) +# undef snprintf +# define snprintf _snprintf +#endif int msgpack_pack_object(msgpack_packer* pk, msgpack_object d) { @@ -115,6 +125,7 @@ int msgpack_pack_object(msgpack_packer* pk, msgpack_object d) } } +#if !defined(_KERNEL_MODE) static void msgpack_object_bin_print(FILE* out, const char *ptr, size_t size) { @@ -130,35 +141,6 @@ static void msgpack_object_bin_print(FILE* out, const char *ptr, size_t size) } } -static int msgpack_object_bin_print_buffer(char *buffer, size_t buffer_size, const char *ptr, size_t size) -{ - size_t i; - char *aux_buffer = buffer; - size_t aux_buffer_size = buffer_size; - int ret; - - for (i = 0; i < size; ++i) { - if (ptr[i] == '"') { - ret = snprintf(aux_buffer, aux_buffer_size, "\\\""); - aux_buffer = aux_buffer + ret; - aux_buffer_size = aux_buffer_size - ret; - } else if (isprint((unsigned char)ptr[i])) { - if (aux_buffer_size > 0) { - memcpy(aux_buffer, ptr + i, 1); - aux_buffer = aux_buffer + 1; - aux_buffer_size = aux_buffer_size - 1; - } - } else { - ret = snprintf(aux_buffer, aux_buffer_size, "\\x%02x", (unsigned char)ptr[i]); - aux_buffer = aux_buffer + ret; - aux_buffer_size = aux_buffer_size - ret; - } - } - - return buffer_size - aux_buffer_size; -} - - void msgpack_object_print(FILE* out, msgpack_object o) { switch(o.type) { @@ -270,6 +252,36 @@ void msgpack_object_print(FILE* out, msgpack_object o) } } +#endif + +static int msgpack_object_bin_print_buffer(char *buffer, size_t buffer_size, const char *ptr, size_t size) +{ + size_t i; + char *aux_buffer = buffer; + size_t aux_buffer_size = buffer_size; + int ret; + + for (i = 0; i < size; ++i) { + if (ptr[i] == '"') { + ret = snprintf(aux_buffer, aux_buffer_size, "\\\""); + aux_buffer = aux_buffer + ret; + aux_buffer_size = aux_buffer_size - ret; + } else if (isprint((unsigned char)ptr[i])) { + if (aux_buffer_size > 0) { + memcpy(aux_buffer, ptr + i, 1); + aux_buffer = aux_buffer + 1; + aux_buffer_size = aux_buffer_size - 1; + } + } else { + ret = snprintf(aux_buffer, aux_buffer_size, "\\x%02x", (unsigned char)ptr[i]); + aux_buffer = aux_buffer + ret; + aux_buffer_size = aux_buffer_size - ret; + } + } + + return (int)(buffer_size - aux_buffer_size); +} + int msgpack_object_print_buffer(char *buffer, size_t buffer_size, msgpack_object o) { char *aux_buffer = buffer; @@ -465,7 +477,7 @@ int msgpack_object_print_buffer(char *buffer, size_t buffer_size, msgpack_object #endif } - return buffer_size - aux_buffer_size; + return (int)(buffer_size - aux_buffer_size); }