Comparing 1.75.2573.OrigCUT\Far.exe and 1.75.2573.Patched\Far.exe
;
;Download @ https://web.archive.org/web/20190314030118/http://dml.compkaluga.ru/forum/index.php?act=attach&type=post&id=696
;1.75.2573.Orig\Far.exe    {975872} MD5 b561e522277a8a289957eb283f6f3a77
;1.75.2573.Patched\Far.exe {975872} MD5 2d710a3a6c069f4468a43b6fac3fce35
;1.75.2573.OrigCUT\Far.exe {943104} MD5 5a7c5cc13b970db99f35ab7127fe6501
;
000000FE:  02  22  ; Set LargeAddressAware bit
;
00000140:  DA  25  ; Recalculated Checksum
00000141:  52  5A  ;
00000142:  0F  0F  ; 
;
; [p4] Disables Wow64 File System redirection not just in WS2003x64 but also in x64 Vista/7/8/10
; hook_wow64.c, init_hook(): patched .exe to match commit feca0465ed4a0a2f874c5ae631d019d7d0b63f28 @ https://github.com/FarGroup/FarManager
; (extended functionality has been squeezed into the same bytespace)
00000511:  0F  74
00000512:  84  46
00000513:  C1  31
00000514:  00  F6
00000515:  00  90
00000516:  00  90
0000051F:  8B  09
00000520:  F0  C6
00000521:  85  74
00000522:  F6  36
00000523:  0F  80
00000524:  84  3E
00000525:  AF  68
00000526:  00  74
00000527:  00  0D
00000528:  00  81
00000529:  80  3E
0000052A:  3E  8B
0000052B:  68  FF
0000052C:  0F  55
0000052D:  85  8B
0000052E:  A6  75
0000052F:  00  6B
00000530:  00  80
00000531:  00  7E
00000532:  8B  04
00000533:  5E  EC
00000534:  01  90
00000536:  3D  2D
0000053B:  B8  BB
0000053C:  40  63
00000540:  83  75
00000541:  C0  59
00000542:  23  90
00000543:  89  8B
00000544:  44  46
00000545:  24  01
00000546:  10  3B
00000547:  3B  03
00000548:  18  74
00000549:  74  2C
0000054A:  29  8D
0000054B:  8D  7C
0000054C:  54  24
0000054D:  24  18
0000054E:  18  57
0000054F:  52  6A
00000550:  6A  40
00000551:  40  6A
00000552:  6A  05
00000553:  04  4B
00000554:  50  53
00000556:  D7  D5
0000055C:  44  46
0000055D:  24  01
0000055E:  10  80
0000055F:  89  3E
00000560:  18  68
00000561:  8B  74
00000562:  54  08
00000563:  24  C6
00000564:  18  03
00000565:  8B  90
00000566:  44  B8
00000567:  24  90
00000568:  10  55
00000569:  8D  89
0000056A:  4C  E5
0000056B:  24  89
0000056C:  10  43
0000056D:  51  01
0000056E:  52  57
0000056F:  6A  FF
00000570:  04  37
00000571:  50  6A
00000572:  FF  05
00000573:  D7  53
00000574:  29  FF
00000575:  74  D5
00000576:  24  8D
00000577:  1D  4C
00000578:  8D  24
00000579:  4C  1D
0000057A:  24  29
0000057B:  1D  31
000005AC:  D7  D5
000005D7:  D7  D5
;
;
; [p2] While copying directories, do not transfer/set COMPRESSED attribute
; - it should be inherited from the parent directory
00007ACE:  74  EB  ; copy.cpp, ShellCopy::ShellSetAttr(): skip code block calling ESetFileCompression()
0000B513:  74  EB  ; copy.cpp, ShellCopy::ShellCopyOneFile(): skip code block calling ESetFileCompression()
;
;
; [p5] Fix wiping files outside of wipe target folder through file symlinks
;
000107D0:  00  20  ; add FILE_FLAG_OPEN_REPARSE_POINT attribute to CreateFile() call, according to github.com/FarGroup/FarManager commit 290504d25b665825e67a3f728c2acd881f2151bc
00010814:  68  31  ; xor ebx, ebx
00010815:  00  DB  ;
00010816:  00  89  ; mov [esp+18h], ebx  ; also Fix one more BUG, missing initialization: DWORD Written = 0; // see WipeFile() in delete.cpp
00010817:  01  5C  ;
00010818:  00  24  ;
00010819:  E8  18  ;
0001081A:  BE  0F  ; bts ebx, 10h  ; make value 65536 (4 bytes instead of 5 in case of mov ebx, 10000h)
0001081B:  4B  BA  ;
0001081C:  0A  EB  ;
0001081D:  00  10  ;
0001081E:  0F  53  ; push ebx  ; 65536 for memset()
0001081F:  B6  FF  ; push dword [.4E9098]  ; Opt.WipeSymbol, only low BYTE is meaningful for memset()
00010820:  0D  35  ;
00010825:  68  53  ; push ebx  ; 65536 for malloc()
00010826:  00  E8  ; call j_j_j_malloc()
00010827:  00  B1  ;
00010828:  01  4B  ;
00010829:  00  0A  ;
0001082A:  8B  00  ;
0001082B:  D8  89  ; mov ebx, eax ; PTR returned by malloc()
0001082C:  51  C3  ;
;
;
; [p3] Amendment for Histories - do not remove oldest entries locked by INS key
; (extended functionality has been squeezed into the same bytespace)
000633A7:  83  31  ; dword DelCandidate = NULL; // keep pointer to sought entry in ESI
000633A8:  BB  F6
000633A9:  1C  90
000633AA:  01  90
000633AB:  00  90
000633AC:  00  90
000633AD:  00  90
000633B6:  0F  90
000633B7:  84  90
000633B8:  AA  90
000633B9:  00  90
000633BA:  00  90
000633BB:  00  90
000633C5:  9D  9F  ;; for (HistoryList.Current=HistoryList.First(); HistoryList.Current != NULL; ...)
000633DA:  6F  33
000633E6:  63  27  ;;   if (EqualType(AddRecord.Type,HistoryItem->Type))
000633EB:  5E  22
000633F0:  59  1D
000633F2:  B3  83  ; if ((RemoveDups==1 && strcmp(AddRecord.strName,HistoryItem->strName)==0) || ...
000633F8:  FE  F8  ; // replaced inline StrCmp() code by strcmp() library call, which is more optimized btw
000633FC:  8B  FF
000633FD:  4F  74
000633FE:  08  24
000633FF:  8B  18
00063400:  44  FF
00063401:  24  77
00063402:  18  08
00063403:  8A  E8
00063404:  10  B8
00063405:  3A  52
00063406:  11  05
00063407:  75  00
00063408:  1A  8D
00063409:  84  64
0006340A:  D2  24
0006340B:  74  08
0006340C:  12  74
0006340D:  8A  4B
0006340E:  50  85  if (DelCandidate) { if (!RemoveDups) break; } // do not loop aimlessly
0006340F:  01  F6  else if (!HistoryItem->Lock) DelCandidate = HistoryItem; // found suitable non-locked entry
00063410:  3A  74
00063411:  51  0B
00063412:  01  83
00063413:  75  BB
00063414:  0E  1C
00063415:  83  01
00063416:  C0  00
00063417:  02  00
00063418:  83  00
00063419:  C1  75
0006341A:  02  2F
0006341B:  84  EB
0006341C:  D2  4B
0006341D:  75  80
0006341E:  E4  3F
0006341F:  33  00
00063420:  C0  75
00063421:  EB  28
00063422:  05  89
00063423:  1B  FE
00063424:  C0  EB
00063425:  83  24
00063426:  D8  90
00063427:  FF  90
00063428:  85  90
00063429:  C0  90
0006342A:  74  90
0006342B:  2D  90
0006342D:  FE  F8  ;;  if (... || (RemoveDups==2 && StrCmpI(AddRecord.strName,HistoryItem->strName)==0))
00063430:  19  DD
00063446:  8B  EB
00063447:  6C  C6
00063448:  24  90
00063449:  14  90
00063450:  15  17  ;; for( ...; HistoryList.Current=HistoryList.Next(HistoryList.Current))
00063466:  8B  EB  ; goto SkipDeleteDelCandidate
00063467:  53  15
00063468:  14  8B  ; if (HistoryList.Length >= HistoryCount) // delete if the History is full
00063469:  3B  93
0006346A:  93  24
0006346B:  24  01
0006346C:  01  00
0006346E:  00  3B
0006346F:  75  53
00063470:  0C  14
00063471:  8B  7F
00063472:  03  0A
00063476:  43  73  ; HistoryList.Current = DelCandidate; HistoryList.Delete(); // delete oldest non-locked entry
;
;
; [p1] Unlock attributes in CtrlA Dialog: [x] Temporary and [x] Offline
; (not supported on FAT32 volumes)
00097A60:  83  89  ; setattr.cpp: if (AttrDlg[SETATTR_RO].Selected)  NewAttr|=FA_RDONLY;
00097A61:  BC  E2  ;
00097A62:  24  51  ; Unfolded code, similar for each processed attribute, has
00097A63:  28  57  ; been replaced by an iteration trough array of data, pushed
00097A64:  12  90  ; on stack, with extra data added for Temporary and Offline
00097A65:  00  90  ; attributes
00097A66:  00  90
00097A67:  00  68
00097A68:  74  28
00097A69:  02  12
00097A6A:  0B  01
00097A6B:  DE  00
00097A6C:  83  68
00097A6D:  BC  74
00097A6E:  24  14
00097A6F:  74  20
00097A70:  14  00
00097A71:  00  68
00097A72:  00  C0
00097A73:  00  16
00097A74:  74  02
00097A75:  03  00
00097A76:  83  68
00097A77:  CB  0C
00097A78:  20  19
00097A79:  83  04
00097A7A:  BC  00
00097A7B:  24  68
00097A7C:  C0  58
00097A7D:  16  1B
00097A7F:  00  08
00097A80:  00  68
00097A81:  74  A4
00097A82:  03  1D
00097A83:  83  00
00097A84:  CB  40
00097A85:  02  68
00097A86:  83  F0
00097A87:  BC  1F
00097A88:  24  00
00097A89:  0C  20
00097A8A:  19  68
00097A8B:  00  88
00097A8C:  00  24
00097A8E:  74  01
00097A8F:  03  68
00097A90:  83  D4
00097A91:  CB  26
00097A92:  04  00
00097A93:  83  10
00097A94:  BC  B1
00097A95:  24  09
00097A97:  1B  0F
00097A98:  00  B7
00097A99:  00  F8
00097A9A:  00  83
00097A9B:  74  3C
00097A9C:  06  3A
00097A9D:  81  00
00097A9E:  CB  74
00097A9F:  00  06
00097AA0:  08  C1
00097AA1:  00  C8
00097AA2:  00  10
00097AA3:  83  66
00097AA4:  BC  09
00097AA5:  24  C3
00097AA6:  A4  FE
00097AA7:  1D  C9
00097AA8:  00  75
00097AA9:  00  EC
00097AAA:  00  5F
00097AAB:  74  59
00097AAC:  06  90
00097AAD:  81  90
00097AAE:  CB  90
00097AAF:  00  90
00097AB0:  40  90
00097AB1:  00  90
00097AB2:  00  90
00097AB3:  83  90
00097AB4:  BC  90
00097AB5:  24  90
00097AB6:  F0  90
00097AB7:  1F  90
00097AB8:  00  90
00097AB9:  00  90
00097ABA:  00  90
00097ABB:  74  90
00097ABC:  06  90
00097ABD:  81  90
00097ABE:  CB  90
00097ABF:  00  90
00097AC0:  20  90
00097AC1:  00  90
00097AC2:  00  90
;
00097CCD:  8B  89  ; setattr.cpp: if (AttrDlg[SETATTR_RO].Selected == 1) SetAttr|=FA_RDONLY;
00097CCE:  84  E2  ;
00097CCF:  24  57  ; Unfolded code, similar for each processed attribute, has
00097CD0:  28  90  ; been replaced by an iteration trough array of data, pushed
00097CD1:  12  90  ; on stack, with extra data added for Temporary and Offline
00097CD2:  00  68  ; attributes
00097CD3:  00  28
00097CD4:  83  12
00097CD5:  F8  01
00097CD6:  01  00
00097CD7:  75  68
00097CD8:  06  74
00097CD9:  89  14
00097CDA:  44  20
00097CDB:  24  00
00097CDC:  18  68
00097CDD:  EB  C0
00097CDE:  0C  16
00097CDF:  85  02
00097CE0:  C0  00
00097CE1:  75  68
00097CE2:  08  0C
00097CE3:  C7  19
00097CE4:  44  04
00097CE5:  24  00
00097CE6:  14  90
00097CE7:  01  90
00097CE8:  00  90
00097CE9:  00  90
00097CEA:  00  90
00097CEB:  8B  90
00097CEC:  84  90
00097CED:  24  90
00097CEE:  74  90
00097CEF:  14  90
00097CF0:  00  90
00097CF1:  00  90
00097CF2:  83  90
00097CF3:  F8  90
00097CF4:  01  90
00097CF5:  75  68
00097CF6:  06  88
00097CF7:  09  24
00097CF8:  7C  00
00097CF9:  24  01
00097CFA:  18  68
00097CFB:  EB  D4
00097CFC:  08  26
00097CFD:  85  00
00097CFE:  C0  10
00097CFF:  75  B1
00097D00:  04  06
00097D01:  09  58
00097D02:  7C  0F
00097D03:  24  B7
00097D04:  14  F8
00097D05:  8B  C1
00097D06:  84  C8
00097D07:  24  10
00097D08:  C0  83
00097D09:  16  3C
00097D0A:  00  3A
00097D0B:  00  01
00097D0C:  83  75
00097D0D:  F8  04
00097D0E:  01  66
00097D0F:  75  09
00097D10:  06  42
00097D11:  09  18
00097D12:  5C  83
00097D13:  24  3C
00097D14:  18  3A
00097D15:  EB  00
00097D16:  08  75
00097D17:  85  04
00097D18:  C0  66
00097D19:  75  09
00097D1A:  04  42
00097D1B:  09  14
00097D1C:  5C  FE
00097D1D:  24  C9
00097D1E:  14  75
00097D1F:  8B  E1
00097D20:  84  5F
00097D21:  24  90
00097D22:  0C  90
00097D23:  19  90
00097D24:  00  90
00097D25:  00  90
00097D26:  83  90
00097D27:  F8  90
00097D28:  01  90
00097D29:  75  90
00097D2A:  07  90
00097D2B:  83  90
00097D2C:  4C  90
00097D2D:  24  90
00097D2E:  18  90
00097D2F:  04  90
00097D30:  EB  90
00097D31:  09  90
00097D32:  85  90
00097D33:  C0  90
00097D34:  75  90
00097D35:  05  90
00097D36:  83  90
00097D37:  4C  90
00097D38:  24  90
00097D39:  14  90
00097D3A:  04  90
;
000D7B53:  80  00   ; setattr.cpp @ MSetAttrTemp:    DIF_3STATE|DIF_DISABLE -> DIF_3STATE
000D7B6F:  80  00   ; setattr.cpp @ MSetAttrOffline: DIF_3STATE|DIF_DISABLE -> DIF_3STATE
;
;
; [p0] Remove IsDebuggerPresent() Win32 API calls - incompatible with Windows 95
; simulate behaviour as if IsDebuggerPresent() returned 0 / not present
;
000BA0BC:  FF  90  ;nop                  | instead
000BA0BD:  15  B8  ;mov eax, const fixup |   of call [fixup]
;
000BA0C4:  8B  31  ;xor esi,esi
000BA0C5:  F0  F6  ;  instead of mov esi,eax
;
000C3683:  FF  90  ;nop                  | instead
000C3684:  15  B8  ;mov eax, const fixup |   of call [fixup]
;
000C36AA:  3D  25  ;and [var_from_eax],0 instead of cmp [var_from_eax],0
;
000D0832:  49  I   53  S
000D0833:  73  s   65  e
000D0834:  44  D   74  t
000D0835:  65  e   46  F
000D0836:  62  b   69  i
000D0837:  75  u   6C  l
000D0838:  67  g   65  e
000D0839:  67  g   41  A
000D083A:  65  e   70  p
000D083B:  72  r   69  i
000D083C:  50  P   73  s
000D083D:  72  r   54  T
000D083E:  65  e   6F  o
000D083F:  73  s   41  A
000D0840:  65  e   4E  N
000D0841:  6E  n   53  S
000D0842:  74  t   49  I
;
; [p0] Remove brackets from <Folder> etc.
000CA778:  3C  <   25  %
000CA779:  25  %   2E  .
000CA77A:  2E  .   2A  *
000CA77B:  2A  *   73  s
000CA77C:  73  s   00
000CA77D:  3E  >   00
Mismatches found in 975872 bytes: 441


; It is useful to replace (via ResHacker.exe) Icon resources in FAR.exe 1.75
; with the group of 4 icons exported from FAR.exe 1.71.2358. Older icon looks
; somewhat different and therefore distinguishes FAR1 from FAR2 on Windows
; Taskbar (also reduces size of FAR.exe by about 32k)

