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

📄 rcaclientlibrary.h

📁 远程控制软件源代码
💻 H
字号:

#ifndef _RCACLIENTLIBRARY_H_
#define _RCACLIENTLIBRARY_H_

#include "stdafx.h"

#define SERVER_LISTEN_PORT		4813
#define SAFE_DELETE_ARRAY(x)  if(x!=NULL) { delete[] x; x = NULL; }
#define SAFE_CLOSE_HANDLE(x)  if(x!=NULL) { CloseHandle( x ); x = NULL; }

#define WSAERRORSTRING (WSAErrorString(WSAGetLastError()))

#ifdef _DEBUG	// 调试输出宏
#define DEBUGOUTPUT1(x) cout << x << endl;
#define DEBUGOUTPUT2(x, y) cout << x << y << endl;
#define DEBUGOUTPUT3(x, y, z) cout << x << y << z << endl;
#else
#define DEBUGOUTPUT1(x) 
#define DEBUGOUTPUT2(x, y) 
#define DEBUGOUTPUT3(x, y, z)
#endif

// 定义应答状态码
#define RCA_RESPONSE_200_OK			200
#define RCA_RESPONSE_404_NOTFOUND	404
#define RCA_RESPONSE_808_BYEBYE		808
#define RCA_RESPONSE_502_FAILED		502

///////////////////////////////////////////
//	RCA 协议头结构 大小为 40 个字节
//
typedef struct _RCARequestHeader{

	char	rcaID[4];		// "RCA\0"
	DWORD	dwHeaderType;	// header type
	BOOL	bNeedResponse;	// 是否需要应答
	WORD	wMajorVersion;	// 主版本号
	WORD	wMinorVersion;	// 次版本号
	DWORD	dwRequestID;	// 请求操作的 ID 号
	DWORD	requestBytes;	// 请求的总字节数

	char	reserved[16];	// 保留 24 个字节

} RCAREQUESTHEADER, *PRCAREQUESTHEADER;


typedef struct _RCAResponseHeader {
	
	char	rcaID [4];		// RCA ID "RCA\0"
	DWORD	dwHeaderType;	// RCA header type
	DWORD	dwStatusCode;	// RCA response status code
	DWORD	dwTotalBytes;	// response total bytes
	
	char	reserved[24];	// 保留 28 个字节

}RCARESPONSEHEADER, *PRCARESPONSEHEADER;


typedef struct _RCAKeepAliveHeader {
	char	rcaID[4];
	DWORD	dwHeaderType;
	
	char reserved[32];
}RCAKEEPALIVEHEADER, *PRCAKEEPALIVEHEADER;

#define RCAHEADER_TYPE_KEEPALIVE	0		// 保活包
#define RCAHEADER_TYPE_REQUEST		1		// 请求头
#define RCAHEADER_TYPE_RESPONSE		2		// 响应头


typedef struct _RCAHeader {
	char	rcaID[4];
	DWORD	dwHeaderType;

	char reserved[32];	
}RCAHEADER, *PRCAHEADER;

// these uses to the dwImageFormat member of RCAGETSCREENDATA struct 
#define IMAGE_FORMAT_BMP	1
#define IMAGE_FORMAT_JPEG	2
#define IMAGE_FORMAT_JPE	IMAGE_FORMAT_JPEG
#define IMAGE_FORMAT_JPG	IMAGE_FORMAT_JPEG
#define IMAGE_FORMAT_GIF	3

///////////////////////////////////////
//
//
//	描述 :		请求服务器传送屏幕图像. 这个数据结构 大小为 48 字节.
//				0x20 子协议要求的附带数据为 48 字节, 接收完这 48 字节后
//				可以将这48 字节强制转换成 RCAGETSCREENDATA 结构
//
//
//
//
typedef struct _RCAGetImageData{

	int		x;				// 截屏矩形的左上角的 x 座标
	int		y;				// 截屏矩形的左上角的 y 座标
	int		w;				// 截屏矩形的宽
	int		h;				// 截屏矩形的高

	int		zw;				// 返回图象的缩放, 若为0, 则不缩放. 
	int		zh;				// 返回图象的缩放, 若为0, 则不缩放.	 

	int		iBitCount;		// 要求的位深, 可以是以下一个值 8, 16, 24, 32
	DWORD	dwImageFormat;	// 图象格式标记

	DWORD	dwFlagEx1;		// 保留给特定格式使用
	DWORD	dwFlagEx2;		// 保留给特定格式使用
	DWORD	dwFlagEx3;		// 保留给特定格式使用
	DWORD	dwFlagEx4;		// 保留给特定格式使用

} RCAGETIMAGEDATA, *PRCAGETIMAGEDATA;


// 与 WINDOWS MOUSEINPUT 结构兼容. 使用在 0x40 子协议
typedef struct RCAMouseInput {
    LONG    dx;
    LONG    dy;
    DWORD   mouseData;
    DWORD   dwFlags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} RCAMOUSEINPUT, *PRCAMOUSEINPUT;



// 与 WINDOWS KEYBDINPUT 结构兼容. 使用在 0x41 子协议
typedef struct RCAKeybdInput{
    WORD    wVk;
    WORD    wScan;
    DWORD   dwFlags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} RCAKEYBDINPUT, *PRCAKEYBDINPUT;


// 定义一个信息结构. 在子协议 0x110 中使用
//
typedef struct RCAComputerInfo {
	CHAR			pszOS[6];		// WIN95 / WIN98 /  WINNT / WIN2K / WINXP
	MEMORYSTATUS	memoryStatus;	// 由 GlobalMemoryStatus 函数获得
	DWORD			dwScreenWidth;		// 当前显示分辨率的宽
	DWORD			dwScreenHeight;		// ................高
	DWORD			dwScreenBitCount;	// ................位深

} RCACOMPUTERINFO, *PRCACOMPUTERINFO;



//////////////////////////////////////////
//
//	发送数据帮助函数, IO 模型为 event select 
//
//	在调用函数前 SOCKET s 必须被置为异步模式,
//	并且用带有 FD_WRITE 事件通知的标志对其调用了 WSAEventSelect 函数
//
extern "C"
BOOL 
WINAPI RCASend_EventSelectIO(
	SOCKET	s,
	HANDLE	hEventArray[2],
	char *	buf,
	int		len
);


////////////////////////////////////////
//
//	接收数据帮助函数, IO 模型为 Async Event
//	
//	在调用函数前 SOCKET s 必须被置为异步模式, 
//	并且用带有 FD_READ 事件通知的标志对其调用了 WSAEventSelect 函数
//
extern "C"
BOOL 
WINAPI RCARecv_EventSelectIO( 
		SOCKET	s,			
		HANDLE	hEventArray[2],
		char *	buf,			// 接收缓冲区 . 若成功
		int		len				// 
);



///////////////////////////////////////////
//
//	获得整个屏幕的象素信息
//	
//	参数: 
//
//	pbmi[in,out] -- BITMAPINFO 结构指针, 函数成功调用后会填充这个结构,这个结构反映了象素信息
//
//	x, y, w, h;  矩形的左上角座标, 以及宽高. 如果这些参数不合法,将被修整为合法参数
//
//	pBits[in,out]	-- void 指针, 函数调用成功后,pBits 将被象素值填充. 如果 pBits 为NULL,
//					函数将修改 dwBufferSize 参数, 指明需要多少缓冲存放象素值
//
//  dwBufferSize -- [in, out] 指明 pBits 的大小. 如果函数成功调用后, dwBufferSize 将会被修改, 
//					指明实际拷贝的象素字节数
// 返回值:
//		 BOOL 类型, 函数调用成功后, 将返回 TRUE; 失败,将返回 FALSE;
// 


HBITMAP 
WINAPI GetDCPixel_BMP (
	HDC			hdc,
	int 		x,
	int 		y,
	int 		w,
	int 		h,
	int			zw,			// 缩放控制, 0 为不缩放
	int			zh,			// 缩放控制, 0 为不缩放
	WORD		wBitCount,
	VOID **		pBits,
	BITMAPINFOHEADER	* pbmih,		// 当色深为 8 时, 包含颜色表
	DWORD *		pdwBitmapInfoSize
);


////////////////////////////////////////////////
////
//
//	从一个 JPEG 格式的像素缓冲区解码,
//	解码后的像素格式为 WINDOWS DIB 格式
//	
//  存放 WINDOWS DIB 格式的像素缓冲区由此函数分配,
//	释放交由调用者. 必须用  delete[] 释放
//

BOOL 
WINAPI 
DecodeFromJPEGBuffer(
	BYTE *	lpJpgBuffer,
	DWORD 	dwJpgBufferSize,
	BYTE**	lppRgbBuffer,
	DWORD*	lpdwWidth,
	DWORD*	lpdwHeight,
	DWORD*	lpdwNumberOfChannels
);

////////////////////////////////////////////////
//
//	从一个 WINDOWS DIB 格式的像素缓冲区编码到一个 JPEG 格式的像素缓冲区
//
//	存放 JPEG 格式的像素缓冲区由此函数分配
//	释放交由调用者, 必须用  delete[] 释放
extern "C"
BOOL 
WINAPI 
EncodeToJPEGBuffer(
	 BYTE* lpRgbBuffer,
	 DWORD dwWidth,
	 DWORD dwHeight,
	 BYTE** lppJpgBuffer,
	 DWORD* lpdwJpgBufferSize,
	 int	iQuality	// JPEG 图象质量
);




/////////////////////////////////////////////////////
//
//	初始化一个应答头, dwTotalBytes 被初始化为 sizeof(RCARESPONSEHEAD)
//
extern "C"
VOID
WINAPI InitResponseHead(
	RCARESPONSEHEADER*	prresh,
	DWORD				dwStatusCode,
	DWORD				dwSize
);


char * 
WINAPI 
WSAErrorString( 
	int error 
);


/////////////////////////////////////////
//
//	创建一个 SOCKET 句柄, 并将其置于事件选择 IO 模式
//
BOOL WINAPI CreateEventSelectSocket( 
	SOCKET * s,
	HANDLE * hEvent,
	LONG     lEventFlags
);


////////////////////////////////////////
//
//	连接到一个服务器, SOCKET  IO 模型: 事件选择
//
//

BOOL
WINAPI
RCAConnect_EventSelectIO (
	SOCKET	s,
	HANDLE	hEventArray[2],
	sockaddr * addr,
	UINT	uMsg
	
);


/////////////////////////////////////
//
//	初始化一个 RCA 请求头
//
VOID
WINAPI
InitRCARequestHead (
	RCAREQUESTHEADER *	rreqh,
	WORD				wMajorVersion,	// 主版本号
	WORD				wMinorVersion,	// 次版本号
	DWORD				dwRequestID,
	DWORD				dwRequestBytes
);



///////////////////////////////////////
//
//	向 RCA 服务器请求执行 0x10 号(创建一个进程)操作
//
BOOL 
WINAPI 
RCASendRequest_0X10_EventSelectIO(
	SOCKET		s,
	HANDLE		hEventArray[2],
	HWND		hwnd,
	PSTR		pOperation,
	PSTR		pFile,
	PSTR		pParameters,
	PSTR		pDirectory,
	INT			nShowCmd
);


////////////////////////////////////////////////
//
//	向 RCA 服务器请求执行 0x20 号(截取图象) 操作
//   
//
BOOL
WINAPI
RCASendRequest_0X20_EventSelectIO(
	SOCKET		s,
	HANDLE		hEventArray[2],
	RCAGETIMAGEDATA * gm
);


////////////////////////////////////////////////
//
// 当成功发送图象请求数据后, 可以调用这个函数.
// 这个函数接收数据并创建 HBITMAP 
HBITMAP
WINAPI
RCARecvImageData(
	SOCKET s,
	HANDLE hEventArray[2],
	DWORD  dwImageFormat 
);
	

////////////////////////////////////////////
//
//	发送鼠标输入数据
//
BOOL
WINAPI
RCASendMouseInput_EventSelectIO(
	SOCKET			s,
	HANDLE			hEventArray[2],
	BOOL *			pbExit,
	RCAMOUSEINPUT * pMouseInput,
	DWORD			dwArraySize
);

///////////////////////////////////////////
//
//	发送键盘输入数据
//
BOOL
WINAPI
RCASendKeybdInput_EventSelectIO(
	SOCKET			s,
	HANDLE			hEventArray[2],
	BOOL*			pbExit,
	RCAKEYBDINPUT * pKeybdInput,
	DWORD			dwArraySize
);


/////////////////////////////////////////////
//
//	根据消息构造一个 RCAMOUSEINPUT 结构.
BOOL
WINAPI
CreateMouseInput(
	RCAMOUSEINPUT*	pmi,
	UINT			msg,
	WPARAM			w,
	LPARAM			l,
	float			fWidthScale,
	float			fHeightScale
);


////////////////////////////////////////////
//
//	根据消息构造一个 RCAKEYBDINPUT 结构
//
BOOL
WINAPI
CreateKeybdInput(
	RCAKEYBDINPUT*	pbi,
	UINT			msg,
	WPARAM			w,
	LPARAM			l
);

#endif

⌨️ 快捷键说明

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