查看当前主机最近文件(反沙箱)

news/2024/11/16 7:42:39/

手动

Win+R输入Recent

如果最近文件夹中的数量少于n,那就可以断定这台主机大概率是沙箱。 

代码

MFC框架中对最近文件列表的支持 

MFC建立的标准框架程序中有记录最近操作文件的能力,这些最近文件的路径被记录到注册表,在程序运行时,又将添加到文件菜单中。   

在CWinApp中有个  CRecentFileList*  m_pRecentFileList;指针管理这些信息。   

以下对此过程进行分析,采用类似的方法,可以保存其他一些固定条数的最近数据。   

CRecentFileList对象的建立,记录读入、记录保存、对象销毁。   

①建立与记录的读入   

如果在CWinApp派生类中InitInstance()中调用了LoadStdProfileSettings,则CRecentFileList被建立,于是程序具有管理最近文件列表的能力。   

同时,从注册表中读入以前的记录。 

void  CWinApp::LoadStdProfileSettings(UINT  nMaxMRU)  //缺省为4 
{ 
... 
if  (nMaxMRU  !=  0) 
{ 
//建立CRecentFileList对象,初始化为管理nMaxMRU条文件信息 
m_pRecentFileList  =  new  CRecentFileList(0,  _afxFileSection,  _afxFileEntry,nMaxMRU); 
//读入记录 
m_pRecentFileList->  ReadList(); 
} 
... 
} 

CRecentFileList对象中的主要数据成员   
 
CRecentFileList包含一个CString指针  CString*  m_arrNames;  ,它用来指向一个CString对象数组,正是这个数组记录了最近的文件名。 

另外,成员  int  m_nSize  指出了记录的个数。   
 
在对象创建时,构造函数完成初始化,包括CString数组的建立等。   
 
②记录的保存、CRecentFileList的销毁。   
 
ExitInstance()中将调用SaveStdProfileSettings(),SaveStdProfileSettings()中有m_pRecentFileList->WriteList();操作,完成记录的保存。   
 
在CWinApp析构时将delete  m_pRecentFileList;销毁对象。   

CRecentFileList::CRecentFileList(UINT  nStart,  LPCTSTR  lpszSection, 
LPCTSTR  lpszEntryFormat,  int  nSize,  int  nMaxDispLen) 
{ 
ASSERT(nSize  !=  0); 
m_arrNames  =  new  CString[nSize];  //建立CString数组。 
m_nSize  =  nSize; m_nStart  =  nStart; 
m_strSectionName  =  lpszSection; 
m_strEntryFormat  =  lpszEntryFormat; 
m_nMaxDisplayLength  =  nMaxDispLen; 
} 

记录的添加  

文档保存时,将调用SetPathName(..),SetPathName(..)中将调用应用程序类中的AddToRecentFileList   

AddToRecentFileList中执行m_pRecentFileList->Add(lpszPathName)将文件名添加到字符串数组   

void  CRecentFileList::Add(LPCTSTR  lpszPathName) 
{ 
ASSERT(m_arrNames  !=  NULL); 
ASSERT(lpszPathName  !=  NULL); 
ASSERT(AfxIsValidString(lpszPathName)); //  fully  qualify  the  path  name 
TCHAR  szTemp[_MAX_PATH]; 
AfxFullPath(szTemp,  lpszPathName);    //得到文件全路径 //  查找,看是否已经有此文件名 
for  (int  iMRU  =  0;  iMRU  <  m_nSize-1;  iMRU++) 
{ 
if  (AfxComparePath(m_arrNames[iMRU],  szTemp)) 
break;            //  iMRU  will  point  to  matching  entry 
} 
//  其前面的各项后移 
for  (;  iMRU  >  0;  iMRU--) 
{ 
ASSERT(iMRU  >  0); 
ASSERT(iMRU  <  m_nSize); 
m_arrNames[iMRU]  =  m_arrNames[iMRU-1]; 
} 
//添加到起始位置 
m_arrNames[0]  =  szTemp; 
} 

记录的删除

如果用户从菜单中选择打开某记录对应的文件,单该文件已经不存在,则将删除该无效记录。   

void  CRecentFileList::Remove(int  nIndex) 
{ 
ASSERT(nIndex  >=  0); 
ASSERT(nIndex  <  m_nSize); m_arrNames[nIndex].Empty(); 
for  (int  iMRU  =  nIndex;  iMRU  <  m_nSize-1;  iMRU++) 
m_arrNames[iMRU]  =  m_arrNames[iMRU+1];  //其后各项前移 ASSERT(iMRU  <  m_nSize); 
m_arrNames[iMRU].Empty(); 
} 

记录数据的保存

void  CRecentFileList::WriteList() 
{ 
ASSERT(m_arrNames  !=  NULL); 
ASSERT(!m_strSectionName.IsEmpty());    //  m_strSectionName  :  _T("Recent  File  List") 
ASSERT(!m_strEntryFormat.IsEmpty());    //  m_strEntryFormat  :  _T("File%d")     
LPTSTR  pszEntry  =  new  TCHAR[m_strEntryFormat.GetLength()+5]; 
CWinApp*  pApp  =  AfxGetApp(); 
pApp->  WriteProfileString(m_strSectionName,  NULL,  NULL);  //写入Recent  File  List键 
for  (int  iMRU  =  0;  iMRU  <  m_nSize;  iMRU++) 
{ 
wsprintf(pszEntry,  m_strEntryFormat,  iMRU  +  1);    //得到号吗字符串 
if  (!m_arrNames[iMRU].IsEmpty()) 
{ 
pApp->  WriteProfileString(m_strSectionName,  pszEntry,      //在写值名pszEntry,对应值为文件名。 
m_arrNames[iMRU]); 
} 
} 
delete[]  pszEntry; 
} 

记录数据的读取   

void  CRecentFileList::ReadList() 
{ 
ASSERT(m_arrNames  !=  NULL); 
ASSERT(!m_strSectionName.IsEmpty()); 
ASSERT(!m_strEntryFormat.IsEmpty()); 
LPTSTR  pszEntry  =  new  TCHAR[m_strEntryFormat.GetLength()+5]; 
CWinApp*  pApp  =  AfxGetApp(); 
for  (int  iMRU  =  0;  iMRU  <  m_nSize;  iMRU++) 
{ 
wsprintf(pszEntry,  m_strEntryFormat,  iMRU  +  1);    //得到值名字符串 
m_arrNames[iMRU]  =  pApp->  GetProfileString( //取值名下的值,此即个记录,若值不存在,则为NULL 
m_strSectionName,  pszEntry,  &afxChNil); 
} 
delete[]  pszEntry; 
} 

将记录添加到菜单项   

菜单资源中文件菜单下有ID为ID_FILE_MRU_FILE1的菜单项,用于在此处添加最近文件菜单项。   

命令更新机制根据ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1,  OnUpdateRecentFileMenu)将经常调用到 

CWinApp::OnUpdateRecentFileMenu(..)   

OnUpdateRecentFileMenu中调用void  CRecentFileList::UpdateMenu(CCmdUI*  pCmdUI)   

void  CRecentFileList::UpdateMenu(CCmdUI*  pCmdUI) 
{ 
ASSERT(m_arrNames  !=  NULL); CMenu*  pMenu  =  pCmdUI->  m_pMenu;  //由pCmdUI直接找到菜单 
if  (m_strOriginal.IsEmpty()  &&  pMenu  !=  NULL) 
pMenu->  GetMenuString(pCmdUI->  m_nID,  m_strOriginal,  MF_BYCOMMAND); if  (m_arrNames[0].IsEmpty()) 
{ 
//  no  MRU  files 
if  (!m_strOriginal.IsEmpty()) 
pCmdUI->  SetText(m_strOriginal); 
pCmdUI->  Enable(FALSE); 
return; 
} if  (pCmdUI->  m_pMenu  ==  NULL) 
return; for  (int  iMRU  =  0;  iMRU  <  m_nSize;  iMRU++)      //删除所有最新文件菜单项 
pCmdUI->  m_pMenu->  DeleteMenu(pCmdUI->  m_nID  +  iMRU,  MF_BYCOMMAND); TCHAR  szCurDir[_MAX_PATH]; 
GetCurrentDirectory(_MAX_PATH,  szCurDir); 
int  nCurDir  =  lstrlen(szCurDir); 
ASSERT(nCurDir  >=  0); 
szCurDir[nCurDir]  =  '\\'; 
szCurDir[++nCurDir]  =  '\0'; CString  strName; 
CString  strTemp; 
for  (iMRU  =  0;  iMRU  <  m_nSize;  iMRU++) 
{ 
if  (!GetDisplayName(strName,  iMRU,  szCurDir,  nCurDir)) 
break; //  double  up  any  '&'  characters  so  they  are  not  underlined 
LPCTSTR  lpszSrc  =  strName; 
LPTSTR  lpszDest  =  strTemp.GetBuffer(strName.GetLength()*2); 
while  (*lpszSrc  !=  0) 
{ 
if  (*lpszSrc  ==  '&') 
*lpszDest++  =  '&'; 
if  (_istlead(*lpszSrc)) 
*lpszDest++  =  *lpszSrc++; 
*lpszDest++  =  *lpszSrc++; 
} 
*lpszDest  =  0; 
strTemp.ReleaseBuffer(); //  insert  mnemonic  +  the  file  name 
TCHAR  buf[10]; 
wsprintf(buf,  _T("&%d  "),  (iMRU+1+m_nStart)  %  10); 
pCmdUI->  m_pMenu->  InsertMenu(pCmdUI->  m_nIndex++, 
MF_STRING  |  MF_BYPOSITION,  pCmdUI->  m_nID++, 
CString(buf)  +  strTemp);    //添加菜单项 
} //  update  end  menu  count 
pCmdUI->  m_nIndex--;  //  point  to  last  menu  added 
pCmdUI->  m_nIndexMax  =  pCmdUI->  m_pMenu->  GetMenuItemCount(); pCmdUI->  m_bEnableChanged  =  TRUE;        //  all  the  added  items  are  enabled 
} 

对最近文件菜单项的响应

系统通过消息映射  ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1,  ID_FILE_MRU_FILE16,  OnOpenRecentFile)   

调用OnOpenRecentFile,命令ID作为参数传入   

BOOL  CWinApp::OnOpenRecentFile(UINT  nID) 
{ 
ASSERT_VALID(this); 
ASSERT(m_pRecentFileList  !=  NULL); ASSERT(nID  >=  ID_FILE_MRU_FILE1); 
ASSERT(nID  <  ID_FILE_MRU_FILE1  +  (UINT)m_pRecentFileList->  GetSize()); 
int  nIndex  =  nID  -  ID_FILE_MRU_FILE1; 
ASSERT((*m_pRecentFileList)[nIndex].GetLength()  !=  0); TRACE2("MRU:  open  file  (%d)  '%s'.\n",  (nIndex)  +  1, 
(LPCTSTR)(*m_pRecentFileList)[nIndex]); if  (OpenDocumentFile((*m_pRecentFileList)[nIndex])  ==  NULL) 
m_pRecentFileList->  Remove(nIndex); return  TRUE;

http://www.ppmy.cn/news/26696.html

相关文章

Java多线程 - 利用Callable或CompletableFuture实现多线程异步任务执行

文章目录1. Callable接口源码2. Future接口的源码3. RunnableFuture接口和FutureTask实现类4. 利用线程池和Callable接口实现异步执行任务5. 利用CompleteFutable实现多线程异步任务执行1. Callable接口源码 FunctionalInterface public interface Callable<V> {// 这个…

三次握手四次挥手详细解析面试常问

文章目录1.第2次握手传回了ACK&#xff0c;为什么还要传回SYN&#xff1f;2.断开连接-TCP 四次挥手3.为什么要四次挥手&#xff1f;4.为什么不能把服务器发送的 ACK 和 FIN 合并起来&#xff0c;变成三次挥手&#xff1f;5.如果第二次挥手时服务器的 ACK 没有送达客户端&#x…

PCI设备驱动初探(仅仅是内核部分,不是具体设备驱动)

在操作系统中&#xff0c;声卡、网卡之类的设备驱动并不像硬盘、鼠标、键盘等等驱动直接编写就行了。它们是建立在内核PCI驱动基础上的&#xff0c;也就是说这类设备通过PCI总线与系统通信。所以要编写这类的驱动首先要构造一个PCI设备的内核驱动&#xff0c;这样我们才能继续正…

模拟用户登录-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-3】 模拟用户登录 【案例介绍】 1.任务描述 在使用一些APP时&#xff0c;通常都需要填写用户名和密码。用户名和密码输入都正确才会登录成功&#xff0c;否则会提示用户名或密码错误。 本例要求编写一个程序&#xff0c;模拟用户登录。程序要求如下&#xff1a; 用…

力扣mysql刷题记录

mysql刷题记录 刷题链接https://leetcode.cn/study-plan/sql/?progressjkih0qc mysql冲&#xff01;mysql刷题记录一. 1699. 两人之间的通话次数题解二、1251. 平均售价题解三. 1571. 仓库经理题解四.1445. 苹果和桔子解五.1193. 每月交易 I题解六.1633. 各赛事的用户注册率题…

如何使用Hugo Academic Theme构建自己的github主页

前期条件 自己已经注册好GitHub 搜索Hugo Academic Theme&#xff08;网址&#xff09; 进入后的网址为&#xff1a;https://academic-demo.netlify.app/ 点击Get Start 出现如下模板&#xff0c;选择一个喜欢的模板&#xff0c;点击“START WITH ACADEMIC RESUME” 点击 …

calico-kube-controllers 启动失败处理

故障描述calico-kube-controllers 异常&#xff0c;不断重启日志信息如下2023-02-21 01:26:47.085 [INFO][1] main.go 92: Loaded configuration from environment config&config.Config{LogLevel:"info", WorkloadEndpointWorkers:1, ProfileWorkers:1, PolicyW…

CAD正式学习(一)

CAD正式学习&#xff08;一&#xff09;&#xff08;23.2.20&#xff09; CAD简介 CAD是Autodesk&#xff08;欧特克&#xff09;公司首次于1982年开发的自动计算机辅助软件&#xff0c;主要用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;是广为流行的绘图工具…