From 25347d2a2820f20f30c8556baef36fe6e7067a79 Mon Sep 17 00:00:00 2001 From: midipix Date: May 14 2016 11:18:24 +0000 Subject: internals: __ntapi_log_write(): initial implementation. --- diff --git a/project/headers.mk b/project/headers.mk index 09b3e7c..84db879 100644 --- a/project/headers.mk +++ b/project/headers.mk @@ -69,6 +69,7 @@ INTERNAL_HEADERS = \ $(PROJECT_DIR)/src/internal/./ntapi_fnapi.h \ $(PROJECT_DIR)/src/internal/./ntapi_hash_table.h \ $(PROJECT_DIR)/src/internal/./ntapi_impl.h \ + $(PROJECT_DIR)/src/internal/./ntapi_log.h \ $(PROJECT_DIR)/src/internal/./ntapi_pty.h \ ALL_HEADERS = $(API_HEADERS) $(INTERNAL_HEADERS) \ 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 +#include +#include +#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; +}