主程序代码 PEComp.c
1 #include <windows.h> 2 #include <Richedit.h> 3 #include <Commctrl.h> 4 #include "resource.h" 5 6 7 HINSTANCE hInstance; 8 DWORD dwCount; 9 10 HWND hWinEdit; //富文本框句柄 11 12 13 /* 14 初始化窗口程序 15 */ 16 void _Init(HWND hWinMain) 17 { 18 HICON hIcon; 19 CHARFORMAT stCf; 20 TCHAR szFont[] = TEXT("宋体"); 21 22 23 hWinEdit = GetDlgItem(hWinMain, IDC_INFO); 24 hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICO_MAIN)); 25 SendMessage(hWinMain, WM_SETICON, ICON_BIG, (LPARAM)hIcon);//为窗口设置图标 26 SendMessage(hWinEdit, EM_SETTEXTMODE, TM_PLAINTEXT, 0);//设置编辑控件 27 28 RtlZeroMemory(&stCf, sizeof(stCf)); 29 stCf.cbSize = sizeof(stCf); 30 stCf.yHeight = 10 * 20; 31 stCf.dwMask = CFM_FACE | CFM_SIZE | CFM_BOLD; 32 lstrcpy(stCf.szFaceName, szFont); 33 SendMessage(hWinEdit, EM_SETCHARFORMAT, 0, (LPARAM)&stCf); 34 SendMessage(hWinEdit, EM_EXLIMITTEXT, 0, -1); 35 } 36 37 /* 38 清除ListView中的内容 39 删除所有的行和所有的列 40 */ 41 void _ListViewClear(HWND _hWinView) 42 { 43 SendMessage(_hWinView, LVM_DELETEALLITEMS, 0, 0); 44 45 while (SendMessage(_hWinView, LVM_DELETECOLUMN, 0, 0)){} 46 } 47 48 49 /* 50 在ListView中增加一个列 51 输入:_dwColumn = 增加的列编号 52 _dwWidth = 列的宽度 53 _lpszHead = 列的标题字符串 54 */ 55 void _ListViewAddColumn(HWND _hWinView,DWORD _dwColumn,DWORD _dwWidth,PTCHAR _lpszHead) 56 { 57 LV_COLUMN stLVC; 58 59 RtlZeroMemory(&stLVC, sizeof(LV_COLUMN)); 60 stLVC.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT; 61 stLVC.fmt = LVCFMT_LEFT; 62 stLVC.pszText = _lpszHead; 63 stLVC.cx = _dwWidth; 64 stLVC.iSubItem = _dwColumn; 65 SendMessage(_hWinView, LVM_INSERTCOLUMN, _dwColumn, (LPARAM)&stLVC); 66 } 67 68 /* 69 初始化结果表格 70 */ 71 void _clearResultView(HWND hProcessModuleTable) 72 { 73 _ListViewClear(hProcessModuleTable); 74 75 //添加表头 76 _ListViewAddColumn(hProcessModuleTable, 1, 200, TEXT("PE数据结构相关字段")); 77 _ListViewAddColumn(hProcessModuleTable, 2, 222, TEXT("文件1的值(H)")); 78 _ListViewAddColumn(hProcessModuleTable, 3, 222, TEXT("文件2的值(H)")); 79 80 dwCount = 0; 81 } 82 83 84 void _GetListViewItem(HWND _hWinView, DWORD _dwLine, DWORD _dwCol, PTCHAR _lpszText) 85 { 86 LV_ITEM stLVI; 87 88 89 RtlZeroMemory(&stLVI, sizeof(LV_ITEM)); 90 RtlZeroMemory(_lpszText, 512); 91 92 stLVI.cchTextMax = 512; 93 stLVI.mask = LVIF_TEXT; 94 stLVI.pszText = _lpszText; 95 stLVI.iSubItem = _dwCol; 96 SendMessage(_hWinView, LVM_GETITEMTEXT, _dwLine, (LPARAM)&stLVI); 97 } 98 99 100 int _MemCmp(PTCHAR _lp1, PTCHAR _lp2, int _size) 101 { 102 DWORD dwResult = 0; 103 104 for (int i = 0; i < _size; ++i) 105 { 106 if (_lp1[i] != _lp2[i]) 107 { 108 dwResult = 1; 109 break; 110 } 111 } 112 return dwResult; 113 } 114 115 116 117 /* 118 在ListView中新增一行,或修改一行中某个字段的内容 119 输入:_dwItem = 要修改的行的编号 120 _dwSubItem = 要修改的字段的编号,-1表示插入新的行,>=1表示字段的编号 121 */ 122 DWORD _ListViewSetItem(HWND _hWinView, DWORD _dwItem, DWORD _dwSubItem, PTCHAR _lpszText) 123 { 124 LV_ITEM stLVI; 125 126 127 RtlZeroMemory(&stLVI, sizeof(LV_ITEM)); 128 stLVI.cchTextMax = lstrlen(_lpszText); 129 stLVI.mask = LVIF_TEXT; 130 stLVI.pszText = _lpszText; 131 stLVI.iItem = _dwItem; 132 stLVI.iSubItem = _dwSubItem; 133 134 if (_dwSubItem == -1) 135 { 136 stLVI.iSubItem = 0; 137 return SendMessage(_hWinView, LVM_INSERTITEM, 0, (LPARAM)&stLVI); 138 } 139 else 140 { 141 return SendMessage(_hWinView, LVM_SETITEM, 0, (LPARAM)&stLVI); 142 } 143 } 144 145 146 147 /* 148 将_lpSZ位置处_Size个字节转换为16进制的字符串 149 szBuffer处为转换后的字符串 150 */ 151 void _Byte2Hex(PTCHAR _lpSZ, PTCHAR szBuffer, int _Size) 152 { 153 TCHAR szBuf[4]; 154 155 for (int i = 0; i < _Size; ++i) 156 { 157 wsprintf(szBuf, TEXT("%02X "), (TBYTE)_lpSZ[i]); 158 lstrcat(szBuffer, szBuf); 159 } 160 } 161 162 163 void _addLine(HWND hProcessModuleTable,PTCHAR _lpSZ, PTCHAR _lpSP1, PTCHAR _lpSP2, int _Size) 164 { 165 TCHAR szBuffer[256]; 166 167 168 169 170 dwCount = _ListViewSetItem(hProcessModuleTable, dwCount, -1, _lpSZ); // 在表格中新增加一行 171 _ListViewSetItem(hProcessModuleTable, dwCount, 0, _lpSZ);//显示字段名 172 173 //将指定字段按照十六进制显示,格式:一个字节+一个空格 174 175 RtlZeroMemory(szBuffer, 256); 176 _Byte2Hex(_lpSP1, szBuffer, _Size); 177 _ListViewSetItem(hProcessModuleTable, dwCount, 1, szBuffer);//第一个文件中的值 178 179 180 RtlZeroMemory(szBuffer, 256); 181 _Byte2Hex(_lpSP2, szBuffer, _Size); 182 _ListViewSetItem(hProcessModuleTable, dwCount, 2, szBuffer);//第二个文件中的值 183 } 184 185 186 /* 187 IMAGE_DOS_HEADER头信息 188 */ 189 void _Header1(HWND hProcessModuleTable, PTCHAR lpMemory, PTCHAR lpMemory1) 190 { 191 int offbuf[19] = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2, 20, 4}; 192 TCHAR szRec[19][30] = {TEXT("IMAGE_DOS_HEADER.e_magic"), 193 TEXT("IMAGE_DOS_HEADER.e_cblp"), 194 TEXT("IMAGE_DOS_HEADER.e_cp"), 195 TEXT("IMAGE_DOS_HEADER.e_crlc"), 196 TEXT("IMAGE_DOS_HEADER.e_cparhdr"), 197 TEXT("IMAGE_DOS_HEADER.e_minalloc"), 198 TEXT("IMAGE_DOS_HEADER.e_maxalloc"), 199 TEXT("IMAGE_DOS_HEADER.e_ss"), 200 TEXT("IMAGE_DOS_HEADER.e_sp"), 201 TEXT("IMAGE_DOS_HEADER.e_csum"), 202 TEXT("IMAGE_DOS_HEADER.e_ip"), 203 TEXT("IMAGE_DOS_HEADER.e_cs"), 204 TEXT("IMAGE_DOS_HEADER.e_lfarlc"), 205 TEXT("IMAGE_DOS_HEADER.e_ovno"), 206 TEXT("IMAGE_DOS_HEADER.e_res"), 207 TEXT("IMAGE_DOS_HEADER.e_oemid"), 208 TEXT("IMAGE_DOS_HEADER.e_oeminfo"), 209 TEXT("IMAGE_DOS_HEADER.e_res2"), 210 TEXT("IMAGE_DOS_HEADER.e_lfanew"),}; 211 212 for (int i = 0, off = 0; i < 19; ++i) 213 { 214 _addLine(hProcessModuleTable,szRec[i], lpMemory + off, lpMemory1 + off, offbuf[i]); 215 off += offbuf[i]; 216 } 217 } 218 219 220 /* 221 IMAGE_DOS_HEADER头信息 222 */ 223 void _Header2(HWND hProcessModuleTable, PTCHAR lpMemory, PTCHAR lpMemory1) 224 { 225 int offbuf[70] = { 4, 2, 2, 4, 4, 4, 2, 2, 2, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 226 4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 227 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; 228 TCHAR szRec[70][60] = { TEXT("IMAGE_NT_HEADERS.Signature"), 229 TEXT("IMAGE_FILE_HEADER.Machine"), 230 TEXT("IMAGE_FILE_HEADER.NumberOfSections"), 231 TEXT("IMAGE_FILE_HEADER.TimeDateStamp"), 232 TEXT("IMAGE_FILE_HEADER.PointerToSymbolTable"), 233 TEXT("IMAGE_FILE_HEADER.NumberOfSymbols"), 234 TEXT("IMAGE_FILE_HEADER.SizeOfOptionalHeader"), 235 TEXT("IMAGE_FILE_HEADER.Characteristics"), 236 TEXT("IMAGE_OPTIONAL_HEADER32.Magic"), 237 TEXT("IMAGE_OPTIONAL_HEADER32.MajorLinkerVersion"), 238 TEXT("IMAGE_OPTIONAL_HEADER32.MinorLinkerVersion"), 239 TEXT("IMAGE_OPTIONAL_HEADER32.SizeOfCode"), 240 TEXT("IMAGE_OPTIONAL_HEADER32.SizeOfInitializedData"), 241 TEXT("IMAGE_OPTIONAL_HEADER32.SizeOfUninitializedData"), 242 TEXT("IMAGE_OPTIONAL_HEADER32.AddressOfEntryPoint"), 243 TEXT("IMAGE_OPTIONAL_HEADER32.BaseOfCode"), 244 TEXT("IMAGE_OPTIONAL_HEADER32.BaseOfData"), 245 TEXT("IMAGE_OPTIONAL_HEADER32.ImageBase"), 246 TEXT("IMAGE_OPTIONAL_HEADER32.SectionAlignment"), 247 TEXT("IMAGE_OPTIONAL_HEADER32.FileAlignment"), 248 TEXT("IMAGE_OPTIONAL_HEADER32.MajorOperatingSystemVersion"), 249 TEXT("IMAGE_OPTIONAL_HEADER32.MinorOperatingSystemVersion"), 250 TEXT("IMAGE_OPTIONAL_HEADER32.MajorImageVersion"), 251 TEXT("IMAGE_OPTIONAL_HEADER32.MinorImageVersion"), 252 TEXT("IMAGE_OPTIONAL_HEADER32.MajorSubsystemVersion"), 253 TEXT("IMAGE_OPTIONAL_HEADER32.MinorSubsystemVersion"), 254 TEXT("IMAGE_OPTIONAL_HEADER32.Win32VersionValue"), 255 TEXT("IMAGE_OPTIONAL_HEADER32.SizeOfImage"), 256 TEXT("IMAGE_OPTIONAL_HEADER32.SizeOfHeaders"), 257 TEXT("IMAGE_OPTIONAL_HEADER32.CheckSum"), 258 TEXT("IMAGE_OPTIONAL_HEADER32.Subsystem"), 259 TEXT("IMAGE_OPTIONAL_HEADER32.DllCharacteristics"), 260 TEXT("IMAGE_OPTIONAL_HEADER32.SizeOfStackReserve"), 261 TEXT("IMAGE_OPTIONAL_HEADER32.SizeOfStackCommit"), 262 TEXT("IMAGE_OPTIONAL_HEADER32.SizeOfHeapReserve"), 263 TEXT("IMAGE_OPTIONAL_HEADER32.SizeOfHeapCommit"), 264 TEXT("IMAGE_OPTIONAL_HEADER32.LoaderFlags"), 265 TEXT("IMAGE_OPTIONAL_HEADER32.NumberOfRvaAndSizes"), 266 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Export)"), 267 TEXT("IMAGE_DATA_DIRECTORY.isize(Export)"), 268 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Import)"), 269 TEXT("IMAGE_DATA_DIRECTORY.isize(Import)"), 270 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Resource)"), 271 TEXT("IMAGE_DATA_DIRECTORY.isize(Resource)"), 272 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Exception)"), 273 TEXT("IMAGE_DATA_DIRECTORY.isize(Exception)"), 274 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Security)"), 275 TEXT("IMAGE_DATA_DIRECTORY.isize(Security)"), 276 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(BaseReloc)"), 277 TEXT("IMAGE_DATA_DIRECTORY.isize(BaseReloc)"), 278 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Debug)"), 279 TEXT("IMAGE_DATA_DIRECTORY.isize(Debug)"), 280 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Architecture)"), 281 TEXT("IMAGE_DATA_DIRECTORY.isize(Architecture)"), 282 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(GlobalPTR)"), 283 TEXT("IMAGE_DATA_DIRECTORY.isize(GlobalPTR)"), 284 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(TLS)"), 285 TEXT("IMAGE_DATA_DIRECTORY.isize(TLS)"), 286 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Load_Config)"), 287 TEXT("IMAGE_DATA_DIRECTORY.isize(Load_Config)"), 288 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Bound_Import)"), 289 TEXT("IMAGE_DATA_DIRECTORY.isize(Bound_Import)"), 290 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(IAT)"), 291 TEXT("IMAGE_DATA_DIRECTORY.isize(IAT)"), 292 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Delay_Import)"), 293 TEXT("IMAGE_DATA_DIRECTORY.isize(Delay_Import)"), 294 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Com_Descriptor)"), 295 TEXT("IMAGE_DATA_DIRECTORY.isize(Com_Descriptor)"), 296 TEXT("IMAGE_DATA_DIRECTORY.VirtualAddress(Reserved)"), 297 TEXT("IMAGE_DATA_DIRECTORY.isize(Reserved)") }; 298 299 for (int i = 0, off = 0; i < 70; ++i) 300 { 301 _addLine(hProcessModuleTable,szRec[i], lpMemory + off, lpMemory1 + off, offbuf[i]); 302 off += offbuf[i]; 303 } 304 } 305 306 307 /* 308 节表 309 */ 310 void _Header3(HWND hProcessModuleTable, PTCHAR lpMemory, PTCHAR lpMemory1, DWORD _dwValue) 311 { 312 int offbuf[10] = { 8, 4, 4, 4, 4, 4, 4, 2, 2, 4}; 313 TCHAR szBuffer[256]; 314 TCHAR szRec[10][50] = { TEXT("IMAGE_SECTION_HEADER%d.Name1"), 315 TEXT("IMAGE_SECTION_HEADER%d.VirtualSize"), 316 TEXT("IMAGE_SECTION_HEADER%d.VirtualAddress"), 317 TEXT("IMAGE_SECTION_HEADER%d.SizeOfRawData"), 318 TEXT("IMAGE_SECTION_HEADER%d.PointerToRawData"), 319 TEXT("IMAGE_SECTION_HEADER%d.PointerToRelocations"), 320 TEXT("IMAGE_SECTION_HEADER%d.PointerToLinenumbers"), 321 TEXT("IMAGE_SECTION_HEADER%d.NumberOfRelocations"), 322 TEXT("IMAGE_SECTION_HEADER%d.NumberOfLinenumbers"), 323 TEXT("IMAGE_SECTION_HEADER%d.Characteristics")}; 324 325 326 for (int i = 0, off = 0; i < 10; ++i) 327 { 328 wsprintf(szBuffer, szRec[i], _dwValue); 329 _addLine(hProcessModuleTable,szBuffer, lpMemory + off, lpMemory1 + off, offbuf[i]); 330 off += offbuf[i]; 331 } 332 } 333 334 335 336 337 /* 338 打开PE文件并处理 339 */ 340 void _openFile(HWND hWinMain, HWND hProcessModuleTable, PTCHAR szFileNameOpen1, PTCHAR szFileNameOpen2) 341 { 342 HANDLE hFile; 343 HANDLE hMapFile = NULL; 344 HANDLE hFile1; 345 HANDLE hMapFile1=NULL; 346 DWORD dwFileSize, dwFileSize1; 347 static LPVOID lpMemory, lpMemory1; 348 349 350 351 352 hFile = CreateFile(szFileNameOpen1, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 353 OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL); 354 355 if (hFile != INVALID_HANDLE_VALUE) 356 { 357 dwFileSize = GetFileSize(hFile, NULL); 358 if (dwFileSize) 359 { 360 hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);// 内存映射文件 361 if (hMapFile) 362 { 363 lpMemory = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0); 364 if (((PIMAGE_DOS_HEADER)lpMemory)->e_magic != IMAGE_DOS_SIGNATURE)//判断是否有MZ字样 365 { 366 _ErrFormat: 367 MessageBox(hWinMain, TEXT("这个文件不是PE格式的文件!"), NULL, MB_OK); 368 UnmapViewOfFile(lpMemory); 369 CloseHandle(hMapFile); 370 CloseHandle(hFile); 371 return; 372 } 373 if (((PIMAGE_NT_HEADERS)((PTCHAR)lpMemory + 374 ((PIMAGE_DOS_HEADER)lpMemory)->e_lfanew))->Signature != 375 IMAGE_NT_SIGNATURE)//判断是否有PE字样 376 { 377 goto _ErrFormat; 378 } 379 } 380 } 381 } 382 383 384 385 hFile1 = CreateFile(szFileNameOpen2, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, 386 OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL); 387 388 if (hFile1 != INVALID_HANDLE_VALUE) 389 { 390 dwFileSize1 = GetFileSize(hFile1, NULL); 391 if (dwFileSize1) 392 { 393 hMapFile1 = CreateFileMapping(hFile1, NULL, PAGE_READONLY, 0, 0, NULL);// 内存映射文件 394 if (hMapFile1) 395 { 396 lpMemory1 = MapViewOfFile(hMapFile1, FILE_MAP_READ, 0, 0, 0); 397 398 if (((PIMAGE_DOS_HEADER)lpMemory1)->e_magic != IMAGE_DOS_SIGNATURE)//判断是否有MZ字样 399 { 400 _ErrFormat1: 401 MessageBox(hWinMain, TEXT("这个文件不是PE格式的文件!"), NULL, MB_OK); 402 UnmapViewOfFile(lpMemory1); 403 CloseHandle(hMapFile1); 404 CloseHandle(hFile1); 405 return; 406 } 407 408 if (((PIMAGE_NT_HEADERS)((PTCHAR)lpMemory1 + 409 ((PIMAGE_DOS_HEADER)lpMemory1)->e_lfanew))->Signature != 410 IMAGE_NT_SIGNATURE)//判断是否有PE字样 411 { 412 goto _ErrFormat1; 413 } 414 } 415 } 416 } 417 418 419 420 421 /* 422 到此为止,两个内存文件的指针已经获取到了。 423 lpMemory和lpMemory1分别指向两个文件头 424 下面是从这个文件头开始,找出各数据结构的字段值,进行比较。 425 */ 426 427 _Header1(hProcessModuleTable, (PTCHAR)lpMemory, (PTCHAR)lpMemory1); 428 429 //调整指针指向PE文件头 430 (PTCHAR)lpMemory += ((PIMAGE_DOS_HEADER)lpMemory)->e_lfanew; 431 (PTCHAR)lpMemory1 += ((PIMAGE_DOS_HEADER)lpMemory1)->e_lfanew; 432 _Header2(hProcessModuleTable, (PTCHAR)lpMemory, (PTCHAR)lpMemory1); 433 434 435 //节的数量 436 WORD dNum, dNum1, dNum2; 437 dNum1 = ((PIMAGE_NT_HEADERS)lpMemory)->FileHeader.NumberOfSections; 438 dNum2 = ((PIMAGE_NT_HEADERS)lpMemory1)->FileHeader.NumberOfSections; 439 dNum = dNum1 > dNum2 ? dNum1 : dNum2; 440 441 //整指针指向节表 442 (PTCHAR)lpMemory += sizeof(IMAGE_NT_HEADERS); 443 (PTCHAR)lpMemory1 += sizeof(IMAGE_NT_HEADERS); 444 445 DWORD _dwValue = 1;//节序号 446 while (dNum--) 447 { 448 _Header3(hProcessModuleTable, (PTCHAR)lpMemory, (PTCHAR)lpMemory1, _dwValue++); 449 450 (PTCHAR)lpMemory += sizeof(IMAGE_SECTION_HEADER); 451 (PTCHAR)lpMemory1 += sizeof(IMAGE_SECTION_HEADER); 452 } 453 454 UnmapViewOfFile(lpMemory); 455 CloseHandle(hMapFile); 456 CloseHandle(hFile); 457 458 UnmapViewOfFile(lpMemory1); 459 CloseHandle(hMapFile1); 460 CloseHandle(hFile1); 461 } 462 463 /* 464 打开输入文件 465 */ 466 void _OpenFile1(HWND hWinMain, HWND hText1, PTCHAR szFileNameOpen1) 467 { 468 OPENFILENAME stOF; 469 470 471 RtlZeroMemory(&stOF, sizeof(stOF)); 472 stOF.lStructSize = sizeof(stOF); 473 stOF.hwndOwner = hWinMain; 474 stOF.hInstance = hInstance; 475 stOF.lpstrFilter = TEXT("Excutable Files\0*.exe;*.com\0\0"); 476 stOF.lpstrFile = szFileNameOpen1; 477 stOF.nMaxFile = MAX_PATH; 478 stOF.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; 479 if (GetOpenFileName(&stOF))//显示“打开文件”对话框 480 { 481 SetWindowText(hText1, szFileNameOpen1); 482 } 483 484 } 485 486 487 /* 488 打开输入文件 489 */ 490 void _OpenFile2(HWND hWinMain, HWND hText2, PTCHAR szFileNameOpen2) 491 { 492 OPENFILENAME stOF; 493 494 495 RtlZeroMemory(&stOF, sizeof(stOF)); 496 stOF.lStructSize = sizeof(stOF); 497 stOF.hwndOwner = hWinMain; 498 stOF.hInstance = hInstance; 499 stOF.lpstrFilter = TEXT("Excutable Files\0*.exe;*.com\0\0"); 500 stOF.lpstrFile = szFileNameOpen2; 501 stOF.nMaxFile = MAX_PATH; 502 stOF.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; 503 if (GetOpenFileName(&stOF))//显示“打开文件”对话框 504 { 505 SetWindowText(hText2, szFileNameOpen2); 506 } 507 508 } 509 510 511 512 513 514 515 INT_PTR CALLBACK _resultProcMain(HWND hProcessModuleDlg, UINT wMsg, WPARAM wParam, LPARAM lParam) 516 { 517 static HWND hWinMain, hProcessModuleTable, hText1, hText2; 518 TCHAR bufTemp1[0x200], bufTemp2[0x200]; 519 static TCHAR szFileNameOpen1[MAX_PATH], szFileNameOpen2[MAX_PATH]; 520 521 switch (wMsg) 522 { 523 case WM_CLOSE: 524 EndDialog(hProcessModuleDlg, 0); 525 break; 526 527 case WM_INITDIALOG: //初始化 528 hWinMain = (HWND)lParam; 529 530 hProcessModuleTable = GetDlgItem(hProcessModuleDlg, IDC_MODULETABLE); 531 hText1 = GetDlgItem(hProcessModuleDlg, ID_TEXT1); 532 hText2 = GetDlgItem(hProcessModuleDlg, ID_TEXT2); 533 534 //定义表格外观 535 SendMessage(hProcessModuleTable, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, 536 LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); 537 ShowWindow(hProcessModuleTable, SW_SHOW); 538 539 _clearResultView(hProcessModuleTable);//清空表格内容 540 break; 541 542 case WM_NOTIFY: 543 if(((NMHDR *)lParam)->hwndFrom == hProcessModuleTable)//更改各控件状态 544 { 545 if (((NMHDR *)lParam)->code == NM_CUSTOMDRAW)//绘画时 546 { 547 if (((NMLVCUSTOMDRAW *)lParam)->nmcd.dwDrawStage == CDDS_PREPAINT) 548 { 549 SetWindowLong(hProcessModuleDlg, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW); 550 } 551 else if (((NMLVCUSTOMDRAW *)lParam)->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) 552 { 553 //当每一单元格内容预画时,判断两列的值是否一致 554 //如果一致,则将文本的背景色设置为浅红色,否则黑色 555 _GetListViewItem(hProcessModuleTable, ((NMLVCUSTOMDRAW *)lParam)->nmcd.dwItemSpec, 556 1, bufTemp1); 557 _GetListViewItem(hProcessModuleTable, ((NMLVCUSTOMDRAW *)lParam)->nmcd.dwItemSpec, 558 2, bufTemp2); 559 if (_MemCmp(bufTemp1, bufTemp2, lstrlen(bufTemp1))) 560 { 561 ((NMLVCUSTOMDRAW *)lParam)->clrTextBk = 0xa0a0ff; 562 } 563 else 564 { 565 ((NMLVCUSTOMDRAW *)lParam)->clrTextBk = 0xffffff; 566 } 567 SetWindowLong(hProcessModuleDlg, DWL_MSGRESULT, CDRF_DODEFAULT); 568 } 569 } 570 } 571 break; 572 573 case WM_COMMAND: //菜单 574 switch (LOWORD(wParam)) 575 { 576 case IDC_OK: //刷新 577 _openFile(hWinMain, hProcessModuleTable, szFileNameOpen1, szFileNameOpen2); 578 break; 579 580 case IDC_BROWSE1: //用户选择第一个文件 581 _OpenFile1(hWinMain, hText1, szFileNameOpen1); 582 break; 583 case IDC_BROWSE2: //用户选择第二个文件 584 _OpenFile2(hWinMain, hText2, szFileNameOpen2); 585 break; 586 } 587 break; 588 589 default: 590 return FALSE; 591 } 592 593 return TRUE; 594 595 596 } 597 598 599 600 /* 601 窗口程序 602 */ 603 INT_PTR CALLBACK _ProcDlgMain(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam) 604 { 605 switch (wMsg) 606 { 607 case WM_CLOSE: 608 EndDialog(hWnd, 0); 609 break; 610 611 case WM_INITDIALOG: //初始化 612 _Init(hWnd); 613 break; 614 615 case WM_COMMAND: //菜单 616 switch (LOWORD(wParam)) 617 { 618 case IDM_EXIT: //退出 619 EndDialog(hWnd, 0); 620 break; 621 622 case IDM_OPEN: //打开PE对比对话框 623 DialogBoxParam(hInstance, MAKEINTRESOURCE(RESULT_MODULE), hWnd, 624 _resultProcMain, (LPARAM)hWnd); 625 case IDM_1: 626 case IDM_2: 627 case IDM_3: 628 default: 629 break; 630 } 631 break; 632 633 default: 634 return FALSE; 635 } 636 637 return TRUE; 638 } 639 640 641 642 643 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 644 { 645 HMODULE hRichEdit; 646 647 hInstance = hInst; 648 InitCommonControls(); 649 hRichEdit = LoadLibrary(TEXT("RichEd20.dll")); 650 DialogBoxParam(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, _ProcDlgMain, (LPARAM)NULL); 651 FreeLibrary(hRichEdit); 652 return 0; 653 }
头文件 resource.h
1 //{{NO_DEPENDENCIES}} 2 // Microsoft Visual C++ 生成的包含文件。 3 // 供 Resource.rc 使用 4 // 5 #define ICO_MAIN 101 6 #define IDM_MAIN 103 7 #define DLG_MAIN 104 8 #define RESULT_MODULE 105 9 #define IDC_INFO 1001 10 #define ID_TEXT1 1002 11 #define ID_TEXT2 1008 12 #define IDC_BROWSE1 1003 13 #define ID_STATIC 1007 14 #define ID_STATIC1 1004 15 #define IDC_EDIT2 1005 16 #define IDC_BROWSE2 1006 17 #define IDC_MODULETABLE 1009 18 #define IDC_THESAME 1010 19 #define IDC_BUTTON3 1011 20 #define IDC_OK 1011 21 #define ID_40002 40002 22 #define ID_40003 40003 23 #define ID_40004 40004 24 #define ID_40005 40005 25 #define ID_40006 40006 26 #define IDM_OPEN 40007 27 #define IDM_1 40008 28 #define IDM_2 40009 29 #define IDM_3 40010 30 #define IDM_EXIT 40011 31 #define ID_40012 40012 32 #define ID_40013 40013 33 #define ID_40014 40014 34 #define ID_40015 40015 35 #define IDM_4 40016 36 37 // Next default values for new objects 38 // 39 #ifdef APSTUDIO_INVOKED 40 #ifndef APSTUDIO_READONLY_SYMBOLS 41 #define _APS_NEXT_RESOURCE_VALUE 106 42 #define _APS_NEXT_COMMAND_VALUE 40017 43 #define _APS_NEXT_CONTROL_VALUE 1012 44 #define _APS_NEXT_SYMED_VALUE 101 45 #endif 46 #endif
资源文件 resource.rc
1 // Microsoft Visual C++ generated resource script. 2 // 3 #include "resource.h" 4 5 #define APSTUDIO_READONLY_SYMBOLS 6 ///////////////////////////////////////////////////////////////////////////// 7 // 8 // Generated from the TEXTINCLUDE 2 resource. 9 // 10 #include "winres.h" 11 12 ///////////////////////////////////////////////////////////////////////////// 13 #undef APSTUDIO_READONLY_SYMBOLS 14 15 ///////////////////////////////////////////////////////////////////////////// 16 // 中文(简体,中国) resources 17 18 #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) 19 LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED 20 21 #ifdef APSTUDIO_INVOKED 22 ///////////////////////////////////////////////////////////////////////////// 23 // 24 // TEXTINCLUDE 25 // 26 27 1 TEXTINCLUDE 28 BEGIN 29 "resource.h\0" 30 END 31 32 2 TEXTINCLUDE 33 BEGIN 34 "#include ""winres.h""\r\n" 35 "\0" 36 END 37 38 3 TEXTINCLUDE 39 BEGIN 40 "\r\n" 41 "\0" 42 END 43 44 #endif // APSTUDIO_INVOKED 45 46 47 ///////////////////////////////////////////////////////////////////////////// 48 // 49 // Icon 50 // 51 52 // Icon with lowest ID value placed first to ensure application icon 53 // remains consistent on all systems. 54 ICO_MAIN ICON "main.ico" 55 56 ///////////////////////////////////////////////////////////////////////////// 57 // 58 // Menu 59 // 60 61 IDM_MAIN MENU 62 BEGIN 63 POPUP "文件(&F)" 64 BEGIN 65 MENUITEM "打开PE对比对话框", IDM_OPEN 66 MENUITEM "---", IDM_1 67 MENUITEM "---", IDM_2 68 MENUITEM "---", IDM_3, CHECKED 69 MENUITEM SEPARATOR 70 MENUITEM "退出(&x)", IDM_EXIT 71 END 72 POPUP "编辑(&E)" 73 BEGIN 74 MENUITEM SEPARATOR 75 END 76 POPUP "格式(&O)" 77 BEGIN 78 MENUITEM SEPARATOR 79 END 80 POPUP "查看(&V)" 81 BEGIN 82 MENUITEM "源文件", IDM_1 83 MENUITEM "窗口透明度", IDM_2 84 MENUITEM SEPARATOR 85 MENUITEM "大小", IDM_3 86 MENUITEM "宽度", IDM_4 87 END 88 POPUP "帮助(&H)" 89 BEGIN 90 MENUITEM SEPARATOR 91 END 92 END 93 94 95 ///////////////////////////////////////////////////////////////////////////// 96 // 97 // Dialog 98 // 99 100 DLG_MAIN DIALOG 50, 50, 544, 399 101 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 102 CAPTION "PEComp" 103 MENU IDM_MAIN 104 FONT 9, "宋体" 105 BEGIN 106 CONTROL "",IDC_INFO,"RichEdit20A",ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN | WS_BORDER | WS_VSCROLL | WS_TABSTOP,0,0,540,396 107 END 108 109 RESULT_MODULE DIALOGEX 76, 10, 455, 473 110 STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU 111 CAPTION "PE文件对比结果" 112 FONT 9, "宋体", 0, 0, 0x0 113 BEGIN 114 LTEXT "您选定的第一个文件为:",ID_STATIC,10,10,89,8 115 EDITTEXT ID_TEXT1,97,10,296,15 116 PUSHBUTTON "浏览...",IDC_BROWSE1,394,10,50,14 117 LTEXT "您选定的第二个文件为:",ID_STATIC1,10,33,89,8 118 EDITTEXT ID_TEXT2,97,33,296,15 119 PUSHBUTTON "浏览...",IDC_BROWSE2,394,33,50,14 120 CONTROL "",IDC_MODULETABLE,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,60,438,390 121 CONTROL "只显示不同的值",IDC_THESAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,10,453,100,14 122 PUSHBUTTON "执行...(&R)",IDC_OK,394,453,50,14 123 END 124 125 126 ///////////////////////////////////////////////////////////////////////////// 127 // 128 // DESIGNINFO 129 // 130 131 #ifdef APSTUDIO_INVOKED 132 GUIDELINES DESIGNINFO 133 BEGIN 134 DLG_MAIN, DIALOG 135 BEGIN 136 LEFTMARGIN, 7 137 RIGHTMARGIN, 302 138 TOPMARGIN, 7 139 BOTTOMMARGIN, 170 140 END 141 142 RESULT_MODULE, DIALOG 143 BEGIN 144 LEFTMARGIN, 7 145 RIGHTMARGIN, 445 146 BOTTOMMARGIN, 467 147 END 148 END 149 #endif // APSTUDIO_INVOKED 150 151 #endif // 中文(简体,中国) resources 152 ///////////////////////////////////////////////////////////////////////////// 153 154 155 156 #ifndef APSTUDIO_INVOKED 157 ///////////////////////////////////////////////////////////////////////////// 158 // 159 // Generated from the TEXTINCLUDE 3 resource. 160 // 161 162 163 ///////////////////////////////////////////////////////////////////////////// 164 #endif // not APSTUDIO_INVOKED