/*++ Copyright (c) 1996-1999 Microsoft Corporation Module Name: UTIL.CPP Abstract: Utility functions Author: Vlad Sadovsky (vlads) 4-12-99 Revision History: --*/ // // Headers // #include "stdafx.h" #include "stimon.h" #include "memory.h" #include #include BOOL ParseCommandLine( LPTSTR lpszCmdLine, UINT *pargc, LPTSTR *argv ) /*++ Routine Description: Parses command line into standard arg.. array. Arguments: None. Return Value: TRUE - command line parsed --*/ { USES_CONVERSION; LPTSTR pszT = lpszCmdLine; TCHAR cOption; UINT iCurrentOption = 0; *pargc=0; // // Get to first parameter in command line. // while (*pszT && ((*pszT != '-') && (*pszT != '/')) ) { pszT++; } // // Parse options from command line // while (*pszT) { // Skip white spaces while (*pszT && *pszT <= ' ') { pszT++; } if (!*pszT) break; if ('-' == *pszT || '/' == *pszT) { pszT++; if (!*pszT) break; argv[*pargc] = pszT; (*pargc)++; } // Skip till space while (*pszT && *pszT > ' ') { pszT++; } if (!*pszT) break; // Got next argument *pszT++='\0'; } // // Interpret options // if (*pargc) { for (iCurrentOption=0; iCurrentOption < *pargc; iCurrentOption++) { cOption = *argv[iCurrentOption]; pszT = argv[iCurrentOption]+ 2 * sizeof(TCHAR); switch ((TCHAR)LOWORD(::CharUpper((LPTSTR)cOption))) { case 'Q': // // Exit main service instance // g_fStoppingRequest = TRUE; break; case 'V': // Become visible g_fUIPermitted = TRUE; break; case 'H': // Become invisible g_fUIPermitted = FALSE; break; case 'R': // Refresh device list g_fRefreshDeviceList = TRUE; break; case 'A': // Not running as a service, but as an app g_fRunningAsService = FALSE; break; case 'T': // Value of timeout in seconds { UINT uiT = atoi(T2A(pszT)); if (uiT) { g_uiDefaultPollTimeout = uiT * 1000; } } break; case 'I': // Install STI service g_fInstallingRequest = TRUE; break; case 'U': // Uninstall STI service g_fRemovingRequest = TRUE; break; default:; break; } } } // // Print parsed options for debug build // return TRUE; } // ParseCommandLine BOOL IsSetupInProgressMode( BOOL *pUpgradeFlag // = NULL ) /*++ Routine Description: IsSetupInProgressMode Arguments: Pointer to the flag, receiving InUpgrade value Return Value: TRUE - setup is in progress FALSE - not Side effects: --*/ { LPCTSTR szKeyName = TEXT("SYSTEM\\Setup"); DWORD dwType, dwSize; HKEY hKeySetup; DWORD dwSystemSetupInProgress,dwUpgradeInProcess; LONG lResult; DBGTRACE _t(TEXT("IsSetupInProgressMode")); if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, szKeyName, 0, KEY_READ, &hKeySetup) == ERROR_SUCCESS) { dwSize = sizeof(DWORD); lResult = RegQueryValueEx (hKeySetup, TEXT("SystemSetupInProgress"), NULL, &dwType, (LPBYTE) &dwSystemSetupInProgress, &dwSize); if (lResult == ERROR_SUCCESS) { lResult = RegQueryValueEx (hKeySetup, TEXT("UpgradeInProgress"), NULL, &dwType, (LPBYTE) &dwUpgradeInProcess, &dwSize); if (lResult == ERROR_SUCCESS) { DPRINTF(DM_TRACE, TEXT("[IsInSetupUpgradeMode] dwSystemSetupInProgress =%d, dwUpgradeInProcess=%d "), dwSystemSetupInProgress,dwUpgradeInProcess); if( pUpgradeFlag ) { *pUpgradeFlag = dwUpgradeInProcess ? TRUE : FALSE; } if (dwSystemSetupInProgress != 0) { return TRUE; } } } RegCloseKey (hKeySetup); } return FALSE ; } BOOL WINAPI IsPlatformNT() { OSVERSIONINFOA ver; BOOL bReturn = FALSE; ZeroMemory(&ver,sizeof(ver)); ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); // Just always call the ANSI function if(!GetVersionExA(&ver)) { bReturn = FALSE; } else { switch(ver.dwPlatformId) { case VER_PLATFORM_WIN32_WINDOWS: bReturn = FALSE; break; case VER_PLATFORM_WIN32_NT: bReturn = TRUE; break; default: bReturn = FALSE; break; } } return bReturn; } // endproc LONG RegQueryDword ( IN HKEY hkey, IN LPCTSTR pszValueName, OUT LPDWORD pdwValue ) { LONG lr; DWORD dwType; DWORD dwSize; ASSERT (hkey); ASSERT (pszValueName); ASSERT (pdwValue); dwSize = sizeof(DWORD); lr = RegQueryValueEx ( hkey, pszValueName, NULL, &dwType, (LPBYTE)pdwValue, &dwSize); if (!lr && (REG_DWORD != dwType)) { *pdwValue = 0; lr = ERROR_INVALID_DATATYPE; } return lr; } LONG RegQueryValueWithAlloc ( IN HKEY hkey, IN LPCTSTR pszValueName, IN DWORD dwTypeMustBe, OUT LPBYTE* ppbData, OUT LPDWORD pdwSize ) { LONG lr; DWORD dwType; DWORD dwSize; ASSERT (hkey); ASSERT (pszValueName); ASSERT (ppbData); ASSERT (pdwSize); // Initialize the output parameters. // *ppbData = NULL; *pdwSize = 0; // Get the size of the buffer required. // dwSize = 0; lr = RegQueryValueEx ( hkey, pszValueName, NULL, &dwType, NULL, &dwSize); if (!lr && (dwType == dwTypeMustBe) && dwSize) { LPBYTE pbData; // Allocate the buffer. // lr = ERROR_OUTOFMEMORY; pbData = (PBYTE)MemAlloc (0, dwSize); if (pbData) { // Get the data. // lr = RegQueryValueEx ( hkey, pszValueName, NULL, &dwType, pbData, &dwSize); if (!lr) { *ppbData = pbData; *pdwSize = dwSize; } else { MemFree (pbData); } } } else if (!lr && (dwType != dwTypeMustBe)) { lr = ERROR_INVALID_DATA; } return lr; } LONG RegQueryString ( IN HKEY hkey, IN LPCTSTR pszValueName, IN DWORD dwTypeMustBe, OUT PTSTR* ppszData ) { LONG lr; DWORD dwSize; ASSERT (hkey); ASSERT (pszValueName); lr = RegQueryValueWithAlloc ( hkey, pszValueName, dwTypeMustBe, (LPBYTE*)ppszData, &dwSize); return lr; } LONG RegQueryStringA ( IN HKEY hkey, IN LPCTSTR pszValueName, IN DWORD dwTypeMustBe, OUT PTSTR* ppszData ) { LONG lr; PTSTR pszUnicode; ASSERT (hkey); ASSERT (pszValueName); ASSERT (ppszData); // Initialize the output parameter. // *ppszData = NULL; lr = RegQueryString ( hkey, pszValueName, dwTypeMustBe, &pszUnicode); if (!lr && pszUnicode) { INT cb; INT cchUnicode = lstrlen (pszUnicode) + 1; // Compute the number of bytes required to hold the ANSI string. // cb = WideCharToMultiByte ( CP_ACP, // CodePage 0, // dwFlags (LPCWSTR)pszUnicode, cchUnicode, NULL, // no buffer to receive translated string 0, // return the number of bytes required NULL, // lpDefaultChar NULL); // lpUsedDefaultChar if (cb) { PSTR pszAnsi; lr = ERROR_OUTOFMEMORY; pszAnsi = (PSTR)MemAlloc (0, cb); if (pszAnsi) { lr = NOERROR; // Now translate the UNICODE string to ANSI. // cb = WideCharToMultiByte ( CP_ACP, // CodePage 0, // dwFlags (LPCWSTR)pszUnicode, cchUnicode, pszAnsi, // buffer to receive translated string cb, // return the number of bytes required NULL, // lpDefaultChar NULL); // lpUsedDefaultChar if (cb) { *ppszData = (PTSTR)pszAnsi; } else { MemFree (pszAnsi); lr = GetLastError (); } } } MemFree (pszUnicode); } else { lr = ERROR_NOT_ENOUGH_MEMORY; } return lr; } LONG OpenServiceParametersKey ( LPCTSTR pszServiceName, HKEY* phkey ) { LONG lr; HKEY hkeyServices; // Open the Services key. // lr = RegOpenKeyEx ( HKEY_LOCAL_MACHINE, REGSTR_PATH_SERVICES, 0, KEY_READ, &hkeyServices); if (!lr) { HKEY hkeySvc; // Open the service key. // lr = RegOpenKeyEx ( hkeyServices, pszServiceName, 0, KEY_READ, &hkeySvc); if (!lr) { // Open the Parameters key. // lr = RegOpenKeyEx ( hkeySvc, TEXT("Parameters"), 0, KEY_READ, phkey); RegCloseKey (hkeySvc); } RegCloseKey (hkeyServices); } return lr; }