diff options
Diffstat (limited to 'src/internal')
-rw-r--r-- | src/internal/ntapi_log.h | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/internal/ntapi_log.h b/src/internal/ntapi_log.h new file mode 100644 index 0000000..108bc18 --- /dev/null +++ b/src/internal/ntapi_log.h @@ -0,0 +1,66 @@ +/********************************************************/ +/* ntapi: Native API core library */ +/* Copyright (C) 2013--2016 Z. Gilboa */ +/* Released under GPLv2 and GPLv3; see COPYING.NTAPI. */ +/********************************************************/ + +#include <psxtypes/psxtypes.h> +#include <ntapi/nt_file.h> +#include <ntapi/ntapi.h> +#include "ntapi_impl.h" + +static inline int __ntapi_uintptr_to_utf8(uintptr_t value,unsigned char * buf) +{ + int i,len; + uintptr_t val; + + if (!value) { + *buf = '0'; + len = 1; + } else { + for (len=0,val=value; val; val=val/10,len++); + for (i=len,buf+=len-1; i; i--,buf--,value=value/10) + *buf = '0' + (value % 10); + } + + return len; +} + +static inline ssize_t __ntapi_log_write(void * msg,uint32_t size) +{ + int32_t status; + void * hlog; + nt_iosb iosb; + uintptr_t buffer[8] = {0}; + char * ch = (char *)buffer; + + if (!(hlog = __ntapi_internals()->rtdata->hlog)) + return NT_STATUS_INVALID_HANDLE; + + *ch++ = '@'; + ch += __ntapi_uintptr_to_utf8( + pe_get_current_process_id(), + ch); + *ch++ = ':'; + ch += __ntapi_uintptr_to_utf8( + pe_get_current_thread_id(), + ch); + *ch++ = '@'; + *ch++ = ' '; + + __ntapi->zw_write_file( + hlog, + 0,0,0,&iosb, + buffer, + (uint32_t)(ch-(char *)buffer), + 0,0); + + status = __ntapi->zw_write_file( + hlog, + 0,0,0,&iosb, + msg, + (uint32_t)size, + 0,0); + + return status ? -1 : iosb.info; +} |