📄 infinstalldlg.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 + -