能力值:
( LV2,RANK:10 )
|
-
-
576 楼
感谢lz:
正在用你的代码(上周下载的)做一个小的监视器自己用,你的代码我用VC6编译了,应用改为 sdk的了(不过还没改完,只取了一两个来注册表,进程),不想用mfc。去掉了换肤(本人对界面不感冒,喜欢简单),驱动用VC6编译时有几个小的问题,忘了在那里了(注意警告),好象有个别变量没付值就用,用VC6编译时就知道了(没有直接用你的工程,我全都是另建工程,改的时候忘了位置了)。应用方面控件可以减少,例如listview只用三个就行,可以增减列实现。扫描进程时第一列图标时有的加上,没有的可不显示图标(自绘图标没意义)。
其它:例如取进程(先用驱动,不行改用其它方法,取消对话框提示)。
我的系统是 xp3,调试确实有过兰屏重启,应当和驱动有关(或应用调用驱动出错)。正在处理驱动,加些出错处理。
注册表监视部分有问题,有应用似乎一直不停的进行,不能取消。拖慢了系统,似乎没放到一个线程里,这部分还没有弄,只是用你的程序。
例如以下代码更改,两个单击似乎简单了,因为相同部分放到了第一个函数中,还有就是改为 ANSI方式编译,因此去掉了 "L"标记(你的代码中很多api加上W,害得我去掉都花了很多时间),改为 _T宏,支持UNICODE编译,下面的函数加上了处理“smss.exe” “csrss.exe” “winlogon.exe” 路径是"\??\c:..."的问题,呵呵,贴出来
//CProcess 就是你的Page1,不好意思,全都改名了
void CProcess::SetProcessToList(TCHAR* cName,DWORD dwID)
{
TCHAR *pBuffer=0,*lpBuffer,cID[MAX_PATH], cPath[MAX_PATH],*pc[4];
int i,j,len1,len;
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
UINT cbTranslateLen,uBytes;
//hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,ProTem.pid);
HANDLE hProcess=pCMySystem->My_OpenProcess(PROCESS_ALL_ACCESS,0,dwID,TRUE,(LPDWORD)0);
pc[0]=cName;
D_sprintf(cID,_T("%d"),dwID);
pc[1]=cID;
len=GetModuleFileNameEx(hProcess,NULL,cPath,MAX_PATH);
if(len){
if(len&&cPath[1]!=':'){
TCHAR c[260],*p1=_T("SystemRoot");
len1=strlen(p1);
memcpy(c,cPath+1,len1);
c[len1]=0;
if(!lstrcmpi(p1,c)){//smss.exe
lstrcpy(c,cPath);
GetWindowsDirectory(cPath,MAX_PATH);
lstrcat(cPath,c+len1+1);
}else{ //csrss.exe winlogon.exe \??\c:
for(i=0;i<len;i++){
if(cPath[i+1]==':'){
for(j=0;i<len+1;i++,j++){
cPath[j]=cPath[i];
}
break;
}
}
}
}
pc[2]=cPath;
}else
pc[2]=_T("");
len=GetFileVersionInfoSizeA(cPath,NULL);
if(len){
pBuffer=new TCHAR[len+1];
if(GetFileVersionInfo(cPath,NULL,len,pBuffer)){
TCHAR c[MAX_PATH];
VerQueryValue(pBuffer,_T("\\VarFileInfo\\Translation"),(LPVOID*)&lpTranslate,&cbTranslateLen);
D_sprintf(c,_T("\\StringFileInfo\\%04x%04x\\CompanyName"),
lpTranslate[0].wLanguage,lpTranslate[0].wCodePage);
VerQueryValue(pBuffer,c,(LPVOID*)&lpBuffer,&uBytes);
}
pc[3]=lpBuffer;
}else
pc[3]=_T("");
//进程
pCList->InsertFileIcon(pCList->hProList,pCList->hProListIcon,cPath);
pCList->InsertDataToList(pCList->hProList,pCList->hProListColNum,pc,i);
if(pBuffer)
delete[]pBuffer;
CloseHandle(hProcess);
}
//单击,驱动法列举进程事件
void CProcess::GetProcessForDrive()
{
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSnapshot==INVALID_HANDLE_VALUE) return;
int i;
DWORD dwOldProtect;
MODULEENTRY32 mInfo;
PROCESSENTRY32 pInfo;
SProcess ProTem;
pInfo.dwSize=sizeof(PROCESSENTRY32);
HINSTANCE hInstance=(HINSTANCE)GetModuleHandle(NULL);
mInfo.dwSize=sizeof(MODULEENTRY32);
//清空
DelProcessList();
int ProNum=0,nTryNum=0;
void* ProN;
if(pCMySystem->hHandle==(HANDLE)-1){
//DMsgBox(_T("建立设备链接失败!"));
GetProcess();
return;
}
Again_:
ProNum=pCMySystem->GetProNum(pCMySystem-> hHandle);
ProN=(void*)malloc(ProNum*sizeof(SProcess));
if(!ProN){
pCMySystem->ClearDeviceIoControl(pCMySystem->hHandle,IOCTL_KSBINSWORD_CLEARPROCESS);
DMsgBox(_T("内存不足!"));
return;
}
memset(ProN,0,ProNum*sizeof(SProcess));
VirtualProtect(ProN,ProNum*sizeof(SProcess),PAGE_READWRITE,&dwOldProtect);
DWORD ErrCode=pCMySystem->GetPro(pCMySystem->hHandle,ProN,(2*ProNum)*sizeof(SProcess));
if(998==ErrCode){
nTryNum++;
if(nTryNum>4){
//DMsgBox(_T("用普通方法列举进程获取正确的进程列表 !"));
GetProcess();
return;
}
Sleep(2000);
goto Again_;
}
for(i=0;i<ProNum-1;i++){
ProTem=*((SProcess*)(ProN)+i);
SetProcessToList((TCHAR*)ProTem.name,ProTem.pid);
}
free(ProN);
//ListView_SortItems(pCList->hProList,(PFNLVCOMPARE)ListStrCmp,(LPARAM)i-1);
}
////单击,普通方法列举进程
void CProcess::GetProcess()
{
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hSnapshot==INVALID_HANDLE_VALUE){return;}
int i;
PROCESSENTRY32 pInfo;
MODULEENTRY32 mInfo;
pInfo.dwSize=sizeof(PROCESSENTRY32);
//HINSTANCE hInstance=(HINSTANCE)GetModuleHandle(NULL);
mInfo.dwSize=sizeof(MODULEENTRY32);
HANDLE hSnapshotInner;
//清空
DelProcessList();
for(BOOL bRet=Process32First(hSnapshot,&pInfo);bRet;bRet=Process32Next(hSnapshot,&pInfo),i++){
if(!lstrcmp(pInfo.szExeFile,_T("[System Process]"))||!lstrcmp(pInfo.szExeFile,_T("System"))){
//m_ProImageList.Add(hKenny);
}else{
hSnapshotInner=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pInfo.th32ProcessID);
Module32First(hSnapshotInner,&mInfo);
}
SetProcessToList((TCHAR*)pInfo.szExeFile,pInfo.th32ProcessID);
}
}
|