313 lines
9.5 KiB
C++
313 lines
9.5 KiB
C++
|
/*---------------------------------------------------------------------------
|
|||
|
File: PwdSvc.cpp
|
|||
|
|
|||
|
Comments: entry point functions and other exported functions for ADMT's
|
|||
|
password migration Lsa notification package.
|
|||
|
|
|||
|
REVISION LOG ENTRY
|
|||
|
Revision By: Paul Thompson
|
|||
|
Revised on 09/06/00
|
|||
|
|
|||
|
---------------------------------------------------------------------------
|
|||
|
*/
|
|||
|
|
|||
|
#include "Pwd.h"
|
|||
|
#include "PwdSvc.h"
|
|||
|
#include "PwdSvc_s.c"
|
|||
|
|
|||
|
// These global variables can be changed if required
|
|||
|
#define gsPwdProtoSeq TEXT("ncacn_np")
|
|||
|
#define gsPwdEndPoint TEXT("\\pipe\\PwdMigRpc")
|
|||
|
DWORD gPwdRpcMinThreads = 1;
|
|||
|
DWORD gPwdRpcMaxThreads = RPC_C_LISTEN_MAX_CALLS_DEFAULT;
|
|||
|
|
|||
|
#ifndef STATUS_SUCCESS
|
|||
|
#define STATUS_SUCCESS ((NTSTATUS) 0x00000000L)
|
|||
|
#endif
|
|||
|
|
|||
|
extern "C"
|
|||
|
{
|
|||
|
BOOL WINAPI _CRT_INIT( HANDLE hInstance, DWORD nReason, LPVOID pReserved );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
/*********************************************************************
|
|||
|
* *
|
|||
|
* Written by: Paul Thompson *
|
|||
|
* Date: 7 SEPT 2000 *
|
|||
|
* *
|
|||
|
* This function is called by Lsa when trying to load all *
|
|||
|
* registered Lsa password filter notification dlls. Here we will *
|
|||
|
* initialize the RPC run-time library to handle our ADMT password *
|
|||
|
* migration RPC interface and to begin looking for RPC calls. If we*
|
|||
|
* fail to successfully setup our RPC, we will return FALSE from this*
|
|||
|
* function which will cause Lsa not to load this password filter *
|
|||
|
* Dll. *
|
|||
|
* Note that the other two password filter dll functions: *
|
|||
|
* PasswordChangeNotify and PasswordFilter do nothing at this point *
|
|||
|
* in time. *
|
|||
|
* *
|
|||
|
*********************************************************************/
|
|||
|
|
|||
|
//BEGIN InitializeChangeNotify
|
|||
|
BOOLEAN __stdcall InitializeChangeNotify()
|
|||
|
{
|
|||
|
/* local variables */
|
|||
|
RPC_STATUS rc = 0;
|
|||
|
BOOLEAN bSuccess = FALSE;
|
|||
|
// FILE * dbgFile;
|
|||
|
|
|||
|
/* function body */
|
|||
|
// dbgFile = _wfopen(L"c:\\aa.txt", L"w+");
|
|||
|
// fwprintf(dbgFile, L"Entering InitializeChangeNotify\n");
|
|||
|
// MessageBeep(-1);
|
|||
|
// specify protocol sequence and endpoint
|
|||
|
// for receiving remote procedure calls
|
|||
|
rc = RpcServerUseProtseqEp(gsPwdProtoSeq,
|
|||
|
RPC_C_PROTSEQ_MAX_REQS_DEFAULT,
|
|||
|
gsPwdEndPoint,
|
|||
|
NULL );
|
|||
|
if (rc == RPC_S_OK)
|
|||
|
{
|
|||
|
// fwprintf(dbgFile, L"RpcServerUseProtseqEp Succeeded!\n");
|
|||
|
// register an interface with the RPC run-time library
|
|||
|
rc = RpcServerRegisterIf(PwdMigRpc_ServerIfHandle, NULL, NULL);
|
|||
|
if (rc == RPC_S_OK)
|
|||
|
{
|
|||
|
// fwprintf(dbgFile, L"RpcServerRegisterIf Succeeded!\n");
|
|||
|
//set the authenification for this RPC interface
|
|||
|
rc = RpcServerRegisterAuthInfo(NULL, RPC_C_AUTHN_WINNT, NULL, NULL);
|
|||
|
if (rc == RPC_S_OK)
|
|||
|
{
|
|||
|
// fwprintf(dbgFile, L"RpcServerRegisterAuthInfo Succeeded!\n");
|
|||
|
// listen for remote procedure calls
|
|||
|
rc = RpcServerListen(gPwdRpcMinThreads,
|
|||
|
gPwdRpcMaxThreads,
|
|||
|
FALSE );
|
|||
|
if (rc != RPC_S_OK)
|
|||
|
{
|
|||
|
// fwprintf(dbgFile, L"RpcServerListen Failed!\n");
|
|||
|
switch (rc)
|
|||
|
{
|
|||
|
case RPC_S_ALREADY_LISTENING:
|
|||
|
// fwprintf(dbgFile, L"RPC_S_ALREADY_LISTENING\n");
|
|||
|
//if already listening, that's fine
|
|||
|
bSuccess = TRUE;
|
|||
|
break;
|
|||
|
case RPC_S_NO_PROTSEQS_REGISTERED:
|
|||
|
// fwprintf(dbgFile, L"RPC_S_NO_PROTSEQS_REGISTERED\n");
|
|||
|
break;
|
|||
|
case RPC_S_MAX_CALLS_TOO_SMALL:
|
|||
|
// fwprintf(dbgFile, L"RPC_S_MAX_CALLS_TOO_SMALL\n");
|
|||
|
break;
|
|||
|
default:
|
|||
|
// fwprintf(dbgFile, L"Unknown\n");
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
//else success, set return value to load this dll as an
|
|||
|
//Lsa password filter dll
|
|||
|
else
|
|||
|
// {
|
|||
|
// fwprintf(dbgFile, L"RpcServerListen Succeeded!\n");
|
|||
|
bSuccess = TRUE;
|
|||
|
// }
|
|||
|
}
|
|||
|
// else
|
|||
|
// fwprintf(dbgFile, L"RpcServerRegisterAuthInfo Failed!\n");
|
|||
|
|
|||
|
// unregister an interface with the RPC run-time library
|
|||
|
// rc = RpcServerUnregisterIf(PwdMigRpc_ServerIfHandle, NULL, NULL);
|
|||
|
}
|
|||
|
// else
|
|||
|
// fwprintf(dbgFile, L"RpcServerRegisterIf Failed!\n");
|
|||
|
}//end if set protocal sequence and end point set
|
|||
|
else
|
|||
|
{
|
|||
|
// fwprintf(dbgFile, L"RpcServerUseProtseqEp Failed!\n");
|
|||
|
switch (rc)
|
|||
|
{
|
|||
|
case RPC_S_PROTSEQ_NOT_SUPPORTED:
|
|||
|
// fwprintf(dbgFile, L"RPC_S_PROTSEQ_NOT_SUPPORTED\n");
|
|||
|
break;
|
|||
|
case RPC_S_INVALID_RPC_PROTSEQ:
|
|||
|
// fwprintf(dbgFile, L"RPC_S_INVALID_RPC_PROTSEQ\n");
|
|||
|
break;
|
|||
|
case RPC_S_INVALID_ENDPOINT_FORMAT:
|
|||
|
// fwprintf(dbgFile, L"RPC_S_INVALID_ENDPOINT_FORMAT\n");
|
|||
|
break;
|
|||
|
case RPC_S_OUT_OF_MEMORY:
|
|||
|
// fwprintf(dbgFile, L"RPC_S_OUT_OF_MEMORY\n");
|
|||
|
break;
|
|||
|
case RPC_S_DUPLICATE_ENDPOINT:
|
|||
|
// fwprintf(dbgFile, L"RPC_S_DUPLICATE_ENDPOINT\n");
|
|||
|
break;
|
|||
|
case RPC_S_INVALID_SECURITY_DESC:
|
|||
|
// fwprintf(dbgFile, L"RPC_S_INVALID_SECURITY_DESC\n");
|
|||
|
break;
|
|||
|
default:
|
|||
|
// fwprintf(dbgFile, L"Unknown\n");
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//if we successfully initialized our RPC interface, now open SAM
|
|||
|
//handles used later in our Interface function CopyPassword
|
|||
|
// if (bSuccess)
|
|||
|
// bSuccess = ConnectToSam();
|
|||
|
|
|||
|
// fwprintf(dbgFile, L"Leaving InitializeChangeNotify\n");
|
|||
|
// fclose(dbgFile);
|
|||
|
|
|||
|
//initialize a critical section to be used on the very first RPC call
|
|||
|
__try
|
|||
|
{
|
|||
|
InitializeCriticalSection (&csADMTCriticalSection);
|
|||
|
}
|
|||
|
__except (EXCEPTION_EXECUTE_HANDLER)
|
|||
|
{
|
|||
|
;
|
|||
|
}
|
|||
|
|
|||
|
return bSuccess;
|
|||
|
}
|
|||
|
//END InitializeChangeNotify
|
|||
|
|
|||
|
/*********************************************************************
|
|||
|
* *
|
|||
|
* Written by: Paul Thompson *
|
|||
|
* Date: 7 SEPT 2000 *
|
|||
|
* *
|
|||
|
* This function is called by Lsa for all registered Lsa password*
|
|||
|
* filter notification dlls when a password in the domain has been *
|
|||
|
* modified. We will simply return STATUS_SUCCESS and do nothing. *
|
|||
|
* *
|
|||
|
*********************************************************************/
|
|||
|
|
|||
|
//BEGIN PasswordChangeNotify
|
|||
|
NTSTATUS __stdcall PasswordChangeNotify(PUNICODE_STRING UserName, ULONG RelativeId,
|
|||
|
PUNICODE_STRING NewPassword)
|
|||
|
{
|
|||
|
return STATUS_SUCCESS;
|
|||
|
}
|
|||
|
|
|||
|
/*********************************************************************
|
|||
|
* *
|
|||
|
* Written by: Paul Thompson *
|
|||
|
* Date: 7 SEPT 2000 *
|
|||
|
* *
|
|||
|
* This function is called by Lsa for all registered Lsa password*
|
|||
|
* filter notification dlls when a password in the domain is being *
|
|||
|
* modified. This function is designed to indicate to Lsa if the new*
|
|||
|
* password is acceptable. We will simply return TRUE (indicating it*
|
|||
|
* is acceptable) and do nothing. *
|
|||
|
* *
|
|||
|
*********************************************************************/
|
|||
|
|
|||
|
//BEGIN PasswordFilter
|
|||
|
BOOLEAN __stdcall PasswordFilter(PUNICODE_STRING AccountName, PUNICODE_STRING FullName,
|
|||
|
PUNICODE_STRING Password, BOOLEAN SetOperation)
|
|||
|
{
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
//END PasswordFilter
|
|||
|
|
|||
|
|
|||
|
/***************************/
|
|||
|
/* Internal DLL functions. */
|
|||
|
/***************************/
|
|||
|
|
|||
|
static BOOL Initialize(void)
|
|||
|
{
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
static BOOL Terminate(BOOL procterm)
|
|||
|
{
|
|||
|
|
|||
|
if (!procterm)
|
|||
|
return TRUE;
|
|||
|
|
|||
|
/* XXX Do stuff here */
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL WINAPI
|
|||
|
DllMain(HINSTANCE hinst, DWORD reason, VOID *rsvd)
|
|||
|
/*++
|
|||
|
|
|||
|
Routine description:
|
|||
|
|
|||
|
Dynamic link library entry point. Does nothing meaningful.
|
|||
|
|
|||
|
|
|||
|
Arguments:
|
|||
|
|
|||
|
hinst = handle for the DLL
|
|||
|
reason = code indicating reason for call
|
|||
|
rsvd = for process attach: non-NULL => process startup
|
|||
|
for process detach: non-NULL => process termination
|
|||
|
|
|||
|
Return value:
|
|||
|
|
|||
|
status = success/failure
|
|||
|
|
|||
|
Side effects:
|
|||
|
|
|||
|
None
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
{
|
|||
|
switch (reason) {
|
|||
|
|
|||
|
case DLL_PROCESS_ATTACH:
|
|||
|
{
|
|||
|
_CRT_INIT(hinst, reason, rsvd);
|
|||
|
return Initialize();
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case DLL_PROCESS_DETACH:
|
|||
|
{
|
|||
|
BOOL bStat = Terminate(rsvd != NULL);
|
|||
|
_CRT_INIT(hinst, reason, rsvd);
|
|||
|
return bStat;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
case DLL_THREAD_ATTACH:
|
|||
|
case DLL_THREAD_DETACH:
|
|||
|
return TRUE;
|
|||
|
|
|||
|
default:
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// Midl allocate memory
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
void __RPC_FAR * __RPC_USER
|
|||
|
midl_user_allocate(
|
|||
|
size_t len )
|
|||
|
{
|
|||
|
return new char[len];
|
|||
|
}
|
|||
|
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
// Midl free memory
|
|||
|
///////////////////////////////////////////////////////////////////////////////
|
|||
|
|
|||
|
void __RPC_USER
|
|||
|
midl_user_free(
|
|||
|
void __RPC_FAR * ptr )
|
|||
|
{
|
|||
|
delete [] ptr;
|
|||
|
}
|
|||
|
|