Blob Blame History Raw
/********************************************************/
/*  ntapi: Native API core library                      */
/*  Copyright (C) 2013--2017  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;
}