/*--------------------------------------------------------------------------- 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; }