📄 klmisc.c
字号:
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 + -