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.
417 lines
7.8 KiB
417 lines
7.8 KiB
/*++
|
|
|
|
Copyright (c) 1997 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
cxinit.c
|
|
|
|
Abstract:
|
|
|
|
Initialization code for the Cluster Network Driver.
|
|
|
|
Author:
|
|
|
|
Mike Massa (mikemas) January 3, 1997
|
|
|
|
Revision History:
|
|
|
|
Who When What
|
|
-------- -------- ----------------------------------------------
|
|
mikemas 01-03-97 created
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
|
|
#include "precomp.h"
|
|
|
|
#pragma hdrstop
|
|
#include "cxinit.tmh"
|
|
|
|
//
|
|
// Tdi Data
|
|
//
|
|
HANDLE CxTdiRegistrationHandle = NULL;
|
|
HANDLE CxTdiPnpBindingHandle = NULL;
|
|
|
|
|
|
//
|
|
// FIPS function table
|
|
//
|
|
HANDLE CxFipsDriverHandle = NULL;
|
|
FIPS_FUNCTION_TABLE CxFipsFunctionTable;
|
|
|
|
|
|
#ifdef ALLOC_PRAGMA
|
|
|
|
#pragma alloc_text(INIT, CxLoad)
|
|
#pragma alloc_text(PAGE, CxUnload)
|
|
#pragma alloc_text(PAGE, CxInitialize)
|
|
#pragma alloc_text(PAGE, CxShutdown)
|
|
|
|
#endif // ALLOC_PRAGMA
|
|
|
|
|
|
//
|
|
// Routines
|
|
//
|
|
NTSTATUS
|
|
CxLoad(
|
|
IN PUNICODE_STRING RegistryPath
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Driver load routine for the cluster transport. Initializes all
|
|
transport data structures.
|
|
|
|
Arguments:
|
|
|
|
RegistryPath - The driver's registry key.
|
|
|
|
Return Value:
|
|
|
|
An NT status code.
|
|
|
|
--*/
|
|
|
|
{
|
|
NTSTATUS status;
|
|
UNICODE_STRING deviceName;
|
|
TDI_CLIENT_INTERFACE_INFO info;
|
|
|
|
|
|
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CX] Loading...\n"));
|
|
}
|
|
|
|
TdiInitialize();
|
|
|
|
//
|
|
// Register our device object with TDI.
|
|
//
|
|
RtlInitUnicodeString(&deviceName, DD_CDP_DEVICE_NAME);
|
|
|
|
status = TdiRegisterDeviceObject(&deviceName, &CxTdiRegistrationHandle);
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
CNPRINT((
|
|
"[CX] Unable to register device %ws with TDI, status %lx\n",
|
|
deviceName.Buffer,
|
|
status
|
|
));
|
|
return(status);
|
|
}
|
|
|
|
//
|
|
// Register for PnP events.
|
|
//
|
|
RtlZeroMemory(&info, sizeof(info));
|
|
|
|
info.MajorTdiVersion = 2;
|
|
info.MinorTdiVersion = 0;
|
|
info.ClientName = &deviceName;
|
|
info.AddAddressHandlerV2 = CxTdiAddAddressHandler;
|
|
info.DelAddressHandlerV2 = CxTdiDelAddressHandler;
|
|
|
|
status = TdiRegisterPnPHandlers(
|
|
&info,
|
|
sizeof(info),
|
|
&CxTdiPnpBindingHandle
|
|
);
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
CNPRINT((
|
|
"[CX] Unable to register for TDI PnP events, status %lx\n",
|
|
status
|
|
));
|
|
return(status);
|
|
}
|
|
|
|
//
|
|
// Register for WMI NDIS media status events.
|
|
//
|
|
status = CxWmiPnpLoad();
|
|
if (!NT_SUCCESS(status)) {
|
|
CNPRINT((
|
|
"[CX] Failed to initialize WMI PnP event handlers, "
|
|
"status %lx\n",
|
|
status
|
|
));
|
|
}
|
|
|
|
//
|
|
// Get the FIPS function table. Hold onto the FIPS driver
|
|
// handle so that the FIPS driver cannot unload.
|
|
//
|
|
status = CnpOpenDevice(FIPS_DEVICE_NAME, &CxFipsDriverHandle);
|
|
if (NT_SUCCESS(status)) {
|
|
|
|
status = CnpZwDeviceControl(
|
|
CxFipsDriverHandle,
|
|
IOCTL_FIPS_GET_FUNCTION_TABLE,
|
|
NULL,
|
|
0,
|
|
&CxFipsFunctionTable,
|
|
sizeof(CxFipsFunctionTable)
|
|
);
|
|
if (!NT_SUCCESS(status)) {
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CNP] Failed to fill FIPS function "
|
|
"table, status %x.\n", status));
|
|
}
|
|
}
|
|
|
|
} else {
|
|
CxFipsDriverHandle = NULL;
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CNP] Failed to open FIPS device, "
|
|
"status %x.\n", status));
|
|
}
|
|
}
|
|
if (status != STATUS_SUCCESS) {
|
|
return(status);
|
|
}
|
|
|
|
status = CnpLoadNodes();
|
|
|
|
if (status != STATUS_SUCCESS) {
|
|
return(status);
|
|
}
|
|
|
|
status = CnpLoadNetworks();
|
|
|
|
if (status != STATUS_SUCCESS) {
|
|
return(status);
|
|
}
|
|
|
|
status = CnpLoad();
|
|
|
|
if (status != STATUS_SUCCESS) {
|
|
return(status);
|
|
}
|
|
|
|
status = CcmpLoad();
|
|
|
|
if (status != STATUS_SUCCESS) {
|
|
return(status);
|
|
}
|
|
|
|
status = CxInitializeHeartBeat();
|
|
|
|
if (status != STATUS_SUCCESS) {
|
|
return(status);
|
|
}
|
|
|
|
status = CdpLoad();
|
|
|
|
if (status != STATUS_SUCCESS) {
|
|
return(status);
|
|
}
|
|
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CX] Loaded.\n"));
|
|
}
|
|
|
|
return(STATUS_SUCCESS);
|
|
|
|
} // CxLoad
|
|
|
|
|
|
VOID
|
|
CxUnload(
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called when the Cluster Network driver is unloading. Frees all resources
|
|
allocated by the Cluster Transport.
|
|
|
|
The Transport is guaranteed not to receive any more user-mode requests,
|
|
membership send requests, or membership events at the time
|
|
this routine is called.
|
|
|
|
A shutdown of the Cluster Network driver has already occured when this
|
|
routine is called.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
Notes:
|
|
|
|
This routine MUST be callable even if CxLoad() has not yet been
|
|
called.
|
|
|
|
--*/
|
|
|
|
{
|
|
PAGED_CODE();
|
|
|
|
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CX] Unloading...\n"));
|
|
}
|
|
|
|
CxUnreserveClusnetEndpoint();
|
|
|
|
CdpUnload();
|
|
|
|
CxUnloadHeartBeat();
|
|
|
|
CcmpUnload();
|
|
|
|
CnpUnload();
|
|
|
|
CxWmiPnpUnload();
|
|
|
|
if (CxFipsDriverHandle != NULL) {
|
|
ZwClose(CxFipsDriverHandle);
|
|
CxFipsDriverHandle = NULL;
|
|
}
|
|
|
|
if (CxTdiPnpBindingHandle != NULL) {
|
|
TdiDeregisterPnPHandlers(CxTdiPnpBindingHandle);
|
|
CxTdiPnpBindingHandle = NULL;
|
|
}
|
|
|
|
if (CxTdiRegistrationHandle != NULL) {
|
|
TdiDeregisterDeviceObject(CxTdiRegistrationHandle);
|
|
CxTdiRegistrationHandle = NULL;
|
|
}
|
|
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CX] Unloaded.\n"));
|
|
}
|
|
|
|
return;
|
|
|
|
} // CxUnload
|
|
|
|
|
|
|
|
NTSTATUS
|
|
CxInitialize(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialization routine for the Cluster Transport.
|
|
Called when the Membership Manager is starting up.
|
|
Enables operation of the transport.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
An NT status code.
|
|
|
|
--*/
|
|
{
|
|
NTSTATUS status;
|
|
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CX] Initializing...\n"));
|
|
}
|
|
|
|
EventEpoch = 0;
|
|
CxMulticastEpoch = 0;
|
|
|
|
//
|
|
// Initialize our FIPS-seeded salt generator.
|
|
//
|
|
status = CnpInitializeSaltGenerator();
|
|
if (status != STATUS_SUCCESS) {
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CNP] Failed to initialize FIPS-seeded "
|
|
"random number generator, status %x.\n",
|
|
status));
|
|
}
|
|
return(status);
|
|
}
|
|
|
|
status = CnpInitializeNodes();
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
return(status);
|
|
}
|
|
|
|
status = CnpInitializeNetworks();
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
return(status);
|
|
}
|
|
|
|
status = CxWmiPnpInitialize();
|
|
|
|
if (!NT_SUCCESS(status)) {
|
|
return(status);
|
|
}
|
|
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CX] Initialized...\n"));
|
|
}
|
|
|
|
return(STATUS_SUCCESS);
|
|
|
|
} // CxInitialize
|
|
|
|
|
|
VOID
|
|
CxShutdown(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Terminates operation of the Cluster Transport.
|
|
Called when the Membership Manager is shutting down.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CX] Shutting down...\n"));
|
|
}
|
|
|
|
CnpStopHeartBeats();
|
|
|
|
CxWmiPnpShutdown();
|
|
|
|
CnpShutdownNetworks();
|
|
|
|
CnpShutdownNodes();
|
|
|
|
IF_CNDBG(CN_DEBUG_INIT) {
|
|
CNPRINT(("[CX] Shutdown complete...\n"));
|
|
}
|
|
|
|
return;
|
|
|
|
} // CxShutdown
|
|
|
|
|