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

📄 uninstalldevdlg.cpp

📁 驱动的安装和卸载
💻 CPP
字号:
// UnInstallDevDlg.cpp : implementation file
//
#include "stdafx.h"
#include "UnInstallDev.h"
#include "UnInstallDevDlg.h"
static const GUID GUID_READER = {0x50dd5230,0xba8a,0x11d1,0xb5,0xfd,0x00,0x00,0xf8,0x05,0xf5,0x30};
static const GUID GUID_USBDEV = 
{ 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };

static const GUID GUID_CAR = {0x4D36E96C,0xE325,0x11CE,0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18};


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

/////////////////////////////////////////////////////////////////////////////
// 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()

/////////////////////////////////////////////////////////////////////////////
// CUnInstallDevDlg dialog

CUnInstallDevDlg::CUnInstallDevDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CUnInstallDevDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CUnInstallDevDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CUnInstallDevDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CUnInstallDevDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CUnInstallDevDlg, CDialog)
	//{{AFX_MSG_MAP(CUnInstallDevDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CUnInstallDevDlg message handlers

BOOL CUnInstallDevDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	DeleteDevices();
	OnOK();
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CUnInstallDevDlg::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 CUnInstallDevDlg::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 CUnInstallDevDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}
 
BOOL CUnInstallDevDlg::DeleteDevices()
{
	BOOL bSuccess = FALSE;
	GUID hidGuid;
	memcpy(&hidGuid, &GUID_USBDEV, sizeof(GUID));
	HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid,
	NULL, // no enumerator 
	NULL, // no parent
	(DIGCF_PRESENT | DIGCF_INTERFACEDEVICE)); 
	if(!hDevInfo)
	{
		DT("Couldn't get handle for USB devices");
		return FALSE;
	}

	SP_INTERFACE_DEVICE_DATA devInfoData;
	devInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);

	SP_DEVINFO_DATA  spdevInfoData;
	spdevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
	int deviceNo = 0;

	SetLastError(NO_ERROR);

	while(GetLastError() != ERROR_NO_MORE_ITEMS)
	{
		if(SetupDiEnumInterfaceDevice (hDevInfo,
		0, 
		&hidGuid,
		deviceNo,
		&devInfoData))
		{
			ULONG requiredLength = 0;
			SetupDiGetInterfaceDeviceDetail(hDevInfo,
			&devInfoData,
			NULL,
			0,
			&requiredLength,
			NULL);

			PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc (requiredLength);
			devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);

			if(! SetupDiGetInterfaceDeviceDetail(hDevInfo,
			&devInfoData,
			devDetail,
			requiredLength,
			NULL,
			NULL)) 
			{
				DT("Couldn't get USB details");
				free(devDetail);
				return FALSE;
			}
			DT(devDetail->DevicePath);
			CString strDevicePath(devDetail->DevicePath);
			int  nFind = strDevicePath.Find(_T("usb#vid_eb1a&pid_2870#5&39fed2b0&0&3"));
			
			if(nFind == -1)
			{
				deviceNo++;
				continue;
			}
			else//find the device
			{
				bSuccess = SetupDiDeleteDeviceInterfaceData(hDevInfo, &devInfoData);
				bSuccess = SetupDiDeleteDeviceInterfaceRegKey(hDevInfo, &devInfoData, 0);
			}
			
		}

		bSuccess = SetupDiEnumDeviceInfo(hDevInfo, deviceNo, &spdevInfoData);
		if (bSuccess)
		{
			LPOLESTR  olestrGUID;
			char  szGUID[MAX_PATH];
			StringFromCLSID(spdevInfoData.ClassGuid, &olestrGUID);
			WideCharToMultiByte(CP_ACP, 0, olestrGUID, -1, szGUID, 
			MAX_PATH, NULL, NULL);
			CoTaskMemFree(olestrGUID);
			DT(szGUID);
			bSuccess = ChangeDeviceState(hDevInfo, spdevInfoData, DICS_STOP);
			bSuccess = SetupDiDeleteDeviceInfo(hDevInfo, &spdevInfoData);
			bSuccess = SetupDiDeleteDevRegKey(hDevInfo, &spdevInfoData, DICS_FLAG_GLOBAL, 0xFFFFFFFF, DIREG_BOTH );
//			DWORD dwEror = GetLastError();
			bSuccess = SetupDiCallClassInstaller(DIF_REMOVE, hDevInfo, &spdevInfoData);
			
			
		}
		deviceNo++;
	}

	bSuccess = FindExistingDevice("USB\\Vid_0ac8&Pid_305b&Rev_0100");
	if(bSuccess)
	{
		int nSesult = RemoveDriver("USB\\Vid_0ac8&Pid_305b&Rev_0100");
	}

	bSuccess = FindExistingDevice("USB\\Vid_0ac8&Pid_305b");
	if(bSuccess)
	{
		int nSesult = RemoveDriver("USB\\Vid_0ac8&Pid_305b");
	}
	return TRUE;
}

BOOL CUnInstallDevDlg::ChangeDeviceState(HDEVINFO hDevInfo, SP_DEVINFO_DATA& did, DWORD State)
{
  SP_PROPCHANGE_PARAMS pcp = {sizeof(SP_CLASSINSTALL_HEADER)};

  pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
  pcp.Scope = (State == DICS_START || State == DICS_STOP )? DICS_FLAG_CONFIGSPECIFIC : DICS_FLAG_GLOBAL;
  pcp.StateChange = State;

  if(!::SetupDiSetClassInstallParams(hDevInfo, &did,
    (SP_CLASSINSTALL_HEADER *)&pcp, sizeof(pcp)))
  {
    DT("SetupDiSetClassInstallParams");
    return FALSE;
  }
  return TRUE;
}


BOOL CUnInstallDevDlg::FindExistingDevice(IN LPTSTR HardwareId)
{
    HDEVINFO DeviceInfoSet;
    SP_DEVINFO_DATA DeviceInfoData;
    DWORD i,err;
    BOOL Found = FALSE;

    DeviceInfoSet = SetupDiGetClassDevs(NULL,0,0, DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system

    if (DeviceInfoSet == INVALID_HANDLE_VALUE)
    {
		DT(TEXT("GetClassDevs(All Present Devices)"));
        return FALSE;
    }

    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    for (i=0; SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData); i++)
    {
        DWORD DataT;
        LPTSTR p,buffer = NULL;
        DWORD buffersize = 0;

        while (!SetupDiGetDeviceRegistryProperty(
            DeviceInfoSet,
            &DeviceInfoData,
            SPDRP_HARDWAREID,
            &DataT,
            (PBYTE)buffer,
            buffersize,
            &buffersize))
        {
            if (GetLastError() == ERROR_INVALID_DATA)
            {
                break;
            }
            else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                if (buffer)
				{
                    LocalFree(buffer);
				}
                buffer = (char *)LocalAlloc(LPTR,buffersize);
            }
            else
            {
                err = GetLastError();
				SetupDiDestroyDeviceInfoList(DeviceInfoSet);
				SetLastError(err);
            }
        }

        if (GetLastError() == ERROR_INVALID_DATA)
		{
            continue;
		}
        //
        for (p=buffer;*p&&(p<&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR))
        {
            DT(TEXT("Compare device ID: [%s]\n"),p);
            if (_tcscmp(HardwareId,p) == 0)
            {
                Found = TRUE;
				if (buffer) 
				{
					LocalFree(buffer);
				}
                return TRUE;
            }
        }
    }

    return FALSE; 
}

BOOL CUnInstallDevDlg::InstallRootEnumeratedDriver(IN  LPTSTR HardwareId,
    IN  LPTSTR INFFile,
    OUT PBOOL  RebootRequired  OPTIONAL
    )
{
    HDEVINFO DeviceInfoSet = 0;
    SP_DEVINFO_DATA DeviceInfoData;
    GUID ClassGUID;
    TCHAR ClassName[MAX_PATH];
   
    if (!SetupDiGetINFClass(INFFile,&ClassGUID,ClassName,sizeof(ClassName),0))


    {
        return DT(TEXT("GetINFClass fail"));
    }

    DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID,0);
    if(DeviceInfoSet == INVALID_HANDLE_VALUE)
    {
        return DT(TEXT("CreateDeviceInfoList Fail"));
    }

    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    if (!SetupDiCreateDeviceInfo(DeviceInfoSet,
        ClassName,
        &ClassGUID,
        NULL,
        0,
        DICD_GENERATE_ID,
        &DeviceInfoData))
    {
        DT(TEXT("CreateDeviceInfo fail"));
        SetupDiDestroyDeviceInfoList(DeviceInfoSet);
		return FALSE;
    }

    //
    // Add the HardwareID to the Device's HardwareID property.
    //
    if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
        &DeviceInfoData,
        SPDRP_HARDWAREID,
        (LPBYTE)HardwareId,
        (lstrlen(HardwareId)+1+1)*sizeof(TCHAR)))
    {
        DT(TEXT("SetDeviceRegistryProperty"));
        SetupDiDestroyDeviceInfoList(DeviceInfoSet);
		return FALSE;
    }

    //
    // Transform the registry element into an actual devnode
    // in the PnP HW tree.
    //
    if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE,
        DeviceInfoSet,
        &DeviceInfoData))
    {
        DT(TEXT("CallClassInstaller(REGISTERDEVICE)"));
        SetupDiDestroyDeviceInfoList(DeviceInfoSet);
		return FALSE;
    }

    if (!UpdateDriverForPlugAndPlayDevices(0,
        HardwareId,
        INFFile,
        INSTALLFLAG_FORCE,
        RebootRequired))
    {
        DWORD err = GetLastError();
        DT(TEXT("UpdateDriverForPlugAndPlayDevices fail"));

        if (!SetupDiCallClassInstaller(
            DIF_REMOVE,
            DeviceInfoSet,
            &DeviceInfoData))
        {
            DT(TEXT("CallClassInstaller(REMOVE)"));
        }

		return FALSE;
    }
	
    return TRUE;
}

int CUnInstallDevDlg::InstallDriver(_TCHAR *InfName, _TCHAR *HardwareID)
{
    WIN32_FIND_DATA FindFileData;
    BOOL RebootRequired = 0; // Must be cleared.
    _TCHAR *FName, *HWID;
    FName = InfName;
    HWID = HardwareID;

    if (FindFirstFile(FName,&FindFileData)==INVALID_HANDLE_VALUE)
    {
        DT(TEXT("File not found.\n"));
        return 2; // Install Failure
    }

    if (FindExistingDevice(HWID))
    {
        //
        // No Need to Create a Device Node, just call our API.
        //
        if (!UpdateDriverForPlugAndPlayDevices(0, // No Window Handle
            HWID, // Hardware ID
            FName, // FileName
            INSTALLFLAG_FORCE,
            &RebootRequired))
        {
            DT(TEXT("UpdateDriverForPlugAndPlayDevices fail"));
            return 2; // Install Failure
        }
    }
    else
    {
        if (GetLastError()!= ERROR_NO_MORE_ITEMS)
        {
            return 2; // Install Failure
        }
        if (!InstallRootEnumeratedDriver(HWID, // HardwareID
            FName, // FileName
            &RebootRequired))
        {
            DT(TEXT("(InstallRootEnumeratedDriver Failure! Code = 2)\n"));
            return 2; // Install Failure
        }
    }

    if (RebootRequired)
    {
        DT(TEXT("(Reboot Required)\n"));
        return 1; // Install Success, reboot required.
    }
    return 0; // Install Success, no reboot required.
}

int CUnInstallDevDlg::RemoveDriver(_TCHAR *HardwareID)
{
    HDEVINFO DeviceInfoSet;
    SP_DEVINFO_DATA DeviceInfoData;
    DWORD i;

    DeviceInfoSet = SetupDiGetClassDevs(NULL, // All Classes
        0,
        0,
        DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system

    if (DeviceInfoSet == INVALID_HANDLE_VALUE)
    {
        DT(TEXT("GetClassDevs(All Present Devices)"));
        return 1;
    }

    DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
    for (i=0;SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData);i++)
    {
        DWORD DataT;
        LPTSTR p,buffer = NULL;
        DWORD buffersize = 0;
		
        while (!SetupDiGetDeviceRegistryProperty(
            DeviceInfoSet,
            &DeviceInfoData,
            SPDRP_HARDWAREID,
            &DataT,
            (PBYTE)buffer,
            buffersize,
            &buffersize))
        {
            if (GetLastError() == ERROR_INVALID_DATA)
            {
                break;
            }
            else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            {
                if (buffer)
				{
                    LocalFree(buffer);
				}
                buffer = (char *)LocalAlloc(LPTR,buffersize);
            }
            else
            {
                DT(TEXT("GetDeviceRegistryProperty fail"));
                SetupDiDestroyDeviceInfoList(DeviceInfoSet);
            }
        }

        if (GetLastError() == ERROR_INVALID_DATA)
		{
            continue;
		}

   
        for (p=buffer;*p&&(p<&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR))
        {
            DT(TEXT("XXXXXXCompare device ID: [%s], HardwareID = [%s]\n"),p, HardwareID);
            if (_tcscmp(HardwareID,p) == 0)
            {
                if (!SetupDiCallClassInstaller(DIF_REMOVE,
                    DeviceInfoSet,
                    &DeviceInfoData))
                {
                    DT(TEXT("Remove Driver Fail"));
                }
				else
				{
					DT(TEXT("Remove Driver Success "));
				}
                break;
            }
        }

        if (buffer) 
		{
			LocalFree(buffer);
		}
    }

    if ((GetLastError()!=NO_ERROR) || (GetLastError()!=ERROR_NO_MORE_ITEMS))
    {
		return 1;
        DT(TEXT("EnumDeviceInfo fail"));
    }
    return 0;
}




⌨️ 快捷键说明

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