windows-nt/Source/XPSP1/NT/ds/netapi/svcdlls/lls/server/scaven.c
2020-09-26 16:20:57 +08:00

212 lines
4 KiB
C

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
scaven.c
Abstract:
Author:
Arthur Hanson (arth) 06-Jan-1995
Revision History:
Jeff Parham (jeffparh) 05-Dec-1995
o Added periodic logging of certificate agreement violations.
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <dsgetdc.h>
#include "llsapi.h"
#include "debug.h"
#include "llsutil.h"
#include "llssrv.h"
#include "registry.h"
#include "ntlsapi.h"
#include "mapping.h"
#include "msvctbl.h"
#include "svctbl.h"
#include "purchase.h"
#include "perseat.h"
#include "server.h"
#include "repl.h"
#include "llsevent.h"
#include "llsrpc_s.h"
#include "certdb.h"
NTSTATUS LLSDataSave();
/////////////////////////////////////////////////////////////////////////
VOID
ScavengerThread (
IN PVOID ThreadParameter
)
/*++
Routine Description:
Arguments:
ThreadParameter - Indicates how many active threads there currently
are.
Return Value:
None.
--*/
{
ULONG i;
ULONG Count = 0;
//
// Just wait around forver waiting to service things.
//
while (TRUE) {
//
// Wait 15 minutes before checking things out.
//
Sleep(900000L);
#if DELAY_INITIALIZATION
EnsureInitialized();
#endif
#if DBG
if (TraceFlags & TRACE_FUNCTION_TRACE)
dprintf(TEXT("LLS TRACE: ScavengerThread waking up\n"));
#endif
//
// Update HighMark for local table
//
LocalServerServiceListHighMarkUpdate();
//
// Hmm, lets check replication...
//
ConfigInfoRegistryUpdate();
RtlEnterCriticalSection(&ConfigInfoLock);
if (ConfigInfo.Replicate) {
//
// If we are past replication time then do it
//
if (DateLocalGet() > ConfigInfo.NextReplication) {
RtlLeaveCriticalSection(&ConfigInfoLock);
NtSetEvent( ReplicationEvent, NULL );
}
else {
RtlLeaveCriticalSection(&ConfigInfoLock);
}
}
else {
RtlLeaveCriticalSection(&ConfigInfoLock);
}
//
// Now update our last used time
//
RtlAcquireResourceExclusive(&UserListLock, TRUE);
LastUsedTime = DateSystemGet();
RtlReleaseResource(&UserListLock);
//
// Check stuff every 6 hours (4 * 15 minutes)
//
Count++;
if (Count > (6 * 4)) {
// Reset counter
Count = 0;
//
// Save out the data
//
LLSDataSave();
//
// Save HighMark to registry
//
LocalServiceListHighMarkSet();
if (IsMaster) {
//
// Check for license compliance
//
RtlAcquireResourceShared(&MasterServiceListLock, TRUE);
for (i = 0; i < MasterServiceListSize; i++) {
if (MasterServiceList[i]->LicensesUsed > MasterServiceList[i]->Licenses) {
LPWSTR SubString[1];
//
// Notify the system
//
SubString[0] = (LPWSTR) MasterServiceList[i]->Name;
LogEvent(LLS_EVENT_PRODUCT_NO_LICENSE, 1, SubString, ERROR_SUCCESS);
}
}
RtlReleaseResource(&MasterServiceListLock);
// log certificate violations
CertDbLogViolations();
}
}
}
} // ScavengerThread
/////////////////////////////////////////////////////////////////////////
VOID
ScavengerInit( )
/*++
Routine Description:
Looks in registry for given service and sets values accordingly.
Arguments:
Return Value:
None.
--*/
{
HANDLE Thread;
DWORD Ignore;
//
// Just dispatch our scavenger thread
//
Thread = CreateThread(
NULL,
0L,
(LPTHREAD_START_ROUTINE) ScavengerThread,
0L,
0L,
&Ignore
);
if (NULL != Thread)
CloseHandle(Thread);
} // ScavengerInit