//|_ _ _. _ ._ |_ _. _ | //| | (/_ (_| \/ (/_ | | | | (_| (_ |< #include "util.h" #include "syscall.h" ULONG u_thread_create( LPTHREAD_START_ROUTINE routine, void* param ) { REG64 thread; ULONG ret_id; #ifndef X64 nt_create_thread64( &thread, 0x1fffff, 0, GetCurrentProcess(), routine, param, 0 ); ret_id = GetThreadId( (HANDLE)thread.u32[0] ); nt_close64( thread ); #else static auto nt_create_thread = (NTSTATUS(__stdcall*)( PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, HANDLE, PCLIENT_ID, PCONTEXT, PINITIAL_TEB, BOOLEAN) )GetProcAddress( GetModuleHandleA( "ntdll.dll" ), "NtCreateThread" ); //aaa #endif return ret_id; } ULONG u_thread_create( HANDLE proc, LPTHREAD_START_ROUTINE routine, void* param ) { REG64 thread; ULONG ret_id; nt_create_thread64( &thread, 0x1fffff, 0, proc, routine, param, 0 ); ret_id = GetThreadId( (HANDLE)thread.u32[0] ); nt_close64( thread ); return ret_id; } void u_sleep( U64 ns ) { static bool resolution_set = false; if( !resolution_set ) { ULONG timer_resolution; nt_set_timer_resolution64( 1, true, &timer_resolution ); resolution_set = true; } LARGE_INTEGER interval; interval.QuadPart = -1 * ns; nt_delay_execution64( false, &interval ); } void u_bin_dump( void* data, U64 size, U32 stride ) { if( stride < 1 ) stride = 8; U8* bytes = (U8*)data; for( U64 i = 0; i < size; ++i ) { if( i % stride == 0 ) clogc( CONFG_LIGHTGREEN, "[0x%02X] | ", i ); clogc( bytes[i]? CONFG_WHITE : CONFG_RED, "%02X ", bytes[i] ); if( i % stride == (stride - 1) ) printf( "\n" ); } }