能力值:
( LV2,RANK:10 )
|
-
-
2 楼
NT驱动可以通过scmanage之类的加载,WDM呢~
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
这个还真不知道,同求大牛来指点
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
《windows驱动技术开发技术详解》这本书的第一章有很详细的解说
|
能力值:
( 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;
}
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
求inf文件怎么编写详细资料。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
inf的编写在ddk的帮助文档里面有详细的介绍
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
继续等 执行成功的加载WDM驱动代码
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
参考一下wdk中的devcon代码吧。
|