枚举NT services

原创 2001年05月21日 10:59:00

                                                枚举NT services
       闻怡洋·vchelp

  下面的文章提供了访问NT中所有Service的功能,每次列举Services时,函数会返回一个列表。 列表的内容依赖于你所使用的参数。 (我认为这是一种很巧妙的编程方法,它极大的减轻了数据和函数的冗余,利用一个STATIC函数来产生本身对象的列表或者是来产生对象)

  Class declaration:声明

  class TTrixServiceInfo {

  public:

   CString ServiceName;

   CString DisplayName;

   CString BinaryPath;

   DWORD ServiceType;

   DWORD StartType;

   DWORD ErrorControl;

   DWORD CurrentState;

  public:

   TTrixServiceInfo();

   TTrixServiceInfo& operator=(const TTrixServiceInfo& source);

   CString GetServiceType(void);

   CString GetStartType(void);

   CString GetErrorControl(void);

   CString GetCurrentState(void);

   static TTrixServiceInfo *EnumServices(DWORD serviceType,

   DWORD serviceState,DWORD *count);

  };

Description:类的每一个实例都包含了SERVICE的各种信息,如果想得到SERVICE的列表,请调用TTrixServiceInfo::EnumServices(...)。

参数ServiceType的取值可能是:SERVICE_WIN32 and SERVICE_DRIVER.

参数ServiceState的取值可能是:SERVICE_ACTIVE and SERVICE_INACTIVE.

EnumServices(...)将返回TTrixServiceInfo对象的列表,(如果出错返回NULL)。列表中对象的个数可以通过参数返回时得到。
下面是具体的代码:

  TTrixServiceInfo *lpservice = NULL;

  DWORD count;

  lpservice =           TTrixServiceInfo::EnumServices(SERVICE_WIN32,SERVICE_ACTIVE|SERVICE_INACTIVE,&count/*得到个数*/);

  if (lpservice) {//如果正确

    for (DWORD index = 0; index < count; index ++) {

     printf("%d. %s, %s/n", index, lpservice[index].DisplayName,

     lpservice[index].GetCurrentState());

     }

    delete [] lpservice;

   }

  Source code:

  TTrixServiceInfo::TTrixServiceInfo()

  {

   ServiceName.Empty();

   DisplayName.Empty();

   BinaryPath.Empty();

   ServiceType = 0;

   StartType = 0;

   ErrorControl = 0;

   CurrentState = 0;

  }

  TTrixServiceInfo& TTrixServiceInfo::operator=(const TTrixServiceInfo& source)

  {

   ServiceName = source.ServiceName;

   DisplayName = source.DisplayName;

   BinaryPath = source.BinaryPath;

   ServiceType = source.ServiceType;

   StartType = source.StartType;

   ErrorControl = source.ErrorControl;

   CurrentState = source.CurrentState;

   return *this;

  }

  CString TTrixServiceInfo::GetServiceType(void)

  {

   // Winnt.h

   CString str = "UNKNOWN";

   if (ServiceType & SERVICE_WIN32) {

    if (ServiceType &

     SERVICE_WIN32_OWN_PROCESS)

     str = "WIN32_OWN_PROCESS";

    else if (ServiceType &

     SERVICE_WIN32_SHARE_PROCESS)

     str = "WIN32_SHARE_PROCESS";

    if (ServiceType &

      SERVICE_INTERACTIVE_PROCESS)

      str += "(INTERACTIVE_PROCESS)";

    }

     switch (ServiceType) {

      case SERVICE_KERNEL_DRIVER:

        str = "KERNEL_DRIVER"; break;

      case SERVICE_FILE_SYSTEM_DRIVER:

        str = "FILE_SYSTEM_DRIVER";

        break;

      };

    return str;

   }

  CString TTrixServiceInfo::GetStartType(void)

  {

   // Winnt.h

   TCHAR *types[] = {

   "BOOT_START", // 0

   "SYSTEM_START", // 1

   "AUTO_START", // 2

   "DEMAND_START", // 3

   "DISABLED" // 4

  };

  return CString(types[StartType]);

  }

  CString TTrixServiceInfo::GetErrorControl(void)

  {

   // Winnt.h

   TCHAR *types[] = {

   "ERROR_IGNORE", // 0

   "ERROR_NORMAL", // 1

   "ERROR_SEVERE", // 2

   "ERROR_CRITICAL" // 3

   };

  return CString(types[ErrorControl]);

  }

  CString TTrixServiceInfo::GetCurrentState(void)

  {

   // Winsvc.h

   TCHAR *types[] = {

   "UNKNOWN",

   "STOPPED", // 1

   "START_PENDING", // 2

   "STOP_PENDING", // 3

   "RUNNING", // 4

   "CONTINUE_PENDING", // 5

   "PAUSE_PENDING", // 6

   "PAUSED" // 7

   };

   return CString(types[CurrentState]);

  }

  // ServiceType = bit OR of SERVICE_WIN32, SERVICE_DRIVER

  // ServiceState = bit OR of SERVICE_ACTIVE, SERVICE_INACTIVE

  TTrixServiceInfo *TTrixServiceInfo::EnumServices(DWORD serviceType,DWORD

  serviceState,DWORD *count)

  {

   // Maybe check if serviceType and serviceState have at least one constant specified

   *count = 0;

   TTrixServiceInfo *info = NULL;

   SC_HANDLE scman = ::OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);

   if (scman) {

    ENUM_SERVICE_STATUS service, *lpservice;

    BOOL rc;

    DWORD bytesNeeded,servicesReturned,resumeHandle = 0;

    rc = ::EnumServicesStatus(scman,serviceType,serviceState,&service,sizeof(service),

       &bytesNeeded,&servicesReturned,&resumeHandle);

    if ((rc == FALSE) && (::GetLastError() == ERROR_MORE_DATA)) {

     DWORD bytes = bytesNeeded + sizeof(ENUM_SERVICE_STATUS);

     lpservice = new ENUM_SERVICE_STATUS [bytes];

          ::EnumServicesStatus(scman,serviceType,serviceState,lpservice,bytes,

          &bytesNeeded,&servicesReturned,&resumeHandle);

     *count = servicesReturned; // Not a chance that 0 services is returned

     info = new TTrixServiceInfo [servicesReturned];

  TCHAR Buffer[1024];

  // Should be enough for service info

  QUERY_SERVICE_CONFIG *lpqch = (QUERY_SERVICE_CONFIG*)Buffer;

  for (DWORD ndx = 0; ndx < servicesReturned; ndx++) {

    info[ndx].ServiceName = lpservice[ndx].lpServiceName;

    info[ndx].DisplayName = lpservice[ndx].lpDisplayName;

    info[ndx].ServiceType = lpservice[ndx].ServiceStatus.dwServiceType;

    info[ndx].CurrentState = lpservice[ndx].ServiceStatus.dwCurrentState;

    SC_HANDLE sh = ::OpenService(scman,lpservice[ndx].lpServiceName,SERVICE_QUERY_CONFIG);

    if (::QueryServiceConfig(sh,lpqch,sizeof(Buffer),&bytesNeeded)) {

     info[ndx].BinaryPath = lpqch->lpBinaryPathName;

     info[ndx].StartType = lpqch->dwStartType;

     info[ndx].ErrorControl = lpqch->dwErrorControl;

    }

    ::CloseServiceHandle(sh);

   }

   delete [] lpservice;

   }

   ::CloseServiceHandle(scman);

   }

   return info;

  }

 

windows NT的意义和各个版本

navigator.userAgent中的window NT 今天为了尝试查看网址的来源document.referrer,但是不知道每个浏览器的版本号,然后我就用navigator.userAge...
  • flyingpig2016
  • flyingpig2016
  • 2016年11月22日 10:23
  • 642

内核解惑:zw函数和nt函数的区别

转载自:http://hi.baidu.com/resoft007/item/eb510a0d0ae2ac03addc7019 http://bbs.pediy.com/showthread.php?...
  • u012410612
  • u012410612
  • 2013年12月03日 15:42
  • 1523

NT式驱动和WDM式驱动程序

1.Windows驱动程序分为两类,一类是不支持即插即用功能的NT式的驱动程序;另一类是支持即插即用功能的WDM式的驱动程序。   2.NT式的驱动程序要导入的头文件时NTDDK.H,而WDM式的...
  • whatday
  • whatday
  • 2015年03月28日 15:27
  • 2735

NT Service 编程 操作 NT 服务

操作 NT 服务: OpenSCManager   打开目标计算机上的“服务控制管理器”-SCM,返回指向该管理器的指针。 OpenService     打开服务,返回指向该服务的指针。 St...
  • thanklife
  • thanklife
  • 2017年04月07日 16:29
  • 192

我的计算机问题解决之:NT Kernel & System 进程CPU占用过高(开机便保持在50%)

最近电脑突然出现顿卡顿卡的现象,查看进程管理,发现有一个System的进程一直占用CPU 50%,并且开机便如此。 针对这个问题我在网上查了很多资料,大部分都说系统该清理啦或...
  • yulingha
  • yulingha
  • 2013年03月11日 22:24
  • 32988

NT路径和DOS路径相互转换

#include #include #include #include #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) #...
  • qq125096885
  • qq125096885
  • 2017年04月25日 19:34
  • 728

Windows Services(NT)服务学习!基础篇完整篇!

本文主要记录什么是Windows Service,及其主要组成?并通过一个列子来创建一个Windows Services,同时,记录几个在查资料碰到的问题。          Windows...
  • zhenglianghui163
  • zhenglianghui163
  • 2018年01月09日 16:09
  • 2

NT式驱动安装卸载

TestDDK125096.sys #include void TestDDK125096Unload(IN PDRIVER_OBJECT DriverObject) { DbgPrint("...
  • qq125096885
  • qq125096885
  • 2015年05月20日 23:19
  • 469

Windows Services(NT)服务学习!基础篇完整篇!

本文主要记录什么是Windows Service,及其主要组成?并通过一个列子来创建一个Windows Services,同时,记录几个在查资料碰到的问题。          Windows Ser...
  • zlhxiaohui
  • zlhxiaohui
  • 2013年06月13日 18:17
  • 871

mysql5.1绿色版安装教程以及mysql相关命令(解决mysqld-nt不成功)

看了网上好多mysql5.1绿色版的安装教程都不成功,最后才发现网上的教程都有一个问题,版本太低了,在mysql5.1中已经没有mysqld-nt.exe 这个文件了,而大多数教程还在使用mysql-...
  • acmjk
  • acmjk
  • 2013年08月15日 17:11
  • 2307
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:枚举NT services
举报原因:
原因补充:

(最多只允许输入30个字)