static CString GetRootPath(LPCTSTR szFullPath) { CString strRoot(szFullPath); CString strTempPath(szFullPath); int nPos = strTempPath.Find(_T('\\')); if (nPos != -1) strRoot = strTempPath.Left(nPos); return strRoot; }
BOOL CDiskObject::CreateDirectory( const CString& directory ) /* ============================================================ Function : CDiskObject::CreateDirectory Description : Will recursively create the directory "directory". Access : Public Return : BOOL - "TRUE" if OK. "GetErrorMessage" will get an error string if "FALSE" Parameters : CString directory - directory to create Usage : Call to create a directory chain. ============================================================*/ { ClearError( ); BOOL result = TRUE; CString indir( directory ); if( indir.GetLength( ) ) { QualifyPath( indir ); _TCHAR drive[ _MAX_PATH ]; _TCHAR dir[ _MAX_DIR ]; _TCHAR fname[ _MAX_FNAME ]; _TCHAR ext[ _MAX_EXT ]; // Split directory into parts _tsplitpath( indir, drive, dir, fname, ext ); TCHAR currentDirectory[ _MAX_PATH ]; ::GetCurrentDirectory( _MAX_PATH, currentDirectory ); CStringArray directories; CString parts = dir; if( parts.GetLength( ) > 2 ) { if( parts.Left( 2 ) == _T( "\\\\" ) ) { // We have an UNC name CString strComputer; parts = parts.Right( parts.GetLength( ) - 2 ); int findDir = parts.Find( _TCHAR( '\\' ) ); if( findDir!=-1) { strComputer = _T( "\\\\" ) + parts.Left( findDir ); parts = parts.Right( parts.GetLength( ) - ( findDir + 1 ) ); } _tcscpy( drive, strComputer ); } } CString strRoot( drive ); // Strip leading \'s while( parts.GetLength( ) && parts[0] == _TCHAR( '\\' ) ) parts = parts.Right( parts.GetLength( ) - 1 ); // Cut into separate directories int find = parts.Find( _TCHAR( '\\' ) ); while( find != -1 ) { directories.Add( parts.Left( find ) ); parts = parts.Right( parts.GetLength( ) - ( find + 1 ) ); find = parts.Find( _TCHAR( '\\' ) ); } if( parts.GetLength( ) ) directories.Add( parts ); if( fname ) directories.Add( fname ); // Loop directories one-by-one, creating as necessary INT_PTR max = directories.GetSize( ); CString strCurrentDirectory( strRoot ); for( INT_PTR t = 0 ; t < max ; t++ ) { strCurrentDirectory += _TCHAR( '\\' ) + directories[ t ]; Trigger( strCurrentDirectory ); if( !( result = ::SetCurrentDirectory( strCurrentDirectory ) ) ) { if( !( result = ::CreateDirectory( strCurrentDirectory, NULL ) ) ) { SetSystemErrorMessage( ::GetLastError( ), strCurrentDirectory ); t = max; } } } ::SetCurrentDirectory( currentDirectory ); } else { SetInternalErrorMessage( ); result = FALSE; } return result; }
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstExePrev, LPSTR pszCmdLine, int nCmdShow) { // ***** To debug this application **** // set fDebug to 1, then recompile (in debug mode) // and run the program in a debugger like any windows .exe // The exact same code executes as if the user clicked the // 'start' button in the NT services manager. int fDebug = 0; int nArgc = __argc; #ifdef UNICODE LPCTSTR *ppArgv = (LPCTSTR*) CommandLineToArgvW(GetCommandLine(), &nArgc); #else LPCTSTR *ppArgv = (LPCTSTR*) __argv; #endif BOOL fStartService = (nArgc < 2); int i; int bInstall = 0; int bRemove = 0; int bChange = 0; GString strPort("10888"); GString strBoot; GString strRoot("NotUsed"); for (i = 1; i < nArgc; i++) { if ((ppArgv[i][0] == __TEXT('-')) || (ppArgv[i][0] == __TEXT('/'))) { // Command line switch if (lstrcmpi(&ppArgv[i][1], __TEXT("install")) == 0) bInstall = 1; if (lstrcmpi(&ppArgv[i][1], __TEXT("remove")) == 0) bRemove = 1; if (lstrcmpi(&ppArgv[i][1], __TEXT("change")) == 0) bChange = 1; GString strTemp(&ppArgv[i][1],strlen("desc:")); if (strTemp.CompareNoCase("desc:") == 0) { strServerDescription = &ppArgv[i][1+strlen("desc:")]; } GString strTemp2(&ppArgv[i][1],strlen("name:")); if (strTemp2.CompareNoCase("name:") == 0) { strServerName = &ppArgv[i][1+strlen("name:")]; } GString strTemp3(&ppArgv[i][1],strlen("pass:"******"pass:"******"pass:"******"boot:")); if (strTemp4.CompareNoCase("boot:") == 0) { strBoot = &ppArgv[i][1+strlen("boot:")]; } GString strTemp5(&ppArgv[i][1],strlen("port:")); if (strTemp5.CompareNoCase("port:") == 0) { strPort = &ppArgv[i][1+strlen("port:")]; } GString strTemp6(&ppArgv[i][1],strlen("root:")); if (strTemp6.CompareNoCase("root:") == 0) { strRoot = &ppArgv[i][1+strlen("root:")]; } } } if (bChange) { ModifyStartupFile(strBoot,strServerPassword,strRoot,strPort); } if (bInstall) { GString strThisEXEName(GetThisEXEName()); // uuencode strBoot BUFFER b; BufferInit(&b); uuencode((unsigned char *)(const char *)strBoot, (int)strBoot.Length(), &b); GString strEncodedBoot((char *)b.pBuf, b.cLen); BufferTerminate(&b); // open the registry, save the coded boot key, close the registry HKEY hk; if (RegCreateKey(HKEY_CLASSES_ROOT,(const char *)strThisEXEName,&hk) == ERROR_SUCCESS) { RegSetValue(hk,NULL,REG_SZ,(const char *)strEncodedBoot,0); RegCloseKey(hk); } // use root of file system to store the startup file // unless specified otherwise by environment setting GString strOutFile("c:\\"); strOutFile += strThisEXEName; if (getenv(strThisEXEName)) { strOutFile += getenv(strThisEXEName); } // create the startup file GString strTempFile; strTempFile << strServerPassword << "&&" << strRoot << "&&" << strPort; strTempFile.ToFile("tempfile"); GString strErrorOut; FileEncrypt(strBoot, "tempfile", strOutFile, strErrorOut); unlink("tempfile"); InstallService(); } if (bRemove) { RemoveService(); GString strThisEXEName(GetThisEXEName()); // remove the registry entry RegDeleteKey(HKEY_CLASSES_ROOT,(const char *)strThisEXEName); // remove the startup file GString strOutFile("c:\\"); strOutFile += strThisEXEName; if (getenv(strThisEXEName)) { strOutFile += getenv(strThisEXEName); } unlink(strOutFile); } strcpy(pzServer,strServerName); if (fDebug) { // Running as EXE not as service, just run the service for debugging TimeServiceMain(0, NULL); } if (fStartService) { SERVICE_TABLE_ENTRY ServiceTable[] = { { pzServer, TimeServiceMain }, { NULL, NULL } // End of list }; StartServiceCtrlDispatcher(ServiceTable); } return(0); }