/********************************************************/
/* 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};
unsigned char * ch = (unsigned 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-(unsigned 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;
}