SCM 管理器加载驱动。 小测试程序。

1.

SCM管理简介          下面的函数都是Windows API  函数

A service object represents an installed service. The CreateService and OpenService functions return handles to installed services

The OpenSCManager, CreateService, and OpenService functions can request different types of access to SCManager and service objects. The requested access is granted or denied depending on the access token of the calling process and the security descriptor associated with the SCManager or service object.

The CloseServiceHandle function closes handles to SCManager and service objects. When you no longer need these handles, be sure to close them.

在SCM    NT式驱动是当作服务加载的。

 

SC_HANDLE WINAPI OpenSCManager    //打开服务管理器 若成功返回其句柄 若失败返回NULL
(

  __in_opt  LPCTSTR lpMachineName,     //机器名字    一般是 NULL  表示本机            
  __in_opt  LPCTSTR lpDatabaseName,   //服务控制管理数据库名字 一般是NULL 表示默认的数据库
  __in         DWORD dwDesiredAccess     //设置使用权限 一般用SC_MANAGER_ALL_ACCESS所有权限。
);

BOOL WINAPI CloseServiceHandle         //关闭服务控制管理器对象 或者 关闭服务对象 若成功返回非零  失败返回 零

(                                                             
  __in  SC_HANDLE hSCObject               // OpenSCManager  、OpenService 、 CreateService   创建的句柄
);

SC_HANDLE WINAPI OpenService(        //打开一个存在的服务   若成功返回句柄   若失败返回NULL
  __in  SC_HANDLE hSCManager,          //OpenSCManager所打开的管理器句柄
  __in  LPCTSTR lpServiceName,            //想要打开服务的名字 是被CreateService创建的lpServiceName 而不是用户层暴露的服务名
  __in  DWORD dwDesiredAccess          //打开权限 一般用SC_MANAGER_ALL_ACCESS  所有权限
);

SC_HANDLE WINAPI CreateService(     //创建一个服务对象并把它加载到指定的服务管理器中
  __in       SC_HANDLE hSCManager,    //指定的服务管理器的句柄     OpenSCManager 返回的句柄
  __in       LPCTSTR lpServiceName,      //要创建的 服务名 
  __in_opt   LPCTSTR lpDisplayName,   //显示给用户的服务名。
  __in       DWORD dwDesiredAccess,   //打开权限
  __in       DWORD dwServiceType,      //服务类型 一般用SERVICE_KERNEL_DRIVER 表示驱动服务
  __in       DWORD dwStartType,          //打开服务的时间 一般用SERVICE_DEMAND_START表示按需要启动
  __in       DWORD dwErrorControl,      //加载服务出现错误的处理 SERVICE_ERROR_IGNORE 表示忽略错误
  __in_opt   LPCTSTR lpBinaryPathName,    //驱动文件的完整路径
  __in_opt   LPCTSTR lpLoadOrderGroup,    //要加载的驱动属于那个组  一般为NULL   表示该驱动不属于任何组
  __out_opt  LPDWORD lpdwTagId,            // 上面是NULL 这个一般也为NULL  lpdwTagId A 指向接收 lpLoadOrderGroup 参数中指定的组中唯一的标记值的变量    没搞明白啥意思    具体请看
  __in_opt   LPCTSTR lpDependencies,      //依赖服务   一般也是NULL
  __in_opt   LPCTSTR lpServiceStartName,//服务运行的帐号名  NULL 用本地帐户  LocalSystem 
  __in_opt   LPCTSTR lpPassword             // 上面指定帐号名的密码    上面是NULL 这里也是NULL 就行
);

BOOL WINAPI StartService(                      //启动一个服务
  __in      SC_HANDLE hService,                //服务的句柄  被OpenService or CreateService 返回的
  __in      DWORD dwNumServiceArgs,      //下面是NULL 这个也是NULL
  __in_opt  LPCTSTR *lpServiceArgVectors//驱动一般设置NULL
);

BOOL WINAPI DeleteService(                    //删除指定的服务   成功非零   失败 零
  __in  SC_HANDLE hService                      //服务的句柄 被OpenService or CreateService 打开的
);

BOOL WINAPI ControlService(                    //控制服务 
  __in   SC_HANDLE hService,                      //服务的句柄 被OpenService or CreateService 打开的
  __in   DWORD dwControl,                       //控制方式        例如 SERVICE_CONTROL_CONTINUE 启动暂停服务

  __out  LPSERVICE_STATUS lpServiceStatus    //返回状态码
);


Control code

SERVICE_CONTROL_CONTINUE
SERVICE_CONTROL_INTERROGATE
SERVICE_CONTROL_PAUSE

SERVICE_CONTROL_STOP

2. ddk.sys  放在D盘根目录下,VC++6.0 mfc 测试代码如下   乱码的都是汉字。。。。 不看也没关系。仅仅是调试信息和注释 呵呵

 

BUTTON1 加载驱动  BUTTON2 卸载驱动

 

void CTestDDKDlg::OnButton1()
{
 SC_HANDLE CSMHandle;
 SC_HANDLE SerHandle;
 char DDK[200]="DDK";
 char path[200]="d:/ddk.sys";
 CSMHandle=OpenSCManager(NULL, NULL,SC_MANAGER_ALL_ACCESS);
 if(!CSMHandle)
 {
  MessageBox("¼ÓÔØ·þÎñ¿ØÖƹÜÀíÆ÷ʧ°Ü",NULL,MB_ICONEXCLAMATION);
  CloseServiceHandle(CSMHandle);
  return ;
 }
 SerHandle=OpenService(CSMHandle,DDK,//ÏëÒª´ò¿ª·þÎñµÄÃû×Ö ÊDZ»CreateService´´½¨µÄlpServiceName ¶ø²»ÊÇÓû§²ã±©Â¶µÄ·þÎñÃû
SC_MANAGER_ALL_ACCESS);
 if(!SerHandle)
 {
  if(ERROR_SERVICE_DOES_NOT_EXIST==GetLastError())
  {
   SerHandle=CreateService(     //´´½¨Ò»¸ö·þÎñ¶ÔÏó²¢°ÑËü¼ÓÔص½Ö¸¶¨µÄ·þÎñ¹ÜÀíÆ÷ÖÐ
       CSMHandle,    //Ö¸¶¨µÄ·þÎñ¹ÜÀíÆ÷µÄ¾ä±ú     OpenSCManager ·µ»ØµÄ¾ä±ú
      DDK,      //Òª´´½¨µÄ ·þÎñÃû 
      DDK,   //ÏÔʾ¸øÓû§µÄ·þÎñÃû¡£
      SC_MANAGER_ALL_ACCESS,   //´ò¿ªÈ¨ÏÞ
      SERVICE_KERNEL_DRIVER,      //·þÎñÀàÐÍ Ò»°ãÓÃSERVICE_KERNEL_DRIVER ±íʾÇý¶¯·þÎñ
      SERVICE_DEMAND_START,          //´ò¿ª·þÎñµÄʱ¼ä Ò»°ãÓÃSERVICE_DEMAND_START±íʾ°´ÐèÒªÆô¶¯
      SERVICE_ERROR_IGNORE,      //¼ÓÔØ·þÎñ³öÏÖ´íÎóµÄ´¦Àí SERVICE_ERROR_IGNORE ±íʾºöÂÔ´íÎó
      path,    //Çý¶¯ÎļþµÄÍêÕû·¾¶
      NULL,    //Òª¼ÓÔصÄÇý¶¯ÊôÓÚÄǸö×é  Ò»°ãΪNULL   ±íʾ¸ÃÇý¶¯²»ÊôÓÚÈκÎ×é
      NULL,            // ÉÏÃæÊÇNULL Õâ¸öÒ»°ãҲΪNULL  lpdwTagId A Ö¸Ïò½ÓÊÕ lpLoadOrderGroup ²ÎÊýÖÐÖ¸¶¨µÄ×éÖÐΨһµÄ±ê¼ÇÖµµÄ±äÁ¿    û¸ãÃ÷°×ɶÒâ˼    ¾ßÌåÇë¿´
      NULL,      //ÒÀÀµ·þÎñ   Ò»°ãÒ²ÊÇNULL
      NULL,//·þÎñÔËÐеÄÕʺÅÃû  NULL Óñ¾µØÕÊ»§  LocalSystem
      NULL           // ÉÏÃæÖ¸¶¨ÕʺÅÃûµÄÃÜÂë    ÉÏÃæÊÇNULL ÕâÀïÒ²ÊÇNULL ¾ÍÐÐ
            );
   if(!SerHandle)
   {
    MessageBox("´´½¨·þÎñʧ°Ü",NULL,MB_ICONEXCLAMATION);
    CloseServiceHandle(CSMHandle);
        return ;
   }
   else
   {
    MessageBox("´´½¨·þÎñ³É¹¦",NULL,MB_ICONEXCLAMATION);
   }
  }
  else
  {
   MessageBox("´ò¿ª·þÎñʧ°Ü",NULL,MB_ICONEXCLAMATION);
   CloseServiceHandle(CSMHandle);
   return ;
  }

 }
 else
 {
  MessageBox("´ò¿ª·þÎñ³É¹¦",NULL,MB_ICONEXCLAMATION);
 }
 if(StartService(
  SerHandle,                //·þÎñµÄ¾ä±ú  ±»OpenService or CreateService ·µ»ØµÄ
  NULL,      //ÏÂÃæÊÇNULL Õâ¸öÒ²ÊÇNULL
  NULL//Çý¶¯Ò»°ãÉèÖÃNULL
  ))
 {
  MessageBox("Çý¶¯Æô¶¯³É¹¦",NULL,MB_ICONEXCLAMATION);
 }
 else
 {
  MessageBox("Çý¶¯Æô¶¯Ê§°Ü",NULL,MB_ICONEXCLAMATION);
 }


 CloseServiceHandle(SerHandle);
 CloseServiceHandle(CSMHandle);
}

void CTestDDKDlg::OnButton2()
{
 SC_HANDLE CSMHandle;
 SC_HANDLE SerHandle;
 char DDK[200]="DDK";
 SERVICE_STATUS key;
 CSMHandle=OpenSCManager(NULL, NULL,SC_MANAGER_ALL_ACCESS);
 if(!CSMHandle)
 {
  MessageBox("¼ÓÔØ·þÎñ¿ØÖƹÜÀíÆ÷ʧ°Ü",NULL,MB_ICONEXCLAMATION);
  CloseServiceHandle(CSMHandle);
  return ;
 }
 SerHandle=OpenService(CSMHandle,DDK,//ÏëÒª´ò¿ª·þÎñµÄÃû×Ö ÊDZ»CreateService´´½¨µÄlpServiceName ¶ø²»ÊÇÓû§²ã±©Â¶µÄ·þÎñÃû
SC_MANAGER_ALL_ACCESS);
 if(!SerHandle)
 {
  MessageBox("´ò¿ª·þÎñʧ°Ü",NULL,MB_ICONEXCLAMATION);
  MessageBox("жÔØÇý¶¯Ê§°Ü",NULL,MB_ICONEXCLAMATION);
  CloseServiceHandle(CSMHandle);
  return ;
 }
 else
 {
  MessageBox("´ò¿ª·þÎñ³É¹¦",NULL,MB_ICONEXCLAMATION);
 }
 if(ControlService(
   SerHandle,                      //·þÎñµÄ¾ä±ú ±»OpenService or CreateService ´ò¿ªµÄ
   SERVICE_CONTROL_STOP,                       //¿ØÖÆ·½Ê½        ÀýÈç SERVICE_CONTROL_CONTINUE Æô¶¯ÔÝÍ£·þÎñ
   &key//·µ»Ø״̬Âë
         ))
 {
  MessageBox("·þÎñÍ£Ö¹³É¹¦",NULL,MB_ICONEXCLAMATION);
 }
 else
 {
  MessageBox("·þÎñֹͣʧ°Ü",NULL,MB_ICONEXCLAMATION);
  return ;
 }

 if(DeleteService(SerHandle))
 {
  MessageBox("жÔØÇý¶¯³É¹¦",NULL,MB_ICONEXCLAMATION);
 }
 else
 {
  MessageBox("жÔØÇý¶¯Ê§°Ü",NULL,MB_ICONEXCLAMATION);

 }
 CloseServiceHandle(SerHandle);
 CloseServiceHandle(CSMHandle);  
}

 

参考《Windows 驱动开放技术详解》和 MSDN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值