Создание драйверов. Часть 3. Просмотр состояния драйверов. В данном примере мне хотелось бы показать как с помощью интерфейса SCM(Service Control Manager) можно просмотреть состояние загруженных в системе драйверов. Для этой цели использовалась функция EnumServicesStatus, входящая в состав Advapi32.dll.
#include <iostream.h>
#include <windows.h>
#include <conio.h>
#define SIZE_BUF 4096
int main()
{
SC_HANDLE hSCM;
ENUM_SERVICE_STATUS Status[SIZE_BUF];
DWORD SizeBuf = sizeof(Status);
DWORD Needed = 0;
DWORD Return = 0;
DWORD Handle = 0;
hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if(hSCM != NULL)
{
if(EnumServicesStatus(hSCM,
SERVICE_DRIVER,SERVICE_STATE_ALL,
(LPENUM_SERVICE_STATUS)&Status,SizeBuf,
&Needed,&Return,&Handle))
{
for (unsigned long i=0;i<Return;i++)
{
CharToOem(Status[i].lpDisplayName,Status[i].lpDisplayName);
cout<<Status[i].lpServiceName;
cout<<" ("<<Status[i].lpDisplayName<<") ";
//??? ????????
if(Status[i].ServiceStatus.dwServiceType == SERVICE_FILE_SYSTEM_DRIVER)
{cout<<"file system driver";}
else
{if(Status[i].ServiceStatus.dwServiceType == SERVICE_KERNEL_DRIVER)
{cout<<"device driver";}
else
{if(Status[i].ServiceStatus.dwServiceType == SERVICE_WIN32_OWN_PROCESS)
{cout<<"runs in its own process";}
else
{if(Status[i].ServiceStatus.dwServiceType == SERVICE_WIN32_SHARE_PROCESS)
{cout<<"shares a process with other services";}
else
{if(Status[i].ServiceStatus.dwServiceType == SERVICE_INTERACTIVE_PROCESS)
{cout<<"can interact with the desktop";}
else{cout<<"Other service type";}}}}}
//?????? ????????
if(Status[i].ServiceStatus.dwCurrentState == SERVICE_CONTINUE_PENDING)
{cout<<" Continue is pending";}
else
{if(Status[i].ServiceStatus.dwCurrentState == SERVICE_PAUSE_PENDING)
{cout<<" Pause is pending";}
else
{if(Status[i].ServiceStatus.dwCurrentState == SERVICE_PAUSED)
{cout<<" Paused";}
else
{if(Status[i].ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{cout<<" Running";}
else
{if(Status[i].ServiceStatus.dwCurrentState == SERVICE_START_PENDING)
{cout<<" Starting";}
else
{if(Status[i].ServiceStatus.dwCurrentState == SERVICE_STOP_PENDING)
{cout<<" Stopping";}
else
{if(Status[i].ServiceStatus.dwCurrentState == SERVICE_STOPPED)
{cout<<" Not running";}
else{cout<<"Other service state";}}}}}}}
cout<<endl;
}
}else{cout<<"Error EnumServicesStatus"<<endl;}
}else{cout<<"Error OpenSCManager"<<endl;}
CloseServiceHandle(hSCM);
cout<<"\nPress any key to continue"<<endl;
while (!getch());
return 0;
}
