//+---------------------------------------------------------------------------- // // Copyright (C) 1996-1996, Microsoft Corporation. // // File: config.cxx // // Contents: Dialog for configuration of Dfs // // History: 6-Feb-96 BruceFo created // //----------------------------------------------------------------------------- #include #include #include #include #include // Update for share validation extern "C" { #include // in net/inc #include #include // DsRoleGetPrimaryDomainInformation } #include #include #include #include "messages.h" #include "resource.h" #include "config.hxx" DECLARE_DEBUG(DfsSetup) #if DBG == 1 #define dprintf(x) DfsSetupInlineDebugOut x #else #define dprintf(x) #endif #define CHECK_HRESULT(hr) \ if ( FAILED(hr) ) \ { \ dprintf((DEB_ERROR, \ "**** HRESULT ERROR RETURN <%s @line %d> -> 0x%08lx\n", \ __FILE__, __LINE__, hr)); \ } #define ARRAYLEN(x) (sizeof(x) / sizeof((x)[0])) extern HINSTANCE g_hInstance; //+------------------------------------------------------------------------- // // Function: SetErrorFocus // // Synopsis: Set focus to an edit control and select its text. // // Arguments: [hwnd] - dialog window // [idCtrl] - edit control to set focus to (and select) // // Returns: nothing // // History: 3-May-95 BruceFo Stolen // //-------------------------------------------------------------------------- VOID SetErrorFocus( IN HWND hwnd, IN UINT idCtrl ) { HWND hCtrl = ::GetDlgItem(hwnd, idCtrl); ::SetFocus(hCtrl); ::SendMessage(hCtrl, EM_SETSEL, 0, -1); } //+------------------------------------------------------------------------- // // Function: MyFormatMessageText // // Synopsis: Given a resource IDs, load strings from given instance // and format the string into a buffer // // History: 11-Aug-93 WilliamW Created. // //-------------------------------------------------------------------------- VOID MyFormatMessageText( IN HRESULT dwMsgId, IN PWSTR pszBuffer, IN DWORD dwBufferSize, IN va_list * parglist ) { // // get message from system or app msg file. // DWORD dwReturn = FormatMessage( FORMAT_MESSAGE_FROM_HMODULE, g_hInstance, dwMsgId, LANG_USER_DEFAULT, pszBuffer, dwBufferSize, parglist); if (0 == dwReturn) // couldn't find message { dprintf((DEB_IERROR, "FormatMessage failed, 0x%08lx\n", GetLastError())); WCHAR szText[200]; LoadString(g_hInstance, IDS_APP_MSG_NOT_FOUND, szText, ARRAYLEN(szText)); wsprintf(pszBuffer,szText,dwMsgId); } } //+------------------------------------------------------------------------- // // Function: MyFormatMessage // // Synopsis: Given a resource IDs, load strings from given instance // and format the string into a buffer // // History: 11-Aug-93 WilliamW Created. // //-------------------------------------------------------------------------- VOID MyFormatMessage( IN HRESULT dwMsgId, IN PWSTR pszBuffer, IN DWORD dwBufferSize, ... ) { va_list arglist; va_start(arglist, dwBufferSize); MyFormatMessageText(dwMsgId, pszBuffer, dwBufferSize, &arglist); va_end(arglist); } //+------------------------------------------------------------------------- // // Method: MyCommonDialog // // Synopsis: Common popup dialog routine - stole from diskadm directory // //-------------------------------------------------------------------------- DWORD MyCommonDialog( IN HWND hwnd, IN HRESULT dwMsgCode, IN PWSTR pszCaption, IN DWORD dwFlags, IN va_list arglist ) { WCHAR szMsgBuf[500]; MyFormatMessageText(dwMsgCode, szMsgBuf, ARRAYLEN(szMsgBuf), &arglist); SetCursor(LoadCursor(NULL, IDC_ARROW)); // in case it's an hourglass... return MessageBox(hwnd, szMsgBuf, pszCaption, dwFlags); } //+------------------------------------------------------------------------- // // Method: MyErrorDialog // // Synopsis: This routine retreives a message from the app or system // message file and displays it in a message box. // // Note: Stole from diskadm directory // //-------------------------------------------------------------------------- VOID MyErrorDialog( IN HWND hwnd, IN HRESULT dwErrorCode, ... ) { WCHAR szCaption[100]; va_list arglist; va_start(arglist, dwErrorCode); LoadString(g_hInstance, IDS_MSGTITLE, szCaption, ARRAYLEN(szCaption)); MyCommonDialog(hwnd, dwErrorCode, szCaption, MB_ICONSTOP | MB_OK, arglist); va_end(arglist); } //+------------------------------------------------------------------------- // // Method: MyConfirmationDialog // // Synopsis: This routine retreives a message from the app or system // message file and displays it in a message box. // // Note: Stole from diskadm directory // //-------------------------------------------------------------------------- DWORD MyConfirmationDialog( IN HWND hwnd, IN HRESULT dwMsgCode, IN DWORD dwFlags, ... ) { WCHAR szCaption[100]; DWORD dwReturn; va_list arglist; va_start(arglist, dwFlags); LoadString(g_hInstance, IDS_MSGTITLE, szCaption, ARRAYLEN(szCaption)); dwReturn = MyCommonDialog(hwnd, dwMsgCode, szCaption, dwFlags, arglist); va_end(arglist); return dwReturn; } //+------------------------------------------------------------------------- // // Method: IsLocalShareable, private // // Synopsis: Returns TRUE if the path is a local path on a shareable media // type. // //-------------------------------------------------------------------------- BOOL IsLocalShareable( IN LPWSTR pszPath ) { // ok? local, etc... if (NULL != pszPath && pszPath[1] == L':' ) { // assume it's a drive letter. See if it's local. WCHAR szRoot[3]; szRoot[0] = pszPath[0]; szRoot[1] = L':'; szRoot[2] = L'\0'; UINT info = GetDriveType(szRoot); switch (info) { // the following list is a list of drive types I believe can // be shared by the server case DRIVE_FIXED: case DRIVE_REMOVABLE: case DRIVE_CDROM: return TRUE; break; } } return FALSE; } //+------------------------------------------------------------------------- // // Method: BrowseCallback, private // // Synopsis: // //-------------------------------------------------------------------------- int BrowseCallback( IN HWND hwnd, IN UINT uMsg, IN LPARAM lParam, IN LPARAM lpData ) { if (uMsg == BFFM_SELCHANGED) { LPITEMIDLIST pidl = (LPITEMIDLIST)lParam; TCHAR szPath[MAX_PATH]; BOOL fEnable = FALSE; if (SHGetPathFromIDList(pidl, szPath)) { // ok? local, etc... if (IsLocalShareable(szPath)) { fEnable = TRUE; } } SendMessage(hwnd, BFFM_ENABLEOK, 0, fEnable); } return 0; } //+------------------------------------------------------------------------- // // Method: OnBrowse // // Synopsis: // //-------------------------------------------------------------------------- BOOL OnBrowse( IN HWND hwnd ) { LPITEMIDLIST pidlRoot; HRESULT hr = SHGetSpecialFolderLocation(hwnd, CSIDL_DRIVES, &pidlRoot); CHECK_HRESULT(hr); if (FAILED(hr)) { return FALSE; } WCHAR szCaptionText[MAX_PATH]; MyFormatMessage(MSG_BROWSE,szCaptionText,ARRAYLEN(szCaptionText)); WCHAR szDisplayName[MAX_PATH]; BROWSEINFO bi = { hwnd, pidlRoot, szDisplayName, szCaptionText, BIF_RETURNONLYFSDIRS, BrowseCallback, (LPARAM)0, 0 }; LPITEMIDLIST pidl = SHBrowseForFolder(&bi); if (NULL != pidl) { WCHAR szPath[MAX_PATH]; SHGetPathFromIDList(pidl, szPath); dprintf((DEB_ITRACE, "SHBrowseForFolder: got %ws\n", szPath)); SetDlgItemText(hwnd, IDC_DIRECTORY, szPath); SetFocus(GetDlgItem(hwnd, IDC_CREATESHARE)); // so you can just hit "enter" afterwards... } else { dprintf((DEB_ITRACE, "SHBrowseForFolder was cancelled\n")); } // Now, free the shell data IMalloc* pMalloc; hr = SHGetMalloc(&pMalloc); CHECK_HRESULT(hr); if (SUCCEEDED(hr)) { pMalloc->Free(pidlRoot); pMalloc->Free(pidl); pMalloc->Release(); } return TRUE; } //----------------------------------------------------------------------------- // New Share Dialog //----------------------------------------------------------------------------- INT_PTR CALLBACK DlgProcNewShare( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { static LPWSTR s_pszPath; switch (uMsg) { case WM_INITDIALOG: { s_pszPath = (LPWSTR)lParam; if (NULL == s_pszPath) { EndDialog(hwnd, -1); // internal error } EnableWindow(GetDlgItem(hwnd, IDC_CREATESHARE), FALSE); SendDlgItemMessage(hwnd, IDC_DIRECTORY, EM_LIMITTEXT, (WPARAM)(MAX_PATH - 1), (LPARAM)0); return 1; // didn't call SetFocus } case WM_COMMAND: { WORD wNotifyCode = HIWORD(wParam); WORD wID = LOWORD(wParam); switch (wID) { case IDC_CREATESHARE: { GetDlgItemText(hwnd, IDC_DIRECTORY, s_pszPath, MAX_PATH); if (!IsLocalShareable(s_pszPath)) { MyErrorDialog(hwnd, MSG_ILLEGAL_DIRECTORY, s_pszPath); SetErrorFocus(hwnd, IDC_DIRECTORY); return TRUE; } DWORD attribs = GetFileAttributes(s_pszPath); if (0xffffffff == attribs) { if (ERROR_PATH_NOT_FOUND == GetLastError() || ERROR_FILE_NOT_FOUND == GetLastError() ) { DWORD dw = MyConfirmationDialog(hwnd, MSG_NODIRECTORY, MB_YESNO | MB_ICONQUESTION, s_pszPath); if (dw == IDNO) { // ok, go away... SetErrorFocus(hwnd, IDC_DIRECTORY); return TRUE; } // try to create the directory BOOL b = CreateDirectory(s_pszPath, NULL); dprintf((DEB_TRACE, "CreateDirectory(%ws) = %d, last error = %d\n", s_pszPath, b, GetLastError())); if (!b) { MyErrorDialog(hwnd, MSG_COULDNT_CREATE_DIRECTORY, s_pszPath); SetErrorFocus(hwnd, IDC_DIRECTORY); return TRUE; } } else { dprintf((DEB_ERROR, "GetFileAttributes(%ws) failed, 0x%08lx\n", s_pszPath, GetLastError())); MyErrorDialog(hwnd, MSG_FILEATTRIBSFAIL, s_pszPath); SetErrorFocus(hwnd, IDC_DIRECTORY); return TRUE; } } else if (!(attribs & FILE_ATTRIBUTE_DIRECTORY)) { MyErrorDialog(hwnd, MSG_NOT_A_DIRECTORY); SetErrorFocus(hwnd, IDC_DIRECTORY); return TRUE; } EndDialog(hwnd, TRUE); break; } case IDCANCEL: EndDialog(hwnd, FALSE); break; case IDC_BROWSE: return OnBrowse(hwnd); case IDC_DIRECTORY: if (wNotifyCode == EN_CHANGE) { EnableWindow( GetDlgItem(hwnd, IDC_CREATESHARE), (GetWindowTextLength(GetDlgItem(hwnd, IDC_DIRECTORY)) > 0) ? TRUE : FALSE); } break; } return 0; } default: return 0; // didn't process } } // TRUE == success, FALSE == failure BOOL FillCombo( IN HWND hwnd, IN LPWSTR pszSelectShare, // only one of pszSelectShare & pszSelectPath IN LPWSTR pszSelectPath // ... can be non-NULL ) { LPWSTR pszShareForPath = NULL; // if passed pszSelectPath, this figures out the share name corresponding to it // // Fill the combo box with a list of existing shares from which to // pick one to use as the Dfs share. First, if necessary, try level 2 // so we get a path to compare against pszSelectPath. If that fails with // access denied, then fall back to level 1. // int level; DWORD dwErr, entriesread, totalentries; PSHARE_INFO_1 pshi1Base = NULL; PSHARE_INFO_1 pshi1 = NULL; if (NULL != pszSelectPath) { level = 2; dwErr = NetShareEnum( NULL, // Server (local machine) 2, // Level (LPBYTE *) &pshi1Base, // Buffer 0xffffffff, // max len (all) &entriesread, &totalentries, NULL); // resume handle (unimplemented) } if (NULL == pshi1Base) { level = 1; dwErr = NetShareEnum( NULL, // Server (local machine) 1, // Level (LPBYTE *) &pshi1Base, // Buffer 0xffffffff, // max len (all) &entriesread, &totalentries, NULL); // resume handle (unimplemented) if (dwErr != ERROR_SUCCESS) { MyErrorDialog(hwnd, MSG_NOSERVER); return FALSE; } } // assert(entriesread == totalentries); HWND hwndCombo = GetDlgItem(hwnd, IDC_DFSROOT); for (DWORD i = 0; i < entriesread; i++) { pshi1 = (level == 1) ? &(pshi1Base[i]) : (PSHARE_INFO_1)&(((PSHARE_INFO_2)pshi1Base)[i]) ; if (pshi1->shi1_type == STYPE_DISKTREE) { ComboBox_AddString(hwndCombo, pshi1->shi1_netname); if (NULL != pszSelectPath && NULL == pszShareForPath && level == 2) { LPWSTR pszPath = ((PSHARE_INFO_2)pshi1)->shi2_path; if (0 == _wcsicmp(pszPath, pszSelectPath)) { pszShareForPath = pshi1->shi1_netname; } } } } int index = -1; if (NULL != pszSelectShare) { index = ComboBox_FindStringExact(hwndCombo, -1, pszSelectShare); if (index == CB_ERR) { index = -1; } } else if (NULL != pszSelectPath) { if (NULL != pszShareForPath) { index = ComboBox_FindStringExact(hwndCombo, -1, pszShareForPath); if (index == CB_ERR) { index = -1; } } } if (-1 == index) { if (ComboBox_GetCount(hwndCombo) > 0) { index = 0; } } if (index != -1) { ComboBox_SetCurSel(hwndCombo, index); } pshi1=&pshi1Base[0]; NetApiBufferFree(pshi1); return TRUE; } //----------------------------------------------------------------------------- // DFS Share Dialog //----------------------------------------------------------------------------- INT_PTR CALLBACK DlgProcDfsShare( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { static DFS_CONFIGURATION* s_pConfig; switch (uMsg) { case WM_INITDIALOG: { s_pConfig = (DFS_CONFIGURATION*) lParam; if (NULL == s_pConfig) { EndDialog(hwnd, -1); // fail! return TRUE; } if (!FillCombo(hwnd, s_pConfig->szRootShare, NULL)) { EndDialog(hwnd, -1); // fail! return TRUE; } s_pConfig->fHostsDfs=FALSE; HWND hwndCombo = GetDlgItem(hwnd, IDC_DFSROOT); int index = ComboBox_GetCurSel(hwndCombo); if (index == CB_ERR) EnableWindow(GetDlgItem(hwnd,IDOK), FALSE); return 1; // didn't call SetFocus } case WM_COMMAND: { WORD wNotifyCode = HIWORD(wParam); WORD wID = LOWORD(wParam); switch (wID) { case IDOK: { HWND hwndCombo = GetDlgItem(hwnd, IDC_DFSROOT); int index = ComboBox_GetCurSel(hwndCombo); if (index != CB_ERR) { int len = ComboBox_GetLBTextLen(hwndCombo, index); if (len < ARRAYLEN(s_pConfig->szRootShare) - 1) { ComboBox_GetLBText(hwndCombo, index, s_pConfig->szRootShare); s_pConfig->fHostsDfs=TRUE; } else { // internal error! } } else { // internal error! } EndDialog(hwnd, TRUE); break; } case IDCANCEL: EndDialog(hwnd, FALSE); break; case IDC_NEWSHARE: { // let the user create a new share on the machine. WCHAR szPath[MAX_PATH]; INT_PTR ret = DialogBoxParam( g_hInstance, MAKEINTRESOURCE(IDD_NEWSHARE), hwnd, DlgProcNewShare, (LPARAM)szPath); if (ret == -1 || !ret) { // don't need to refresh. return TRUE; } dprintf((DEB_TRACE, "User wants to share path %ws\n", szPath)); HINSTANCE hinst = LoadLibrary(TEXT("ntshrui.dll")); if (NULL == hinst) { MyErrorDialog(hwnd, MSG_NONTSHRUI); return TRUE; } PFNSHARINGDIALOG pfnSharingDialog = (PFNSHARINGDIALOG)GetProcAddress(hinst, "SharingDialogW"); if (NULL == pfnSharingDialog) { FreeLibrary(hinst); MyErrorDialog(hwnd, MSG_NONTSHRUI); return TRUE; } BOOL b = (*pfnSharingDialog)(hwnd, NULL, szPath); if (!b) { // dialog failed FreeLibrary(hinst); return TRUE; } FreeLibrary(hinst); HWND hwndCombo = GetDlgItem(hwnd, IDC_DFSROOT); ComboBox_ResetContent(hwndCombo); if (!FillCombo(hwnd, NULL, szPath)) { return TRUE; } hwndCombo = GetDlgItem(hwnd, IDC_DFSROOT); int index = ComboBox_GetCurSel(hwndCombo); if (index == CB_ERR) EnableWindow(GetDlgItem(hwnd,IDOK), FALSE); else EnableWindow(GetDlgItem(hwnd,IDOK), TRUE); break; } } return 0; } default: return 0; // didn't process } } extern "C" NET_API_STATUS NET_API_FUNCTION I_NetDfsGetFtServers( IN PVOID pLDAP OPTIONAL, IN LPWSTR wszDomainName OPTIONAL, IN LPWSTR wszDfsName, OUT LPWSTR **List ); //----------------------------------------------------------------------------- // Fill FTDFS for this domain //----------------------------------------------------------------------------- // TRUE == success, FALSE == failure BOOL FillFTDfsCombo( IN HWND hwnd ) { LPWSTR *list; if (I_NetDfsGetFtServers(NULL,NULL,NULL,&list)==NO_ERROR) { HWND hwndCombo = GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB); for (int i=0; list[i] != NULL; i++) { ComboBox_AddString(hwndCombo, list[i]); } NetApiBufferFree(list); // Select the first item in the combo ComboBox_SetCurSel(hwndCombo,0); } return TRUE; } //----------------------------------------------------------------------------- // Create DFS Share dialog //----------------------------------------------------------------------------- INT_PTR CALLBACK DlgProcCreateDfs( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) { static DFS_CONFIGURATION* s_pConfig; switch (uMsg) { case WM_INITDIALOG: { s_pConfig = (DFS_CONFIGURATION*) lParam; // Note that _InitConfigDfs might disable the IDC_JOIN_FTDFS button _InitConfigDfs(hwnd,s_pConfig); _ShowDomainName(hwnd); // // Enable the IDC_CREATE_FTDFS button only if // this can be shown not to be a workgroup server. // JonN 8/22/97 // BOOL fDisableFTDFS = TRUE; DSROLE_PRIMARY_DOMAIN_INFO_BASIC* proleinfo = NULL; DWORD dwErr = DsRoleGetPrimaryDomainInformation( NULL, DsRolePrimaryDomainInfoBasic, reinterpret_cast(&proleinfo) ); if ( ERROR_SUCCESS == dwErr ) { // ASSERT( NULL != proleinfo ); switch (proleinfo->MachineRole) { case DsRole_RoleMemberWorkstation: case DsRole_RoleMemberServer: case DsRole_RoleBackupDomainController: case DsRole_RolePrimaryDomainController: fDisableFTDFS = FALSE; default: break; } DsRoleFreeMemory( proleinfo ); } if (fDisableFTDFS) { EnableWindow(GetDlgItem(hwnd, IDC_CREATE_FTDFS), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_CREATE_FTDFS_TX), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_JOIN_FTDFS), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB), FALSE); SetFocus( GetDlgItem(hwnd, IDC_CREATE_DFS )); return 0; // called SetFocus } return 1; // didn't call SetFocus } case WM_COMMAND: { WORD wNotifyCode = HIWORD(wParam); WORD wID = LOWORD(wParam); switch (wNotifyCode) { case EN_CHANGE: { EnableWindow(GetDlgItem(hwnd, IDOK), _VerifyState(hwnd,DFSTYPE_CREATE_FTDFS)); return 0; } } switch (wID) { case IDOK: { switch (s_pConfig->nDfsType) { case DFSTYPE_CREATE_FTDFS: GetDlgItemText(hwnd, IDC_CREATE_FTDFS_TX,s_pConfig->szFTDfs,NNLEN); if (!_ValidateShare(s_pConfig->szFTDfs)) { MessageBox(hwnd,L"Invalid FTDfs Name. You must enter a valid FTDfs name before continuing.",L"Dfs Administration",MB_ICONEXCLAMATION | MB_OK); return 0; } break; case DFSTYPE_JOIN_FTDFS: { HWND hwndCombo = GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB); int index = ComboBox_GetCurSel(hwndCombo); if (index != CB_ERR) { int len = ComboBox_GetLBTextLen(hwndCombo, index); if (len < ARRAYLEN(s_pConfig->szFTDfs) - 1) { ComboBox_GetLBText(hwndCombo, index, s_pConfig->szFTDfs); } else { // internal error! } } else { // internal error! } } break; case DFSTYPE_CREATE_DFS: s_pConfig->szFTDfs[0]=NULL; break; } // TODO need to store the option EndDialog(hwnd, TRUE); break; } // need to cancel everything case IDCANCEL: s_pConfig->fFTDfs=FALSE; EndDialog(hwnd, FALSE); break; case IDC_CREATE_FTDFS: CheckDlgButton(hwnd, IDC_CREATE_FTDFS, BST_CHECKED); EnableWindow(GetDlgItem(hwnd, IDC_CREATE_FTDFS_TX), TRUE); EnableWindow(GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB), FALSE); s_pConfig->nDfsType=DFSTYPE_CREATE_FTDFS; EnableWindow(GetDlgItem(hwnd, IDOK), _VerifyState(hwnd,s_pConfig->nDfsType)); s_pConfig->fFTDfs=TRUE; break; case IDC_JOIN_FTDFS: { CheckDlgButton(hwnd, IDC_JOIN_FTDFS, BST_CHECKED); EnableWindow(GetDlgItem(hwnd, IDC_CREATE_FTDFS_TX), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB), TRUE); s_pConfig->nDfsType=DFSTYPE_JOIN_FTDFS; EnableWindow(GetDlgItem(hwnd, IDOK), _VerifyState(hwnd,s_pConfig->nDfsType)); s_pConfig->fFTDfs=TRUE; } break; case IDC_CREATE_DFS: CheckDlgButton(hwnd, IDC_CREATE_DFS, BST_CHECKED); EnableWindow(GetDlgItem(hwnd, IDC_CREATE_FTDFS_TX), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB), FALSE); s_pConfig->nDfsType=DFSTYPE_CREATE_DFS; EnableWindow(GetDlgItem(hwnd, IDOK), _VerifyState(hwnd,s_pConfig->nDfsType)); s_pConfig->fFTDfs=FALSE; break; } return 0; } } return 0; // didn't process } BOOL _InitConfigDfs(IN HWND hwnd,DFS_CONFIGURATION* pConfig ) { if (NULL == pConfig) { EndDialog(hwnd, -1); // fail! return TRUE; } if (!FillFTDfsCombo(hwnd)) { EndDialog(hwnd, -1); // fail! return TRUE; } // Test to see if we have any item to join to EnableWindow(GetDlgItem(hwnd,IDC_JOIN_FTDFS), _VerifyState(hwnd,DFSTYPE_JOIN_FTDFS)); // Disable the join dialog // Init UI switch (pConfig->nDfsType) { case DFSTYPE_CREATE_FTDFS: { CheckDlgButton(hwnd, IDC_CREATE_FTDFS, BST_CHECKED); SetDlgItemText(hwnd, IDC_CREATE_FTDFS_TX,pConfig->szFTDfs); EnableWindow(GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB), FALSE); } break; case DFSTYPE_JOIN_FTDFS: { CheckDlgButton(hwnd, IDC_JOIN_FTDFS, BST_CHECKED); EnableWindow(GetDlgItem(hwnd, IDC_CREATE_FTDFS_TX), FALSE); HWND hwndCombo = GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB); int index = -1; if (NULL != pConfig->szFTDfs) { index = ComboBox_FindStringExact(hwndCombo, -1, pConfig->szFTDfs); if (index == CB_ERR) { index = -1; } } else if (NULL != pConfig->szFTDfs) { if (NULL != pConfig->szFTDfs) { index = ComboBox_FindStringExact(hwndCombo, -1, pConfig->szFTDfs); if (index == CB_ERR) { index = -1; } } } if (-1 == index) { if (ComboBox_GetCount(hwndCombo) > 0) { index = 0; } } if (index != -1) { ComboBox_SetCurSel(hwndCombo, index); } EnableWindow(GetDlgItem(hwnd,IDC_JOIN_FTDFS), _VerifyState(hwnd,DFSTYPE_JOIN_FTDFS)); } break; case DFSTYPE_CREATE_DFS: { CheckDlgButton(hwnd, IDC_CREATE_DFS, BST_CHECKED); EnableWindow(GetDlgItem(hwnd, IDC_CREATE_FTDFS_TX), FALSE); EnableWindow(GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB), FALSE); } break; default: CheckDlgButton(hwnd, IDC_CREATE_FTDFS, BST_CHECKED); pConfig->nDfsType=DFSTYPE_CREATE_FTDFS; pConfig->fFTDfs=TRUE; EnableWindow(GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB), FALSE); } EnableWindow(GetDlgItem(hwnd, IDOK), _VerifyState(hwnd,pConfig->nDfsType)); return TRUE; } BOOL _VerifyState(IN HWND hwnd, IN int nType) { BOOL frtn=FALSE; switch (nType) { case DFSTYPE_CREATE_FTDFS: { TCHAR szText[MAX_PATH]; GetDlgItemText(hwnd, IDC_CREATE_FTDFS_TX,szText,MAX_PATH); if (wcslen(szText)>0) frtn=TRUE; } break; case DFSTYPE_JOIN_FTDFS: { HWND hwndCombo = GetDlgItem(hwnd, IDC_JOIN_FTDFS_CB); int index = ComboBox_GetCurSel(hwndCombo); if (index != CB_ERR) frtn=TRUE; } break; case DFSTYPE_CREATE_DFS: { frtn=TRUE; } break; } return frtn; } BOOL _ValidateShare(LPCWSTR lpszShare) { WCHAR pathName[ MAX_PATH ]; DWORD pathtype; // validate input if (lpszShare==NULL || wcslen( lpszShare ) > MAX_PATH) { return FALSE; } // copy string wcscpy( pathName, lpszShare); // check for valid path if( wcslen( pathName ) > NNLEN || wcspbrk( pathName, L"\\/ " ) || NetpwPathType( pathName, &pathtype, FALSE ) != NO_ERROR || pathtype != ITYPE_PATH ) { return FALSE; } return TRUE; } DWORD GetDomainAndComputerName( OUT LPWSTR wszDomain OPTIONAL, OUT LPWSTR wszComputer OPTIONAL); VOID _ShowDomainName( IN HWND hwnd) { WCHAR wszDomainName[MAX_PATH]; WCHAR wszDomainNamePath[MAX_PATH]; DWORD dwErr = GetDomainAndComputerName( wszDomainName, NULL); if (dwErr != ERROR_SUCCESS) return; if (wcslen(wszDomainName)>MAX_PATH-5) return; wsprintf(wszDomainNamePath,L"\\\\%ws\\",wszDomainName); int len = wcslen(wszDomainNamePath); SetDlgItemText(hwnd, IDC_CREATE_DOMAIN_TX, wszDomainNamePath); HDC hdc = GetDC(hwnd); if (NULL != hdc) { // make sure the right font is selected in... HFONT hfontDlg = (HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0); if (NULL != hfontDlg) { HFONT hfontOld = SelectFont(hdc, hfontDlg); SIZE size; BOOL b = GetTextExtentPoint32(hdc, wszDomainNamePath, len, &size); if (hfontOld) { SelectFont(hdc, hfontOld); } if (b) { // resize the static control to size.cx. Then, resize the // adjacent edit control to adjust for it. HWND hwndMountAsFixed = GetDlgItem(hwnd, IDC_CREATE_DOMAIN_TX); HWND hwndMountAs = GetDlgItem(hwnd, IDC_CREATE_FTDFS_TX); RECT rc1, rc2; // Get static control coordinates GetWindowRect(hwndMountAsFixed, &rc1); MapWindowPoints(NULL, hwnd, (LPPOINT)&rc1, 2); // map x,y to dialog-relative coordinates instead of windows-relative coordinates // Get edit control coordinates GetWindowRect(hwndMountAs, &rc2); MapWindowPoints(NULL, hwnd, (LPPOINT)&rc2, 2); // map x,y to dialog-relative coordinates instead of windows-relative coordinates // Make sure the edit control doesn't take up more than 50% of // the width. If it does, put it in the tab order (it's already // a read-only edit control). int halfwidth = (rc2.right - rc1.left) / 2; if (size.cx > halfwidth) { size.cx = halfwidth; //SetWindowLong(hwndMountAsFixed, GWL_STYLE, // GetWindowLong(hwndMountAsFixed, GWL_STYLE) | WS_TABSTOP); } else { if (GetFocus() == hwndMountAsFixed) { ::SetFocus(hwndMountAs); } //SetWindowLong(hwndMountAsFixed, GWL_STYLE, // GetWindowLong(hwndMountAsFixed, GWL_STYLE) & ~WS_TABSTOP); } size.cx+=10; SetWindowPos( hwndMountAsFixed, NULL, 0, 0, size.cx, rc1.bottom - rc1.top, // leave height intact SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); // adjust the edit control size.cx += 2; // add a buffer between controls SetWindowPos( hwndMountAs, NULL, rc1.left + size.cx, // left side + static width + buffer rc2.top, (rc2.right - rc1.left) - size.cx, // total width - static width - buffer rc2.bottom - rc2.top, // leave height intact SWP_NOZORDER | SWP_NOACTIVATE); } else { //appDebugOut((DEB_ERROR, "GetTextExtentPoint32 failed, 0x%08lx\n", GetLastError())); } } ReleaseDC(GetDlgItem(hwnd, IDC_CREATE_DOMAIN_TX), hdc); } else { //appDebugOut((DEB_ERROR, "GetDC failed, 0x%08lx\n", GetLastError())); } } int ConfigDfsShare( IN HWND hwnd, IN DFS_CONFIGURATION* pConfiguration ) { HMODULE hmod=GetModuleHandle(TEXT("dfssetup.dll")); return (int)DialogBoxParam( hmod, MAKEINTRESOURCE(IDD_DFSSHARE), hwnd, DlgProcDfsShare, (LPARAM)pConfiguration); } int ConfigureDfs( IN HWND hwnd, IN DFS_CONFIGURATION* pConfiguration ) { HMODULE hmod=GetModuleHandle(TEXT("dfssetup.dll")); return (int)DialogBoxParam( hmod, MAKEINTRESOURCE(IDD_CREATEDFS), hwnd, DlgProcCreateDfs, (LPARAM)pConfiguration); }