gagaxj
驱动牛犊
驱动牛犊
  • 注册日期2005-04-23
  • 最后登录2006-03-08
  • 粉丝0
  • 关注0
  • 积分43分
  • 威望8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1423回复:0

请教虚拟设备驱动安装程序的头文件问题

楼主#
更多 发布于:2005-06-27 19:23
  用如下代码做虚拟设备的安装程序需要哪些头文件?
我用的头文件中有
#include <windows.h>
#include <setupapi.h>
#include <stdio.h>
#include <newdev.h>
#include <regstr.h>
#include <initguid.h>
#include <devguid.h>
但是编译时报错:错误是
d:\ntddk\inc\windows.h(196) : fatal error C1083: Cannot open include file: 'winefs.h': No such file or directory
Error executing cl.exe.
请问是什么原因,各位大虾谢谢了:)
/**************************************************************
*
* 名称:InstallWDMDriver
* 功能:安装WDM驱动
* 参数:HardwareId: 字符串描述的完整的设备ID
* INFFile: Inf安装文件
* RebootRequired: 是否需要重启的标志
* 返回:成功返回TRUE,失败返回FALSE
*
****************************************************************/
//EXTERN_C BOOL WINAPI
extern "C" BOOL APIENTRY EXPORT
InstallWDMDriver(
LPCTSTR HardwareId,
LPCTSTR INFFile)
{
HDEVINFO DeviceInfoSet = INVALID_HANDLE_VALUE;
SP_DEVINFO_DATA DeviceInfoData;
GUID ClassGUID;
TCHAR ClassName[64];
BOOL reboot = FALSE;

//AFX_MANAGE_STATE(AfxGetStaticModuleState());

// 首先从Inf文件中得到设备类GUID
if (!SetupDiGetINFClass((LPTSTR)INFFile,&ClassGUID,ClassName,sizeof(ClassName),0))
{
printf( "Get INF Class GUID failed\n" );
return FALSE;
}

DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID,0);
if(DeviceInfoSet == INVALID_HANDLE_VALUE)
{
printf( "Create DeviceInfoSet failed\n" );
return FALSE;
}

// 打开该设备所属的类
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
if (!SetupDiCreateDeviceInfo(DeviceInfoSet,
ClassName,
&ClassGUID,
NULL,
0,
DICD_GENERATE_ID,
&DeviceInfoData))
{
printf( "CreateDeviceInfo failed\n" );
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
return FALSE;
}

// 添加该设备
if(!SetupDiSetDeviceRegistryProperty(DeviceInfoSet,
&DeviceInfoData,
SPDRP_HARDWAREID,
(LPBYTE)HardwareId,
(lstrlen(HardwareId)+1+1)*sizeof(TCHAR)))
{
printf( "Add DeviceRegistryProperty failed\n" );
//SetupDiDestroyDeviceInfoList(DeviceInfoSet);
//return FALSE;
}

// 建立关联
if (!SetupDiCallClassInstaller(DIF_REGISTERDEVICE,
DeviceInfoSet,
&DeviceInfoData))
{
printf( "CallClassInstaller(REGISTERDEVICE)\n" );
return FALSE;
}

// 关联信息都已建立,安装本驱动(以前相当于建立了一个未知的设备)
if (!UpdateDriverForPlugAndPlayDevices(0,
HardwareId,
INFFile,
INSTALLFLAG_FORCE,
&reboot))
{
// 安装失败,需要把以前的创建的信息删除,否则将会留下一个未知设备
DWORD err = GetLastError();
printf( "UpdateDriverForPlugAndPlayDevices failed\n" );
printf( "the errcode is 0x%x\n", err );

if (!SetupDiCallClassInstaller(
DIF_REMOVE,
DeviceInfoSet,
&DeviceInfoData))
{
printf( "CallClassInstaller(REMOVE) failed\n" );
}

}

SetupDiDestroyDeviceInfoList(DeviceInfoSet);

return TRUE;
}
游客

返回顶部