首页
社区
课程
招聘
[求助]WDM的驱动如何加载,卸载?
发表于: 2011-6-9 23:20 8966

[求助]WDM的驱动如何加载,卸载?

2011-6-9 23:20
8966
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 18
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
NT驱动可以通过scmanage之类的加载,WDM呢~
2011-6-9 23:21
0
雪    币: 107
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
这个还真不知道,同求大牛来指点
2011-6-10 06:28
0
雪    币: 58
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
《windows驱动技术开发技术详解》这本书的第一章有很详细的解说
2011-6-10 07:44
0
雪    币: 18
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
他书上说的是通过INF文件加载。没有代码实现。
找了下资料,找到两个 据说可以加载,但是可能是我的INF文件写的错误,自己右击安装可以,用他的代码就不可以,无码无真相,试成功了告诉我。

.H

#pragma once

#include   "stdafx.h"   
#include <setupapi.h> // for SetupDiXxx functions.
#include <Newdev.h> // for the API UpdateDriverForPlugAndPlayDevices(). 
#include   <TCHAR.H>   
#include   <stdio.h>   
//
#pragma comment(lib, "newdev.lib")
#pragma comment(lib, "setupapi.lib")
//
#define   MAX_CLASS_NAME_LEN   32   
//
BOOL   GetHardwareID(HDEVINFO   hDev,   SP_DEVINFO_DATA&   DeviceInfoData,   LPCTSTR   pstrHardwareID,   int   nSize);  

DWORD   WINAPI   InstallDriver(LPCTSTR   INFFile);

DWORD   WINAPI   UninstallDriver(LPCTSTR   INFFile);

BOOL   GetHardwareID(HDEVINFO   hDev,   SP_DEVINFO_DATA&   DeviceInfoData,   LPCTSTR   pstrHardwareID,   int   nSize);


.C

#include "loadDriverWDM.h"

 
DWORD   WINAPI   InstallDriver(LPCTSTR   INFFile)   
{   
	GUID   guid;   
	TCHAR   szClassName[MAX_CLASS_NAME_LEN];   
	TCHAR   szHardwareID[256];   
	DWORD   dwError   =   0;   

	memset(szHardwareID,   0,   sizeof(szHardwareID));   

	if   (!::SetupDiGetINFClass(INFFile,   &guid,   szClassName,   MAX_CLASS_NAME_LEN,   NULL))   
	{   
		dwError   =   GetLastError();   

		return   dwError;   
	}   

	HDEVINFO   hDev   =   INVALID_HANDLE_VALUE;   
	SP_DEVINFO_DATA   DeviceInfoData;   
	DeviceInfoData.cbSize   =   sizeof(SP_DEVINFO_DATA);   

	hDev   =   ::SetupDiGetClassDevs(&guid,   NULL,   NULL,   DIGCF_DEVICEINTERFACE);   

	if   (hDev   !=   INVALID_HANDLE_VALUE)   
	{   
		hDev   =   ::SetupDiGetClassDevs(&guid,   NULL,   NULL,   DIGCF_PRESENT   |   DIGCF_PROFILE);   

		if   (hDev   !=   INVALID_HANDLE_VALUE)   
		{   
			// 设备已经安装,先删除   
			if   (GetHardwareID(hDev,   DeviceInfoData,   szHardwareID,   255))   
			{   
				::SetupDiCallClassInstaller(DIF_REMOVE,   hDev,   &DeviceInfoData);   
			}   
		}   

		::SetupDiDestroyDeviceInfoList(hDev);   
	}   

	if   (szHardwareID[0]   ==   _T('\x0')   )   
	{   
		// 没有得到HardwareID,使用ClassName   
		szHardwareID[0]   =   _T('*');   
#ifdef   _UNICODE   
		wcscpy(szHardwareID+1,   szClassName);   
		_wcslwr(szHardwareID);   
#else   
		strcpy(szHardwareID+1,   szClassName);   
		_strlwr(szHardwareID);   
#endif   
	}   

	BOOL   bSuccess   =   FALSE;   

	hDev   =   SetupDiCreateDeviceInfoList(&guid,   NULL);   
	if   (hDev   !=   INVALID_HANDLE_VALUE)   
	{   
		if   (::SetupDiCreateDeviceInfo(hDev, szClassName,   &guid,   NULL,   NULL,   DICD_GENERATE_ID,   &DeviceInfoData))   
		{   
			if   (::SetupDiSetDeviceRegistryProperty(hDev,   
				&DeviceInfoData,   
				SPDRP_HARDWAREID,   
				(LPBYTE)szHardwareID,   
				(   
#ifdef   _UNICODE   
				wcslen(szHardwareID)     
#else   
				strlen(szHardwareID)   
#endif   
				+   2   )   *   sizeof(TCHAR)   )   )   
			{   
				bSuccess   =   ::SetupDiCallClassInstaller(DIF_REGISTERDEVICE,   hDev,   &DeviceInfoData);   
			}   
		}   
	}   
	dwError   =   GetLastError();   

	::SetupDiDestroyDeviceInfoList(hDev);   

	if   (bSuccess)   
	{   
		BOOL   bReBoot;   

		bSuccess   =   UpdateDriverForPlugAndPlayDevices(NULL,   
			szHardwareID,   
			INFFile,   
			1,   
			&bReBoot);   
		dwError   =   bSuccess   ?   0   :   GetLastError();   
	}   

	return   dwError;   
}   

DWORD   WINAPI   UninstallDriver(LPCTSTR   INFFile)   
{   
	GUID   guid;   
	TCHAR   szClassName[MAX_CLASS_NAME_LEN];   
	TCHAR   szHardwareID[256];   
	DWORD   dwError   =   0;   

	memset(szHardwareID,   0,   sizeof(szHardwareID));   

	if   (!::SetupDiGetINFClass(INFFile,   &guid,   szClassName,   MAX_CLASS_NAME_LEN,   NULL))   
	{   
		dwError   =   GetLastError();   
		return   dwError;   
	}   

	HDEVINFO   hDev   =   INVALID_HANDLE_VALUE;   
	SP_DEVINFO_DATA   DeviceInfoData;   
	DeviceInfoData.cbSize   =   sizeof(SP_DEVINFO_DATA);   

	hDev   =   ::SetupDiGetClassDevs(&guid,   NULL,   NULL,   DIGCF_DEVICEINTERFACE);   

	if   (hDev   !=   INVALID_HANDLE_VALUE)   
	{   
		hDev   =   ::SetupDiGetClassDevs(&guid,   NULL,   NULL,   DIGCF_PRESENT   |   DIGCF_PROFILE);   

		if   (hDev   !=   INVALID_HANDLE_VALUE)   
		{   
			// 设备已经安装,先删除   
			if   (GetHardwareID(hDev,   DeviceInfoData,   szHardwareID,   255))   
			{   
				if   (!::SetupDiCallClassInstaller(DIF_REMOVE,   hDev,   &DeviceInfoData)   )   
					dwError   =   -1;   
			}   
		}   

		::SetupDiDestroyDeviceInfoList(hDev);   
	}   

	return   dwError;   
}   

BOOL   GetHardwareID(HDEVINFO   hDev,   SP_DEVINFO_DATA&   DeviceInfoData,   LPCTSTR   pstrHardwareID,   int   nSize)  
{   
	int   nIndex   =   0;   

	if   (::SetupDiEnumDeviceInfo(hDev,   nIndex,   &DeviceInfoData))   
	{   
		DWORD   dwSize   =   nSize;   
		DWORD   dwType;   

		if   (::SetupDiGetDeviceRegistryProperty(hDev,   &DeviceInfoData,   SPDRP_HARDWAREID,   
			&dwType,   (LPBYTE)pstrHardwareID,   nSize, &dwSize))   
		{   
			if   (!::SetupDiGetDeviceRegistryProperty(hDev,     
				&DeviceInfoData,   
				SPDRP_HARDWAREID,   
				&dwType,   
				(LPBYTE)pstrHardwareID,   
				nSize,   
				&dwSize))   
			{   
				return   FALSE;   
			}   
		}   
		else   
		{   
			return   FALSE;   
		}   
	}   
	else   
	{   
		return   FALSE;   
	}   

	return   TRUE;   
}
2011-6-11 12:05
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
求inf文件怎么编写详细资料。。。
2011-6-11 15:54
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
inf的编写在ddk的帮助文档里面有详细的介绍
2011-6-13 09:47
0
雪    币: 18
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
继续等 执行成功的加载WDM驱动代码
2011-6-13 12:05
0
雪    币: 321
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
参考一下wdk中的devcon代码吧。
2011-6-13 14:26
0
游客
登录 | 注册 方可回帖
返回
//