⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 embocheck2.cpp

📁 1,wince下做的导入注册表的程序.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -