// kmclassdll.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "kmclass.h"
#include <windows.h>
#include <winsvc.h>
#include <conio.h>
#include <stdio.h>
#ifdef _MANAGED
#pragma managed(push, off)
#endif
/
/装载NT驱动程序
HANDLE drvhandle;
extern "C" __declspec(dllexport) void __cdecl SetHandle(HANDLE handle);
extern "C" __declspec(dllexport) void __cdecl KeyDown(USHORT VirtualKey);
extern "C" __declspec(dllexport) void __cdecl KeyUp(USHORT VirtualKey);
extern "C" __declspec(dllexport) void __cdecl MouseLeftButtonDown();
extern "C" __declspec(dllexport) void __cdecl MouseLeftButtonUp();
extern "C" __declspec(dllexport) void __cdecl MouseRightButtonDown();
extern "C" __declspec(dllexport) void __cdecl MouseRightButtonUp();
extern "C" __declspec(dllexport) void __cdecl MouseMiddleButtonDown();
extern "C" __declspec(dllexport) void __cdecl MouseMiddleButtonUp();
extern "C" __declspec(dllexport) void __cdecl MouseMoveRELATIVE(LONG dx, LONG dy);
extern "C" __declspec(dllexport) void __cdecl MouseMoveABSOLUTE(LONG dx, LONG dy);
extern "C" __declspec(dllexport) BOOL __cdecl LoadNTDriver(char* lpszDriverName, char* lpszDriverPath);
extern "C" __declspec(dllexport) BOOL __cdecl UnloadNTDriver(char * szSvrName);
void SetHandle(HANDLE handle)
{
drvhandle = handle;
}
void __cdecl KeyDown(USHORT VirtualKey)
{
KEYBOARD_INPUT_DATA kid;
DWORD dwOutput;
memset(&kid, 0, sizeof(KEYBOARD_INPUT_DATA));
kid.Flags = KEY_DOWN;
kid.MakeCode = (USHORT)MapVirtualKey(VirtualKey, 0);
DeviceIoControl(drvhandle, IOCTL_KEYBOARD, &kid, sizeof(KEYBOARD_INPUT_DATA), NULL, 0, &dwOutput, NULL);
}
void __cdecl KeyUp(USHORT VirtualKey)
{
KEYBOARD_INPUT_DATA kid;
DWORD dwOutput;
memset(&kid, 0, sizeof(KEYBOARD_INPUT_DATA));
kid.Flags = KEY_UP;
kid.MakeCode = (USHORT)MapVirtualKey(VirtualKey, 0);
DeviceIoControl(drvhandle, IOCTL_KEYBOARD, &kid, sizeof(KEYBOARD_INPUT_DATA), NULL, 0, &dwOutput, NULL);
}
void __cdecl MouseLeftButtonDown()
{
MOUSE_INPUT_DATA mid;
DWORD dwOutput;
memset(&mid, 0, sizeof(MOUSE_INPUT_DATA));
mid.ButtonFlags = MOUSE_LEFT_BUTTON_DOWN;
DeviceIoControl(drvhandle, IOCTL_MOUSE, &mid, sizeof(MOUSE_INPUT_DATA), NULL, 0, &dwOutput, NULL);
}
void __cdecl MouseLeftButtonUp()
{
MOUSE_INPUT_DATA mid;
DWORD dwOutput;
memset(&mid, 0, sizeof(MOUSE_INPUT_DATA));
mid.ButtonFlags = MOUSE_LEFT_BUTTON_UP;
DeviceIoControl(drvhandle, IOCTL_MOUSE, &mid, sizeof(MOUSE_INPUT_DATA), NULL, 0, &dwOutput, NULL);冰川世纪
}
void __cdecl MouseRightButtonDown()
{
MOUSE_INPUT_DATA mid;
DWORD dwOutput;
memset(&mid, 0, sizeof(MOUSE_INPUT_DATA));
mid.ButtonFlags = MOUSE_RIGHT_BUTTON_DOWN;
DeviceIoControl(drvhandle, IOCTL_MOUSE, &mid, sizeof(MOUSE_INPUT_DATA), NULL, 0, &dwOutput, NULL);
}
void __cdecl MouseRightButtonUp()
{
MOUSE_INPUT_DATA mid;
DWORD dwOutput;
memset(&mid, 0, sizeof(MOUSE_INPUT_DATA));
mid.ButtonFlags = MOUSE
_RIGHT_BUTTON_UP;
DeviceIoControl(drvhandle, IOCTL_MOUSE, &mid, sizeof(MOUSE_INPUT_DATA), NULL, 0, &dwOutput, NULL);
}
void __cdecl MouseMiddleButtonDown()
{
MOUSE_INPUT_DATA mid;
DWORD dwOutput;
memset(&mid, 0, sizeof(MOUSE_INPUT_DATA));
mid.ButtonFlags = MOUSE_MIDDLE_BUTTON_DOWN;
DeviceIoControl(drvhandle, IOCTL_MOUSE, &mid, sizeof(MOUSE_INPUT_DATA), NULL, 0, &dwOutput, NULL);
}
void __cdecl MouseMiddleButtonUp()
{
MOUSE_INPUT_DATA mid;
DWORD dwOutput;
memset(&mid, 0, sizeof(MOUSE_INPUT_DATA));
mid.ButtonFlags = MOUSE_MIDDLE_BUTTON_UP;
DeviceIoControl(drvhandle, IOCTL_MOUSE, &mid, sizeof(MOUSE_INPUT_DATA), NULL, 0, &dwOutput, NULL);
}
void __cdecl MouseMoveRELATIVE(LONG dx, LONG dy)
{
MOUSE_INPUT_DATA mid;
DWORD dwOutput;
memset(&mid, 0, sizeof(MOUSE_INPUT_DATA));
mid.Flags = MOUSE_MOVE_RELATIVE;
mid.LastX = dx;
mid.LastY = dy;
DeviceIoControl(drvhandle, IOCTL_MOUSE, &mid, sizeof(MOUSE_INPUT_DATA), NULL, 0, &dwOutput, NULL);
}
void __cdecl MouseMoveABSOLUTE(LONG dx, LONG dy)
{
MOUSE_INPUT_DATA mid;
DWORD dwOutput;
memset(&mid, 0, sizeof(MOUSE_INPUT_DATA));
mid.Flags = MOUSE_MOVE_ABSOLUTE;
mid.LastX = dx * 0xffff / GetSystemMetrics(SM_CXSCREEN);
mid.LastY = dy * 0xffff / GetSystemMetrics(SM_CYSCREEN);
DeviceIoControl(drvhandle, IOCTL_MOUSE, &mid, sizeof(MOUSE_INPUT_DATA), NULL, 0, &dwOutput, NULL);
}
BOOL __cdecl LoadNTDriver(char* lpszDriverName, char* lpszDriverPath)
{
char szDriverImagePath[256];
//得到完整的驱动路径
GetFullPathNameA(lpszDriverPath, 256, szDriverImagePath, NULL);
BOOL bRet = FALSE;
SC_HANDLE hServiceMgr = NULL;//SCM管理器的句柄
SC_HANDLE hServiceDDK = NULL;//NT驱动程序的服务句柄
//打开服务控制管理器
hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hServiceMgr == NULL)
{
/
/OpenSCManager失败
printf("OpenSCManager() Faild %d ! \n", GetLastError());
bRet = FALSE;
goto BeforeLeave;
}
else
{
////OpenSCManager成功
printf("OpenSCManager() ok ! \n");
}
//创建驱动所对应的服务
hServiceDDK = CreateServiceA(hServiceMgr,
lpszDriverName, //驱动程序的在注册表中的名字
lpszDriverName, // 注册表驱动程序的 DisplayName 值
SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值
SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值
szDriverImagePath, // 注册表驱动程序的 ImagePath 值
NULL,
NULL,
NULL,
NULL,
NULL);
DWORD dwRtn;
//判断服务是否失败
if (hServiceDDK == NULL)
{
dwRtn = GetLastError();
if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS)
{
//由于其他原因创建服务失败
printf("CrateService() Faild %d ! \n", dwRtn);
bRet = FALSE;
goto BeforeLeave;
}
else
{
//服务创建失败,是由于服务已经创立过
printf("CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n");
}
// 驱动程序已经加载,只需要打开
hServiceDDK = OpenServiceA(hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS);
信用卡怎么用if (hServiceDDK == NULL)
{
//如果打开服务也失败,则意味错误
dwRtn = GetLastError();
printf("OpenService() Faild %d ! \n", dwRtn);
bRet = FALSE;
goto BeforeLeave;
}
else
{
printf("OpenService() ok ! \n");
}
}
else
{
printf("CrateService() ok ! \n");
}
//开启此项服务
bRet = StartService(hServiceDDK, NULL, NULL);
if (!bRet)
{
DWORD dwRtn = GetLastError();
if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING)
{
printf("StartService() Faild %d ! \n", dwRtn);
bRet = FALSE;
goto BeforeLeave;
}
else
{
if (dwRtn == ERROR_IO_PENDING)
{
//设备被挂住
printf("StartService() Faild ERROR_IO_PENDING ! \n");
bRet = FALSE;
goto BeforeLeave;
}
else
{
//服务已经开启
printf("StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n");
bRet = TRUE;
goto BeforeLeave;
}
}
}
bRet = TRUE;
//离开前关闭句柄
BeforeLeave:
if (hServiceDDK)
{
CloseServiceHandle(hServiceDDK);
}
if (hServiceMgr)
{
英语6级多少分过CloseServiceHandle(hServiceMgr);
}
多少笔画return bRet;
}
//卸载驱动程序
BOOL __cdecl UnloadNTDriver(char * szSvrName)
{
BOOL bRet = FALSE;
SC_HANDLE hServiceMgr = NULL;//SCM管理器的句柄
SC_HANDLE hServiceDDK = NULL;//NT驱动程序的服务句柄
SERVICE_STATUS SvrSta;
//打开SCM管理器
hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hServiceMgr == NULL)
{
//带开SCM管理器失败
printf("OpenSCManager() Faild %d ! \n", GetLastError());
七朝古都bRet = FALSE;
goto BeforeLeave;
}
else
{
//带开SCM管理器失败成功
printf("OpenSCManager() ok ! \n");
}
//打开驱动所对应的服务
hServiceDDK = OpenServiceA(hServiceMgr, szSvrName, SERVICE_ALL_ACCESS);
if (hServiceDDK == NULL)
{
//打开驱动所对应的服务失败
printf("OpenService() Faild %d ! \n", GetLastError());
bRet = FALSE;
我只在乎你 日语版goto BeforeLeave;
}
else
{
printf("OpenService() ok ! \n");
}
//停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。
if (!ControlService(hServiceDDK, SERVICE_CONTROL_STOP, &SvrSta))
{
printf("ControlService() Faild %d !\n", GetLastError());
}
else
{
/
/打开驱动所对应的失败
printf("ControlService() ok !\n");
}
//动态卸载驱动程序。
if (!DeleteService(hServiceDDK))
{
//卸载失败
printf("DeleteSrevice() Faild %d !\n", GetLastError());
}
else
{
/
/卸载成功
printf("DelServer:eleteSrevice() ok !\n");
}
bRet = TRUE;
BeforeLeave:
//离开前关闭打开的句柄
if (hServ
iceDDK)
{
CloseServiceHandle(hServiceDDK);
}
if (hServiceMgr)
{
CloseServiceHandle(hServiceMgr);
}
return bRet;
}
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
/
///if (ul_reason_for_call==DLL_PROCESS_ATTACH)
////{ LoadNTDriver("kmclass64","kmclass64.sys");
////drvhandle= CreateFileA("\\\\.\\kmclass64",
////GENERIC_WRITE | GENERIC_READ,
////0,
////NULL,
////OPEN_EXISTING,
////0,
////NULL);
////}
////else if (ul_reason_for_call==DLL_PROCESS_DETACH)
/
///{CloseHandle(drvhandle);
////UnloadNTDriver("kmclass64");
////}
return TRUE;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论