YJX_Driver_022_NT式驱动的安装

Posted DebugSkill

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YJX_Driver_022_NT式驱动的安装相关的知识,希望对你有一定的参考价值。

1、

NT式驱动的安装

      A、OpenSCManager

      B、CreateService

      C、OpenService

      D、StartService

      E、CloseServiceHandle

      F、集成到loadNTDriver函数

 

【320】#include <winsvc.h>

【435】MSDN中的 OpenSCManager

SC_HANDLE OpenSCManager
(
  LPCTSTR lpMachineName, // 指向计算机名称,此处为NULL表示指向本机
  LPCTSTR lpDatabaseName, // SCM数据库名称,此用为NULL表示使用默认
  DWORD dwDesiredAccess // 使用权限 一般设置为SC_MANAGER_ALL_ACCESS表示有所有使用权限
);

  【600】最后一个参数使用 SC_MANAGER_ALL_ACCESS。一般来说,用 SC_MANAGER_CREATE_SERVICE 也是可以的,但是用SC_MANAGER_ALL_ACCESS保险一点。

【650】打开 VC6.0,为何要以 VC6.0为例? ∵ 我们 VS2003 搭建的是驱动的开发环境

  【685】我提前做了一些设置,把 驱动开发的项 全部移动到后边了。关于 DDK的选项全部移动到后边了

  ZC: 两个 IDE 分别开发 exe和sys,仅仅是∵用一个IDE的话,环境切换起来比较麻烦吗?

  ZC: 那我也可以考虑,VS08+VC6.0 的组合。(前面(哪一课忘了)提到的 用vs03编译驱动比vc6好的地方,我到现在还是没有感觉到,他也还没有明确指明...)

  【855】删掉原有的控件,添加2个button(IDC_BUTTON_LOADSYS,载入驱动)(IDC_BUTTON_UNLOADSYS,卸载驱动)

void CLoadsysDlg::OnButtonLoadsys()
{
  CFileDialog sysFile(
    true, NULL, NULL,
    OFN_HIDEREDONLY,//0,
    "驱动文件*.sys|*.sys|所有文件*.*|*.*");
  if (IDOK == sysFile.DoModal())
  {
    m_syspathname = sysFIle.GetPathName(); // 文件全路径名
    m_syspathname = sysFIle.GetFileName(); // 文件名
    m_syspathname = sysFIle.GetFileTitle(); // 不带后缀名的文件名
    UpdateData(false);

    // LoadNtDriver;
  }
}

【1720】CFileDialog 多了奇怪的选项

  将 "驱动文件*.sys|*.sys|所有文件*.*|*.*" 改成 "驱动文件*.sys|*.sys|所有文件*.*|*.*|" 就行了,最后还是要以一个"|"结尾(ZC: 不然程序以为字符串还没有结束)

  【1885】MSDN中查看 CFileDialog.DoModal()

【2065】界面中添加1个 Edit(IDC_EDIT_SYSPATHNAME)

  【2160】关联一个变量 m_syspathname

 

 

2、

正常加载驱动的步骤如下:

 1、调用OpenSCManager,打开SCM管理器。如果返回NULL,则返回失败,否则继续下一步;

 2、调用CreateService创建服务,如果用GetLastError获取的返回值为ERROR_IO_PENDING,说明服务已经创建过,此时用OpenService打开此服务.

 3、调用StartService开启服务

 

 

 

 

BOOL CloseServiceHandle(

  

SC_HANDLE hSCObject   // 要关闭的SCM句柄 

 

 

 

 

 

 

 

 

//打开服务控制管理器

hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

 

//创建驱动所对应的服务

hServiceDDK = CreateService( hServiceMgr,//SCM管理器句柄 

lpszDriverName, //驱动程序的在注册表中的名字  

lpszDriverName, // 注册表驱动程序的 DisplayName 值  

SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限  

SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序  

SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值  

SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值  

szDriverImagePath, // 注册表驱动程序的 ImagePath 值  

NULL,              //要开启服务的 用户组

NULL,  //输出验证标签

NULL,   //所依赖的服务的名称

NULL,   //用户账户名称

NULL);  //用户口令

 

// 驱动程序已经加载,只需要打开  

hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );

   //开启此项服务

bRet= StartService( hServiceDDK, NULL, NULL ); 

 

 

 

//装载NT驱动程序

BOOL LoadNTDriver(char* lpDriverName,char* lpDriverPathName)

{

 BOOL bRet = FALSE;

 

SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄

SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄

 

//打开服务控制管理器

hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

 

if( hServiceMgr == NULL )  

{

//OpenSCManager失败

TRACE( "OpenSCManager() Faild %d ! \n", GetLastError() );

bRet = FALSE;

goto BExit;

}

else

{

////OpenSCManager成功

TRACE( "OpenSCManager() ok ! \n" );  

}

 

//创建驱动所对应的服务

hServiceDDK = CreateService( hServiceMgr,

lpDriverName, //驱动程序的在注册表中的名字  

lpDriverName, // 注册表驱动程序的 DisplayName 值  

SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限  

SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序  

SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值  

SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值  

lpDriverPathName, // 注册表驱动程序的 ImagePath 值  

NULL,  

NULL,  

NULL,  

NULL,  

NULL);  

 

DWORD dwRtn;

//判断服务是否失败

if( hServiceDDK == NULL )  

{  

dwRtn = GetLastError();

if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )  

{  

//由于其他原因创建服务失败

TRACE( "CrateService() 失败 %d ! \n", dwRtn );  

bRet = FALSE;

goto BExit;

}  

else  

{

//服务创建失败,是由于服务已经创立过

TRACE( "CrateService() 服务创建失败,是由于服务已经创立过 ERROR is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );  

}

 

// 驱动程序已经加载,只需要打开  

hServiceDDK = OpenService( hServiceMgr, lpDriverName, SERVICE_ALL_ACCESS );  

if( hServiceDDK == NULL )  

{

//如果打开服务也失败,则意味错误

dwRtn = GetLastError();  

TRACE( "OpenService() 失败 %d ! \n", dwRtn );  

bRet = FALSE;

goto BExit;

}  

else 

{

TRACE( "OpenService() 成功 ! \n" );

}

}  

else  

{

TRACE( "CrateService() 成功 ! \n" );

}

 

//开启此项服务

bRet= StartService( hServiceDDK, NULL, NULL );  

if( !bRet )  //开启服务不成功

{  

TRACE( "StartService() 失败 服务可能已经开启%d ! \n", dwRtn );  

}

bRet = TRUE;

//离开前关闭句柄

BExit:

if(hServiceDDK)

{

CloseServiceHandle(hServiceDDK);

}

if(hServiceMgr)

{

CloseServiceHandle(hServiceMgr);

}

return bRet;

}

//--------------------------------------------------------------------------

 

NT式驱动的安装-22

      AOpenSCManager

      BCreateService

      COpenService

      DStartService

      ECloseServiceHandle

      F、集成到loadNTDriver函数

 

#include <winsvc.h>

正常加载驱动的步骤如下:

 1、调用OpenSCManager,打开SCM管理器。如果返回NULL,则返回失败,否则继续下一步;

 2、调用CreateService创建服务,如果用GetLastError获取的返回值为ERROR_IO_PENDING,说明服务已经创建过,此时用OpenService打开此服务.

 3、调用StartService开启服务

 

SC_HANDLE OpenSCManager(

 LPCTSTR lpMachineName, // 指向计算机名称,此处为NULL表示指向本机
 

 LPCTSTR lpDatabaseName, // SCM数据库名称,此用为NULL表示使用默认

 DWORD dwDesiredAccess   // 使用权限 一般设置为SC_MANAGER_ALL_ACCESS表示有所有使用权限

);

 

BOOL CloseServiceHandle(
 

SC_HANDLE hSCObject   // 要关闭的SCM句柄

 

 

 

 

 

 

 

    //打开服务控制管理器

    hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

 

    //创建驱动所对应的服务

    hServiceDDK = CreateService( hServiceMgr,//SCM管理器句柄

        lpszDriverName, //驱动程序的在注册表中的名字 

        lpszDriverName, // 注册表驱动程序的 DisplayName  

        SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限 

        SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序 

        SERVICE_DEMAND_START, // 注册表驱动程序的 Start  

        SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl  

        szDriverImagePath, // 注册表驱动程序的 ImagePath  

        NULL,              //要开启服务的 用户组

        NULL,  //输出验证标签

        NULL,   //所依赖的服务的名称

        NULL,   //用户账户名称

        NULL);  //用户口令

 

    // 驱动程序已经加载,只需要打开 

        hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );

   //开启此项服务

    bRet= StartService( hServiceDDK, NULL, NULL );

 

 

 

//装载NT驱动程序

BOOL LoadNTDriver(char* lpDriverName,char* lpDriverPathName)

{

    BOOL bRet = FALSE;

 

    SC_HANDLE hServiceMgr=NULL;//SCM管理器的句柄

    SC_HANDLE hServiceDDK=NULL;//NT驱动程序的服务句柄

 

    //打开服务控制管理器

    hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );

 

    if( hServiceMgr == NULL ) 

    {

        //OpenSCManager失败

        TRACE( "OpenSCManager() Faild %d ! \n", GetLastError() );

        bRet = FALSE;

        goto BExit;

    }

    else

    {

        ////OpenSCManager成功

        TRACE( "OpenSCManager() ok ! \n" ); 

    }

 

    //创建驱动所对应的服务

    hServiceDDK = CreateService( hServiceMgr,

        lpDriverName, //驱动程序的在注册表中的名字 

        lpDriverName, // 注册表驱动程序的 DisplayName  

        SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限 

        SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序 

        SERVICE_DEMAND_START, // 注册表驱动程序的 Start  

        SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl  

        lpDriverPathName, // 注册表驱动程序的 ImagePath  

        NULL, 

        NULL, 

        NULL, 

        NULL, 

        NULL); 

 

    DWORD dwRtn;

    //判断服务是否失败

    if( hServiceDDK == NULL ) 

    { 

        dwRtn = GetLastError();

        if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS ) 

        { 

            //由于其他原因创建服务失败

            TRACE( "CrateService() 失败 %d ! \n", dwRtn ); 

            bRet = FALSE;

            goto BExit;

        } 

        else 

        {

            //服务创建失败,是由于服务已经创立过

            TRACE( "CrateService() 服务创建失败,是由于服务已经创立过 ERROR is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" ); 

        }

 

        // 驱动程序已经加载,只需要打开 

        hServiceDDK = OpenService( hServiceMgr, lpDriverName, SERVICE_ALL_ACCESS ); 

        if( hServiceDDK == NULL ) 

        {

            //如果打开服务也失败,则意味错误

            dwRtn = GetLastError(); 

            TRACE( "OpenService() 失败 %d ! \n", dwRtn ); 

            bRet = FALSE;

            goto BExit;

        } 

        else

        {

            TRACE( "OpenService() 成功 ! \n" );

        }

    } 

    else 

    {

        TRACE( "CrateService() 成功 ! \n" );

    }

 

    //开启此项服务

    bRet= StartService( hServiceDDK, NULL, NULL ); 

    if( !bRet )  //开启服务不成功

    { 

            TRACE( "StartService() 失败 服务可能已经开启%d ! \n", dwRtn ); 

    }

    bRet = TRUE;

//离开前关闭句柄

BExit:

    if(hServiceDDK)

    {

        CloseServiceHandle(hServiceDDK);

    }

    if(hServiceMgr)

    {

        CloseServiceHandle(hServiceMgr);

    }

    return bRet;

}

//--------------------------------------------------------------------------

 

 

以上是关于YJX_Driver_022_NT式驱动的安装的主要内容,如果未能解决你的问题,请参考以下文章

第一个不支持即插即用的NT式HelloWorld 驱动

基本NT式驱动代码结构

YJX_Driver_021_绕过驱动保护

YJX_Driver_014_VM+Wlndbg调试驱动

YJX_Driver_024_驱动代码中C和C++代码区别

YJX_Driver_016_为DDK_HelloWorld添加默认派遣例程