namespace preload;
self.raw = global.raw;

namespace raw{
	convertArray = function(p,l,t="pointer"){
		if(!p) return; 
		
		var a; 
		if(type(t)=="class") t = t();
		
		if( !t[["_struct"]] ) a = toarray(l,t,"v" );
		else{
	    	a = toarray(l,"struct","v");a.v = {t};
		} 
		
		return convert(p,a).v;
	};
	mixin = function(p,s,v,...){
 		if(v){
    		convert(p, s);
    		..table.assign(s,v,...)
    	}
    	convert(s,p);
    	return s;
	};
	dup = function(h,src,dst,inherit){
		var t = {ptr v}
		if( ::Kernel32.DuplicateHandle(src:-1,h,dst :-1,t,0,inherit,2) ) return t.v;
	};
	serializeDupHandle = function(cls,handle){ 
		return ..string.format("global.import('%s') : %s( ..raw.dup(topointer(0x%p)),true)",cls,cls,topointer(handle) );
	};
	malloc = buffer;
	
	__module__ = {};
	module = function(cal){
		if(!cal)cal="stdcall";
		if( __module__[cal] ) return __module__[cal];
		__module__[cal] = loadDll(,,cal); 
		return __module__[cal];
	};
	main = module("stdcall");
}

/**intellisense(raw)
mixin(.(指针,结构体对象,任意个混入对象) = 混入新的值,支持任意个混入table对象,\n自动更新指针指向内存,并返回结构体对象
convertArray(.(源内存指针,源数组长度,"数据类型") = 将指针指向的内存转换为普通数组,传入空指针返回空值\n数据类型参数可省略,默认为"pointer"\n类型类型也可以直接传入一个声明元素类型的结构体参数\n注意该函数不会检测内存溢出错误,调用该函数时必须保证数组长度是正确的值
dup(.(源句柄,源进程,目标进程,允许子进程继承) = 返回复制的系统句柄\n除参数1之外,其他参数可选\n默认仅在当前进程中复制句柄\n复制的句柄应使用raw.closehandle释放
serializeDupHandle(.("类名",句柄) = 复制进程内有效句柄并序列化对象\n只能用于_serialize元方法，且必须kernelCall参数为真\n序列化类构造函数必须支持指针参数1为指针类型句柄,参数2为true的参数\n并负责在析构函数中调用 raw.closehandle 释放该句柄
module() = !dllModule.
module(.("调用约定") = 指定约定并返回进程主模块, \n省略参数时调用约定默认为stdcall,\n可用于将当前进程中的函数指针转换为aardio函数,
main = 进程主模块,默认调用约定为stdcall\n与raw.module("stdcall")返回的值相同,\n可用于将当前进程中的函数指针转换为aardio函数\n!dllModule.
end intellisense**/
