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

📄 infinstalldlg.cpp

📁 根据Inf文件
💻 CPP
字号:
// InfInstallDlg.cpp : implementation file
//

#include "stdafx.h"
#include "InfInstall.h"
#include "InfInstallDlg.h"

#include <newdev.h>
#include "Setup.h"

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

BOOL DeviceCallback(CInf* inf, const CString& devname, const CString& instsecname, const CStringArray& devid, PVOID context, DWORD& code);
BOOL MfgCallback(CInf* inf, const CString& mfgname, const CString& modelname, PVOID context, DWORD& code);
void ReportError(LPCTSTR fcn, DWORD code);

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInfInstallDlg dialog

CInfInstallDlg::CInfInstallDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CInfInstallDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CInfInstallDlg)
	m_HardID = _T("");
	m_InfFile = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CInfInstallDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CInfInstallDlg)
	DDX_Text(pDX, IDC_HARD_ID, m_HardID);
	DDX_Text(pDX, IDC_INF_FILE, m_InfFile);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CInfInstallDlg, CDialog)
	//{{AFX_MSG_MAP(CInfInstallDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_VIEW, OnView)
	ON_BN_CLICKED(IDC_INSTALL, OnInstall)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInfInstallDlg message handlers

BOOL CInfInstallDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CInfInstallDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CInfInstallDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CInfInstallDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CInfInstallDlg::OnView() 
{
	CFileDialog dlg(TRUE,_T("INF"),_T("*.INF"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("INF文件(*.INF)|*.INF|"));
	if(dlg.DoModal()==IDOK)
	{
		m_InfFile=dlg.GetPathName();
		UpdateData(FALSE);
	}
}

void CInfInstallDlg::OnInstall() 
{
	UpdateData();
    WIN32_FIND_DATA FindFileData;
    BOOL RebootRequired = 0;
	if(m_InfFile=="")
	{
		MessageBox("请输入INF文件!");
		return ;
	}
	//	确认INF是否存在
    if (FindFirstFile(m_InfFile,&FindFileData)==INVALID_HANDLE_VALUE)
    {
        MessageBox("INF File not found!");
        return ;
    }
	//////////////////////////////////////////////////////////
	DWORD code;
	//	打开INF文件,获取CLASS名和ClassGuid
	CInf inf;
	code = inf.Open(m_InfFile, FALSE);
	if (code != 0)
	{
		ReportError(_T("SetupOpenInfFile"), code);
		return ;
	}
	//	从INF文件中装载指定的modal
	InstallStruct is;
	is.done = FALSE;
	is.devid = m_HardID;
	code = inf.EnumManufacturers(MfgCallback, (PVOID) &is);
	if (code != 0)
	{
		ReportError(_T("search for specified device"), code);
		return ;
	}
	//	创建一个DeviceInfoList
	CDevInfoSet infoset;
	code = infoset.Create(&inf, NULL);
	if (code != 0)
	{
		ReportError(_T("SetupDiCreateDeviceInfoList"),code);
		return ;
	}
	//	创建一个DeviceInfo
	//	在注册表中创建一个hardware key并设置制定的hardware id
	// registry and sets the designated hardware id. The way we call
	// SetupDiCreateDeviceInfo, the key will be a subkey of the class key and
	// have an autogenerated name.
	//	注意DDK文档你为name参数提供了一个Device ID是错误的
	code = infoset.CreateDeviceInfo(is.devid);
	if (code != 0)
	{
		ReportError(_T("SetupDiCreateDeviceInfo or SetupDiSetDeviceRegistryProperty"), code);
		return ;
	}
	// Register the device with PnP. This step creates a DEVNODE, but there's still
	// no driver associated with the device at this point
	code = infoset.RegisterDevice();
	if (code != 0)
	{
		ReportError(_T("SetupDiCallClassInstaller(DIF_REGISTERDEVICE)"), code);
		return ;
	}
	// Finally, install the driver
	code = infoset.UpdateDriver();
	if (code != 0)
	{
		ReportError(_T("UpdateDriverForPlugAndPlayDevices"), code);
		return ;
	}
	MessageBox("安装完毕!");
	return ;
}

BOOL DeviceCallback(CInf* inf, const CString& devname, const CString& instsecname, const CStringArray& devid, PVOID context, DWORD& code)
{
	InstallStruct* isp = (InstallStruct*) context;
	int n = devid.GetSize();
	for (int i = 0; i < n; ++i)
	{
		if (isp->devid == devid[i] || isp->devid.GetLength() == 0)
			break;
	}
	
	if (i >= n)
		return TRUE;			// keep enumerating -- this isn't it
	
	isp->devid = devid[i];
	isp->devname = devname;
	
	code = 0;					// successful conclusion
	isp->done = TRUE;
	return FALSE;				// stop enumeration
}


BOOL MfgCallback(CInf* inf, const CString& mfgname, const CString& modelname, PVOID context, DWORD& code)
{
	InstallStruct* isp = (InstallStruct*) context;
	isp->mfgname = mfgname;
	code = inf->EnumDevices(modelname, DeviceCallback, context);
	return code == 0 && !isp->done;
}

void ReportError(LPCTSTR fcn, DWORD code)
{							// ReportError
	static struct
	{
		DWORD code;
		LPTSTR text;
	}
	setuperrors[]=
	{
		{ERROR_EXPECTED_SECTION_NAME, _T("ERROR_EXPECTED_SECTION_NAME")},
		{ERROR_BAD_SECTION_NAME_LINE, _T("ERROR_BAD_SECTION_NAME_LINE")},
		{ERROR_SECTION_NAME_TOO_LONG, _T("ERROR_SECTION_NAME_TOO_LONG")},
		{ERROR_GENERAL_SYNTAX, _T("ERROR_GENERAL_SYNTAX")},
		{ERROR_WRONG_INF_STYLE, _T("ERROR_WRONG_INF_STYLE")},
		{ERROR_SECTION_NOT_FOUND, _T("ERROR_SECTION_NOT_FOUND")},
		{ERROR_LINE_NOT_FOUND, _T("ERROR_LINE_NOT_FOUND")},
		{ERROR_NO_ASSOCIATED_CLASS, _T("ERROR_NO_ASSOCIATED_CLASS")},
		{ERROR_CLASS_MISMATCH, _T("ERROR_CLASS_MISMATCH")},
		{ERROR_DUPLICATE_FOUND, _T("ERROR_DUPLICATE_FOUND")},
		{ERROR_NO_DRIVER_SELECTED, _T("ERROR_NO_DRIVER_SELECTED")},
		{ERROR_KEY_DOES_NOT_EXIST, _T("ERROR_KEY_DOES_NOT_EXIST")},
		{ERROR_INVALID_DEVINST_NAME, _T("ERROR_INVALID_DEVINST_NAME")},
		{ERROR_INVALID_CLASS, _T("ERROR_INVALID_CLASS")},
		{ERROR_DEVINST_ALREADY_EXISTS, _T("ERROR_DEVINST_ALREADY_EXISTS")},
		{ERROR_DEVINFO_NOT_REGISTERED, _T("ERROR_DEVINFO_NOT_REGISTERED")},
		{ERROR_INVALID_REG_PROPERTY, _T("ERROR_INVALID_REG_PROPERTY")},
		{ERROR_NO_INF, _T("ERROR_NO_INF")},
		{ERROR_NO_SUCH_DEVINST, _T("ERROR_NO_SUCH_DEVINST")},
		{ERROR_CANT_LOAD_CLASS_ICON, _T("ERROR_CANT_LOAD_CLASS_ICON")},
		{ERROR_INVALID_CLASS_INSTALLER, _T("ERROR_INVALID_CLASS_INSTALLER")},
		{ERROR_DI_DO_DEFAULT, _T("ERROR_DI_DO_DEFAULT")},
		{ERROR_DI_NOFILECOPY, _T("ERROR_DI_NOFILECOPY")},
		{ERROR_INVALID_HWPROFILE, _T("ERROR_INVALID_HWPROFILE")},
		{ERROR_NO_DEVICE_SELECTED, _T("ERROR_NO_DEVICE_SELECTED")},
		{ERROR_DEVINFO_LIST_LOCKED, _T("ERROR_DEVINFO_LIST_LOCKED")},
		{ERROR_DEVINFO_DATA_LOCKED, _T("ERROR_DEVINFO_DATA_LOCKED")},
		{ERROR_DI_BAD_PATH, _T("ERROR_DI_BAD_PATH")},
		{ERROR_NO_CLASSINSTALL_PARAMS, _T("ERROR_NO_CLASSINSTALL_PARAMS")},
		{ERROR_FILEQUEUE_LOCKED, _T("ERROR_FILEQUEUE_LOCKED")},
		{ERROR_BAD_SERVICE_INSTALLSECT, _T("ERROR_BAD_SERVICE_INSTALLSECT")},
		{ERROR_NO_CLASS_DRIVER_LIST, _T("ERROR_NO_CLASS_DRIVER_LIST")},
		{ERROR_NO_ASSOCIATED_SERVICE, _T("ERROR_NO_ASSOCIATED_SERVICE")},
		{ERROR_NO_DEFAULT_DEVICE_INTERFACE, _T("ERROR_NO_DEFAULT_DEVICE_INTERFACE")},
		{ERROR_DEVICE_INTERFACE_ACTIVE, _T("ERROR_DEVICE_INTERFACE_ACTIVE")},
		{ERROR_DEVICE_INTERFACE_REMOVED, _T("ERROR_DEVICE_INTERFACE_REMOVED")},
		{ERROR_BAD_INTERFACE_INSTALLSECT, _T("ERROR_BAD_INTERFACE_INSTALLSECT")},
		{ERROR_NO_SUCH_INTERFACE_CLASS, _T("ERROR_NO_SUCH_INTERFACE_CLASS")},
		{ERROR_INVALID_REFERENCE_STRING, _T("ERROR_INVALID_REFERENCE_STRING")},
		{ERROR_INVALID_MACHINENAME, _T("ERROR_INVALID_MACHINENAME")},
		{ERROR_REMOTE_COMM_FAILURE, _T("ERROR_REMOTE_COMM_FAILURE")},
		{ERROR_MACHINE_UNAVAILABLE, _T("ERROR_MACHINE_UNAVAILABLE")},
		{ERROR_NO_CONFIGMGR_SERVICES, _T("ERROR_NO_CONFIGMGR_SERVICES")},
		{ERROR_INVALID_PROPPAGE_PROVIDER, _T("ERROR_INVALID_PROPPAGE_PROVIDER")},
		{ERROR_NO_SUCH_DEVICE_INTERFACE, _T("ERROR_NO_SUCH_DEVICE_INTERFACE")},
		{ERROR_DI_POSTPROCESSING_REQUIRED, _T("ERROR_DI_POSTPROCESSING_REQUIRED")},
		{ERROR_INVALID_COINSTALLER, _T("ERROR_INVALID_COINSTALLER")},
		{ERROR_NO_COMPAT_DRIVERS, _T("ERROR_NO_COMPAT_DRIVERS")},
		{ERROR_NO_DEVICE_ICON, _T("ERROR_NO_DEVICE_ICON")},
		{ERROR_INVALID_INF_LOGCONFIG, _T("ERROR_INVALID_INF_LOGCONFIG")},
		{ERROR_DI_DONT_INSTALL, _T("ERROR_DI_DONT_INSTALL")},
		{ERROR_INVALID_FILTER_DRIVER, _T("ERROR_INVALID_FILTER_DRIVER")},
		{ERROR_NO_DEFAULT_INTERFACE_DEVICE, _T("ERROR_NO_DEFAULT_INTERFACE_DEVICE")},
		{ERROR_INTERFACE_DEVICE_ACTIVE, _T("ERROR_INTERFACE_DEVICE_ACTIVE")},
		{ERROR_INTERFACE_DEVICE_REMOVED, _T("ERROR_INTERFACE_DEVICE_REMOVED")},
		{ERROR_NO_SUCH_INTERFACE_DEVICE, _T("ERROR_NO_SUCH_INTERFACE_DEVICE")},
		{ERROR_NOT_INSTALLED, _T("ERROR_NOT_INSTALLED")},
	};
	
	LPTSTR msg = NULL;
	TCHAR msgbuf[512];
	
	if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
		NULL, code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(LPTSTR) &msg, 0, NULL))
		_stprintf(msgbuf, _T("Error %d in %s: %s\n"), code, fcn, msg);
	else
	{						// not a standard message
		for (int i = 0; i < arraysize(setuperrors); ++i)
			if (setuperrors[i].code == code)
				break;
			if (i < arraysize(setuperrors))
				_stprintf(msgbuf, _T("Error %8.8lX in %s: %s\n"), code, fcn, setuperrors[i].text);
			else
				_stprintf(msgbuf, _T("Error %8.8lX in %s\n"), code, fcn);
	}						// not a standard message

	if (msg)
		LocalFree((LPVOID) msg);
	
	AfxMessageBox(msgbuf);
}							// ReportError

⌨️ 快捷键说明

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