⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 klmisc.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 2 页
字号:
	CALLSTACK cs;
//	CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );
	BOOL   retv = FALSE;

	if( KC_EnterAPIHandle( API_FILESYS, FILE_DEVICEIOCONTROL, &pDeviceIoControl, &cs, &hFile ) )
	{
        lpInBuf = MapProcessPtr( lpInBuf, (LPPROCESS)cs.lpvData );
		lpOutBuf = MapProcessPtr( lpOutBuf, (LPPROCESS)cs.lpvData );
		lpdwBytesReturned = MapProcessPtr( lpdwBytesReturned, (LPPROCESS)cs.lpvData );
		lpOverlapped = MapProcessPtr( lpOverlapped, (LPPROCESS)cs.lpvData );

		retv = pDeviceIoControl( hFile, dwIoControlCode, lpInBuf, nInBufSize, lpOutBuf, nOutBufSize, lpdwBytesReturned, lpOverlapped );
		KL_LeaveAPI(  );
	}
#ifndef INLINE_PROGRAM
	else
	{
		hFile = HandleToPtr( hFile, -1 );
		retv = ROM_DeviceIoControl( hFile, dwIoControlCode, lpInBuf, nInBufSize, lpOutBuf, nOutBufSize, lpdwBytesReturned, lpOverlapped );
	}
#endif

	//KHeap_Free( lpcs, sizeof( CALLSTACK ) );
	return retv;
}

// ********************************************************************
//声明:HANDLE WINAPI KL_LoadImage( 
//                     HINSTANCE hinst,
//                     LPCTSTR lpszName, 
//                     UINT uType, 
//                     int cxDesired, 
//                     int cyDesired, 
//                     UINT fuLoad 
//                     )
//参数:
//	hinst - 模块句柄
//	lpszName - 需要装入的映象名。假如hinst为NULL并且fuLoad标志含有LR_LOADFROMFILE,该参数表示一个文件名;假如hinst为非NULL并且fuLoad标志没有LR_LOADFROMFILE,则该参数表示一个在资源里的映象名。用MAKEINTRESOURCE去转化资源ID值为LPCTSTR类型值
//	uType - 需要装入的资源类型,可以为以下值:
//		IMAGE_BITMAP - 位图
//		IMAGE_CURSOR - 光标
//		IMAGE_ICON - 图标
//	cxDesired - 需要装入的光标或图标资源宽度,假如是0并且fuLoad含有LR_DEFAULTSIZE标志,
//				则系统用SM_CXICON或SM_CXCURSOR系统度量去设置该值,假如是0并且fuLoad没有LR_DEFAULTSIZE标志,则系统用资源的真实的宽度
//	cyDesired - 需要装入的光标或图标资源高度,假如是0并且fuLoad含有LR_DEFAULTSIZE标志,
//				则系统用SM_CXICON或SM_CXCURSOR系统度量去设置该值,假如是0并且fuLoad没有LR_DEFAULTSIZE标志,则系统用资源的真实的高度
//	fuLoad - 为以下值:
//		LR_LOADFROMFILE - 从文件装入资源
//		LR_DEFAULTSIZE - 用默认的系统度量
//		LR_SHARED - 是否共享该资源。假如该标志设置,第二次装入该资源不会产生新的拷贝,只会增加该资源的引用计数;否则会产生新的拷贝并返回不同的句柄
//返回值:
//	假如成功,返回有效的句柄值,负责返回NULL
//功能描述:
//	装入一个位图、图标、光标
//引用:
//	由内核使用
// ********************************************************************
typedef HANDLE ( WINAPI * PGDI_LOADIMAGE )( 
                     HINSTANCE hinst,
                     LPCTSTR lpszName, 
                     UINT uType, 
                     int cxDesired, 
                     int cyDesired, 
                     UINT fuLoad 
                     );
HANDLE WINAPI KL_LoadImage( 
                     HINSTANCE hinst,
                     LPCTSTR lpszName, 
                     UINT uType, 
                     int cxDesired, 
                     int cyDesired, 
                     UINT fuLoad 
                     )
{
	PGDI_LOADIMAGE pLoadImage;

	HANDLE retv = NULL;
	CALLSTACK cs;
//	CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );

	if( KC_EnterAPI( API_GDI, GDI_LOADIMAGE, &pLoadImage, &cs ) )
	{
		lpszName = MapProcessPtr( lpszName, (LPPROCESS)cs.lpvData );

		retv = pLoadImage( hinst, lpszName, uType, cxDesired, cyDesired, fuLoad );
		KL_LeaveAPI(  );
	}

	//KHeap_Free( lpcs, sizeof( CALLSTACK ) );
	return retv;
}

// ********************************************************************
//声明:int WINAPI KL_GetSysMetrics( int nIndex )
//参数:
//	IN nIndex - 索引值
//返回值:
//	返回量度值
//功能描述:
//	返回系统量度
//引用:
//	由内核使用
// ********************************************************************
typedef int ( WINAPI * PSYS_GETMETRICS )( int );
int WINAPI KL_GetSysMetrics( int nIndex )
{
	PSYS_GETMETRICS pGetMetrics;

	CALLSTACK cs;
//	CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );
	int   retv = 0;

	if( KC_EnterAPI( API_GWE, SYS_GETMETRICS, &pGetMetrics, &cs ) )
	{
		retv = pGetMetrics( nIndex );
		KL_LeaveAPI(  );
	}

	//KHeap_Free( lpcs, sizeof( CALLSTACK ) );
	return retv;
}


// ********************************************************************
//声明:BOOL WINAPI KL_DebugOutString( LPTSTR lpszStr )
//参数:
//	IN lpszStr - 字符串
//返回值:
//	假如成功,返回TRUE;否则返回FALSE
//功能描述:
//	输出调试信息
//引用:
//	系统API
// ********************************************************************

BOOL WINAPI KL_DebugOutString( LPTSTR lpszStr )
{
	OEM_WriteDebugString( lpszStr );
	return TRUE;
}

// ********************************************************************
//声明:LPCVOID WINAPI KL_GetSysTOC( void )
//参数:
//	无
//返回值:
//	返回TOC
//功能描述:
//	返回系统的TOC信息
//引用:
//	系统API
// ********************************************************************

LPCVOID WINAPI KL_GetSysTOC( void )
{
#ifdef EML_WIN32
	return NULL;
#else
	#ifndef INLINE_PROGRAM
	    typedef struct ROMHDR;
	    extern struct ROMHDR * const pTOC;

	    return pTOC;
    #else
	    return NULL;
    #endif
#endif
}

#ifndef INLINE_PROGRAM

void __AssertFail( char *__msg, char *__cond, char *__file, int __line, char * __notify )
{	
	if( __notify )
	{
		EdbgOutputDebugString( "%s", __notify );
	}
	EdbgOutputDebugString(__msg, __cond, __file, __line);
}

#else

LPVOID WINAPI KL_OpenDllModule( LPCTSTR lpcszName, UINT uiMode, LPVOID lpvCaller )
{
	return NULL;
}
int WINAPI KL_OpenDllDependence( LPVOID lpvModule, UINT uiMode )
{
	return 0;
}

#endif


static TCHAR * lpszComputerNameNetBIOS;
BOOL InitComputerName( void )
{
	static const TCHAR szKingmos[] = "Kingmos";
	lpszComputerNameNetBIOS = (TCHAR*)KHeap_AllocString( sizeof(szKingmos) );
	if( lpszComputerNameNetBIOS )
	{
		strcpy( lpszComputerNameNetBIOS, szKingmos );
	    return TRUE;
	}
	return FALSE;
}

// ********************************************************************
//声明:BOOL WINAPI KL_GetComputerNameEx(
//								 COMPUTER_NAME_FORMAT NameType,  // name type
//								 LPTSTR lpBuffer,                // name buffer
//								 LPDWORD lpnSize                 // size of name buffer
//								 )
//参数:
//	IN NameType - 类型,包含:
//				ComputerNameNetBIOS - NetBIOS名
//	OUT lpBuffer - 用于接受数据的内存
//	IN/OUT lpnSize - 输入lpBuffer的长度,输出需要拷贝的字符串长度(含'\0'结束符)
//返回值:
//	假如成功,返回TRUE; 否则,返回FALSE
//功能描述:
//	得到计算机名
//引用:
//	系统API
// ********************************************************************

BOOL WINAPI KL_GetComputerNameEx(
								 COMPUTER_NAME_FORMAT NameType,  // name type
								 LPTSTR lpBuffer,                // name buffer
								 LPDWORD lpnSize                 // size of name buffer
								 )
{
	BOOL bRetv = FALSE;
	if( ComputerNameNetBIOS == NameType )
	{
		UINT len = 0;

		if( lpszComputerNameNetBIOS && 
			(len = strlen( lpszComputerNameNetBIOS )) < *lpnSize )
		{
		    strcpy( lpBuffer, lpszComputerNameNetBIOS );
			bRetv = TRUE;
		}
		*lpnSize = len + 1;
	}
	else
		KL_SetLastError( ERROR_INVALID_PARAMETER );
	return bRetv;
}


// ********************************************************************
//声明:BOOL WINAPI KL_SetComputerNameEx(
//								 COMPUTER_NAME_FORMAT NameType,  // name type
//								 LPCTSTR lpBuffer                // name buffer
//								 )
//参数:
//	IN NameType - 类型,包含:
//				ComputerNameNetBIOS - NetBIOS名
//	IN lpBuffer - 需要设置的名字
//返回值:
//	假如成功,返回TRUE; 否则,返回FALSE
//功能描述:
//	设置计算机名
//引用:
//	系统API
// ********************************************************************

BOOL WINAPI KL_SetComputerNameEx(
								  COMPUTER_NAME_FORMAT NameType,  // name type 
								  LPCTSTR lpBuffer                // new name buffer 
								  )
{
	BOOL bRetv = FALSE;
	if( ComputerNameNetBIOS == NameType )
	{
		int len;
		//释放之前的名字		
		if( lpszComputerNameNetBIOS )
			KHeap_FreeString( lpszComputerNameNetBIOS );
		len = strlen( lpBuffer ) + 1;
		//重新分配内存
	    lpszComputerNameNetBIOS = KHeap_AllocString( len );
	    if( lpszComputerNameNetBIOS )
		    strcpy( lpszComputerNameNetBIOS, lpBuffer );
	}
	else
		KL_SetLastError( ERROR_INVALID_PARAMETER );
	return bRetv;
}


// ********************************************************************
//声明:BOOL WINAPI KL_RegistryIO( DWORD dwFlag, LPVOID lpDataBuf, DWORD nNumberOfBytes );
//参数:
//	IN/OUT lpDataBuf - 用于保存或写入的数据
//  IN nNumberOfBytes - lpDataBuf 的数据量
//	IN dwFlag - 以下类型的组合:
//                   REGIO_BEGIN - 第一次操作
//                   REGIO_READ -  读
//                   REGIO_WRITE - 写
//                   REGIO_END -   结束操作
//返回值:
//	假如成功,返回TRUE; 否则,返回FALSE
//功能描述:
//	输入输出注册表
//引用:
//	系统API
// ********************************************************************

LPOEM_REGISTRYIO lpOEM_RegistryIO;

BOOL WINAPI KL_RegistryIO( LPBYTE lpDataBuf, DWORD nNumberOfBytes, DWORD dwFlag )
{
	if( lpOEM_RegistryIO )
		return lpOEM_RegistryIO( lpDataBuf, nNumberOfBytes, dwFlag );
	return FALSE;
}

// *****************************************************************
// 声明:VOID DumpCallStack( LPTHREAD lpThread )
// 参数:
//		IN lpThread - 线程结构指针
// 返回值:
//		无
// 功能描述:
//		一个调试函数,用于输出当前的系统调用链
// 引用:
//		内部使用
// *****************************************************************

VOID DumpCallStack( LPTHREAD lpThread )
{
	if( lpThread->lpCallStack )
	{
		CALLSTACK * lpcs = lpThread->lpCallStack;
		do{
	        EdbgOutputDebugString("lpcs(0x%x),CallStack APIId(%d),OptionId(%d),RetAdr(0x%x).\r\n", 
	                               lpcs,
	                               GET_APIID( lpcs->dwCallInfo ), 
	                               GET_OPTIONID( lpcs->dwCallInfo ), 
	                               lpcs->pfnRetAdress );
	        lpcs = lpcs->lpNext;
		}while( lpcs );
	}
}

// *****************************************************************
// 声明:BOOL WINAPI KL_KernelIoControl(
//				   HANDLE hOpenFile,
//				   DWORD  dwIoControlCode,
//				   LPVOID lpvInBuf,
//				   DWORD dwInBufSize,
//				   LPVOID lpvOutBuf,
//				   DWORD dwOutBufSize,
//				   LPDWORD lpdwBytesReturned,
//				   LPOVERLAPPED lpOverlapped )
// 参数:
//		IN hOpenFile - 已打开文件句柄
//		IN dwIoControlCode - I/O控制代码
//		IN lpvInBuf - 输入参数内存地址
//		IN dwInBufSize - lpvInBuf的内存大小
//		OUT lpvOutBuf - 输出数据内存地址
//		IN dwOutBufSize - lpvOutBuf的内存大小
//		OUT lpdwBytesReturned - 写入lpvOutBuf的数据大小
//		IN lpOverlapped - 不支持(为NULL)
// 返回值:
//		假如成功,返回TRUE; 否则,返回FALSE
// 功能描述:
//		内核I/O控制函数入口,通过发不同的控制代码已实现对内核的管理控制
// 引用:
//		系统API 
// *****************************************************************

BOOL WINAPI KL_KernelIoControl ( 
			DWORD dwIoControlCode, 
			LPVOID lpInBuf, 
			DWORD nInBufSize, 
			LPVOID lpOutBuf, 
			DWORD nOutBufSize, 
			LPDWORD lpBytesReturned )
{
	return FALSE;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -