346 lines
8.9 KiB
C
346 lines
8.9 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1993 Microsoft Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
Servicep.c
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
This module contains support for creating and displaying lists of
|
|||
|
Services.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Scott B. Suhy (ScottSu) 6/1/93
|
|||
|
|
|||
|
Environment:
|
|||
|
|
|||
|
User Mode
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#include "dialogsp.h"
|
|||
|
#include "msgp.h"
|
|||
|
#include "svcp.h"
|
|||
|
#include "strtabp.h"
|
|||
|
#include "strrsidp.h"
|
|||
|
#include "winmsdp.h"
|
|||
|
#include "servicep.h"
|
|||
|
|
|||
|
#include "printp.h"
|
|||
|
|
|||
|
#include <stdio.h>
|
|||
|
#include <string.h>
|
|||
|
#include <tchar.h>
|
|||
|
|
|||
|
//
|
|||
|
// Structure used to pass information to DisplayServiceDlgProc. Specifically a
|
|||
|
// handle to a SVC object and a pointer to an ENUM_SERVICE_STATUS which contains
|
|||
|
// the status of the service to display.
|
|||
|
//
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
DisplayServiceProc(LPDISPLAY_SERVICE ServiceObject)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
DisplayServiceProc displays the details about the supplied
|
|||
|
service/device.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Standard PROC entry.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
BOOL - Depending on input message and processing options.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
BOOL Success;
|
|||
|
LPDISPLAY_SERVICE DisplayService;
|
|||
|
LPQUERY_SERVICE_CONFIG SvcConfig;
|
|||
|
LPTSTR Dependent;
|
|||
|
DWORD Count;
|
|||
|
TCHAR Buffer[ MAX_PATH ];
|
|||
|
|
|||
|
//
|
|||
|
// Retrieve and validate the DISPLAY_SERVICE object.
|
|||
|
//
|
|||
|
|
|||
|
DisplayService= ( LPDISPLAY_SERVICE ) ServiceObject;
|
|||
|
DbgPointerAssert( DisplayService );
|
|||
|
DbgAssert( CheckSignature( DisplayService ));
|
|||
|
if( ( DisplayService == NULL )
|
|||
|
|| ( ! CheckSignature( DisplayService ))) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Display the name and state of the service/device, separated by a
|
|||
|
// colon, as the window title.
|
|||
|
//
|
|||
|
|
|||
|
PrintToFile((LPCTSTR)DisplayService->Ess->lpDisplayName,IDC_SERVICE_TITLE,TRUE);
|
|||
|
PrintDwordToFile(DisplayService->Ess->ServiceStatus.dwCurrentState,IDC_CURRENT_STATE);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Create a configuration status for this device/service.
|
|||
|
//
|
|||
|
|
|||
|
SvcConfig = ConstructSvcConfig(
|
|||
|
DisplayService->hSvc,
|
|||
|
DisplayService->Ess
|
|||
|
);
|
|||
|
DbgPointerAssert( SvcConfig );
|
|||
|
if( SvcConfig == NULL ) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// Display the service/device's type, start type, error control,
|
|||
|
// and start name.
|
|||
|
//
|
|||
|
//defined in D:\NT\PUBLIC\SDK\INC\winsvc.h
|
|||
|
//typedef struct _QUERY_SERVICE_CONFIGA {
|
|||
|
//DWORD dwServiceType;
|
|||
|
//DWORD dwStartType;
|
|||
|
//DWORD dwErrorControl;
|
|||
|
//LPSTR lpBinaryPathName;
|
|||
|
//LPSTR lpLoadOrderGroup;
|
|||
|
//DWORD dwTagId;
|
|||
|
//LPSTR lpDependencies;
|
|||
|
//LPSTR lpServiceStartName;
|
|||
|
//LPSTR lpDisplayName;
|
|||
|
//} QUERY_SERVICE_CONFIGA, *LPQUERY_SERVICE_CONFIGA;
|
|||
|
|
|||
|
|
|||
|
PrintDwordToFile((DWORD)
|
|||
|
SvcConfig->dwServiceType
|
|||
|
,IDC_EDIT_SERVICE_TYPE);
|
|||
|
|
|||
|
|
|||
|
PrintDwordToFile((DWORD)
|
|||
|
SvcConfig->dwStartType
|
|||
|
,IDC_EDIT_START_TYPE);
|
|||
|
|
|||
|
|
|||
|
PrintDwordToFile((DWORD)
|
|||
|
SvcConfig->dwErrorControl
|
|||
|
,IDC_EDIT_ERROR_CONTROL);
|
|||
|
|
|||
|
|
|||
|
PrintToFile((LPCTSTR)SvcConfig->lpServiceStartName,
|
|||
|
IDC_EDIT_START_NAME,TRUE);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// If the service/device has a binary path name display it.
|
|||
|
//
|
|||
|
|
|||
|
if( SvcConfig->lpBinaryPathName != NULL ) {
|
|||
|
|
|||
|
TCHAR Buffer2[ MAX_PATH ];
|
|||
|
LPTSTR PathName;
|
|||
|
|
|||
|
//
|
|||
|
// If the binary path name's prefix is '\\SystemRoot' replace
|
|||
|
// this with '%SystemRoot%' and expand the environment
|
|||
|
// variable to the real system root. This is needed because
|
|||
|
// services/devices that are started by the I/O system do not
|
|||
|
// use the environment variable form in their name.
|
|||
|
//
|
|||
|
|
|||
|
if( _tcsnicmp(
|
|||
|
SvcConfig->lpBinaryPathName,
|
|||
|
TEXT( "\\SystemRoot" ),
|
|||
|
11 )
|
|||
|
== 0 ) {
|
|||
|
|
|||
|
|
|||
|
PrintToFile((LPCTSTR)&SvcConfig->lpBinaryPathName[11],IDC_SYSTEM_ROOT,TRUE);//test to see if we need to remove the following
|
|||
|
|
|||
|
Count = ExpandEnvironmentStrings(
|
|||
|
Buffer,
|
|||
|
Buffer2,
|
|||
|
sizeof( Buffer2 )
|
|||
|
);
|
|||
|
DbgAssert(( Count != 0 ) && ( Count <= sizeof( Buffer2 )));
|
|||
|
|
|||
|
PathName = Buffer2;
|
|||
|
|
|||
|
PrintToFile((LPCTSTR)
|
|||
|
Buffer2,IDC_EDIT_PATHNAME,TRUE);
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
PathName = SvcConfig->lpBinaryPathName;
|
|||
|
|
|||
|
PrintToFile((LPCTSTR)
|
|||
|
SvcConfig->lpBinaryPathName,IDC_EDIT_PATHNAME,TRUE);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}//endif
|
|||
|
|
|||
|
//
|
|||
|
// Display the name of the order group.
|
|||
|
//
|
|||
|
|
|||
|
PrintToFile((LPCTSTR)
|
|||
|
SvcConfig->lpLoadOrderGroup,IDC_EDIT_GROUP,TRUE);
|
|||
|
|
|||
|
//
|
|||
|
// Traverse the list of dependencies and display them in their
|
|||
|
// appropriate group.
|
|||
|
//
|
|||
|
|
|||
|
Dependent = SvcConfig->lpDependencies;
|
|||
|
while(( Dependent != NULL ) && ( Dependent[ 0 ] != TEXT( '\0' ))) {
|
|||
|
|
|||
|
UINT ListId;
|
|||
|
LONG Index;
|
|||
|
LPTSTR Name;
|
|||
|
|
|||
|
//
|
|||
|
// If the dependent has the prefix SC_GROUP_IDENTIFIER then
|
|||
|
// display it in the group dependency list otherwise display it
|
|||
|
// in the service dependency list.
|
|||
|
//
|
|||
|
|
|||
|
if( Dependent[ 0 ] == SC_GROUP_IDENTIFIER ) {
|
|||
|
|
|||
|
ListId = IDC_LIST_GROUP_DEPEND;
|
|||
|
Name = &Dependent[ 1 ];
|
|||
|
|
|||
|
} else {
|
|||
|
|
|||
|
ListId = IDC_LIST_SERVICE_DEPEND;
|
|||
|
Name = Dependent;
|
|||
|
}
|
|||
|
|
|||
|
PrintToFile((LPCTSTR)
|
|||
|
Name,IDC_NAME,TRUE);
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Get the next dependent from the list of NUL terminated
|
|||
|
// strings (the list itself is further NUL terminated).
|
|||
|
//
|
|||
|
|
|||
|
Dependent += _tcslen( Dependent ) + 1;
|
|||
|
}//end while
|
|||
|
|
|||
|
//
|
|||
|
// Destroy the QUERY_SERVICE_CONFIG structure.
|
|||
|
//
|
|||
|
|
|||
|
Success = DestroySvcConfig( SvcConfig );
|
|||
|
DbgAssert( Success );
|
|||
|
|
|||
|
return TRUE;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL
|
|||
|
ServiceListProc(DWORD Param)
|
|||
|
|
|||
|
/*++
|
|||
|
|
|||
|
Routine Description:
|
|||
|
|
|||
|
ServiceListProc displays the lists of services or devices that are
|
|||
|
available on the system. Double clicking on one of these displayed services
|
|||
|
or devices causes a second dialog box to be displayed with detailed
|
|||
|
information.
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
Standard PROC entry.
|
|||
|
|
|||
|
Return Value:
|
|||
|
|
|||
|
BOOL - Depending on input message and processing options.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
BOOL Success;
|
|||
|
LPENUM_SERVICE_STATUS Ess;
|
|||
|
|
|||
|
static
|
|||
|
HSVC hSvc;
|
|||
|
DWORD ServiceType;
|
|||
|
DWORD Count;
|
|||
|
DWORD Widths[ ] = {
|
|||
|
35,
|
|||
|
( DWORD ) -1
|
|||
|
};
|
|||
|
|
|||
|
//
|
|||
|
// By default the dialogs box is set-up to display services.
|
|||
|
// Change its labels if drivers are being displayed.
|
|||
|
//
|
|||
|
|
|||
|
ServiceType = ( DWORD ) Param;
|
|||
|
DbgAssert( ( ServiceType == SERVICE_WIN32 )
|
|||
|
|| ( ServiceType == SERVICE_DRIVER ));
|
|||
|
|
|||
|
//
|
|||
|
// Open the service controller for the supplied type of service.
|
|||
|
//
|
|||
|
|
|||
|
hSvc = OpenSvc( ServiceType );
|
|||
|
DbgHandleAssert( hSvc );
|
|||
|
if( hSvc == NULL ) {
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// For each service/device of the supplied type, add it to the list.
|
|||
|
//
|
|||
|
|
|||
|
while( Ess = QueryNextSvcEss( hSvc )) {
|
|||
|
|
|||
|
LONG Index;
|
|||
|
DISPLAY_SERVICE DisplayService;
|
|||
|
// LPCLB_ROW ClbRow;
|
|||
|
|
|||
|
//Ess = ( LPENUM_SERVICE_STATUS ) ClbRow->Data;
|
|||
|
|
|||
|
//
|
|||
|
// Set up a DISPLAY_SERVICE object.
|
|||
|
//
|
|||
|
|
|||
|
DisplayService.hSvc = hSvc;
|
|||
|
DisplayService.Ess = Ess;
|
|||
|
SetSignature( &DisplayService );
|
|||
|
|
|||
|
//
|
|||
|
// Display details about the selected service/device.
|
|||
|
//
|
|||
|
|
|||
|
DisplayServiceProc(
|
|||
|
//( LPARAM ) &DisplayService
|
|||
|
(LPDISPLAY_SERVICE) &DisplayService
|
|||
|
);
|
|||
|
|
|||
|
PrintToFile((LPCTSTR)TEXT("\n"),IDC_SPACE,TRUE);
|
|||
|
|
|||
|
}//end while
|
|||
|
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|