📄 embocheck2.cpp
字号:
// EmboCheck.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <StoreMgr.h>
#include <pnp.h>
#include "shlwapi.h"
#include "getdatas.h"
#include "NetEnvSetting.h"
#include "GetRegFile.h"
#define MAX_LEN_64 64
#define MAX_LEN_16 16
#define REG_KEY_EMBO_SYSTEM TEXT("SOFTWARE\\Embedded-Tech\\System")
#define REG_KEY_EMBO_SNPATH TEXT("SNPATH")
#define REG_KEY_EMBO_LOADER TEXT("Loader")
#define REG_KEY_EMBO_COMM_REDIR TEXT("Comm\\Redir\\Connections\\")
#define REG_KEY_EMBO_CHECK _T("Software\\Embedded-Tech\\EmboCheck")
#define REG_KEY_EMBO_DUPDATES _T("Software\\Embedded-Tech\\DUpdates")
#define Embo_Wcopy_Folder _T("\\EmboBSP\\Wcopy\\")
#define Embo_Wcopy_ToFind _T("\\EmboBSP\\Wcopy\\*.*")
#define Embo_Wcopy_Exclude _T("backup")
#define Embo_Wcopy_ExcludeFile1 _T(".reg")
#define Embo_Wcopy_ExcludeFile2 _T(".deg")
#define Embo_Wcopy_ExcludeFile3 _T("EmboAutoRun.bat")
TCHAR g_szEmboRoot[MAX_PATH]={0};
TCHAR g_szEmboRootVolume[MAX_PATH]={0}; //it should be "\harddisk" or "\harddisk2" ....
BOOL fPathOK=FALSE;
BOOL fFilesOK=FALSE;
BOOL g_IsPureOS=FALSE;
BOOL g_IsNetwork=FALSE;
HKEY hKey=NULL;
DWORD dwRegResult;
BOOT_ARGS g_bootArg={0};
EmboBaseInfo g_baseInfo={0};
DWORD dwNetworkMappingRetry=128;
DWORD dwNetworkMappingRetryGap=1000;
DWORD dwWaitForPathOKTime=180000; //About 180 seconds
DWORD dwRegValueType=REG_DWORD;
DWORD dwRegValueLength=0;
DWORD dwDisposition;
DWORD dwInitPri=0;
DWORD dwWorkingPri=0;
DWORD dwLocalPri=0;
DWORD dwNetworkPri=0;
CNetEnvSetting network;
HANDLE hNotifications;
// This event is used to stop the notification thread
// should the driver be closed
#define EmboCheck_WorkingThreadStopEvent _T("EmboCheck_WorkingThreadStopEvent")
#define Embo_DetectLocalPathThreadStopEvent _T("Embo_DetectLocalPathThreadStopEvent")
#define Embo_Folder_Ready_Event _T("Embo_Folder_Ready_Event")
#define Embo_FileCopy_Ready_Event _T("Embo_FileCopy_Ready_Event")
#define Embo_Registry_Ready_Event _T("Embo_Registry_Ready_Event")
#define Embo_AutoRun_Ready_Event _T("Embo_AutoRun_Ready_Event")
HANDLE hEmbo_Folder_Ready_Event=NULL;
HANDLE hEmbo_FileCopy_Ready_Event=NULL;
HANDLE hEmbo_Registry_Ready_Event=NULL;
HANDLE hEmbo_AutoRun_Ready_Event=NULL;
HANDLE hWorkingThreadStopEvent=NULL;
HANDLE hDetectLocalPathThreadStopEvent=NULL;
HANDLE hDetectNetworkPathThreadStopEvent=NULL;
HANDLE hWorkingThread=NULL;
HANDLE hDetectLocalPathThread=NULL;
HANDLE hDetectNetworkPathThread=NULL;
void SetNetworkPara(CNetEnvSetting* pnetwork, PEmboBaseInfo pEmboBaseInfo_In);
void OnMountedVolume(const PARTINFO& Partition);
void OnMountStorage( const DEVDETAIL& Dev, DWORD Flags );
BOOL SetPathOKEvent(void)
{
if(NULL==hEmbo_Folder_Ready_Event)return FALSE;
return(SetEvent(hEmbo_Folder_Ready_Event));
}
BOOL SetFileCopyEvent(void)
{
if(NULL==hEmbo_FileCopy_Ready_Event)return FALSE;
return(SetEvent(hEmbo_FileCopy_Ready_Event));
}
BOOL SetRegistryEvent(void)
{
if(NULL==hEmbo_Registry_Ready_Event)return FALSE;
return(SetEvent(hEmbo_Registry_Ready_Event));
}
BOOL SetAutoRunEvent(void)
{
if(NULL==hEmbo_AutoRun_Ready_Event)return FALSE;
return(SetEvent(hEmbo_AutoRun_Ready_Event));
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//Wait for Embo_BinFolder_Ready event for dwWaitTime ms, if dwWaitTime>=0x80000000, wait forever.
//////////////////////////////////////////////////////////////////////////////////////////////////
BOOL WaitForPathOKEvent(DWORD dwWaitTime)
{
DWORD PathOK_Waiting_Time=dwWaitTime;
if(PathOK_Waiting_Time>=0x80000000)PathOK_Waiting_Time=INFINITE;
DWORD dwWaitResult=WaitForSingleObject(hEmbo_Folder_Ready_Event, PathOK_Waiting_Time);//dwWaitTime);
if(WAIT_OBJECT_0==dwWaitResult) return TRUE;
return FALSE;
}
BOOL SetAllEvents(void)
{
BOOL fRet=FALSE;
fRet=(SetPathOKEvent())
&(SetFileCopyEvent())
&(SetRegistryEvent())
&(SetAutoRunEvent());
return fRet;
}
/*
函数说明:拷贝所有文件From szSrcDirectory To szDstDirectory;只做覆盖拷备
*/
BOOL CopyAllFiles(PTCHAR szSrcDirectory2,PTCHAR szDstDirectory2)
{
BOOL fResult=TRUE;
WIN32_FIND_DATA WinFindDataSrc={0};
WIN32_FIND_DATA WinFindDataDst={0};
HANDLE hFindSrc=INVALID_HANDLE_VALUE;
HANDLE hFindDst=INVALID_HANDLE_VALUE;
TCHAR szDstDirectory[MAX_PATH]={0}; //参数目标路径
TCHAR szSrcDirectory[MAX_PATH]={0}; //参数源路径
TCHAR szDstPath[MAX_PATH]={0}; //目标路径
TCHAR szSrcPath[MAX_PATH]={0}; //源路径
TCHAR szDstFind[MAX_PATH]={0}; //目标路径+文件名/路径名,用于查找
TCHAR szSrcFind[MAX_PATH]={0}; //源路径+文件名/路径名,用于查找
//先保存原始参数
_tcscpy(szDstDirectory, szDstDirectory2);
_tcscpy(szSrcDirectory, szSrcDirectory2);
//Now check the incomes
//First szDstDirectory
if(NULL==*szDstDirectory) //目标路径为空,则设为根"\"
{
//wcscpy(szDstDirectory, L"\\Windows"); //DstDirectory default to \Windows
wcscpy(szDstDirectory, L"\\"); //DstDirectory default to '\'
}
//Set szDstFind and szDstPath
if(szDstDirectory[0]!=L'\\') //是否‘\’开始的的目录名?不是就加'\'
{
wsprintf(szDstPath,L"\\%s",szDstDirectory);
_tcscpy(szDstDirectory, szDstPath);
}
//Set szDstFind and szDstPath
if(szDstDirectory[wcslen(szDstDirectory)-1]==L'\\') //是否‘\’结尾的目录名?是
{
szDstDirectory[wcslen(szDstDirectory)-1]=NULL; //去掉 ‘\’
}
wsprintf(szDstFind,L"%s\\*.*",szDstDirectory); //szDstFind=szDstDirectory\*.*
wsprintf(szDstPath,L"%s",szDstDirectory); //szDstPath=szDstDirectory
//Second szSrcDirectory
if(NULL==*szSrcDirectory)
{
wcscpy(szSrcDirectory, L"\\HardDisk\\EmboBSP\\Wcopy\\Auto");//\\Windows");//SrcDirectory default to \\HardDisk\\EmboBSP\\Wcopy\\Auto\\Windows
}
if(szSrcDirectory[0]!=L'\\') //是否‘\’开始的的目录名?不是就加'\'
{
wsprintf(szSrcPath,L"\\%s",szSrcDirectory);
_tcscpy(szSrcDirectory, szSrcPath);
}
//Set szSrcFind and szSrcPath
if(szSrcDirectory[wcslen(szSrcDirectory)-1]==L'\\') //是否‘\’结尾的目录名?是
{
szSrcDirectory[wcslen(szSrcDirectory)-1]=NULL; //去掉 ‘\’
}
wsprintf(szSrcFind,L"%s\\*.*",szSrcDirectory); //szSrcFind=szSrcDirectory\*.*
wsprintf(szSrcPath,L"%s",szSrcDirectory); //szSrcPath=szSrcDirectory
//以上设置变量完成
hFindSrc=FindFirstFile(szSrcFind, &WinFindDataSrc); //开始从源根目录进行查找
if(hFindSrc!=INVALID_HANDLE_VALUE)
{
//So there is sth in Source Path, we should begin to copy, first check if there is szDstPasth
hFindDst=FindFirstFile(szDstFind,&WinFindDataDst); //查找目标根目录
if(hFindDst==INVALID_HANDLE_VALUE) //Not exist, create it.
{
fResult=CreateDirectory(szDstPath,NULL); //Create Dst Path
// if(fResult==FALSE)goto CopyAllFilesError; //Fail return FALSE
}
do
{
if(!(WinFindDataSrc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) //是文件,不是目录
{
DWORD dwResult=0;
DWORD dwLength=_tcslen(WinFindDataSrc.cFileName);
if(dwLength>4) //找结尾是 .reg 或者 .deg 的
{
dwResult= (!(_tcsicmp(&WinFindDataSrc.cFileName[dwLength-4], Embo_Wcopy_ExcludeFile1)))
| (!(_tcsicmp(&WinFindDataSrc.cFileName[dwLength-4], Embo_Wcopy_ExcludeFile2)));
}
/////////////////////////////////////////////////////////
if(dwResult) //是文件,不是目录
{
//int FileFind=1; //是目录,不是文件
DWORD dwLength=_tcslen(WinFindDataSrc.cFileName);
{
TCHAR szRegfile[MAX_PATH]={0};
_tcscpy(szRegfile, szSrcPath);
_tcscat(szRegfile, _T("\\"));
_tcscat(szRegfile, WinFindDataSrc.cFileName);
GetRegFile(szRegfile); //do getregfile
}
}
/////////////////////////////////////////////////////////
if(dwLength==15) //找EmboAutoRun.bat
{
dwResult=dwResult
| (!(_tcsicmp(&WinFindDataSrc.cFileName[dwLength-15], Embo_Wcopy_ExcludeFile3)));
}
if( 0!=dwResult) //找到了ExcludeFile? 就绕过, 直接continue
{
continue;
}
else //找不到了ExcludeFile? 就可以copy
{
TCHAR tempSrcFileName[MAX_PATH]={0};
TCHAR tempDstFileName[MAX_PATH]={0};
//BOOL fCopyRet;
wsprintf(tempSrcFileName,L"%s\\%s",szSrcPath,WinFindDataSrc.cFileName);
wsprintf(tempDstFileName,L"%s\\%s",szDstPath,WinFindDataSrc.cFileName);
if((wcslen(szDstPath)==1) && (szDstPath[wcslen(szDstPath)-1]==L'\\'))
{
wsprintf(tempDstFileName,L"%s%s",szDstPath,WinFindDataSrc.cFileName);
}
fResult=CopyFile(tempSrcFileName,tempDstFileName,FALSE); //总是覆盖 3rd Para is FALSE
//if(fResult==FALSE)goto CopyAllFilesError; //Fail return FALSE
}
}
else //是目录,不是文件
{
TCHAR szSrcPathNext[MAX_PATH]={0}; //查找目标路径
TCHAR szDstPathNext[MAX_PATH]={0}; //查找目标路径
//设置 szDstPathNext
if(szDstPath[wcslen(szDstPath)-1]==L'\\') //是否‘\’结尾的目录名?是
{
wsprintf(szDstPathNext,L"%s%s",szDstPath, WinFindDataSrc.cFileName); //szDstPathNext=szDstPath\cFileName
}
else //是否‘\’结尾的目录名?不是
{
wsprintf(szDstPathNext,L"%s\\%s",szDstPath, WinFindDataSrc.cFileName); //szDstPathNext=szDstPath\cFileName
}
//设置 szSrcPathNext
if(szSrcPath[wcslen(szSrcPath)-1]==L'\\') //是否‘\’结尾的目录名?是
{
wsprintf(szSrcPathNext,L"%s%s",szSrcPath, WinFindDataSrc.cFileName); //szDstPathNext=szDstPath\cFileName
}
else //是否‘\’结尾的目录名?不是
{
wsprintf(szSrcPathNext,L"%s\\%s",szSrcPath, WinFindDataSrc.cFileName); //szDstPathNext=szDstPath\cFileName
}
//递归调用 CopyAllFiles
fResult=CopyAllFiles(szSrcPathNext, szDstPathNext);
//if(fResult==FALSE)goto CopyAllFilesError; //Fail return FALSE
}
}while(FindNextFile(hFindSrc,&WinFindDataSrc));
}
if(hFindDst!=INVALID_HANDLE_VALUE)FindClose(hFindDst);//关闭查找文件
if(hFindSrc!=INVALID_HANDLE_VALUE)FindClose(hFindSrc);//关闭查找文件
return TRUE;
}
void OnMountedVolume(const PARTINFO& Partition)
{
TCHAR path[MAX_PATH];
_stprintf(path,_T("%s"),Partition.szVolumeName);
int nCmpResult=_tcsicmp(path, g_szEmboRootVolume);
if(nCmpResult==0)
{
fPathOK=TRUE;
// #define Embo_DetectLocalPathThreadStopEvent _T("Embo_DetectLocalPathThreadStopEvent")
// hDetectLocalPathThreadStopEvent=CreateEvent( NULL, FALSE, FALSE, Embo_DetectLocalPathThreadStopEvent);
SetEvent( hDetectLocalPathThreadStopEvent );
//SetPathOKEvent();
}
}
void OnMountStorage( const DEVDETAIL& Dev, DWORD Flags )
{
// check through the mounted volumes for AutoRun.exe...
PARTINFO partInfo;
partInfo.cbSize = sizeof(partInfo);
// not interested in device removals...
if(!Dev.fAttached)
return;
HANDLE hStore = OpenStore(Dev.szName);
if(NULL == hStore)
{
ERRORMSG(1,(_T("Failed to open store for volume: %s (0x%X)\r\n"),Dev.szName, GetLastError()));
return;
}
HANDLE hFindPart = FindFirstPartition(hStore, &partInfo);
if(NULL == hFindPart)
{
ERRORMSG(1,(_T("ERROR: Failed to locate first partition on volume: %s (0x%X)\r\n"),Dev.szName, GetLastError()));
return;
}
// loop through each partition on the volume
do
{
OnMountedVolume(partInfo);
}while(FindNextPartition(hFindPart, &partInfo));
CloseHandle(hStore);
FindClosePartition(hFindPart);
}
BOOL ConnectNetworkResource()
{
SetNetworkPara(&network, &g_baseInfo);
// 清除上次映射时保存在注册表内的信息
if((_tcslen(network.NetworkSubFolder) + _tcslen(REG_KEY_EMBO_COMM_REDIR) + 2)
<= MAX_PATH)
{
HKEY hKey;
TCHAR keyName[MAX_PATH] ={0};
_tcscat(keyName, REG_KEY_EMBO_COMM_REDIR);
_tcscat(keyName, network.NetworkSubFolder);
if(
RegOpenKeyEx(HKEY_CURRENT_USER, 0, 0, 0, &hKey)
== ERROR_SUCCESS)
{
::RegDeleteKey(hKey, keyName);
::RegCloseKey(hKey);
}
}
BOOL bNetworkStatus = FALSE;
/*映谢网络文件夹*/
for(DWORD i=0;i<dwNetworkMappingRetry;i++)
{
if(network.MappingNetWork())
{
DEBUGMSG(1,(TEXT("Mapping times is %d, OK!\r\n"),i ));
bNetworkStatus = TRUE;
break;
}
DEBUGMSG(1,(TEXT("Mapping times is %d, Fail!\r\n"),i ));
Sleep(dwNetworkMappingRetryGap);
}
return bNetworkStatus;
}
DWORD DetectNetworkPathThread( LPVOID lpParameter )
{
if(!::ConnectNetworkResource())
{
return FALSE;
}
SetPathOKEvent();
return TRUE;
}
DWORD DetectLocalPathThread( LPVOID lpParameter )
{
GUID guid = STORE_MOUNT_GUID;
HANDLE hMsgQ;
DWORD numRead;
DWORD flags;
BYTE buf[sizeof(DEVDETAIL) + MAX_DEVCLASS_NAMELEN * sizeof(TCHAR)];
MSGQUEUEOPTIONS qoptions = { sizeof(MSGQUEUEOPTIONS), MSGQUEUE_NOPRECOMMIT, 0, sizeof(buf), TRUE };
hMsgQ = CreateMsgQueue( NULL, &qoptions );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -