Windows NT 4.0 source code leak
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

/*++
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);
}