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.
224 lines
5.1 KiB
224 lines
5.1 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
tktrenew.cxx
|
|
|
|
Abstract:
|
|
|
|
tktrenew
|
|
|
|
Author:
|
|
|
|
Larry Zhu (LZhu) January 14, 2002 Created
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.hxx"
|
|
#pragma hdrstop
|
|
|
|
#include "tktrenew.hxx"
|
|
|
|
typedef
|
|
VOID
|
|
(* PFuncKerbTgtRenewalTrigger)(
|
|
VOID * TaskHandle,
|
|
VOID * TaskItem
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(* PFuncKerbTgtRenewalReaper)(
|
|
VOID * TaskItem
|
|
);
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(* PFunKerbAddScavengerTask)(
|
|
IN BOOLEAN Periodic,
|
|
IN LONG Interval,
|
|
IN ULONG Flags,
|
|
IN PFuncKerbTgtRenewalTrigger pfnTrigger,
|
|
IN PFuncKerbTgtRenewalReaper pfnDestroy,
|
|
IN VOID * TaskItem,
|
|
OUT OPTIONAL VOID ** TaskHandle
|
|
);
|
|
|
|
typedef struct _KERBEROS_LIST_ENTRY {
|
|
LIST_ENTRY Next;
|
|
ULONG ReferenceCount;
|
|
} KERBEROS_LIST_ENTRY, *PKERBEROS_LIST_ENTRY;
|
|
|
|
typedef struct _KERB_TICKET_CACHE_ENTRY {
|
|
KERBEROS_LIST_ENTRY ListEntry;
|
|
volatile LONG Linked;
|
|
PKERB_INTERNAL_NAME ServiceName;
|
|
PKERB_INTERNAL_NAME TargetName;
|
|
UNICODE_STRING DomainName;
|
|
UNICODE_STRING TargetDomainName;
|
|
UNICODE_STRING AltTargetDomainName;
|
|
UNICODE_STRING ClientDomainName;
|
|
PKERB_INTERNAL_NAME ClientName;
|
|
PKERB_INTERNAL_NAME AltClientName;
|
|
ULONG TicketFlags;
|
|
ULONG CacheFlags;
|
|
KERB_ENCRYPTION_KEY SessionKey;
|
|
KERB_ENCRYPTION_KEY CredentialKey; // used for pkiint only.
|
|
TimeStamp StartTime;
|
|
TimeStamp EndTime;
|
|
TimeStamp RenewUntil;
|
|
KERB_TICKET Ticket;
|
|
TimeStamp TimeSkew;
|
|
void * ScavengerHandle;
|
|
#if DBG
|
|
LIST_ENTRY GlobalListEntry;
|
|
#endif
|
|
} KERB_TICKET_CACHE_ENTRY, *PKERB_TICKET_CACHE_ENTRY;
|
|
|
|
BOOL
|
|
DllMain(
|
|
IN HANDLE hModule,
|
|
IN DWORD dwReason,
|
|
IN DWORD dwReserved
|
|
)
|
|
{
|
|
return DllMainDefaultHandler(hModule, dwReason, dwReason);
|
|
}
|
|
|
|
#if 0
|
|
|
|
Return Values for Start():
|
|
|
|
ERROR_NO_MORE_USER_HANDLES unload repeatedly
|
|
ERROR_SERVER_HAS_OPEN_HANDLES no unload at all
|
|
others unload once
|
|
|
|
#endif 0
|
|
|
|
int
|
|
Start(
|
|
IN ULONG cbParameters,
|
|
IN VOID* pvParameters
|
|
)
|
|
{
|
|
// do your stuff
|
|
|
|
THResult hRetval;
|
|
|
|
PFunKerbAddScavengerTask pFuncAddScan = NULL;
|
|
PFuncKerbTgtRenewalTrigger pFuncTrig = NULL;
|
|
PFuncKerbTgtRenewalReaper pFuncReaper = NULL;
|
|
KERB_TICKET_CACHE_ENTRY* pCacheEntry = NULL;
|
|
|
|
hRetval DBGCHK = (cbParameters == (4 * sizeof(long) + 1)) ? S_OK : E_INVALIDARG;
|
|
|
|
if (SUCCEEDED(hRetval))
|
|
{
|
|
UCHAR* pParam = (UCHAR*) pvParameters;
|
|
|
|
pFuncAddScan = (PFunKerbAddScavengerTask) (ULONG_PTR) *((ULONG*) pvParameters);
|
|
pFuncTrig = (PFuncKerbTgtRenewalTrigger) (ULONG_PTR) *((ULONG*) (pParam + sizeof(long)) );
|
|
pFuncReaper = (PFuncKerbTgtRenewalReaper) (ULONG_PTR) *((ULONG*) (pParam + 2 * sizeof(long)) );
|
|
pCacheEntry = (KERB_TICKET_CACHE_ENTRY*) (ULONG_PTR) *((ULONG*) (pParam + 3 * sizeof(long)) );
|
|
|
|
SspiPrint(SSPI_LOG, TEXT("pFuncAddScan %p, pFuncTrig %p, pFuncReaper %p, pCacheEntry %p\n"),
|
|
pFuncAddScan, pFuncTrig, pFuncReaper, pCacheEntry);
|
|
}
|
|
|
|
if (SUCCEEDED(hRetval))
|
|
{
|
|
hRetval DBGCHK = (*pFuncAddScan)(
|
|
FALSE,
|
|
0,
|
|
0,
|
|
pFuncTrig,
|
|
pFuncReaper,
|
|
pCacheEntry,
|
|
&pCacheEntry->ScavengerHandle
|
|
);
|
|
}
|
|
|
|
return HRESULT_CODE(hRetval);
|
|
}
|
|
|
|
int
|
|
RunIt(
|
|
IN ULONG cbParameters,
|
|
IN VOID* pvParameters
|
|
)
|
|
{
|
|
|
|
//
|
|
// RunItDefaultHandler calls Start() and adds try except
|
|
//
|
|
|
|
return RunItDefaultHandler(cbParameters, pvParameters);
|
|
}
|
|
|
|
int
|
|
Init(
|
|
IN ULONG argc,
|
|
IN PCSTR argv[],
|
|
OUT ULONG* pcbParameters,
|
|
OUT VOID** ppvParameters
|
|
)
|
|
{
|
|
DWORD dwErr = ERROR_SUCCESS;
|
|
CHAR Parameters[REMOTE_PACKET_SIZE] = {0};
|
|
ULONG cbBuffer = sizeof(Parameters);
|
|
ULONG cbParameter = 0;
|
|
|
|
DebugPrintf(SSPI_LOG, "Init: Hello world!\n");
|
|
|
|
*pcbParameters = 0;
|
|
*ppvParameters = NULL;
|
|
|
|
if (argc == 4)
|
|
{
|
|
for (ULONG i = 0; i < argc; i++)
|
|
{
|
|
ULONG temp = strtol(argv[i], NULL, 0);
|
|
memcpy(Parameters + cbParameter, &temp, sizeof(long));
|
|
cbParameter += sizeof(long);
|
|
}
|
|
cbParameter++; // add a NULL
|
|
dwErr = ERROR_SUCCESS;
|
|
}
|
|
else // return "Usage" in ppvParameters, must be a NULL terminated string
|
|
{
|
|
strcpy(Parameters, "<KerbAddScavengerTask> <KerbTgtRenewalTrigger> <KerbTgtRenewalReaper> <CacheEntry>");
|
|
cbParameter = strlen(Parameters) + 1;
|
|
|
|
dwErr = ERROR_INVALID_PARAMETER; // will display usage
|
|
}
|
|
|
|
*ppvParameters = new CHAR[cbParameter];
|
|
if (*ppvParameters)
|
|
{
|
|
*pcbParameters = cbParameter;
|
|
memcpy(*ppvParameters, Parameters, *pcbParameters);
|
|
}
|
|
else
|
|
{
|
|
dwErr = ERROR_OUTOFMEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
#if 0
|
|
|
|
dwErr = ERROR_CONTINUE; // use the default Init handler in injecter
|
|
|
|
#endif
|
|
|
|
Cleanup:
|
|
|
|
return dwErr;
|
|
}
|