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; }