Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

735 lines
22 KiB

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
util.c
Abstract:
Contains general functions.
Author:
Sanjay Anand (SanjayAn) Nov. 14, 1995
Environment:
User mode
Revision History:
Sanjay Anand (SanjayAn) Nov. 14, 1995
Created
--*/
#include "defs.h"
#define CONV_LOG_FILE_NAME TEXT("%SystemRoot%\\System32\\jetconv.exe")
#define CONV_MSGFILE_SKEY TEXT("EventMessageFile")
HANDLE EventlogHandle = NULL;
NTSTATUS
JCRegisterEventSrc()
/*++
Routine Description:
This routine registers JetConv as an eventsource.
Arguments:
None.
Return Value:
None.
--*/
{
TCHAR temp[] = "JetConv";
TCHAR logName[MAX_PATH]=JCONV_LOG_KEY_PREFIX;
TCHAR Buff[MAX_PATH];
LONG RetVal = ERROR_SUCCESS;
HKEY LogRoot;
DWORD NewKeyInd;
DWORD dwData;
strcat(logName, temp);
//
// Create the registry keys so we can register as an event source
//
RetVal = RegCreateKeyEx(
HKEY_LOCAL_MACHINE, //predefined key value
logName, //subkey for JetConv
0, //must be zero (reserved)
TEXT("Class"), //class -- may change in future
REG_OPTION_NON_VOLATILE, //non-volatile information
KEY_ALL_ACCESS, //we desire all access to the keyo
NULL, //let key have default sec. attributes
&LogRoot, //handle to key
&NewKeyInd //is it a new key (out arg) -- not
//looked at
);
if (RetVal != ERROR_SUCCESS)
{
MYDEBUG(("RegCreateKeyEx failed %lx for %s\n", RetVal, logName));
return(RetVal);
}
/*
Set the event id message file name
*/
lstrcpy(Buff, CONV_LOG_FILE_NAME);
/*
Add the Event-ID message-file name to the subkey
*/
RetVal = RegSetValueEx(
LogRoot, //key handle
CONV_MSGFILE_SKEY, //value name
0, //must be zero
REG_EXPAND_SZ, //value type
(LPBYTE)Buff,
(lstrlen(Buff) + 1) * sizeof(TCHAR) //length of value data
);
if (RetVal != ERROR_SUCCESS)
{
MYDEBUG(("RegSetValueEx failed %lx for %s", RetVal, Buff));
return(RetVal);
}
/*
Set the supported data types flags
*/
dwData = EVENTLOG_ERROR_TYPE |
EVENTLOG_WARNING_TYPE |
EVENTLOG_INFORMATION_TYPE;
RetVal = RegSetValueEx (
LogRoot, //subkey handle
TEXT("TypesSupported"), //value name
0, //must be zero
REG_DWORD, //value type
(LPBYTE)&dwData, //Address of value data
sizeof(DWORD) //length of value data
);
if (RetVal != ERROR_SUCCESS)
{
MYDEBUG(("RegSetValueEx failed %lx for TypesSupported on %s", RetVal, logName));
return(RetVal);
}
/*
* Done with the key. Close it
*/
RetVal = RegCloseKey(LogRoot);
if (RetVal != ERROR_SUCCESS)
{
MYDEBUG(("RegCloseKey failed %lx\n", RetVal));
return(RetVal);
}
//
// Register JetConv as an event source
//
strcpy(logName, temp);
if (!(EventlogHandle = RegisterEventSource( NULL,
logName))) {
MYDEBUG(("RegisterEventSource failed %lx\n", GetLastError()));
return STATUS_UNSUCCESSFUL;
} else {
MYDEBUG(("RegisterEventSource succeeded\n"));
return STATUS_SUCCESS;
}
}
NTSTATUS
JCDeRegisterEventSrc()
/*++
Routine Description:
This routine deregisters eventsources corresponding to those service that
are installed in the system.
Arguments:
None.
Return Value:
NtStatus.
--*/
{
if (EventlogHandle) {
if (!DeregisterEventSource(EventlogHandle)) {
MYDEBUG(("DeregisterEventSource failed: %lx for %s", GetLastError()));
return STATUS_UNSUCCESSFUL;
} else {
return STATUS_SUCCESS;
}
}
return STATUS_SUCCESS;
}
VOID
JCLogEvent(
DWORD EventId,
LPSTR MsgTypeString1,
LPSTR MsgTypeString2 OPTIONAL,
LPSTR MsgTypeString3 OPTIONAL
)
/*++
Routine Description:
This routine logs an entry in the eventlog.
Arguments:
EventId - the event identifier
MsgTypeString1 - string to be output
MsgTypeString2 - string2 to be output (OPTIONAL)
Return Value:
None.
--*/
{
LPSTR Strings[3];
WORD numStr;
Strings[0] = MsgTypeString1;
Strings[1] = MsgTypeString2;
Strings[2] = MsgTypeString3;
if (MsgTypeString3) {
numStr = 3;
} else if (MsgTypeString2) {
numStr = 2;
} else {
numStr = 1;
}
if( !ReportEvent(
EventlogHandle,
(WORD)EVENTLOG_INFORMATION_TYPE,
0, // event category
EventId,
NULL,
numStr,
0,
Strings,
NULL) ) {
MYDEBUG(("ReportEvent failed %ld.", GetLastError() ));
}
return;
}
VOID
JCReadRegistry(
IN PSERVICE_INFO pServiceInfo
)
/*++
Routine Description:
This routine reads the registry to determine which of the service
among WINS, DHCP and RPL are installed. For those installed, it
fills in the ServiceInfo structure.
Arguments:
pServiceInfo - Pointer to the service information struct.
Return Value:
None.
--*/
{
HKEY hkey ;
SERVICES i ;
DWORD type ;
DWORD size = 0 ;
DWORD error;
TCHAR tempPath[MAX_PATH];
TCHAR servicePath[MAX_PATH];
TCHAR parametersPath[MAX_PATH];
TCHAR dbfilePath[MAX_PATH];
TCHAR dbfileName[MAX_PATH];
TCHAR backupFilePath[MAX_PATH];
TCHAR logfilePath[MAX_PATH];
HANDLE ServiceHandle, SCHandle;
for ( i = 0; i < NUM_SERVICES; i++) {
switch (i) {
case WINS:
strcpy(servicePath, WINS_REGISTRY_SERVICE_PATH);
strcpy(parametersPath, WINS_REGISTRY_PARAMETERS_PATH);
strcpy(dbfilePath, WINS_REGISTRY_DBFILE_PATH);
strcpy(logfilePath, WINS_REGISTRY_LOGFILE_PATH);
strcpy(backupFilePath, WINS_REGISTRY_BACKUP_PATH);
break;
case DHCP:
strcpy(servicePath, DHCP_REGISTRY_SERVICE_PATH);
strcpy(parametersPath, DHCP_REGISTRY_PARAMETERS_PATH);
strcpy(dbfilePath, DHCP_REGISTRY_DBFILE_PATH);
strcpy(dbfileName, DHCP_REGISTRY_DBFILE_NAME);
// strcpy(logfilePath, DHCP_REGISTRY_LOGFILE_PATH);
strcpy(backupFilePath, DHCP_REGISTRY_BACKUP_PATH);
break;
case RPL:
strcpy(servicePath, RPL_REGISTRY_SERVICE_PATH);
strcpy(parametersPath, RPL_REGISTRY_PARAMETERS_PATH);
strcpy(dbfilePath, RPL_REGISTRY_DBFILE_PATH);
// no such path
// strcpy(logfilePath, RPL_REGISTRY_LOGFILE_PATH);
// strcpy(backupFilePath, RPL_REGISTRY_BACKUP_PATH);
break;
}
//
// Check if service is installed - if the service name key is
// present, it is installed.
//
if ((error = RegOpenKey(HKEY_LOCAL_MACHINE,
servicePath,
&hkey)) != ERROR_SUCCESS) {
MYDEBUG(("RegOpenKey %s returned error: %lx\n", pServiceInfo[i].ServiceName, error));
MYDEBUG(("%s not installed\n", pServiceInfo[i].ServiceName));
pServiceInfo[i].Installed = FALSE;
continue;
} else {
//
// NtBug: 139281
// Its likely that the regkey exists, but the service was DISABLED!
//
MYDEBUG(("*************************Opening SC Manager\n"));
SCHandle = OpenSCManager(
NULL,
NULL,
SC_MANAGER_CONNECT |
SC_MANAGER_ENUMERATE_SERVICE |
SC_MANAGER_QUERY_LOCK_STATUS
);
if( SCHandle != NULL ) {
ServiceHandle = OpenService(
SCHandle,
pServiceInfo[i].ServiceName,
SERVICE_QUERY_CONFIG
);
if( ServiceHandle == NULL ) {
MYDEBUG(("SCManager tells us that the service %s is cant be opened: %lx!\n", pServiceInfo[i].ServiceName, GetLastError()));
pServiceInfo[i].Installed = FALSE;
CloseServiceHandle(SCHandle);
continue;
} else {
LPQUERY_SERVICE_CONFIG ServiceConfig;
DWORD cbBufSize;
DWORD cbBytesNeeded;
BOOL result = FALSE;
cbBytesNeeded = 0;
//
// First send 0 buffer to figure out what the length needs to be.
//
result = QueryServiceConfig(
ServiceHandle, // handle of service
NULL, // address of service config. structure
0, // size of service configuration buffer
&cbBytesNeeded // address of variable for bytes needed
);
if (!result) {
MYDEBUG(("QueryService failed due to :%d \n", GetLastError()));
} else {
MYDEBUG(("QueryService PASSED with NULL. Shouldnt happen.\n"));
}
ServiceConfig = (LPQUERY_SERVICE_CONFIG) malloc (cbBytesNeeded);
cbBufSize = cbBytesNeeded;
if (NULL == ServiceConfig) {
MYDEBUG(("Can't alloc memory to query the SC\n"));
pServiceInfo[i].Installed = FALSE;
MYDEBUG(("SERVICE %s is DISABLED\n", pServiceInfo[i].ServiceName));
CloseServiceHandle(ServiceHandle);
CloseServiceHandle(SCHandle);
continue;
}
if (!QueryServiceConfig(
ServiceHandle, // handle of service
ServiceConfig, // address of service config. structure
cbBufSize, // size of service configuration buffer
&cbBytesNeeded // address of variable for bytes needed
)) {
free(ServiceConfig);
MYDEBUG(("Things didnt work:%lx, %d , %d\n", GetLastError(), cbBufSize, cbBytesNeeded));
pServiceInfo[i].Installed = FALSE;
MYDEBUG(("SERVICE %s is DISABLED\n", pServiceInfo[i].ServiceName));
CloseServiceHandle(ServiceHandle);
CloseServiceHandle(SCHandle);
continue;
} else {
if (SERVICE_DISABLED == ServiceConfig->dwStartType) {
free(ServiceConfig);
pServiceInfo[i].Installed = FALSE;
MYDEBUG(("SERVICE %s is DISABLED\n", pServiceInfo[i].ServiceName));
CloseServiceHandle(ServiceHandle);
CloseServiceHandle(SCHandle);
continue;
}
free(ServiceConfig);
}
CloseServiceHandle(ServiceHandle);
}
CloseServiceHandle(SCHandle);
} else {
MYDEBUG(("Cant open SCManager:%;x!\n", GetLastError()));
MYDEBUG(("%s not installed\n", pServiceInfo[i].ServiceName));
pServiceInfo[i].Installed = FALSE;
continue;
}
}
pServiceInfo[i].Installed = TRUE;
size = MAX_PATH;
if ((error = JCRegisterEventSrc()) != ERROR_SUCCESS) {
MYDEBUG(("JCRegisterEventSrc failed\n"));
pServiceInfo[i].Installed = FALSE;
continue;
}
//
// Open the parameters key
//
if ((error = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
parametersPath,
0,
KEY_ALL_ACCESS,
&hkey)) != ERROR_SUCCESS) {
MYDEBUG(("RegOpenKeyEx %s\\Parameters returned error: %lx\n", pServiceInfo[i].ServiceName, error));
} else {
//
// Read in the path to the Dbase file.
//
size = MAX_PATH;
if ((error = RegQueryValueEx(hkey,
dbfilePath,
NULL,
&type,
pServiceInfo[i].DBPath,
&size)) != ERROR_SUCCESS) {
MYDEBUG(("RegQueryValueEx of %s dbpath failed: %lx\n", pServiceInfo[i].ServiceName, error));
//
// If no path parameter, it shd be in %systemroot%\system32\<service> - the path was initialized to
// the default.
//
MYDEBUG(("%s dbfile path not present; assuming it is in %s\n",
pServiceInfo[i].ServiceName, pServiceInfo[i].DBPath));
} else {
pServiceInfo[i].DefaultDbPath = FALSE;
//
// DHCP splits the name and path
//
if (i == DHCP) {
TCHAR dhcpDBFileName[MAX_PATH];
//
// Copy this path to the logfilepath too.
//
strcpy(pServiceInfo[i].LogFilePath, pServiceInfo[i].DBPath);
//
// Read the name too
//
size = MAX_PATH;
if ((error = RegQueryValueEx(hkey,
dbfileName,
NULL,
&type,
dhcpDBFileName,
&size)) != ERROR_SUCCESS) {
MYDEBUG(("RegQueryValueEx of %s dbName failed: %lx\n", pServiceInfo[i].ServiceName, error));
//
// If no path parameter, it shd be in %systemroot%\system32\<service> - the path was initialized to
// the default.
//
MYDEBUG(("%s dbfile name not present; assuming it is dhcp.mdb\n",
pServiceInfo[i].ServiceName));
strcat(pServiceInfo[i].DBPath, TEXT("\\dhcp.mdb"));
} else {
strcat(pServiceInfo[i].DBPath, TEXT("\\"));
strcat(pServiceInfo[i].DBPath, dhcpDBFileName);
}
} else if (i == RPL) {
//
// Copy this path to the logfilepath too.
//
strcpy(pServiceInfo[i].LogFilePath, pServiceInfo[i].DBPath);
//
// Copy this path to the backuppath too
//
strcpy(pServiceInfo[i].BackupPath, pServiceInfo[i].DBPath);
strcat(pServiceInfo[i].BackupPath, TEXT("\\backup"));
//
// The DBFile is always called rplsvc.mdb
//
strcat(pServiceInfo[i].DBPath, TEXT("\\rplsvc.mdb"));
}
}
//
// Read in the path to the Log file.
// In case of RPL, no such paths exist.
// Assume they are in the same directory as the database files.
//
if (i != RPL) {
//
// DHCP has no logfilepath
//
if (i != DHCP) {
size = MAX_PATH;
if ((error = RegQueryValueEx(hkey,
logfilePath,
NULL,
&type,
pServiceInfo[i].LogFilePath,
&size)) != ERROR_SUCCESS) {
MYDEBUG(("RegQueryValueEx of %s logfilepath failed: %lx\n", pServiceInfo[i].ServiceName, error));
//
// If no path parameter, it shd be in %systemroot%\system32\<service> - the path was initialized to
// the default.
//
MYDEBUG(("%s logfile path not present; assuming it is in %s\n",
pServiceInfo[i].ServiceName, pServiceInfo[i].LogFilePath));
} else {
pServiceInfo[i].DefaultLogFilePath = FALSE;
}
}
//
// Read in the path to the backup file.
//
size = MAX_PATH;
if ((error = RegQueryValueEx(hkey,
backupFilePath,
NULL,
&type,
pServiceInfo[i].BackupPath,
&size)) != ERROR_SUCCESS) {
MYDEBUG(("RegQueryValueEx of %s BackupPath failed: %lx\n", pServiceInfo[i].ServiceName, error));
//
// If no path parameter, it shd be in %systemroot%\system32\<service> - the path was initialized to
// the default.
//
MYDEBUG(("%s backupfile path not present; assuming it is in %s\n",
pServiceInfo[i].ServiceName, pServiceInfo[i].BackupPath));
}
}
}
//
// Expand the environment variables in the path.
//
strcpy(tempPath, pServiceInfo[i].DBPath);
if ((size = ExpandEnvironmentStrings( tempPath,
pServiceInfo[i].DBPath,
MAX_PATH)) == 0) {
error = GetLastError();
MYDEBUG(("ExpandEnvironmentVaraibles %s returned error: %lx\n", pServiceInfo[i].ServiceName, error));
}
SystemDrive[0] = pServiceInfo[i].DBPath[0];
SystemDrive[1] = pServiceInfo[i].DBPath[1];
SystemDrive[2] = pServiceInfo[i].DBPath[2];
SystemDrive[3] = '\0';
MYDEBUG(("pServiceInfo[i].DbasePath: %s\n", pServiceInfo[i].DBPath));
//
// Expand the environment variables in the log file path.
//
strcpy(tempPath, pServiceInfo[i].LogFilePath);
if ((size = ExpandEnvironmentStrings( tempPath,
pServiceInfo[i].LogFilePath,
MAX_PATH)) == 0) {
error = GetLastError();
MYDEBUG(("ExpandEnvironmentVaraibles %s returned error: %lx\n", pServiceInfo[i].ServiceName, error));
}
MYDEBUG(("pServiceInfo[i].LogFilePath: %s\n", pServiceInfo[i].LogFilePath));
//
// Expand the environment variables in the backup file path.
//
strcpy(tempPath, pServiceInfo[i].BackupPath);
if ((size = ExpandEnvironmentStrings( tempPath,
pServiceInfo[i].BackupPath,
MAX_PATH)) == 0) {
error = GetLastError();
MYDEBUG(("ExpandEnvironmentVaraibles %s returned error: %lx\n", pServiceInfo[i].ServiceName, error));
}
MYDEBUG(("pServiceInfo[i].BackupPath: %s\n", pServiceInfo[i].BackupPath));
}
for ( i = 0; i < NUM_SERVICES; i++) {
if (pServiceInfo[i].Installed) {
MYDEBUG(("Service %s is Installed\n", pServiceInfo[i].ServiceName));
} else {
MYDEBUG(("Service %s is NOT Installed\n", pServiceInfo[i].ServiceName));
}
}
}
VOID
JCGetMutex (
IN HANDLE hMutex,
IN DWORD To
)
/*++
Routine Description:
This routine waits on a mutex object.
Arguments:
hMutex - handle to mutex
To - time to wait
Return Value:
None.
--*/
{
if (WaitForSingleObject (hMutex, To) == WAIT_FAILED) {
MYDEBUG(("WaitForSingleObject failed: %lx\n", GetLastError()));
}
}
VOID
JCFreeMutex (
IN HANDLE hMutex
)
/*++
Routine Description:
This routine releases a mutex.
Arguments:
hMutex - handle to mutex
Return Value:
None.
--*/
{
if (!ReleaseMutex(hMutex)) {
MYDEBUG(("ReleaseMutex failed: %lx\n", GetLastError()));
}
}