newport_os 0.2.0

Os abstractions for engine use
use super::*;

#[repr(C)]
#[derive(Copy, Clone, Default)]
struct Oem_ID {
	wProcessorArchitecture: WORD,
	wReserved: WORD,
}

#[repr(C)]
union Oem_Union {
	dwOemId: DWORD,
	internal: Oem_ID,
}

#[repr(C)]
struct SYSTEM_INFO {
	oem_id: Oem_Union,
	dwPageSize: DWORD,
	lpMinimumApplicationAddress: LPVOID,
	lpMaximumApplicationAddress: LPVOID,
	dwActiveProcessorMask: DWORD_PTR,
	dwNumberOfProcessors: DWORD,
	dwProcessorType: DWORD,
	dwAllocationGranularity: DWORD,
	wProcessorLevel: WORD,
	wProcessorRevision: WORD,
}
type LPSYSTEM_INFO = *mut SYSTEM_INFO;

#[repr(C)]
#[derive(Copy, Clone)]
enum PROCESSOR_CACHE_TYPE {
	CacheUnified,
	CacheInstruction,
	CacheData,
	CacheTrace,
}

impl Default for PROCESSOR_CACHE_TYPE {
	fn default() -> Self {
		PROCESSOR_CACHE_TYPE::CacheUnified
	}
}

#[repr(C)]
#[derive(Copy, Clone, Default)]
struct CACHE_DESCRIPTOR {
	Level: BYTE,
	Associativity: BYTE,
	LineSize: WORD,
	Size: DWORD,
	Type: PROCESSOR_CACHE_TYPE,
}

#[repr(C)]
#[derive(Clone, Copy, PartialEq)]
enum LOGICAL_PROCESSOR_RELATIONSHIP {
	RelationProcessorCore,
	RelationNumaNode,
	RelationCache,
	RelationProcessorPackage,
	RelationGroup,
	RelationAll,
}

impl Default for LOGICAL_PROCESSOR_RELATIONSHIP {
	fn default() -> Self {
		LOGICAL_PROCESSOR_RELATIONSHIP::RelationProcessorCore
	}
}

#[repr(C)]
#[derive(Clone, Copy)]
union SYSTEM_LOGICAL_PROCESSOR_INFORMATION_UNION {
	ProcessorCoreFlags: BYTE,
	NodeNumber: DWORD,
	Cache: CACHE_DESCRIPTOR,
	Reserved: [ULONGLONG; 2],
}

impl Default for SYSTEM_LOGICAL_PROCESSOR_INFORMATION_UNION {
	fn default() -> Self {
		SYSTEM_LOGICAL_PROCESSOR_INFORMATION_UNION {
			ProcessorCoreFlags: 0,
		}
	}
}

#[repr(C)]
#[derive(Clone, Copy, Default)]
struct SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
	ProcessorMask: ULONG_PTR,
	Relationship: LOGICAL_PROCESSOR_RELATIONSHIP,
	Union: SYSTEM_LOGICAL_PROCESSOR_INFORMATION_UNION,
}
type PSYSTEM_LOGICAL_PROCESSOR_INFORMATION = *mut SYSTEM_LOGICAL_PROCESSOR_INFORMATION;

#[repr(C)]
#[derive(Clone, Copy, Default)]
pub struct SYSTEMTIME {
	pub wYear: WORD,
	pub wMonth: WORD,
	pub wDayOfWeek: WORD,
	pub wDay: WORD,
	pub wHour: WORD,
	pub wMinute: WORD,
	pub wSecond: WORD,
	pub wMilliseconds: WORD,
}
pub type LPSYSTEMTIME = *mut SYSTEMTIME;

pub const MEM_COMMIT: DWORD = 0x00001000;
pub const MEM_RESERVE: DWORD = 0x00002000;
pub const MEM_RELEASE: DWORD = 0x00008000;

pub const PAGE_READWRITE: DWORD = 0x04;

#[link(name = "kernel32")]
extern "stdcall" {
	pub fn CloseHandle(hObject: HANDLE) -> BOOL;
	pub fn GetModuleHandleA(lpModuleName: LPCSTR) -> HMODULE;

	pub fn GetProcAddress(hModule: HMODULE, lpProcName: LPCSTR) -> LPVOID;
	pub fn LoadLibraryA(lpLibFileName: LPCSTR) -> HMODULE;
	pub fn FreeLibrary(hLibModule: HMODULE) -> BOOL;

	fn GlobalAlloc(uFlags: UINT, dwBytes: SIZE_T) -> HGLOBAL;
	fn GlobalLock(hMem: HGLOBAL) -> LPVOID;
	fn GlobalUnlock(hMem: HGLOBAL) -> BOOL;
	fn GlobalFree(hMem: HGLOBAL) -> HGLOBAL;

	fn GetSystemInfo(lpSystemInfo: LPSYSTEM_INFO);
	fn GetLogicalProcessorInformation(
		Buffer: PSYSTEM_LOGICAL_PROCESSOR_INFORMATION,
		ReturnedLength: PDWORD,
	) -> BOOL;

	pub fn GetLastError() -> DWORD;

	pub fn GetLocalTime(lpSystemTime: LPSYSTEMTIME);

	fn HeapAlloc(hHeap: HANDLE, dwFlags: DWORD, dwBytes: SIZE_T) -> LPVOID;
	fn HeapReAlloc(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID, dwBytes: SIZE_T) -> LPVOID;
	fn HeapFree(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL;
	fn GetProcessHeap() -> HANDLE;

	fn VirtualAlloc(
		lpAddress: LPVOID,
		dwSize: SIZE_T,
		flAlloactionType: DWORD,
		flProtect: DWORD,
	) -> LPVOID;
	fn VirtualFree(lpAddress: LPVOID, dwSize: SIZE_T, dwFreeType: DWORD) -> BOOL;
}