198 lines
5.3 KiB
C
198 lines
5.3 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1995-2001 Microsoft Corporation
|
|||
|
|
|||
|
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"
|
|||
|
#include "cfgi.h"
|
|||
|
#include "setupapi.h"
|
|||
|
#include "spapip.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 compeleted successfully, false is not.
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
UNREFERENCED_PARAMETER(pContext);
|
|||
|
|
|||
|
hInst = (HANDLE)hModule;
|
|||
|
|
|||
|
switch(Reason) {
|
|||
|
|
|||
|
case DLL_PROCESS_ATTACH: {
|
|||
|
|
|||
|
WCHAR szTemp[MAX_PATH + 1];
|
|||
|
ULONG ulSize = SIZECHARS(szTemp);
|
|||
|
|
|||
|
try {
|
|||
|
InitializeCriticalSection(&BindingCriticalSection);
|
|||
|
InitializeCriticalSection(&StringTableCriticalSection);
|
|||
|
} except(EXCEPTION_EXECUTE_HANDLER) {
|
|||
|
//
|
|||
|
// InitializeCriticalSection may raise STATUS_NO_MEMORY
|
|||
|
// exception
|
|||
|
//
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// save the name of the local NetBIOS machine for later use
|
|||
|
//
|
|||
|
if(!GetComputerNameEx(ComputerNameNetBIOS, szTemp, &ulSize)) {
|
|||
|
//
|
|||
|
// ISSUE: (lonnym)--can we actually run w/o knowing the local
|
|||
|
// machine name???
|
|||
|
//
|
|||
|
*LocalMachineNameNetBIOS = L'\0';
|
|||
|
} else {
|
|||
|
//
|
|||
|
// always save local machine name in "\\name format"
|
|||
|
//
|
|||
|
if((lstrlen(szTemp) > 2) &&
|
|||
|
(szTemp[0] == L'\\') && (szTemp[1] == L'\\')) {
|
|||
|
//
|
|||
|
// The name is already in the correct format.
|
|||
|
//
|
|||
|
lstrcpy(LocalMachineNameNetBIOS, szTemp);
|
|||
|
} else {
|
|||
|
//
|
|||
|
// Prepend UNC path prefix
|
|||
|
//
|
|||
|
lstrcpy(LocalMachineNameNetBIOS, L"\\\\");
|
|||
|
lstrcat(LocalMachineNameNetBIOS, szTemp);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//
|
|||
|
// save the name of the local Dns machine for later use
|
|||
|
//
|
|||
|
ulSize = SIZECHARS(szTemp);
|
|||
|
if(!GetComputerNameEx(ComputerNameDnsFullyQualified, szTemp, &ulSize)) {
|
|||
|
//
|
|||
|
// ISSUE: (lonnym)--can we actually run w/o knowing the local
|
|||
|
// machine name???
|
|||
|
//
|
|||
|
*LocalMachineNameDnsFullyQualified = L'\0';
|
|||
|
} else {
|
|||
|
//
|
|||
|
// always save local machine name in "\\name format"
|
|||
|
//
|
|||
|
if((lstrlen(szTemp) > 2) &&
|
|||
|
(szTemp[0] == L'\\') && (szTemp[1] == L'\\')) {
|
|||
|
//
|
|||
|
// The name is already in the correct format.
|
|||
|
//
|
|||
|
lstrcpy(LocalMachineNameDnsFullyQualified, szTemp);
|
|||
|
} else {
|
|||
|
//
|
|||
|
// Prepend UNC path prefix
|
|||
|
//
|
|||
|
lstrcpy(LocalMachineNameDnsFullyQualified, L"\\\\");
|
|||
|
lstrcat(LocalMachineNameDnsFullyQualified, szTemp);
|
|||
|
}
|
|||
|
}
|
|||
|
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
|
|||
|
|