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

📄 sthvxd.c

📁 编程高手箴言-原书源码
💻 C
字号:
/////////////////////////////////////////////////////////////////////////////
//
//		VXD工作代码(由汇编调用)
//
//			梁肇新
//
//		北京豪杰计算机技术有限公司
//
/////////////////////////////////////////////////////////////////////////////
#define WANTVXDWRAPS

#include <windows.h>
#include <basedef.h>
#include <vmm.h>
#include <debug.h>
#include <vxdwraps.h>
#include <vwin32.h>
#include <winerror.h>

#define CVXD_VERSION 0x400

#define CVXD_V86_FUNCTION1 1
#define CVXD_V86_FUNCTION2 2
#define CVXD_PM_FUNCTION1  1
#define CVXD_PM_FUNCTION2  2

typedef DIOCPARAMETERS *LPDIOC;

#pragma VxD_LOCKED_CODE_SEG
#pragma VxD_LOCKED_DATA_SEG

//DeviceIoControl函数
DWORD _stdcall CVXD_W32_DeviceIOControl(CRS *, DWORD, DWORD, DWORD, LPDIOC);
//清除
DWORD _stdcall CVXD_CleanUp(void);

//DeviceIoControl功能函数
DWORD _stdcall CVXD_W32_EnableHalt(CRS *, DWORD, DWORD, LPDIOC);

//DeviceIoControl功能号表
DWORD (_stdcall *CVxD_W32_Proc[])(CRS *,DWORD,DWORD,LPDIOC)=
{
	0,			//1(未使用)
	0,			//2(未使用)
	CVXD_W32_EnableHalt	//3(开关降温功能)
};
#define MAX_CVXD_W32_API (sizeof(CVxD_W32_Proc)/sizeof(DWORD))

//开关降温
DWORD	EnableHlt=0;

/////////////////////////////////////////////////////////////////////////////
//			  CVXD_W32_DeviceIOControl
//
//		应用程序->DeviceIoControl->内核->由汇编调用->这里
//
/////////////////////////////////////////////////////////////////////////////
DWORD _stdcall CVXD_W32_DeviceIOControl(CRS * lpClient,
					DWORD  dwService,
					DWORD  dwDDB,
					DWORD  hDevice,
					LPDIOC lpDIOCParms)
{
	DWORD dwRetVal = 0;
	
	// DIOC_OPEN is sent when VxD is loaded w/ CreateFile
	//  (this happens just after SYS_DYNAMIC_INIT)
	if( dwService == DIOC_OPEN )
		{
		//		Out_Debug_String("SthVXD: WIN32 DEVIOCTL supported here!\n\r");
		// Must return 0 to tell WIN32 that this VxD supports DEVIOCTL
		dwRetVal = 0;
		}
	// DIOC_CLOSEHANDLE is sent when VxD is unloaded w/ CloseHandle
	//  (this happens just before SYS_DYNAMIC_EXIT)
	else 	if( dwService == DIOC_CLOSEHANDLE )
		{
		// Dispatch to cleanup proc
		dwRetVal = CVXD_CleanUp();
		}
	else 	if( dwService > MAX_CVXD_W32_API )
		{
		// Returning a positive value will cause the WIN32 DeviceIOControl
		// call to return FALSE, the error code can then be retrieved
		// via the WIN32 GetLastError
		dwRetVal = ERROR_NOT_SUPPORTED;
		}
	else	{
		//调用功能函数功能号从1开始
		dwRetVal=(CVxD_W32_Proc[dwService-1])(lpClient,dwDDB,hDevice,lpDIOCParms);
		}
	return(dwRetVal);
}

/////////////////////////////////////////////////////////////////////////////
//
//			开关降温功能(功能号3)
//
/////////////////////////////////////////////////////////////////////////////
DWORD _stdcall CVXD_W32_EnableHalt(CRS * lpClient,DWORD dwDDB, DWORD hDevice, LPDIOC lpDIOCParms)
{
	LPDWORD	lpEnablePtr;
	DWORD	OldEnable;
	
	OldEnable	=EnableHlt;
	lpEnablePtr	=(LPDWORD)lpDIOCParms->lpvOutBuffer;
	if(lpEnablePtr)	EnableHlt=*lpEnablePtr;
	
	return(OldEnable);
}

//汇编定义的函数
void	IDLEHandleProc(void);
int	InstallIDLEProc(void);
int	UnInstallIDLEProc(void);

/////////////////////////////////////////////////////////////////////////////
//
//
//
/////////////////////////////////////////////////////////////////////////////
DWORD _stdcall CVXD_Dynamic_Exit(void)
{
	//	Out_Debug_String("SthVXD: Dynamic Exit\n\r");
	
	//卸除内核空闲函数
	UnInstallIDLEProc();
	return(VXD_SUCCESS);
}

/////////////////////////////////////////////////////////////////////////////
//
//
//
/////////////////////////////////////////////////////////////////////////////
DWORD _stdcall CVXD_CleanUp(void)
{
	//	Out_Debug_String("SthVXD: Cleaning Up\n\r");
	return(VXD_SUCCESS);
}

/////////////////////////////////////////////////////////////////////////////
//
//                CVXD_V86API
//
//    入口:	function功能号
//		parm1
//		parm2
//
//    出口:    无
/////////////////////////////////////////////////////////////////////////////
int _stdcall CVXD_V86API(unsigned int function,
			 unsigned int parm1,
			 unsigned int parm2)
{
	int retcode;
	
	//	Out_Debug_String("******* CVXD: V86 API Call\n\r");
	
	switch (function)
		{
		case CVXD_V86_FUNCTION1:
			retcode = V86Func1(parm1);
			break;
			
		case CVXD_V86_FUNCTION2:
			retcode = V86Func2(parm1, parm2);
			break;
			
		default:
			retcode = FALSE;
			break;
		}
	
	return (retcode);
}

/////////////////////////////////////////////////////////////////////////////
//                CVXD_PMAPI
//
//    入口:	function功能号
//		parm1
//		parm2
//
//    出口:    无
/////////////////////////////////////////////////////////////////////////////
int _stdcall CVXD_PMAPI(unsigned int function,
			unsigned int parm1,
			unsigned int parm2)
{
	int retcode;
	
	switch (function)
		{
		case CVXD_PM_FUNCTION1:
			retcode = PMFunc1(parm1);
			break;
			
		case CVXD_PM_FUNCTION2:
			retcode = PMFunc2(parm1, parm2);
			break;
		default:
			retcode = 0;
			break;
		}
	
	return (retcode);
}


/////////////////////////////////////////////////////////////////////////////
//                V86Func1
//
//    入口: parm1
//
//    出口: 1
/////////////////////////////////////////////////////////////////////////////
int V86Func1(unsigned int parm1)
{
	//	Out_Debug_String("******* CVXD: V86 API 2 Call\n\r");
	return (1);
}

/////////////////////////////////////////////////////////////////////////////
//                V86Func2
//
//    入口: parm1
//          parm2
//
//    出口: 2
/////////////////////////////////////////////////////////////////////////////
int V86Func2(unsigned int parm1,
	     unsigned int parm2)
{
	//	Out_Debug_String("******* CVXD: V86 API 2 Call\n\r");
	return (2);
}

/////////////////////////////////////////////////////////////////////////////
//                PMFunc1
//
//    入口: parm1
//
//    出口: 1
///////////////////////////////////////////////////////////////////////////
int PMFunc1(unsigned int parm1)
{
	//	Out_Debug_String("******* CVXD: PM API 1 Call\n\r");
	return (1);
}

/////////////////////////////////////////////////////////////////////////////
//                PMFunc2
//
//    入口: parm1
//          parm2
//
//    出口: 2
/////////////////////////////////////////////////////////////////////////////
int PMFunc2(unsigned int parm1,
	    unsigned int parm2)
{
	//	Out_Debug_String("******* CVXD: PM API 2 Call\n\r");
	return (2);
}

#pragma VxD_ICODE_SEG
#pragma VxD_IDATA_SEG

/////////////////////////////////////////////////////////////////////////////
//
//		初始化时
//
/////////////////////////////////////////////////////////////////////////////
DWORD _stdcall CVXD_Dynamic_Init(void)
{
	//	Out_Debug_String("SthVXD: Dynamic Init\n\r");
	
	//安装内核空闲函数
	InstallIDLEProc();
	return(VXD_SUCCESS);
}

⌨️ 快捷键说明

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