From ff22b1948a1f2ee7f62d915c543d46a379e2082e Mon Sep 17 00:00:00 2001 From: midipix Date: Sun, 11 Dec 2016 19:44:51 -0500 Subject: api headers: added visual studio and hosted environment support. --- include/pemagine/bits/nt32/pe_inline_asm__common.h | 89 ++++++++++++++++++++++ include/pemagine/bits/nt32/pe_inline_asm__gcc.h | 89 ---------------------- include/pemagine/bits/nt64/pe_inline_asm__common.h | 87 +++++++++++++++++++++ include/pemagine/bits/nt64/pe_inline_asm__gcc.h | 87 --------------------- include/pemagine/pe_api.h | 1 + include/pemagine/pe_inline_asm.h | 46 +++++++++-- include/pemagine/pemagine.h | 2 +- 7 files changed, 216 insertions(+), 185 deletions(-) create mode 100644 include/pemagine/bits/nt32/pe_inline_asm__common.h delete mode 100644 include/pemagine/bits/nt32/pe_inline_asm__gcc.h create mode 100644 include/pemagine/bits/nt64/pe_inline_asm__common.h delete mode 100644 include/pemagine/bits/nt64/pe_inline_asm__gcc.h (limited to 'include') diff --git a/include/pemagine/bits/nt32/pe_inline_asm__common.h b/include/pemagine/bits/nt32/pe_inline_asm__common.h new file mode 100644 index 0000000..10473b4 --- /dev/null +++ b/include/pemagine/bits/nt32/pe_inline_asm__common.h @@ -0,0 +1,89 @@ +static __inline__ void * pe_get_teb_address(void) +{ + void * ptrRet; + __asm__ __volatile__ ( + "mov %%fs:0x18, %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + + +static __inline__ void * pe_get_peb_address(void) +{ + void * ptrRet; + __asm__ __volatile__ ( + "mov %%fs:0x18, %0\n\t" + "mov %%ds:0x30(%0), %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + + +static __inline__ void * pe_get_peb_address_alt(void) +{ + void * ptrRet; + __asm__ __volatile__ ( + "mov %%fs:0x30, %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + + +static __inline__ void * pe_get_peb_ldr_data_address(void) +{ + void * ptrRet; + __asm__ __volatile__ ( + "mov %%fs:0x18, %0\n\t" + "mov %%ds:0x30(%0), %0\n\t" + "mov %%ds:0x0C(%0), %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + + +static __inline__ void * pe_get_peb_ldr_data_address_alt(void) +{ + void * ptrRet; + __asm__ __volatile__ ( + "mov %%fs:0x30, %0\n\t" + "mov %%ds:0x0C(%0), %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + +static __inline__ uint32_t pe_get_current_process_id(void) +{ + uint32_t ptrRet; + __asm__ __volatile__ ( + "mov %%fs:0x20, %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + +static __inline__ uint32_t pe_get_current_thread_id(void) +{ + uint32_t ptrRet; + __asm__ __volatile__ ( + "mov %%fs:0x24, %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + +static __inline__ uint32_t pe_get_current_session_id(void) +{ + uint32_t ptrRet; + __asm__ __volatile__ ( + "mov %%fs:0x18, %0\n\t" + "mov %%ds:0x30(%0), %0\n\t" + "mov %%ds:0x1d4(%0), %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} diff --git a/include/pemagine/bits/nt32/pe_inline_asm__gcc.h b/include/pemagine/bits/nt32/pe_inline_asm__gcc.h deleted file mode 100644 index 10473b4..0000000 --- a/include/pemagine/bits/nt32/pe_inline_asm__gcc.h +++ /dev/null @@ -1,89 +0,0 @@ -static __inline__ void * pe_get_teb_address(void) -{ - void * ptrRet; - __asm__ __volatile__ ( - "mov %%fs:0x18, %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - - -static __inline__ void * pe_get_peb_address(void) -{ - void * ptrRet; - __asm__ __volatile__ ( - "mov %%fs:0x18, %0\n\t" - "mov %%ds:0x30(%0), %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - - -static __inline__ void * pe_get_peb_address_alt(void) -{ - void * ptrRet; - __asm__ __volatile__ ( - "mov %%fs:0x30, %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - - -static __inline__ void * pe_get_peb_ldr_data_address(void) -{ - void * ptrRet; - __asm__ __volatile__ ( - "mov %%fs:0x18, %0\n\t" - "mov %%ds:0x30(%0), %0\n\t" - "mov %%ds:0x0C(%0), %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - - -static __inline__ void * pe_get_peb_ldr_data_address_alt(void) -{ - void * ptrRet; - __asm__ __volatile__ ( - "mov %%fs:0x30, %0\n\t" - "mov %%ds:0x0C(%0), %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - -static __inline__ uint32_t pe_get_current_process_id(void) -{ - uint32_t ptrRet; - __asm__ __volatile__ ( - "mov %%fs:0x20, %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - -static __inline__ uint32_t pe_get_current_thread_id(void) -{ - uint32_t ptrRet; - __asm__ __volatile__ ( - "mov %%fs:0x24, %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - -static __inline__ uint32_t pe_get_current_session_id(void) -{ - uint32_t ptrRet; - __asm__ __volatile__ ( - "mov %%fs:0x18, %0\n\t" - "mov %%ds:0x30(%0), %0\n\t" - "mov %%ds:0x1d4(%0), %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} diff --git a/include/pemagine/bits/nt64/pe_inline_asm__common.h b/include/pemagine/bits/nt64/pe_inline_asm__common.h new file mode 100644 index 0000000..94d4e34 --- /dev/null +++ b/include/pemagine/bits/nt64/pe_inline_asm__common.h @@ -0,0 +1,87 @@ +static __inline__ void * pe_get_teb_address(void) +{ + void * ptrRet; + __asm__ __volatile__ ( + "mov %%gs:0x30, %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + + +static __inline__ void * pe_get_peb_address(void) +{ + void * ptrRet; + __asm__ __volatile__ ( + "mov %%gs:0x60, %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + + +static __inline__ void * pe_get_peb_address_alt(void) +{ + void * ptrRet; + __asm__ __volatile__ ( + "mov %%gs:0x60, %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + + +static __inline__ void * pe_get_peb_ldr_data_address(void) +{ + void * ptrRet; + __asm__ __volatile__ ( + "mov %%gs:0x60, %0\n\t" + "mov %%ds:0x18(%0), %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + + +static __inline__ void * pe_get_peb_ldr_data_address_alt(void) +{ + void * ptrRet; + __asm__ __volatile__ ( + "mov %%gs:0x60, %0\n\t" + "mov %%ds:0x18(%0), %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + + +static __inline__ uint32_t pe_get_current_process_id(void) +{ + uint32_t ptrRet; + __asm__ __volatile__ ( + "mov %%gs:0x40, %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + +static __inline__ uint32_t pe_get_current_thread_id(void) +{ + uint32_t ptrRet; + __asm__ __volatile__ ( + "mov %%gs:0x48, %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} + +static __inline__ uint32_t pe_get_current_session_id(void) +{ + uint32_t ptrRet; + __asm__ __volatile__ ( + "mov %%gs:0x60, %0\n\t" + "mov %%ds:0x2c0(%0), %0\n\t" + : "=r" (ptrRet) : : + ); + return ptrRet; +} diff --git a/include/pemagine/bits/nt64/pe_inline_asm__gcc.h b/include/pemagine/bits/nt64/pe_inline_asm__gcc.h deleted file mode 100644 index 94d4e34..0000000 --- a/include/pemagine/bits/nt64/pe_inline_asm__gcc.h +++ /dev/null @@ -1,87 +0,0 @@ -static __inline__ void * pe_get_teb_address(void) -{ - void * ptrRet; - __asm__ __volatile__ ( - "mov %%gs:0x30, %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - - -static __inline__ void * pe_get_peb_address(void) -{ - void * ptrRet; - __asm__ __volatile__ ( - "mov %%gs:0x60, %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - - -static __inline__ void * pe_get_peb_address_alt(void) -{ - void * ptrRet; - __asm__ __volatile__ ( - "mov %%gs:0x60, %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - - -static __inline__ void * pe_get_peb_ldr_data_address(void) -{ - void * ptrRet; - __asm__ __volatile__ ( - "mov %%gs:0x60, %0\n\t" - "mov %%ds:0x18(%0), %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - - -static __inline__ void * pe_get_peb_ldr_data_address_alt(void) -{ - void * ptrRet; - __asm__ __volatile__ ( - "mov %%gs:0x60, %0\n\t" - "mov %%ds:0x18(%0), %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - - -static __inline__ uint32_t pe_get_current_process_id(void) -{ - uint32_t ptrRet; - __asm__ __volatile__ ( - "mov %%gs:0x40, %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - -static __inline__ uint32_t pe_get_current_thread_id(void) -{ - uint32_t ptrRet; - __asm__ __volatile__ ( - "mov %%gs:0x48, %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} - -static __inline__ uint32_t pe_get_current_session_id(void) -{ - uint32_t ptrRet; - __asm__ __volatile__ ( - "mov %%gs:0x60, %0\n\t" - "mov %%ds:0x2c0(%0), %0\n\t" - : "=r" (ptrRet) : : - ); - return ptrRet; -} diff --git a/include/pemagine/pe_api.h b/include/pemagine/pe_api.h index e192484..c6c456b 100644 --- a/include/pemagine/pe_api.h +++ b/include/pemagine/pe_api.h @@ -6,6 +6,7 @@ #include #else #include +#include #endif /* pe_export */ diff --git a/include/pemagine/pe_inline_asm.h b/include/pemagine/pe_inline_asm.h index 65e1376..d1613e7 100644 --- a/include/pemagine/pe_inline_asm.h +++ b/include/pemagine/pe_inline_asm.h @@ -1,16 +1,44 @@ -#if defined(__NT32) -#if (__COMPILER__ == __GCC__) -#include "bits/nt32/pe_inline_asm__gcc.h" -#elif (__COMPILER__ == __MSVC__) +#ifndef _PE_INLINE_ASM_H_ +#define _PE_INLINE_ASM_H_ + +#include "pe_api.h" + +#ifdef _MSC_VER + +/* visual studio: begin */ +#ifdef _M_IX86 +#ifndef __SIZEOF_POINTER__ +#define __SIZEOF_POINTER__ 4 +#endif +#endif + +#ifdef _M_X64 +#ifndef __SIZEOF_POINTER__ +#define __SIZEOF_POINTER__ 8 +#endif +#endif + +#if (__SIZEOF_POINTER__ == 4) #include "bits/nt32/pe_inline_asm__msvc.h" #endif -#elif defined(__NT64) -#if (__COMPILER__ == __GCC__) -#include "bits/nt64/pe_inline_asm__gcc.h" -#elif (__COMPILER__ == __MSVC__) +#if (__SIZEOF_POINTER__ == 8) #include "bits/nt64/pe_inline_asm__msvc.h" #endif +/* visual studio: end */ + +#else + +/* all other compilers: begin */ +#if (__SIZEOF_POINTER__ == 4) +#include "bits/nt32/pe_inline_asm__common.h" +#endif + +#if (__SIZEOF_POINTER__ == 8) +#include "bits/nt64/pe_inline_asm__common.h" +#endif +/* all other compilers: end */ + #endif /* trivial */ @@ -18,3 +46,5 @@ static __inline__ void * pe_va_from_rva(const void * base, intptr_t offset) { return (void *)((intptr_t)base + offset); } + +#endif diff --git a/include/pemagine/pemagine.h b/include/pemagine/pemagine.h index 67159d0..ac84a97 100644 --- a/include/pemagine/pemagine.h +++ b/include/pemagine/pemagine.h @@ -188,7 +188,7 @@ pe_api int pe_enum_image_import_hdrs (const void * base, pe_api int pe_enum_modules_in_load_order (pe_enum_modules_callback *, void * ctx); pe_api int pe_enum_modules_in_memory_order (pe_enum_modules_callback *, void * ctx); pe_api int pe_enum_modules_in_init_order (pe_enum_modules_callback *, void * ctx); -pe_api void * pe_get_module_handle (const wchar16_t * name); +pe_api void * pe_get_module_handle (const uint16_t * name); pe_api void * pe_get_first_module_handle (void); /* process: system api */ -- cgit v1.2.3