www.pudn.com > QqMsgView.rar > Select.cpp


#include  
#include  
#include  
#include  
#include "Select.h" 
#include "Main.h" 
#include "LocalMessage.h" 
#include "DecryptMessage.h" 
#include "md5.h" 
#include "resource.h" 
 
char QQFolder[MAX_PATH]; 
int ListIndex; 
char QQNumber[10]; 
char QQDatabasePath[MAX_PATH]; 
char DecryptPassword[16]; 
DWORD FunctionVaule=NULL; 
 
int SelectFolder(HWND hwnd) 
{ 
	Select pro; 
	DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_SELECT),hwnd,(DLGPROC)Select::DialogProc,(LPARAM)&pro); 
	if(*QQFolder && ListIndex !=0) 
		return 0; 
	return 1; 
} 
INT_PTR CALLBACK Select::DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	static Select *pro; 
	switch(message) 
	{ 
	case WM_INITDIALOG: 
		pro=(Select *)lParam; 
		pro->hwnd=hwnd; 
		pro->Init(); 
		break; 
	case WM_COMMAND: 
		pro->WndPro_Command(wParam,lParam); 
		break; 
	case WM_CLOSE: 
		pro->WndPro_Close(); 
		break; 
	case WM_PAINT: 
		pro->WndPro_Paint(wParam,lParam); 
		break; 
	} 
	return 0; 
} 
int Select::WndPro_Command(WPARAM wParam,LPARAM lParam) 
{ 
	switch(wParam) 
	{ 
	case IDOK: 
		if(this->BrowserFolder()) 
			this->GetQQNumberList(); 
		break; 
	case IDCANCEL: 
		this->WndPro_Close(); 
		break; 
	case IDC_SEEK: 
		this->View(); 
		break; 
	} 
	return 0; 
} 
int Select::WndPro_Close() 
{ 
	EndDialog(hwnd,0); 
	FunctionVaule = 0; 
	return 0; 
} 
int Select::WndPro_Paint(WPARAM wParam,LPARAM lParam) 
{ 
	//PAINTSTRUCT ps;  
	//HDC hdc; 
	//HWND CurrentPaint; 
	//HPEN hpen; 
	//CurrentPaint  = GetDlgItem(hwnd,IDC_FOLDERPATH); 
	//hdc = BeginPaint(CurrentPaint,&ps); 
	//this->PaintEdit(CurrentPaint,hdc); 
	//EndPaint(CurrentPaint,&ps); 
 
	return 0; 
} 
int Select::PaintEdit(HWND HwndEdit,HDC hdc) 
{ 
	HPEN hpen, hpenOld; 
	 
 
	hpen = CreatePen(PS_SOLID,1,RGB(255,0,0)); 
	hpenOld = (HPEN)SelectObject(hdc, hpen); 
	//LineTo(hdc,0,0); 
	//LineTo(hdc,rect.right+10,0); 
 
	SelectObject(hdc, hpenOld); 
	DeleteObject(hpen); 
	return 0; 
} 
int Select::Init() 
{ 
	HKEY key; 
	char QQInstallPath[MAX_PATH]; 
	DWORD QQPathSize=MAX_PATH; 
	int length; 
	HwndCombo = GetDlgItem(hwnd,IDC_COMBO1); 
	if(*QQFolder) 
	{ 
		SetDlgItemText(hwnd,IDC_FOLDERPATH,QQFolder); 
		this->GetQQNumberList(); 
	} 
	else 
	{ 
		if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\TENCENT\\QQ", 
			0,KEY_QUERY_VALUE,&key)== ERROR_SUCCESS) 
		{ 
			ZeroMemory(QQInstallPath,MAX_PATH); 
			RegQueryValueEx(key,"Install",NULL,NULL, 
				(byte *)QQInstallPath,&QQPathSize); 
			if(*QQInstallPath==0) 
				return 1; 
			length = (int)strlen(QQInstallPath); 
			QQInstallPath[length-1]=0; 
			strncpy(QQFolder,QQInstallPath,length-1); 
			SetDlgItemText(hwnd,IDC_FOLDERPATH,QQFolder); 
			this->GetQQNumberList(); 
		} 
	} 
	//----------------------------- 
	char tem[100]; 
	RECT rect,rect1,rect2,rect3; 
	int x,y,width,height; 
	HWND HwndParent,HwndEdit=GetDlgItem(hwnd,IDC_FOLDERPATH);; 
	 
	HwndParent = GetParent(HwndEdit); 
	GetWindowRect(HwndEdit,&rect); 
	GetClientRect(HwndEdit,&rect3); 
	GetWindowRect(HwndParent,&rect1); 
	GetClientRect(HwndParent,&rect2); 
	x = rect2.right -rect3.right -(rect1.right-rect.right) +2; 
	y = rect2.bottom -(rect1.bottom-rect.bottom) -rect3.bottom+2; 
	width = rect.right-rect.left-2; 
	height = rect.bottom-rect.top-2; 
	wsprintf(tem,"%2d %2d %2d %2d",x,y,width,height); 
	//SetWindowText(hwnd,tem); 
	//width 
	MoveWindow(HwndEdit,x,y,width,height,true); 
	return 0; 
} 
int Select::BrowserFolder() 
{ 
	char szFolder[MAX_PATH]; 
	//szFolder = QQFolder; 
	ZeroMemory(szFolder,MAX_PATH); 
	BROWSEINFO lpbi; 
	ZeroMemory(&lpbi,sizeof(lpbi)); 
	lpbi.hwndOwner = hwnd; 
	lpbi.lpszTitle = "选择QQ目录"; 
	lpbi.pszDisplayName = szFolder; 
	 
	LPCITEMIDLIST pidl = SHBrowseForFolder(&lpbi); 
	SHGetPathFromIDList(pidl,szFolder); 
	if(strlen(szFolder)==0) 
		return 0; 
	ZeroMemory(QQFolder,MAX_PATH); 
	strcpy(QQFolder,szFolder); 
	SetDlgItemText(hwnd,IDC_FOLDERPATH,szFolder); 
	return 1; 
} 
int Select::GetQQNumberList() 
{ 
	WIN32_FIND_DATA FindFileData; 
	HANDLE hFind = INVALID_HANDLE_VALUE; 
	char QQFolderPath[MAX_PATH],*error; 
	//DWORD dwError; 
	ZeroMemory(QQFolderPath,MAX_PATH); 
	strcpy(QQFolderPath,QQFolder); 
	strncat(QQFolderPath,"\\*",3); 
	SendMessage(HwndCombo,CB_RESETCONTENT,NULL,NULL); 
	ListIndex = 0; 
	hFind = FindFirstFile(QQFolderPath,&FindFileData); 
	if(hFind == INVALID_HANDLE_VALUE) 
	{ 
		error = "Find first file fail"; 
		goto Ex; 
	} 
	while (FindNextFile(hFind, &FindFileData) != 0)  
	{ 
		if(this->IsQQFolder(FindFileData.cFileName)) 
		{ 
			SendMessage(HwndCombo,CB_INSERTSTRING, 
				ListIndex,(LPARAM)FindFileData.cFileName); 
			ListIndex++; 
		} 
	} 
	SendMessage(HwndCombo,CB_SETCURSEL,0,NULL); 
	return 0; 
Ex: 
	return 1; 
} 
bool Select::IsQQFolder(char * name) 
{ 
	char QQPath[MAX_PATH]; 
	WCHAR TemPath[MAX_PATH]; 
	if(IsQQNumber(name)==false) 
		return false; 
	RtlZeroMemory(QQPath,MAX_PATH); 
	strcpy(QQPath,QQFolder); 
	strcat(QQPath,"\\"); 
	strcat(QQPath,name); 
	strcat(QQPath,"\\MsgEx.db"); 
	memset((char *)TemPath,0,(MAX_PATH*2)); 
	MultiByteToWideChar(CP_ACP,0,QQPath, 
		(int)strlen(QQPath),TemPath,(MAX_PATH*2)); 
	if(StgIsStorageFile(TemPath)==S_OK) 
		return true; 
	return false; 
} 
int Select::View() 
{ 
	char *error=NULL; 
	int hr = S_OK; 
	IStorage* ppstgOpen = NULL; 
	IEnumSTATSTG* ppenum =NULL; 
	IEnumSTATSTG* ppenum1 =NULL; 
	IStorage* ppstgOpen1 = NULL; 
	STATSTG rgelt; 
	ULONG pceltFetched=1; 
 
	WCHAR TemPath[MAX_PATH]; 
	if(*QQFolder==0) 
	{ 
		error = "请选择QQ目录!"; 
		goto Ex; 
	} 
	if(ListIndex == 0) 
	{ 
		error = "QQ号码列表为空!"; 
		goto Ex; 
	} 
	GetWindowText(HwndCombo,QQNumber,10); 
	ZeroMemory(QQDatabasePath,MAX_PATH); 
	strcpy(QQDatabasePath,QQFolder); 
	strcat(QQDatabasePath,"\\"); 
	strcat(QQDatabasePath,QQNumber); 
	strcat(QQDatabasePath,"\\MsgEx.db"); 
 
 
	memset((char *)TemPath,0,(MAX_PATH*2)); 
	MultiByteToWideChar(CP_ACP,0,QQDatabasePath, 
		(int)strlen(QQDatabasePath),TemPath,(MAX_PATH*2)); 
	hr = StgOpenStorage(TemPath,NULL,0x12,NULL,NULL,&ppstgOpen); 
	if(FAILED(hr)) 
	{ 
		error = "Failed StgCreateStorage"; 
		goto Ex; 
	} 
	hr = ppstgOpen->OpenStorage(L"Matrix",NULL,0x12,NULL,NULL,&ppstgOpen1); 
	if (FAILED(hr)) 
	{ 
		error = "Failed OpenSrorage ppstgOpen1"; 
		goto Ex; 
	} 
	IStream *ppstm =NULL; 
	WCHAR *pv; 
	ULONG len; 
	hr = ppstgOpen1->OpenStream(L"Matrix.db",NULL,0x12,NULL,&ppstm); 
	if(FAILED(hr)) 
	{ 
		error = "ppstgOpen->OpenStream"; 
		goto Ex; 
	} 
	ppstm->Stat(&rgelt,NULL); 
	pv = (WCHAR *)malloc(rgelt.cbSize.LowPart+10); 
	memset(pv,0,rgelt.cbSize.LowPart); 
	ppstm->Read(pv,rgelt.cbSize.LowPart,&len); 
	ppstgOpen->Release(); 
	_asm{ 
		mov eax,pv 
			mov edx,rgelt.cbSize.LowPart 
	} 
	if(func()==0) 
	{ 
		error = "文件格式错误!"; 
		goto Ex; 
	} 
	char *p; 
	p=(char *)pv; 
	while(true) 
	{ 
		if(strncmp(p,"CRK",3)==0) 
			break; 
		p++; 
	} 
	p+=7; 
	MD5_CTX text; 
	char EncryptPassword[16]; 
	int Passwordlength = 16; 
	ZeroMemory(EncryptPassword,16); 
	memcpy(text.buffer,QQNumber,strlen(QQNumber)); 
	MD5Init(&text); 
	MD5Update(&text,strlen(QQNumber)); 
 
	decode(p,0x20,(char *)text.state,EncryptPassword,&Passwordlength); 
	strncpy(DecryptPassword,EncryptPassword,16); 
	free(pv); 
	FunctionVaule = 1; 
	EndDialog(hwnd,0); 
	return 0; 
Ex: 
	MessageBox(hwnd,error,"错误",0); 
	return hr; 
} 
bool IsQQNumber(char * name) 
{ 
	size_t NameLength; 
	char *pName; 
	pName = name; 
	NameLength = strlen(pName); 
	if(NameLength>9 || NameLength<5) 
		return false; 
	while(*pName) 
	{ 
		if(*pName<0x30 || *pName >0x39) 
			return false; 
		pName++; 
	} 
	return true; 
}