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

📄 timerrockey.cpp

📁 此为本书的配套光盘.本书不但由浅入深地讲解了软件保护技术
💻 CPP
字号:
/********************************************************************

	Copyright (c) Beijing Feitian Technologies
	http://www.FTSafe.com

	File :		TimerRockey.cpp	

	Created:	2003/11/04

	Author:		yihai
	
	Purpose:	?

	Revision:	?

*********************************************************************/
#include "stdafx.h"
#include <windows.h>
#include "ryvc32.h"

ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow);
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK EnumThreadWndProc(HWND hwnd,LPARAM lParam);

char	g_szAppTitle[256] = "TimerRockey";
char    g_szMsgErrThread[256] = "Create thread fail!";

static  HWND	g_hMainWnd=NULL;
static  char	szWindowClass[] = "ROCKEY_TIMER_WND";
static  DWORD	g_dwThreadID = 0;
static  HANDLE	g_hThread = NULL; 
const	DWORD	g_dwDefTimerID = 1;
DWORD   g_dwTimerID = 1;					//记时器ID
DWORD   g_dwTimerDelay = 1000;				//记时器延时

DWORD	g_dwMainThreadID;					//主线程ID
HWND	g_hMainThreadWnd=NULL;				//主线程窗口句柄

DWORD WINAPI SubThreadMainProc(LPVOID lpParameter)	//壳所创建的后台线程
{
	HINSTANCE hInst = (HINSTANCE )lpParameter;
	Sleep(2000);		//等待主线程窗口的创建

	if (!InitInstance (hInst, 0))	//在这个线程里创建一个隐藏的窗口
	{
		goto lbl_thread_end;
	}
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) 
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);	
	}
lbl_thread_end:
	ExitThread(0);
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	g_dwMainThreadID = GetCurrentThreadId();

	MyRegisterClass(hInstance);					//注册隐藏窗口的窗口类

	g_hThread = CreateThread(NULL,0,SubThreadMainProc,hInstance,0,&g_dwThreadID);
	if(g_hThread==NULL)
		MessageBox(NULL,g_szMsgErrThread,g_szAppTitle,MB_OK);
	return 0;	
}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;
   
   hWnd = CreateWindow(szWindowClass, g_szAppTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
   
   if (!hWnd)
   {
      return FALSE;
   }   
   g_hMainWnd = hWnd;
   ShowWindow(hWnd, SW_HIDE);   
   //UpdateWindow(hWnd);

   return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{	
	switch (message) 
	{
		case WM_CREATE:
			{
				g_dwTimerID = g_dwDefTimerID;
				SetTimer(hWnd,g_dwTimerID,g_dwTimerDelay,NULL);	//创建我们用来修改主程序标题栏的定时器
			}
		break;
		case WM_TIMER:
			{		
				static bool	bEnum = false;
				static bool bMsgBox = false;

				if(wParam == g_dwTimerID)
				{					
					PostMessage(hWnd,WM_NULL,0,0);		//在WIN98下可令后台线程的消息循环不会出现死锁
					
					WORD	retcode=0;	
							
					if(!bEnum)
					{							
						//列举主线程的所有窗口,并找到主窗口
						EnumThreadWindows(g_dwMainThreadID,EnumThreadWndProc,NULL);	
						bEnum = true;
					}
					else if(g_hMainThreadWnd)		//定时检测加密锁是否存在
					{
						if(!bMsgBox)
						{
							WORD handle[16];
							DWORD lp1,lp2;
							WORD p1=0xc44c,p2=0xc8f8,p3=0,p4=0;
							BYTE buf[1024];
							char szOutBuf[512];

							WORD wRet;
							wRet = Rockey(RY_FIND,&handle[0],&lp1,&lp2,&p1,&p2,&p3,&p4,buf);
							wsprintf(szOutBuf,"RETCODE: %x",wRet);
							OutputDebugString(szOutBuf);
							if(wRet!=ERR_SUCCESS)
							{
								bMsgBox = true;
								MessageBox(g_hMainThreadWnd,"No rockey or no drivers","Rockey",MB_OK);
								ExitProcess(0);
							}
						}						
					}					
				}				
			}
			break;
		case WM_PAINT:
			{
				HDC hdc;
				PAINTSTRUCT ps;
				hdc = BeginPaint(hWnd, &ps);						
				EndPaint(hWnd, &ps);
			}			
			break;
		case WM_DESTROY:			
			{
				KillTimer(hWnd,g_dwTimerID);				
				PostQuitMessage(0);
			}
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX); 

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= (LPCSTR)NULL;
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_APPLICATION);

	return RegisterClassEx(&wcex);
}

BOOL CALLBACK EnumThreadWndProc(HWND hWnd,LPARAM lParam)
{
	if(hWnd)
	{
		if(GetParent(hWnd) == NULL)
		{
			g_hMainThreadWnd = hWnd;			
			return FALSE;
		}
	}	
	return TRUE;
}

⌨️ 快捷键说明

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