首页
社区
课程
招聘
[求助]看在看雪的份上,拉兄弟一把吧
发表于: 2010-11-4 19:07 3587

[求助]看在看雪的份上,拉兄弟一把吧

2010-11-4 19:07
3587
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    DWORD ServicesCount = 0;
  DWORD size = 0;
  SC_HANDLE hHandle = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
  if(hHandle == NULL)
    return 1;
  if(!EnumServicesStatus(hHandle,SERVICE_WIN32,SERVICE_STATE_ALL,NULL,0,&size,&ServicesCount,NULL))
  {
    printf("%d\n",size);
    printf("%d\n",ServicesCount);
    if(GetLastError() == ERROR_MORE_DATA)
    {
       LPENUM_SERVICE_STATUS lpinfo;
     lpinfo = new ENUM_SERVICE_STATUS[size];
//加颜色的这句话为什么要申请size个ENUM_SERVICE_STATUS而不是申请ServiceCount个ENUM_SERVICE_STATUS,在msdn上一再发帖,但是不知道是我语焉不详还是其他原因,总得不到正确的解释,看雪大牛多,给我小菜指点一下呀!
     if(EnumServicesStatus(hHandle,SERVICE_WIN32,SERVICE_STATE_ALL,(LPENUM_SERVICE_STATUS)lpinfo,size,&size,&ServicesCount,NULL))
     {
       printf("0x%x\n",lpinfo);
       MEMORY_BASIC_INFORMATION mbi;
       VirtualQuery(lpinfo,&mbi,sizeof(mbi));//这是自己添加的测试的代码
       printf("%d\n",mbi.RegionSize);
       for(int i=0;i<(int)ServicesCount;i++)
       {
         printf("%-50s\n",lpinfo[i].lpDisplayName);
         //printf("%d\n",i);
         
       }
       getchar();
     }
     delete lpinfo;
    }
  }
  
  return 0;
}
出现的问题是红色代码部分,ENUM_SERVICE_STATUS的个数到底是多少?
还有我测试过,假如申请ServiceCount个ENUM_SERVICE_STATUS,编译器会死掉。代码可以编译,但是现在不能让我理解呀。还望不吝指教

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 1534
活跃值: (738)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
2
第一次调用EnumServicesStatus是确定服务是数量,百分之百的会出错这个错误是故意的,第二次使用EnumServicesStatus的叁数才是返回PENUM_SERVICE_STATUS数组。
2010-11-4 19:24
0
雪    币: 668
活跃值: (2592)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
3
若有所悟,你的意思是只会返回所需空间的大小是吧。那个size申请会浪费很大的空间。我修正代码了。谢谢了
DWORD ServicesCount = 0;
        DWORD size = 0;
        SC_HANDLE hHandle = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
        if(hHandle == NULL)
                return 1;
        if(!EnumServicesStatus(hHandle,SERVICE_WIN32,SERVICE_STATE_ALL,NULL,0,&size,&ServicesCount,NULL))
        {
          printf("%d\n",size);
          printf("%d\n",ServicesCount);
          if(GetLastError() == ERROR_MORE_DATA)
          {
              LPENUM_SERVICE_STATUS lpinfo;
                 //lpinfo = new ENUM_SERVICE_STATUS[245];
                 
                 lpinfo = (LPENUM_SERVICE_STATUS)VirtualAlloc(NULL,size,MEM_COMMIT,PAGE_READWRITE);
                 if(EnumServicesStatus(hHandle,SERVICE_WIN32,SERVICE_STATE_ALL,(LPENUM_SERVICE_STATUS)lpinfo,size,&size,&ServicesCount,NULL))
                 {
                         /*printf("0x%x\n",lpinfo);
                         MEMORY_BASIC_INFORMATION mbi;
                         VirtualQuery(lpinfo,&mbi,sizeof(mbi));
                         printf("%d\n",mbi.RegionSize);*/
                         
                         for(int i=0;i<(int)ServicesCount;i++)
                         {
                                 printf("%-50s\n",(LPENUM_SERVICE_STATUS)lpinfo[i].lpDisplayName);
                                 //printf("%d\n",i);
                                 
                         }
                         getchar();
                 }
                // delete lpinfo;
                 VirtualFree(lpinfo,size,MEM_RELEASE);
          }
        }
2010-11-4 19:41
0
游客
登录 | 注册 方可回帖
返回
//