VC++ 安装驱动 源码
来源:互联网 发布:必向东java 编辑:程序博客网 时间:2024/05/17 04:11
WDM式驱动源码:
#include "stdafx.h"#include <tchar.h> // Make all functions UNICODE safe.#include <newdev.h> // for the API UpdateDriverForPlugAndPlayDevices().#include <setupapi.h> // for SetupDiXxx functions.#include "install.h"int DisplayError(TCHAR * ErrorName){ DWORD Err = GetLastError(); LPVOID lpMessageBuffer = NULL; if (FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, Err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMessageBuffer, 0, NULL )) NULL; //_tprintf(TEXT("%s FAILURE: %s/n"),ErrorName,(TCHAR *)lpMessageBuffer); else NULL; //_tprintf(TEXT("%s FAILURE: (0xx)/n"),ErrorName,Err); if (lpMessageBuffer) LocalFree( lpMessageBuffer ); // Free system buffer SetLastError(Err); return FALSE;}BOOL FindExistingDevice(IN LPTSTR HardwareId){ HDEVINFO DeviceInfoSet; SP_DEVINFO_DATA DeviceInfoData; DWORD i,err; BOOL Found; // // Create a Device Information Set with all present devices. // DeviceInfoSet = SetupDiGetClassDevs(NULL, // All Classes 0, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system if (DeviceInfoSet == INVALID_HANDLE_VALUE) { return DisplayError(TEXT("GetClassDevs(All Present Devices)")); } //_tprintf(TEXT("Search for Device ID: [%s]/n"),HardwareId); // // Enumerate through all Devices. // Found = FALSE; DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (i=0;SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData);i++) { DWORD DataT; LPTSTR p,buffer = NULL; DWORD buffersize = 0; // // We won't know the size of the HardwareID buffer until we call // this function. So call it with a null to begin with, and then // use the required buffer size to Alloc the nessicary space. // Keep calling we have success or an unknown failure. // while (!SetupDiGetDeviceRegistryProperty( DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, &DataT, (PBYTE)buffer, buffersize, &buffersize)) { if (GetLastError() == ERROR_INVALID_DATA) { // // May be a Legacy Device with no HardwareID. Continue. // break; } else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { // // We need to change the buffer size. // if (buffer) LocalFree(buffer); buffer = (char *)LocalAlloc(LPTR,buffersize); } else { // // Unknown Failure. // DisplayError(TEXT("GetDeviceRegistryProperty")); goto cleanup_DeviceInfo; } } if (GetLastError() == ERROR_INVALID_DATA) continue; // // Compare each entry in the buffer multi-sz list with our HardwareID. // for (p=buffer;*p&&(p<&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR)) { //_tprintf(TEXT("Compare device ID: [%s]/n"),p); if (!_tcscmp(HardwareId,p)) { //_tprintf(TEXT("Found! [%s]/n"),p); Found = TRUE; break; } } if (buffer) LocalFree(buffer); if (Found) break; } if (GetLastError() != NO_ERROR) { DisplayError(TEXT("EnumDeviceInfo")); } // // Cleanup. //cleanup_DeviceInfo: err = GetLastError(); SetupDiDestroyDeviceInfoList(DeviceInfoSet); SetLastError(err); return err == NO_ERROR; //???}BOOLInstallRootEnumeratedDriver(IN LPTSTR HardwareId, IN LPTSTR INFFile, OUT PBOOL RebootRequired OPTIONAL ){ HDEVINFO DeviceInfoSet = 0; SP_DEVINFO_DATA DeviceInfoData; GUID ClassGUID; TCHAR ClassName[MAX_CLASS_NAME_LEN]; DWORD err; // // Use the INF File to extract the Class GUID. // if (!SetupDiGetINFClass(INFFile,&ClassGUID,ClassName,sizeof(ClassName),0)) { return DisplayError(TEXT("GetINFClass")); } // // Create the container for the to-be-created Device Information Element. // DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID,0); if(DeviceInfoSet == INVALID_HANDLE_VALUE) { return DisplayError(TEXT("CreateDeviceInfoList")); } // // Now create the element. // Use the Class GUID and Name from the INF file. // DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if (!SetupDiCreateDeviceInfo(DeviceInfoSet, ClassName, &ClassGUID, NULL, 0, DICD_GENERATE_ID, &DeviceInfoData)) { DisplayError(TEXT("CreateDeviceInfo")); goto cleanup_DeviceInfo; } // // Add the HardwareID to the Device's HardwareID property. // if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, (LPBYTE)HardwareId, (lstrlen(HardwareId)+1+1)*sizeof(TCHAR))) { DisplayError(TEXT("SetDeviceRegistryProperty")); goto cleanup_DeviceInfo; } // // Transform the registry element into an actual devnode // in the PnP HW tree. // if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE, DeviceInfoSet, &DeviceInfoData)) { DisplayError(TEXT("CallClassInstaller(REGISTERDEVICE)")); goto cleanup_DeviceInfo; } // // The element is now registered. We must explicitly remove the // device using DIF_REMOVE, if we encounter any failure from now on. // // // Install the Driver. // if (!UpdateDriverForPlugAndPlayDevices(0, HardwareId, INFFile, INSTALLFLAG_FORCE, RebootRequired)) { DWORD err = GetLastError(); DisplayError(TEXT("UpdateDriverForPlugAndPlayDevices")); if (!SetupDiCallClassInstaller( DIF_REMOVE, DeviceInfoSet, &DeviceInfoData)) { DisplayError(TEXT("CallClassInstaller(REMOVE)")); } SetLastError(err); } // // Cleanup. //cleanup_DeviceInfo: err = GetLastError(); SetupDiDestroyDeviceInfoList(DeviceInfoSet); SetLastError(err); return err == NO_ERROR;}int 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) { //_tprintf(TEXT(" File not found./n")); //_tprintf(TEXT("usage: install <INF_File> <Hardware_ID>/n")); return 2; // Install Failure } // // Look to see if this device allready exists. // 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)) { DisplayError(TEXT("UpdateDriverForPlugAndPlayDevices")); return 2; // Install Failure } } else { if (GetLastError()!= ERROR_NO_MORE_ITEMS) { // // An unknown failure from FindExistingDevice() // //_tprintf(TEXT("(IERROR_NO_MORE_ITEMS)/n")); //_tprintf(TEXT("(Install Failure! Code = 2)/n")); return 2; // Install Failure } // // Driver Does not exist, Create and call the API. // HardwareID must be a multi-sz string, which argv[2] is. // if (!InstallRootEnumeratedDriver(HWID, // HardwareID FName, // FileName &RebootRequired)) { //_tprintf(TEXT("(InstallRootEnumeratedDriver Failure! Code = 2)/n")); return 2; // Install Failure } } //_tprintf(TEXT("Driver Installed successfully./n")); if (RebootRequired) { //_tprintf(TEXT("(Reboot Required)/n")); return 1; // Install Success, reboot required. } return 0; // Install Success, no reboot required.}int RemoveDriver(_TCHAR *HardwareID){ HDEVINFO DeviceInfoSet; SP_DEVINFO_DATA DeviceInfoData; DWORD i,err; DeviceInfoSet = SetupDiGetClassDevs(NULL, // All Classes 0, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT ); // All devices present on system if (DeviceInfoSet == INVALID_HANDLE_VALUE) { DisplayError(TEXT("GetClassDevs(All Present Devices)")); return 1; } // // Enumerate through all Devices. // DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); for (i=0;SetupDiEnumDeviceInfo(DeviceInfoSet,i,&DeviceInfoData);i++) { DWORD DataT; LPTSTR p,buffer = NULL; DWORD buffersize = 0; // // We won't know the size of the HardwareID buffer until we call // this function. So call it with a null to begin with, and then // use the required buffer size to Alloc the nessicary space. // Keep calling we have success or an unknown failure. // while (!SetupDiGetDeviceRegistryProperty( DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, &DataT, (PBYTE)buffer, buffersize, &buffersize)) { if (GetLastError() == ERROR_INVALID_DATA) { // // May be a Legacy Device with no HardwareID. Continue. // break; } else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { // // We need to change the buffer size. // if (buffer) LocalFree(buffer); buffer = (char *)LocalAlloc(LPTR,buffersize); } else { // // Unknown Failure. // DisplayError(TEXT("GetDeviceRegistryProperty")); goto cleanup_DeviceInfo; } } if (GetLastError() == ERROR_INVALID_DATA) continue; // // Compare each entry in the buffer multi-sz list with our HardwareID. // for (p=buffer;*p&&(p<&buffer[buffersize]);p+=lstrlen(p)+sizeof(TCHAR)) { //_tprintf(TEXT("Compare device ID: [%s]/n"),p); if (!_tcscmp(HardwareID,p)) { //_tprintf(TEXT("Found! [%s]/n"),p); // // Worker function to remove device. // if (!SetupDiCallClassInstaller(DIF_REMOVE, DeviceInfoSet, &DeviceInfoData)) { DisplayError(TEXT("CallClassInstaller(REMOVE)")); } break; } } if (buffer) LocalFree(buffer); } if ((GetLastError()!=NO_ERROR)&&(GetLastError()!=ERROR_NO_MORE_ITEMS)) { DisplayError(TEXT("EnumDeviceInfo")); } // // Cleanup. //cleanup_DeviceInfo: err = GetLastError(); SetupDiDestroyDeviceInfoList(DeviceInfoSet); return err;}
0 0
- VC++ 安装驱动 源码
- VC++ 安装驱动 源码
- VC安装驱动源码
- VC++ 安装驱动 详细解释
- VC++ 安装驱动 详细解释
- VC++ 安装驱动 详细解释
- VC安装驱动详细解释
- Linux无线驱动源码安装
- linux设备驱动学习(1)--内核源码树安装
- LDD3linux设备驱动源码树的安装和第一个hello wolrd驱动的编写
- LDD3linux设备驱动源码树的安装和第一个hello wolrd驱动的编写
- vc编写驱动
- VC加载驱动
- VC 加载驱动
- VC 加载驱动
- centos 7 安装源码kernel source(源码树)编译驱动
- rhel6.6的内核源码安装与BCM4322无线网卡驱动的安装
- Win7下安装OK6410的USB驱动以及Linux下源码安装dnw
- SQL Server中的Collate排序规则关键字的使用
- Java compiler level does not match the version of the installed Java 及MyEclipse中没有ProjectFacets
- ORA-00936 缺失表达式
- 色纺二十个认同感人的很多人挺好他与和大统华太阳花太费劲
- python inspect模块解析--提供自省功能
- VC++ 安装驱动 源码
- jquery 实现点击加载更多
- rem em px 区别
- 【 Algorithm】顺序打印矩阵——美团四面
- iOS微信开放平台
- perl滑动匹配
- struts2防止页面重复提交的解决方案
- python中迭代器和生成器
- Ubuntu 14.04 Nydus VPN配置