//-------------------------------------------------------------------- // W32TClnt - implementation // Copyright (C) Microsoft Corporation, 2000 // // Created by: Louis Thomas (louisth), 2-10-00 // // client side wrappers for w32time RPC calls // #include #include "timeif_c.h" #include "DebugWPrintf.h" #include "ErrorHandling.h" #include "W32TmConsts.h" //-------------------------------------------------------------------- RPC_STATUS SetMyRpcSecurity(handle_t hBinding) { RPC_STATUS RpcStatus; // must be cleaned up WCHAR * wszServerPricipalName=NULL; RpcStatus=RpcMgmtInqServerPrincName(hBinding, RPC_C_AUTHN_GSS_NEGOTIATE, &wszServerPricipalName); if (RPC_S_OK!=RpcStatus) { goto error; } RpcStatus=RpcBindingSetAuthInfo(hBinding, wszServerPricipalName, RPC_C_AUTHN_LEVEL_PKT_INTEGRITY, RPC_C_AUTHN_GSS_NEGOTIATE, NULL, RPC_C_AUTHZ_NONE); error: if (NULL!=wszServerPricipalName) { RpcStringFree(&wszServerPricipalName); } return RpcStatus; } //-------------------------------------------------------------------- RPC_STATUS W32TimeQueryProviderStatus(IN LPCWSTR wszServer, IN DWORD dwFlags, IN LPWSTR pwszProvider, IN DWORD dwProviderType, OUT LPVOID *ppProviderData) { RPC_BINDING_HANDLE hBinding; RPC_STATUS err; W32TIME_PROVIDER_INFO *pProviderInfo = NULL; WCHAR *wszBinding; if (NULL == ppProviderData) return E_INVALIDARG; //DebugWPrintf0(L"Trying \"" L"\\PIPE\\" wszW32TimeSharedProcRpcEndpointName L"\".\n"); err=RpcStringBindingCompose(NULL, L"ncacn_np", (WCHAR *)wszServer, L"\\PIPE\\" wszW32TimeSharedProcRpcEndpointName, NULL, &wszBinding); if(!err) { err=RpcBindingFromStringBinding(wszBinding, &hBinding); RpcStringFree(&wszBinding); SetMyRpcSecurity(hBinding); // ignore retval if(!err) { // ready to try it __try { err=c_W32TimeQueryProviderStatus(hBinding, dwFlags, pwszProvider, &pProviderInfo); } __except( EXCEPTION_EXECUTE_HANDLER ) { err=GetExceptionCode(); } RpcBindingFree(&hBinding); } } // try our alternate name if (RPC_S_UNKNOWN_IF==err || RPC_S_SERVER_UNAVAILABLE==err) { //DebugWPrintf0(L"Trying \"" L"\\PIPE\\" wszW32TimeOwnProcRpcEndpointName L"\".\n"); err=RpcStringBindingCompose(NULL, L"ncacn_np", (WCHAR *)wszServer, L"\\PIPE\\" wszW32TimeOwnProcRpcEndpointName, NULL, &wszBinding); if(!err) { err=RpcBindingFromStringBinding(wszBinding, &hBinding); RpcStringFree(&wszBinding); SetMyRpcSecurity(hBinding); // ignore retval if(!err) { // ready to try it __try { err=c_W32TimeQueryProviderStatus(hBinding, dwFlags, pwszProvider, &pProviderInfo); } __except( EXCEPTION_EXECUTE_HANDLER ) { err=GetExceptionCode(); } RpcBindingFree(&hBinding); } } } if (ERROR_SUCCESS == err) { // We got a provider back, check to make sure we asked for the right provider type: if (dwProviderType != pProviderInfo->ulProviderType) { err = ERROR_INVALID_DATATYPE; } else { // Success! Assign the out param. switch (dwProviderType) { case W32TIME_PROVIDER_TYPE_NTP: *ppProviderData = pProviderInfo->ProviderData.pNtpProviderData; // NULL out the provider data so we don't delete it. pProviderInfo->ProviderData.pNtpProviderData = NULL; break; case W32TIME_PROVIDER_TYPE_HARDWARE: *ppProviderData = pProviderInfo->ProviderData.pHardwareProviderData; // NULL out the provider data so we don't delete it. pProviderInfo->ProviderData.pHardwareProviderData = NULL; break; default: err = ERROR_INVALID_DATATYPE; } } } if (NULL != pProviderInfo) { if (NULL != pProviderInfo->ProviderData.pNtpProviderData) { // pProviderInfo->pProviderData's allocation strategy is allocate(all_nodes) midl_user_free(pProviderInfo->ProviderData.pNtpProviderData); } // pProviderInfo's allocation strategy is allocate(single_node) midl_user_free(pProviderInfo); } return(err); } //-------------------------------------------------------------------- extern "C" DWORD W32TimeSyncNow(IN const WCHAR * wszServer, IN unsigned long ulWaitFlag, IN unsigned long ulFlags) { WCHAR * wszBinding; RPC_STATUS err; RPC_BINDING_HANDLE hBinding; //DebugWPrintf0(L"Trying \"" L"\\PIPE\\" wszW32TimeSharedProcRpcEndpointName L"\".\n"); err=RpcStringBindingCompose(NULL, L"ncacn_np", (WCHAR *)wszServer, L"\\PIPE\\" wszW32TimeSharedProcRpcEndpointName, NULL, &wszBinding); if(!err) { err=RpcBindingFromStringBinding(wszBinding, &hBinding); RpcStringFree(&wszBinding); SetMyRpcSecurity(hBinding); // ignore retval if(!err) { // ready to try it __try { err=c_W32TimeSync(hBinding, ulWaitFlag, ulFlags); } __except( EXCEPTION_EXECUTE_HANDLER ) { err=GetExceptionCode(); } RpcBindingFree(&hBinding); } } // try our alternate name if (RPC_S_UNKNOWN_IF==err || RPC_S_SERVER_UNAVAILABLE==err) { //DebugWPrintf0(L"Trying \"" L"\\PIPE\\" wszW32TimeOwnProcRpcEndpointName L"\".\n"); err=RpcStringBindingCompose(NULL, L"ncacn_np", (WCHAR *)wszServer, L"\\PIPE\\" wszW32TimeOwnProcRpcEndpointName, NULL, &wszBinding); if(!err) { err=RpcBindingFromStringBinding(wszBinding, &hBinding); RpcStringFree(&wszBinding); SetMyRpcSecurity(hBinding); // ignore retval if(!err) { // ready to try it __try { err=c_W32TimeSync(hBinding, ulWaitFlag, ulFlags); } __except( EXCEPTION_EXECUTE_HANDLER ) { err=GetExceptionCode(); } RpcBindingFree(&hBinding); } } } return(err); } //-------------------------------------------------------------------- // Netlogon can call this function and get our service bits if we start // before they do. Note that we tell and they ask, and depending upon // who started up first one of the two will be succesful. Either way, // the flags will be set correctly. extern "C" DWORD W32TimeGetNetlogonServiceBits(IN const WCHAR * wszServer, OUT unsigned long * pulBits) { WCHAR * wszBinding; RPC_STATUS err; RPC_BINDING_HANDLE hBinding; if (NULL==pulBits) { return ERROR_INVALID_PARAMETER; } //DebugWPrintf0(L"Trying \"" L"\\PIPE\\" wszW32TimeSharedProcRpcEndpointName L"\".\n"); err=RpcStringBindingCompose(NULL, L"ncacn_np", (WCHAR *)wszServer, L"\\PIPE\\" wszW32TimeSharedProcRpcEndpointName, NULL, &wszBinding); if(!err){ err=RpcBindingFromStringBinding(wszBinding, &hBinding); RpcStringFree(&wszBinding); if(!err) { // ready to try it __try { *pulBits=c_W32TimeGetNetlogonServiceBits(hBinding); } __except(EXCEPTION_EXECUTE_HANDLER) { err=GetExceptionCode(); } RpcBindingFree(&hBinding); } } // try our alternate name if (RPC_S_UNKNOWN_IF==err || RPC_S_SERVER_UNAVAILABLE==err) { //DebugWPrintf0(L"Trying \"" L"\\PIPE\\" wszW32TimeOwnProcRpcEndpointName L"\".\n"); err=RpcStringBindingCompose(NULL, L"ncacn_np", (WCHAR *)wszServer, L"\\PIPE\\" wszW32TimeOwnProcRpcEndpointName, NULL, &wszBinding); if(!err){ err=RpcBindingFromStringBinding(wszBinding, &hBinding); RpcStringFree(&wszBinding); if(!err) { // ready to try it __try { *pulBits=c_W32TimeGetNetlogonServiceBits(hBinding); } __except(EXCEPTION_EXECUTE_HANDLER) { err=GetExceptionCode(); } RpcBindingFree(&hBinding); } } } return(err); } //-------------------------------------------------------------------- extern "C" DWORD W32TimeQueryHardwareProviderStatus(IN const WCHAR * pwszServer, IN DWORD dwFlags, IN LPWSTR pwszProvider, OUT W32TIME_HARDWARE_PROVIDER_DATA **ppProviderData) { return W32TimeQueryProviderStatus (pwszServer, dwFlags, pwszProvider, W32TIME_PROVIDER_TYPE_HARDWARE, (LPVOID *)ppProviderData); } //-------------------------------------------------------------------- extern "C" DWORD W32TimeQueryNTPProviderStatus(IN LPCWSTR pwszServer, IN DWORD dwFlags, IN LPWSTR pwszProvider, OUT W32TIME_NTP_PROVIDER_DATA **ppProviderData) { return W32TimeQueryProviderStatus (pwszServer, dwFlags, pwszProvider, W32TIME_PROVIDER_TYPE_NTP, (LPVOID *)ppProviderData); } //-------------------------------------------------------------------- extern "C" void W32TimeBufferFree(IN LPVOID pvBuffer) { midl_user_free(pvBuffer); }