//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997 - 2000 // // File: H N A P I M G R. C P P // // Contents: OEM API // // Notes: // // Author: billi 21 Nov 2000 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include #include HINSTANCE g_hOemInstance = NULL; BOOLEAN g_fOemNotifyUser = TRUE; BOOLEAN g_fSavedNotifyState = FALSE; BOOLEAN IsSecureContext() /*++ IsSecureContext Routine Description: This routine checks if the current user belongs to an Administrator Group. Arguments: none Return Value: TRUE = Current process does belong to an Administrator group FALSE = Current process does Not belong to an Administrator group --*/ { PSID psidAdministrators; BOOL bIsAdministrator = FALSE; SID_IDENTIFIER_AUTHORITY siaNtAuthority = SECURITY_NT_AUTHORITY; BOOL bResult = AllocateAndInitializeSid( &siaNtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &psidAdministrators ); _ASSERT( bResult ); if ( bResult ) { bResult = CheckTokenMembership( NULL, psidAdministrators, &bIsAdministrator ); _ASSERT( bResult ); FreeSid( psidAdministrators ); } return (BOOLEAN)bIsAdministrator; } /*++ CenterWindow Routine Description: Arguments: none Return Value: none --*/ BOOLEAN CenterDialog( HWND hwndDlg // handle to dialog box ) { RECT rcDlg, rcDesktop; HWND hwndDesktop; hwndDesktop = GetDesktopWindow(); if ( GetWindowRect( hwndDlg, &rcDlg ) && GetWindowRect( hwndDesktop, &rcDesktop ) ) { RECT rcCenter; // Create a rectangle in the middle of the screen rcDesktop.right -= rcDesktop.left; rcDlg.right -= rcDlg.left; rcDesktop.bottom -= rcDesktop.top; rcDlg.bottom -= rcDlg.top; if ( rcDesktop.right > rcDlg.right ) { rcCenter.left = rcDesktop.left + ((rcDesktop.right - rcDlg.right) / 2); rcCenter.right = rcCenter.left + rcDlg.right; } else { rcCenter.left = rcDesktop.left; rcCenter.right = rcDesktop.right; } if ( rcDesktop.bottom > rcDlg.bottom ) { rcCenter.top = rcDesktop.top + ((rcDesktop.bottom - rcDlg.bottom) / 2); rcCenter.bottom = rcCenter.top + rcDlg.bottom; } else { rcCenter.top = rcDesktop.top; rcCenter.bottom = rcDesktop.bottom; } return (BOOLEAN)SetWindowPos( hwndDlg, NULL, rcCenter.left, rcCenter.top, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOZORDER ); } return FALSE; } INT_PTR CALLBACK OemNotifyDialogProc( HWND hwndDlg, // handle to dialog box UINT uMsg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) /*++ OemNotifyDialogProc Routine Description: Arguments: none Return Value: none --*/ { switch ( uMsg ) { case WM_INITDIALOG: if ( CenterDialog( hwndDlg ) ) { LPTSTR lpszFmt = new TCHAR[ NOTIFYFORMATBUFFERSIZE ]; if ( NULL != lpszFmt ) { if ( LoadString( g_hOemInstance, IDS_SECURITYNOTIFICATIONTEXT, lpszFmt, NOTIFYFORMATBUFFERSIZE ) > 0 ) { TCHAR lpszCmdLine[MAX_PATH*2+1] = {0}; GetModuleFileName (NULL, lpszCmdLine, MAX_PATH*2); LPTSTR lpszMsg = new TCHAR[ lstrlen(lpszCmdLine)*2 + lstrlen(lpszFmt) + 2 ]; if ( NULL != lpszMsg ) { wsprintf( lpszMsg, lpszFmt, lpszCmdLine, lpszCmdLine ); SetDlgItemText( hwndDlg, IDC_TXT_NOTIFICATION, lpszMsg ); delete lpszMsg; } } delete lpszFmt; } } break; case WM_COMMAND: switch ( LOWORD(wParam) ) { case IDOK: // Fall through. case IDCANCEL: if ( IsDlgButtonChecked( hwndDlg, IDC_CHK_DISABLESHARESECURITYWARN ) == BST_CHECKED ) { g_fOemNotifyUser = FALSE; } EndDialog( hwndDlg, wParam ); return TRUE; } break; } return FALSE; } BOOLEAN IsNotifyApproved() /*++ IsNotifyApproved Routine Description: IsSecureContext, g_fOemNotifyUser, g_fSavedNotifyState, DialogBox determine the value returned. IsSecureContext MUST be TRUE to return TRUE. g_fSavedNotifyState holds the value returned by DialogBox on the previous call. Arguments: none Return Value: TRUE FALSE --*/ { BOOLEAN bApproved = FALSE; if ( IsSecureContext() ) { if ( g_fOemNotifyUser ) { g_fSavedNotifyState = ( DialogBox( g_hOemInstance, MAKEINTRESOURCE(IDD_SecurityNotification), NULL, OemNotifyDialogProc ) == IDOK ) ? TRUE : FALSE; g_fOemNotifyUser = FALSE; } bApproved = g_fSavedNotifyState; } return bApproved; } HRESULT InitializeOemApi( HINSTANCE hInstance ) /*++ InitializedOemApi Routine Description: Arguments: none Return Value: HRESULT --*/ { g_hOemInstance = hInstance; g_fOemNotifyUser = TRUE; g_fSavedNotifyState = FALSE; return S_OK; } HRESULT ReleaseOemApi() /*++ ReleaseOemApi Routine Description: Arguments: none Return Value: HRESULT --*/ { g_hOemInstance = NULL; return S_OK; } static HRESULT _ObtainCfgMgrObj( IHNetCfgMgr** ppHNetCfgMgr) /*++ _ObtainCfgMgrObj Routine Description: Arguments: none Return Value: none --*/ { HRESULT hr = S_OK; if ( NULL == ppHNetCfgMgr ) { hr = E_POINTER; } else { hr = CoCreateInstance( CLSID_HNetCfgMgr, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IHNetCfgMgr, ppHNetCfgMgr) ); _ASSERT(NULL != *ppHNetCfgMgr); } return hr; } /*++ _ObtainIcsSettingsObj Routine Description: Arguments: ppIcs - Return Value: HRESULT --*/ HRESULT _ObtainIcsSettingsObj( IHNetIcsSettings** ppIcsSettings ) { HRESULT hr; IHNetCfgMgr* pCfgMgr; hr = _ObtainCfgMgrObj( &pCfgMgr ); if ( SUCCEEDED(hr) ) { // Obtain interface pointer to the ICS Settings and enumerator for // public connections hr = pCfgMgr->QueryInterface( IID_PPV_ARG(IHNetIcsSettings, ppIcsSettings) ); ReleaseObj( pCfgMgr ); } return hr; } HRESULT CNetSharingConfiguration::Initialize( INetConnection *pNetConnection ) /*++ CNetSharingConfiguration::Initialize Routine Description: Arguments: none Return Value: none --*/ { HRESULT hr; IHNetCfgMgr* pCfgMgr; hr = _ObtainCfgMgrObj( &pCfgMgr ); if ( SUCCEEDED(hr) ) { IHNetConnection* pHNetConnection; hr = pCfgMgr->GetIHNetConnectionForINetConnection( pNetConnection, &pHNetConnection ); if ( SUCCEEDED(hr) ) { IHNetProtocolSettings* pSettings; hr = pCfgMgr->QueryInterface( IID_PPV_ARG(IHNetProtocolSettings, &pSettings) ); _ASSERT( SUCCEEDED(hr) ); if ( SUCCEEDED(hr) ) { EnterCriticalSection(&m_csSharingConfiguration); ReleaseObj(m_pHNetConnection); m_pHNetConnection = pHNetConnection; m_pHNetConnection->AddRef(); ReleaseObj(m_pSettings); m_pSettings = pSettings; m_pSettings->AddRef(); LeaveCriticalSection(&m_csSharingConfiguration); ReleaseObj(pSettings); } ReleaseObj(pHNetConnection); } ReleaseObj(pCfgMgr); } return hr; } /*++ CNetSharingManager::GetSharingInstalled Routine Description: Arguments: none Return Value: none --*/ STDMETHODIMP CNetSharingManager::get_SharingInstalled( VARIANT_BOOL *pbInstalled ) { HNET_OEM_API_ENTER HRESULT hr = S_OK; if ( NULL == pbInstalled ) { hr = E_POINTER; } else { BOOLEAN bInstalled = FALSE; SC_HANDLE ScmHandle; SC_HANDLE ServiceHandle; // Connect to the service control manager ScmHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if ( ScmHandle ) { // Open the shared access service ServiceHandle = OpenService( ScmHandle, c_wszSharedAccess, SERVICE_ALL_ACCESS ); if ( ServiceHandle ) { bInstalled = TRUE; CloseServiceHandle(ServiceHandle); } CloseServiceHandle(ScmHandle); } *pbInstalled = bInstalled ? VARIANT_TRUE : VARIANT_FALSE; } return hr; HNET_OEM_API_LEAVE } /*++ CNetSharingManager::GetINetSharingConfigurationForINetConnection Routine Description: Arguments: none Return Value: none --*/ STDMETHODIMP CNetSharingManager::get_INetSharingConfigurationForINetConnection( INetConnection* pNetConnection, INetSharingConfiguration** ppNetSharingConfiguration ) { HNET_OEM_API_ENTER HRESULT hr; if ( NULL == ppNetSharingConfiguration ) { hr = E_POINTER; } else if ( NULL == pNetConnection ) { hr = E_INVALIDARG; } else { CComObject* pNetConfig; hr = CComObject::CreateInstance(&pNetConfig); if ( SUCCEEDED(hr) ) { pNetConfig->AddRef(); hr = pNetConfig->Initialize(pNetConnection); if ( SUCCEEDED(hr) ) { hr = pNetConfig->QueryInterface( IID_PPV_ARG( INetSharingConfiguration, ppNetSharingConfiguration ) ); } ReleaseObj(pNetConfig); } } return hr; HNET_OEM_API_LEAVE }