mirror of https://github.com/lianthony/NT4.0
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.
220 lines
6.0 KiB
220 lines
6.0 KiB
/*++
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
main.c
|
|
|
|
Abstract:
|
|
|
|
Main module of the jetconv.exe process
|
|
|
|
Author:
|
|
|
|
Sanjay Anand (SanjayAn) Nov. 14, 1995
|
|
|
|
Environment:
|
|
|
|
User mode
|
|
|
|
Revision History:
|
|
|
|
Sanjay Anand (SanjayAn) Nov. 14, 1995
|
|
Created
|
|
|
|
--*/
|
|
|
|
#include "defs.h"
|
|
|
|
TCHAR SystemDrive[4];
|
|
LONG JCDebugLevel = 1;
|
|
PSHARED_MEM shrdMemPtr = NULL;
|
|
HANDLE hMutex=NULL;
|
|
HANDLE hFileMapping = NULL;
|
|
|
|
void _cdecl
|
|
main(
|
|
INT argc,
|
|
CHAR *argv[]
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Main routine in the jetconv process.
|
|
|
|
Arguments:
|
|
|
|
argc - 1 or 2
|
|
|
|
argv - If called from any of the services, we get the name of the
|
|
service as the parameter, else if it is invoked from the command
|
|
line, no parameter is passed in.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
DWORD error, mutexerr;
|
|
SERVICES i, thisServiceId = NUM_SERVICES;
|
|
SERVICE_INFO pServiceInfo[NUM_SERVICES] = {
|
|
{"DHCPServer", FALSE, TRUE, TRUE, FALSE, FALSE, DEFAULT_DHCP_DBFILE_PATH,
|
|
DEFAULT_DHCP_SYSTEM_PATH, DEFAULT_DHCP_LOGFILE_PATH, DEFAULT_DHCP_BACKUP_PATH, 0, 0 },
|
|
{"WINS", FALSE, TRUE, TRUE, FALSE, FALSE, DEFAULT_WINS_DBFILE_PATH,
|
|
DEFAULT_WINS_SYSTEM_PATH, DEFAULT_WINS_LOGFILE_PATH, DEFAULT_WINS_BACKUP_PATH, 0, 0 },
|
|
{"Remoteboot", FALSE, TRUE, TRUE, FALSE, FALSE, DEFAULT_RPL_DBFILE_PATH,
|
|
DEFAULT_RPL_SYSTEM_PATH, DEFAULT_RPL_LOGFILE_PATH, DEFAULT_RPL_BACKUP_PATH, 0, 0 }
|
|
};
|
|
|
|
TCHAR val[2];
|
|
|
|
if (GetEnvironmentVariable(TEXT("JetConvDebug"), val, 2*sizeof(TCHAR))) {
|
|
if (strcmp(val, "1")==0) {
|
|
JCDebugLevel = 1;
|
|
} else {
|
|
JCDebugLevel = 2;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Invoked only from the three services - WINS/DHCP/RPL with two args - servicename and "/@"
|
|
//
|
|
if ((argc != 3) ||
|
|
((argc == 3) && _stricmp(argv[2], "/@"))) {
|
|
|
|
//
|
|
// Probably called from command line
|
|
//
|
|
printf("Error: This utility cannot be called from the command line. It is invoked by the WINS/DHCP/RPL services.\n");
|
|
exit (1);
|
|
|
|
} else {
|
|
|
|
MYDEBUG(("Service passed in: %s\n", argv[1]));
|
|
|
|
for ( i=0; i < NUM_SERVICES; i++) {
|
|
if (_stricmp(pServiceInfo[i].ServiceName, argv[1]) == 0) {
|
|
thisServiceId = i;
|
|
}
|
|
}
|
|
|
|
if (thisServiceId == NUM_SERVICES) {
|
|
MYDEBUG(("Error: Bad service Id passed in\n"));
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
if ((hMutex = CreateMutex( NULL,
|
|
FALSE,
|
|
JCONVMUTEXNAME)) == NULL) {
|
|
error = GetLastError();
|
|
MYDEBUG(("CreateMutex returned error: %lx\n", error));
|
|
exit (1);
|
|
}
|
|
|
|
mutexerr = GetLastError();
|
|
|
|
JCGetMutex(hMutex, INFINITE);
|
|
|
|
hFileMapping = OpenFileMapping( FILE_MAP_WRITE,
|
|
FALSE,
|
|
JCONVSHAREDMEMNAME );
|
|
|
|
if (hFileMapping) {
|
|
//
|
|
// Another instance of JCONV was already running.
|
|
// Write our service name and exit
|
|
//
|
|
if ((shrdMemPtr = (PSHARED_MEM)MapViewOfFile( hFileMapping,
|
|
FILE_MAP_WRITE,
|
|
0L,
|
|
0L,
|
|
sizeof(SHARED_MEM))) == NULL) {
|
|
MYDEBUG(("MapViewOfFile returned error: %lx\n", GetLastError()));
|
|
|
|
JCFreeMutex(hMutex);
|
|
|
|
exit(1);
|
|
}
|
|
|
|
if (thisServiceId < NUM_SERVICES) {
|
|
shrdMemPtr->InvokedByService[thisServiceId] = TRUE;
|
|
}
|
|
|
|
MYDEBUG(("shrdMemPtr->InvokedByService[i]: %x, %x, %x\n", shrdMemPtr->InvokedByService[0], shrdMemPtr->InvokedByService[1], shrdMemPtr->InvokedByService[2]));
|
|
|
|
JCFreeMutex(hMutex);
|
|
|
|
exit (1);
|
|
} else {
|
|
if (mutexerr == ERROR_ALREADY_EXISTS) {
|
|
//
|
|
// Upg351Db was running; log an entry and scram.
|
|
//
|
|
MYDEBUG(("Upg351Db already running\n"));
|
|
|
|
JCFreeMutex(hMutex);
|
|
|
|
exit(1);
|
|
}
|
|
|
|
//
|
|
// Create the file mapping.
|
|
//
|
|
hFileMapping = CreateFileMapping( (HANDLE )0xFFFFFFFF,
|
|
NULL,
|
|
PAGE_READWRITE,
|
|
0L,
|
|
sizeof(SHARED_MEM),
|
|
JCONVSHAREDMEMNAME );
|
|
if (hFileMapping) {
|
|
//
|
|
// Write our service name in the shared memory and clear the others.
|
|
//
|
|
if ((shrdMemPtr = (PSHARED_MEM)MapViewOfFile( hFileMapping,
|
|
FILE_MAP_WRITE,
|
|
0L,
|
|
0L,
|
|
sizeof(SHARED_MEM))) == NULL) {
|
|
MYDEBUG(("MapViewOfFile returned error: %lx\n", GetLastError()));
|
|
|
|
JCFreeMutex(hMutex);
|
|
|
|
exit(1);
|
|
}
|
|
|
|
for (i = 0; i < NUM_SERVICES; i++) {
|
|
shrdMemPtr->InvokedByService[i] = (i == thisServiceId) ? TRUE : FALSE;
|
|
MYDEBUG(("shrdMemPtr->InvokedByService[i]: %x\n", shrdMemPtr->InvokedByService[i]));
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
JCFreeMutex(hMutex);
|
|
|
|
//
|
|
// Find out which services are installed in the system. Fill in the paths
|
|
// to their database files.
|
|
//
|
|
JCReadRegistry(pServiceInfo);
|
|
|
|
//
|
|
// Get the sizes of the dbase files; if there is enough disk space, call convert
|
|
// for each service.
|
|
//
|
|
JCConvert(pServiceInfo);
|
|
|
|
(VOID)JCDeRegisterEventSrc();
|
|
|
|
//
|
|
// Destroy the mutex too.
|
|
//
|
|
CloseHandle(hMutex);
|
|
|
|
}
|
|
|