📄 generic.c
字号:
/////////////////////////////////
// Main source file for GENERIC.VxD
// FileName: GENERIC.c - created by VxDWriter
// Copyright (c) 1997 by Somnath Kundu. All Rights Reserved.
#include <vxdlib.h>
#pragma hdrstop
#include "GENERIC.h"
#include <vxdmain.h> // To be included in this file only
#ifdef __cplusplus
extern "C" {
#endif
static CONTROL_PROC Initialize, Terminate, W32_DeviceIoControl;
BEGIN_SERVICE_TABLE_MAP() // Macro to create VxD service table
GetVersion,
END_SERVICE_TABLE_MAP()
BEGIN_CONTROL_DISPATCH_MAP (GENERIC)
DEVICE_INIT, Initialize,
SYS_DYNAMIC_DEVICE_INIT, Initialize,
SYSTEM_EXIT2, Terminate,
SYS_DYNAMIC_DEVICE_EXIT, Terminate,
W32_DEVICEIOCONTROL, W32_DeviceIoControl
END_CONTROL_DISPATCH_MAP()
#ifdef __cplusplus
}
#endif
//================ Put your locked code/data here ===========================
#pragma VxD_LOCKED_DATA_SEG
#pragma VxD_LOCKED_CODE_SEG
typedef DIOCPARAMETERS *PDIOC;
DWORD __stdcall W32_GetVersion (PDIOC);
DWORD ( __stdcall *GENERIC_W32_Proc[] )(PDIOC) = {
W32_GetVersion,
// Put other W32 APIs here as per requirment
};
#define MAX_GENERIC_W32_API ASIZE( GENERIC_W32_Proc)
NAKED void CallBack (void)
{
CLIENT_STRUCT *pRegs;
char msg[120];
ENTER;
pRegs = (CLIENT_STRUCT*)_EBP;
sprintf( msg, "VMHandle: %X RefData: %X ClientReg: %X",_EBX,_EDX,_EBP);
MessageBox( 0, msg, "Hello from CallBack", MB_OK);
RETURN;
}
//================ Put your pageable code/data here =========================
#pragma VxD_PAGEABLE_CODE_SEG
#pragma VxD_PAGEABLE_DATA_SEG
//---------------------------------------------------------------------------
int __stdcall W32_DeviceIoControl (DECLARE_PREGS)
{
DWORD dwRetVal = 0;
if (_ECX == DIOC_OPEN )
dwRetVal = 0;
else if (_ECX == DIOC_CLOSEHANDLE )
dwRetVal = VXD_SUCCESS;
else if (_ECX > MAX_GENERIC_W32_API )
dwRetVal = ERROR_NOT_SUPPORTED;
else
dwRetVal = (*GENERIC_W32_Proc[_ECX-1])((PDIOC)_ESI);
return dwRetVal;
}
//---------------------------------------------------------------------------
DWORD __stdcall W32_GetVersion (PDIOC pDIOParam)
{
DECLARE_REGS;
*(WORD*)pDIOParam->lpvOutBuffer = (GENERIC_MAJOR_VER << 8) | GENERIC_MINOR_VER;
ESI = (DWORD)&CallBack;
EDX = 0;
RVXDCALL( Schedule_Global_Event);
return NO_ERROR;
}
//---------------------------------------------------------------------------
int __stdcall Terminate (DECLARE_PREGS)
{
// TODO: Add code here to handle SYS_DYNAMIC_DEVICE_EXIT control message
return VXD_SUCCESS;
}
//---------------------------------------------------------------------------
int __stdcall V86_API (CLIENT_STRUCT *pClientReg)
{
// TODO: Add your own code here to support V86 mode APIs
return 0;
}
//---------------------------------------------------------------------------
int __stdcall PM_API (CLIENT_STRUCT *pClientReg)
{
// TODO: Add your own code here to support 16-bit PM APIs
return 0;
}
//---------------------------------------------------------------------------
DWORD _cdecl GetVersion ()
{
// TODO: Add code for VxD service 0
return 0;
}
//============ Put your initialization code/data here =======================
#pragma VxD_IDATA_SEG
#pragma VxD_ICODE_SEG
int __stdcall Initialize (DECLARE_PREGS)
{
// TODO: Add code here to handle device initialization
return VXD_SUCCESS;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -