/*++ Copyright(c) 1995 Microsoft Corporation MODULE NAME misc.c ABSTRACT Miscellaneous routines for the automatic connection service. AUTHOR Anthony Discolo (adiscolo) 20-Mar-1995 REVISION HISTORY Original version from Gurdeep --*/ #define UNICODE #define _UNICODE #include #include #include #include #include #include #include #include #include #include #include #include "access.h" #include "reg.h" #include "misc.h" #include "process.h" #include "rtutils.h" LPTSTR AddressToUnicodeString( IN PACD_ADDR pAddr ) { PCHAR pch; struct in_addr in; // CHAR szBuf[64]; CHAR *pszBuf = NULL; LPTSTR pszAddrOrig = NULL, pszAddr = NULL; INT i; INT cch; pszBuf = LocalAlloc(LPTR, 1024); if(NULL == pszBuf) { return NULL; } switch (pAddr->fType) { case ACD_ADDR_IP: in.s_addr = pAddr->ulIpaddr; pch = inet_ntoa(in); pszAddrOrig = AnsiStringToUnicodeString(pch, NULL, 0); break; case ACD_ADDR_IPX: NodeNumberToString(pAddr->cNode, pszBuf); pszAddrOrig = AnsiStringToUnicodeString(pszBuf, NULL, 0); break; case ACD_ADDR_NB: // RtlZeroMemory(&szBuf, sizeof (szBuf)); pch = pszBuf; for (i = 0; i < 1024; i++) { if (pAddr->cNetbios[i] == ' ' || pAddr->cNetbios[i] == '\0') break; *pch++ = pAddr->cNetbios[i]; } // // Make sure this is a string - there are penetration attack // tests in stress which pass bogus buffers. // pszBuf[1023] = '\0'; pszAddrOrig = AnsiStringToUnicodeString(pszBuf, NULL, 0); break; case ACD_ADDR_INET: // // Make sure that the address is a string // pAddr->szInet[1023] = '\0'; pszAddrOrig = AnsiStringToUnicodeString(pAddr->szInet, NULL, 0); break; default: RASAUTO_TRACE1("AddressToUnicodeString: unknown address type (%d)", pAddr->fType); break; } if (pszAddrOrig != NULL) { pszAddr = CanonicalizeAddress(pszAddrOrig); LocalFree(pszAddrOrig); } if(NULL != pszBuf) { LocalFree(pszBuf); } return pszAddr; } // AddressToUnicodeString LPTSTR CompareConnectionLists( IN LPTSTR *lpPreList, IN DWORD dwPreSize, IN LPTSTR *lpPostList, IN DWORD dwPostSize ) { DWORD i, j; DWORD iMax, jMax; LPTSTR *piList, *pjList; BOOLEAN fFound; if (dwPostSize > dwPreSize) { iMax = dwPostSize; piList = lpPostList; jMax = dwPreSize; pjList = lpPreList; } else { iMax = dwPreSize; piList = lpPreList; jMax = dwPostSize; pjList = lpPostList; } // // If one list is empty, then return // the first entry of the other list. // if (iMax > 0 && jMax == 0) return piList[0]; for (i = 0; i < iMax; i++) { fFound = FALSE; for (j = 0; j < jMax; j++) { if (!wcscmp(piList[i], pjList[j])) { fFound = TRUE; break; } } if (!fFound) return piList[i]; } // // Didn't find any differences. // return NULL; } // CompareConnectionLists LPTSTR CopyString( IN LPTSTR pszString ) { LPTSTR pszNewString; pszNewString = LocalAlloc( LPTR, (wcslen(pszString) + 1) * sizeof (TCHAR)); if (pszNewString == NULL) { RASAUTO_TRACE("CopyString: LocalAlloc failed"); return NULL; } wcscpy(pszNewString, pszString); return pszNewString; } // CopyString PCHAR UnicodeStringToAnsiString( IN PWCHAR pszUnicode, OUT PCHAR pszAnsi, IN USHORT cbAnsi ) { NTSTATUS status; BOOLEAN fAllocate = (pszAnsi == NULL); UNICODE_STRING unicodeString; ANSI_STRING ansiString; RtlInitUnicodeString(&unicodeString, pszUnicode); if (pszAnsi != NULL) { ansiString.Length = 0; ansiString.MaximumLength = cbAnsi; ansiString.Buffer = pszAnsi; } status = RtlUnicodeStringToAnsiString( &ansiString, &unicodeString, fAllocate); return (status == STATUS_SUCCESS ? ansiString.Buffer : NULL); } // UnicodeStringToAnsiString PWCHAR AnsiStringToUnicodeString( IN PCHAR pszAnsi, OUT PWCHAR pszUnicode, IN USHORT cbUnicode ) { NTSTATUS status; BOOLEAN fAllocate = (pszUnicode == NULL); UNICODE_STRING unicodeString; ANSI_STRING ansiString; RtlInitAnsiString(&ansiString, pszAnsi); if (pszUnicode != NULL) { unicodeString.Length = 0; unicodeString.MaximumLength = cbUnicode; unicodeString.Buffer = pszUnicode; } status = RtlAnsiStringToUnicodeString( &unicodeString, &ansiString, fAllocate); return (status == STATUS_SUCCESS ? unicodeString.Buffer : NULL); } // AnsiStringToUnicodeString VOID FreeStringArray( IN LPTSTR *lpEntries, IN LONG lcEntries ) { while (--lcEntries >= 0) LocalFree(lpEntries[lcEntries]); LocalFree(lpEntries); } // FreeStringArray LPTSTR CanonicalizeAddress( IN LPTSTR pszAddress ) { LPTSTR psz, pWhack; if (pszAddress[0] == L'\\' && pszAddress[1] == L'\\') { psz = CopyString(&pszAddress[2]); if (psz == NULL) return NULL; pWhack = wcschr(psz, '\\'); if (pWhack != NULL) *pWhack = L'\0'; } else { psz = CopyString(pszAddress); if (psz == NULL) return NULL; } _wcslwr(psz); RASAUTO_TRACE2("CanonicalizeAddress(%S) returns %S", pszAddress, psz); return psz; } // CanonicalizeAddress BOOLEAN GetOrganization( IN LPTSTR pszAddr, OUT LPTSTR pszOrganization ) { BOOLEAN fSuccess = FALSE; TCHAR *pszA, *pszO; ULONG nDots; // // Get the domain and organization name. These // are the last two components separated by a '.'. // for (pszA = pszAddr; *pszA; pszA++); for (nDots = 0, pszA--; pszA != pszAddr; pszA--) { if (*pszA == TEXT('.')) nDots++; if (nDots == 2) break; } if (nDots == 2 || (pszA == pszAddr && nDots == 1)) { if (nDots == 2) pszA++; // skip '.' for (pszO = pszOrganization; *pszO = *pszA; pszA++, pszO++); fSuccess = TRUE; RASAUTO_TRACE2("GetOrganization: org for %S is %S", pszAddr, pszOrganization); } return fSuccess; } // GetOrganization // Tracing // DWORD g_dwRasAutoTraceId = INVALID_TRACEID; DWORD RasAutoDebugInit() { DebugInitEx("RASAUTO", &g_dwRasAutoTraceId); return 0; } DWORD RasAutoDebugTerm() { DebugTermEx(&g_dwRasAutoTraceId); return 0; } /* VOID repareForLongWait(VOID) { // // Unload user-based resources because they // cannot be held over logout/login sequence. // // RegCloseKey(HKEY_CURRENT_USER); } // PrepareForLongWait */ #if DBG VOID DumpHandles( IN PCHAR lpString, IN ULONG a1, IN ULONG a2, IN ULONG a3, IN ULONG a4, IN ULONG a5 ) { PSYSTEM_PROCESS_INFORMATION pSystemInfo, pProcessInfo; ULONG ulHandles; pSystemInfo = GetSystemProcessInfo(); if (pSystemInfo == NULL) return; pProcessInfo = FindProcessByName(pSystemInfo, L"rasman.exe"); if (pProcessInfo == NULL) return; DbgPrint(lpString, a1, a2, a3, a4, a5); DbgPrint(": HANDLES=%d\n", pProcessInfo->HandleCount); FreeSystemProcessInfo(pSystemInfo); } // DumpHandles #endif