diff options
author | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
---|---|---|
committer | Adam <you@example.com> | 2020-05-17 05:51:50 +0200 |
commit | e611b132f9b8abe35b362e5870b74bce94a1e58e (patch) | |
tree | a5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/nw/convert/nwconv/netutil.c | |
download | NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2 NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip |
Diffstat (limited to '')
-rw-r--r-- | private/nw/convert/nwconv/netutil.c | 437 |
1 files changed, 437 insertions, 0 deletions
diff --git a/private/nw/convert/nwconv/netutil.c b/private/nw/convert/nwconv/netutil.c new file mode 100644 index 000000000..7a99ba6b9 --- /dev/null +++ b/private/nw/convert/nwconv/netutil.c @@ -0,0 +1,437 @@ +/* + +-------------------------------------------------------------------------+ + | Network Utility Functions | + +-------------------------------------------------------------------------+ + | (c) Copyright 1993-1994 | + | Microsoft Corp. | + | All rights reserved | + | | + | Program : [NetUtil.c] | + | Programmer : Arthur Hanson | + | Original Program Date : [Feb 16, 1993] | + | Last Update : [Jun 16, 1994] | + | | + | Version: 1.00 | + | | + | Description: | + | | + | History: | + | arth Jun 16, 1994 1.00 Original Version. | + | | + +-------------------------------------------------------------------------+ +*/ + +#include "globals.h" +#include "netutil.h" + +static LPTSTR ServName; +static TCHAR szPassword[PWLEN+1]; +static TCHAR szUserName[MAX_USER_NAME_LEN + 1]; + +LRESULT CALLBACK PasswordDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); +BOOL BadPassword; + +/*+-------------------------------------------------------------------------+ + | FixPathSlash() + | + +-------------------------------------------------------------------------+*/ +void FixPathSlash(LPTSTR NewPath, LPTSTR Path) { + UINT PathLen; + lstrcpy(NewPath, Path); + + PathLen = lstrlen(Path); + // If ending character is not a slash then put one on + if (PathLen && (Path[PathLen - 1] != '\\')) + lstrcat(NewPath, TEXT("\\")); + +} // FixPathSlash + + +/*+-------------------------------------------------------------------------+ + | ShareNameParse() + | + +-------------------------------------------------------------------------+*/ +LPTSTR ShareNameParse(LPTSTR ShareName) { + ULONG i; + + i = lstrlen(ShareName); + if (!i) + return ShareName; + + // Scan backwards for first slash + i--; + while (i && ShareName[i] != TEXT('\\')) + i--; + + // if found slash then increment past it + if (i) + i++; + + return &ShareName[i]; + +} // ShareNameParse + + +static LPTSTR LocName = NULL; +/*+-------------------------------------------------------------------------+ + | GetLocalName() + | + +-------------------------------------------------------------------------+*/ +void GetLocalName(LPTSTR *lpLocalName) { + int size; + + if (LocName != NULL) { + *lpLocalName = LocName; + } else { + LocName = AllocMemory((MAX_COMPUTERNAME_LENGTH + 1) * sizeof(TCHAR)); + size = MAX_COMPUTERNAME_LENGTH + 1; + + if (LocName) { + GetComputerName(LocName, &size); + *lpLocalName = LocName; + } else + *lpLocalName = NULL; + } + +} // GetLocalName + + +/*+-------------------------------------------------------------------------+ + | SetProvider() + | + +-------------------------------------------------------------------------+*/ +BOOL SetProvider(LPTSTR Provider, NETRESOURCE *ResourceBuf) { + ResourceBuf->dwScope = RESOURCE_GLOBALNET; + ResourceBuf->dwType = RESOURCETYPE_DISK; + ResourceBuf->dwDisplayType = RESOURCEDISPLAYTYPE_GENERIC; + + // Don't take the frigging _RESERVED flag out - it isn't documented except in the include + // file and it crashes without it! + ResourceBuf->dwUsage = RESOURCEUSAGE_CONTAINER | RESOURCEUSAGE_RESERVED; + + ResourceBuf->lpLocalName = NULL; + ResourceBuf->lpRemoteName = Provider; + ResourceBuf->lpComment = NULL; + ResourceBuf->lpProvider = Provider; + return TRUE; + +} // SetProvider + + +/*+-------------------------------------------------------------------------+ + | AllocEnumBuffer() + | + +-------------------------------------------------------------------------+*/ +ENUM_REC *AllocEnumBuffer() { + ENUM_REC *Buf; + + Buf = (ENUM_REC *) AllocMemory(sizeof(ENUM_REC)); + + if (Buf) { + // Init the record + Buf->next = NULL; + Buf->cEntries = 0; + Buf->cbBuffer = 0; + Buf->lpnr = NULL; + } + + return Buf; + +} // AllocEnumBuffer + + + +/*+-------------------------------------------------------------------------+ + | EnumBufferBuild() + | + | Uses WNetEnum to enumerate the resource. WNetEnum is really brain- + | dead so we need to create a temporary holding array and then build + | up a finalized complete buffer in the end. A linked list of inter- + | mediate buffer records is created first. + | + +-------------------------------------------------------------------------+*/ +DWORD FAR PASCAL EnumBufferBuild(ENUM_REC **BufHead, int *NumBufs, NETRESOURCE ResourceBuf) { + DWORD status = ERROR_NO_NETWORK; + ENUM_REC *CurrBuf; + DWORD dwResultEnum; + HANDLE hEnum = NULL; + DWORD cbBuffer = 16384; // 16K default buffer size. + DWORD cEntries = 0xFFFFFFFF; // enumerate all possible entries + ENUM_REC **lppEnumRec; + LPNETRESOURCE lpnrLocal; + + status = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, 0, &ResourceBuf, &hEnum); + + if (status == NO_ERROR) { + + *BufHead = NULL; + lppEnumRec = BufHead; + + do { + + cbBuffer = 16384; // 16K default buffer size + cEntries = 0xFFFFFFFF; // enumerate all possible entries + + // Allocate memory for NETRESOURCE structures. + lpnrLocal = (LPNETRESOURCE) AllocMemory(cbBuffer); + + if (lpnrLocal == NULL) { + status = ERROR_NOT_ENOUGH_MEMORY; + break; + } + + dwResultEnum = WNetEnumResource(hEnum, &cEntries, (LPVOID) lpnrLocal, &cbBuffer); + + if (dwResultEnum == NO_ERROR) { + // Create a new Enum rec and link it to the chain + *lppEnumRec = AllocEnumBuffer(); + + if (*lppEnumRec == NULL) { + status = ERROR_NOT_ENOUGH_MEMORY; + break; + } + + CurrBuf = *lppEnumRec; + + // Init for next loop through buffer + lppEnumRec = &CurrBuf->next; + + // Put enumeration buffer in our Enum rec. + CurrBuf->lpnr = lpnrLocal; + CurrBuf->cEntries = cEntries; + CurrBuf->cbBuffer = cbBuffer; + (*NumBufs)++; + + } else { // Since this is not assigned in a rec we need to free it here. + FreeMemory((HGLOBAL) lpnrLocal); + + if (dwResultEnum != ERROR_NO_MORE_ITEMS) { + status = dwResultEnum; + break; + } + } + + } while (dwResultEnum != ERROR_NO_MORE_ITEMS); + + status = WNetCloseEnum(hEnum); + + } + + return status; + +} // EnumBufferBuild + + +/*+-------------------------------------------------------------------------+ + | UseAddPswd() + | + | Attempts to make connections to \\szServer\admin$, asking for + | passwords if necessary. + | + | Returns TRUE if use was added, + | FALSE otherwise + | + +-------------------------------------------------------------------------+*/ +BOOL UseAddPswd(HWND hwnd, LPTSTR UserName, LPTSTR lpszServer, LPTSTR lpszShare, LPTSTR Provider) { + WORD nState; + WORD fCancel; + DLGPROC lpProc; + NETRESOURCE nr; + NET_API_STATUS retcode; + LPTSTR lpPassword; + static TCHAR szTmp[MAX_UNC_PATH+1]; + + ServName = lpszServer; + + nr.dwScope = 0; + nr.dwType = RESOURCETYPE_DISK; + nr.dwDisplayType = 0; + nr.dwUsage = 0; + nr.lpProvider = NULL; + + nState = 1; // try default password + lpPassword = NULL; + BadPassword = FALSE; + lstrcpy(szUserName, UserName); + + for(;;) { + // Concatenate server and share + wsprintf(szTmp, TEXT("%s\\%s"), lpszServer, lpszShare); + + // Fill in data structure + nr.lpLocalName = NULL; + nr.lpRemoteName = szTmp; + nr.lpProvider = Provider; + + // Try to make the connection + if (lstrlen(szUserName)) + retcode = WNetAddConnection2(&nr, lpPassword, szUserName, 0); + else + retcode = WNetAddConnection2(&nr, lpPassword, NULL, 0); + + switch(retcode) { + case NERR_Success: + lstrcpy(UserName, szUserName); + return TRUE; + + case ERROR_INVALID_PASSWORD: + BadPassword = TRUE; + break; + + case ERROR_ACCESS_DENIED: + case ERROR_NETWORK_ACCESS_DENIED: + case ERROR_SESSION_CREDENTIAL_CONFLICT: + case ERROR_NO_SUCH_USER: + case ERROR_NO_MORE_ITEMS: + case ERROR_LOGON_FAILURE: + BadPassword = FALSE; + break; + + case ERROR_BAD_NETPATH: + case ERROR_BAD_NET_NAME: + + default: + return FALSE; + } + + // Get new password from user + lpProc = MakeProcInstance(PasswordDlgProc, hInst); + fCancel = !DialogBoxParam(hInst, TEXT("PasswordEnter"), hwnd, lpProc, 0); + + // Gamble call only once + FreeProcInstance(lpProc); + + // Save... + if(!fCancel) { + if(nState) { + nState = 2; // try specified password + lpPassword = szPassword; + } else { + nState = 1; // try default password + lpPassword = NULL; + } + } else { + SetLastError(ERROR_SUCCESS); // just aborting... + return FALSE; + } + } + +} // UseAddPswd + + +/*+-------------------------------------------------------------------------+ + | PasswordDlgProc() + | + | Gets a password from the user and copies it into the string pointed + | to by lParam. This string must have room for at least (PWLEN + 1) + | characters. Returns TRUE if OK is pressed, or FALSE if Cancel + | + +-------------------------------------------------------------------------+*/ +LRESULT CALLBACK PasswordDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { + + switch (msg) { + case WM_INITDIALOG: + CursorNormal(); + + // Center the dialog over the application window + CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER)); + + SetDlgItemText(hDlg, IDC_SERVNAME, ServName); + SendDlgItemMessage(hDlg, IDC_PASSWORD, EM_LIMITTEXT, PWLEN, 0L); + SendDlgItemMessage(hDlg, IDC_USERNAME, EM_LIMITTEXT, MAX_USER_NAME_LEN, 0L); + PostMessage(hDlg, WM_COMMAND, ID_INIT, 0L); + break; + + case WM_COMMAND: + switch(wParam) { + case IDOK: + CursorHourGlass(); + GetDlgItemText(hDlg, IDC_PASSWORD, szPassword, PWLEN+1); + GetDlgItemText(hDlg, IDC_USERNAME, szUserName, MAX_USER_NAME_LEN+1); + + EndDialog(hDlg, TRUE); + break; + + case IDCANCEL: + CursorHourGlass(); + EndDialog(hDlg, FALSE); + break; + + case ID_INIT: + SendDlgItemMessage(hDlg, IDC_USERNAME, WM_SETTEXT, 0, (LPARAM) szUserName); + + if (BadPassword) + SetFocus(GetDlgItem(hDlg, IDC_PASSWORD)); + else { + SetFocus(GetDlgItem(hDlg, IDC_USERNAME)); + SendDlgItemMessage(hDlg, IDC_USERNAME, EM_SETSEL, 0, (LPARAM) MAKELPARAM(0, -1) ); + } + + break; + + default: + return FALSE; + } + break; + + default: + return FALSE; + } + return TRUE; + +} // PasswordDlgProc + + +/*+-------------------------------------------------------------------------+ + | NicePath() + | + +-------------------------------------------------------------------------+*/ +LPTSTR NicePath(int Len, LPTSTR Path) { + static TCHAR NewPath[MAX_PATH + 80]; + int eptr, fptr; + + // If the path fits then just return it + if (lstrlen(Path) <= Len) { + lstrcpy(NewPath, Path); + return NewPath; + } + + // The path doesn't fit, so need to reduce it down in size - to do this first try + // to get the last part of the path looking for slash that starts it. + eptr = fptr = 0; + while (Path[eptr] != TEXT('\0')) + eptr++; + + // back up before ending NULL also before any ending slash + eptr--; + while ((Path[eptr] == TEXT('\\')) && eptr > 0) + eptr--; + + // now try to find beginning slash + while ((Path[eptr] != TEXT('\\')) && eptr > 0) + eptr--; + + // if at beginning of string then is just one name so copy all of it we can + if (eptr == 0) { + lstrcpyn(NewPath, Path, Len); + return NewPath; + } + + // check if the name after the last slash can all fit - also take into account + // the "..." we are going to tack into the name + fptr = lstrlen(Path) - eptr; + fptr += 4; + if (fptr >= Len) { + lstrcpyn(NewPath, &Path[eptr], Len); + return NewPath; + } + + // We need to create a path shortening to the desired length by removing the mid + // part of the path and replacing it with "..." + fptr = Len - fptr; + lstrcpyn(NewPath, Path, fptr); + lstrcat(NewPath, TEXT("...")); + lstrcat(NewPath, &Path[eptr]); + return NewPath; + +} // NicePath |