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.
296 lines
5.4 KiB
296 lines
5.4 KiB
/*++
|
|
|
|
Copyright 1997 - 98, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
qosmmain.c
|
|
|
|
Abstract:
|
|
|
|
Contains routines that are invoked when
|
|
the QosMgr DLL is loaded or unloaded.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "pchqosm.h"
|
|
|
|
#pragma hdrstop
|
|
|
|
// All Global variables
|
|
QOSMGR_GLOBALS Globals;
|
|
|
|
BOOL
|
|
WINAPI
|
|
DllMain(
|
|
IN HINSTANCE Instance,
|
|
IN DWORD Reason,
|
|
IN PVOID Unused
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This is the DLL's main entrypoint handler which
|
|
initializes the Qos Mgr component.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE if successful, FALSE if not
|
|
|
|
--*/
|
|
|
|
{
|
|
static BOOL QosmInitialized = FALSE;
|
|
|
|
UNREFERENCED_PARAMETER(Unused);
|
|
|
|
switch(Reason)
|
|
{
|
|
case DLL_PROCESS_ATTACH:
|
|
|
|
DisableThreadLibraryCalls(Instance);
|
|
|
|
//
|
|
// Initialize the Qos Mgr Component
|
|
//
|
|
|
|
QosmInitialized = QosmDllStartup();
|
|
|
|
return QosmInitialized;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
|
|
//
|
|
// Cleanup the Qos Mgr Component
|
|
//
|
|
|
|
if (QosmInitialized)
|
|
{
|
|
QosmDllCleanup();
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
QosmDllStartup(
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes all global data structures in Qos Mgr.
|
|
Called by DLL Main when the process is attached.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE if successful, FALSE if not
|
|
|
|
--*/
|
|
|
|
{
|
|
TCI_CLIENT_FUNC_LIST TcHandlers;
|
|
BOOL ListLockInited;
|
|
DWORD Status;
|
|
UINT i;
|
|
|
|
ListLockInited = FALSE;
|
|
|
|
do
|
|
{
|
|
ZeroMemory(&Globals, sizeof(QOSMGR_GLOBALS));
|
|
|
|
// Globals.State = IPQOSMRG_STATE_STOPPED;
|
|
|
|
//
|
|
// Enable logging and tracing for debugging purposes
|
|
//
|
|
|
|
START_TRACING();
|
|
START_LOGGING();
|
|
|
|
#if DBG_TRACE
|
|
Globals.TracingFlags = QOSM_TRACE_ANY;
|
|
#endif
|
|
|
|
//
|
|
// Create a private heap for Qos Mgr's use
|
|
//
|
|
|
|
Globals.GlobalHeap = HeapCreate(0, 0, 0);
|
|
|
|
if (Globals.GlobalHeap == NULL)
|
|
{
|
|
Status = GetLastError();
|
|
|
|
Trace1(ANY,
|
|
"QosmDllStartup: Failed to create a global private heap %x",
|
|
Status);
|
|
|
|
LOGERR0(HEAP_CREATE_FAILED, Status);
|
|
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Initialize lock to guard global list of interfaces
|
|
//
|
|
|
|
try
|
|
{
|
|
CREATE_READ_WRITE_LOCK(&Globals.GlobalsLock);
|
|
|
|
ListLockInited = TRUE;
|
|
}
|
|
except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
Status = GetLastError();
|
|
|
|
Trace1(ANY,
|
|
"QosmDllStartup : Failed to create read/write lock %x",
|
|
Status);
|
|
|
|
LOGERR0(CREATE_RWL_FAILED, Status);
|
|
|
|
break;
|
|
}
|
|
|
|
//
|
|
// Initialize global list and table of active interfaces
|
|
//
|
|
|
|
Globals.NumIfs = 0;
|
|
|
|
InitializeListHead(&Globals.IfList);
|
|
|
|
//
|
|
// Register with the traffic control API to control QOS
|
|
//
|
|
|
|
ZeroMemory(&TcHandlers, sizeof(TCI_CLIENT_FUNC_LIST));
|
|
|
|
TcHandlers.ClNotifyHandler = TcNotifyHandler;
|
|
|
|
Status = TcRegisterClient(CURRENT_TCI_VERSION,
|
|
NULL,
|
|
&TcHandlers,
|
|
&Globals.TciHandle);
|
|
|
|
if (Status != NO_ERROR)
|
|
{
|
|
Trace1(ANY,
|
|
"QosmDllStartup: Failed to register with the TC API %x",
|
|
Status);
|
|
|
|
LOGERR0(TC_REGISTER_FAILED, Status);
|
|
|
|
break;
|
|
}
|
|
|
|
Globals.State = IPQOSMGR_STATE_STARTING;
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
while (FALSE);
|
|
|
|
//
|
|
// Some error occured - clean up and return the error code
|
|
//
|
|
|
|
if (ListLockInited)
|
|
{
|
|
DELETE_READ_WRITE_LOCK(&Globals.GlobalsLock);
|
|
}
|
|
|
|
if (Globals.GlobalHeap != NULL)
|
|
{
|
|
HeapDestroy(Globals.GlobalHeap);
|
|
}
|
|
|
|
STOP_LOGGING();
|
|
STOP_TRACING();
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
BOOL
|
|
QosmDllCleanup(
|
|
VOID
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Cleans up all global data structures at unload time.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE if successful, FALSE if not
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD Status;
|
|
|
|
// We should have freed all ifs to avoid any leaks
|
|
ASSERT(Globals.NumIfs == 0);
|
|
|
|
//
|
|
// Cleanup and deregister with traffic control API
|
|
//
|
|
|
|
Status = TcDeregisterClient(Globals.TciHandle);
|
|
|
|
if (Status != NO_ERROR)
|
|
{
|
|
Trace1(ANY,
|
|
"QosmDllCleanup: Failed to deregister with the TC API %x",
|
|
Status);
|
|
|
|
LOGERR0(TC_DEREGISTER_FAILED, Status);
|
|
}
|
|
|
|
//
|
|
// Free resources allocated like locks and memory
|
|
//
|
|
|
|
DELETE_READ_WRITE_LOCK(&Globals.GlobalsLock);
|
|
|
|
//
|
|
// Cleanup the heap and memory allocated in it
|
|
//
|
|
|
|
HeapDestroy(Globals.GlobalHeap);
|
|
|
|
//
|
|
// Stop debugging aids like tracing and logging
|
|
//
|
|
|
|
STOP_LOGGING();
|
|
STOP_TRACING();
|
|
|
|
return TRUE;
|
|
}
|