win7下如何加载wdm驱动

「已注销」 2012-07-18 08:20:35
小弟正在学习驱动开发,操作系统是win7 x86。用wdk编译好生成sys文件后,右键Inf文件安装,桌面图标被刷新了一遍貌似是装上了,但是设备管理器中没有相应的虚拟设备,用winobj查看driver也没有我写的驱动。《windows驱动开发技术详解》是针对于xp的,上面是手动安装虚拟设备驱动。但是在win7下点击添加新设备系统就一直在查找,无法进行下一步。
请问在win7下如何加载wdm驱动,并且加载成功后让虚拟设备出现在设备管理其中。
小弟先谢过了~
...全文
622 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
没有试过 只是在xp下用过 针对win7 有专门的驱动模型啊 干嘛还用wdm呢
taianmonkey 2012-07-24
  • 打赏
  • 举报
回复
#include "StdAfx.h"
#include "InstDrv.h"

CInstDrv::CInstDrv(void)
{
}

CInstDrv::~CInstDrv(void)
{
}
//////////////////////////////////////////////////////////////////////////
//
//功能:
//
//参数:
// [IN] --
// [OUT] --
//
//
//返回值:
//
//
//说明:N/A
//
//版权:
//
//////////////////////////////////////////////////////////////////////////
HRESULT CInstDrv::Start( IN LPCTSTR lpDrvName , IN LPCTSTR lpDrvPath )
{
HRESULT hr = E_NOTIMPL;
SC_HANDLE schSCManager = NULL , schService = NULL;
BOOL bRet = FALSE;
if ( lpDrvName == NULL || lpDrvPath == NULL ) return hr;


schSCManager = OpenSCManager( NULL, // machine (NULL == local)
NULL, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);

if(schSCManager == NULL)
{
g_ErrHandle.ErrExit( _T("OpenSCManager") );
return E_FAIL;
}

schService = OpenService( schSCManager,
lpDrvName,
SERVICE_ALL_ACCESS
);

if ( schService == NULL )
{
g_ErrHandle.ErrExit( _T("OpenService") );
hr = E_FAIL;
goto _FExit;
}

bRet = StartService( schService, 0, NULL ) || GetLastError() == ERROR_SERVICE_ALREADY_RUNNING || GetLastError() == ERROR_SERVICE_DISABLED;

if(!bRet)
{
g_ErrHandle.ErrExit( _T("StartService") );
hr = E_FAIL;
goto _FExit;
}
else
hr = S_OK;

_FExit:

if ( schSCManager!= NULL )
{
CloseServiceHandle(schSCManager);
schSCManager = NULL;
}

if ( schService != NULL )
{
CloseServiceHandle( schService );
schService = NULL;
}

return hr;
}
//////////////////////////////////////////////////////////////////////////
//
//功能:
//
//参数:
// [IN] --
// [OUT] --
//
//
//返回值:
//
//
//说明:N/A
//
//版权:
//
//////////////////////////////////////////////////////////////////////////
HRESULT CInstDrv::Stop( IN LPCTSTR lpDrvName , IN LPCTSTR lpDrvPath )
{
HRESULT hr = E_NOTIMPL;
SC_HANDLE schSCManager = NULL , schService = NULL;
SERVICE_STATUS serviceStatus;
BOOL bRet = FALSE;
if ( lpDrvName == NULL || lpDrvPath == NULL ) return hr;

schSCManager = OpenSCManager( NULL, // machine (NULL == local)
NULL, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);
if(schSCManager == NULL)
{
MessageBox( NULL , _T("打开服务管理器失败!"), _T("Error") , MB_OK );
return E_FAIL;
}

schService = OpenService( schSCManager,
lpDrvName,
SERVICE_ALL_ACCESS
);

if ( schService == NULL )
{
MessageBox( NULL , _T("打开服务失败!") , _T("Error") , MB_OK );
goto _FExit;
}

bRet = ControlService( schService, SERVICE_CONTROL_STOP, &serviceStatus );

if(!bRet)
{
MessageBox( NULL , _T("停止服务失败!") , _T("Error") , MB_OK );
hr = E_FAIL;
goto _FExit;
}
else
hr = S_OK;

_FExit:

if ( schSCManager!= NULL )
{
CloseServiceHandle(schSCManager);
schSCManager = NULL;
}

if ( schService != NULL )
{
CloseServiceHandle( schService );
schService = NULL;
}

return hr;
}
//////////////////////////////////////////////////////////////////////////
//
//功能:
//
//参数:
// [IN] --
// [OUT] --
//
//
//返回值:
//
//
//说明:N/A
//
//版权:
//
//////////////////////////////////////////////////////////////////////////
HRESULT CInstDrv::InstallDrv( IN LPCTSTR lpDrvName , IN LPCTSTR lpDrvPath )
{
HRESULT hr = E_NOTIMPL;
SC_HANDLE schSCManager = NULL , schService = NULL;
if ( lpDrvName == NULL || lpDrvPath == NULL ) return hr;

schSCManager = OpenSCManager( NULL, // machine (NULL == local)
NULL, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);

if(schSCManager == NULL)
{
MessageBox( NULL , _T("打开服务管理器失败!") , _T("Error") , MB_OK );
return E_FAIL;
}

schService = CreateService( schSCManager, // SCManager database
lpDrvName, // name of service
lpDrvName, // name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_KERNEL_DRIVER, // service type
SERVICE_DEMAND_START, // start type
SERVICE_ERROR_NORMAL, // error control type
lpDrvPath, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL // no password
);

if ( schService == NULL )
{
if ( GetLastError() == ERROR_SERVICE_EXISTS )
hr = S_OK;
else
hr = E_FAIL;
goto _FExit;
}
else
hr = S_OK;

_FExit:

if ( schSCManager!= NULL )
{
CloseServiceHandle(schSCManager);
schSCManager = NULL;
}

if ( schService != NULL )
{
CloseServiceHandle( schService );
schService = NULL;
}

return hr;
}
//////////////////////////////////////////////////////////////////////////
//
//功能:
//
//参数:
// [IN] --
// [OUT] --
//
//
//返回值:
//
//
//说明:N/A
//
//版权:
//
//////////////////////////////////////////////////////////////////////////
HRESULT CInstDrv::UnInstall( IN LPCTSTR lpDrvName , IN LPCTSTR lpDrvPath )
{
HRESULT hr = E_NOTIMPL;
SC_HANDLE schSCManager = NULL , schService = NULL;
if ( lpDrvName == NULL || lpDrvPath == NULL ) return hr;

schSCManager = OpenSCManager( NULL, // machine (NULL == local)
NULL, // database (NULL == default)
SC_MANAGER_ALL_ACCESS // access required
);
if(schSCManager == NULL)
{
MessageBox( NULL , _T("打开服务管理器失败!") , _T("Error") , MB_OK );
return E_FAIL;
}

schService = OpenService( schSCManager,
lpDrvName,
SERVICE_ALL_ACCESS
);

if ( schService == NULL )
{
MessageBox( NULL , _T("删除服务失败!") , _T("Error") , MB_OK );
hr = E_FAIL;
goto _FExit;
}

if(!DeleteService( schService ))
{
MessageBox( NULL , _T("删除服务失败!") , _T("Error") , MB_OK );
hr = E_FAIL;
goto _FExit;
}
else
hr = S_OK;

_FExit:

if ( schSCManager!= NULL )
{
CloseServiceHandle(schSCManager);
schSCManager = NULL;
}

if ( schService != NULL )
{
CloseServiceHandle( schService );
schService = NULL;
}

return S_OK;
}
taianmonkey 2012-07-24
  • 打赏
  • 举报
回复
没什么太大的区别,都是CreateService等的函数去处理
chengjian2006 2012-07-24
  • 打赏
  • 举报
回复
用devcon工具安装也可以。
chengjian2006 2012-07-24
  • 打赏
  • 举报
回复
wdm驱动安装确实需要在控制面板中添加新设备来安装。
可以在wdk的src\general\下找个例子的说明看看,很详细的。
只要WDM驱动写的没啥问题,肯定可以在win7下加载的。
「已注销」 2012-07-24
  • 打赏
  • 举报
回复
楼上代码的功能是什么呢,看不懂啊~
「已注销」 2012-07-23
  • 打赏
  • 举报
回复
我是觉得win7和xp有些地方有一定差异
「已注销」 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

设备管理器直接加载试试呢
[/Quote]
在xp下是可以的,但是在win7下,在控制面板中添加新硬件,然后系统就开始扫描,然后就扫描个没完了,不能出现像xp下那样自己选择添加硬件的……
woshi_ziyu 2012-07-20
  • 打赏
  • 举报
回复
色郎中 2012-07-20
  • 打赏
  • 举报
回复
如果和XP 一样

不就是 用INF文件嘛

色郎中 2012-07-19
  • 打赏
  • 举报
回复
WIN7 下没试过

是不是更高级了,WDF了呀?
jtujtujtu 2012-07-19
  • 打赏
  • 举报
回复
肯定可以,NT式都可以加载的哦
jtujtujtu 2012-07-19
  • 打赏
  • 举报
回复
设备管理器直接加载试试呢
「已注销」 2012-07-19
  • 打赏
  • 举报
回复
嗯,是可以用wdf,不过wdm也能用。哎,现在正纠结着呢。

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧