Leaked source code of windows server 2003
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.
 
 
 
 
 
 

261 lines
7.8 KiB

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
main.c
Abstract:
This module contains the startup and termination code for the Configuration
Manager (cfgmgr32).
Author:
Paula Tomlinson (paulat) 6-20-1995
Environment:
User mode only.
Revision History:
3-Mar-1995 paulat
Creation and initial implementation.
--*/
//
// includes
//
#include "precomp.h"
#pragma hdrstop
#include "cfgi.h"
//
// global data
//
HANDLE hInst;
PVOID hLocalStringTable = NULL; // handle to local string table
PVOID hLocalBindingHandle = NULL; // rpc binding handle to local machine
WORD LocalServerVersion = 0; // local machine internal server version
WCHAR LocalMachineNameNetBIOS[MAX_PATH + 3];
WCHAR LocalMachineNameDnsFullyQualified[MAX_PATH + 3];
CRITICAL_SECTION BindingCriticalSection;
CRITICAL_SECTION StringTableCriticalSection;
BOOL
CfgmgrEntry(
PVOID hModule,
ULONG Reason,
PCONTEXT pContext
)
/*++
Routine Description:
This is the standard DLL entrypoint routine, called whenever a process
or thread attaches or detaches.
Arguments:
hModule - PVOID parameter that specifies the handle of the DLL
Reason - ULONG parameter that specifies the reason this entrypoint
was called (either PROCESS_ATTACH, PROCESS_DETACH,
THREAD_ATTACH, or THREAD_DETACH).
pContext - Not used.
(when cfgmgr32 is initialized by setupapi - as should almost
always be the case - this is the 'Reserved' argument supplied to
setupapi's DllMain entrypoint)
Return value:
Returns true if initialization completed successfully, false is not.
--*/
{
UNREFERENCED_PARAMETER(pContext);
hInst = (HANDLE)hModule;
switch(Reason) {
case DLL_PROCESS_ATTACH: {
WCHAR szTemp[MAX_PATH + 1];
ULONG ulSize;
size_t len;
//
// InitializeCriticalSection may raise STATUS_NO_MEMORY exception
//
try {
InitializeCriticalSection(&BindingCriticalSection);
InitializeCriticalSection(&StringTableCriticalSection);
} except(EXCEPTION_EXECUTE_HANDLER) {
return FALSE;
}
//
// save the NetBIOS name of the local machine for later use.
// note that the size of the DNS computer name buffer is MAX_PATH+3,
// which is actually much larger than MAX_COMPUTERNAME_LENGTH, the
// max length returned for ComputerNameNetBIOS.
//
ulSize = SIZECHARS(szTemp);
if(!GetComputerNameEx(ComputerNameNetBIOS, szTemp, &ulSize)) {
//
// ISSUE-2002/03/05-jamesca: Can we actually run w/o knowing
// the local machine name???
//
*LocalMachineNameNetBIOS = L'\0';
} else {
if (FAILED(StringCchLength(
szTemp,
SIZECHARS(szTemp),
&len))) {
return FALSE;
}
//
// always save local machine name in "\\name format"
//
if((len > 2) &&
(szTemp[0] == L'\\') && (szTemp[1] == L'\\')) {
//
// The name is already in the correct format.
//
if (FAILED(StringCchCopy(
LocalMachineNameNetBIOS,
SIZECHARS(LocalMachineNameNetBIOS),
szTemp))) {
return FALSE;
}
} else {
//
// Prepend UNC path prefix
//
if (FAILED(StringCchCopy(
LocalMachineNameNetBIOS,
SIZECHARS(LocalMachineNameNetBIOS),
L"\\\\"))) {
return FALSE;
}
if (FAILED(StringCchCat(
LocalMachineNameNetBIOS,
SIZECHARS(LocalMachineNameNetBIOS),
szTemp))) {
return FALSE;
}
}
}
//
// save the DNS name of the local machine for later use.
// note that the size of the DNS computer name buffer is MAX_PATH+3,
// which is actually larger than DNS_MAX_NAME_BUFFER_LENGTH, the max
// length for ComputerNameDnsFullyQualified.
//
ulSize = SIZECHARS(szTemp);
if(!GetComputerNameEx(ComputerNameDnsFullyQualified, szTemp, &ulSize)) {
//
// ISSUE-2002/03/05-jamesca: Can we actually run w/o knowing
// the local machine name???
//
*LocalMachineNameDnsFullyQualified = L'\0';
} else {
if (FAILED(StringCchLength(
szTemp,
SIZECHARS(szTemp),
&len))) {
return FALSE;
}
//
// always save local machine name in "\\name format"
//
if((len > 2) &&
(szTemp[0] == L'\\') && (szTemp[1] == L'\\')) {
//
// The name is already in the correct format.
//
if (FAILED(StringCchCopy(
LocalMachineNameDnsFullyQualified,
SIZECHARS(LocalMachineNameDnsFullyQualified),
szTemp))) {
return FALSE;
}
} else {
//
// Prepend UNC path prefix
//
if (FAILED(StringCchCopy(
LocalMachineNameDnsFullyQualified,
SIZECHARS(LocalMachineNameDnsFullyQualified),
L"\\\\"))) {
return FALSE;
}
if (FAILED(StringCchCat(
LocalMachineNameDnsFullyQualified,
SIZECHARS(LocalMachineNameDnsFullyQualified),
szTemp))) {
return FALSE;
}
}
}
break;
}
case DLL_PROCESS_DETACH:
//
// release the rpc binding for the local machine
//
if (hLocalBindingHandle != NULL) {
PNP_HANDLE_unbind(NULL, (handle_t)hLocalBindingHandle);
hLocalBindingHandle = NULL;
}
//
// release the string table for the local machine
//
if (hLocalStringTable != NULL) {
pSetupStringTableDestroy(hLocalStringTable);
hLocalStringTable = NULL;
}
DeleteCriticalSection(&BindingCriticalSection);
DeleteCriticalSection(&StringTableCriticalSection);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
} // CfgmgrEntry