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

📄 drv_wizardaw.cpp

📁 驱动开发Wizard
💻 CPP
字号:
// Drv_Wizardaw.cpp : implementation file
//

#include "stdafx.h"
#include "Drv_Wizard.h"
#include "Drv_Wizardaw.h"

#ifdef _PSEUDO_DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// This is called immediately after the custom AppWizard is loaded.  Initialize
//  the state of the custom AppWizard here.
void CDrv_WizardAppWiz::InitCustomAppWiz()
{
	// There are no steps in this custom AppWizard.
	SetNumberOfSteps(0);

	// TODO: Add any other custom AppWizard-wide initialization here.
}

// This is called just before the custom AppWizard is unloaded.
void CDrv_WizardAppWiz::ExitCustomAppWiz()
{
	// TODO: Add code here to deallocate resources used by the custom AppWizard
}

// This is called when the user clicks "Create..." on the New Project dialog
//  or "Next" on one of the custom AppWizard's steps.
CAppWizStepDlg* CDrv_WizardAppWiz::Next(CAppWizStepDlg* pDlg)
{
	return NULL;
}

void CDrv_WizardAppWiz::CustomizeProject(IBuildProject* pProject)
{
	// TODO: Add code here to customize the project.  If you don't wish
	//  to customize project, you may remove this virtual override.
	
	// This is called immediately after the default Debug and Release
	//  configurations have been created for each platform.  You may customize
	//  existing configurations on this project by using the methods
	//  of IBuildProject and IConfiguration such as AddToolSettings,
	//  RemoveToolSettings, and AddCustomBuildStep. These are documented in
	//  the Developer Studio object model documentation.

	// WARNING!!  IBuildProject and all interfaces you can get from it are OLE
	//  COM interfaces.  You must be careful to release all new interfaces
	//  you acquire.  In accordance with the standard rules of COM, you must
	//  NOT release pProject, unless you explicitly AddRef it, since pProject
	//  is passed as an "in" parameter to this function.  See the documentation
	//  on CCustomAppWiz::CustomizeProject for more information.
	CString		strProjName		= TEXT("testDRV");
	IConfigurations * pAllConf	= 0;
	BSTR bstrProjName = strProjName.AllocSysString();
	pProject->get_Configurations(&pAllConf);
	pProject->get_Name(&bstrProjName);
	strProjName = bstrProjName;
	if( pAllConf != 0 )
	{
		COleVariant var(0L,VT_ERROR);
		var.scode=DISP_E_PARAMNOTFOUND;
		
		CString strToolCl	= TEXT("cl.exe");
		CString strToolLink = TEXT("link.exe");
		CString strToolMFC	= TEXT("mfc");
		CString strToolRes	= TEXT("rc.exe");
		CString strWindows	= TEXT("/subsystem:windows");
		CString strNative	= TEXT("/subsystem:native");
		// __stdcall
		CString	strCallConv = TEXT("/Gz");
		// Enable C++ Exception handling should be removed
		CString	strEH		= TEXT("/GX");
		// not using MFC
		CString strNoMFC	= TEXT("0");
		// pack structs on 8-byte boundary is the DEFAULT setting
		CString	strStructAlign  = TEXT("/Zp8");
		// in my option, the /GZ preprocessor shouldn't be removed
		// but i have to.
		CString	strRelease		= TEXT("/GZ");
		CString strIncrement	= TEXT("/incremental:no");
		// get ddk dir
		char	ddkDir[256] = "\0";
		GetEnvironmentVariable(
					TEXT("BASEDIR"),  // address of environment variable name
					LPTSTR(ddkDir), // address of buffer for variable value
					256// size of buffer, in characters
					);
		CString	strPreprocessor = TEXT("/D _X86_=1 "
									"/D i386=1 "
									"/D STD_CALL=1 "
									"/D CONDITION_HANDLING=1 "
									"/D WIN32LEAN_AND_MEAN=1 "
									"/D NT_UP=1 "
									"/D NT_INST=0 "
									"/D WIN32=100 "
									"/D _NT1X_=100 "
									"/D WINNT=100 "
									"/D _WIN32_WINNT=0x0400 "
									"/D DEVL=1 /D \"NDEBUG\" "
									"/D _DLL=1 "
									"/D \"_IDWBUILD\" "
									"/D \"DBCS\" /D \"PRC\" "
									"/D \"KKBUGFIX\" "
									"/D \"DBCS_VERT\" "
									"/D \"FESB\" ");
		CString tmp;
		tmp.Format("/I \"%s\\inc\"", ddkDir);
		strPreprocessor += tmp;
		CString	strDbgInfo	= TEXT("/debug");
		CString	strDftLib	= TEXT("kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib");
		CString strNoDftLib = TEXT("/nodefaultlib");
		CString	strDDKLib	= TEXT("int64.lib ntoskrnl.lib hal.lib");
		CString strNoPdb	= TEXT("/pdb:none");
		CString strEntry	= TEXT("/entry:\"DriverEntry@8\" /dll");
		
		CString	strResources= TEXT("/d _X86_=1 "
									"/d i386=1 "
									"/d \"STD_CALL\" "
									"/d CONDITION_HANDLING=1 "
									"/d WIN32LEAN_AND_MEAN=1 "
									"/d NT_UP=1 "
									"/d NT_INST=0 "
									"/d WIN32=100 "
									"/d _NT1X_=100 "
									"/d WINNT=1 "
									"/d _WIN32_WINNT=0x0400 "
									"/d DEVL=1 "
									"/d \"NDEBUG\" "
									"/d _DLL=1 "
									"/d \"_IDWBUILD\" "
									"/d \"DBCS\" /D \"PRC\" "
									"/d \"KKBUGFIX\" "
									"/d \"DBCS_VERT\" "
									"/d \"FESB\"");

		tmp.Format("/i \"%s\\inc\"", ddkDir);
		strResources += tmp;

		CString	strDbgC7Compatible = TEXT("/Z7");
		CString strDbgPreprocessor = TEXT("/D DBG=1 /D FPO=0 "
										"/D \"RDRDBG\" "
										"/D \"SRVDBG\" ");
		CString strDbgRes = TEXT("/d DBG=1 /d FPO=0 "
										"/d \"RDRDBG\" "
										"/d \"SRVDBG\"");
		CString strDbgOptions	= TEXT("/GF /QIfdiv- /QIf");
		tmp.Format("/out:\"debug/%s.sys\"", strProjName);
		CString strDbgOutput	= tmp;
		tmp.Format("/libpath:\"%s\\lib\\i386\\checked\"", ddkDir);
		CString	strDbgLibPath	= tmp;
		CString strRlsPreprocessor = TEXT("/D FPO=1");
		CString strRlsRes		= TEXT("/d FPO=1");
		tmp.Format("/out:\"release/%s.sys\"", strProjName);
		CString strRlsOutput	= tmp;
		tmp.Format("/libpath:\"%s\\lib\\i386\\free\"", ddkDir);
		CString	strRlsLibPath	= tmp;
//		CString strCustFile	= TEXT("NTServiceEventLogMsg.mc");
//		CString strCustDesc	= TEXT("Generating Message Catalogue");
//		CString strCustCmd	= TEXT("mc -v -w $(InputName)");
//		CString strCustOut	= TEXT("NTServiceEventLogMsg.rc\nNTServiceEventLogMsg.h");
//		Compiler flags: (Debug) Multithreaded DLL, Enable RTTI
//		CString strCFlagsR	= TEXT("/MD /GR");
//		CString strCFlagsD	= TEXT("/MDd /GR");
		
		BSTR bstrToolCl		= strToolCl.AllocSysString();
		BSTR bstrToolLink	= strToolLink.AllocSysString();
		BSTR bstrToolRes	= strToolRes.AllocSysString();
		BSTR bstrToolMFC	= strToolMFC.AllocSysString();
		BSTR bstrWindows	= strWindows.AllocSysString();
		BSTR bstrNative		= strNative.AllocSysString();
		BSTR bstrCallConv	= strCallConv.AllocSysString();
		BSTR bstrEH			= strEH.AllocSysString();
		BSTR bstrNoMFC		= strNoMFC.AllocSysString();
		BSTR bstrStructAlign= strStructAlign.AllocSysString();
		BSTR bstrRelease	= strRelease.AllocSysString();
		BSTR bstrIncrement	= strIncrement.AllocSysString();
		BSTR bstrPreprocessor= strPreprocessor.AllocSysString();
		BSTR bstrDbgInfo	= strDbgInfo.AllocSysString();
		BSTR bstrDftLib		= strDftLib.AllocSysString();
		BSTR bstrNoDftLib	= strNoDftLib.AllocSysString();
		BSTR bstrDDKLib		= strDDKLib.AllocSysString();
		BSTR bstrNoPdb		= strNoPdb.AllocSysString();
		BSTR bstrEntry		= strEntry.AllocSysString();
		BSTR bstrResources	= strResources.AllocSysString();

		BSTR bstrDbgC7Compatible= strDbgC7Compatible.AllocSysString();
		BSTR bstrDbgPreprocessor= strDbgPreprocessor.AllocSysString();
		BSTR bstrDbgRes			= strDbgRes.AllocSysString();	
		BSTR bstrDbgOptions		= strDbgOptions.AllocSysString();
		BSTR bstrDbgOutput		= strDbgOutput.AllocSysString();
		BSTR bstrDbgLibPath		= strDbgLibPath.AllocSysString();
		BSTR bstrRlsPreprocessor= strRlsPreprocessor.AllocSysString();
		BSTR bstrRlsRes			= strRlsRes.AllocSysString();
		BSTR bstrRlsOutput		= strRlsOutput.AllocSysString();
		BSTR bstrRlsLibPath		= strRlsLibPath.AllocSysString();
//		BSTR bstrCustFile	= strCustFile.AllocSysString();
//		BSTR bstrCustDesc	= strCustDesc.AllocSysString();
//		BSTR bstrCustCmd	= strCustCmd.AllocSysString();
//		BSTR bstrCustOut	= strCustOut.AllocSysString();
//		BSTR bstrCFlagsR	= strCFlagsR.AllocSysString();
//		BSTR bstrCFlagsD	= strCFlagsD.AllocSysString();

		// loop through all the possible configurations and
		// change the settings
		long lCount;
		pAllConf->get_Count(&lCount);
		for( register long i = 1 ; i <= lCount ; ++i )
		{
			IConfiguration * pConf = 0;
			COleVariant idx(i);
			pAllConf->Item(idx, &pConf);
			if( pConf ) 
			{
				BSTR bstrName;
				pConf->get_Name(&bstrName);
				CString strName = bstrName;
				pConf->AddToolSettings(bstrToolMFC, bstrNoMFC, var);
				pConf->RemoveToolSettings(bstrToolLink, bstrWindows, var);
				pConf->AddToolSettings(bstrToolLink, bstrNative, var);
//				pConf->AddCustomBuildStepToFile(bstrCustFile, bstrCustCmd, bstrCustOut, bstrCustDesc, var);
				pConf->AddToolSettings(bstrToolCl, bstrCallConv, var);
				pConf->AddToolSettings(bstrToolCl, bstrStructAlign, var);
				pConf->AddToolSettings(bstrToolCl, bstrPreprocessor, var);
				
				pConf->RemoveToolSettings(bstrToolLink, bstrDbgInfo, var);
				pConf->RemoveToolSettings(bstrToolLink, bstrDftLib, var);
				pConf->AddToolSettings(bstrToolLink, bstrNoDftLib, var);
				pConf->AddToolSettings(bstrToolLink, bstrDDKLib, var);
				pConf->RemoveToolSettings(bstrToolLink, bstrNoPdb, var);
				pConf->AddToolSettings(bstrToolLink, bstrEntry, var);
				pConf->AddToolSettings(bstrToolLink , bstrIncrement, var);
				pConf->RemoveToolSettings(bstrToolCl, bstrEH, var);
				pConf->AddToolSettings(bstrToolRes, bstrResources, var);

				if(strName.Find(TEXT("Debug")) >= 0)
				{
//					pConf->AddToolSettings(bstrToolCl, bstrCFlagsD, var);
					pConf->AddToolSettings(bstrToolCl, bstrDbgC7Compatible, var);
					pConf->AddToolSettings(bstrToolCl, bstrDbgPreprocessor, var);
					pConf->AddToolSettings(bstrToolCl, bstrDbgOptions,		var);
					pConf->RemoveToolSettings(bstrToolCl, bstrRelease,		var);
					pConf->RemoveToolSettings(bstrToolLink , bstrDbgOutput, var);
					pConf->AddToolSettings(bstrToolLink, bstrDbgOutput, var);
					pConf->AddToolSettings(bstrToolLink, bstrDbgLibPath, var);
					pConf->AddToolSettings(bstrToolRes,	 bstrDbgRes, var);
				}
				else
				{
//					pConf->AddToolSettings(bstrToolCl, bstrCFlagsR, var);
					pConf->AddToolSettings(bstrToolCl, bstrRlsPreprocessor, var);
					pConf->RemoveToolSettings(bstrToolLink , bstrRlsOutput, var);
					pConf->AddToolSettings(bstrToolLink, bstrRlsOutput, var);
					pConf->AddToolSettings(bstrToolLink, bstrRlsLibPath, var);
					pConf->AddToolSettings(bstrToolRes,	 bstrRlsRes, var);
				}
				pConf->Release();
				::SysFreeString(bstrName);
			} else
				AfxMessageBox(TEXT("failed to set settings for the new project"));
		}

		// do not forget to free all sys-strings !
		::SysFreeString(bstrProjName);
		::SysFreeString(bstrToolCl);
		::SysFreeString(bstrToolLink);
		::SysFreeString(bstrToolRes);
		::SysFreeString(bstrToolMFC);
		::SysFreeString(bstrNative);
		::SysFreeString(bstrCallConv);
		::SysFreeString(bstrEH);
		::SysFreeString(bstrStructAlign);
		::SysFreeString(bstrRelease);
		::SysFreeString(bstrIncrement);
		::SysFreeString(bstrPreprocessor);
		::SysFreeString(bstrNoMFC);
		::SysFreeString(bstrDbgC7Compatible);
		::SysFreeString(bstrDbgPreprocessor);
		::SysFreeString(bstrDbgRes);
		::SysFreeString(bstrDbgOptions);
		::SysFreeString(bstrDbgOutput);
		::SysFreeString(bstrDbgLibPath);
		::SysFreeString(bstrRlsPreprocessor);
		::SysFreeString(bstrRlsRes);
		::SysFreeString(bstrRlsOutput);
		::SysFreeString(bstrRlsLibPath);
//		::SysFreeString(bstrCustFile);
//		::SysFreeString(bstrCustDesc);
//		::SysFreeString(bstrCustCmd);
//		::SysFreeString(bstrCustOut);
//		::SysFreeString(bstrCFlagsR);
//		::SysFreeString(bstrCFlagsD);
		::SysFreeString(bstrDbgInfo);
		::SysFreeString(bstrDftLib);
		::SysFreeString(bstrNoDftLib);
		::SysFreeString(bstrDDKLib);
		::SysFreeString(bstrNoPdb);
		::SysFreeString(bstrEntry);
		::SysFreeString(bstrResources);

		pAllConf->Release();
	} else
		AfxMessageBox(TEXT("failed to set settings for the new project"));
}


// Here we define one instance of the CDrv_WizardAppWiz class.  You can access
//  m_Dictionary and any other public members of this class through the
//  global Drv_Wizardaw.
CDrv_WizardAppWiz Drv_Wizardaw;

⌨️ 快捷键说明

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