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

📄 removedigitalsign.cpp

📁 介绍在Windows XP下自编写的驱动程序如何不受操作系统关于未授权数字签名的影响
💻 CPP
字号:
// RemoveDigitalSign.cpp: implementation of the CRemoveDigitalSign class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DigitalSign.h"
#include "RemoveDigitalSign.h"
#include "DialogTempleteEx.h"
#include "atlconv.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

static	char	szDialogClassName[] = "#32770";
static	char	szSysdmLibrary[] = "sysdm.cpl";
static	char	szSigtabLibrary[] = "sigtab.dll";

#define	FIND_WINDOW_SLEEP_TIME		500		// 毫秒
#define	FIND_WINDOW_RETRY_TIMES		5

const	UINT	uOKButtonID				= 1;		// OK 按钮ID

const	UINT	uDriverSigningButtonID	= 2010;		// 系统属性对话框中驱动签名按钮的ID

const	UINT	uDriverSigningDialogID	= 102;		// 驱动签名对话框ID

const	UINT	uIgoreButtonID			= 1000;		// 驱动签名对话框中"忽略"按钮ID
const	UINT	uWarningButtonID		= 1001;		// 驱动签名对话框中"警告"按钮ID
const	UINT	uBlockButtonID			= 1002;		// 驱动签名对话框中"阻止"按钮ID

#define	SYSTEM_PROPERTY_TITLE_ID	3

CRemoveDigitalSign::CRemoveDigitalSign()
:m_hSystemPropertyWnd(NULL),
m_hDriverSigningDialogWnd(NULL)
{
}

CRemoveDigitalSign::~CRemoveDigitalSign()
{

}

BOOL CRemoveDigitalSign::Start()
{
	if(GetNeedStrings() == FALSE) return FALSE;

	CloseAllOtherSystemWindow();

	TRACE("所有可能引起冲突的窗口都已经关闭\n");
	
	if(StartHardwareDialog() == FALSE) return	FALSE;
	
	::PostMessage(
		m_hSystemPropertyWnd,
		WM_COMMAND,
		uDriverSigningButtonID,
		(LPARAM)::GetDlgItem(m_hSystemPropertyWnd,uDriverSigningButtonID));

	for(int i = 0;i < FIND_WINDOW_RETRY_TIMES;i ++)	// 确认驱动签名窗口确实已经弹出
	{
		Sleep(FIND_WINDOW_SLEEP_TIME);
		m_hDriverSigningDialogWnd = ::FindWindow(szDialogClassName,m_szDriverSigningDialogTitle);
		if(m_hDriverSigningDialogWnd)
			break;
	}	

	if(i == FIND_WINDOW_RETRY_TIMES)	// 如果没有找到,则返回
	{
		return	FALSE;
	}

	CButton	* pIgoreButton = (CButton *)CWnd::FromHandle(
		GetDlgItem(m_hDriverSigningDialogWnd,uIgoreButtonID));

	CButton	* pWarningButton = (CButton *)CWnd::FromHandle(
		GetDlgItem(m_hDriverSigningDialogWnd,uWarningButtonID));

	CButton	* pBlockButton = (CButton *)CWnd::FromHandle(
		GetDlgItem(m_hDriverSigningDialogWnd,uBlockButtonID));

	pWarningButton->SetCheck(0);		// 把忽略按钮选中
	pBlockButton->SetCheck(0);
	pIgoreButton->SetCheck(1);

	::SendMessage(m_hDriverSigningDialogWnd,	// 选中后关闭驱动签名对话框
		WM_COMMAND,uOKButtonID,
		(LPARAM)GetDlgItem(m_hDriverSigningDialogWnd,uOKButtonID));

	::SendMessage(m_hSystemPropertyWnd,			// 最后关闭系统属性对话框
		WM_COMMAND,uOKButtonID,
		(LPARAM)GetDlgItem(m_hSystemPropertyWnd,uOKButtonID));

	return	TRUE;
}

BOOL CRemoveDigitalSign::StartHardwareDialog()
{
	// 最后的那个2是因为硬件在系统属性里为第二个属性页,从0开始

	ShellExecute(
		NULL,"open","Rundll32.exe",
		"shell32.dll,Control_RunDLL sysdm.cpl,,2",
		NULL,SW_SHOW);

	for(int i = 0;i < FIND_WINDOW_RETRY_TIMES;i ++)	// 确认系统属性窗口确实已经弹出
	{
		Sleep(FIND_WINDOW_SLEEP_TIME);
		m_hSystemPropertyWnd = ::FindWindow(szDialogClassName,m_szSystemPropertyTitle);
		if(m_hSystemPropertyWnd)
			break;
	}

	if(i == FIND_WINDOW_RETRY_TIMES)	// 没有找到窗口
	{
		return	FALSE;
	}
	
	return	TRUE;
}

BOOL CRemoveDigitalSign::GetNeedStrings()
{
	USES_CONVERSION;
	
	// 取得系统属性对话框的标题,此标题字符串位于资源的String Table中

	HINSTANCE	hSysdmHandle = ::LoadLibrary(szSysdmLibrary);
	if(hSysdmHandle == NULL) return FALSE;

	::LoadString(								// 此处取得标题
		hSysdmHandle,
		SYSTEM_PROPERTY_TITLE_ID,
		m_szSystemPropertyTitle,MAX_PATH);

	::FreeLibrary(hSysdmHandle);				// 释放动态链接库

	// 去驱动程序签名对话框标题,此处标题位于对话框资源中

	HINSTANCE	hDriverSignLibHandle = ::LoadLibrary(szSigtabLibrary);
	if(hDriverSignLibHandle == NULL) return FALSE;
	
	HRSRC	hDlgSrc = ::FindResource(hDriverSignLibHandle,
		MAKEINTRESOURCE(uDriverSigningDialogID),RT_DIALOG);

	if(hDlgSrc == NULL)	
	{
		::FreeLibrary(hDriverSignLibHandle);
		return	FALSE;
	}

	HGLOBAL	hDlgData = ::LoadResource(hDriverSignLibHandle,hDlgSrc);
	ASSERT(hDlgData);

	LPDLGTEMPLATEEX pDlgInfo = (LPDLGTEMPLATEEX)::LockResource(hDlgData);
	ASSERT(pDlgInfo);

	char * lpszTitle = W2A(pDlgInfo->title);	// 把宽字符转为ANSI字符,ANSI字符的内存在堆栈
												// 里分配,函数结束自动释放,所谓无需我们来释放

	if(lpszTitle != NULL)
	{
		strcpy(m_szDriverSigningDialogTitle,lpszTitle);
	}

	::FreeLibrary(hDriverSignLibHandle);
	
	return	TRUE;
}

void CRemoveDigitalSign::CloseAllOtherSystemWindow()
{
	::EnumWindows(EnumSystemPropertyWindowsProc,(LPARAM)m_szSystemPropertyTitle);
}

BOOL CRemoveDigitalSign::EnumSystemPropertyWindowsProc(HWND hWnd, LPARAM lParam)
{
	LPCTSTR lpszTitle = (LPCTSTR)lParam;
	char	szWindowTitle[MAX_PATH];
	char	szWindowClassName[MAX_PATH];

	memset(szWindowTitle,0,MAX_PATH);
	memset(szWindowClassName,0,MAX_PATH);

	::GetClassName(hWnd,szWindowClassName,MAX_PATH);
	::GetWindowText(hWnd,szWindowTitle,MAX_PATH);

	if(strcmp(lpszTitle,szWindowTitle) == 0 && 
		strcmp(szWindowClassName,szDialogClassName) == 0)
	{
		::SendMessage(hWnd,WM_CLOSE,0,0);
	}

	TRACE("当前窗口句柄为:0x%08x,标题为:%s\n",hWnd,szWindowTitle);

	return TRUE;
}

⌨️ 快捷键说明

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